Все запросы выполняются напрямую в БД необходимой точки в транзакции с параметрами "read_committed rec_version nowait" 1. Запрос доступных остатков select part_id, quant+coalesce((select sum(quant) from doc_detail_active dda where dda.part_id=wb.part_id and quant<0),0) as avlb_qnt from warebase wb where sname= ? /* name_id=? */ and sizg=? /* izg_id=? */ and seria=? and godendo=? *критерии поиска приведены для примера, можно искать по любым необходимым полям возвращает список найденых партий, или EOF, если ничего не найдено. part_id - код партии - необходимо при наполнении заказа avlb_qnt - доступное для заказа кол-во на текущий момент, с учетом партий, которые в активных документах или зарезервированы ранее 2. Создание заказа select ORDER_UUID, DOC_ID from PR_I_NEW_ORDER(VNUM,ORDER_DATE,CLIENT_NAME,CLIENT_EMAIL, CLIENT_PHONE, CLIENT_UUID) VNUM(BIGINT) - код заказа, инфо поле, передается с сайта ORDER_DATE(TIMESTAMP) - дата/время заказа CLIENT_NAME(VARCHAR(250)) - имя клиента CLIENT_EMAIL(VARCHAR(250)) - email клиента CLIENT_PHONE(VARCHAR(250)) - номер телефона клиента, формат не проверяется, контроль на сайте CLIENT_UUID(CHAR(36)) - идентификатор клиента - пользователя сайта интернет-магазина Возвращает: ORDER_UUID(CHAR(36)) - глобальный уникальный идентификатор созданного заказа в БД точки DOC_ID(BIGINT) - локальный идентификатор созданного сопроводительного документа для резервирования и, при продаже, переоценки товара (сайту не нужен, на всяк пож) 3. Наполнение заказа select ERROR_CODE, ERROR_TEXT from PR_I_ORDER_ADD(ORDER_UUID(CHAR(36)),PART_ID(BIGINT),QUANT(DOUBLE),PRICE(DOUBLE)) добавить/изменить кол-во позиции в заказе, если quant=0 - позиция удаляется из заказа. Выполняется последовательно для всех необходимых партий, найденных с помощью запроса доступных остатков. ORDER_UUID(CHAR(36)) - код заказа, созданного процедурой создания заказа (PR_I_NEW_ORDER) PART_ID(BIGINT) - код партии, из запроса доступных остатков. QUANT(DOUBLE) - кол-во для заказа, если на момент вызова процедуры кол-во на остатке будет недосточное, вернется ошика PRICE(DOUBLE) - интернет-цена, при продаже товар будет переоценен на эту интернет-цену Возвращает: ERROR_CODE - 0 - партия успешно зарезервирована, иначе - код ошибки ERROR_TEXT - текст ошибки 4. Подтверждение заказа. select ERROR_CODE, ERROR_TEXT from PR_I_COMMIT_ORDER(ORDER_UUID(CHAR(36)),STATUS(INTEGER),STATUS_INFO(BLOB)) установка статуса заказа. ORDER_UUID(CHAR(36)) - код заказа, созданного процедурой создания заказа (PR_I_NEW_ORDER) STATUS: 1 - подтверждение -1 - отмена, удаление сопровождающего документа резервирования кол-ва STATUS_INFO - описание установки того или иного статуса Желательно все делать в одной транзакции и в случае ошибки - откатывать. Допустимо коммитить транзакцию на промежуточных этапах, но необходим контроль отмены этих заказов и сопроводительных документов. Ни в коем случае нельзя допускать длинных по времени изменяющих данные транзакций, например "старт транзакции - запрос ввода пользователя - коммит/откат"!!! Предварительный алгоритм работы с конкретной БД точки, т.е. список партий товаров уже имеется 1. Старт транзакции 2. Создание заказа 3. Наполнение заказа 4. Подтверждение заказа 5. Коммит транзакции