可配置BOM組件特性查詢


REPORT  zpp_rp026.
TABLES: mara,mast.

TYPE-POOLS: slis.
DATA: fieldcat TYPE lvc_t_fcat,
      fieldcat_ln TYPE lvc_s_fcat,
       it_sort TYPE lvc_t_sort,
      wa_sort TYPE lvc_s_sort,
      g_user_command TYPE slis_formname VALUE 'USER_COMMAND',
      git_events TYPE slis_t_event.    "ALV 事件
DATA : ps_layout TYPE lvc_s_layo.

DATA:BEGIN OF itab OCCURS 0,
  objek LIKE inob-objek,   "物料
  maktx LIKE makt-maktx,
  stlnr LIKE mast-stlnr,
  idnrk LIKE stpo-idnrk,
  posnr LIKE stpo-posnr,
  knobj LIKE stpo-knobj,
  idktx LIKE makt-maktx,
  knnum LIKE cuob-knnum,
  adzhl LIKE cuob-adzhl,
  atbez LIKE cabnt-atbez,   "特性描述
  atwtb LIKE cawnt-atwtb,  "特性值文本
  atinn LIKE cuxref-atinn,  "特性
  atwrt LIKE cuxref-atwrt,  "特性值
  knblk LIKE cukn-knblk,
  sel(1),
END OF itab.
DATA:itab1 LIKE itab OCCURS WITH HEADER LINE.

DATA:BEGIN OF tx_itab OCCURS 0,
     knnum LIKE cuob-knnum,
     atinn LIKE cuxref-atinn,
     atwrt LIKE cuxref-atwrt,
     atbez LIKE cabnt-atbez,   "特性描述
     atwtb LIKE cawnt-atwtb,  "特性值文本
END OF tx_itab.

DATA:BEGIN OF tz1 OCCURS 0,
  atinn LIKE cabn-atinn,  "內部特性
  atnam LIKE cabn-atnam,   "特徵名稱
  atwrt LIKE cawn-atwrt,   "特性值
  atwtb LIKE cawnt-atwtb,  "特性值文本
  atbez LIKE cabnt-atbez,   "特徵描述
END OF tz1.
DATA:tz2 LIKE tz1 OCCURS WITH HEADER LINE.

SELECTION-SCREEN:BEGIN OF BLOCK b1 WITH FRAME TITLE t1.
PARAMETERS:p_werks LIKE  mast-werks  OBLIGATORY DEFAULT 'PS01',
           p_stlan LIKE mast-stlan OBLIGATORY DEFAULT '1'.
SELECT-OPTIONS: s_matnr FOR mara-matnr.
*PARAMETERS:p_matnr LIKE mara-matnr OBLIGATORY.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN:COMMENT 1(31t2.
PARAMETERS:p_tx1 LIKE cawn-atwrt AS LISTBOX VISIBLE LENGTH 18.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN: BEGIN OF LINE.
SELECTION-SCREEN:COMMENT 1(31t3.
PARAMETERS:p_tx2 LIKE cawn-atwrt AS LISTBOX VISIBLE LENGTH 18.
SELECTION-SCREEN: END OF LINE.
SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.
  t1 '選擇條件'.
  t2 '特性1'.
  t3 '特性2'.
  CLEAR:p_tx1,p_tx2.

AT SELECTION-SCREEN OUTPUT.
  PERFORM set_data.

START-OF-SELECTION.
  PERFORM get_data.

END-OF-SELECTION.
  PERFORM write_data.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_data .
  SELECT inob~objek  mast~stlnr stpo~idnrk
          stpo~posnr stpo~knobj cuob~knnum adzhl
   INTO CORRESPONDING FIELDS OF TABLE itab1
   FROM inob
   JOIN mast ON inob~objek mast~matnr
   JOIN stpo ON mast~stlnr stpo~stlnr
   LEFT JOIN cuob ON stpo~knobj cuob~knobj
   WHERE inob~objek in s_matnr
     AND mast~werks p_werks
     AND mast~stlan p_stlan
     AND inob~obtab 'MARA'
     AND inob~klart '300'.
  LOOP AT itab1.
    SELECT SINGLE cukn~knblk INTO itab1-knblk
    FROM cukn
    WHERE cukn~knnum itab1-knnum
      AND cukn~adzhl itab1-adzhl.
    MODIFY itab1.
  ENDLOOP.

  IF itab1[] IS NOT INITIAL.
    SELECT cuxref~knnum cuxref~atinn cuxref~atwrt
           cabnt~atbez cawnt~atwtb
     INTO CORRESPONDING FIELDS OF TABLE tx_itab
     FROM cuxref

     JOIN cawn ON cawn~atinn cuxref~atinn
          AND cawn~atwrt cuxref~atwrt
     JOIN cawnt ON cawnt~atinn cawn~atinn
                AND cawnt~atzhl cawn~atzhl
                AND cawnt~spras sy-langu
      JOIN cabnt ON cabnt~atinn cuxref~atinn
               AND cabnt~spras sy-langu
      FOR ALL entries IN itab1
      WHERE cuxref~knnum itab1-knnum.
  ENDIF.

  LOOP AT itab1.
    SELECT SINGLE maktx INTO itab1-maktx
    FROM makt
    WHERE matnr itab1-objek
      AND spras sy-langu.

    SELECT SINGLE maktx INTO itab1-idktx
    FROM makt
    WHERE matnr itab1-idnrk
      AND spras sy-langu.

    MODIFY itab1.
  ENDLOOP.

  LOOP AT itab1.
    MOVE-CORRESPONDING itab1 TO itab.
    itab-knblk itab-knblk+6.
    CONDENSE itab-knblk.
    LOOP AT tx_itab WHERE knnum itab-knnum.
      itab-atinn tx_itab-atinn.
      itab-atwrt tx_itab-atwrt.
      itab-atbez tx_itab-atbez.
      itab-atwtb tx_itab-atwtb.
      APPEND itab.
    ENDLOOP.
    IF sy-subrc NE 0.
      APPEND itab.
    ENDIF.
  ENDLOOP.
  SORT itab  BY objek posnr.

  IF p_tx1 IS NOT INITIAL.
    DELETE tz1 WHERE atwrt NE p_tx1.
  ENDIF.
  IF p_tx2 IS NOT INITIAL.
    DELETE tz2 WHERE atwrt NE p_tx2.
  ENDIF.
  LOOP AT tz1.
    LOOP AT itab WHERE atwrt tz1-atwrt AND atinn tz1-atinn.
      itab-sel 'X'.
      MODIFY itab.
    ENDLOOP.
  ENDLOOP.
  LOOP AT tz2.
    LOOP AT itab WHERE atwrt tz2-atwrt AND atinn tz2-atinn.
      itab-sel 'X'.
      MODIFY itab.
    ENDLOOP.
  ENDLOOP.
  IF  p_tx1 IS NOT INITIAL OR p_tx2 IS NOT INITIAL.
    DELETE itab WHERE sel NE 'X' AND knobj IS NOT INITIAL.
  ENDIF.
ENDFORM.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  WRITE_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM write_data .
  CLEAR fieldcat.
  REFRESH fieldcat.

  DATA : col_pos TYPE VALUE 1.
  ps_layout-zebra             'X'.
  ps_layout-cwidth_opt        'X'.
*----------------------------------------------------------------------*
*& Rerference
*& 1_col_pos 2_fieldname 4_scrtext_l
*----------------------------------------------------------------------*
  PERFORM field USING col_pos 'OBJEK'  '物料' 'X'.
  PERFORM field USING col_pos 'MAKTX'  '物料描述' ''.
  PERFORM field USING col_pos 'POSNR' '項目' 'X'.
  PERFORM field USING col_pos 'IDNRK' '組件編碼' 'X'.
  PERFORM field USING col_pos 'IDKTX' '組件描述' ''.
  PERFORM field USING col_pos 'ATINN'  '特性' ''.
  PERFORM field USING col_pos 'ATBEZ'  '特性描述' ''.
  PERFORM field USING col_pos 'ATWRT'  '特性值' ''.
  PERFORM field USING col_pos 'ATWTB'  '特性值文本' ''.
  PERFORM field USING col_pos 'KNBLK'  'Source Code' ''.

  REFRESH it_sort.
  CLEAR wa_sort.
  wa_sort-spos '1'.
  wa_sort-fieldname 'OBJEK'.
  wa_sort-up 'X'.
  APPEND wa_sort TO it_sort.
  CLEAR wa_sort.
  wa_sort-spos '2'.
  wa_sort-fieldname 'POSNR'.
  wa_sort-up 'X'.
  APPEND wa_sort TO it_sort.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program      sy-cprog
      is_layout_lvc           ps_layout
      it_fieldcat_lvc         fieldcat
*      it_sort_lvc             = it_sort
      i_callback_user_command 'USER_COMMAND'
    TABLES
      t_outtab                itab
    EXCEPTIONS
      program_error           1
      OTHERS                  2.
ENDFORM.                    " WRITE_DATA
*&---------------------------------------------------------------------*
*&      Form  FIELD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_COL_POS  text
*      -->P_0191   text
*      -->P_0192   text
*      -->P_ENDFORM  text
*----------------------------------------------------------------------*
FORM field  USING p_col_pos         " 1
                            p_fieldname       " 2
                            p_seltext_l
                            p_zero.      " 4.
  fieldcat_ln-col_pos       p_col_pos.
  fieldcat_ln-fieldname     p_fieldname.
  fieldcat_ln-reptext       p_seltext_l.
  fieldcat_ln-no_zero      p_zero.
  APPEND fieldcat_ln TO fieldcat.
  p_col_pos p_col_pos + 1.
  CLEAR: fieldcat_ln.
ENDFORM.                    " FIELD
*&---------------------------------------------------------------------*
*&      Form  usercommand
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM user_command   USING r_ucomm LIKE sy-ucomm
                     rs_selfield TYPE slis_selfield.
  DATA:str(2),
       line TYPE i.
  CASE r_ucomm.
    WHEN '&IC1'.
      CASE rs_selfield-sel_tab_field.
        WHEN  '1-OBJEK'.
          SET PARAMETER ID 'MAT' FIELD rs_selfield-value.
          SET PARAMETER ID 'MXX' FIELD 'C'.
          CALL TRANSACTION 'MM03' AND SKIP FIRST SCREEN.
      ENDCASE.
  ENDCASE.
ENDFORM.                    "user_command
*&---------------------------------------------------------------------*
*&      Form  SET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_data .
  TYPE-POOLS: vrm.
  DATA:TYPE i,
       list TYPE vrm_values, "list box的值
       list1 TYPE vrm_values, "list box的值
       value LIKE LINE OF list."list box的結構
  t2 '特性1'.
  t3 '特性2'.

  DATA:tx1 LIKE tz1 OCCURS WITH HEADER LINE.
  DATA:tx2 LIKE tz1 OCCURS WITH HEADER LINE.

  REFRESH:list,list1,tz1,tz2.
  IF s_matnr-low IS NOT INITIAL.
    SELECT cawn~atinn cawn~atwrt cawnt~atwtb cabnt~atbez
    INTO CORRESPONDING FIELDS OF TABLE tx1
    FROM inob
    JOIN kssk ON kssk~objek inob~cuobj
             AND kssk~klart '300'
    JOIN ksml ON ksml~clint kssk~clint
             AND ksml~adzhl kssk~adzhl
    JOIN cawn ON cawn~atinn ksml~imerk
             AND cawn~adzhl ksml~adzhl
    JOIN cawnt ON cawnt~atinn cawn~atinn
                   AND cawnt~atzhl cawn~atzhl
                   AND cawnt~spras '1'
    JOIN cabnt ON cabnt~atinn cawn~atinn
              AND cabnt~spras '1'
    WHERE inob~objek s_matnr-low
      AND inob~obtab 'MARA'
      AND inob~klart '300'.
    tx2[] tx1[].
    SORT tx2 BY atinn.
    DELETE ADJACENT DUPLICATES FROM tx2 COMPARING atinn.

    LOOP AT tx2.
      n sy-tabix.
      IF 1.
        t2 tx2-atbez.
      ELSE.
        t3 tx2-atbez.
      ENDIF.
      LOOP AT tx1 WHERE atinn tx2-atinn.
        CLEAR value.
        value-key tx1-atwrt.
        value-text tx1-atwtb.
        IF 1.
          APPEND value TO list.
          MOVE-CORRESPONDING tx1 TO tz1.
          APPEND tz1.
        ELSE.
          APPEND value TO list1.
          MOVE-CORRESPONDING tx1 TO tz2.
          APPEND tz2.
        ENDIF.
      ENDLOOP.
    ENDLOOP.
    CALL FUNCTION 'VRM_SET_VALUES'      "將內表中的數據,插入到下拉列表框中
        EXPORTING
          id      'P_TX1'
          values list.

    CALL FUNCTION 'VRM_SET_VALUES'      "將內表中的數據,插入到下拉列表框中
       EXPORTING
         id      'P_TX2'
         values list1.

  ENDIF.

ENDFORM.                    " SET_DATA
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章