• [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;

    ############################## 通往精神的路很多,物质只是其中一种 ##############################
    http://www.onejava.com/article/oracle/wip/wiptop.htm
    https://docs.oracle.com/cd/A60725_05/html/comnls/us/index.htm
    http://www.oracle.com/technetwork/cn/developer-tools/apex/getting-started-094884-zhs.html
    https://docs.oracle.com/cd/B34956_01/current/html/docset.html
  • 相关阅读:
    【转载】ARM与单片机的区别
    关于头文件定义的一点思考
    关于*** WARNING L15: MULTIPLE CALL TO SEGMENT
    【转】单片机中volatile定义的作用详解
    关于单片机位数的思考(8位、16位、32位)
    memcpy函数
    ubuntu下打开windows里的txt文件乱码解决
    linux source filename
    linux环境设置export
    pdf转word工具
  • 原文地址:https://www.cnblogs.com/pompeii2008/p/5411801.html
Copyright © 2020-2023  润新知