Узнать реальный OPER_NUMB

пользователь
Регистрация: 28.07.2005

Добрый день!

Можно ли каким либо образом узнать реальный код в операции,
который хранится в таблицах Paradox?
Необходимо для связи с операциями ИБ сторонних систем.

Спасибо!

дилер
Регистрация: 17.09.2007

Код чего? Поле OPER_NUMB таблицы HOZOP.DB (хоз.операции) - это уникальный код хоз.операции, который формируется программой при добавлении записи в таблицу из файла EVENTNET.DB. Он может поменяться для конкретной хоз.операции при различных манипуляциях с БД, например, при экспорте-импорте. С полем OPER_NUMB таблицы связано одноименное поле таблицы PROVOD.DB (проводки к операции). Жестко привязывать стороннюю систему к OPER_NUMB я бы поостерегся. Как вариант, при записи хоз.операции кодировать её своим уникальным кодом и прописывать его в наименовании хоз.операции или номере документа, связывая таким образов хоз.операцию в базе И-Б с внешним приложением. Для этого можно использовать обработчики событий.

пользователь
Регистрация: 28.07.2005

Дело в том, что связь уже есть (с 2009 года) и работает. Экспорт-импорт не производим (именно из-за того, что номер в этом случае меняется). все манипуляции с базой (проверки, лечение) производим на сетевой базе (с копированием ее в локальную папку)с отключением пользователей.

С недавнего времени работает инфо-сервер.

Планируем создавать проводки из сторонних систем в базу, при помощи API данного сервера, но некоторые вещи могут быть добавлены и в ИБ, в этом случае хотелось налету переносить операции-проводки (и счета) в нашу систему. Сейчас импорт происходит ночью - раз в сутки.

К сожалению поле номер документа занято номером документа реального документа. писать какой-то номер в текст операции тоже не представляется возможным (его могут просто уничтожить или изменить).

Мысль была при добавлении, изменении и удалении производить импорт в нашу систему сразу же.
Если невозможно получить код операций и проводок, вижу единственный вариант - находить запись в таблице HOZOP по атрибутам (дата, номер содержание, полная сумма, и т.д.) как вариант, конечно, не очень нравится. было бы на порядок проще передавать в функцию импорта текущий OPER_NUMB.

Идея в том, чтобы 2 журнала наш и ИБ в любой момент времени соответствовали. С какой бы стороны не происходил ввод данных.

дилер
Регистрация: 17.09.2007

Ну если вы обеспечиваете неизменность OPER_NUMB, то никаких проблем я не вижу. Чтобы корректно записывать хоз.операции в журнал И-Б берите очередной номер х.о. из EVENTNET.DB и вперед.

пользователь
Регистрация: 28.07.2005

Возможно из-за того что у нас Инфо-сервер, почему-то в таблице EVENTNET.DB пусто.
Это действительно так или в момент ввода там будут появляться записи?

дилер
Регистрация: 17.09.2007

В режиме использования И-С OPER_NUMB для новой записи берется из последней записи таблицы HOZOP (по индексу OPER_NUMB) +1. Но нужно обеспечить блокировку файлов HOZOP и PROVOD до завершения записи, чтобы не произошло "склеивание" проводок.

пользователь
Регистрация: 28.07.2005

Как я понял, Инфо-Сервер смотрит сквозной номер в таблицах операций, проводок, плана счетов и остатков и держит данный номер у себя и передает клиенту по запросу.
Клиент должен сформировать правильный текст запроса и передать серверу.
Сервер его выполнит. Т.е. на момент записи операции в ИБ, сам ИБ уже знает номер операции, но не возвращает его во внутренний язык.
Дело в том, что одновременно вводить проводки могут несколько человек.
Поэтому просто считывать последнюю запись из HOZOP не корректно.

Т.е. из внутреннего языка никак не узнать реальный ключ хозяйственной операции, хотя он есть?

дилер
Регистрация: 17.09.2007

Из внутреннего языка вы всегда можете узнать OPER_NUMB любой уже записанной записи SQL-запросом. Некий глобальный ключ, с которым будет записана запись клиентом ему недоступен, это делает программа через EDVENTNET или Инфо-Сервер последовательно, т.е., файлы HOZOP, PROVOD и EVENTNET блокируются, пока не завершится запись.

Можно разработать пользовательскую блокировку, использующую некоторые хитрости, например, невозможность удалить текстовый файл, открытый на одном клиенте с любого другого, пока он не будет закрыт. В этом файле можно прописывать текущий OPER_NUMB, с которым добавляется запись, затем его закрыть. При следующем добавлении открыть файл, считать номер, попытаться его удалить. Если попытка не удалась, повторять, пока она будет успешной, открыть файл, определить новый OPER_NUMB, записать операцию запись в базу, прописать новое значение OPER_NUMB в блок-файл, закрыть его и т.д. Но в этом случае нужно писать обработчики событий добавления и диалога добавления операции.

модератор
Регистрация: 06.09.2007

В режиме Инфо-Сервера требуемую задачу из внутреннего языка решает функция ИС_СЧЕТЧИК (см. описание и пример в справке).

Инфо-Сервер использует общий счетчик на все таблицы базы данных.
Запросы вида:
SELECT MAX(OPER_NUMB) FROM HOZOP
выполняются только при первом обращении к базе.
Счетчик инициализируется максимальным значением из найденных (для операций, проводок, счетов и т.д.).
Далее счетчик "живет" только во внутренней переменной Инфо-Сервера.
Поэтому, для получения следующего значения никаких блокировок таблиц не требуется.

Таблица EVENTNET совсем не используется при работе в режиме Инфо-Сервера.