GS01创建信息集及其他GROUP在ABAP程序中的调用方法

本文详细介绍了如何利用G_SET_GET_ALL_VALUES和G_SET_FETCH函数进行数据获取与处理。通过实例演示了如何获取特定范围内的数据,并进一步解析了函数的参数及返回值,提供了对数据管理和业务逻辑实现的深入理解。

1、函数'G_SET_GET_ALL_VALUES'使用 实例

DATA: t_set_values TYPE TABLE OF rgsb4.
DATA: wa_set_values LIKE LINE OF t_set_values.

ranges:zhkont for ska1-saknr occurs 1.


CALL FUNCTION 'G_SET_GET_ALL_VALUES'
  EXPORTING
    client        =  sy-mandt
    setnr         = 'ZHKONT01'
    table         = 'SKA1'
    class         = '0000'
    fieldname     = 'SAKNR'
  TABLES
    set_values    = t_set_values
  EXCEPTIONS
    set_not_found = 1
    OTHERS        = 2.


zhkont-sign = 'I'.
zhkont-option = 'BT'.


LOOP AT t_set_values INTO wa_set_values.
           zhkont-low = wa_set_values-FROM.
           zhkont-high = wa_set_values-to.
           append zhkont.
ENDLOOP.

 

2、函数'G_SET_FETCH'

CONSTANTS: c_cls_0106 TYPE rgsbs-class VALUE '0106'.

DATA: l_wa_set_lines_basic TYPE rgsbv,
      l_wa_hdr             TYPE rgsbs,
      l_i_for_lin          TYPE STANDARD TABLE OF rgsbf,
      l_i_set_lines_basic  TYPE STANDARD TABLE OF rgsbv,
      l_i_set_lines_data   TYPE STANDARD TABLE OF rgsb3,
      l_i_set_lines_multi  TYPE STANDARD TABLE OF rgsb2,
      l_i_set_lines_single TYPE STANDARD TABLE OF rgsb1.

DATA: l_v_setnr TYPE char50.

PARAMETERS: p_PCGRP type PCGRP,      " Profit Centre Group
            p_kokrs type kokrs.      " Controlling Area

CONCATENATE p_kokrs p_pcgrp INTO l_v_setnr.

*-- Get the Set description
CALL FUNCTION 'G_SET_FETCH'
EXPORTING
       class = c_cls_0106
       setnr = 'ZKOSTL'
IMPORTING
       set_header = l_wa_hdr
TABLES
       formula_lines    = l_i_for_lin
       set_lines_basic  = l_i_set_lines_basic
       set_lines_data   = l_i_set_lines_data
       set_lines_multi  = l_i_set_lines_multi
       set_lines_single = l_i_set_lines_single
EXCEPTIONS
       no_authority = 1
       set_is_broken = 2
       set_not_found = 3
       OTHERS = 4.

以下是一个不使用面向对象(CLASS)的ABAP程序,用于创建采购订单并通过远程函数调用(RFC)提交事务。程序包括采购订单创建、数据校验、RFC调用及错误处理功能。 --- ### **程序代码** ```ABAP REPORT zmm_create_po_via_rfc NO STANDARD PAGE HEADING. * 定义采购订单数据结构 TYPES: BEGIN OF ty_po_item, ebeln TYPE ebeln, " 采购订单号(输出) ebelp TYPE ebelp, " 行项目号 matnr TYPE matnr, " 物料编号 werks TYPE werks_d, " 工厂 lgort TYPE lgort_d, " 库存地点 menge TYPE menge_d, " 数量 meins TYPE meins, " 单位 netpr TYPE netpr, " 净价 waers TYPE waers, " 货币 afnam TYPE afnam, " 需求部门 END OF ty_po_item. * 定义内表和工作区 DATA: gt_po_items TYPE TABLE OF ty_po_item, gs_po_item LIKE LINE OF gt_po_items, gt_return TYPE TABLE OF bapiret2, gs_return LIKE LINE OF gt_return. * 定义RFC连接参数 DATA: lv_dest TYPE rfcdest VALUE 'YOUR_RFC_DESTINATION', " RFC目标系统 lv_func TYPE funcname VALUE 'BAPI_PO_CREATE1', " RFC函数名 lv_po_number TYPE ebeln. " 生成的采购订单号 * 定义选择屏幕 SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. PARAMETERS: p_test TYPE flag DEFAULT 'X' AS CHECKBOX. " 测试模式(不实际提交) SELECTION-SCREEN END OF BLOCK b1. * 初始化事件 INITIALIZATION. TEXT-001 = '采购订单创建条件'. * 主逻辑 START-OF-SELECTION. PERFORM prepare_po_data. PERFORM validate_data. PERFORM create_po_via_rfc. PERFORM display_result. *&---------------------------------------------------------------------* *& Form PREPARE_PO_DATA *&---------------------------------------------------------------------* FORM prepare_po_data. " 示例数据(实际可从文件或屏幕输入获取) gs_po_item-ebelp = '00010'. gs_po_item-matnr = '100001'. gs_po_item-werks = '1000'. gs_po_item-lgort = '0001'. gs_po_item-menge = 10. gs_po_item-meins = 'EA'. gs_po_item-netpr = 100. gs_po_item-waers = 'CNY'. gs_po_item-afnam = 'IT'. APPEND gs_po_item TO gt_po_items. CLEAR gs_po_item. " 可添加更多行项目... ENDFORM. " PREPARE_PO_DATA *&---------------------------------------------------------------------* *& Form VALIDATE_DATA *&---------------------------------------------------------------------* FORM validate_data. LOOP AT gt_po_items INTO gs_po_item. " 检查物料是否存在 SELECT SINGLE @abap_true FROM mara WHERE matnr = @gs_po_item-matnr INTO @DATA(lv_exists). IF lv_exists IS INITIAL. gs_return-type = 'E'. gs_return-message = |物料 { gs_po_item-matnr } 不存在|. APPEND gs_return TO gt_return. CLEAR gs_return. ENDIF. " 检查工厂和库存地点 SELECT SINGLE @abap_true FROM t001w WHERE werks = @gs_po_item-werks INTO @lv_exists. IF lv_exists IS INITIAL. gs_return-type = 'E'. gs_return-message = |工厂 { gs_po_item-werks } 不存在|. APPEND gs_return TO gt_return. CLEAR gs_return. ENDIF. SELECT SINGLE @abap_true FROM t001l WHERE werks = @gs_po_item-werks AND lgort = @gs_po_item-lgort INTO @lv_exists. IF lv_exists IS INITIAL. gs_return-type = 'E'. gs_return-message = |库存地点 { gs_po_item-lgort } 不存在|. APPEND gs_return TO gt_return. CLEAR gs_return. ENDIF. ENDLOOP. " 如果有错误,显示并终止 IF gt_return IS NOT INITIAL. PERFORM display_messages. MESSAGE '数据校验失败,请检查错误日志' TYPE 'E'. ENDIF. ENDFORM. " VALIDATE_DATA *&---------------------------------------------------------------------* *& Form CREATE_PO_VIA_RFC *&---------------------------------------------------------------------* FORM create_po_via_rfc. " 定义BAPI输入输出结构 DATA: ls_po_header TYPE bapimepoheader, ls_po_headerx TYPE bapimepoheaderx, lt_po_items TYPE TABLE OF bapimepoitem, lt_po_itemsx TYPE TABLE OF bapimepoitemx, lt_return TYPE TABLE OF bapiret2. " 填充采购订单头信息 ls_po_header-po_type = 'NB'. " 标准采购订单 ls_po_header-vendor = '100001'. " 供应商编码 ls_po_header-company_code = '1000'. ls_po_header-purch_org = '1000'. ls_po_header-pur_group = '001'. ls_po_headerx-po_type = 'X'. ls_po_headerx-vendor = 'X'. ls_po_headerx-company_code = 'X'. ls_po_headerx-purch_org = 'X'. ls_po_headerx-pur_group = 'X'. " 填充采购订单行项目 LOOP AT gt_po_items INTO gs_po_item. DATA(ls_item) = VALUE bapimepoitem( po_item = gs_po_item-ebelp material = gs_po_item-matnr plant = gs_po_item-werks store_loc = gs_po_item-lgort quantity = gs_po_item-menge po_unit = gs_po_item-meins net_price = gs_po_item-netpr currency = gs_po_item-waers acctasscat = 'K' " 成本中心 ). DATA(ls_itemx) = VALUE bapimepoitemx( po_item = gs_po_item-ebelp material = 'X' plant = 'X' store_loc = 'X' quantity = 'X' po_unit = 'X' net_price = 'X' currency = 'X' acctasscat = 'X' ). APPEND ls_item TO lt_po_items. APPEND ls_itemx TO lt_po_itemsx. ENDLOOP. " 测试模式检查 IF p_test = 'X'. MESSAGE '测试模式:采购订单未实际提交' TYPE 'S'. RETURN. ENDIF. " 调用RFC创建采购订单 CALL FUNCTION lv_func DESTINATION lv_dest EXPORTING poheader = ls_po_header poheaderx = ls_po_headerx IMPORTING purchaseorder = lv_po_number TABLES poitems = lt_po_items poitemsx = lt_po_itemsx return = lt_return. " 处理返回结果 IF lt_return IS NOT INITIAL. LOOP AT lt_return INTO gs_return WHERE type = 'E' OR type = 'A'. APPEND gs_return TO gt_return. ENDLOOP. IF gt_return IS NOT INITIAL. PERFORM display_messages. MESSAGE '采购订单创建失败' TYPE 'E'. ENDIF. ENDIF. " 成功处理 IF lv_po_number IS NOT INITIAL. MESSAGE |采购订单 { lv_po_number } 创建成功| TYPE 'S'. ENDIF. ENDFORM. " CREATE_PO_VIA_RFC *&---------------------------------------------------------------------* *& Form DISPLAY_MESSAGES *&---------------------------------------------------------------------* FORM display_messages. LOOP AT gt_return INTO gs_return. WRITE: / gs_return-type, gs_return-message. ENDLOOP. ENDFORM. " DISPLAY_MESSAGES *&---------------------------------------------------------------------* *& Form DISPLAY_RESULT *&---------------------------------------------------------------------* FORM display_result. IF gt_return IS INITIAL AND lv_po_number IS NOT INITIAL. MESSAGE |采购订单 { lv_po_number } 已成功创建| TYPE 'S'. ENDIF. ENDFORM. " DISPLAY_RESULT ``` --- ### **功能说明** 1. **数据准备**: - 定义采购订单头(`BAPIMEPOHEADER`)和行项目(`BAPIMEPOITEM`)结构。 - 支持多行项目输入。 2. **数据校验**: - 检查物料、工厂、库存地点是否存在。 - 支持自定义校验规则(如供应商主数据校验)。 3. **RFC调用**: - 使用`CALL FUNCTION ... DESTINATION`调用远程函数(如`BAPI_PO_CREATE1`)。 - 支持测试模式(不实际提交)。 4. **错误处理**: - 收BAPI返回的错误消息并显示。 --- ### **关键点** 1. **RFC目标系统**: - 需在SM59中配置RFC连接(`lv_dest`)。 2. **BAPI参数**: - `POHEADER`:采购订单头信息。 - `POITEMS`:采购订单行项目列表。 - `POHEADERX`/`POITEMSX`:标识字段是否修改。 3. **测试模式**: - 通过`P_TEST`参数控制是否实际提交。 --- ### **扩展建议** 1. **支持更多字段**: - 扩展头信息(如交货日期、付款条款)。 - 添加行项目条件(如折扣、税率)。 2. **日志记录**: - 将创建结果记录到自定义表(如`ZMM_PO_CREATE_LOG`)。 3. **文件导入**: - 替换`PREPARE_PO_DATA`为文件上传逻辑(如CSV解析)。 4. **事务提交**: - 在RFC调用后添加`BAPI_TRANSACTION_COMMIT`。 --- ### **常见问题** 1. **RFC调用失败?** - 检查SM59中的RFC连接配置。 - 确保目标系统已授权当前用户。 2. **采购订单未创建?** - 检查BAPI返回消息(`lt_return`)。 - 确保必填字段(如供应商、采购组织)已填充。 3. **如何支持批量创建?** - 在循环中调用RFC,或使用`BAPI_PO_CREATE`的多订单接口。 4. **如何获取采购订单号?** - BAPI输出参数`PURCHASEORDER`返回生成的订单号。 5. **如何处理长文本(如备注)?** - 使用`BAPI_PO_ADD_COMMENT`添加长文本。 --- ### **总结** - **核心逻辑**:数据准备 → RFC调用 → 结果处理。 - **用户体验**:测试模式 + 详细错误日志。 - **可扩展性**:易于添加新字段或业务规则。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值