Создание операций из внешней системы (Инфо-Сервер)
04.09.2015 06:46
#
Добрый день!
Пытаюсь создавать операции из внешней системы, используя API инфо-сервера.
Передаю запросы на добавление операций.
Но не могу придумать алгоритм определения значения поля NUMINDATE таблицы HOZOP.
Пока на этапе тестирования определяю запросом
'Select MAX(NUMINDATE) MAXNUMINDATE FROM HOZOP WHERE MDATE=:Date'
Но считаю это не верным, долгим и порождающим ошибки в реальной работе способом.
Есть ли какие-то более штатные средства узнать данное значение?
Спасибо.
- 29 просмотров
Информация о датах и номере в дате хранится только в таблицах HOZOP и PROVOD.
Соответственно, нет никаких волшебных способов получить ее еще откуда-нибудь.
С "не верным" не согласен, скорее "единственно возможным и верным".
Что может быть ошибочного в том, что ищется определенное значение в таблице?
Нужно только иметь в виду, что можем NULL получить.
С "долгим" тоже не согласен. Долгий - это когда O(N), полное сканирование таблицы.
А MDATE и NUMINDATE образуют primary key для таблицы HOZOP.
Следовательно здесь поиск по индексированному полю.
По поводу "порождающим ошибки в реальной работе" могу сказать, что не более чем любые другие последовательные запросы, которые делает Инфо-Бухгалтер 8.
Т.к. BDE не поддерживает транзакции, то выполнить несколько действий как одно целое и с изоляцией от других пользователей не получится.
Спасибо!
Ну если так, то так и оставлю.
Ошибки имелись ввиду такие: что, пока еще запись сохранена в базе, есть возможность получить тот же номер MNUMINDATE. А это приведет к смешению проводок при отображении в журнале вместе с проводками. По крайне мере, в ранних версиях мы с этим сталкивались, если я правильно помню.
Чем еще опасно наличие у двух операций одинакового значения NUMINDATE?
И если удалить такую операцию, надо ли перестраивать номера по порядку или пропуски номеров допустимы?
Не получится добавить вторую операцию с таким же значением полей MDATE и NUMINDATE.
Для второго INSERT будет key violation.
Т.е. для безопасного добавления псевдокод такой:
ЦИКЛ ПОКА (НЕ добавили)
num = SELECT MAX(NUMINDATE)...
ЕСЛИ (INSERT ... num ...) ТО
добавили = ДА
КОНЕЦ_ЕСЛИ
КОНЕЦ_ЦИКЛА
Пропуски в значениях NUMINDATE для одной даты не должны на что-то влиять.
Спасибо!