Страница 1 из 4

Шаблон под MAV

Добавлено: 18 Август 2006, 4:36
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() ?

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

Добавлено: 18 Август 2006, 8:48
Admin
Вот еще вопросы ... прилада с 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
Почему в первой позиции отличаются коды ?

Добавлено: 18 Август 2006, 10:02
Admin
К предыдущему письму: В момент того как программа висит она периодически общается с 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"=?

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

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

Добавлено: 18 Август 2006, 14:38
Andrew™
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

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

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

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

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

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

Добавлено: 18 Август 2006, 14:49
Admin
проще в этой фоновой процедуре открывай новое соединение пиши в таблицу и закрывай соединение
Офигеть ... Вот это сложности :(

Добавлено: 18 Август 2006, 14:55
Andrew™
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

Добавлено: 18 Август 2006, 15:53
Admin
Вот еще трабла какая то. На работе все работало на ура а дома орет:

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

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
И чего в дате и времени не нравится не пойму :(

Добавлено: 21 Август 2006, 3:45
Admin

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

твой шаблон должен быть дочерним к 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 из него ни к чему не приводит!
т.е. кнопки не дизаблятся ...

Добавлено: 21 Август 2006, 4:15
Admin
Вот еще... создаю соединение по умолчанию, дальше за ним создаю соединение для работы 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) :(

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

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

К вопросу о тредах и зависонах программы:
Почему нельзя использовать CriticalSection для последовательного выполнения запросов?