ABAP <FS_DATA>

本文深入探讨了前端开发领域的关键技术,包括HTML、CSS、JavaScript等核心语言,以及Vue、React、Angular等主流框架,旨在为开发者提供全面的技术指南。
<FS_DATA>

转载于:https://www.cnblogs.com/edisonchen/archive/2011/04/30/2033290.html

*&---------------------------------------------------------------------* *& Report ZPP1000F0024 *&---------------------------------------------------------------------* *& *&---------------------------------------------------------------------* REPORT zpp1000f0024. *--------------------------------------------------------------------*定义 TABLES: zppt004,sscrfields,proj. TYPES:BEGIN OF ts_data, werks TYPE zppt004-werks, "工厂 psphi TYPE zppt004-psphi, "项目号 matnr TYPE zppt004-matnr, "物料编号 rsnum TYPE zppt004-rsnum, "预留/相关需求的编号 rspos TYPE zppt004-rspos, "预留 / 相关需求的项目编号 zclxh TYPE zppt004-zclxh, "处理序号 zcfhh TYPE zppt004-zcfhh, "拆分行号 post1 TYPE proj-post1, "项目描述 astnr TYPE proj-astnr, "事业部代码 astna TYPE proj-astna, "事业部名称 zxqrq TYPE zppt004-zxqrq, "需求日期 wlylje TYPE bwert, "未领预留金额 fpkcje TYPE bwert, "分配库存金额 fpjskcje TYPE bwert, "分配寄售库存金额 fpfjskcje TYPE bwert, "分配寄售库存金额 zzmng TYPE zppt004-zzmng, "待发数量 peris TYPE p DECIMALS 4, "价格 zgysl TYPE zppt004-zgysl, "供应分配数量 zgylx TYPE zppt004-zgylx, "供应类型 zgydh TYPE zppt004-zgydh, "供应单号 pspid TYPE proj-pspid, "项目定义-24 pspel TYPE zppt004-pspel, "wbs box TYPE c, END OF ts_data. DATA:gt_data TYPE STANDARD TABLE OF ts_data. DATA:gt_fcat TYPE lvc_t_fcat. DATA:gs_layo TYPE lvc_s_layo. TYPES:BEGIN OF ts_coll, werks TYPE zppt004-werks, "工厂 * psphi TYPE zppt004-psphi, "项目号 pspid TYPE proj-pspid, "项目定义-24 post1 TYPE proj-post1, "项目描述 astnr TYPE proj-astnr, "事业部代码 astna TYPE proj-astna, "事业部名称 zxqrq TYPE zppt004-zxqrq, "需求日期 wlylje TYPE bwert, "未领预留金额 fpkcje TYPE bwert, "分配库存金额 fpjskcje TYPE bwert, "分配寄售库存金额 fpfjskcje TYPE bwert, "分配非寄售库存金额 END OF ts_coll. DATA:gt_coll TYPE STANDARD TABLE OF ts_coll, gs_coll TYPE ts_coll, gt_coll_01 TYPE STANDARD TABLE OF ts_coll, gs_coll_01 TYPE ts_coll. DATA:lv_line_psphi TYPE sy-tabix VALUE '1'. *--------------------------------------------------------------------*seletion SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. SELECT-OPTIONS: *s_psphi FOR zppt004-psphi,"项目号 s_pspid FOR proj-pspid, "项目号 s_astnr FOR proj-astnr, "事业部代码 s_werks FOR proj-werks OBLIGATORY. "工厂 SELECTION-SCREEN END OF BLOCK b1. *AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_psphi-low. * PERFORM frm_help_psphi USING s_psphi-low. * *AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_psphi-high. * PERFORM frm_help_psphi USING s_psphi-high. START-OF-SELECTION. *--------------------------------------------------------------------*获取数据处理 SELECT a~werks psphi zxqrq zzmng zgysl matnr zgylx pspel rsnum rspos b~post1 astnr astna INTO CORRESPONDING FIELDS OF TABLE gt_data FROM zppt004 AS a INNER JOIN proj AS b ON pspnr = a~psphi WHERE b~pspid IN s_pspid * psphi IN s_psphi AND zgydh = '' AND astnr IN s_astnr AND a~werks IN s_werks AND a~psphi NE '' %_HINTS ORACLE 'INDEX(ZPPT004"Z1")'. IF gt_data[] IS INITIAL. MESSAGE '没有符合条件的数据' TYPE 'S' DISPLAY LIKE 'E'. LEAVE LIST-PROCESSING. ENDIF. SORT gt_data BY werks psphi. DATA(gt_data_02) = gt_data. DELETE ADJACENT DUPLICATES FROM gt_data_02 COMPARING psphi. SELECT bwkey AS werks,matnr,vprsv,stprs,verpr,peinh INTO TABLE @DATA(gt_peris) FROM mbew FOR ALL ENTRIES IN @gt_data WHERE bwkey = @gt_data-werks AND matnr = @gt_data-matnr. SORT gt_peris BY werks matnr. *--项目库存价格 SELECT bwkey AS werks,matnr,vprsv,stprs,verpr,peinh,pspnr AS pspel INTO TABLE @DATA(gt_peris_qbew) FROM qbew FOR ALL ENTRIES IN @gt_data WHERE bwkey = @gt_data-werks AND matnr = @gt_data-matnr. * AND pspnr = @gt_data-pspel. SORT gt_peris_qbew BY werks matnr pspel. LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<fs_data>). CALL FUNCTION 'CONVERSION_EXIT_KONPD_OUTPUT' EXPORTING input = <fs_data>-psphi IMPORTING output = <fs_data>-pspid " PSELT = . AT END OF psphi. cl_progress_indicator=>progress_indicate( i_text = |正在处理 { lv_line_psphi }/{ lines( gt_data_02 ) }:{ <fs_data>-pspid }| i_output_immediately = abap_true i_processed = lv_line_psphi i_total = lines( gt_data_02 ) ). lv_line_psphi = lv_line_psphi + 1. ENDAT. READ TABLE gt_peris INTO DATA(ls_peris) WITH KEY werks = <fs_data>-werks matnr = <fs_data>-matnr BINARY SEARCH. IF sy-subrc = 0. CASE ls_peris-vprsv. WHEN 'S'. <fs_data>-peris = ls_peris-stprs / ls_peris-peinh. WHEN 'V'. <fs_data>-peris = ls_peris-verpr / ls_peris-peinh. WHEN OTHERS. ENDCASE. ENDIF. "库存价格获取失败,获取项目库存价格 IF <fs_data>-peris IS INITIAL . READ TABLE gt_peris_qbew INTO DATA(ls_peris_qbew) WITH KEY werks = <fs_data>-werks matnr = <fs_data>-matnr pspel = <fs_data>-pspel BINARY SEARCH. IF sy-subrc = 0. CASE ls_peris_qbew-vprsv. WHEN 'S'. <fs_data>-peris = ls_peris_qbew-stprs / ls_peris_qbew-peinh. WHEN 'V'. <fs_data>-peris = ls_peris_qbew-verpr / ls_peris_qbew-peinh. WHEN OTHERS. ENDCASE. * Add by nabap02 Start{ * 如果有Q移动平均价的取Q移动平均价,没有Q移动平均价取物料移动平均价,如果物料移动平均价也没有的去标准价格 * 此处增加,项目库存价格 wbs 为项目首层时按物料取 ELSE. READ TABLE gt_peris_qbew INTO ls_peris_qbew WITH KEY werks = <fs_data>-werks matnr = <fs_data>-matnr. IF sy-subrc = 0. CASE ls_peris_qbew-vprsv. WHEN 'S'. <fs_data>-peris = ls_peris_qbew-stprs / ls_peris_qbew-peinh. WHEN 'V'. <fs_data>-peris = ls_peris_qbew-verpr / ls_peris_qbew-peinh. WHEN OTHERS. ENDCASE. ENDIF. ENDIF. * }end ENDIF. "未领预留金额 * <fs_data>-wlylje = <fs_data>-zzmng * <fs_data>-peris. "分配寄售库存金额 IF <fs_data>-zgylx = '非限制寄售' . <fs_data>-fpjskcje = <fs_data>-zgysl * <fs_data>-peris. ENDIF. * 分配库存金额 <fs_data>-fpkcje = <fs_data>-zgysl * <fs_data>-peris . "分配非寄售库存金额 <fs_data>-fpfjskcje = <fs_data>-fpkcje - <fs_data>-fpjskcje. gs_coll = CORRESPONDING #( <fs_data> ). COLLECT gs_coll INTO gt_coll. ENDLOOP. SORT gt_data BY rsnum rspos . DELETE ADJACENT DUPLICATES FROM gt_data COMPARING rsnum rspos . LOOP AT gt_data INTO DATA(gs_data). gs_coll_01 = CORRESPONDING #( gs_data ). gs_coll_01-wlylje = gs_data-zzmng * gs_data-peris. COLLECT gs_coll_01 INTO gt_coll_01. ENDLOOP. SORT gt_coll_01 BY werks pspid astnr zxqrq. LOOP AT gt_coll ASSIGNING FIELD-SYMBOL(<f_coll>). READ TABLE gt_coll_01 INTO gs_coll_01 WITH KEY werks = <f_coll>-werks pspid = <f_coll>-pspid astnr = <f_coll>-astnr zxqrq = <f_coll>-zxqrq BINARY SEARCH. IF sy-subrc = 0. <f_coll>-wlylje = gs_coll_01-wlylje. ENDIF. ENDLOOP. *--------------------------------------------------------------------*alv "fcat gt_fcat = VALUE #( ( fieldname = 'WERKS' ref_field = '' ref_table = '' coltext = '工厂' ) ( fieldname = 'PSPID' ref_field = '' ref_table = '' coltext = '项目号' ) ( fieldname = 'POST1' ref_field = '' ref_table = '' coltext = '项目描述' ) ( fieldname = 'ASTNR' ref_field = '' ref_table = '' coltext = '事业部代码' ) ( fieldname = 'ASTNA' ref_field = '' ref_table = '' coltext = '事业部名称' ) ( fieldname = 'ZXQRQ' ref_field = '' ref_table = '' coltext = '需求日期' ) ( fieldname = 'WLYLJE' ref_field = '' ref_table = '' coltext = '未领预留金额' ) ( fieldname = 'FPKCJE' ref_field = '' ref_table = '' coltext = '分配库存金额' ) ( fieldname = 'FPJSKCJE' ref_field = '' ref_table = '' coltext = '分配寄售库存金额') ( fieldname = 'FPFJSKCJE' ref_field = '' ref_table = '' coltext = '分配非寄售库存金额') ). "layo gs_layo = VALUE #( zebra = abap_true sel_mode = 'A' cwidth_opt = 'X' ). "alv CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC' EXPORTING i_callback_program = sy-repid it_fieldcat_lvc = gt_fcat i_default = abap_true is_layout_lvc = gs_layo i_save = 'A' TABLES t_outtab = gt_coll[] EXCEPTIONS program_error = 1 OTHERS = 2. *&---------------------------------------------------------------------* *& Form FRM_HELP_PSPHI *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_help_psphi USING u_psphi . DATA:lit_ddshretval TYPE TABLE OF ddshretval, lwa_ddshretval TYPE ddshretval. DATA:BEGIN OF lit_psphi OCCURS 0, psphi TYPE zppt004-psphi, post1 TYPE proj-post1, END OF lit_psphi. SELECT psphi post1 FROM zppt004 INTO TABLE lit_psphi ORDER BY psphi. DELETE ADJACENT DUPLICATES FROM lit_psphi. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'PSPHI' dynpprog = sy-cprog dynpnr = sy-dynnr dynprofield = 'S_PSPHI' window_title = '项目号' value_org = 'S' TABLES value_tab = lit_psphi return_tab = lit_ddshretval EXCEPTIONS parameter_error = 1 no_values_found = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. ENDFORM. 帮我详细解读这段代码
08-28
以下代码怎么定义的查询,可以怎么优化查询速度: *&---------------------------------------------------------------------* *& 包含 ZMM_REP_001_SCREEN_1001 *&---------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Module STATUS_1001 OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE status_1001 OUTPUT. SET PF-STATUS '1001'. * SET TITLEBAR 'xxx'. IF tree IS INITIAL. PERFORM create_tree. ENDIF. IF grid IS INITIAL. CREATE OBJECT container2 EXPORTING container_name = 'GIRD'. CREATE OBJECT grid EXPORTING i_parent = container2. PERFORM write_data. CALL METHOD grid->set_table_for_first_display EXPORTING is_layout = layout CHANGING it_fieldcatalog = fieldcatalog it_outtab = itab_out. ELSE. CALL METHOD grid->refresh_table_display. IF sy-subrc <> 0. ENDIF. ENDIF. ENDMODULE. *&---------------------------------------------------------------------* *& Module USER_COMMAND_1001 INPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE user_command_1001 INPUT. CASE sy-ucomm. WHEN 'SELECT'. PERFORM get_data USING node-node_key node-relatkey. WHEN 'BACK'. SET SCREEN 0. WHEN 'EXIT' OR 'CANCEL'. LEAVE PROGRAM. WHEN OTHERS. ENDCASE. ENDMODULE. *&---------------------------------------------------------------------* *& Form CREATE_TREE *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM create_tree . CLEAR:event. REFRESH:events. event-eventid = 21 . event-appl_event = 'X'. APPEND event TO events. CLEAR:node. REFRESH:node_table. node-node_key = 'X'. node-isfolder = 'X'. node-text = TEXT-001. APPEND node TO node_table . LOOP AT ztree. CLEAR:node. node-node_key = 'X' && ztree-num1. node-relatkey = 'X'. node-isfolder = 'X'. node-text = ztree-text1. APPEND node TO node_table . CLEAR:node. node-node_key = 'X' && ztree-num1 && ztree-num2. node-relatkey = 'X' && ztree-num1. node-isfolder = 'X'. node-text = ztree-text2. APPEND node TO node_table . CLEAR:node. node-node_key = 'X' && ztree-num1 && ztree-num2 && ztree-num3. node-relatkey = 'X' && ztree-num1 && ztree-num2. node-isfolder = 'X'. node-text = ztree-text3. node-n_image = '@5B@'. APPEND node TO node_table . ENDLOOP. SORT node_table BY node_key relatkey. DELETE ADJACENT DUPLICATES FROM node_table COMPARING ALL FIELDS. CREATE OBJECT container EXPORTING container_name = 'TREE'. CREATE OBJECT tree EXPORTING parent = container node_selection_mode = cl_gui_simple_tree=>node_sel_mode_single. CALL METHOD tree->add_nodes EXPORTING table_structure_name = 'MTREESNODE' node_table = node_table EXCEPTIONS error_in_node_table = 1 failed = 2 dp_error = 3 table_structure_name_not_found = 4 OTHERS = 5. CALL METHOD tree->set_registered_events EXPORTING events = events EXCEPTIONS cntl_error = 1 cntl_system_error = 2 illegal_event_combination = 3 OTHERS = 4. CREATE OBJECT application. SET HANDLER application->single_click FOR tree. CLEAR:node."不清空会导致首次查找有问题 ENDFORM. *&---------------------------------------------------------------------* *& Form WRITE_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM write_data . CLEAR:fieldcatalog. REFRESH:fieldcatalog. layout-no_toolbar = 'X'. * layout-cwidth_opt = 'X'. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'MATNR'. wa_fieldcatalog-scrtext_l = TEXT-002. wa_fieldcatalog-outputlen = 40. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'MAKTX'. wa_fieldcatalog-scrtext_l = TEXT-003. wa_fieldcatalog-outputlen = 20. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'MAKTX_L'. wa_fieldcatalog-scrtext_l = TEXT-004. wa_fieldcatalog-outputlen = 40. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'WERKS'. wa_fieldcatalog-scrtext_l = TEXT-005. wa_fieldcatalog-outputlen = 4. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'LGORT'. wa_fieldcatalog-scrtext_l = TEXT-006. wa_fieldcatalog-outputlen = 5. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'BISMT'. wa_fieldcatalog-scrtext_l = TEXT-007. wa_fieldcatalog-outputlen = 10. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'LABST'. wa_fieldcatalog-scrtext_l = TEXT-008. wa_fieldcatalog-outputlen = 15. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'BDMNG'. wa_fieldcatalog-scrtext_l = TEXT-009. wa_fieldcatalog-outputlen = 15. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'LABST2'. wa_fieldcatalog-scrtext_l = TEXT-010. wa_fieldcatalog-outputlen = 15. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'MENGE'. wa_fieldcatalog-scrtext_l = TEXT-011. wa_fieldcatalog-outputlen = 15. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'EISBE'. wa_fieldcatalog-scrtext_l = TEXT-012. wa_fieldcatalog-outputlen = 15. APPEND wa_fieldcatalog TO fieldcatalog. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'MEINS'. wa_fieldcatalog-scrtext_l = TEXT-013. wa_fieldcatalog-outputlen = 4. APPEND wa_fieldcatalog TO fieldcatalog. *-----ECCUpgradeS4--------SMY--------20250210-------START " 根据工厂判断是否添加 budat_mkpf 字段 IF p_werks = '7010' OR p_werks = '7011'. CLEAR wa_fieldcatalog. wa_fieldcatalog-fieldname = 'BUDAT_MKPF'. wa_fieldcatalog-scrtext_l = TEXT-014. wa_fieldcatalog-outputlen = 10. APPEND wa_fieldcatalog TO fieldcatalog. ENDIF. *-----ECCUpgradeS4--------SMY--------20250210-------END ENDFORM. *&---------------------------------------------------------------------* *& Form GET_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_NODE_NODE_KEY text * -->P_NODE_RELATKEY text *----------------------------------------------------------------------* FORM get_data USING p_node_key p_relatkey. REFRESH: itab, itab_out. *zhouyan 2025/8/6 " 优化主查询 - 只选择必要字段 SELECT mard~matnr, mard~werks, mard~lgort, mard~labst, mara~matkl, mara~meins, marc~eisbe INTO CORRESPONDING FIELDS OF TABLE @itab FROM mard INNER JOIN mara ON mara~matnr = mard~matnr INNER JOIN marc ON marc~matnr = mard~matnr AND marc~werks = mard~werks WHERE mard~werks = @p_werks AND marc~lvorm = '' AND mara~matkl <> '' AND mara~mtart = 'ERSA' AND mara~lvorm = '' AND mara~mstae = '' AND mard~lvorm = ''. *zhouyan 2025/8/6 LOOP AT itab. IF p_relatkey = ''. ELSEIF p_relatkey = 'X'. IF itab-matkl(1) <> p_node_key+1(1). DELETE itab. ENDIF. ELSE. IF strlen( p_node_key ) = 3. IF itab-matkl(2) <> p_node_key+1(2). DELETE itab. ENDIF. ELSEIF strlen( p_node_key ) = 4. IF itab-matkl(3) <> p_node_key+1(3). DELETE itab. ENDIF. ELSE. IF itab-matkl <> p_node_key+1. DELETE itab. ENDIF. ENDIF. ENDIF. ENDLOOP. " 首先检查itab是否为空 CHECK itab[] IS NOT INITIAL. " 收集所有需要查询的matnr(用于MAKT和MSEG查询) DATA: lt_matnr_range TYPE RANGE OF matnr. lt_matnr_range = VALUE #( FOR wa IN itab ( sign = 'I' option = 'EQ' low = wa-matnr ) ). " 收集所有需要查询的matnr+werks+lgort组合(用于ZMM_BISMT查询) DATA: lt_bismt_keys TYPE STANDARD TABLE OF ty_bismt_key. LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs_itab>). APPEND VALUE #( matnr = <fs_itab>-matnr werks = <fs_itab>-werks lgort = <fs_itab>-lgort ) TO lt_bismt_keys. ENDLOOP. SORT lt_bismt_keys BY matnr werks lgort. DELETE ADJACENT DUPLICATES FROM lt_bismt_keys. " 将RANGE表转换为标准表 DATA: lt_matnr_list TYPE STANDARD TABLE OF matnr. lt_matnr_list = VALUE #( FOR ls_range IN lt_matnr_range ( ls_range-low ) ). " 使用FOR ALL ENTRIES查询 SELECT matnr, maktx FROM makt FOR ALL ENTRIES IN @lt_matnr_list WHERE matnr = @lt_matnr_list-table_line AND spras = @sy-langu INTO TABLE @DATA(lt_makt). " 批量查询ZMM_BISMT数据 IF lt_bismt_keys IS NOT INITIAL. SELECT matnr, werks, lgort, bismt FROM zmm_bismt FOR ALL ENTRIES IN @lt_bismt_keys WHERE matnr = @lt_bismt_keys-matnr AND werks = @lt_bismt_keys-werks AND lgort = @lt_bismt_keys-lgort INTO TABLE @DATA(lt_bismt). ENDIF. " 批量查询MSEG数据(最大过账日期) IF ( p_werks = '7011' OR p_werks = '7010' ) AND lt_matnr_range IS NOT INITIAL. SELECT matnr, MAX( budat_mkpf ) AS max_budat FROM mseg WHERE matnr IN @lt_matnr_range AND ( ( werks = '7011' AND bwart IN ('201','311') ) OR ( werks = '7010' AND bwart = '201' ) ) GROUP BY matnr INTO TABLE @DATA(lt_max_budat). ENDIF. " 更新itab数据 LOOP AT itab ASSIGNING <fs_itab>. " 更新MAKTX(物料描述) READ TABLE lt_makt ASSIGNING FIELD-SYMBOL(<fs_makt>) WITH KEY matnr = <fs_itab>-matnr. IF sy-subrc = 0. <fs_itab>-maktx = <fs_makt>-maktx. ENDIF. " 更新BISMT READ TABLE lt_bismt ASSIGNING FIELD-SYMBOL(<fs_bismt>) WITH KEY matnr = <fs_itab>-matnr werks = <fs_itab>-werks lgort = <fs_itab>-lgort. IF sy-subrc = 0. <fs_itab>-bismt = <fs_bismt>-bismt. ENDIF. " 更新BUDAT_MKPF(最大过账日期) IF p_werks = '7011' OR p_werks = '7010'. READ TABLE lt_max_budat ASSIGNING FIELD-SYMBOL(<fs_budat>) WITH KEY matnr = <fs_itab>-matnr. IF sy-subrc = 0. <fs_itab>-budat_mkpf = <fs_budat>-max_budat. ENDIF. ENDIF. ENDLOOP. LOOP AT itab. IF matnr <> ''. IF itab-matnr <> matnr. DELETE itab. CONTINUE. ENDIF. ENDIF. IF lgort <> ''. IF itab-lgort <> lgort. DELETE itab. CONTINUE. ENDIF. ENDIF. IF bismt <> ''. IF itab-bismt CS bismt. ELSE. DELETE itab. CONTINUE. ENDIF. ENDIF. IF itab-maktx CS maktx OR itab-maktx_l CS maktx. ELSE. DELETE itab. CONTINUE. ENDIF. IF eisbe_r1 = 'X'. IF itab-labst >= itab-eisbe. DELETE itab. CONTINUE. ENDIF. ENDIF. ENDLOOP. * 收集所有需要查询的matnr+werks+lgort组合 DATA: lt_resb_keys TYPE STANDARD TABLE OF ty_resb_key. LOOP AT itab ASSIGNING <fs_itab>. APPEND VALUE #( matnr = <fs_itab>-matnr werks = <fs_itab>-werks lgort = <fs_itab>-lgort ) TO lt_resb_keys. ENDLOOP. * 去重 SORT lt_resb_keys BY matnr werks lgort. DELETE ADJACENT DUPLICATES FROM lt_resb_keys. * 批量查询RESB数据(使用自定义结构) DATA: lt_resb_data TYPE STANDARD TABLE OF ty_resb_result. IF lt_resb_keys IS NOT INITIAL. SELECT matnr, werks, lgort, bdmng, enmng FROM resb FOR ALL ENTRIES IN @lt_resb_keys WHERE matnr = @lt_resb_keys-matnr AND werks = @lt_resb_keys-werks AND lgort = @lt_resb_keys-lgort AND xloek = '' AND kzear = '' AND shkzg = 'H' INTO CORRESPONDING FIELDS OF TABLE @lt_resb_data. ENDIF. * 更新itab数据 LOOP AT itab ASSIGNING <fs_itab>. CLEAR <fs_itab>-bdmng. * 查找匹配的RESB记录并累加 LOOP AT lt_resb_data ASSIGNING FIELD-SYMBOL(<fs_resb>) WHERE matnr = <fs_itab>-matnr AND werks = <fs_itab>-werks AND lgort = <fs_itab>-lgort. <fs_itab>-bdmng = <fs_itab>-bdmng + <fs_resb>-bdmng - <fs_resb>-enmng. ENDLOOP. ENDLOOP. * 收集查询条件(去重) DATA lt_po_keys TYPE ty_po_key_tab. lt_po_keys = VALUE #( FOR <wa> IN itab ( matnr = <wa>-matnr werks = <wa>-werks lgort = <wa>-lgort ) ). SORT lt_po_keys BY matnr werks lgort. DELETE ADJACENT DUPLICATES FROM lt_po_keys. * 执行批量查询 DATA lt_po_data TYPE ty_po_result_tab. IF lt_po_keys IS NOT INITIAL. " 查询EKPO数据 DATA lt_ekpo_data TYPE ty_ekpo_temp_tab. SELECT matnr,werks,lgort,menge,ebeln FROM ekpo FOR ALL ENTRIES IN @lt_po_keys WHERE matnr = @lt_po_keys-matnr AND werks = @lt_po_keys-werks AND lgort = @lt_po_keys-lgort AND elikz = '' AND loekz = '' INTO TABLE @lt_ekpo_data. " 查询已审批的采购订单 IF lt_ekpo_data IS NOT INITIAL. DATA lt_approved_po TYPE ty_ebeln_tab. SELECT ebeln FROM ekko FOR ALL ENTRIES IN @lt_ekpo_data WHERE ebeln = @lt_ekpo_data-ebeln AND frgke = '5' INTO TABLE @lt_approved_po. " 在应用层汇总数据 SORT lt_approved_po BY ebeln. LOOP AT lt_ekpo_data ASSIGNING FIELD-SYMBOL(<fs_ekpo>). READ TABLE lt_approved_po TRANSPORTING NO FIELDS WITH KEY ebeln = <fs_ekpo>-ebeln BINARY SEARCH. IF sy-subrc = 0. COLLECT VALUE ty_po_result( matnr = <fs_ekpo>-matnr werks = <fs_ekpo>-werks lgort = <fs_ekpo>-lgort menge = <fs_ekpo>-menge ) INTO lt_po_data. ENDIF. ENDLOOP. ENDIF. ENDIF. * 更新主表数据 LOOP AT itab ASSIGNING <fs_itab>. READ TABLE lt_po_data ASSIGNING FIELD-SYMBOL(<fs_po>) WITH KEY matnr = <fs_itab>-matnr werks = <fs_itab>-werks lgort = <fs_itab>-lgort. IF sy-subrc = 0. <fs_itab>-menge = <fs_po>-menge. ELSE. CLEAR <fs_itab>-menge. ENDIF. " 计算可用库存2 <fs_itab>-labst2 = <fs_itab>-labst - <fs_itab>-bdmng. ENDLOOP. *zhouyan 2025/8/7 itab_out[] = itab[]. *zhouyan 2025/8/7 ENDFORM.
08-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值