MAV Direct ODBC

Обсуждение MAV Direct ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Гость

Re: Возврат из UPDATE

Сообщение Гость »

Арсений писал(а): ...либо после возврата из редактирования, вызвать обновление очереди броузера, но browse.load() отправляет курсор на начало. Конечно и тут можно воспользоваться связкой choose() - select(). Но хотелось бы понять причину и найти чисто библиотечное решение.
А если в Embed (Call update procedure) поставить
BRW4:BROWSE.Load
SELECT(SELF.BRW.Control)
????
т.е.
BRW4:Update.CallProc PROCEDURE
CODE
GlobalRequest = SELF.Request
IF SELF.Action(SELF.Request) THEN RETURN.
UPN_Goods(vn_Goods:nGoodID,vn_Goods:nIsFolder)
IF GlobalResponse = RequestCompleted
PARENT.CallProc
ELSE
SELF.BRW.NewSelection
END
SELECT(SELF.BRW.Control)
BRW4:BROWSE.Load
SELECT(SELF.BRW.Control)

! End of "MAV UpdateButtons"

другое дело, что по BRW4:BROWSE.Load будет перечитана вся цепочка а не одна запись ....
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Возврат из UPDATE

Сообщение Andrew™ »

Арсений писал(а):Все таки при возврате в броузер из процедуры обновления не обновляются поля связанных таблиц. Кстати, смотрел трасу, так понял, что после возврящения из апдейта програмулина зачитывает в очередь только одну запись. Дык вот, зачитываются только поля одной таблицы.
При удачном завершении редактирования записи подкачиваются все записи таблиц, которые присутствую в File Schematic'е, т е подцеплены в виде дерева к основномй таблице на основании связей, прописанных в словаре. Необходимо правильно настроить File Schematic для SaveButton Control шаблона.
Арсений писал(а):Какие вижу выходы? Можно либо все броузеры по нескольким таблицам создавать по вьюшкам сервера, либо после возврата из редактирования, вызвать обновление очереди броузера, но browse.load() отправляет курсор на начало. Конечно и тут можно воспользоваться связкой choose() - select(). Но хотелось бы понять причину и найти чисто библиотечное решение.
Можно, и как мне кажется логичнее, сложные запросы для Browse организовывать в виде SQL View (в DCT это обычный файл) (завтра что то поменялось, и не меняя программы меняем только саму SQL View на сервере), а редактировать записи таблиц которые учавствуют в формировании данной View, SaveButton Control шаблон имеет такой режим - редактирование View, тогда появляется список таблиц которые выбираются для закачки и выставляется последовательность их изменения на сервере (это важно т к существуют соответсвующие констрайнты на сервере и детку нельзя добавить раньше родителя). Список таких таблиц формируется на основании словаря, где у которых должны быть прописана связь ONE TO MANY к файлу - SQL View.
Последний раз редактировалось Andrew™ 01 Август 2005, 12:26, всего редактировалось 1 раз.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Возврат из UPDATE

Сообщение Andrew™ »

Арсений писал(а):Все таки при возврате в броузер из процедуры обновления не обновляются поля связанных таблиц. Кстати, смотрел трасу, так понял, что после возврящения из апдейта програмулина зачитывает в очередь только одну запись. Дык вот, зачитываются только поля одной таблицы.
Ещё, а зачем после изменения ОДНОЙ записи в Browse перечитывать весь Browse, после выхода из формы редактирования все записи таблиц или SQL View проинициализированы в форме, берём и строим ТОЛЬКО одну запись в Browse, без всяких лишних SQL запросов к SQL серверу.

Если по каким то причинам требуется всё таки перегрузить Browse, то
после выхода из формы, есть соответсвующий EMBED, проанализировать GlobalResponse на предмет RequestCompleted и вызвать .Load метод BrowseBox класса или послать событие EVENT:Accepted на Refresh кнопку, закреплённую в свойствах BrowseBox шаблона.
и делаем сразу RETURN из .CallProc метода, который далее после успешного редактирования в форме будет перестраивать ОДНУ запись в Browse, а это в данном случае не требуется.
Последний раз редактировалось Andrew™ 01 Август 2005, 14:28, всего редактировалось 1 раз.
Tolmachev Igor

Re: Возврат из UPDATE

Сообщение Tolmachev Igor »

Andrew Myalin писал(а):
Арсений писал(а):Все таки при возврате в броузер из процедуры обновления не обновляются поля связанных таблиц. Кстати, смотрел трасу, так понял, что после возврящения из апдейта програмулина зачитывает в очередь только одну запись. Дык вот, зачитываются только поля одной таблицы.
Насколько я понял, Арсения, не перегружаются ЗАВИСИМЫЕ ТАБЛИЦЫ от таблицы, в которой было изменение записи. Здесь надо использовать список Reset Fields для этих таблиц, в которые заносить поля первой таблицы (если нужные поля не отображаются в ?List первой таблицы - надо сделать их Hot Fields ()). И тогда не только при изменении записи, но и при позиционировании в первой таблице на разных записях - зависимые будут автоматически перегружаться.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Пока ещё слабо документированные свойства BrowseBox шаблона

Сообщение Andrew™ »

БУФЕРИЗАЦИЯ ЗАКАЧКИ В BROWSEBOX

1. Работа в BrowseBox со справочниками (таблицы, которые редко обновляются)

На закладке Other есть кнопка Optimization
далее есть ENTRY поле Buffering load object, можно закрепить за BrowseBox глобальный или модульный MAVFileFromQueue объект
который необходимо правильно продекларировать, например, есть справочник статусов документов, файл DOCSTATUS
глобально декларирую:

Buffer_DOCSTATUS CLASS(MAVFileFromQueue)
rec LIKE(DOCSTATUS),PRIVATE
Construct PROCEDURE()
END

Buffer_DOCSTATUS.Construct PROCEDURE
CODE
SELF.Init(DOCSTATUS,SELF.rec) ! инициализация приёмного буфера


в BrowseBox шаблоне закрепляю этот объект как Buffering load object

и всё

теперь при первом обращении к данной Browse произойдёт закачка справочника на клиента, при последующих обращениях данные будут браться уже из закаченной очереди данного объекта

2. Буферизация закачки дочерних таблиц, там же в свойствах BrowseBox шаблона есть CHECK Buffering Browse Queue. Если в свойствах шаблона имеют место быть Reset поля по которым происходит обновление Browse, то при включённом CHECK, если по таким значениям Reset полей уже была загрузка Browse, то Browse будет загружать данные из сохранённого списка на клиенте, иначе загрузит с сервера и сохранит.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Обновление от 02 августа 2005 года

Сообщение Andrew™ »

ADD:
Для BrowseBox контрола в режиме DropCombo реализован режим автоввода.

FIX:

При навигации по уровням вниз для Tree BrowseBox - кнопка Down Root, была замечена не всегда правильная закачка подуровней. Исправлено.
Gatnet

Как получить результат?

Сообщение Gatnet »

Вопрос такой - каким образом получить результат выполнения функции MSSQL?
пример функции прилагается :)
-----------
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

-- Функция формирования строки параметров из списка

CREATE FUNCTION dbo.fx_Test (
@id2 int
) RETURNS varchar(255)
AS
BEGIN
DECLARE @name varchar(255),
@comma varchar(2)
SELECT @name = '',
@comma = ''

SELECT @name = @name + @comma + name,
@comma = ', '
FROM dbo.tx_Test (nolock)
WHERE id2 = @id2
RETURN @name
END

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

-- Таблица значений

CREATE TABLE dbo.tx_Test (id int, id2 int, name varchar(50))
INSERT INTO dbo.tx_Test (id, id2, name)
SELECT 1, 1, 'Один' UNION
SELECT 2, 1, 'Два' UNION
SELECT 3, 1, 'Семь' UNION
SELECT 4, 2, 'Четыре' UNION
SELECT 5, 2, 'Пять' UNION
SELECT 6, 2, 'Десять'
GO

-- Выборка значений

SELECT dbo.fx_Test(1) -- Один, Два, Семь
SELECT dbo.fx_Test(2) -- Четыре, Пять, Десять

GO

------
Выполнение
IF Mavload(SELECT dbo.fx_Test(1), Loc_String)
MavShowError
END
возвращает совсем не то, что
SELECT dbo.fx_Test(1) -- Один, Два, Семь
8)

C Уважением, Александр.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Как получить результат?

Сообщение Andrew™ »

Gatnet писал(а):Вопрос такой - каким образом получить результат выполнения функции MSSQL?
пример функции прилагается :)
tmp CLASS(MAVExecSP)
Run FUNCTION(),LONG,VIRTUAL
END
loc_result CSTRING(256)

CODE

IF tmp.Run()
mavshowerror
ELSE
message(loc_Result)
END

tmp.Run FUNCTION
CODE
SELF.BindParameter(loc_result,SQL_PARAM_OUTPUT)
RETURN SELF.Run('dbo.fx_Test(1)',1) ! второй параметр=1, что означает что вызываем функцию



можно и проще поступить использовать тотже MAVLOAD
оформить не как функцию а как процедуру

вместо RETURN @Name
поставить SELECT @Name
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Обновление от 12.08.2005, для официальных пользователей

Сообщение Andrew™ »

встроена следующая поддержка:

под XP теперь раскладка клавиатуры по горячим клавишам нормально переключается, проверено на всех операционках с и без сторонних переключателей клавиатуры, сочетание горячих клавиш для переключения не имеет значения, алгоритм универсальный.

Шаблоны при этом не поменялись, данная поддержка реализована внутри базовых классов.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Обновление от 16.08.2005, для официальных пользователей

Сообщение Andrew™ »

В формах редактирования в режиме ChangeRecord в транзакционных рамках перед определением не изменилась ли редактируемая запись с другой рабочей станции теперь запись блокируется для всех остальных пользователей c помощью метода LockRecord(), выполняется примерно следующее в библиотеке

UPDATE Table1 SET PrimaryField=Primaryfield WHERE PrimaryField=?

аналогично реализована блокировка записей буферизованных Browse , метод LockRecords(), в формах редактирования родителя с проверкой на изменение хотя бы одной с другой рабочей станции, метод IsChange(). Блокировка записей Browse происходит не по одной записи в Browse, а одним UPDATE запросом.
Garnet

Сообщение Garnet »

Вопрос по множественной выборке.
Имеем Browse с поддержкой множественной выборки, загружено по фильтру порядка 4000 записей. Пользователь отмечает нужные ему записи (локатор по полю через сканер штрихкодов). Вот.
И теперь -- из 4000 записей он выбрал н-р 10. Можно ли показать пользователю те записи которые он выбрал (что-то типа фильтра) иначе по 4000 бегать и искать те которые он пометил, чтобы проверить...

С уважением, Александр.
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Garnet писал(а):Вопрос по множественной выборке.
Имеем Browse с поддержкой множественной выборки, загружено по фильтру порядка 4000 записей. Пользователь отмечает нужные ему записи (локатор по полю через сканер штрихкодов). Вот.
И теперь -- из 4000 записей он выбрал н-р 10. Можно ли показать пользователю те записи которые он выбрал (что-то типа фильтра) иначе по 4000 бегать и искать те которые он пометил, чтобы проверить...
Сделать Refresh (SELF.Load)
в методе .FillQueue в конце
IF NOT SELF.MarkedRecord()
SELF.StatusRecord = Record:OutOfRange ! фильтрация записей на клиенте
END
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Обновление от 17.08.2005, для официальных пользователей

Сообщение Andrew™ »

Реализована поддержка SQL типа поля TIME, которое поддерживают такие серваки, например, как mySQL и Firebird.

в словаре такое поле также декларируется как TIME, без всяких OVER структур.

Спасибо за обнаруженный недостаток в библиотеке
Juras Aleksiejevas
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Garnet писал(а):Вопрос по множественной выборке.
Имеем Browse с поддержкой множественной выборки, загружено по фильтру порядка 4000 записей. Пользователь отмечает нужные ему записи (локатор по полю через сканер штрихкодов). Вот.
И теперь -- из 4000 записей он выбрал н-р 10. Можно ли показать пользователю те записи которые он выбрал (что-то типа фильтра) иначе по 4000 бегать и искать те которые он пометил, чтобы проверить...
Andrew Myalin писал(а): Сделать Refresh (SELF.Load)
в методе .FillQueue в конце
IF NOT SELF.MarkedRecord()
SELF.StatusRecord = Record:OutOfRange ! фильтрация записей на клиенте
END
вышеописанный способ универсален для всех серверов, НО
есть крантики для оптимизации
аналогичная задачка была и у меня, применительно к MSSQL серверу,
что я делал:
в процедуре в контрукторе Browse класса создавал #Временную таблицу, что то типа
tmp MAVExecute
CODE
IF tmp.Run('create table #filter' & THREAD() & ' ( Ref IN not null)')
MAVSHOWERROR
END

в деструкторе Browse класса прибивал эту таблицу
tmp MAVExecute
CODE
IF tmp.Run('drop table #filter' & THREAD())
MAVSHOWERROR
END


когда мне надо отобразить ТОЛЬКО маркированные записи я делал следующее, перед вызовом метода .Load
tmp MAVExecute
CODE
IF tmp.Run('DELETE FROM #filter' & THREAD())
MAVSHOWERROR
RETURN
END
SELF.Marked.Set(File.PrimField)
LOOP WHILE NOT SELF.Marked.Fetch()
IF tmp.Run('INSERT INTO #filter' & THREAD() & ' VALUES(' & File.PrimField & ')')
MAVSHOWERROR
RETURN
END
END
SELF.Load


а в настройках Browse или в начале метода .Load сделал следующее:
IF ФильтрацияМаркировочныхЗаписей
SELF.Select.Where(SELF.Select.Field(File.PrimField) & ' IN (SELECT Ref FROM #filter' & THREAD())
END


таким образом при перезагрузке Browse на клиента попадут ТОЛЬКО требуемые записи, код подлиннее но эффективнее.
Арсений

Сообщение Арсений »

На таблице висит тригер на обновление и добавление. Он делает проверки по различным условиям и в случае удовлетворения этим условиям блокирует операцию. Можно ли, что бы пользователю выдавалось сообщение, сгенерированное самим тригером, в котором будет объясняться причина блокировки?
Ответить