IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.
Модератор: kdv
-
ovv
- Сообщения: 13
- Зарегистрирован: 19 окт 2005, 09:03
Сообщение
ovv » 19 окт 2005, 09:47
Стоит задача синхронизация двух приложений - TechnologiCS (БД Interbase 6.5) и 1С 8.0. Хотелось бы сделать "on-line" синхранизацию, т.е. чтобы ни пользователю, ни админу не совершать "лишних движений". С 1С ни каких проблем - есть событие "при записи". У TechnologiCS есть API, но пока нет поддержки событий. Выход вижу только такой: написать допустим в тригере AfterInsert номенклатурного справочника вызов процедуры из UDF, которая соединиться с 1С и сделает всё неоходимое.
Но при написании в DLL-ке такого кода:
Код: Выделить всё
var
App1C: OleVariant;
Connect1C: OleVariant;
sprNomen: OleVariant;
sprNomenGr: OleVariant;
begin
App1C := CreateOleObject('V8.COMConnector');
Connect1C := App1C.Connect('Srvr="okulov";Ref="ovvDemo";usr=root;pwd=qwe');
sprNomen := Connect1C.Справочники.Номенклатура;
sprNomenGr := sprNomen.СоздатьГруппу();
sprNomenGr.Наименование := '***** COM ******';
sprNomenGr.Записать;
Происходит ошибка:
"Unsuccessful execution caused by an unavailable resource.invalid database handle (no active connection).
Кто нибудь сталкивался с написание каких-нибудь дополнительных действий внутри UDF процедуры ?
-
hvlad
- Разработчик Firebird
- Сообщения: 1244
- Зарегистрирован: 21 мар 2005, 10:48
Сообщение
hvlad » 19 окт 2005, 10:46
CoInitialize\OleInitialize кто-то вызывал ?
Отладчиком пользоваться умеем ?
-
ovv
- Сообщения: 13
- Зарегистрирован: 19 окт 2005, 09:03
Сообщение
ovv » 19 окт 2005, 12:13
дело в том что этот код прекрасно работает если создавать обычный exe-ник с кнопочкой. Или с DLL-ками не всё так просто.
-
Merlin
- Динозавр IB/FB
- Сообщения: 1502
- Зарегистрирован: 27 окт 2004, 11:44
Сообщение
Merlin » 19 окт 2005, 12:42
Меня вот больше интересует такой вопрос - что намерен делать в случае rollback изменений, по которым отработала UDF и передала их в наружу?
-
ovv
- Сообщения: 13
- Зарегистрирован: 19 окт 2005, 09:03
Сообщение
ovv » 19 окт 2005, 12:55
принимются любые другие решения обозначенной проблемы
-
hvlad
- Разработчик Firebird
- Сообщения: 1244
- Зарегистрирован: 21 мар 2005, 10:48
Сообщение
hvlad » 19 окт 2005, 13:07
ovv писал(а):дело в том что этот код прекрасно работает если создавать обычный exe-ник с кнопочкой. Или с DLL-ками не всё так просто.
Я за тебя буду отличия искать ? Совет дан - можешь использовать, можешь не использовать. Халявы не будет
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 19 окт 2005, 13:08
не морочить голову и написать приложение, которое будет переносить данные, туда или обратно.
udf это dll, которая работает в контексте сервера. то есть, становится частью сервера. И серверу, от того что ты ему пихаешь какое то там ole, может сделаться кисло.
-
ovv
- Сообщения: 13
- Зарегистрирован: 19 окт 2005, 09:03
Сообщение
ovv » 20 окт 2005, 08:45
А можно ли запустить exe-ник (не в контексте сервера) из dll-ки ?
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 20 окт 2005, 10:46
мда. как у Альтова. "там обрыв, но вам туда можно".
Да можно запустить exe из dll. Только объясни мне смысл этого изврата:
вызываем select runudf('replication.exe') from rdb$database
вместо того чтобы просто взять и запустить replication.exe явно.
-
Dimitry Sibiryakov
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Сообщение
Dimitry Sibiryakov » 20 окт 2005, 10:46
Можно но не нужно. Екзешник должен висеть где-то рядом, периодически проверяя (или ожидая с помощью эвентов которые в отличии от UDF работают только после commit) наличие изменений и сбрасывая их в 1С.
-
ovv
- Сообщения: 13
- Зарегистрирован: 19 окт 2005, 09:03
Сообщение
ovv » 20 окт 2005, 11:26
Спасибо за ответ Dimitry Sibiryakov. Новичок в IB, ни знал что у IB есть event.
-
Dimitry Sibiryakov
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Сообщение
Dimitry Sibiryakov » 20 окт 2005, 14:15
Потому они и промолчали что events не для слабонервных новичков. Если сумеешь заставить их нормально работать, можешь считать себя уже не новичком.
-
ovv
- Сообщения: 13
- Зарегистрирован: 19 окт 2005, 09:03
Сообщение
ovv » 21 окт 2005, 14:19
Не могу разобраться, что надо написать тригере на вставку в параметрах POST_EVENT, чтобы передать значение одного из полей (номенклатурный номер, например). В доке на IB 6 написанно:
Syntax POST_EVENT ’event_name’ | col;
Тоесть либо указываем название события, либо неоходимую колонку. Если указываем колонку, то что тогда написать в параметре IBEventAlerter.Events.Assign(?) в Delphu ?
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 21 окт 2005, 14:23
ничего не писать. евенты не поддерживают передачу параметров. принять ты можешь только то событие, на которое зарегистрирован. А это в обоих случаях текстовая строка. зарегистрировавшись на событие 'A' ты не получишь события 'A1'.
я так понимаю, что ты хочешь именно синхронную репликацию сделать, а не "пакетную". Что тогда будет, если твоя прога (udf и т.п.) не сможет передать изменение, произведенное в конкретный момент? Или если сбой произойдет? Об изменениях больше никто никогда не узнает?
-
Владимир Каратаев
- Сообщения: 22
- Зарегистрирован: 01 ноя 2004, 11:11
Сообщение
Владимир Каратаев » 21 окт 2005, 14:25
ovv писал(а):Не могу разобраться, что надо написать тригере на вставку в параметрах POST_EVENT, чтобы передать значение одного из полей (номенклатурный номер, например). В доке на IB 6 написанно:
Syntax POST_EVENT ’event_name’ | col;
Тоесть либо указываем название события, либо неоходимую колонку. Если указываем колонку, то что тогда написать в параметре IBEventAlerter.Events.Assign(?) в Delphu ?
ниии, не делай так. просто "POST_EVENT 'имя события';" а потом клиент по этому событию читает из таблицы что надо. и не assign, прямо desing-time в компоненте пропиши имя события. подробнее лучше книжку почитай или по этому сайту полазь.
-
ovv
- Сообщения: 13
- Зарегистрирован: 19 окт 2005, 09:03
Сообщение
ovv » 21 окт 2005, 14:43
В доке есть пример: POST_EVENT NEW.COMPANY
Как его можно использовать ?
-
Владимир Каратаев
- Сообщения: 22
- Зарегистрирован: 01 ноя 2004, 11:11
Сообщение
Владимир Каратаев » 21 окт 2005, 14:54
ovv писал(а):В доке есть пример: POST_EVENT NEW.COMPANY
Как его можно использовать ?
1. вставить в процедуру или триггер команду POST_EVENT 'имя события'.
2.в приложении в компоненте tibevents в свойстве events указать имя этого события
3.в обработчике tibevents.oneventalert выполнить код, который читает необходимое значение из таблицы.
-
ovv
- Сообщения: 13
- Зарегистрирован: 19 окт 2005, 09:03
Сообщение
ovv » 21 окт 2005, 15:09
Syntax POST_EVENT ’event_name’ | col;
В доке 2 примера:
1. POST_EVENT ’new_order’;
2. POST_EVENT NEW.COMPANY;
С первым всё понятно. А во втором, как я понял "NEW.COMPANY" это значение поля COMPANY только что добавленной записи. В доке написано: "The next statement posts an event based on the current value of a column". Интересно как подисаться на такое событие из Delphi.
-
Владимир Каратаев
- Сообщения: 22
- Зарегистрирован: 01 ноя 2004, 11:11
Сообщение
Владимир Каратаев » 21 окт 2005, 15:17
ovv писал(а):Syntax POST_EVENT ’event_name’ | col;
В доке 2 примера:
1. POST_EVENT ’new_order’;
2. POST_EVENT NEW.COMPANY;
С первым всё понятно. А во втором, как я понял "NEW.COMPANY" это значение поля COMPANY только что добавленной записи. В доке написано: "The next statement posts an event based on the current value of a column". Интересно как подисаться на такое событие из Delphi.
уважаемый товарищ kdv очень четко и внятно написал: "евенты не поддерживают передачу параметров." никто не будет здесь копаться в доках старой, никому не нужной 6-ки. даже не интересно, что там написано.
1. вставить в хранимую процедуру или триггер команду POST_EVENT 'имя события'.
2.в приложении в компоненте tibevents в свойстве events указать имя этого события
3.в обработчике tibevents.oneventalert выполнить код, который читает необходимое значение из таблицы.
других вариантов работы с events
нет.