Шаблон под MAV

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

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Шаблон под MAV

Сообщение Admin » 18 Август 2006, 3:36

Андрей! Пишу шаблон под MAV

Нужно после твоей проверки записей и включения/отключения Update кнопок
вставить свой код типа вот этого:

Код: Выделить всё

  IF xAccess.IsLogin('Update_xa_test',accIAccess,1) <> xAcc:Granted THEN DISABLE(?Insert) ELSE ENABLE(?Insert) END
  IF xAccess.IsLogin('Update_xa_test',accCAccess,1) <> xAcc:Granted THEN DISABLE(?Change) ELSE
    IF RECORDS(Queue:Browse) THEN ENABLE(?Change) END
  END
  IF xAccess.IsLogin('Update_xa_test',accDAccess,1) <> xAcc:Granted THEN DISABLE(?Delete) ELSE
    IF RECORDS(Queue:Browse) THEN ENABLE(?Change) END
  END
Куда мне его вставить ? Можешь подсказать EMBED?
И еще как получить у твоего шаблона (какой символ?) имя очереди для ее проверки на RECORDS() ?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Re: Шаблон под MAV

Сообщение Admin » 18 Август 2006, 7:48

Вот еще вопросы ... прилада с MAV подвисает.
Виснет в разных местах по непонятной мне причине.
Транзакциями и другими блокироваками не пользуюсь.

Вот пара примеров лога:

Код: Выделить всё

7027872 Maximum read 1 rows for cursor
Binding field 1 "ProgramID"     = 26
Binding field 2 "ObjectName"    = Main
7019432 Parsing Cursor : SELECT "ProgramID","ObjectName","ObjectDesc","ObjectType","ObjectSystem","ObjectDisable","ID" FROM xa_objects WHERE "ProgramID"=? AND "ObjectName"=?
7019432 Parsing Cursor : SELECT "ProgramID","ObjectName","ObjectDesc","ObjectType","ObjectSystem","ObjectDisable","ID" FROM xa_objects WHERE "ProgramID"=? AND "ObjectName"=?
7019432 Close cursor
7019432 Close cursorBinding field 1 "ProgramID"   = 26
Binding field 2 "UserLogin"   = Admin
Binding field 3 "UserLogin"   = Admin
7019432 Free cursor
7019432 Open cursor
7019432 Open cursor
ERROR: [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'ObjectType'. [42S22]
7019432 Maximum read 1 rows for cursor
7019432 Maximum read 1 rows for cursor
7027872 Close cursor
и этот

Код: Выделить всё

Binding field 1 "ProgramID"     = 26
Binding field 2 "ObjectName"    = Update_xa_test
7019432 Parsing Cursor : SELECT "ProgramID","ObjectName","ObjectDesc","ObjectType","ObjectSystem","ObjectDisable","ID" FROM xa_objects WHERE "ProgramID"=? AND "ObjectName"=?
7019432 Close cursor
7019432 Free cursor
7019432 Open cursor
7019432 Maximum read 1 rows for cursor
Binding field 1 "ProgramID"             = 26
Binding field 2 "UserLogin"             = Admin
7019432 Parsing Cursor : SELECT "ProgramID","UserStatus","FullAccess","UserDisable","UserName","UserLogin","UserPassword","UserCanChangePassword","UserCanBackup","UserOnline","UserMustShutdown","UserMustShutdownTime","UserPhone","UserComment","LoginDateTime","LogoutDateTime","OnlineDateTime","ID" FROM xa_users WHERE "ProgramID"=? AND "UserLogin"=?
7019432 Close cursor
7019432 Free cursor
7019432 Open cursor
 Time Taken: 0.04 sec.
7019432 Read all rows for cursor
7019432 Read all rows for cursor
7027872 Open cursor
Почему в первой позиции отличаются коды ?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Сообщение Admin » 18 Август 2006, 9:02

К предыдущему письму: В момент того как программа висит она периодически общается с SQL сервером... пара байт туда сюда бегает... Это по файрволу видно.

И вот еще один кусок непонятный:

Код: Выделить всё

Computer : SEA-NK
User     : SEA
Date     : 18.08.2006
Time     : 16:51:33
Program  : C:\Cw_App\SealSoft\xAccSQL\10\Example\C6x\SingleEXE\Demo.exe
Error    : [0] [Microsoft][ODBC SQL Server Driver]Подключение занято до получения результатов для другого hstmt (HY000)
           SQL Statement -
           Binding field 1 "ProgramID"             = 26
           Binding field 2 "UserLogin"             = Admin
           SELECT "ProgramID","UserStatus","FullAccess","UserDisable","UserName","UserLogin","UserPassword","UserCanChangePassword","UserCanBackup","UserOnline","UserMustShutdown","UserMustShutdownTime","UserPhone","UserComment","LoginDateTime","LogoutDateTime","OnlineDateTime","ID" FROM xa_users WHERE "ProgramID"=? AND "UserLogin"=?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

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

Сообщение Andrew™ » 18 Август 2006, 13:35

подвисание связано с тем что запросы к БД надо генерить последовательно, а не паралельно, т е количество активных курсоров в сессии должно быть =1, это правило ODBC Cursor Library, палка о двух концах, либо это ограничение и хорошие скорости доступа, либо нет этого ограничения и медленная работа, т к при этом будут юзаться серверные курсоры.

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

Re: Шаблон под MAV

Сообщение Andrew™ » 18 Август 2006, 13:38

Admin писал(а):Андрей! Пишу шаблон под MAV

Нужно после твоей проверки записей и включения/отключения Update кнопок
вставить свой код типа вот этого:

Код: Выделить всё

  IF xAccess.IsLogin('Update_xa_test',accIAccess,1) <> xAcc:Granted THEN DISABLE(?Insert) ELSE ENABLE(?Insert) END
  IF xAccess.IsLogin('Update_xa_test',accCAccess,1) <> xAcc:Granted THEN DISABLE(?Change) ELSE
    IF RECORDS(Queue:Browse) THEN ENABLE(?Change) END
  END
  IF xAccess.IsLogin('Update_xa_test',accDAccess,1) <> xAcc:Granted THEN DISABLE(?Delete) ELSE
    IF RECORDS(Queue:Browse) THEN ENABLE(?Change) END
  END
Куда мне его вставить ? Можешь подсказать EMBED?
И еще как получить у твоего шаблона (какой символ?) имя очереди для ее проверки на RECORDS() ?
а зачем так сложно, у Browse button шаблона, есть Condition, условие по которому разрешать работу по этой кнопке, а update и select button это из разряда browse update buttons

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Сообщение Admin » 18 Август 2006, 13:41

Что значит "генерить последовательно, а не паралельно"
Если у меня в отдельном треде есть скрытое окно которое периодически пишет в таблицу что то и я в этот момент обращаюсь к этой же таблице то произойдет то что выше описано?

Я ничего не понимаю. Андрей можно данную тему развернуть?
У меня сейчас xAccessSQL почти дописан, но когда его цепляю на программу и с ним работаю он периодически виснет...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Сообщение Admin » 18 Август 2006, 13:46

а зачем так сложно
Андрей ну при чем тут то что есть у тебя?
Я пишу свой шаблон. Он должен вставить код который будет отключать кнопки Insert,Change,Delete в зависимости от прав пользователя на Update процедуру...

Скажи хотя бы просто куда поставить мой код что бы он был позже твоей работы по Enable/Disable кнопок I,C,D
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

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

Сообщение Andrew™ » 18 Август 2006, 13:47

Admin писал(а):Что значит "генерить последовательно, а не паралельно"
Если у меня в отдельном треде есть скрытое окно которое периодически пишет в таблицу что то и я в этот момент обращаюсь к этой же таблице то произойдет то что выше описано?
ДА
Admin писал(а): Я ничего не понимаю. Андрей можно данную тему развернуть?
У меня сейчас xAccessSQL почти дописан, но когда его цепляю на программу и с ним работаю он периодически виснет...
проще в этой фоновой процедуре открывай новое соединение пиши в таблицу и закрывай соединение

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Сообщение Admin » 18 Август 2006, 13:49

проще в этой фоновой процедуре открывай новое соединение пиши в таблицу и закрывай соединение
Офигеть ... Вот это сложности :(
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

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

Сообщение Andrew™ » 18 Август 2006, 13:55

Admin писал(а):
а зачем так сложно
Андрей ну при чем тут то что есть у тебя?
Я пишу свой шаблон. Он должен вставить код который будет отключать кнопки Insert,Change,Delete в зависимости от прав пользователя на Update процедуру...

Скажи хотя бы просто куда поставить мой код что бы он был позже твоей работы по Enable/Disable кнопок I,C,D
твой шаблон должен быть дочерним к BrowseUpdateButtons(MAVT)

а #AT

#AT(%MAVTUpdProcedures,%ActiveTemplateInstance,'Action','CODE')

на входе Control
CASE Control
OF ?Insert
...
RETRUN 1 - DISABLE

RETURN 0 - ENABLE

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Сообщение Admin » 18 Август 2006, 14:53

Вот еще трабла какая то. На работе все работало на ура а дома орет:

Код: Выделить всё

Error    : [242] [Microsoft][ODBC SQL Server Driver][SQL Server]The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value. (22007)
           SQL Statement - SELECT TOP 1000 0,0,0,0,UserLogin,0,ComputerName,0,ProcedureName,0,0,0,Message,0,MessageType,MessageDateTime FROM xa_logs WHERE ProgramID=1 AND (MessageDateTime >='2006-08-16 00:00:00' AND MessageDateTime <='2006-08-18 23:59:59') ORDER BY MessageDateTime DESC
И чего в дате и времени не нравится не пойму :(
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Сообщение Admin » 21 Август 2006, 2:45

Код: Выделить всё

твой шаблон должен быть дочерним к BrowseUpdateButtons(MAVT) 
а #AT 
#AT(%MAVTUpdProcedures,%ActiveTemplateInstance,'Action','CODE') 
на входе Control 
CASE Control 
OF ?Insert 
... 
RETRUN 1 - DISABLE 
RETURN 0 - ENABLE
Андрей напиши точно куда вставлять т.к. то что ты написал не верно!
У данного метода Action прототип другой:
BRW1:Update.Action FUNCTION(LONG Request)

есть метод у бровза:
BRW1:Browse.Action FUNCTION(SIGNED Control)
но RETURN 0 из него ни к чему не приводит!
т.е. кнопки не дизаблятся ...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Сообщение Admin » 21 Август 2006, 3:15

Вот еще... создаю соединение по умолчанию, дальше за ним создаю соединение для работы xAccess и при MAVINSERT со вторым соединением получаю:

Код: Выделить всё

Error    : [0] [Microsoft][Диспетчер драйверов ODBC] Тип программы выходит за пределы допустимого диапазона (HY003)
           SQL Statement -
           Binding field 1  = 26
           INSERT INTO xa_users ("ProgramID","UserStatus","UserName","UserLogin","UserPassword","UserOnline","LoginDateTime","LogoutDateTime","OnlineDateTime") VALUES(?,?,?,?,?,?,?,?,?) SELECT SCOPE_IDENTITY()
P.S. Если быстро стартовать 3-6 процедур в программе то прога 100% виснет ... (использован дефолтовый пример MAV) :(
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Денис
Бывалый
Сообщения: 70
Зарегистрирован: 07 Июль 2005, 4:39
Откуда: Хабаровск
Контактная информация:

Сообщение Денис » 21 Август 2006, 6:18

Еще вопрос по шаблону: В конструкторе Where условия Browse нехватает возможности заключить несколько условий в общие скобки. Нужно при сложных селектах. Еще бы пару эмбедов открыть перед и после обработки Where.

Аватара пользователя
Admin
Администратор
Сообщения: 3456
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Сообщение Admin » 21 Август 2006, 6:35

Денис писал(а):Еще бы пару эмбедов открыть перед и после обработки Where.
Андрей а почему сложно сделать для любителей мутных селектов возможность задания своего ручного условия WHERE ?
Я думаю тебе наверное нужно каждую переменную проверять на изменение и т.д. но в некоторых случаях массу времени теряешь на описывание условия в твоем довольно таки мутном конструкторе WHERE :)

К вопросу о тредах и зависонах программы:
Почему нельзя использовать CriticalSection для последовательного выполнения запросов?
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Ответить