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

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

Добавлено: 19 окт 2005, 09:47
ovv
Стоит задача синхронизация двух приложений - 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 процедуры ?

Добавлено: 19 окт 2005, 10:46
hvlad
CoInitialize\OleInitialize кто-то вызывал ?
Отладчиком пользоваться умеем ?

Добавлено: 19 окт 2005, 12:13
ovv
дело в том что этот код прекрасно работает если создавать обычный exe-ник с кнопочкой. Или с DLL-ками не всё так просто.

Добавлено: 19 окт 2005, 12:42
Merlin
Меня вот больше интересует такой вопрос - что намерен делать в случае rollback изменений, по которым отработала UDF и передала их в наружу?

Добавлено: 19 окт 2005, 12:55
ovv
принимются любые другие решения обозначенной проблемы

Добавлено: 19 окт 2005, 13:07
hvlad
ovv писал(а):дело в том что этот код прекрасно работает если создавать обычный exe-ник с кнопочкой. Или с DLL-ками не всё так просто.
Я за тебя буду отличия искать ? Совет дан - можешь использовать, можешь не использовать. Халявы не будет

Добавлено: 19 окт 2005, 13:08
kdv
не морочить голову и написать приложение, которое будет переносить данные, туда или обратно.
udf это dll, которая работает в контексте сервера. то есть, становится частью сервера. И серверу, от того что ты ему пихаешь какое то там ole, может сделаться кисло.

Добавлено: 20 окт 2005, 08:45
ovv
А можно ли запустить exe-ник (не в контексте сервера) из dll-ки ?

Добавлено: 20 окт 2005, 10:46
kdv
мда. как у Альтова. "там обрыв, но вам туда можно".
Да можно запустить exe из dll. Только объясни мне смысл этого изврата:

вызываем select runudf('replication.exe') from rdb$database
вместо того чтобы просто взять и запустить replication.exe явно.

Добавлено: 20 окт 2005, 10:46
Dimitry Sibiryakov
Можно но не нужно. Екзешник должен висеть где-то рядом, периодически проверяя (или ожидая с помощью эвентов которые в отличии от UDF работают только после commit) наличие изменений и сбрасывая их в 1С.

Добавлено: 20 окт 2005, 11:26
ovv
Спасибо за ответ Dimitry Sibiryakov. Новичок в IB, ни знал что у IB есть event.

Добавлено: 20 окт 2005, 14:15
Dimitry Sibiryakov
Потому они и промолчали что events не для слабонервных новичков. Если сумеешь заставить их нормально работать, можешь считать себя уже не новичком.

Добавлено: 20 окт 2005, 14:55
Владимир Каратаев
да не пугай так человека. щас эвенты работают нормально. а раньше был тихий ужас.

Добавлено: 21 окт 2005, 14:19
ovv
Не могу разобраться, что надо написать тригере на вставку в параметрах POST_EVENT, чтобы передать значение одного из полей (номенклатурный номер, например). В доке на IB 6 написанно:
Syntax POST_EVENT ’event_name’ | col;
Тоесть либо указываем название события, либо неоходимую колонку. Если указываем колонку, то что тогда написать в параметре IBEventAlerter.Events.Assign(?) в Delphu ?

Добавлено: 21 окт 2005, 14:23
kdv
ничего не писать. евенты не поддерживают передачу параметров. принять ты можешь только то событие, на которое зарегистрирован. А это в обоих случаях текстовая строка. зарегистрировавшись на событие 'A' ты не получишь события 'A1'.

я так понимаю, что ты хочешь именно синхронную репликацию сделать, а не "пакетную". Что тогда будет, если твоя прога (udf и т.п.) не сможет передать изменение, произведенное в конкретный момент? Или если сбой произойдет? Об изменениях больше никто никогда не узнает?

Добавлено: 21 окт 2005, 14:25
Владимир Каратаев
ovv писал(а):Не могу разобраться, что надо написать тригере на вставку в параметрах POST_EVENT, чтобы передать значение одного из полей (номенклатурный номер, например). В доке на IB 6 написанно:
Syntax POST_EVENT ’event_name’ | col;
Тоесть либо указываем название события, либо неоходимую колонку. Если указываем колонку, то что тогда написать в параметре IBEventAlerter.Events.Assign(?) в Delphu ?
ниии, не делай так. просто "POST_EVENT 'имя события';" а потом клиент по этому событию читает из таблицы что надо. и не assign, прямо desing-time в компоненте пропиши имя события. подробнее лучше книжку почитай или по этому сайту полазь.

Добавлено: 21 окт 2005, 14:43
ovv
В доке есть пример: POST_EVENT NEW.COMPANY
Как его можно использовать ?

Добавлено: 21 окт 2005, 14:54
Владимир Каратаев
ovv писал(а):В доке есть пример: POST_EVENT NEW.COMPANY
Как его можно использовать ?
1. вставить в процедуру или триггер команду POST_EVENT 'имя события'.
2.в приложении в компоненте tibevents в свойстве events указать имя этого события
3.в обработчике tibevents.oneventalert выполнить код, который читает необходимое значение из таблицы.

:|

Добавлено: 21 окт 2005, 15:09
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.

Добавлено: 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: