Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Секреты мастерства - Oracle Forms
|
|||
|---|---|---|---|
|
#18+
Привет всем! Знатоки, поделитесь, кто чем сможет! :) Ситуация: есть базовый блок (обзовем его '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 почему-то считает, что этих значений там нет..... Че это за нафиг? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 02:39 |
|
||
|
Секреты мастерства - Oracle Forms
|
|||
|---|---|---|---|
|
#18+
почему бы блаародному дону не воспользоваться штатным механизмом forms - duplicate record? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 03:34 |
|
||
|
Секреты мастерства - Oracle Forms
|
|||
|---|---|---|---|
|
#18+
DUPLICATE_RECORD не очень-то подходит, ведь запись уже должна быть в блоке, а ее там нет (после ввода каждого документа блок очищается). То бишь, кассир ввел документ, подтвердил его, блок очистился, приходит новый клиент, тащит платежку с подобными реквизитами, и чтобы не набивать все заново, нужно просто нажать определенный батон - и обрабатывай НОВЫЙ документ на основе предыдущего. Когда кассир будет нажимать этот батон, записей-то в блоке не будет. Ее надо считать. Ок, она считывается (той связкой PRE-QUERY & EXECUTE_QUERY). Если сейчас поставить DUPLICATE_RECORD... будет две записи. Можно, конечно, удалить PREVIOUS_RECORD, но это плохо... у меня вся логика завязана на том, что в этом блоке одновременно может находиться только одна запись. Много переделывать придется. Но ведь по сути SET_RECORD_PROPERTY(..., STATUS, NEW_STATUS) - это то, что нужно... тот же DUPLICATE_RECORD, только я за него половину работы уже сделал - запись вытащил. Не понимаю :(... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 03:42 |
|
||
|
Секреты мастерства - Oracle Forms
|
|||
|---|---|---|---|
|
#18+
Мматтттьь..... :) На блоке DOCUMENT стояло свойство UPDATE CHANGED COLUMNS OLNY = YES. Мааленькое такое неприметное свойство. Оно все поганило. У строки-то я статус поменял на NEW, но у колонок оно как было QUERY, так и осталось. Вообще-то странно, я же хочу не обновление сделать, а вставку... но, короче, это вылечило проблему :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2006, 03:52 |
|
||
|
|

start [/forum/topic.php?fid=51&msg=33794372&tid=1879315]: |
0ms |
get settings: |
4ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
43ms |
get topic data: |
5ms |
get forum data: |
1ms |
get page messages: |
24ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 307ms |

| 0 / 0 |
