[Form Builder]POST 与 commit_form 的区别

commit_form将form上的数据写入数据库,并且会在database提交,即 直接查询表是能够查到结果,在form左下角会得到“FRM-40400:Transaction complete:4 records applied an saved”

post:将form上的数据写入数据库,但是并不在database提交,即 直接查询表是查不到该记录的,在form左下角会得到"FRM-40404:Database apply complete: 4 records applied"

 

最近遇到一个form需求,需要在form操作过程中,把操作的最后一次记录插入到历史记录表(先插入临时表,最后把满足要求的记录插入历史记录表),

例如:在输入trx quantity时,之前可能已经输入过1--->0.001,2--->0.002,3--->0.003,4--->0.005,

但是最后改成如上图的数据,需求是要求最后把屏幕上的数据记入操作记录表(先插入临时表,最后把满足要求的记录插入操作记录表),其他数据不能插入,又由于此form每次在进入此block时 "trx oper quantity"数据是空白的(此需求说明不能使用常规的明细块逻辑,因为明细块逻辑是每次进入记录时都能从数据库中查询出值),但是"Opr id"的值来源于另一个表,即:第一次进入此block(:system.record_status='NEW')会要求为每个operation id录入新的trx quantity,然后按"BACK"按钮返回时将TRX quantity汇总值返回,以后进入时(:system.record_status<>'NEW')显示当前session已经录入的值

Details "WHEN-BUTTON-PRESS"逻辑代码如下:

IF :system.record_status ='NEW'  then  ---第一次进入到"transfer out details"时 才把数据插入临时表
   DELETE FROM XXWIP_MUCL_TRANSFER_DETAILS WHERE 1=1;----先将临时表中有的数据删除

INSERT INTO XXWIP_MUCL_TRANSFER_DETAILS ---
    (transaction_date,
     organization_id,
     inventory_item_id,

     operation_id,
     trx_oper_quantity
     )
  VALUES
    (:transfer_header.transaction_date,
     :transfer_lines_f.organization_id,
     :transfer_lines_f.inventory_item_id,

  a.OPERATION_CODE,----来自于其他table的值
     0 ---

);
   end loop;
END IF;

 

BACK “WHEN-BUTTON-PRESSED” 代码如下:

declare  

ln_operation_quantity_r number;

begin  

ln_operation_quantity_r :=0;  

first_record;  

loop  

ln_operation_quantity_r := ln_operation_quantity_r+ nvl(:TRANSFER_DETAILS.TRX_OPER_QUANTITY,0);  

EXIT WHEN :system.last_record = 'TRUE';  

next_record;  

end loop;   

post; ----按back按钮时提交数据至临时表,将form上的数据写入数据库,但是并不在database提交,即 直接查询表是查不到该记录的,在form左下角会得到"FRM-40404:Database apply complete: 4 records applied"

---:system.message_level :=25;

---commit_form; ---将form上的数据写入数据库,并且会在database提交,即 直接查询表是能够查到结果,在form左下角会得到“FRM-40400:Transaction complete:4 records applied an saved”

---:system.message_level :=0;

if ln_operation_quantity_r > :TRANSFER_LINES_F.AVAILABLE then  

  fnd_message.set_string('Available quantity is not engouh for transaction');  

  fnd_message.show;  fnd_message.error;  

  RAISE form_trigger_failure; end if;

if ln_operation_quantity_r > 0 then  

copy(ln_operation_quantity_r,'TRANSFER_LINES_F.TRANSFER_OUT');  

copy('Y','TRANSFER_LINES_F.CHECK_BOX');  

--- ln_operation_quantity_r := null;

end if;

go_block('TRANSFER_LINES_F');

hide_window('TRANSFER_DETAILS');

end;

 

 

Description                      

Writes data in the form to the database, but does not perform a database commit. Oracle Forms first validates the form. If there are changes to post to the database, for each block in the form Oracle Forms writes deletes, inserts, and updates to the database.

Any data that you post to the database is committed to the database by the next COMMIT_FORM that executes during the current Runform session. Alternatively, this data can be rolled back by the next CLEAR_FORM.

Syntax                             

PROCEDURE POST;

Built-in Type restricted procedure

Enter Query Mode no

Parameters                        

none

Usage Notes                      

If this form was called via OPEN_FORM with the NO_SESSION parameter specified, then the POST will validate and write the data both in this form and in the calling form.

POST Examples

/*** Built-in: POST and EXIT_FORM

** Example: Leave the called form, without rolling back the

** posted changes so they may be posted and

** committed by the calling form as part of the

** same transaction.

*/

BEGIN

Post;

/*

** Form_Status should be 'QUERY' if all records were

** successfully posted.

*/

IF :System.Form_Status <> 'QUERY' THEN

Message('An error prevented the system from posting changes');

RAISE Form_Trigger_Failure;

END IF;

/*

** By default, Exit_Form asks to commit and performs a

** rollback to savepoint. We've already posted, so we do

** not need to commit, and we don't want the posted changes

** to be rolled back.

*/

Exit_Form(NO_COMMIT, NO_ROLLBACK);

END;