SO銷售訂單明細報表
業務目的:根據選擇屏幕的篩選條件,使用ALV報表顯示銷售訂單詳情(Sales Order、Material、現有Qty、已開立數量以及剩余數量等)信息
效果展示
我們在'銷售訂單'欄位輸入需要查詢的SO單號,這里我們以SO單號'0000000221'為例,填寫完相關信息以后,點擊執行按鈕
效果如下所示:
其中對應SO單號的Material剩余數量 =?現有Qty -?已開立數量?
我們使用事務碼Tcode:VA03?查看SO單號(0000000221)的信息如下所示
從上面我們可以看出該SO訂單對應物料TG11并未開立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)??
*&---------------------------------------------------------------------*
*& Include ZRS0507_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已開立數量meins TYPE lips-meins,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)?
*&---------------------------------------------------------------------*
*& Include ZRS0507_F01 *
*&---------------------------------------------------------------------**&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
* 獲取數據
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_get_data .SELECT DISTINCTvbap~vbeln " SO單號vbap~posnr " 行項目vbap~matnr " 物料編碼vbap~kwmeng " 銷售訂單數量(SO現有數量)vbap~charg " SO等級vbap~vrkme " 銷售單位FROM vbapLEFT JOIN vbepON vbap~vbeln = vbep~vbelnAND vbap~posnr = vbep~posnrINTO CORRESPONDING FIELDS OF TABLE gt_itemWHERE 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'EXPORTINGi_callback_program = sy-repidit_fieldcat_lvc = gt_fcat " 設置ALV列屬性is_layout_lvc = gs_layout " 設置ALV布局TABLESt_outtab = gt_item " 內表數據EXCEPTIONSprogram_error = 1OTHERS = 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 &9catalog:'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 DISTINCTvgbel " SO單號vgpos " SO單號行項目vbeln " 交貨單posnr " 交貨單行項目lfimg " 實際交付數量meins " 單位INTO CORRESPONDING FIELDS OF TABLE lt_lipsFROM lipsFOR ALL ENTRIES IN gt_itemWHERE vgbel = gt_item-vbelnAND 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-vbelnAND 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