Интеграция приложений (Interbase + 1C)

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

ovv
Сообщения: 13
Зарегистрирован: 19 окт 2005, 09:03

Интеграция приложений (Interbase + 1C)

Сообщение 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 не для слабонервных новичков. Если сумеешь заставить их нормально работать, можешь считать себя уже не новичком.

Владимир Каратаев
Сообщения: 22
Зарегистрирован: 01 ноя 2004, 11:11

Сообщение Владимир Каратаев » 20 окт 2005, 14:55

да не пугай так человека. щас эвенты работают нормально. а раньше был тихий ужас.

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 нет.

:cry:

Ответить