и снова wwGenericSQLGrid + InTouch
Добавлено: Пн фев 28, 2011 6:44 pm
вопрос, наверное, не для слабонервных...
...для начала оговорюсь, что создавать свою БД (postgreSQL) и прикручивать ее к InTouch (10.1), я стал месяца 4-е назад (до этого с БД дела не имел).
Недавно, братья по разуму (программисты БД), шепнули на ухо, что давать приложению доступ к БД и пользоваться прямыми запросами к БД - "не есть хорошо" . Послушав, решил разобраться как можно реализовать вывод данных из БД при помощи хранимых процедур. InTouch и wwGenericSQLGrid в частности с хранимыми процедурами работают на ура, если возвращать вообще ничего не надо, если нужно вернуть одну переменную или строку. Проблемы начинаются, когда пытаешься от запроса получить таблицу целиком или ее часть.
Дело в том, что обычная хранимая процедура (как я смог разобраться, если ошибаюсь поправьте) в postgreSQL может вернуть таблицу только в формате набора полей некого типа разделенных запятой (по факту данные через запятую). В wwGenericSQLGrid отображение данных в таком формате неудобно, нет четкой границы столбцов .
Нашел еще один способ в postgre выдергивание таблицы при помощи курсоров. Написал скрипт, отладил, работает. Переношу из среды написания скриптов в InTouch и пытаюсь заставить его проглотить wwGenericSQLGrid:
#Grid1.SQLString= " begin; declare abc cursor for select * from buttons; fetch all from abc";
#Grid1.ConnectWithString( "Driver={PostgreSQL Unicode};Server=... и т.д.
-небольшие пояснения:abc в данном случае переменная типа refcursor
выполняю скрипт и вижу такое сообщение: "операция не допускается, если объект закрыт".
что самое интересное, если сразу кнопочку "ОК" на этом сообщении не нажать, а например свернуться, то это окошечко куда-то прячется так, что до viewer не достучаться, закрывается только через диспетчер задач.
непосредственно запускать скрипт в InTouch не пробовал, может это только неумение пользоваться курсорами у wwGenericSQLGrid (или у меня )?
Может кто-нибудь сразу "грамотно" для запросов к БД использовал процедуры, и перешагнул эту проблему?
P.S. по netstat видно, что при попытке выполнить сей запрос, порт открывается, а самое главное не получается выполнить следующий скрипт:
#Grid1.SQLString= "commit;";
#Grid1.Execute();
закрываешь viewer, а соединение так и висит, пока БД сама по таймауту не закроет.
P.P.S. после проведения второго этапа испытаний на совместимость InTouch 10.1 c хранимыми процедурами postgre выяснилось, что забрать значение любого типа, которое возвращается при вызове функций невозможно.
Подробнее:
при выполнении этого скрипта (при живом подключении к БД)
ResultCode1=SQLSetStatement( connectionid1, " select Check_lampes()");
ResultCode1_1=SQLExecute( connectionid1, "check_lamp", 0 );
SQLErrorMsg( ResultCode1 ) и SQLErrorMsg( ResultCode1_1 )
пишут No errors occured
в биндах check_lamp один tag типа memory integer со столбцом Check_lampes (пробовал и сheck_lampes).
Так вот, несмотря на то, что sqlerrormsg пишет, что ошибок нету, значение не доходит до tegа(значение не меняется; выполенение скрипта вообще никак не меняет значение). Для того чтобы узнать причину, попробовал следующий скрипт в wwGenericSQLGrid:
#Grid1.SQLString= "select Check_lampes()";
#Grid1.Execute()
и о чудо, то что не cмог получить в InTouch, отображается без проблем в Grid. Я примерно представляю, что теперь через скрипты AxtiveX wwGenericSQLGrid, можно как-то выдернуть нужное мне значение, но это мартышкин труд...
Помогите, вопрос стратегический, начальство поджимает
...для начала оговорюсь, что создавать свою БД (postgreSQL) и прикручивать ее к InTouch (10.1), я стал месяца 4-е назад (до этого с БД дела не имел).
Недавно, братья по разуму (программисты БД), шепнули на ухо, что давать приложению доступ к БД и пользоваться прямыми запросами к БД - "не есть хорошо" . Послушав, решил разобраться как можно реализовать вывод данных из БД при помощи хранимых процедур. InTouch и wwGenericSQLGrid в частности с хранимыми процедурами работают на ура, если возвращать вообще ничего не надо, если нужно вернуть одну переменную или строку. Проблемы начинаются, когда пытаешься от запроса получить таблицу целиком или ее часть.
Дело в том, что обычная хранимая процедура (как я смог разобраться, если ошибаюсь поправьте) в postgreSQL может вернуть таблицу только в формате набора полей некого типа разделенных запятой (по факту данные через запятую). В wwGenericSQLGrid отображение данных в таком формате неудобно, нет четкой границы столбцов .
Нашел еще один способ в postgre выдергивание таблицы при помощи курсоров. Написал скрипт, отладил, работает. Переношу из среды написания скриптов в InTouch и пытаюсь заставить его проглотить wwGenericSQLGrid:
#Grid1.SQLString= " begin; declare abc cursor for select * from buttons; fetch all from abc";
#Grid1.ConnectWithString( "Driver={PostgreSQL Unicode};Server=... и т.д.
-небольшие пояснения:abc в данном случае переменная типа refcursor
выполняю скрипт и вижу такое сообщение: "операция не допускается, если объект закрыт".
что самое интересное, если сразу кнопочку "ОК" на этом сообщении не нажать, а например свернуться, то это окошечко куда-то прячется так, что до viewer не достучаться, закрывается только через диспетчер задач.
непосредственно запускать скрипт в InTouch не пробовал, может это только неумение пользоваться курсорами у wwGenericSQLGrid (или у меня )?
Может кто-нибудь сразу "грамотно" для запросов к БД использовал процедуры, и перешагнул эту проблему?
P.S. по netstat видно, что при попытке выполнить сей запрос, порт открывается, а самое главное не получается выполнить следующий скрипт:
#Grid1.SQLString= "commit;";
#Grid1.Execute();
закрываешь viewer, а соединение так и висит, пока БД сама по таймауту не закроет.
P.P.S. после проведения второго этапа испытаний на совместимость InTouch 10.1 c хранимыми процедурами postgre выяснилось, что забрать значение любого типа, которое возвращается при вызове функций невозможно.
Подробнее:
при выполнении этого скрипта (при живом подключении к БД)
ResultCode1=SQLSetStatement( connectionid1, " select Check_lampes()");
ResultCode1_1=SQLExecute( connectionid1, "check_lamp", 0 );
SQLErrorMsg( ResultCode1 ) и SQLErrorMsg( ResultCode1_1 )
пишут No errors occured
в биндах check_lamp один tag типа memory integer со столбцом Check_lampes (пробовал и сheck_lampes).
Так вот, несмотря на то, что sqlerrormsg пишет, что ошибок нету, значение не доходит до tegа(значение не меняется; выполенение скрипта вообще никак не меняет значение). Для того чтобы узнать причину, попробовал следующий скрипт в wwGenericSQLGrid:
#Grid1.SQLString= "select Check_lampes()";
#Grid1.Execute()
и о чудо, то что не cмог получить в InTouch, отображается без проблем в Grid. Я примерно представляю, что теперь через скрипты AxtiveX wwGenericSQLGrid, можно как-то выдернуть нужное мне значение, но это мартышкин труд...
Помогите, вопрос стратегический, начальство поджимает