SAP KO22内部订单预算BAPI与BDC

news2025/1/15 17:42:19

KO22可以为内部订单预先维护预算,以便在后续成本实际产生时进行控制。

使用BAPI进行创建:KBPP_EXTERN_UPDATE_CO

SAP note 625613中对该BAPI的使用方式有详细介绍,使用时可进行参考。

年度预算:e_gjahr传值、e_ges置空;

总预算:e_gjahr置空、e_ges为'X'。

实际使用过程中,发现有一种情况用该BAPI更新不了,即在分配预算之前,该订单就已经产生成本,这种时候前台可以正常保存,但BAPI无法直接更新成功,debug无果后决定使用BDC来进行实现,如果有人知道通过BAPI怎么处理这种情况,可以评论分享下。

DATA:
    lt_bpak   TYPE bpak_tab,
    ls_bpak   TYPE bpak,
    lt_return TYPE bapiret2_t,
    ls_return TYPE bapiret2.

"年度预算
ls_bpak-e_objnr = us_item-objnr.
ls_bpak-e_gjahr = us_item-gjahr.
ls_bpak-wert    = us_item-wtjhr.
ls_bpak-twaer   = us_item-twaer.
ls_bpak-e_versn = ''.
APPEND ls_bpak TO lt_bpak.
CLEAR ls_bpak.

"总预算
ls_bpak-e_objnr = us_item-objnr.
ls_bpak-wert    = us_item-wtges.
ls_bpak-twaer   = us_item-twaer.
ls_bpak-e_ges   = 'X'.
ls_bpak-e_versn = ''.
APPEND ls_bpak TO lt_bpak.
CLEAR ls_bpak.

* 预算更新
  CALL FUNCTION 'KBPP_EXTERN_UPDATE_CO'
    EXPORTING
      i_budget_activity = 'KBUD'
*     I_BUDGET_ACTIV_SUP_RET              = ' '
*     I_BUDGET_DISTRIBUTION_ALLOWED       = ' '
*     I_COMMIT_DATA     = ' '
*     I_DELTA_AMOUNTS   = 'X'
*     I_ROLLUP_DATA     = 'X'
*     I_CHECK_PLAN_DATA = 'X'
*     I_APPLICATION     =
      i_commit_all      = 'X'
* IMPORTING
*     E_ERRORS_FOUND    =
    TABLES
      it_bpak           = lt_bpak
      it_return         = lt_return
    EXCEPTIONS
      no_update         = 1
      OTHERS            = 2.

使用BDC进行创建

使用SHDB进行录屏,BDC的使用方法网上太多帖子了,这里只分享下使用BDC过程中碰到的几个问题:

问题1:

在初次登陆系统时,进入该事务代码时,会出现这个弹窗,让用户选择控制范围,输入过之后,后续再次进入该事务代码,这个弹窗就不会出现了,这也是使用BDC时需要注意到的点,这个弹窗也需要录进去,但是程序应该根据什么逻辑来决定是否需要弹窗这段录屏代码呢?

理论上SAP大多数类似的标准功能都是相同的逻辑,都是点选了对应的值之后,使用SET PARAMER ID 'XXX' FIELD VALUE来将用户选择的值保存到SAP SESSION中,后面每次进入事务码时,使用GET PARAMER ID 'XXX' FIELD VALUE来进行获取,如果获取到就不会出现这个弹窗,所以我们在录屏的代码中,加上对应的判断即可。

在弹窗输入框中摁下F1,即可快速找到该字段对应的Parameter ID。

问题2:

使用BDC时,有时候一些前台的报错日志不会返回到messtab中,例如下图这种报错。

解决思路就是在前台点保存之后,/H进行debug,一步一步跟踪看标准代码是怎么进行处理的,以我这个前台报错为例,最终定位到程序在CHECK_ALL子例程中进行所有检查逻辑,在CHECK_LIST中将错误信息进行转换,并且收集到内表 (SAPLSMSG)XMESG[] 中,再以弹窗形式输出,但是前台执行和BDC执行时有些地方有不太一样。

在CHECK_ALL的子例程中,检查发生在函数KBPT_CHECK_BUDGET_PLAN中,前台执行后,如果有错误信息,不会执行446行的E类型消息,但BDC后台调用会执行该语句,E类型的消息会直接终止掉程序,所以后续的CHECK_LIST中收集错误的逻辑就没有办法去执行,程序中自然也无法获取到错误消息。

后来进一步调试,发现消息的收集和显示,是在CHECK_LIST里面的一个函数KBPT_ERROR_LOG中完成,参数MOVE_MESS决定了是否出现弹窗。

所以想要程序中捕获到这个错误信息,就需要在message E 类型语句之前把对应的错误消息收集到,并抛给程序,最终发现只有一个位置可以用来做这件事,就是在SET_ERROR_MARK中做隐式增强来进行数据抛出。

因为后续的message E语句会终止掉internal session,导致调用程序中无法获取到该session中的任何数据,所以只能通过EXPORT TO DATABASE的方式来共享数据。

以上,即可拿到跟前台一样的错误日志数据。

KO22的BDC参考代码:

*&---------------------------------------------------------------------*
*& Form FRM_BDC_CONTRACT_MAINTAIN
*&---------------------------------------------------------------------*
*& Using BDC to create contract
*&---------------------------------------------------------------------*
FORM frm_bdc_contract_maintain USING ut_item TYPE zprfitintordbudget_item_in
                             CHANGING cs_resp TYPE zprbcsrest_out.
  DATA:
    lv_kokrs       TYPE tka01-kokrs,
    lt_index       TYPE STANDARD TABLE OF string,
    lv_tabix       TYPE n LENGTH 2,
    lv_year        TYPE n LENGTH 4,
    lv_bdc_field   TYPE string,
    lv_bdc_value_i TYPE i,
    lv_bdc_value_c TYPE string,
    lv_errmsg      TYPE string,
    lv_objnr       TYPE bp_objekt.

* BDC Error log
  DATA:
    lt_mesg  TYPE STANDARD TABLE OF mesg,
    lt_xmesg TYPE STANDARD TABLE OF smesgx.


  CONSTANTS:
    lc_wert1          TYPE string VALUE 'BPDY-WERT1',
    lc_left_brackets  TYPE char1  VALUE '(',
    lc_right_brackets TYPE char1  VALUE ')'.

* SPA/GPA-Parameter prüfen
  GET PARAMETER ID 'CAC' FIELD lv_kokrs.

  lv_year = sy-datlo+0(4) - 1.

  APPEND 'TOTAL' TO lt_index.

  DO 5 TIMES.
    APPEND lv_year TO lt_index.
    ADD 1 TO lv_year.
  ENDDO.

  IF lv_kokrs IS INITIAL.
*   Select Controller Area
    PERFORM frm_bdc_dynpro      USING 'SAPLSPO4' '0300'.
    PERFORM frm_bdc_field       USING 'BDC_CURSOR'
                                      'SVALD-VALUE(01)'.
    PERFORM frm_bdc_field       USING 'BDC_OKCODE'
                                      '=FURT'.
    PERFORM frm_bdc_field       USING 'SVALD-VALUE(01)'
                                      'ZDPS'.
  ENDIF.

* Enter Order

  READ TABLE ut_item INTO DATA(us_item) INDEX 1.

  PERFORM frm_bdc_dynpro      USING 'SAPMKBUD' '0300'.
  PERFORM frm_bdc_field       USING 'BDC_CURSOR'
                                    'CODIA-AUFNR'.
  PERFORM frm_bdc_field       USING 'BDC_OKCODE'
                                    '/00'.
  PERFORM frm_bdc_field       USING 'CODIA-AUFNR'
                                    us_item-aufnr.

  PERFORM frm_bdc_dynpro      USING 'SAPLKBPP' '0320'.
  PERFORM frm_bdc_field       USING 'BDC_CURSOR'
                                    'BPDY-WERT1(01)'.
  PERFORM frm_bdc_field       USING 'BDC_OKCODE'
                                    '=FULL'.

* Full amount
  PERFORM frm_bdc_dynpro      USING 'SAPLKBPP' '0220'.
  PERFORM frm_bdc_field       USING 'BDC_CURSOR'
                                    'BPDY-WERT1(03)'.
  PERFORM frm_bdc_field       USING 'BDC_OKCODE'
                                    '=POST'.

  LOOP AT ut_item INTO us_item.
    READ TABLE lt_index TRANSPORTING NO FIELDS
      WITH KEY table_line = us_item-gjahr.
    IF sy-subrc = 0.
      lv_tabix = sy-tabix.

      lv_bdc_field = lc_wert1 &&
                     lc_left_brackets &&
                     lv_tabix &&
                     lc_right_brackets.

      lv_bdc_value_i = us_item-wtjhr.
      lv_bdc_value_c = lv_bdc_value_i.

      CONDENSE lv_bdc_value_c NO-GAPS.

*     Year value
      PERFORM frm_bdc_field USING lv_bdc_field
                                  lv_bdc_value_c.
    ENDIF.

    IF us_item-wtges IS NOT INITIAL..
      lv_bdc_value_i = us_item-wtges.
      lv_bdc_value_c = lv_bdc_value_i.

      CONDENSE lv_bdc_value_c NO-GAPS.

*     Total value
      PERFORM frm_bdc_field USING 'BPDY-WERT1(01)'
                                  lv_bdc_value_c.
    ENDIF.
  ENDLOOP.

  lv_objnr = us_item-objnr.

  CALL FUNCTION 'ENQUEUE_EBPTR_EX'
    EXPORTING
      objnr          = lv_objnr
    EXCEPTIONS
      foreign_lock   = 1
      system_failure = 2
      OTHERS         = 3.

  IF sy-subrc <> 0.
*   Implement suitable error handling here
    cs_resp-msgty = 'E'.

    MESSAGE ID sy-msgid
          TYPE sy-msgty
        NUMBER sy-msgno
          WITH sy-msgv1
               sy-msgv2
               sy-msgv3
               sy-msgv4
          INTO cs_resp-msgtx.
    RETURN.
  ELSE.
    CALL FUNCTION 'DEQUEUE_EBPTR_EX'
      EXPORTING
        objnr = lv_objnr.
  ENDIF.

  TRY.
      CALL TRANSACTION 'KO22' WITH AUTHORITY-CHECK USING bdcdata
                       MODE   'N'
                       UPDATE 'S'
                       MESSAGES INTO messtab.

      LOOP AT messtab INTO DATA(ls_messtab) WHERE msgtyp CA 'EAX'.
        cs_resp-msgty = 'E'.
        EXIT.
      ENDLOOP.

      IF sy-subrc <> 0.
        cs_resp-msgty = 'S'.

        MESSAGE ID sy-msgid
              TYPE sy-msgty
            NUMBER sy-msgno
              WITH sy-msgv1
                   sy-msgv2
                   sy-msgv3
                   sy-msgv4
              INTO cs_resp-msgtx.
      ELSE.
        IMPORT zprerrlog = lt_xmesg FROM DATABASE indx(pr) ID 'ZPRMEMORY_KO22'.
        DELETE FROM DATABASE indx(pr) ID 'ZPRMEMORY_KO22'.

        LOOP AT lt_xmesg INTO DATA(ls_xmesg).
          MESSAGE ID ls_xmesg-arbgb
                TYPE 'E'
              NUMBER ls_xmesg-txtnr
                WITH ls_xmesg-msgv1
                     ls_xmesg-msgv2
                     ls_xmesg-msgv3
                     ls_xmesg-msgv4
                INTO lv_errmsg.
          CONCATENATE cs_resp-msgtx '|' lv_errmsg INTO cs_resp-msgtx.
        ENDLOOP.

        cs_resp-msgtx = shift_left( val = cs_resp-msgtx sub = '|' ).
      ENDIF.
    CATCH cx_sy_authorization_error INTO DATA(lx_auth_check).
*     Authorization missing for user when executing transaction
      DATA(lv_auth_check_text) = lx_auth_check->get_text( ).

      cs_resp-msgty = 'E'.
      cs_resp-msgtx = lv_auth_check_text.
  ENDTRY.

  CLEAR:
    bdcdata,
    bdcdata[],
    messtab,
    messtab[],
    lt_mesg.

  FREE:
    bdcdata[],
    messtab[].
ENDFORM.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1216258.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧农业新篇章:拓世法宝AI智能直播一体机助力乡村振兴与农业可持续发展

随着乡村振兴战略的深入推进&#xff0c;农业发展日益成为国家关注的焦点。在这一大背景下&#xff0c;助农项目的兴起成为支持乡村振兴的一项重要举措。 乡村振兴战略的实施&#xff0c;得益于《关于推动文化产业赋能乡村振兴的意见》、《关于全面推进乡村振兴加快农业农村现…

怎么把ogg转mp3格式?

音频声音小怎么增强&#xff1f;现在对于音频文件的使用越来越频繁&#xff0c;自媒体从业者会使用到音频素材&#xff0c;还有很多人会从网上下载很多的学习音频文件&#xff0c;有时候下载的音频文件播放之后会发现声音很小&#xff0c;此时大家会调大音频播放器的音量或者电…

GBase8a-GDCA-第一次阶段测试

文章目录 主要内容 总结 主要内容 GBase8a-第一阶段测试答案 总结 以上是今天要讲的内容&#xff0c;GBase8a-GDCA-第一次阶段测试题及答案。

LeetCode(19)最后一个单词的长度【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 58. 最后一个单词的长度 1.题目 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 …

el-select下拉框只回显value不回显label的原因以及解决方法

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 原因分析&#xff1a; 提示&#xff1a;这里填写问题的分析&#xff1a; el-select的采用的是map的key value结构&#xff0c;因此只显示value而不显示label的原因是&#xff0c;value的类型不正确&…

webpack系列之:手把手教你 打包和使用js文件

项目初始化 mkdir demo1 cd demo1 npm init // 一路回车 创建一个package.json文件webpack安装 npm install --save-dev webpackJs文件打包 可以先看一下最后的项目情况&#xff0c;然后我们再开始一步步操作 创建需要打包的js文件 创建文件夹用于存放js文件 // 创建文…

抖音测试付费短视频:从短剧领域拓展到知识、娱乐全品类

11月16日&#xff0c;抖音开始测试短视频内容付费&#xff0c;即用户在观看创作者的内容时&#xff0c;部分内容需要付费解锁才能全部观看&#xff0c;涉及范围不仅包括此前已经进行付费试水的短剧领域&#xff0c;还拓展至知识、娱乐等几乎全品类内容&#xff0c;用户可按单条…

asp.net core EF Sqlserver

一、EF CORE的使用 1、使用NuGet来安装EF CORE 使用程序包管理器控制台&#xff0c;进行命令安装 //安装 Microsoft.EntityFrameworkCoreInstall-Package Microsoft.EntityFrameworkCore //安装 Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityF…

【数据结构】C语言实现栈

&#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;C/C领域新星创作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;数据结构与算法&#x1f91d;希望作者的文章能对你有所帮助&#xff0c;有不足的地方请在评论区留言指正&#xff0c;大家…

浅谈青岛啤酒厂事件—论智能视频监控的重要性和必要性

近日&#xff0c;“青岛啤酒三厂有工人在原料仓小便”的视频曝光&#xff0c;引发舆论关注。虽然此次事件原委已经明了&#xff0c;但此次事件也给我们敲了一个警钟。啤酒厂生产的是入口的食品原料&#xff0c;就因一个工作口角就导致有人罔顾大众食品安全&#xff0c;作出严重…

Windows Server 2012 R2系统服务器远程桌面服务多用户登录配置分享

Windows Server 2012系统在没有安装远程多界面的情况下&#xff0c;最多只能同时运行2个远程桌面&#xff0c;如果是有多个技术员、合伙人同时操作或是像游戏开发需要用到多界面&#xff0c;但是没有安装就很不方便&#xff0c;今天飞飞来和你们分享Windows server 2012R2系统远…

rtsp、rtmp、m3u8、flv、mkv、3gp、mp4直播流测试地址

✍️作者简介&#xff1a;沫小北/码农小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a;沫小北/码农小北 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&…

pwnable.kr--pwn游戏之fd

题目描述&#xff1a; 大致告诉我们研究的可能是Linux下的文件描述符。需要我们用ssh链接过去找到flag。于是我们就过去看看&#xff1a; 乍看情况有点像简单nc&#xff0c;我们尝试看看目录下都有什么&#xff1a; 看到flag&#xff0c;那么尝试输出呢&#xff1f; Permission…

AI换脸的一种技术实施例

刚刚看一个帖子的时候发现了AI识别中一个可以利用到其它场景的的一个通用处理步骤&#xff1a;人脸矫正。 人脸识别过程&#xff1a; 1.首先识别到关键的人脸部分&#xff0c;经过一个粗筛过程&#xff0c;把目标物的脸部图样先抓出来。 2.然后&#xff0c;因为人脸的水平&…

AI自动直播软件,ai无人直播工具2.0支持多平台矩阵直播一键同步直播脚本内容【直播脚本+使用技术教程】

AI实景直播软件简介&#xff1a; 支持一台手机自动直播&#xff0c;支持语音和文字同时回复&#xff0c;商品自动弹窗&#xff0c;支持抖音、快手、视频号、美团平台直播&#xff0c;支持矩阵直播&#xff0c;一键同步直播脚本内容。 设备需求&#xff1a; 安卓手机&#xf…

Hack_Kid

Hack_Kid 靶机地址&#xff1a;https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova 一、主机发现 发现靶机IP为192.168.80.135 二、端口扫描 发现靶机开启了80、53、9999端口 三、信息收集 1.访问80端口 2.访问9999端口 根据靶场作者的提示&#xff0c;不…

深眸科技革新升级OCR技术,与AI视觉实现有效融合赋能各行业应用

OCR即光学字符识别&#xff0c;是通过扫描仪或工业相机等电子设备检查打印的字符&#xff0c;并通过检测暗、亮的模式确定其形状&#xff0c;然后用字符识别方法将形状翻译成计算机文字的过程。 目前&#xff0c;随着机器视觉和人工智能技术的进一步升级&#xff0c;OCR技术实…

大数据毕业设计选题推荐-机房信息大数据平台-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

北邮22级信通院数电:Verilog-FPGA(9)第九周实验(4)实现寄存器74LS374

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 reg_74LS374.v 1.2 reg_LS3…

渗透测试——1

1.计算机地址 计算机在网络中的地址有以下3类&#xff1a; &#xff08;1&#xff09;物理地址 物理地址相当于现实生活中的人脸&#xff0c;是不可改变的&#xff0c;独一无二的。每张网卡的物理地址是固定不变的。 物理地址由六个十六进制数组成&#xff0c;如&…