powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Секреты мастерства - Oracle Forms
5 сообщений из 5, страница 1 из 1
Секреты мастерства - Oracle Forms
    #33794363
Вадиман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!
Знатоки, поделитесь, кто чем сможет! :)

Ситуация:
есть базовый блок (обзовем его 'DOCUMENT'), наезжает на одноименную таблицу. Используется тремя способами. Первый - вставка данных с нуля. Второй - скажем, дубликат предыдущего документа (та же вставка, только поля заполняются автоматом из предыдущего введенного документа). И третья ситуация - апдейт документа. Проблема со вторым пунктом.

Есть процедурка (опять же, условно даю название, чтобы можно было на нее ссылаться здесь, в тексте):
PROCEDURE PREPARE_DOCUMENT(in_nDocumentId NUMBER, in_vAction VARCHAR2)

Если <in_nDocumentId> IS NULL, то выполняются такие строки (это обычная подготовка к новой вставке нового документа):
GO_BLOCK('DOCUMENT');
CLEAR_BLOCK(NO_VALIDATE);
CREATE_RECORD;

Если <in_nDocumentId> IS NOT NULL AND in_vAction = 'INSERT' (значит, нужно восстановить дубликат с некоторого документа), то делается вот что:

GO_BLOCK('DOCUMENT');
CLEAR_BLOCK(NO_VALIDATE);
:GLOBAL.document_id := 12345; -- ID предыдущего документа
EXECUTE_QUERY;
SET_RECORD_PROPERTY(:SYSTEM.cursor_record, 'DOCUMENT', STATUS, NEW_STATUS);

Одновременно на PRE-QUERY в этом блоке стоит:

DEFAULT_VALUE(NULL, 'GLOBAL.document_id');
IF :GLOBAL.document_id IS NOT NULL THEN
:DOCUMENT.id := :GLOBAL.document_id;
END IF;
ERASE('GLOBAL.document_id');

Вот.
То бишь, после EXECUTE_QUERY я насильно ставлю статус строке "НОВАЯ", чтобы Forms при commit'e считал, что ее нужно вставлять, а не апдейтить.

Ну, и третья ситуация - с обновлением - она работает, сделана по примеру второго варианта, только без SET_RECORD_PROPERTY, там статус менять не нужно, он и так будет CHANGED, если буду что-то менять.

Так вот, второй вариант (дублирование) "не до конца работает". Статус записи-то Forms помечает, как "НОВЫЙ", но при вставке значения полей он считает пустыми! Хотя после EXECUTE_QUERY все поля заполняются данными из документа с тем ID, все ок. Сотворил PRE-INSERT, чтобы узнать, что он действительно вставляет - значение поля на самом деле такое, какое должно быть. Но при вставке вылетает "CANNOT INSERT NULL блаблабла". То есть, Forms почему-то считает, что этих значений там нет.....

Че это за нафиг?
...
Рейтинг: 0 / 0
Секреты мастерства - Oracle Forms
    #33794372
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему бы блаародному дону не воспользоваться штатным механизмом forms - duplicate record?
...
Рейтинг: 0 / 0
Секреты мастерства - Oracle Forms
    #33794374
Вадиман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DUPLICATE_RECORD не очень-то подходит, ведь запись уже должна быть в блоке, а ее там нет (после ввода каждого документа блок очищается). То бишь, кассир ввел документ, подтвердил его, блок очистился, приходит новый клиент, тащит платежку с подобными реквизитами, и чтобы не набивать все заново, нужно просто нажать определенный батон - и обрабатывай НОВЫЙ документ на основе предыдущего. Когда кассир будет нажимать этот батон, записей-то в блоке не будет. Ее надо считать. Ок, она считывается (той связкой PRE-QUERY & EXECUTE_QUERY). Если сейчас поставить DUPLICATE_RECORD... будет две записи. Можно, конечно, удалить PREVIOUS_RECORD, но это плохо... у меня вся логика завязана на том, что в этом блоке одновременно может находиться только одна запись. Много переделывать придется. Но ведь по сути SET_RECORD_PROPERTY(..., STATUS, NEW_STATUS) - это то, что нужно... тот же DUPLICATE_RECORD, только я за него половину работы уже сделал - запись вытащил.
Не понимаю :(...
...
Рейтинг: 0 / 0
Секреты мастерства - Oracle Forms
    #33794378
Вадиман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мматтттьь.....
:)

На блоке DOCUMENT стояло свойство UPDATE CHANGED COLUMNS OLNY = YES. Мааленькое такое неприметное свойство. Оно все поганило. У строки-то я статус поменял на NEW, но у колонок оно как было QUERY, так и осталось. Вообще-то странно, я же хочу не обновление сделать, а вставку... но, короче, это вылечило проблему :)
...
Рейтинг: 0 / 0
Секреты мастерства - Oracle Forms
    #33794708
alexx726
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а мне кажется, что вся эта логика изначально должна быть на сервере
Тогда не надо было бы всех этих безумств с Set_Record_Property
(согласись, стремные процедурки)
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Секреты мастерства - Oracle Forms
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]