SAP ABAP ALV构建动态输出列与构建动态内表
生活随笔
收集整理的這篇文章主要介紹了
SAP ABAP ALV构建动态输出列与构建动态内表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先,簡單說明一下要用到的表類型、類、函數:
表類型 LVC_T_FCAT-(存放自定義列屬性的表類型,一般用到的屬性有:FIELDNAME、OUTPUTLEN、DATATYPE、INTTYPE、INTLEN、DECIMALS)。 ??????LVC_S_FCAT- (LVC_T_FCAT類型的工作區類型)。 類 ??????CL_ABAP_TABLEDESCR-(內表結構屬性操作類,比如可以讀取內表的列名稱、內表值、內表列屬性等等)。 CL_ABAP_STRUCTDESCR-(CL_ABAP_TABLEDESCR的工作區類型)。 函數 CONVERSION_EXIT_CUNIT_OUTPUT-(單位輸出轉換)。 ???????CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA(?內表?):獲取CL_ABAP_TABLEDESCR對象。 ????????CL_ABAP_TABLEDESCR對象->GET_TABLE_LINE_TYPE(?):獲取CL_ABAP_STRUCTDESCR對象(注意函數括號里面的空格)。 ????????REUSE_ALV_GRID_DISPLAY:ALV顯示內表結果。 ???????REUSE_ALV_COMMENTARY_WRITE:ALV抬頭信息。 下面是一個開發實例的SAMPLE,根據給出的BOM循環查找BOM下面的所有最底層物料,根據工廠存在的物料價格動態地輸出相應的列: *&---------------------------------------------------------------------*
*&?Report??ZCOR017
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT??ZCOR017.
TABLES:MAST,STPO.
TYPE-POOLS:?SLIS.
*****************************TYPES*****************************************
TYPES:BEGIN?OF?TY_STPO,
??STLNR?TYPE?STPO-STLNR,
??STLTY?TYPE?STPO-STLTY,
??STLKN?TYPE?STPO-STLKN,
??STPOZ?TYPE?STPO-STPOZ,
??IDNRK?TYPE?STPO-IDNRK,
END?OF?TY_STPO.
TYPES:BEGIN?OF?TY_MAST,
??MATNR?TYPE?MAST-MATNR,
??WERKS?TYPE?MAST-WERKS,
??STLAN?TYPE?MAST-STLAN,
??STLNR?TYPE?MAST-STLNR,
END?OF?TY_MAST.
TYPES:BEGIN?OF?TY_MAKT,
??MATNR?TYPE?MAKT-MATNR,
??MAKTX?TYPE?MAKT-MAKTX,
END?OF?TY_MAKT.
TYPES:BEGIN?OF?TY_MARA,
??MATNR?TYPE?MARA-MATNR,
??MEINS?TYPE?MARA-MEINS,
END?OF?TY_MARA.
TYPES:BEGIN?OF?TY_T001K,
??BWKEY?TYPE?T001K-BWKEY,
END?OF?TY_T001K.
TYPES:BEGIN?OF?TY_MBEW,
??MATNR?TYPE?MBEW-MATNR,
??BWKEY?TYPE?MBEW-BWKEY,
??STPRS?TYPE?MBEW-STPRS,
??PEINH?TYPE?MBEW-PEINH,
END?OF?TY_MBEW.
*****************************DATA*****************************************
DATA:
??????GT_STPO?TYPE?TABLE?OF?TY_STPO,
??????GS_STPO?TYPE?TY_STPO,
??????LT_STPO?TYPE?TABLE?OF?TY_STPO,
??????LS_STPO?TYPE?TY_STPO,
??????GT_MAST?TYPE?TABLE?OF?TY_MAST,
??????GS_MAST?TYPE?TY_MAST,
??????LT_MAST?TYPE?TABLE?OF?TY_MAST,
??????LS_MAST?TYPE?TY_MAST,
??????GT_MAKT?TYPE?TABLE?OF?TY_MAKT,
??????GS_MAKT?TYPE?TY_MAKT,
??????GT_MARA?TYPE?TABLE?OF?TY_MARA,
??????GS_MARA?TYPE?TY_MARA,
??????GT_T001K?TYPE?TABLE?OF?TY_T001K,
??????GS_T001K?TYPE?TY_T001K,
??????GT_MBEW?TYPE?TABLE?OF?TY_MBEW,
??????GS_MBEW?TYPE?TY_MBEW,
??????DNY_TAB?TYPE?REF?TO?DATA,
??????DNY_LINE?TYPE?REF?TO?DATA,
??????IFC?????TYPE?LVC_T_FCAT,
??????XFC?????TYPE?LVC_S_FCAT,
??????GS_LAYOUT?TYPE?SLIS_LAYOUT_ALV,
??????GT_FIELD?TYPE?SLIS_T_FIELDCAT_ALV,
??????GS_FIELD?LIKE?LINE?OF?GT_FIELD,
??????COUNTER?TYPE?I?VALUE?0,
??????GV_STC_DESC?TYPE?REF?TO?CL_ABAP_STRUCTDESCR,
??????GV_TAB_DESC?TYPE?REF?TO?CL_ABAP_TABLEDESCR,
??????GT_TOP?TYPE?SLIS_T_LISTHEADER,
??????GS_TOP?TYPE?SLIS_LISTHEADER.
.
******************************DEFINETION****************************************
DEFINE?DF_LVC_FCAT.
??XFC-FIELDNAME?=?&1.
??XFC-DATATYPE??=?&2.
??XFC-INTTYPE???=?&3.
??XFC-INTLEN????=?&4.
??XFC-DECIMALS??=?&5.
??APPEND?XFC?TO?IFC.
??CLEAR?XFC.
END-OF-DEFINITION.
DEFINE?M_ALV_FIELDCAT.
??GS_FIELD-FIELDNAME?????=?&1.
??GS_FIELD-REPTEXT_DDIC??=?&2.
??GS_FIELD-OUTPUTLEN?????=?&3.
??GS_FIELD-ICON??????????=?&4.
??GS_FIELD-EDIT??????????=?''.
??GS_FIELD-CHECKBOX??????=?''.
??GS_FIELD-REF_FIELDNAME?=?''.
??GS_FIELD-REF_TABNAME???=?''.
??GS_FIELD-JUST??????????=?''.
??GS_FIELD-NO_ZERO???????=?''.
??APPEND?GS_FIELD?TO?GT_FIELD.
??CLEAR?GS_FIELD.
END-OF-DEFINITION.
******************************FILED-SYMBOLS****************************************
FIELD-SYMBOLS:
???????????????$DNY_TAB> ?TYPE?STANDARD?TABLE,"該死的渣浪不支持小于號大于號組合,只能用$來代替了。 ??????????????$DNY_WA>?, ??????????????$DNY_FIELD>, ??????????????$FS_TAB>?TYPE?ABAP_COMPDESCR.
******************************SCREEN****************************************
SELECTION-SCREEN?BEGIN?OF?BLOCK?B1?WITH?FRAME?TITLE?TEXT-009.
SELECTION-SCREEN?BEGIN?OF?LINE.
SELECTION-SCREEN?COMMENT?1(51)?TEXT-010.
SELECTION-SCREEN?END?OF?LINE.
SELECTION-SCREEN?BEGIN?OF?LINE.
SELECTION-SCREEN?COMMENT?1(50)?TEXT-011.
SELECTION-SCREEN?END?OF?LINE.
SELECTION-SCREEN?BEGIN?OF?LINE.
SELECTION-SCREEN?COMMENT?1(60)?TEXT-012.
SELECTION-SCREEN?END?OF?LINE.
SELECTION-SCREEN?END?OF?BLOCK?B1.
SELECTION-SCREEN?BEGIN?OF?BLOCK?B2?WITH?FRAME?TITLE?TEXT-001.
SELECT-OPTIONS:
??SMATNR?FOR?MAST-MATNR?OBLIGATORY.
PARAMETERS??SWERKS?TYPE?MAST-WERKS.
SELECTION-SCREEN?BEGIN?OF?LINE.
SELECTION-SCREEN?COMMENT?1(10)?TEXT-002?FOR?FIELD?R1.
PARAMETERS?R1?RADIOBUTTON?GROUP?G1?DEFAULT?'X'.
SELECTION-SCREEN?COMMENT?14(10)?TEXT-003?FOR?FIELD?R1.
PARAMETERS?R2?RADIOBUTTON?GROUP?G1.
SELECTION-SCREEN?COMMENT?27(10)?TEXT-004?FOR?FIELD?R1.
SELECTION-SCREEN?END?OF?LINE.
PARAMETERS?P1?TYPE?T416-STLAN?OBLIGATORY.
SELECTION-SCREEN?END?OF?BLOCK?B2.
*******************************FLOW***************************************
INITIALIZATION.
??"DO?NOTHING.
AT?SELECTION-SCREEN.
??PERFORM?CHECK_INPUT.
START-OF-SELECTION.
??PERFORM?RETRIVE_DATA.
??PERFORM?PROCESS_DATA.
END-OF-SELECTION.
??PERFORM?PROCESS_OUTPUT.
*******************************FORM***************************************
*&---------------------------------------------------------------------*
*&??????Form??CHECK_INPUT
*&---------------------------------------------------------------------*
*???????text
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?CHECK_INPUT?.
??"BOM類別為主機BOM,物料輸入為6101*或671*,否則提示“主機BOM只允許輸入6101*或671*物料”
??IF?R1?=?'X'.
????LOOP?AT?SMATNR.
??????IF?SMATNR-LOW?IS?NOT?INITIAL?AND?SMATNR-HIGH?IS?INITIAL.
????????IF?SMATNR-LOW+0(4)?NE?'6101'?AND?SMATNR-LOW+0(3)?NE?'671'.
??????????MESSAGE?TEXT-005?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
??????ELSEIF?SMATNR-LOW?IS?NOT?INITIAL?AND?SMATNR-HIGH?IS?NOT?INITIAL.
????????IF?SMATNR-LOW+0(4)?EQ?'6101'?AND?SMATNR-HIGH+0(4)?NE?'6101'.
??????????MESSAGE?TEXT-005?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
????????IF?SMATNR-LOW+0(4)?NE?'6101'?AND?SMATNR-HIGH+0(4)?EQ?'6101'.
??????????MESSAGE?TEXT-005?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
????????IF?SMATNR-LOW+0(3)?EQ?'671'?AND?SMATNR-HIGH+0(3)?NE?'671'.
??????????MESSAGE?TEXT-005?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
????????IF?SMATNR-LOW+0(3)?NE?'671'?AND?SMATNR-HIGH+0(3)?EQ?'671'.
??????????MESSAGE?TEXT-005?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
??????ELSE.
????????MESSAGE?TEXT-005?TYPE?'E'.
????????LEAVE?LIST-PROCESSING.
??????ENDIF.
????ENDLOOP.
????"BOM類別為項目物資,物料輸入為672*數據,否則提示“只允許輸入672*物料”
??ELSEIF?R2?=?'X'.
????LOOP?AT?SMATNR.
??????IF?SMATNR-LOW?IS?NOT?INITIAL?AND?SMATNR-HIGH?IS?INITIAL.
????????IF?SMATNR-LOW+0(3)?NE?'672'.
??????????MESSAGE?TEXT-006?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
??????ELSEIF?SMATNR-LOW?IS?NOT?INITIAL?AND?SMATNR-HIGH?IS?NOT?INITIAL.
????????IF?SMATNR-LOW+0(3)?NE?'672'?OR?SMATNR-HIGH+0(3)?NE?'672'.
??????????MESSAGE?TEXT-006?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
??????ELSE.
????????MESSAGE?TEXT-006?TYPE?'E'.
????????LEAVE?LIST-PROCESSING.
??????ENDIF.
????ENDLOOP.
??ENDIF.
ENDFORM.????????????????????"?CHECK_INPUT
*&---------------------------------------------------------------------*
*&??????Form??RETRIVE_DATA
*&---------------------------------------------------------------------*
*???????text
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?RETRIVE_DATA?.
??"檢查BOM存在性
??IF?SWERKS?IS?NOT?INITIAL.
????SELECT?MATNR?WERKS?STLAN?STLNR
??????FROM?MAST
??????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MAST
??????WHERE?MATNR?IN?SMATNR
????????AND?WERKS?EQ?SWERKS
????????AND?STLAN?EQ?P1.
??ELSE.
????SELECT?MATNR?WERKS?STLAN?STLNR
??????FROM?MAST
??????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MAST
??????WHERE?MATNR?IN?SMATNR
????????AND?STLAN?EQ?P1.
??ENDIF.
??IF?GT_MAST?IS?INITIAL.
????MESSAGE?TEXT-007?TYPE?'I'.
????LEAVE?LIST-PROCESSING.
????CALL?SELECTION-SCREEN?1000.
??ENDIF.
??"根據BOM獲取子層
??SELECT?STLNR?STLTY?STLKN?STPOZ?IDNRK
????FROM?STPO
????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_STPO
????FOR?ALL?ENTRIES?IN?GT_MAST
????WHERE?STLTY?EQ?'M'
??????AND?STLNR?=?GT_MAST-STLNR.
??PERFORM?FOO_BOM?CHANGING?GT_STPO.
??"刪除重復行
??SORT?GT_STPO?BY?IDNRK.
??DELETE?ADJACENT?DUPLICATES?FROM?GT_STPO?COMPARING?IDNRK.
??"獲取物料描述
??SELECT?MATNR?MAKTX?FROM?MAKT
????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MAKT
????FOR?ALL?ENTRIES?IN?GT_STPO
????WHERE?MATNR?=?GT_STPO-IDNRK.
??"獲取單位
??SELECT?MATNR?MEINS?FROM?MARA
????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MARA
????FOR?ALL?ENTRIES?IN?GT_STPO
????WHERE?MATNR?=?GT_STPO-IDNRK.
??"獲取價格
??IF?R1?=?'X'.
????IF?SWERKS?IS?NOT?INITIAL.
??????SELECT?MATNR?BWKEY?STPRS?PEINH?FROM?MBEW
????????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MBEW
????????FOR?ALL?ENTRIES?IN?GT_STPO
????????WHERE?MATNR?=?GT_STPO-IDNRK
??????????AND?BWKEY?=?SWERKS.
????ELSE.
??????SELECT?BWKEY?FROM?T001K
????????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_T001K
????????WHERE?BWKEY?NOT?IN?('6010','6100','6540','6888')
??????????AND?BWMOD?=?'MY02'.
??????LOOP?AT?GT_T001K?INTO?GS_T001K.
????????IF?GS_T001K-BWKEY+3(1)?EQ?'9'.
??????????DELETE?GT_T001K.
????????ENDIF.
??????ENDLOOP.
??????SELECT?MATNR?BWKEY?STPRS?PEINH?FROM?MBEW
????????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MBEW
????????FOR?ALL?ENTRIES?IN?GT_STPO
????????WHERE?MATNR?=?GT_STPO-IDNRK.
??????LOOP?AT?GT_MBEW?INTO?GS_MBEW.
????????READ?TABLE?GT_T001K?TRANSPORTING?NO?FIELDS?WITH?KEY?BWKEY?=?GS_MBEW-BWKEY.
????????IF?SY-SUBRC?<>?0.
??????????DELETE?GT_MBEW.
????????ENDIF.
??????ENDLOOP.
????ENDIF.
??ELSE.
????SELECT?MATNR?BWKEY?STPRS?PEINH?FROM?MBEW
????????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MBEW
????????FOR?ALL?ENTRIES?IN?GT_STPO
????????WHERE?MATNR?=?GT_STPO-IDNRK
??????????AND?BWKEY?=?'6888'.
??ENDIF.
ENDFORM.????????????????????"?RETRIVE_DATA
*&---------------------------------------------------------------------*
*&??????Form??PROCESS_DATA
*&---------------------------------------------------------------------*
*???????text
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?PROCESS_DATA?.
??DF_LVC_FCAT:"FIELDNAME?DATATYPE?INTTYPE?INTLEN?DECIMALS
????'MATNR'?'C'?'C'?18?0,"物料
????'MAKTX'?'C'?'C'?40?0,"物料描述
????'MEINS'?'C'?'C'?3?0,"基本單位
????'CHECK'?'C'?'C'?4?0,"價格檢查標識
????'LMEIN'?'C'?'C'?1?0."本報表價格單位
??IF?R1?=?'X'.
????IF?SWERKS?IS?NOT?INITIAL.
??????DF_LVC_FCAT:
????????SWERKS?'P'?'P'?11?2."工廠價格
????ELSE.
??????SORT?GT_T001K.
??????CLEAR?GS_T001K.
??????LOOP?AT?GT_T001K?INTO?GS_T001K.
????????DF_LVC_FCAT:
??????????GS_T001K-BWKEY?'P'?'P'?11?2."工廠價格
????????CLEAR?GS_T001K.
??????ENDLOOP.
????ENDIF.
??ELSE.
????DF_LVC_FCAT:
???????'6888'?'P'?'P'?11?2.?????????????????????????????????"6888工廠價格
??ENDIF.
??CALL?METHOD?CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
????EXPORTING
??????IT_FIELDCATALOG?=?IFC
????IMPORTING
??????EP_TABLE????????=?DNY_TAB.
??ASSIGN?DNY_TAB->*?TO $DNY_TAB>. ?CREATE?DATA?DNY_LINE?LIKE?LINE?OF $DNY_TAB>. ?ASSIGN?DNY_LINE->*?TO ?$DNY_WA>.
??CLEAR?GS_STPO.
??LOOP?AT?GT_STPO?INTO?GS_STPO.
????"物料
????ASSIGN?COMPONENT?'MATNR'?OF?STRUCTURE ?$DNY_WA>?TO ?$DNY_FIELD>. ????=?GS_STPO-IDNRK.
????"物料描述
????CLEAR?GS_MAKT.
????READ?TABLE?GT_MAKT?INTO?GS_MAKT?WITH?KEY?MATNR?=?GS_STPO-IDNRK.
????IF?SY-SUBRC?=?0.
??????ASSIGN?COMPONENT?'MAKTX'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
???????=?GS_MAKT-MAKTX.
????ENDIF.
????"基本單位
????CLEAR?GS_MARA.
????READ?TABLE?GT_MARA?INTO?GS_MARA?WITH?KEY?MATNR?=?GS_STPO-IDNRK.
????IF?SY-SUBRC?=?0.
??????CALL?FUNCTION?'CONVERSION_EXIT_CUNIT_OUTPUT'
????????EXPORTING
??????????INPUT????????????????=?GS_MARA-MEINS
*?????????LANGUAGE?????????????=?SY-LANGU
????????IMPORTING
*?????????LONG_TEXT????????????=
??????????OUTPUT???????????????=?GS_MARA-MEINS
*?????????SHORT_TEXT???????????=
*???????EXCEPTIONS
*?????????UNIT_NOT_FOUND???????=?1
*?????????OTHERS???????????????=?2
????????????????.
??????IF?SY-SUBRC?<>?0.
*?Implement?suitable?error?handling?here
??????ENDIF.
??????ASSIGN?COMPONENT?'MEINS'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
???????=?GS_MARA-MEINS.
????ENDIF.
????"本報表價格單位
????ASSIGN?COMPONENT?'LMEIN'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
?????=?'1'.
????"各工廠價格
????IF?R1?=?'X'.
??????IF?SWERKS?IS?INITIAL.
????????CLEAR:?GS_MBEW,GS_T001K,COUNTER.
????????SORT?GT_T001K.
????????LOOP?AT?GT_T001K?INTO?GS_T001K.
??????????ASSIGN?COMPONENT?GS_T001K-BWKEY?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
??????????LOOP?AT?GT_MBEW?INTO?GS_MBEW?WHERE?MATNR?=?GS_STPO-IDNRK?AND?BWKEY?=?GS_T001K-BWKEY.
?????????????=?GS_MBEW-STPRS?/?GS_MBEW-PEINH.
????????????IF??NE?0.
??????????????COUNTER?=?COUNTER?+?1.
????????????ENDIF.
??????????ENDLOOP.
??????????IF?SY-SUBRC?<>?0.
?????????????=?0.
??????????ENDIF.
????????ENDLOOP.
????????"價格檢查標識
????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>.
????????IF?COUNTER?=?LINES(?GT_T001K?)?AND?COUNTER?NE?0.
???????????=?'@5B@'."GREEN
????????ELSEIF?COUNTER?=?0.
???????????=?'@5C@'."RED
????????ELSE.
???????????=?'@5D@'."YELLOW
????????ENDIF.
??????ELSE.
????????CLEAR:GS_MBEW.
????????ASSIGN?COMPONENT?SWERKS?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>.
????????READ?TABLE?GT_MBEW?INTO?GS_MBEW?WITH?KEY?MATNR?=?GS_STPO-IDNRK?BWKEY?=?SWERKS.
????????IF?SY-SUBRC?=?0.
???????????=?GS_MBEW-STPRS?/?GS_MBEW-PEINH.
??????????"價格檢查標識
??????????IF??NE?0.
????????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE??$DNY_WA>?TO ?$DNY_FIELD>?.
?????????????=?'@5B@'."GREEN
??????????ELSE.
????????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
?????????????=?'@5C@'."RED
??????????ENDIF.
????????ELSE.
???????????=?0.
??????????"價格檢查標識
??????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE??$DNY_WA>?TO ?$DNY_FIELD>?.
???????????=?'@5C@'."RED
????????ENDIF.
??????ENDIF.
????ELSE.
??????CLEAR:?GS_MBEW.
??????ASSIGN?COMPONENT?'6888'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
??????READ?TABLE?GT_MBEW?INTO?GS_MBEW?WITH?KEY?BWKEY?=?'6888'?MATNR?=?GS_STPO-IDNRK.
??????IF?SY-SUBRC?=?0.
?????????=?GS_MBEW-STPRS?/?GS_MBEW-PEINH.
????????"價格檢查標識
????????IF??NE?0.
??????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>.
???????????=?'@5B@'."GREEN
????????ELSE.
??????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
???????????=?'@5C@'."RED
????????ENDIF.
??????ELSE.
?????????=?0.
????????"價格檢查標識
????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>.
?????????=?'@5C@'.
??????ENDIF.
????ENDIF.
????APPEND???$DNY_WA>?TO?$DNY_TAB>.??.
????CLEAR?GS_STPO.
??ENDLOOP.
ENDFORM.????????????????????"?PROCESS_DATA
*&---------------------------------------------------------------------*
*&??????Form??PROCESS_OUTPUT
*&---------------------------------------------------------------------*
*???????text
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?PROCESS_OUTPUT?.
??M_ALV_FIELDCAT:"FIELDNAME?HEADING?OUTPUTLEN?ICON
????????'MATNR'?'物料'?'18'?'',
????????'MAKTX'?'物料描述'?'40'?'',
????????'MEINS'?'基本單位'?'4'?'',
????????'CHECK'?'價格檢查標識'?'4'?'X',
????????'LMEIN'?'本報表價格單位'?'4'?''.
??IF?R1?=?'X'.
????GV_TAB_DESC??=?CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( $DNY_TAB>?). ???GV_STC_DESC??=?GV_TAB_DESC->GET_TABLE_LINE_TYPE(?).
????DATA:?LV_STR?TYPE?STRING.
????LOOP?AT?GV_STC_DESC->COMPONENTS?ASSIGNING $FS_TAB>. ?????IF?$FS_TAB>-NAME?EQ?'MATNR' ?????????OR?$FS_TAB>-NAME?EQ?'MAKTX' ?????????OR?$FS_TAB>-NAME?EQ?'MEINS' ?????????OR?$FS_TAB>-NAME?EQ?'CHECK' ?????????OR?$FS_TAB>-NAME?EQ?'LMEIN'. ???????CONTINUE.
??????ENDIF.
??????CLEAR?LV_STR.
??????LV_STR?=?$FS_TAB>-NAME?&&?'-工廠價格'. ?????M_ALV_FIELDCAT:
???????????$FS_TAB>-NAME?LV_STR?'15'?''. ???ENDLOOP.
??ELSE.
????M_ALV_FIELDCAT:
?????????'6888'?'6888-工廠價格'?'15'?''.
??ENDIF.
****************************ALV?LAYOUT******************************************
??GS_LAYOUT-COLWIDTH_OPTIMIZE?=?'X'."寬度自動優化
??GS_LAYOUT-ZEBRA?????????????=?'X'."斑馬線
**********************TOP?OF?PAGR************************************************
??"Type?H?is?used?to?display?headers?i.e.?big?font
??CLEAR?GS_TOP.
??GS_TOP-TYP?=?'H'.
??IF?R1?=?'X'.
????GS_TOP-INFO?=?'投標報價主機BOM價格檢查'.
??ELSE.
????GS_TOP-INFO?=?'投標報價項目物資相關BOM物料檢查'.
??ENDIF.
??APPEND?GS_TOP?TO?GT_TOP.
??"Type?S?is?used?to?display?key?and?value?pairs
??IF?R1?=?'X'.
????CLEAR?GS_TOP.
????GS_TOP-TYP?=?'S'.
????GS_TOP-KEY?=?'紅燈:'.
????GS_TOP-INFO?=?'所有工廠價格為0'.
????APPEND?GS_TOP?TO?GT_TOP.
????CLEAR?GS_TOP.
????GS_TOP-TYP?=?'S'.
????GS_TOP-KEY?=?'黃燈:'.
????GS_TOP-INFO?=?'一個工廠有價格不為0(排除綠燈條件)'.
????APPEND?GS_TOP?TO?GT_TOP.
????CLEAR?GS_TOP.
????GS_TOP-TYP?=?'S'.
????GS_TOP-KEY?=?'綠燈:'.
????GS_TOP-INFO?=?'所有工廠價格都不為0'.
????APPEND?GS_TOP?TO?GT_TOP.
????CLEAR?GS_TOP.
????GS_TOP-TYP?=?'S'.
????GS_TOP-KEY?=?'備注:'.
????GS_TOP-INFO?=?'只對所有主機工廠檢查,且價格單位均為1'.
????APPEND?GS_TOP?TO?GT_TOP.
??ELSE.
????CLEAR?GS_TOP.
????GS_TOP-TYP?=?'S'.
????GS_TOP-KEY?=?'備注:'.
????GS_TOP-INFO?=?'只檢查6888工廠物料價格'.
????APPEND?GS_TOP?TO?GT_TOP.
??ENDIF.
??"Type?A?is?used?to?display?italic?font
*??CLEAR?GS_TOP.
*??GS_TOP-TYP?=?'A'.
*??GS_TOP-INFO?=?SY-DATUM.
*??APPEND?GS_TOP?TO?GT_TOP.
*****************************ALV*****************************************
??CALL?FUNCTION?'REUSE_ALV_GRID_DISPLAY'
????EXPORTING
??????I_CALLBACK_PROGRAM?????=?SY-REPID
??????I_CALLBACK_TOP_OF_PAGE?=?'TOP_OF_PAGE'
??????IS_LAYOUT??????????????=?GS_LAYOUT
??????IT_FIELDCAT????????????=?GT_FIELD
??????I_DEFAULT??????????????=?'X'
??????I_SAVE?????????????????=?'A'
????TABLES
??????T_OUTTAB???????????????= $?DNY_TAB>?
????EXCEPTIONS
??????PROGRAM_ERROR??????????=?1
??????OTHERS?????????????????=?2.
??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.????????????????????"?PROCESS_OUTPUT
*&---------------------------------------------------------------------*
*&??????Form??top_of_page
*&---------------------------------------------------------------------*
FORM?TOP_OF_PAGE.
??CALL?FUNCTION?'REUSE_ALV_COMMENTARY_WRITE'
????EXPORTING
??????IT_LIST_COMMENTARY?=?GT_TOP.
ENDFORM.????????????????????"top_of_page
*&---------------------------------------------------------------------*
*&??????Form??FOO_BOM
*&---------------------------------------------------------------------*
*???????text
*----------------------------------------------------------------------*
*??????<--P_GT_STPO??text
*----------------------------------------------------------------------*
FORM?FOO_BOM??CHANGING?P_GT_STPO?LIKE?GT_STPO.
??IF?P_GT_STPO?IS?INITIAL.
????MESSAGE?TEXT-008?TYPE?'I'.
????RETURN.
??ENDIF.
??CLEAR:
????????LT_MAST,
????????LS_MAST,
????????LT_STPO,
????????LS_STPO.
??IF?SWERKS?IS?NOT?INITIAL.
????SELECT?MATNR?WERKS?STLAN?STLNR
??????FROM?MAST
??????INTO?CORRESPONDING?FIELDS?OF?TABLE?LT_MAST
??????FOR?ALL?ENTRIES?IN?P_GT_STPO
??????WHERE?MATNR?=?P_GT_STPO-IDNRK
????????AND?WERKS?EQ?SWERKS
????????AND?STLAN?EQ?P1.
??ELSE.
????SELECT?MATNR?WERKS?STLAN?STLNR
??????FROM?MAST
??????INTO?CORRESPONDING?FIELDS?OF?TABLE?LT_MAST
??????FOR?ALL?ENTRIES?IN?P_GT_STPO
??????WHERE?MATNR?=?P_GT_STPO-IDNRK
????????AND?STLAN?EQ?P1.
??ENDIF.
??IF?LT_MAST?IS?NOT?INITIAL.
????SELECT?STLNR?STLTY?STLKN?STPOZ?IDNRK
??????FROM?STPO
??????INTO?CORRESPONDING?FIELDS?OF?TABLE?LT_STPO
??????FOR?ALL?ENTRIES?IN?LT_MAST
??????WHERE?STLTY?EQ?'M'
????????AND?STLNR?=?LT_MAST-STLNR.
????LOOP?AT?LT_MAST?INTO?LS_MAST.
??????DELETE?P_GT_STPO?WHERE?IDNRK?=?LS_MAST-MATNR.
????ENDLOOP.
????APPEND?LINES?OF?LT_STPO?TO?P_GT_STPO.
????PERFORM?FOO_BOM?CHANGING?P_GT_STPO.
??ENDIF.
ENDFORM.????????????????????"?FOO_BOM
表類型 LVC_T_FCAT-(存放自定義列屬性的表類型,一般用到的屬性有:FIELDNAME、OUTPUTLEN、DATATYPE、INTTYPE、INTLEN、DECIMALS)。 ??????LVC_S_FCAT- (LVC_T_FCAT類型的工作區類型)。 類 ??????CL_ABAP_TABLEDESCR-(內表結構屬性操作類,比如可以讀取內表的列名稱、內表值、內表列屬性等等)。 CL_ABAP_STRUCTDESCR-(CL_ABAP_TABLEDESCR的工作區類型)。 函數 CONVERSION_EXIT_CUNIT_OUTPUT-(單位輸出轉換)。 ???????CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA(?內表?):獲取CL_ABAP_TABLEDESCR對象。 ????????CL_ABAP_TABLEDESCR對象->GET_TABLE_LINE_TYPE(?):獲取CL_ABAP_STRUCTDESCR對象(注意函數括號里面的空格)。 ????????REUSE_ALV_GRID_DISPLAY:ALV顯示內表結果。 ???????REUSE_ALV_COMMENTARY_WRITE:ALV抬頭信息。 下面是一個開發實例的SAMPLE,根據給出的BOM循環查找BOM下面的所有最底層物料,根據工廠存在的物料價格動態地輸出相應的列: *&---------------------------------------------------------------------*
*&?Report??ZCOR017
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT??ZCOR017.
TABLES:MAST,STPO.
TYPE-POOLS:?SLIS.
*****************************TYPES*****************************************
TYPES:BEGIN?OF?TY_STPO,
??STLNR?TYPE?STPO-STLNR,
??STLTY?TYPE?STPO-STLTY,
??STLKN?TYPE?STPO-STLKN,
??STPOZ?TYPE?STPO-STPOZ,
??IDNRK?TYPE?STPO-IDNRK,
END?OF?TY_STPO.
TYPES:BEGIN?OF?TY_MAST,
??MATNR?TYPE?MAST-MATNR,
??WERKS?TYPE?MAST-WERKS,
??STLAN?TYPE?MAST-STLAN,
??STLNR?TYPE?MAST-STLNR,
END?OF?TY_MAST.
TYPES:BEGIN?OF?TY_MAKT,
??MATNR?TYPE?MAKT-MATNR,
??MAKTX?TYPE?MAKT-MAKTX,
END?OF?TY_MAKT.
TYPES:BEGIN?OF?TY_MARA,
??MATNR?TYPE?MARA-MATNR,
??MEINS?TYPE?MARA-MEINS,
END?OF?TY_MARA.
TYPES:BEGIN?OF?TY_T001K,
??BWKEY?TYPE?T001K-BWKEY,
END?OF?TY_T001K.
TYPES:BEGIN?OF?TY_MBEW,
??MATNR?TYPE?MBEW-MATNR,
??BWKEY?TYPE?MBEW-BWKEY,
??STPRS?TYPE?MBEW-STPRS,
??PEINH?TYPE?MBEW-PEINH,
END?OF?TY_MBEW.
*****************************DATA*****************************************
DATA:
??????GT_STPO?TYPE?TABLE?OF?TY_STPO,
??????GS_STPO?TYPE?TY_STPO,
??????LT_STPO?TYPE?TABLE?OF?TY_STPO,
??????LS_STPO?TYPE?TY_STPO,
??????GT_MAST?TYPE?TABLE?OF?TY_MAST,
??????GS_MAST?TYPE?TY_MAST,
??????LT_MAST?TYPE?TABLE?OF?TY_MAST,
??????LS_MAST?TYPE?TY_MAST,
??????GT_MAKT?TYPE?TABLE?OF?TY_MAKT,
??????GS_MAKT?TYPE?TY_MAKT,
??????GT_MARA?TYPE?TABLE?OF?TY_MARA,
??????GS_MARA?TYPE?TY_MARA,
??????GT_T001K?TYPE?TABLE?OF?TY_T001K,
??????GS_T001K?TYPE?TY_T001K,
??????GT_MBEW?TYPE?TABLE?OF?TY_MBEW,
??????GS_MBEW?TYPE?TY_MBEW,
??????DNY_TAB?TYPE?REF?TO?DATA,
??????DNY_LINE?TYPE?REF?TO?DATA,
??????IFC?????TYPE?LVC_T_FCAT,
??????XFC?????TYPE?LVC_S_FCAT,
??????GS_LAYOUT?TYPE?SLIS_LAYOUT_ALV,
??????GT_FIELD?TYPE?SLIS_T_FIELDCAT_ALV,
??????GS_FIELD?LIKE?LINE?OF?GT_FIELD,
??????COUNTER?TYPE?I?VALUE?0,
??????GV_STC_DESC?TYPE?REF?TO?CL_ABAP_STRUCTDESCR,
??????GV_TAB_DESC?TYPE?REF?TO?CL_ABAP_TABLEDESCR,
??????GT_TOP?TYPE?SLIS_T_LISTHEADER,
??????GS_TOP?TYPE?SLIS_LISTHEADER.
.
******************************DEFINETION****************************************
DEFINE?DF_LVC_FCAT.
??XFC-FIELDNAME?=?&1.
??XFC-DATATYPE??=?&2.
??XFC-INTTYPE???=?&3.
??XFC-INTLEN????=?&4.
??XFC-DECIMALS??=?&5.
??APPEND?XFC?TO?IFC.
??CLEAR?XFC.
END-OF-DEFINITION.
DEFINE?M_ALV_FIELDCAT.
??GS_FIELD-FIELDNAME?????=?&1.
??GS_FIELD-REPTEXT_DDIC??=?&2.
??GS_FIELD-OUTPUTLEN?????=?&3.
??GS_FIELD-ICON??????????=?&4.
??GS_FIELD-EDIT??????????=?''.
??GS_FIELD-CHECKBOX??????=?''.
??GS_FIELD-REF_FIELDNAME?=?''.
??GS_FIELD-REF_TABNAME???=?''.
??GS_FIELD-JUST??????????=?''.
??GS_FIELD-NO_ZERO???????=?''.
??APPEND?GS_FIELD?TO?GT_FIELD.
??CLEAR?GS_FIELD.
END-OF-DEFINITION.
******************************FILED-SYMBOLS****************************************
FIELD-SYMBOLS:
???????????????$DNY_TAB> ?TYPE?STANDARD?TABLE,"該死的渣浪不支持小于號大于號組合,只能用$來代替了。 ??????????????$DNY_WA>?, ??????????????$DNY_FIELD>, ??????????????$FS_TAB>?TYPE?ABAP_COMPDESCR.
******************************SCREEN****************************************
SELECTION-SCREEN?BEGIN?OF?BLOCK?B1?WITH?FRAME?TITLE?TEXT-009.
SELECTION-SCREEN?BEGIN?OF?LINE.
SELECTION-SCREEN?COMMENT?1(51)?TEXT-010.
SELECTION-SCREEN?END?OF?LINE.
SELECTION-SCREEN?BEGIN?OF?LINE.
SELECTION-SCREEN?COMMENT?1(50)?TEXT-011.
SELECTION-SCREEN?END?OF?LINE.
SELECTION-SCREEN?BEGIN?OF?LINE.
SELECTION-SCREEN?COMMENT?1(60)?TEXT-012.
SELECTION-SCREEN?END?OF?LINE.
SELECTION-SCREEN?END?OF?BLOCK?B1.
SELECTION-SCREEN?BEGIN?OF?BLOCK?B2?WITH?FRAME?TITLE?TEXT-001.
SELECT-OPTIONS:
??SMATNR?FOR?MAST-MATNR?OBLIGATORY.
PARAMETERS??SWERKS?TYPE?MAST-WERKS.
SELECTION-SCREEN?BEGIN?OF?LINE.
SELECTION-SCREEN?COMMENT?1(10)?TEXT-002?FOR?FIELD?R1.
PARAMETERS?R1?RADIOBUTTON?GROUP?G1?DEFAULT?'X'.
SELECTION-SCREEN?COMMENT?14(10)?TEXT-003?FOR?FIELD?R1.
PARAMETERS?R2?RADIOBUTTON?GROUP?G1.
SELECTION-SCREEN?COMMENT?27(10)?TEXT-004?FOR?FIELD?R1.
SELECTION-SCREEN?END?OF?LINE.
PARAMETERS?P1?TYPE?T416-STLAN?OBLIGATORY.
SELECTION-SCREEN?END?OF?BLOCK?B2.
*******************************FLOW***************************************
INITIALIZATION.
??"DO?NOTHING.
AT?SELECTION-SCREEN.
??PERFORM?CHECK_INPUT.
START-OF-SELECTION.
??PERFORM?RETRIVE_DATA.
??PERFORM?PROCESS_DATA.
END-OF-SELECTION.
??PERFORM?PROCESS_OUTPUT.
*******************************FORM***************************************
*&---------------------------------------------------------------------*
*&??????Form??CHECK_INPUT
*&---------------------------------------------------------------------*
*???????text
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?CHECK_INPUT?.
??"BOM類別為主機BOM,物料輸入為6101*或671*,否則提示“主機BOM只允許輸入6101*或671*物料”
??IF?R1?=?'X'.
????LOOP?AT?SMATNR.
??????IF?SMATNR-LOW?IS?NOT?INITIAL?AND?SMATNR-HIGH?IS?INITIAL.
????????IF?SMATNR-LOW+0(4)?NE?'6101'?AND?SMATNR-LOW+0(3)?NE?'671'.
??????????MESSAGE?TEXT-005?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
??????ELSEIF?SMATNR-LOW?IS?NOT?INITIAL?AND?SMATNR-HIGH?IS?NOT?INITIAL.
????????IF?SMATNR-LOW+0(4)?EQ?'6101'?AND?SMATNR-HIGH+0(4)?NE?'6101'.
??????????MESSAGE?TEXT-005?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
????????IF?SMATNR-LOW+0(4)?NE?'6101'?AND?SMATNR-HIGH+0(4)?EQ?'6101'.
??????????MESSAGE?TEXT-005?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
????????IF?SMATNR-LOW+0(3)?EQ?'671'?AND?SMATNR-HIGH+0(3)?NE?'671'.
??????????MESSAGE?TEXT-005?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
????????IF?SMATNR-LOW+0(3)?NE?'671'?AND?SMATNR-HIGH+0(3)?EQ?'671'.
??????????MESSAGE?TEXT-005?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
??????ELSE.
????????MESSAGE?TEXT-005?TYPE?'E'.
????????LEAVE?LIST-PROCESSING.
??????ENDIF.
????ENDLOOP.
????"BOM類別為項目物資,物料輸入為672*數據,否則提示“只允許輸入672*物料”
??ELSEIF?R2?=?'X'.
????LOOP?AT?SMATNR.
??????IF?SMATNR-LOW?IS?NOT?INITIAL?AND?SMATNR-HIGH?IS?INITIAL.
????????IF?SMATNR-LOW+0(3)?NE?'672'.
??????????MESSAGE?TEXT-006?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
??????ELSEIF?SMATNR-LOW?IS?NOT?INITIAL?AND?SMATNR-HIGH?IS?NOT?INITIAL.
????????IF?SMATNR-LOW+0(3)?NE?'672'?OR?SMATNR-HIGH+0(3)?NE?'672'.
??????????MESSAGE?TEXT-006?TYPE?'E'.
??????????LEAVE?LIST-PROCESSING.
????????ENDIF.
??????ELSE.
????????MESSAGE?TEXT-006?TYPE?'E'.
????????LEAVE?LIST-PROCESSING.
??????ENDIF.
????ENDLOOP.
??ENDIF.
ENDFORM.????????????????????"?CHECK_INPUT
*&---------------------------------------------------------------------*
*&??????Form??RETRIVE_DATA
*&---------------------------------------------------------------------*
*???????text
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?RETRIVE_DATA?.
??"檢查BOM存在性
??IF?SWERKS?IS?NOT?INITIAL.
????SELECT?MATNR?WERKS?STLAN?STLNR
??????FROM?MAST
??????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MAST
??????WHERE?MATNR?IN?SMATNR
????????AND?WERKS?EQ?SWERKS
????????AND?STLAN?EQ?P1.
??ELSE.
????SELECT?MATNR?WERKS?STLAN?STLNR
??????FROM?MAST
??????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MAST
??????WHERE?MATNR?IN?SMATNR
????????AND?STLAN?EQ?P1.
??ENDIF.
??IF?GT_MAST?IS?INITIAL.
????MESSAGE?TEXT-007?TYPE?'I'.
????LEAVE?LIST-PROCESSING.
????CALL?SELECTION-SCREEN?1000.
??ENDIF.
??"根據BOM獲取子層
??SELECT?STLNR?STLTY?STLKN?STPOZ?IDNRK
????FROM?STPO
????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_STPO
????FOR?ALL?ENTRIES?IN?GT_MAST
????WHERE?STLTY?EQ?'M'
??????AND?STLNR?=?GT_MAST-STLNR.
??PERFORM?FOO_BOM?CHANGING?GT_STPO.
??"刪除重復行
??SORT?GT_STPO?BY?IDNRK.
??DELETE?ADJACENT?DUPLICATES?FROM?GT_STPO?COMPARING?IDNRK.
??"獲取物料描述
??SELECT?MATNR?MAKTX?FROM?MAKT
????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MAKT
????FOR?ALL?ENTRIES?IN?GT_STPO
????WHERE?MATNR?=?GT_STPO-IDNRK.
??"獲取單位
??SELECT?MATNR?MEINS?FROM?MARA
????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MARA
????FOR?ALL?ENTRIES?IN?GT_STPO
????WHERE?MATNR?=?GT_STPO-IDNRK.
??"獲取價格
??IF?R1?=?'X'.
????IF?SWERKS?IS?NOT?INITIAL.
??????SELECT?MATNR?BWKEY?STPRS?PEINH?FROM?MBEW
????????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MBEW
????????FOR?ALL?ENTRIES?IN?GT_STPO
????????WHERE?MATNR?=?GT_STPO-IDNRK
??????????AND?BWKEY?=?SWERKS.
????ELSE.
??????SELECT?BWKEY?FROM?T001K
????????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_T001K
????????WHERE?BWKEY?NOT?IN?('6010','6100','6540','6888')
??????????AND?BWMOD?=?'MY02'.
??????LOOP?AT?GT_T001K?INTO?GS_T001K.
????????IF?GS_T001K-BWKEY+3(1)?EQ?'9'.
??????????DELETE?GT_T001K.
????????ENDIF.
??????ENDLOOP.
??????SELECT?MATNR?BWKEY?STPRS?PEINH?FROM?MBEW
????????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MBEW
????????FOR?ALL?ENTRIES?IN?GT_STPO
????????WHERE?MATNR?=?GT_STPO-IDNRK.
??????LOOP?AT?GT_MBEW?INTO?GS_MBEW.
????????READ?TABLE?GT_T001K?TRANSPORTING?NO?FIELDS?WITH?KEY?BWKEY?=?GS_MBEW-BWKEY.
????????IF?SY-SUBRC?<>?0.
??????????DELETE?GT_MBEW.
????????ENDIF.
??????ENDLOOP.
????ENDIF.
??ELSE.
????SELECT?MATNR?BWKEY?STPRS?PEINH?FROM?MBEW
????????INTO?CORRESPONDING?FIELDS?OF?TABLE?GT_MBEW
????????FOR?ALL?ENTRIES?IN?GT_STPO
????????WHERE?MATNR?=?GT_STPO-IDNRK
??????????AND?BWKEY?=?'6888'.
??ENDIF.
ENDFORM.????????????????????"?RETRIVE_DATA
*&---------------------------------------------------------------------*
*&??????Form??PROCESS_DATA
*&---------------------------------------------------------------------*
*???????text
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?PROCESS_DATA?.
??DF_LVC_FCAT:"FIELDNAME?DATATYPE?INTTYPE?INTLEN?DECIMALS
????'MATNR'?'C'?'C'?18?0,"物料
????'MAKTX'?'C'?'C'?40?0,"物料描述
????'MEINS'?'C'?'C'?3?0,"基本單位
????'CHECK'?'C'?'C'?4?0,"價格檢查標識
????'LMEIN'?'C'?'C'?1?0."本報表價格單位
??IF?R1?=?'X'.
????IF?SWERKS?IS?NOT?INITIAL.
??????DF_LVC_FCAT:
????????SWERKS?'P'?'P'?11?2."工廠價格
????ELSE.
??????SORT?GT_T001K.
??????CLEAR?GS_T001K.
??????LOOP?AT?GT_T001K?INTO?GS_T001K.
????????DF_LVC_FCAT:
??????????GS_T001K-BWKEY?'P'?'P'?11?2."工廠價格
????????CLEAR?GS_T001K.
??????ENDLOOP.
????ENDIF.
??ELSE.
????DF_LVC_FCAT:
???????'6888'?'P'?'P'?11?2.?????????????????????????????????"6888工廠價格
??ENDIF.
??CALL?METHOD?CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
????EXPORTING
??????IT_FIELDCATALOG?=?IFC
????IMPORTING
??????EP_TABLE????????=?DNY_TAB.
??ASSIGN?DNY_TAB->*?TO $DNY_TAB>. ?CREATE?DATA?DNY_LINE?LIKE?LINE?OF $DNY_TAB>. ?ASSIGN?DNY_LINE->*?TO ?$DNY_WA>.
??CLEAR?GS_STPO.
??LOOP?AT?GT_STPO?INTO?GS_STPO.
????"物料
????ASSIGN?COMPONENT?'MATNR'?OF?STRUCTURE ?$DNY_WA>?TO ?$DNY_FIELD>. ????=?GS_STPO-IDNRK.
????"物料描述
????CLEAR?GS_MAKT.
????READ?TABLE?GT_MAKT?INTO?GS_MAKT?WITH?KEY?MATNR?=?GS_STPO-IDNRK.
????IF?SY-SUBRC?=?0.
??????ASSIGN?COMPONENT?'MAKTX'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
???????=?GS_MAKT-MAKTX.
????ENDIF.
????"基本單位
????CLEAR?GS_MARA.
????READ?TABLE?GT_MARA?INTO?GS_MARA?WITH?KEY?MATNR?=?GS_STPO-IDNRK.
????IF?SY-SUBRC?=?0.
??????CALL?FUNCTION?'CONVERSION_EXIT_CUNIT_OUTPUT'
????????EXPORTING
??????????INPUT????????????????=?GS_MARA-MEINS
*?????????LANGUAGE?????????????=?SY-LANGU
????????IMPORTING
*?????????LONG_TEXT????????????=
??????????OUTPUT???????????????=?GS_MARA-MEINS
*?????????SHORT_TEXT???????????=
*???????EXCEPTIONS
*?????????UNIT_NOT_FOUND???????=?1
*?????????OTHERS???????????????=?2
????????????????.
??????IF?SY-SUBRC?<>?0.
*?Implement?suitable?error?handling?here
??????ENDIF.
??????ASSIGN?COMPONENT?'MEINS'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
???????=?GS_MARA-MEINS.
????ENDIF.
????"本報表價格單位
????ASSIGN?COMPONENT?'LMEIN'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
?????=?'1'.
????"各工廠價格
????IF?R1?=?'X'.
??????IF?SWERKS?IS?INITIAL.
????????CLEAR:?GS_MBEW,GS_T001K,COUNTER.
????????SORT?GT_T001K.
????????LOOP?AT?GT_T001K?INTO?GS_T001K.
??????????ASSIGN?COMPONENT?GS_T001K-BWKEY?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
??????????LOOP?AT?GT_MBEW?INTO?GS_MBEW?WHERE?MATNR?=?GS_STPO-IDNRK?AND?BWKEY?=?GS_T001K-BWKEY.
?????????????=?GS_MBEW-STPRS?/?GS_MBEW-PEINH.
????????????IF??NE?0.
??????????????COUNTER?=?COUNTER?+?1.
????????????ENDIF.
??????????ENDLOOP.
??????????IF?SY-SUBRC?<>?0.
?????????????=?0.
??????????ENDIF.
????????ENDLOOP.
????????"價格檢查標識
????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>.
????????IF?COUNTER?=?LINES(?GT_T001K?)?AND?COUNTER?NE?0.
???????????=?'@5B@'."GREEN
????????ELSEIF?COUNTER?=?0.
???????????=?'@5C@'."RED
????????ELSE.
???????????=?'@5D@'."YELLOW
????????ENDIF.
??????ELSE.
????????CLEAR:GS_MBEW.
????????ASSIGN?COMPONENT?SWERKS?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>.
????????READ?TABLE?GT_MBEW?INTO?GS_MBEW?WITH?KEY?MATNR?=?GS_STPO-IDNRK?BWKEY?=?SWERKS.
????????IF?SY-SUBRC?=?0.
???????????=?GS_MBEW-STPRS?/?GS_MBEW-PEINH.
??????????"價格檢查標識
??????????IF??NE?0.
????????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE??$DNY_WA>?TO ?$DNY_FIELD>?.
?????????????=?'@5B@'."GREEN
??????????ELSE.
????????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
?????????????=?'@5C@'."RED
??????????ENDIF.
????????ELSE.
???????????=?0.
??????????"價格檢查標識
??????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE??$DNY_WA>?TO ?$DNY_FIELD>?.
???????????=?'@5C@'."RED
????????ENDIF.
??????ENDIF.
????ELSE.
??????CLEAR:?GS_MBEW.
??????ASSIGN?COMPONENT?'6888'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
??????READ?TABLE?GT_MBEW?INTO?GS_MBEW?WITH?KEY?BWKEY?=?'6888'?MATNR?=?GS_STPO-IDNRK.
??????IF?SY-SUBRC?=?0.
?????????=?GS_MBEW-STPRS?/?GS_MBEW-PEINH.
????????"價格檢查標識
????????IF??NE?0.
??????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>.
???????????=?'@5B@'."GREEN
????????ELSE.
??????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>?.
???????????=?'@5C@'."RED
????????ENDIF.
??????ELSE.
?????????=?0.
????????"價格檢查標識
????????ASSIGN?COMPONENT?'CHECK'?OF?STRUCTURE???$DNY_WA>?TO ?$DNY_FIELD>.
?????????=?'@5C@'.
??????ENDIF.
????ENDIF.
????APPEND???$DNY_WA>?TO?$DNY_TAB>.??.
????CLEAR?GS_STPO.
??ENDLOOP.
ENDFORM.????????????????????"?PROCESS_DATA
*&---------------------------------------------------------------------*
*&??????Form??PROCESS_OUTPUT
*&---------------------------------------------------------------------*
*???????text
*----------------------------------------------------------------------*
*??-->??p1????????text
*??<--??p2????????text
*----------------------------------------------------------------------*
FORM?PROCESS_OUTPUT?.
??M_ALV_FIELDCAT:"FIELDNAME?HEADING?OUTPUTLEN?ICON
????????'MATNR'?'物料'?'18'?'',
????????'MAKTX'?'物料描述'?'40'?'',
????????'MEINS'?'基本單位'?'4'?'',
????????'CHECK'?'價格檢查標識'?'4'?'X',
????????'LMEIN'?'本報表價格單位'?'4'?''.
??IF?R1?=?'X'.
????GV_TAB_DESC??=?CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( $DNY_TAB>?). ???GV_STC_DESC??=?GV_TAB_DESC->GET_TABLE_LINE_TYPE(?).
????DATA:?LV_STR?TYPE?STRING.
????LOOP?AT?GV_STC_DESC->COMPONENTS?ASSIGNING $FS_TAB>. ?????IF?$FS_TAB>-NAME?EQ?'MATNR' ?????????OR?$FS_TAB>-NAME?EQ?'MAKTX' ?????????OR?$FS_TAB>-NAME?EQ?'MEINS' ?????????OR?$FS_TAB>-NAME?EQ?'CHECK' ?????????OR?$FS_TAB>-NAME?EQ?'LMEIN'. ???????CONTINUE.
??????ENDIF.
??????CLEAR?LV_STR.
??????LV_STR?=?$FS_TAB>-NAME?&&?'-工廠價格'. ?????M_ALV_FIELDCAT:
???????????$FS_TAB>-NAME?LV_STR?'15'?''. ???ENDLOOP.
??ELSE.
????M_ALV_FIELDCAT:
?????????'6888'?'6888-工廠價格'?'15'?''.
??ENDIF.
****************************ALV?LAYOUT******************************************
??GS_LAYOUT-COLWIDTH_OPTIMIZE?=?'X'."寬度自動優化
??GS_LAYOUT-ZEBRA?????????????=?'X'."斑馬線
**********************TOP?OF?PAGR************************************************
??"Type?H?is?used?to?display?headers?i.e.?big?font
??CLEAR?GS_TOP.
??GS_TOP-TYP?=?'H'.
??IF?R1?=?'X'.
????GS_TOP-INFO?=?'投標報價主機BOM價格檢查'.
??ELSE.
????GS_TOP-INFO?=?'投標報價項目物資相關BOM物料檢查'.
??ENDIF.
??APPEND?GS_TOP?TO?GT_TOP.
??"Type?S?is?used?to?display?key?and?value?pairs
??IF?R1?=?'X'.
????CLEAR?GS_TOP.
????GS_TOP-TYP?=?'S'.
????GS_TOP-KEY?=?'紅燈:'.
????GS_TOP-INFO?=?'所有工廠價格為0'.
????APPEND?GS_TOP?TO?GT_TOP.
????CLEAR?GS_TOP.
????GS_TOP-TYP?=?'S'.
????GS_TOP-KEY?=?'黃燈:'.
????GS_TOP-INFO?=?'一個工廠有價格不為0(排除綠燈條件)'.
????APPEND?GS_TOP?TO?GT_TOP.
????CLEAR?GS_TOP.
????GS_TOP-TYP?=?'S'.
????GS_TOP-KEY?=?'綠燈:'.
????GS_TOP-INFO?=?'所有工廠價格都不為0'.
????APPEND?GS_TOP?TO?GT_TOP.
????CLEAR?GS_TOP.
????GS_TOP-TYP?=?'S'.
????GS_TOP-KEY?=?'備注:'.
????GS_TOP-INFO?=?'只對所有主機工廠檢查,且價格單位均為1'.
????APPEND?GS_TOP?TO?GT_TOP.
??ELSE.
????CLEAR?GS_TOP.
????GS_TOP-TYP?=?'S'.
????GS_TOP-KEY?=?'備注:'.
????GS_TOP-INFO?=?'只檢查6888工廠物料價格'.
????APPEND?GS_TOP?TO?GT_TOP.
??ENDIF.
??"Type?A?is?used?to?display?italic?font
*??CLEAR?GS_TOP.
*??GS_TOP-TYP?=?'A'.
*??GS_TOP-INFO?=?SY-DATUM.
*??APPEND?GS_TOP?TO?GT_TOP.
*****************************ALV*****************************************
??CALL?FUNCTION?'REUSE_ALV_GRID_DISPLAY'
????EXPORTING
??????I_CALLBACK_PROGRAM?????=?SY-REPID
??????I_CALLBACK_TOP_OF_PAGE?=?'TOP_OF_PAGE'
??????IS_LAYOUT??????????????=?GS_LAYOUT
??????IT_FIELDCAT????????????=?GT_FIELD
??????I_DEFAULT??????????????=?'X'
??????I_SAVE?????????????????=?'A'
????TABLES
??????T_OUTTAB???????????????= $?DNY_TAB>?
????EXCEPTIONS
??????PROGRAM_ERROR??????????=?1
??????OTHERS?????????????????=?2.
??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.????????????????????"?PROCESS_OUTPUT
*&---------------------------------------------------------------------*
*&??????Form??top_of_page
*&---------------------------------------------------------------------*
FORM?TOP_OF_PAGE.
??CALL?FUNCTION?'REUSE_ALV_COMMENTARY_WRITE'
????EXPORTING
??????IT_LIST_COMMENTARY?=?GT_TOP.
ENDFORM.????????????????????"top_of_page
*&---------------------------------------------------------------------*
*&??????Form??FOO_BOM
*&---------------------------------------------------------------------*
*???????text
*----------------------------------------------------------------------*
*??????<--P_GT_STPO??text
*----------------------------------------------------------------------*
FORM?FOO_BOM??CHANGING?P_GT_STPO?LIKE?GT_STPO.
??IF?P_GT_STPO?IS?INITIAL.
????MESSAGE?TEXT-008?TYPE?'I'.
????RETURN.
??ENDIF.
??CLEAR:
????????LT_MAST,
????????LS_MAST,
????????LT_STPO,
????????LS_STPO.
??IF?SWERKS?IS?NOT?INITIAL.
????SELECT?MATNR?WERKS?STLAN?STLNR
??????FROM?MAST
??????INTO?CORRESPONDING?FIELDS?OF?TABLE?LT_MAST
??????FOR?ALL?ENTRIES?IN?P_GT_STPO
??????WHERE?MATNR?=?P_GT_STPO-IDNRK
????????AND?WERKS?EQ?SWERKS
????????AND?STLAN?EQ?P1.
??ELSE.
????SELECT?MATNR?WERKS?STLAN?STLNR
??????FROM?MAST
??????INTO?CORRESPONDING?FIELDS?OF?TABLE?LT_MAST
??????FOR?ALL?ENTRIES?IN?P_GT_STPO
??????WHERE?MATNR?=?P_GT_STPO-IDNRK
????????AND?STLAN?EQ?P1.
??ENDIF.
??IF?LT_MAST?IS?NOT?INITIAL.
????SELECT?STLNR?STLTY?STLKN?STPOZ?IDNRK
??????FROM?STPO
??????INTO?CORRESPONDING?FIELDS?OF?TABLE?LT_STPO
??????FOR?ALL?ENTRIES?IN?LT_MAST
??????WHERE?STLTY?EQ?'M'
????????AND?STLNR?=?LT_MAST-STLNR.
????LOOP?AT?LT_MAST?INTO?LS_MAST.
??????DELETE?P_GT_STPO?WHERE?IDNRK?=?LS_MAST-MATNR.
????ENDLOOP.
????APPEND?LINES?OF?LT_STPO?TO?P_GT_STPO.
????PERFORM?FOO_BOM?CHANGING?P_GT_STPO.
??ENDIF.
ENDFORM.????????????????????"?FOO_BOM
總結
以上是生活随笔為你收集整理的SAP ABAP ALV构建动态输出列与构建动态内表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ALV动态列Demo
- 下一篇: 动态隐藏ALV的行和列