公司动态
[SAP ABAP] ALV报表练习4
SO销售订单明细报表业务目的根据选择屏幕的筛选条件使用ALV报表显示销售订单详情(Sales Order、Material、现有Qty、已开立数量以及剩余数量等)信息效果展示我们在销售订单栏位输入需要查询的SO单号这里我们以SO单号0000004160为例填写完相关信息以后点击执行按钮效果如下所示其中对应SO单号的Material剩余数量 现有Qty - 已开立数量我们使用事务码TcodeVA03查看SO单号(0000004160)的信息如下所示从上面我们可以看出该SO订单对应物料401467并未开立DN单号完整代码如下所示主程序(zrs0507)*---------------------------------------------------------------------* * Report ZRS0507 * * * *---------------------------------------------------------------------* * * * * *---------------------------------------------------------------------* REPORT zrs0507. INCLUDE zrs0507_top. 數據定義 INCLUDE zrs0507_f01. 子例程 *----------------------------------------------------------------------* * DESC: INITIALIZATION 事件 *----------------------------------------------------------------------* INITIALIZATION. *----------------------------------------------------------------------* * DESC: AT SELECTION-SCREEN OUTPUT 事件 *----------------------------------------------------------------------* AT SELECTION-SCREEN OUTPUT. *----------------------------------------------------------------------* * DESC: AT SELECTION-SCREEN 事件 *----------------------------------------------------------------------* AT SELECTION-SCREEN. *----------------------------------------------------------------------* * DESC: START-OF-SELECTION 事件 *----------------------------------------------------------------------* START-OF-SELECTION. PERFORM frm_get_data. 獲取數據 檢查數据是否為空 IF gt_item IS INITIAL. MESSAGE 不存在滿足條件的數据請确認選擇條件 TYPE I. ENDIF. *---------------------------------------------------------------------* * END-OF-SELECTION 事件 *---------------------------------------------------------------------* END-OF-SELECTION. PERFORM frm_display_data. ALV呈現數據INCLUDE程序(zrs0507_top)*---------------------------------------------------------------------* * 包含 Z437_TEST_2025_TOP *---------------------------------------------------------------------* TABLES: vbak, vbap, lips. * 定義數據類型 TYPES: BEGIN OF ty_item, sel(1), 選擇標識 vbeln TYPE vbak-vbeln, SO單號 posnr TYPE vbap-posnr, 行項目 matnr TYPE vbap-matnr, 物料編碼 kwmeng TYPE vbap-kwmeng, 銷售訂單數量(SO現有數量) charg TYPE vbap-charg, SO等級 lfimg TYPE lips-lfimg, SO已開立數量 remain TYPE kwmeng, 結餘數量 vrkme TYPE vbap-vrkme, 銷售單位 END OF ty_item. TYPES: BEGIN OF ty_lips, vbeln TYPE lips-vbeln, 交貨單 posnr TYPE lips-posnr, 交貨單行項目 vgbel TYPE lips-vgbel, SO單號 vgpos TYPE lips-vgpos, SO單號行項目 lfimg TYPE lips-lfimg, SO已開立數量 vrkme TYPE lips-vrkme, 銷售單位 END OF ty_lips. DATA: gt_item TYPE STANDARD TABLE OF ty_item, 內表 gs_item TYPE ty_item. 結构体變量 * ALV參數定義 DATA: gs_layout TYPE lvc_s_layo, 用于定義ALV表單的相關格式、屬性 gs_fcat TYPE lvc_s_fcat, 字段目祿工作區 gt_fcat TYPE STANDARD TABLE OF lvc_s_fcat. 字段目錄內表 * 選擇屏幕(屏幕輸入) SELECT-OPTIONS: s_vbeln FOR vbak-vbeln OBLIGATORY. 銷售訂單(必輸)INCLUDE程序(zrs0507_f01)*---------------------------------------------------------------------* * 包含 Z437_TEST_2025_F01 *---------------------------------------------------------------------* *---------------------------------------------------------------------* * Form FRM_GET_DATA *---------------------------------------------------------------------* * 獲取數據 *----------------------------------------------------------------------* * -- p1 text * -- p2 text *----------------------------------------------------------------------* FORM frm_get_data . SELECT DISTINCT vbap~vbeln SO單號 vbap~posnr 行項目 vbap~matnr 物料編碼 vbap~kwmeng 銷售訂單數量(SO現有數量) vbap~charg SO等級 vbap~vrkme 銷售單位 FROM vbap LEFT JOIN vbep ON vbap~vbeln vbep~vbeln AND vbap~posnr vbep~posnr INTO CORRESPONDING FIELDS OF TABLE gt_item WHERE vbap~vbeln IN s_vbeln. IF sy-subrc 0. PERFORM frm_edit_data. 編輯處理內表數據 對so單號以及行項目進行升序排序 SORT gt_item BY vbeln ASCENDING posnr ASCENDING. ENDIF. ENDFORM. FRM_GET_DATA *---------------------------------------------------------------------* * Form FRM_DISPLAY_DATA *---------------------------------------------------------------------* * ALV數據呈現 *----------------------------------------------------------------------* * -- p1 text * -- p2 text *----------------------------------------------------------------------* FORM frm_display_data . PERFORM frm_alv_set_fields. 調用函數展示ALV數据 CALL FUNCTION REUSE_ALV_GRID_DISPLAY_LVC EXPORTING i_callback_program sy-repid it_fieldcat_lvc gt_fcat 設置ALV列屬性 is_layout_lvc gs_layout 設置ALV布局 TABLES t_outtab gt_item 內表數据 EXCEPTIONS program_error 1 OTHERS 2. ENDFORM. FRM_DISPLAY_DATA *---------------------------------------------------------------------* * Form frm_alv_set_fields *---------------------------------------------------------------------* * ALV設置字段 *----------------------------------------------------------------------* * -- p1 text * -- p2 text *----------------------------------------------------------------------* FORM frm_alv_set_fields . DATA: lv_index LIKE sy-index. CLEAR: gs_fcat, gt_fcat, gs_layout. * 設置行的屬性(ALV界面格式) gs_layout-box_fname SEL. 選擇標識 gs_layout-zebra X. 斑馬條紋顯示 gs_layout-cwidth_opt X. 优化列寬設置 * ALV字段處理宏 DEFINE catalog. lv_index lv_index 1. gs_fcat-col_pos lv_index. gs_fcat-fieldname 1. 設置要輸出的表格列的值在內表中定義的字段名(必須大寫) gs_fcat-fix_column 2. 固定列 gs_fcat-ref_table 3. gs_fcat-edit 4. gs_fcat-colddictxt L. gs_fcat-scrtext_l 5. 設置要輸出的表格列的列名即ALV報表顯示的列名 gs_fcat-ref_field 6. gs_fcat-outputlen 7. gs_fcat-emphasize 8. 列顏色 gs_fcat-hotspot 9. 熱點 APPEND gs_fcat TO gt_fcat. END-OF-DEFINITION. * 1 2 3 4 5 6 7 8 9 catalog: VBELN X Sales Order , SO單號 POSNR X Item , SO序號 MATNR X Material , 物料編碼(SO料號) KWMENG 現有Qty , 銷售訂單數量(SO現有數量) CHARG Batch , SO等級 LFIMG 已開立數量 , SO已開立數量 REMAIN 剩餘數量 , 剩餘數量 VRKME 單位 . 單位 ENDFORM. frm_alv_set_fields *---------------------------------------------------------------------* * Form frm_edit_data *---------------------------------------------------------------------* * 編輯數據 *----------------------------------------------------------------------* * -- p1 text * -- p2 text *----------------------------------------------------------------------* FORM frm_edit_data . DATA: lt_lips TYPE STANDARD TABLE OF ty_lips, ls_lips TYPE ty_lips. IF gt_item IS NOT INITIAL. 當gt_item內表不為空時執行以下邏輯處理 * 獲取交貨數據 SELECT DISTINCT vgbel SO單號 vgpos SO單號行項目 vbeln 交貨單 posnr 交貨單行項目 lfimg 實際交付數量 vrkme 單位 INTO CORRESPONDING FIELDS OF TABLE lt_lips FROM lips FOR ALL ENTRIES IN gt_item WHERE vgbel gt_item-vbeln AND vgpos gt_item-posnr. IF sy-subrc 0. ENDIF. * 處理數據 DATA: lt_temp_item LIKE gt_item. LOOP AT gt_item INTO gs_item. CLEAR: gs_item-lfimg, gs_item-remain. 計算已交貨數量 LOOP AT lt_lips INTO ls_lips WHERE vgbel gs_item-vbeln AND vgpos gs_item-posnr. gs_item-lfimg gs_item-lfimg ls_lips-lfimg. ENDLOOP. 計算剩餘數量 gs_item-remain gs_item-kwmeng - gs_item-lfimg. APPEND gs_item TO lt_temp_item. ENDLOOP. 替換原表 gt_item lt_temp_item. ENDIF. ENDFORM. frm_edit_data