【问题标题】:Does BAPI_TRANSACTION_COMMIT commit changes since the last commit自上次提交以来 BAPI_TRANSACTION_COMMIT 是否提交更改
【发布时间】:2015-05-04 11:10:10
【问题描述】:

我知道当您在程序中调用 BAPI 来更改 SAP 系统中的数据时,您必须随后调用 BAPI_TRANSACTION_COMMIT 将更改写入数据库。

   JCoFunctionTemplate functionTemplate = dest.getRepository().getFunctionTemplate("BAPI_FIXEDASSET_CHANGE");      
   JCoFunction ChangeFunction = functionTemplate.getFunction();
   ...//some code
   ChangeFunction.execute(destination);

    JCoFunctionTemplate functionTemplate = dest.getRepository().getFunctionTemplate("BAPI_TRANSACTION_COMMIT");   
    JCoFunction commFunct = functionTemplate.getFunction();
    commFunct.execute(destination);

我的问题是,BAPI_TRANSACTION_COMMIT 是否会提交自上次提交以来的所有更改?还是只提交前一个事务?

【问题讨论】:

    标签: java commit abap jco


    【解决方案1】:

    BAPI_TRANSACTION_COMMIT 根据参数WAIT 执行COMMIT WORK 或COMMIT WORK AND WAIT。这意味着它将提交所有尚未提交的数据库更改。

    因此,在您的示例代码中,它将提交来自 BAPI_FIXEDASSET_CHANGE 的更改,以及之前所做的任何尚未提交的更改。

    【讨论】:

    • 谢谢。你能给我提供这个信息的链接吗?我的下一个问题是,我怎样才能只提交最后一笔交易?一开始有可能吗?
    • 事实上,它提交了实际 LUW 的所有(预)挂起的数据库操作,其中调用了 COMMIT WORK。
    • 正如@icbytes 正确指出的那样,COMMIT WORK 提交了当前 LUW(逻辑工作单元)中的所有内容。如果您只想提交最后一个事务,则需要确保这是 LUW 中的唯一内容。我知道在 ABAP 中完成此任务的不同方法,但不知道如何使用 JCo 完成此任务。无论您想对挂起的数据库操作做什么,您都需要回答的问题。
    【解决方案2】:

    依赖数据库操作的一种常用方式也称为事务。根据定义,事务是对数据库的原子操作,以在任何更改后保持一致的数据一致。如果n个数据库操作彼此都属于一个事务,那么提交必须在最后一次成功操作之后发出。如果 n 个操作中的任何一个失败,则该事务被视为未完全发布。回滚工作是通常的方法。如果您有一个事务应该拆分为只提交几个更改,请考虑重新设计您的整个方法。或者,不太好,创建一个发布功能模块并在更新任务中调用它。小心点。哦,我明白了,你调用标准 sap 功能模块。寻找它的参数。它可能有一个隐式提交的标志。永远不要忘记 SAP GUI 事务“BAPI”并阅读文档。您的愿望很可能与事务不一致,因此 bapi 必须做更多。如果稍后发生故障,则事务不一致,因此不会提交。大多数 sap 知道他们的 api 应该做什么。但在处理质量通知和质量检验批次时,我对此表示怀疑。 :-D

    【讨论】:

      【解决方案3】:

      它将提交 SAP 上下文之间的任何内容。即

      JCoContext.begin(m_jcoDestination);
      // your transactions using function module
      JCoFunctionTemplate functionTemplate = m_jcoDestination.getRepository().getFunctionTemplate("BAPI_TRANSACTION_COMMIT");   
      JCoFunction commFunct = functionTemplate.getFunction();
      commFunct.execute(m_connection.getJcoDestination()); 
      JCoContext.end(m_jcoDestination);
      

      【讨论】:

        猜你喜欢
        • 2017-03-05
        • 1970-01-01
        • 2016-02-08
        • 1970-01-01
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-25
        相关资源
        最近更新 更多