************************************************************************
* 程 序 名:ZMMR501
* 程序描述:资讯记录查询
* 事务代码:xxx
************************************************************************
* 修改日志
************************************************************************
* 日期     版本 修改人       描述
* -------- ---- ------------ -------------------------------------------
* 20221117 1.0  Amell        创建程序
*
************************************************************************
REPORT zmmr501 NO STANDARD PAGE HEADING
                 MESSAGE-ID 00 LINE-SIZE 177 LINE-COUNT 200.
***********************************************************************
* Tables Definitions
************************************************************************
*TABLES:.

TABLES: eina,eine,konp,a017,lfa1,makt,marc.
************************************************************************
* Data Definitions
************************************************************************

DATA: BEGIN OF ty_data ,
        lifnr      LIKE a017-lifnr,  "供應商帳戶號碼
        name1      LIKE lfa1-name1, " 供应商简称
        lfa1_sortl LIKE lfa1-sortl, " 供应商搜索条件
        matnr      LIKE a017-matnr,  "物料號碼
        maktx      LIKE makt-maktx, "物料说明
        ekorg      LIKE eine-ekorg,  "採購組織
        werks      LIKE eine-werks,  "工廠
        esokz      LIKE a017-esokz,  "採購資訊記錄種類
        txz01      LIKE eina-txz01, "短文
        sortl      LIKE eina-sortl, "排序条件
        datbi      LIKE a017-datbi,  "條件記錄的有效期限
        datab      LIKE a017-datab,  "條件記錄的生效日期
*kschl LIKE konp-kschl,  "條件類型
        knumh      LIKE konp-knumh,  "條件記錄號碼
*kopos LIKE konp-kopos,  "條件的序號
*kbetr LIKE konp-kbetr,  "條件金額或百分比
*konwa LIKE konp-konwa,  "條件單位
*kpein LIKE konp-kpein,  "條件定價單位
*mwsk1 LIKE konp-mwsk1,  "進項稅/銷項稅碼
*loevm_ko LIKE konp-loevm_ko, "條件項目的刪除指示碼
        infnr      LIKE eina-infnr,  "採購資訊記錄的號碼
        matkl      LIKE eina-matkl,  "物料群組
        loekz      LIKE eina-loekz,  "完整采购资讯记录
        loekz1     LIKE eine-loekz,  "完整采购资讯记录
        erdat      LIKE eina-erdat,  "記錄建立日期
        ernam      LIKE eina-ernam,  "物件建立者的姓名
        mahn1      LIKE eina-mahn1,  "第一次催單天數
        mahn2      LIKE eina-mahn2,  "第二次催單天數
        mahn3      LIKE eina-mahn3,  "第三次催單天數
        urzla      LIKE eina-urzla,  "原產地證明的發貨國家
        lmein      LIKE eina-lmein,  "基礎計量單位
        ekgrp      LIKE eine-ekgrp,  "採購群組
        waers      LIKE eine-waers,  "幣別碼
        minbm      LIKE eine-minbm,  "最小採購單數量
        norbm      LIKE eine-norbm,  "標準採購單數量
        aplfz      LIKE eine-aplfz,  "計劃交貨時間
        bstyp      LIKE eine-bstyp,  "採購文件種類
        ebeln      LIKE eine-ebeln,  "採購文件號碼
        ebelp      LIKE eine-ebelp,  "採購文件的項目號碼
        datlb      LIKE eine-datlb,  "文件的日期
        netpr      LIKE eine-netpr,  "採購資訊記錄中的淨價
        peinh      LIKE eine-peinh,  "價格單位
        bprme      LIKE eine-bprme,  "採購單的計價單位
        prdat      LIKE eine-prdat,  "價格有效期限
        mwskz      LIKE eine-mwskz,  "進項稅/銷項稅碼
        aut_source LIKE eine-aut_source,  "與自動採購相關
        lvorm      LIKE marc-lvorm, "为物料加注删除旗标
        dismm      LIKE marc-dismm, "MRP 类型
        dispo      LIKE marc-dispo, "MRP 控制员
        plifz      LIKE marc-plifz, "MRP 计划交货天数
        webaz      LIKE marc-webaz, "收货作业处理时间
        beskz      LIKE marc-beskz, " 采购类型
        sobsl      LIKE marc-sobsl, " 特殊采购类型
      END OF ty_data.

TYPES: BEGIN OF ty_konp, "构建条件值结构
         kschl    LIKE konp-kschl,  "條件類型
         krech    LIKE konp-krech, "计算类型
         knumh    LIKE konp-knumh,  "條件記錄號碼
         kopos    LIKE konp-kopos,  "條件的序號
         kbetr    LIKE konp-kbetr,  "條件金額或百分比
         konwa    LIKE konp-konwa,  "條件單位
         kpein    LIKE konp-kpein,  "條件定價單位
*         mwsk1    LIKE konp-mwsk1,  "進項稅/銷項稅碼
         loevm_ko LIKE konp-loevm_ko, "條件項目的刪除指示碼
         kappl    LIKE konp-kappl, "应用程序
       END OF ty_konp,
       BEGIN OF ty_t685t, "构建条件类型说明结构
         spras LIKE t685t-spras, "语言
*        kvewe LIKE t685t-kvewe, "用途
         kappl LIKE t685t-kappl, "程序
         kschl LIKE t685t-kschl, "条件类型
         vtext LIKE t685t-vtext, "条件类型名称
       END OF ty_t685t,
       BEGIN OF ty_dd03l,
         tabname    LIKE dd03l-tabname , "表名
         fieldname  LIKE dd03l-fieldname , "栏位名称
         as4local   LIKE dd03l-as4local , "表格状态
*        as4vers     LIKE dd03l-as4vers , "版本
         position   LIKE dd03l-position , "栏位位置
         keyflag    LIKE dd03l-keyflag , "主键标识
         rollname   LIKE dd03l-rollname , "資料元素
         checktable LIKE dd03l-checktable , "检查表(栏位值的来源)
         inttype    LIKE dd03l-inttype , "字段 類型
         intlen     LIKE dd03l-intlen , "二进制栏位长度
         reftable   LIKE dd03l-reftable , "參考表
         reffield   LIKE dd03l-reffield , "參考欄位
         datatype   LIKE dd03l-datatype , "資料類型
         leng       LIKE dd03l-leng , "字元數(栏位长度)
         decimals   LIKE dd03l-decimals , "小數位
         domname    LIKE dd03l-domname , "範圍名稱
         ddlanguage LIKE dd04t-ddlanguage , "語言碼
*        as4local    LIKE dd04t-as4local , "资料元素啟動狀態
*        as4vers     LIKE dd04t-as4vers , "资料元素版本
         ddtext     LIKE dd04t-ddtext , "說明 R/3 資源庫物件的短文
         reptext    LIKE dd04t-reptext , "標題
         scrtext_s  LIKE dd04t-scrtext_s , "Short Field Label
         scrtext_m  LIKE dd04t-scrtext_m , "中欄位標籤
         scrtext_l  LIKE dd04t-scrtext_l , "長欄位標籤
       END OF ty_dd03l.

DATA:gt_konp  TYPE TABLE OF  ty_konp, "条件值明细
     gt_t685t TYPE TABLE OF ty_t685t, "条件类型说明
     gt_dd03l TYPE TABLE OF ty_dd03l, "栏位说明
     gt_data  LIKE TABLE OF ty_data, "资讯记录一般资讯
     wa_t685t TYPE  ty_t685t,
     wa_data  LIKE  ty_data.


DATA: wa_layout   TYPE slis_layout_alv,
      gt_fieldcat TYPE slis_t_fieldcat_alv , "with header line.
      wa_fieldcat TYPE slis_fieldcat_alv.

*--->动态表变量
FIELD-SYMBOLS:<gt_table> TYPE STANDARD TABLE,
              <g_wa>,
              <g_field>.

DATA: gt_table     TYPE REF TO data,
      gt_structure TYPE lvc_t_fcat.
************************************************************************
* Includes Module
************************************************************************

************************************************************************
* Selection Screen
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-b01.

PARAMETERS:c_pro    AS CHECKBOX DEFAULT 'X', " 包含制程委外
           c_weight AS CHECKBOX DEFAULT 'X'. " 查看有效资料

PARAMETERS:p_ekorg LIKE eine-ekorg DEFAULT '2000' OBLIGATORY."采购组织


SELECT-OPTIONS:
      s_werks FOR eine-werks,
      s_loev_k FOR konp-loevm_ko DEFAULT '' ," 条件是否删除
      s_loekz FOR eina-loekz DEFAULT '',"完整采购资讯记录
      s_loekz1 FOR eine-loekz DEFAULT ''," 采购组织上删除旗标
      s_esokz FOR a017-esokz,"采购资讯记录种类
      s_infnr FOR eina-infnr,
      s_matnr FOR a017-matnr,
      s_lifnr FOR a017-lifnr,
      s_datbi FOR a017-datbi,
      s_datab FOR a017-datab,
      s_kschl FOR a017-kschl,
      s_matkl FOR eina-matkl.  "物料群組

SELECTION-SCREEN END OF BLOCK b1.

************************************************************************
* Initialization                  初始化事件
************************************************************************
INITIALIZATION.

************************************************************************
* At Selection Screen             PAI事件
************************************************************************
AT SELECTION-SCREEN.

************************************************************************
* At Selection Screen Output      PBO事件
************************************************************************
AT SELECTION-SCREEN OUTPUT.

************************************************************************
* Report Format                   报表格式
************************************************************************
TOP-OF-PAGE.

END-OF-PAGE.

************************************************************************
* Main Process                    主要逻辑
************************************************************************
START-OF-SELECTION.
  PERFORM get_data.
  PERFORM display_data.

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM get_data .

  "查询工厂不为空的资讯记录
  SELECT a017~lifnr,a017~matnr,eine~ekorg,
            lfa1~name1,lfa1~sortl AS lfa1_sortl,
            a017~esokz,a017~datbi,
            a017~datab,a017~knumh,
            eina~infnr,eina~matkl,eina~loekz,
            eina~urzla,eina~lmein,eina~mahn1,
            eina~mahn2,eina~mahn3,
            eine~erdat,
            eine~ekgrp,eine~waers,eine~minbm,
            eine~bstyp,eine~ebeln,eine~ernam,eine~aplfz,
            eine~ebelp,eine~datlb,eine~netpr,
            eine~peinh, eine~bprme,eine~prdat,
            eine~mwskz,eine~aut_source,
            eine~norbm,eine~werks,eine~loekz AS loekz1
   FROM a017
   INNER JOIN eina ON eina~matnr EQ a017~matnr AND
                                  eina~lifnr EQ a017~lifnr
   INNER  JOIN eine ON eine~infnr EQ eina~infnr AND
                                eine~ekorg EQ a017~ekorg  AND
                                eine~esokz EQ a017~esokz AND
                                eine~werks EQ a017~werks
   INNER JOIN lfa1 ON lfa1~lifnr EQ a017~lifnr
   INTO  CORRESPONDING FIELDS OF TABLE @gt_data
   WHERE a017~ekorg EQ @p_ekorg AND
               a017~werks IN @s_werks AND
               a017~lifnr IN @s_lifnr AND
               a017~matnr IN @s_matnr AND
               a017~esokz IN @s_esokz AND
               a017~datbi IN @s_datbi AND
               a017~datab IN @s_datab AND
               eina~infnr IN @s_infnr AND
               eina~matnr IN @s_matnr AND
               eina~loekz IN @s_loekz AND
               eine~loekz IN @s_loekz1 AND
               eine~esokz IN @s_esokz.
*               eina~matkl IN @s_matkl.

  "工厂为空的采购咨询记录
  SELECT a018~lifnr,a018~matnr,eine~ekorg,
              lfa1~name1,lfa1~sortl AS lfa1_sortl,
              a018~esokz,a018~datbi,
              a018~datab,a018~knumh,
              eina~infnr,eina~matkl,eina~loekz,
              eina~urzla,eina~lmein,eina~mahn1,
              eina~mahn2,eina~mahn3,
              eine~erdat,
              eine~ekgrp,eine~waers,eine~minbm,
              eine~bstyp,eine~ebeln,eine~ernam,eine~aplfz,
              eine~ebelp,eine~datlb,eine~netpr,
              eine~peinh, eine~bprme,eine~prdat,
              eine~mwskz,eine~aut_source,
              eine~norbm,eine~werks,eine~loekz AS loekz1
     FROM a018
     INNER JOIN eina ON eina~matnr EQ a018~matnr AND
                                    eina~lifnr EQ a018~lifnr
     INNER  JOIN eine ON eine~infnr EQ eina~infnr AND
                                  eine~ekorg EQ a018~ekorg  AND
                                  eine~esokz EQ a018~esokz "AND
*                                eine~werks EQ a018~werks
     INNER JOIN lfa1 ON lfa1~lifnr EQ a018~lifnr
     APPENDING CORRESPONDING FIELDS OF TABLE @gt_data
     WHERE a018~ekorg EQ @p_ekorg AND
*               a018~werks IN @s_werks AND
                 a018~lifnr IN @s_lifnr AND
                 a018~matnr IN @s_matnr AND
                 a018~esokz IN @s_esokz AND
                 a018~datbi IN @s_datbi AND
                 a018~datab IN @s_datab AND
                 eina~infnr IN @s_infnr AND
                 eina~matnr IN @s_matnr AND
                 eina~loekz IN @s_loekz AND
                 eine~loekz IN @s_loekz1 AND
                 eine~esokz IN @s_esokz.
*                 eina~matkl IN @s_matkl.



  "-->制程委外采购资讯记录查询
  IF c_pro EQ 'X'.
    SELECT a025~lifnr,eine~ekorg,
        lfa1~name1,lfa1~sortl AS lfa1_sortl,
        a025~esokz,a025~datbi,
        a025~datab,a025~knumh,
        eina~infnr,eina~matkl,eina~loekz,
        eina~urzla,eina~lmein,eina~mahn1,
        eina~mahn2,eina~mahn3,
        eina~erdat,eina~txz01,eina~sortl,
        eine~ekgrp,eine~waers,eine~minbm,
        eine~bstyp,eine~ebeln,eine~ernam,eine~aplfz,
        eine~ebelp,eine~datlb,eine~netpr,
        eine~peinh, eine~bprme,eine~prdat,
        eine~mwskz,eine~aut_source,
        eine~norbm,eine~werks,eine~loekz AS loekz1
      FROM a025
      INNER JOIN eina ON eina~infnr EQ a025~infnr AND
                                    eina~lifnr EQ a025~lifnr
      INNER JOIN eine ON eine~infnr EQ eina~infnr AND
                                  eine~ekorg EQ a025~ekorg  AND
                                  eine~werks EQ a025~werks AND
                                  eine~ekorg EQ a025~ekorg AND
                                  eine~esokz EQ a025~esokz
      INNER JOIN lfa1 ON lfa1~lifnr EQ a025~lifnr
      APPENDING  CORRESPONDING FIELDS OF TABLE @gt_data
      WHERE a025~ekorg EQ @p_ekorg AND
                 a025~werks IN @s_werks AND
                 a025~lifnr IN @s_lifnr AND
                 a025~esokz IN @s_esokz AND
                 a025~datbi IN @s_datbi AND
                 a025~datab IN @s_datab AND
                 eina~infnr IN @s_infnr AND
                 eina~matnr IN @s_matnr AND
                 eina~loekz IN @s_loekz AND
                 eine~loekz IN @s_loekz1 AND
                 eine~esokz IN @s_esokz AND
                 eina~matkl IN @s_matkl.

  ENDIF.

  "获取条件值
  SELECT konp~knumh, konp~krech,konp~kopos,
              konp~kbetr, konp~konwa ,konp~kpein,
              konp~loevm_ko, konp~kappl,konp~kschl
    FROM @gt_data AS a
    INNER JOIN  konp ON konp~knumh EQ a~knumh
    WHERE loevm_ko EQ @space
    INTO CORRESPONDING FIELDS OF TABLE @gt_konp.


  "条件类型
  MOVE-CORRESPONDING gt_konp[] TO gt_t685t[].

  "排序
  SORT: gt_data BY infnr datbi  DESCENDING,
            gt_t685t BY kschl,
            gt_konp BY knumh kschl.

  "条件类型去重
  DELETE ADJACENT DUPLICATES FROM gt_t685t COMPARING kschl.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form DISPLAY_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM display_data .
*--> dynamic table structure and generate ALV fieldcat
  PERFORM create_structure.

*--> Create dynamic table
  PERFORM create_dynamic_table.

*--> input data to dynamic table
  PERFORM process_data.

**--> ALV Layout Setting
  wa_layout-colwidth_optimize = 'X'. " 最佳欄寬
  wa_layout-zebra = 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program = sy-repid
      is_layout          = wa_layout
      it_fieldcat        = gt_fieldcat
*     i_callback_pf_status_set = 'PF_STATUS'
*     i_callback_user_command  = 'USER_COMMAND'
      i_save             = 'A'
    TABLES
      t_outtab           = <gt_table>.
ENDFORM.

FORM create_structure.
  DATA:lt_fieldcat TYPE slis_t_fieldcat_alv,
       lt_data2    LIKE TABLE OF   ty_data,
       lt_data     LIKE lt_data2,
       lt_t685t    TYPE TABLE OF ty_t685t. "条件类型

  DATA: wa_structure TYPE lvc_s_fcat,
        wa_fieldcat  TYPE slis_fieldcat_alv.

  DATA: lv_count    TYPE i.

  DATA: lv_repid    TYPE sy-repid,
        lv_inclname TYPE trdir-name.

  CLEAR: lt_fieldcat[], wa_fieldcat.


  "--->获取固定栏位
  lv_repid = lv_inclname = sy-cprog.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      i_program_name         = lv_repid
      i_internal_tabname     = 'TY_DATA'
      i_inclname             = lv_inclname
    CHANGING
      ct_fieldcat            = lt_fieldcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.


  "---->固定栏位
  LOOP AT lt_fieldcat INTO wa_fieldcat.

    ADD 1 TO lv_count.
    wa_structure-col_pos   = lv_count.
    wa_fieldcat-col_pos    = lv_count.
    wa_structure-fieldname = wa_fieldcat-fieldname ."栏位
    wa_structure-ref_field = wa_fieldcat-ref_fieldname."参考栏位
    wa_structure-ref_table = wa_fieldcat-ref_tabname."参考表

    APPEND wa_structure TO gt_structure.
    APPEND wa_fieldcat TO gt_fieldcat.
    CLEAR: wa_fieldcat,wa_structure.
  ENDLOOP.


  "获取条件类型说明
  SELECT t685t~spras, t685t~kappl ,t685t~kschl ,t685t~vtext
    FROM @gt_t685t AS a
    INNER JOIN t685t ON t685t~kschl EQ a~kschl
    WHERE t685t~kappl EQ 'M' "采购
    INTO TABLE @lt_t685t.


  "1.获取konp的栏位有资料元素栏位说明
  SELECT dd03l~tabname dd03l~fieldname dd03l~as4local
              dd03l~position dd03l~keyflag dd03l~rollname
              dd03l~checktable dd03l~inttype dd03l~intlen
              dd03l~reftable dd03l~reffield dd03l~datatype
              dd03l~leng dd03l~decimals dd03l~domname
              dd04t~ddlanguage dd04t~ddtext dd04t~reptext
              dd04t~scrtext_s dd04t~scrtext_m dd04t~scrtext_l
      INTO CORRESPONDING FIELDS OF TABLE gt_dd03l
      FROM dd03l
      INNER JOIN dd04t ON dd04t~rollname = dd03l~rollname
      WHERE dd03l~tabname EQ 'KONP'
          AND dd03l~fieldname IN ( 'MANDT','KAPPL','KSCHL',
          'KRECH','KBETR','KONWA','KPEIN','KMEIN','LOEVM_KO' ).

  "2.获取konp的栏位无资料元素栏位说明
  SELECT dd03l~tabname dd03l~fieldname dd03l~as4local
              dd03l~position dd03l~keyflag dd03l~rollname
              dd03l~checktable dd03l~inttype dd03l~intlen
              dd03l~reftable dd03l~reffield dd03l~datatype
              dd03l~leng dd03l~decimals dd03l~domname
              dd03t~ddlanguage
              dd03t~ddtext dd03t~ddtext AS reptext
              dd03t~ddtext AS scrtext_s dd03t~ddtext AS scrtext_m
              dd03t~ddtext AS scrtext_l
      APPENDING CORRESPONDING FIELDS OF TABLE gt_dd03l
      FROM dd03l
      INNER JOIN dd03t ON dd03t~fieldname = dd03l~fieldname
      AND  dd03t~tabname = dd03l~tabname
      WHERE dd03l~tabname EQ 'KONP'
          AND dd03l~fieldname IN ( 'MANDT','KAPPL','KSCHL',
          'KRECH','KBETR','KONWA','KPEIN','KMEIN','LOEVM_KO' ).

  "---->动态栏位
  LOOP AT gt_t685t INTO wa_t685t.

    READ TABLE lt_t685t INTO DATA(ls_t685t) WITH KEY
                       kschl = wa_t685t-kschl
                       spras = sy-langu.

    "-->條件類型
    READ TABLE gt_dd03l INTO DATA(ls_dd03l) WITH KEY
                       fieldname = 'KSCHL' ddlanguage = sy-langu.
    IF sy-subrc <> 0.
      READ TABLE gt_dd03l INTO ls_dd03l WITH KEY
                          fieldname = 'KSCHL' .
    ENDIF.

    "动态栏位说明
    PERFORM dynamic_fieldcat_text USING ls_dd03l ls_t685t lv_count.


    "-->條件金額或百分比
    READ TABLE gt_dd03l INTO ls_dd03l WITH KEY
                       fieldname = 'KBETR' ddlanguage = sy-langu.
    IF sy-subrc <> 0.
      READ TABLE gt_dd03l INTO ls_dd03l WITH KEY
                          fieldname = 'KBETR' .
    ENDIF.

    "动态栏位说明
    PERFORM dynamic_fieldcat_text USING ls_dd03l ls_t685t lv_count.

    "-->條件單位
    READ TABLE gt_dd03l INTO ls_dd03l WITH KEY
                       fieldname = 'KONWA' ddlanguage = sy-langu.
    IF sy-subrc <> 0.
      READ TABLE gt_dd03l INTO ls_dd03l WITH KEY
                         fieldname = 'KONWA' .
    ENDIF.

    "动态栏位说明
    PERFORM dynamic_fieldcat_text USING ls_dd03l ls_t685t lv_count.

    "-->條件定價單位
    READ TABLE gt_dd03l INTO ls_dd03l WITH KEY
                       fieldname = 'KPEIN' ddlanguage = sy-langu.
    IF sy-subrc <> 0.
      READ TABLE gt_dd03l INTO ls_dd03l WITH KEY
                         fieldname = 'KPEIN' .
    ENDIF.

    "动态栏位说明
    PERFORM dynamic_fieldcat_text USING ls_dd03l ls_t685t lv_count.


    "-->條件項目的刪除指示碼
    READ TABLE gt_dd03l INTO ls_dd03l WITH KEY
                       fieldname = 'LOEVM_KO' ddlanguage = sy-langu.
    IF sy-subrc <> 0.
      READ TABLE gt_dd03l INTO ls_dd03l WITH KEY
                         fieldname = 'LOEVM_KO'.
    ENDIF.

    "动态栏位说明
    PERFORM dynamic_fieldcat_text USING ls_dd03l ls_t685t lv_count.

    CLEAR:ls_t685t.
  ENDLOOP.

ENDFORM.

FORM create_dynamic_table .
  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = gt_structure
    IMPORTING
      ep_table        = gt_table.
  ASSIGN gt_table->* TO <gt_table>.
ENDFORM.

*&---------------------------------------------------------------------*
*& Form PROCESS_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM process_data .

*  FIELD-SYMBOLS: <ls_fs> TYPE any.
*  FIELD-SYMBOLS: <ls_data> TYPE any.
  FIELD-SYMBOLS: <ls_value>.

  TYPES:BEGIN OF ty_marc,
          matnr TYPE matnr, "物料
          lvorm TYPE lvorm, "工厂层级
          dismm TYPE dismm, "MRP 类型
          dispo TYPE dispo, "MRP 控制员
          plifz TYPE plifz, "主档计划交货时间
          beskz TYPE beskz, "采购类型
          sobsl TYPE sobsl, "特殊采购类型
          webaz TYPE webaz, "收货作业处理时间
        END OF ty_marc,
        BEGIN OF ty_makt,
          spras TYPE spras, "语系
          matnr TYPE matnr, "物料
          maktx TYPE maktx, "物料说明
        END OF ty_makt.

  DATA:lt_dd03l TYPE TABLE OF ty_dd03l, "动太栏位
       lt_marc  TYPE TABLE OF ty_marc, "工厂基础资料
       lt_makt  TYPE TABLE OF ty_makt. "物料说明

  DATA: l_index LIKE sy-tabix,
        l_infnr LIKE eine-infnr,
        l_datab LIKE a017-datab.

  DATA: l_new_line  TYPE REF TO data,
        l_comp_line TYPE REF TO data.


  CREATE DATA l_new_line LIKE LINE OF <gt_table>.
  CREATE DATA l_comp_line LIKE LINE OF <gt_table>.
  ASSIGN l_new_line->* TO <g_wa>.



*---->其他信息
  "物料工厂基础信息
  SELECT matnr lvorm dismm dispo plifz beskz sobsl webaz
      INTO CORRESPONDING FIELDS OF TABLE lt_marc
      FROM marc
      FOR ALL ENTRIES IN gt_data
      WHERE matnr EQ gt_data-matnr
          AND werks EQ gt_data-werks.

  "物料说明
  SELECT spras matnr maktx
       INTO TABLE lt_makt
       FROM makt
       FOR ALL ENTRIES IN gt_data
       WHERE matnr EQ gt_data-matnr.

  lt_dd03l[] = gt_dd03l[].

  SORT:lt_dd03l BY fieldname,
           lt_marc BY matnr,
           lt_makt BY spras matnr.

  "动态栏位
  DELETE ADJACENT DUPLICATES FROM lt_dd03l COMPARING fieldname.
  DELETE lt_dd03l  WHERE fieldname = 'MANDT' OR
                                       fieldname = 'KNUMH' OR
                                       fieldname = 'KAPPL'.

*---->向动态表赋值

  LOOP AT gt_data ASSIGNING FIELD-SYMBOL(<ls_data>).
      l_index = sy-tabix.
    IF c_weight EQ 'X' AND (
                          ( <ls_data>-infnr EQ l_infnr AND
                          <ls_data>-datbi < l_datab ) OR
                          <ls_data>-datab > sy-datum ).

      DELETE gt_data INDEX l_index.
      CONTINUE.
    ENDIF.
    l_datab = <ls_data>-datab.l_infnr = <ls_data>-infnr.


    "--->工厂基础信息更新
    READ TABLE lt_marc INTO DATA(ls_marc) WITH KEY
                       matnr = <ls_data>-matnr
                       BINARY SEARCH.

    "--->物料说明
    READ TABLE lt_makt INTO DATA(ls_makt) WITH KEY
                       spras = sy-langu
                       matnr = <ls_data>-matnr.
    IF sy-subrc = 0.
      READ TABLE lt_makt INTO ls_makt WITH KEY
                         matnr = <ls_data>-matnr.
    ENDIF.

    MOVE-CORRESPONDING ls_marc TO <ls_data>.
    MOVE-CORRESPONDING ls_makt TO <ls_data>.

    MOVE-CORRESPONDING <ls_data> TO <g_wa>.


    LOOP AT gt_t685t INTO DATA(ls_t685t).
*        kschl " 条件类型
      READ TABLE gt_konp ASSIGNING FIELD-SYMBOL(<ls_fs>) WITH KEY
                         knumh = <ls_data>-knumh
                         kschl = ls_t685t-kschl
                         BINARY SEARCH.
      IF sy-subrc = 0.
        LOOP AT lt_dd03l INTO DATA(ls_dd03l).

          "动态赋值
          ASSIGN COMPONENT ls_t685t-kschl &&  '_' &&
          ls_dd03l-fieldname OF STRUCTURE <g_wa> TO <g_field>.
          IF sy-subrc = 0.
            UNASSIGN <ls_value>.
            "动态获取栏位值
            ASSIGN COMPONENT ls_dd03l-fieldname
            OF STRUCTURE <ls_fs> TO <ls_value>.
            "-->若是条件类型的值是百分比那么需要将值缩小10倍
            IF <ls_fs>-krech = 'A' AND ls_dd03l-fieldname = 'KBETR'.
              <ls_value> = <ls_value> / 10.
            ENDIF.
            <g_field> = <ls_value>.
          ENDIF.

        ENDLOOP.
      ENDIF.
    ENDLOOP.


    APPEND <g_wa> TO  <gt_table>.
    CLEAR:ls_makt,ls_marc.
  ENDLOOP.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form DYNAMIC_FIELDCAT_TEXT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&      --> LS_DD03L
*&---------------------------------------------------------------------*
FORM dynamic_fieldcat_text
                  USING ls_dd03l TYPE ty_dd03l
                            ls_t685t TYPE ty_t685t
                            lv_count.

  DATA: wa_structure TYPE lvc_s_fcat,
        wa_fieldcat  TYPE slis_fieldcat_alv.

  IF ls_dd03l IS INITIAL.
    EXIT.
  ENDIF.

  ADD 1 TO lv_count.
  MOVE-CORRESPONDING ls_dd03l TO wa_fieldcat.

  wa_structure-col_pos   = lv_count.
  wa_fieldcat-col_pos    = lv_count.
  wa_structure-fieldname = wa_fieldcat-fieldname =
  wa_t685t-kschl && '_' && ls_dd03l-fieldname."栏位名称

*  wa_structure-ref_field = wa_fieldcat-ref_fieldname =
*  ls_dd03l-reffield ."参考栏位
*  wa_structure-ref_table = wa_fieldcat-ref_tabname =
*  ls_dd03l-reftable."参考表

  wa_fieldcat-tabname = 'TY_DATA'.


  wa_fieldcat-seltext_l = ls_dd03l-scrtext_l && '_' &&
                                   ls_t685t-vtext.
  wa_fieldcat-seltext_m = ls_dd03l-scrtext_m && '_' &&
                                     ls_t685t-vtext.
  wa_fieldcat-seltext_s = ls_dd03l-scrtext_s && '_' &&
                                   ls_t685t-vtext.
  wa_fieldcat-ddictxt = ls_dd03l-reptext && '_' &&
                                  ls_t685t-vtext.
  wa_fieldcat-reptext_ddic =  ls_dd03l-reptext && '_' &&
                                   ls_t685t-vtext.
  wa_fieldcat-ddictxt =  ls_dd03l-ddtext && '_' &&
                                  ls_t685t-vtext.

*  wa_structure-inttype = wa_fieldcat-inttype."abap类型
*  wa_structure-intlen = wa_fieldcat-outputlen."输出长度
*  wa_structure-decimals_o = wa_fieldcat-decimals_out."输出小数位数

  APPEND wa_structure TO gt_structure.
  APPEND wa_fieldcat TO gt_fieldcat.
  CLEAR: wa_fieldcat,wa_structure,ls_dd03l.

*  ADD 1 TO lv_count.
*  wa_structure-fieldname = 'SPBUP'.
*  wa_structure-col_pos   = lv_count.
*  wa_fieldcat-col_pos    = lv_count.
*  wa_fieldcat-fieldname  = wa_structure-fieldname.
*  wa_fieldcat-seltext_s = wa_fieldcat-seltext_m =
*  wa_fieldcat-seltext_l = '过账期间'.
*  wa_fieldcat-ddictxt = 'L'.
**    wa_fieldcat-inttype = 'P'.
*  wa_fieldcat-outputlen = '8'.
**    wa_fieldcat-decimals_out = '2'.
*  APPEND wa_structure TO gt_structure.
*  CLEAR wa_structure.
*  APPEND wa_fieldcat TO gt_fieldcat.
*  CLEAR wa_fieldcat.

ENDFORM.

 

posted on 2019-09-12 09:27  淡淡-祥  阅读(630)  评论(0)    收藏  举报