自适应的销售价格查询程序

因为SD模块的销售价格分很多维度,有很多的条件类型,每个条件类型又有多个关键字组合,这就导致做价格查询程序的时候非常麻烦,通常是根据需要做多个程序,如果新加或者更改了条件类型/关键字组合就需要改动程序。

这个就很烦。

那么有没有一个程序可以自动列出所有的条件类型和关键字组合并且查询,并且在新加了条件类型或者关键字组合也不需要改动呢?

既然都这么说了,那肯定就是有这个程序咯。

程序界面如下:97ac750da537c8f681a16b61de4b031a.png

1c88b17a6eed80b38840907e8abcac88.png

d3dfa3bf08450faf6832deaff04ef8cf.png

功能如下:
1、可以根据权限设置列出所有或者有权限的条件类型
2、选择条件是自适应的,可以根据选择的关键字组合显示选择条件
3、可以一次性展示某个条件类型的所有关键字组合的价格

选择界面需要根据条件动态生成,所以程序分成两个,一个是主程序一个是选择界面程序(ZGETSDPRICEINC)。

分别如下:

*&---------------------------------------------------------------------*
*& Report  ZGETSDPRICE
*&
*&---------------------------------------------------------------------*
*& Baitianzhen 2015.08.16
*& 销售价格查询
*&---------------------------------------------------------------------*
REPORT zgetsdprice NO STANDARD PAGE HEADING.


TYPE-POOLS: slis.
TABLES: sscrfields,komg,tvko,dfies,komk,komp,komv,konp.
DATA: fldct TYPE lvc_t_fcat WITH HEADER LINE,
      slayt TYPE lvc_s_layo,
      title TYPE lvc_title,
      varnt LIKE disvariant,
      repid LIKE sy-repid,
      tabix LIKE sy-tabix.


DATA: BEGIN OF dfaultkey,
        srtfd LIKE indx-srtfd,
      END OF dfaultkey.
DATA: BEGIN OF it_t682 OCCURS 0,
        kschl LIKE t685-kschl,
        krech LIKE t685a-krech,
        kotab LIKE t681-kotab,
        kolnr LIKE t682i-kolnr,
        zaehk LIKE t682z-zaehk,
        zifna LIKE t682z-zifna,
        qustr LIKE t682z-qustr,
        qufna LIKE t682z-qufna,
        vtext LIKE t685t-vtext,
        gstxt LIKE tmc1t-gstxt,
        fdlen TYPE i,
      END OF it_t682.
DATA: BEGIN OF it_kschl OCCURS 0,
        kschl LIKE t685-kschl,
        vtext LIKE t685t-vtext,
      END OF it_kschl.
DATA: BEGIN OF it_kotab OCCURS 0,
        kschl LIKE t685-kschl,
        krech LIKE t685a-krech,
        kotab LIKE t681-kotab,
        gstxt LIKE tmc1t-gstxt,
      END OF it_kotab.
DATA: BEGIN OF it_zifna OCCURS 0,
        zifna LIKE t682z-zifna,
      END OF it_zifna.
DATA: BEGIN OF it_tabs OCCURS 0,
        kotab LIKE t681-kotab,
      END OF it_tabs.
DATA: BEGIN OF it_lstbox1 OCCURS 0,
        key(40)  TYPE c,
        text(80) TYPE c,
      END OF it_lstbox1.
DATA: it_lstbox2 LIKE TABLE OF it_lstbox1 WITH HEADER LINE.
DATA: stable TYPE TABLE OF rsparams WITH HEADER LINE.
DATA: it_komv TYPE TABLE OF komv WITH HEADER LINE,
      it_konm TYPE TABLE OF konm WITH HEADER LINE, "等级
      wa_konm TYPE konm.
DATA: BEGIN OF it_cdhdr OCCURS 0,
        objectid LIKE cdhdr-objectid,
        username LIKE cdhdr-username,
        udate    LIKE cdhdr-udate,
        utime    LIKE cdhdr-utime,
      END OF it_cdhdr.
DATA: BEGIN OF it_knumh OCCURS 0,
        knumh TYPE knumh,
      END OF it_knumh.
DATA: BEGIN OF it_makt OCCURS 0,
        matnr LIKE makt-matnr,
        maktx LIKE makt-maktx,
      END OF it_makt.
DATA: hs_makt LIKE HASHED TABLE OF it_makt
          WITH UNIQUE KEY matnr WITH HEADER LINE.
DATA: BEGIN OF it_tvkot OCCURS 0,
        vkorg LIKE tvkot-vkorg,
        vtext LIKE tvkot-vtext,
      END OF it_tvkot.
DATA: hs_tvkot LIKE HASHED TABLE OF it_tvkot
          WITH UNIQUE KEY vkorg WITH HEADER LINE.
DATA: BEGIN OF it_kna1 OCCURS 0,
        kunnr LIKE kna1-kunnr,
        name1 LIKE kna1-name1,
      END OF it_kna1.
DATA: hs_kna1 LIKE HASHED TABLE OF it_kna1
          WITH UNIQUE KEY kunnr WITH HEADER LINE.
DATA: rf_kotab TYPE REF TO data.
FIELD-SYMBOLS: <fs_kotab> TYPE STANDARD TABLE,
               <fs_kowa>,
               <fs_fld>.
DATA: rf_out    TYPE REF TO data,
      it_out_wa TYPE REF TO data.
FIELD-SYMBOLS: <fs_out>    TYPE STANDARD TABLE,
               <fs_out_wa>.
DATA: flag,
      len           TYPE i,
      knumh         TYPE knumh,
      tmpstr(60),
      whstr         TYPE string,
      decimals_3(5) VALUE '3    '.


SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN BEGIN OF SCREEN 1001 AS WINDOW .
PARAMETERS: d_kschl TYPE kschl AS LISTBOX VISIBLE LENGTH 18.
PARAMETERS: d_konm  AS CHECKBOX .
PARAMETERS: d_cdhdr AS CHECKBOX .
SELECTION-SCREEN END OF SCREEN 1001.


SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE t01.
PARAMETERS: p_kschl TYPE kschl AS LISTBOX VISIBLE LENGTH 18 OBLIGATORY USER-COMMAND ucomm1,
            p_kotab TYPE kotab AS LISTBOX VISIBLE LENGTH 40 USER-COMMAND ucomm2.
SELECTION-SCREEN END OF BLOCK b1.


SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE t02.
INCLUDE zgetsdpriceinc.
SELECT-OPTIONS datbi   FOR komg-sdate NO-EXTENSION DEFAULT sy-datum TO sy-datum.
SELECTION-SCREEN END OF BLOCK b2.


SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE t03.
PARAMETERS: p_konm  AS CHECKBOX DEFAULT 'X'.
PARAMETERS: p_cdhdr AS CHECKBOX .
SELECTION-SCREEN END OF BLOCK b3.


INITIALIZATION.
  CALL FUNCTION 'RS_REFRESH_FROM_SELECTOPTIONS'
    EXPORTING
      curr_report     = sy-repid
    TABLES
      selection_table = stable
    EXCEPTIONS
      not_found       = 1
      no_report       = 2
      OTHERS          = 3.


  CONCATENATE 'ZGETSDPRI' sy-uname INTO dfaultkey-srtfd.
  IMPORT d_kschl d_konm d_cdhdr FROM DATABASE indx(zz) ID dfaultkey.
  p_konm = d_konm.
  p_cdhdr = d_cdhdr.
  IMPORT it_lstbox1[] it_lstbox2[] it_t682[] it_kotab[] it_kschl[] it_zifna[]
         p_kschl p_kotab FROM MEMORY ID 'LISTBOX'.
  IF sy-subrc <> 0.
    PERFORM get_kotab.
    PERFORM fill_listbox USING 'ABC'.
  ENDIF.


AT SELECTION-SCREEN OUTPUT.
  t01 = '条件类型和关键字组合'.
  t02 = '选择条件'.
  t03 = '其他选项'.
  sscrfields-functxt_01   = '@K8@ 个人设置'.
  sscrfields-functxt_02   = '按优先级查询'.
  %_d_kschl_%_app_%-text  = '条件类型默认值'.
  %_d_konm_%_app_%-text   = '显示是否存在等级'.
  %_d_cdhdr_%_app_%-text  = '显示最后修改人'.
  %_p_kschl_%_app_%-text  = '条件类型'.
  %_p_kotab_%_app_%-text  = '关键字组合'.
  %_p_konm_%_app_%-text   = '显示是否存在等级'.
  %_p_cdhdr_%_app_%-text  = '显示最后修改人'.
  %_datbi_%_app_%-text    = '日期区间'.


  LOOP AT it_zifna.
    CONCATENATE '%_' it_zifna-zifna '_%_APP_%-TEXT' INTO tmpstr.
    ASSIGN (tmpstr) TO <fs_fld>.
    CHECK sy-subrc = 0.
    CALL 'C_DD_READ_FIELD'
        ID 'TYPE'      FIELD 'T'
        ID 'TABNAME'   FIELD 'KOMG'
        ID 'FIELDNAME' FIELD it_zifna-zifna
        ID 'LANGUAGE'  FIELD sy-langu.
    <fs_fld> = dfies-fieldtext.
  ENDLOOP.


  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'D_KSCHL'
      values = it_lstbox1[].
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'P_KSCHL'
      values = it_lstbox1[].
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id     = 'P_KOTAB'
      values = it_lstbox2[].


  LOOP AT SCREEN.
    CHECK screen-group1 = 'S'.
    CLEAR flag.
    LOOP AT it_zifna.
      IF screen-name CS it_zifna-zifna .
        flag = 'X'.
        EXIT.
      ENDIF.
    ENDLOOP.
    IF flag <> 'X'.
      screen-active = '0'.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.


AT SELECTION-SCREEN . "PAI
  CASE sscrfields-ucomm.
    WHEN 'UCOMM1'.
      PERFORM fill_listbox USING 'BC'.
    WHEN 'UCOMM2'.
      PERFORM fill_listbox USING 'C'.
    WHEN 'FC01'.
      CALL SELECTION-SCREEN 1001 STARTING AT 10 5 .
      CHECK sy-subrc = 0 .
      EXPORT d_kschl d_konm d_cdhdr TO DATABASE indx(zz) ID dfaultkey.
      MESSAGE s000(oo) WITH '维护完成'.
  ENDCASE.


START-OF-SELECTION.
  PERFORM savelog(zreplog) USING sy-repid '' IF FOUND.
  EXPORT it_lstbox1[] it_lstbox2[] it_t682[]
         it_kotab[] it_kschl[] it_zifna[]
         p_kschl p_kotab TO MEMORY ID 'LISTBOX'.


  PERFORM create_itab.
  PERFORM getdata.
  PERFORM updatelog(zreplog) IF FOUND.
  PERFORM outdata.


*&---------------------------------------------------------------------*
*&      Form  get_kotab
*&---------------------------------------------------------------------*
FORM get_kotab.
  SELECT t685~kschl
         t685a~krech
         t681~kotab
         t682i~kolnr
         t682z~zaehk
         t682z~zifna
         t682z~qustr
         t682z~qufna
         t685t~vtext
         tmc1t~gstxt
    INTO CORRESPONDING FIELDS OF TABLE it_t682
    FROM t682 INNER JOIN t685  ON t682~kvewe = t685~kvewe  AND
                                  t682~kappl = t685~kappl  AND
                                  t682~kozgf = t685~kozgf
              INNER JOIN t685a ON t685~kappl = t685a~kappl AND
                                  t685~kschl = t685a~kschl
              INNER JOIN t685t ON t685~kvewe = t685t~kvewe AND
                                  t685~kappl = t685t~kappl AND
                                  t685~kschl = t685t~kschl AND
                                  t685t~spras = sy-langu
              INNER JOIN t682i ON t682~kvewe = t682i~kvewe AND
                                  t682~kappl = t682i~kappl AND
                                  t682~kozgf = t682i~kozgf
              INNER JOIN t682z ON t682i~kvewe = t682z~kvewe AND
                                  t682i~kappl = t682z~kappl AND
                                  t682i~kozgf = t682z~kozgf AND
                                  t682i~kolnr = t682z~kolnr
              INNER JOIN t681  ON t682i~kvewe = t681~kvewe  AND
                                  t682i~kotabnr = t681~kotabnr
              INNER JOIN tmc1t ON t681~kotab = tmc1t~gstru  AND
                                  tmc1t~spras = sy-langu
    WHERE t682~kvewe = 'A' AND
          t682~kappl = 'V' AND
          t682z~qufna <> ''
    ORDER BY t685~kschl t682i~kolnr t682z~zaehk.


  LOOP AT it_t682.
    it_kotab-kschl = it_t682-kschl.
    it_kotab-krech = it_t682-krech.
    it_kotab-kotab = it_t682-kotab.
    it_kotab-gstxt = it_t682-gstxt.
    COLLECT it_kotab.


    it_kschl-kschl = it_t682-kschl.
    it_kschl-vtext = it_t682-vtext.
    COLLECT it_kschl.


    it_t682-fdlen = strlen( it_t682-zifna ).
    MODIFY it_t682.
  ENDLOOP.


  LOOP AT it_kschl.
    AUTHORITY-CHECK OBJECT 'V_KONH_VKS'
         ID 'KSCHL' FIELD it_kschl-kschl
         ID 'ACTVT' FIELD '03'.
    IF sy-subrc <> 0.
      DELETE it_kschl.
    ENDIF.
  ENDLOOP.
ENDFORM.                    "get_kotab


*&---------------------------------------------------------------------*
*&      Form  fill_listbox
*&---------------------------------------------------------------------*
FORM fill_listbox USING method.
  IF method CS 'A'.
    CLEAR:p_kschl,it_lstbox1[].
    LOOP AT it_kschl.
      IF p_kschl = ''.
        p_kschl = it_kschl-kschl.
      ENDIF.


      IF it_kschl-kschl = d_kschl .
        p_kschl = it_kschl-kschl.
      ENDIF.


      it_lstbox1-key = it_kschl-kschl.
      it_lstbox1-text = it_kschl-vtext.
      APPEND it_lstbox1.
    ENDLOOP.
  ENDIF.


  IF method CS 'B'.
    CLEAR:p_kotab, it_lstbox2[].
    LOOP AT it_kotab WHERE kschl = p_kschl.
      IF p_kotab IS INITIAL.
        p_kotab = it_kotab-kotab.
      ENDIF.


      it_lstbox2-key = it_kotab-kotab.
      it_lstbox2-text = it_kotab-gstxt.
      APPEND it_lstbox2.
    ENDLOOP.
  ENDIF.


  IF method CS 'C'.
    CLEAR it_zifna[].
    IF p_kotab = ''.
      LOOP AT it_t682 WHERE kschl = p_kschl .
        it_zifna-zifna = it_t682-zifna.
        COLLECT it_zifna .
      ENDLOOP.
    ELSE.
      LOOP AT it_t682 WHERE kschl = p_kschl AND
                            kotab = p_kotab.
        APPEND it_t682-zifna TO it_zifna.
      ENDLOOP.
    ENDIF.
  ENDIF.
ENDFORM.                    "fill_listbox


*&---------------------------------------------------------------------*
*&      Form  create_itab
*&---------------------------------------------------------------------*
FORM create_itab.
  CLEAR:it_zifna[], fldct[],whstr.


  IF p_kotab = ''.
    LOOP AT it_t682 WHERE kschl = p_kschl .
      it_zifna-zifna = it_t682-zifna.
      COLLECT it_zifna .
    ENDLOOP.
  ELSE.
    LOOP AT it_t682 WHERE kschl = p_kschl AND
                          kotab = p_kotab.
      APPEND it_t682-zifna TO it_zifna.
    ENDLOOP.
  ENDIF.


  PERFORM fill_fcat USING 'KOTAB' 'T681' 'KOTAB'.


  CLEAR flag.
  LOOP AT it_zifna.
    len = strlen( it_zifna-zifna ).
    READ TABLE stable WITH KEY selname = it_zifna-zifna
                               kind    = 'S'.
    IF sy-subrc <> 0 AND len < 9.
      PERFORM add_fld USING it_zifna-zifna.
      flag = 'X'.
    ENDIF.


    PERFORM fill_fcat USING it_zifna-zifna 'KOMG' it_zifna-zifna.
    IF it_zifna-zifna = 'MATNR'.
      PERFORM fill_fcat USING : 'MAKTX' 'MAKT' 'MAKTX'.
    ENDIF.
    IF it_zifna-zifna = 'KUNNR' .
      PERFORM fill_fcat USING : 'NAME1' 'KNA1' 'NAME1'.
    ENDIF.
    IF it_zifna-zifna = 'KUNWE' .
      PERFORM fill_fcat USING : 'NAMWE' 'KNA1' 'NAME1'.
    ENDIF.
    IF it_zifna-zifna = 'KUNAG'.
      PERFORM fill_fcat USING : 'NAMAG' 'KNA1' 'NAME1'.
    ENDIF.
    IF it_zifna-zifna = 'VKORG'.
      PERFORM fill_fcat USING : 'VTEXT' 'TVKOT' 'VTEXT'.
    ENDIF.
  ENDLOOP.
  IF flag = 'X'.
    MESSAGE s000(oo) WITH '选择界面添加字段,程序已更改,请重新执行程序'.
    LEAVE PROGRAM.
  ENDIF.


  PERFORM fill_fcat USING : 'DATAB' 'KONH' 'DATAB',
                            'DATBI' 'KONH' 'DATBI'.


  IF p_konm = 'X'.
    PERFORM fill_fcat USING : 'KSTBM' 'KONM' 'KSTBM',
                              'KONMS' 'KONP' 'KONMS'.
  ENDIF.


  PERFORM fill_fcat USING : 'KBETR' 'ZUPLOADPRICET' 'KBETR',
                            'KONWA' 'KONP' 'KONWA',
                            'KPEIN' 'KOMV' 'KPEIN',
                            'KMEIN' 'KOMV' 'KMEIN',
                            'KNUMH' 'KOMV' 'KNUMH'.
  IF p_cdhdr = 'X'.
    PERFORM fill_fcat USING : 'USERNAME' 'CDHDR' 'USERNAME',
                              'UDATE'    'CDHDR' 'UDATE',
                              'UTIME'    'CDHDR' 'UTIME'.
  ENDIF.
  IF p_konm = 'X'.
    PERFORM fill_fcat USING : 'KOSTKZ' 'RV13A' 'KOSTKZ'.
  ENDIF.


  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = fldct[]
    IMPORTING
      ep_table        = rf_out.


  ASSIGN rf_out->* TO <fs_out>.
  CREATE DATA it_out_wa LIKE LINE OF <fs_out>.
  ASSIGN it_out_wa->* TO <fs_out_wa>.
ENDFORM.                    "create_itab


*&---------------------------------------------------------------------*
*&      Form  getdata
*&---------------------------------------------------------------------*
FORM getdata.
  DATA: BEGIN OF lw_desc,
        vkorg     LIKE hs_tvkot-vkorg,
        vtext     LIKE hs_tvkot-vtext,
        matnr     LIKE hs_makt-matnr,
        maktx     LIKE hs_makt-maktx,
        kunnr     LIKE hs_kna1-kunnr,
        name1     LIKE hs_kna1-name1,
        kunag     LIKE hs_kna1-kunnr,
        namag     LIKE hs_kna1-name1,
        kunwe     LIKE hs_kna1-kunnr,
        namwe     LIKE hs_kna1-name1,
      END OF lw_desc.


***权限检查
  FIND 'VKORG' IN TABLE it_zifna.
  IF sy-subrc = 0.
    SELECT * FROM tvko WHERE vkorg IN vkorg.
      AUTHORITY-CHECK OBJECT 'V_KONH_VKO'
           ID 'VKORG' FIELD tvko-vkorg
           ID 'VTWEG' DUMMY
           ID 'SPART' DUMMY
           ID 'ACTVT' FIELD '03'.
      IF sy-subrc <> 0.
        MESSAGE e000(oo) WITH '无销售组织' tvko-vkorg '的查看权限' .
      ENDIF.
    ENDSELECT.
  ENDIF.


  CLEAR it_tabs[].
  IF p_kotab = ''.
    LOOP AT it_lstbox2.
      it_tabs-kotab = it_lstbox2-key.
      APPEND it_tabs.
    ENDLOOP.
  ELSE.
    APPEND p_kotab TO it_tabs.
  ENDIF.


  LOOP AT it_tabs.
    CLEAR: whstr,it_knumh[],it_komv[],it_konm[],it_cdhdr[].


    CREATE DATA rf_kotab TYPE TABLE OF (it_tabs-kotab).
    ASSIGN rf_kotab->* TO <fs_kotab>.


    IF datbi[] IS INITIAL.
      whstr = `kappl = 'V' AND kschl = p_kschl ` .
    ELSE.
      whstr = `kappl = 'V' AND kschl = p_kschl AND datbi >= datbi-low AND datab <= datbi-high ` .
    ENDIF.


    LOOP AT it_t682 WHERE kschl = p_kschl AND
                          kotab = it_tabs-kotab AND
                          fdlen < 9.
      CONCATENATE whstr 'AND' it_t682-zifna 'IN' it_t682-zifna INTO whstr SEPARATED BY space.
    ENDLOOP.


    SELECT * INTO TABLE <fs_kotab>
      FROM (it_tabs-kotab)
      WHERE (whstr).
    IF sy-subrc = 0.
      LOOP AT <fs_kotab> ASSIGNING <fs_kowa>.
        ASSIGN COMPONENT 'KNUMH' OF STRUCTURE <fs_kowa> TO <fs_fld>.
        APPEND <fs_fld> TO it_knumh.
      ENDLOOP.
    ELSE.
      CONTINUE.
    ENDIF.


    SELECT * FROM konp
      FOR ALL ENTRIES IN it_knumh
      WHERE knumh = it_knumh-knumh AND
            kappl = 'V' AND
            kschl = p_kschl AND
            loevm_ko = '' .
      MOVE-CORRESPONDING konp TO it_komv.
*      IF konp-kwaeh = ''.
      it_komv-kwaeh = konp-konwa.
*      ENDIF.
      APPEND it_komv.
    ENDSELECT.
    SORT it_komv BY knumh.


    IF p_konm = 'X'.
      CLEAR it_konm[].
      SELECT * INTO CORRESPONDING FIELDS OF TABLE it_konm
        FROM konm
        FOR ALL ENTRIES IN it_knumh
        WHERE knumh = it_knumh-knumh  .
      SELECT * APPENDING CORRESPONDING FIELDS OF TABLE it_konm
        FROM konw
        FOR ALL ENTRIES IN it_knumh
        WHERE knumh = it_knumh-knumh  .
      SORT it_konm BY knumh kstbm.
    ENDIF.


    IF p_cdhdr = 'X'.
      LOOP AT it_knumh.
        it_cdhdr-objectid = it_knumh-knumh.
        APPEND it_cdhdr.
      ENDLOOP.
      SELECT objectid username udate utime INTO TABLE it_cdhdr
        FROM cdhdr
        FOR ALL ENTRIES IN it_cdhdr
        WHERE objectclas = 'COND_A' AND
              objectid = it_cdhdr-objectid.


      SORT it_cdhdr BY objectid udate DESCENDING utime DESCENDING.
      DELETE ADJACENT DUPLICATES FROM it_cdhdr COMPARING objectid.
    ENDIF.


    LOOP AT <fs_kotab> ASSIGNING <fs_kowa> .
      ASSIGN COMPONENT 'KNUMH' OF STRUCTURE <fs_kowa> TO <fs_fld>.
      knumh = <fs_fld>.


      READ TABLE it_komv WITH KEY knumh = knumh BINARY SEARCH.
      IF sy-subrc = 0.
        MOVE-CORRESPONDING it_komv TO <fs_out_wa>.
      ELSE.
        CONTINUE.
      ENDIF.
      MOVE-CORRESPONDING <fs_kowa> TO <fs_out_wa>.
      MOVE-CORRESPONDING <fs_out_wa> TO lw_desc.


      READ TABLE it_konm WITH KEY knumh = knumh BINARY SEARCH.
      IF sy-subrc = 0.
        tabix = sy-tabix.
        ASSIGN COMPONENT 'KOSTKZ' OF STRUCTURE <fs_out_wa> TO <fs_fld>.
        <fs_fld> = 'X'.
      ENDIF.


      READ TABLE it_cdhdr WITH KEY objectid = knumh BINARY SEARCH.
      IF sy-subrc = 0.
        MOVE-CORRESPONDING it_cdhdr TO <fs_out_wa>.
      ENDIF.


      ASSIGN COMPONENT 'KOTAB' OF STRUCTURE <fs_out_wa> TO <fs_fld>.
      <fs_fld> = it_tabs-kotab.


      ASSIGN COMPONENT 'KBETR' OF STRUCTURE <fs_out_wa> TO <fs_fld>.
      IF it_komv-krech CA 'AHIKJ'. "百分比
        WRITE it_komv-kbetr CURRENCY decimals_3 TO <fs_fld> NO-SIGN.
        IF it_komv-kbetr < 0.
          <fs_fld>(1) = '-'.
          CONDENSE <fs_fld> NO-GAPS.
        ENDIF.
        ASSIGN COMPONENT 'KONWA' OF STRUCTURE <fs_out_wa> TO <fs_fld>.
        <fs_fld> = '%'.
      ELSE.
        WRITE it_komv-kbetr CURRENCY it_komv-kwaeh TO <fs_fld> NO-SIGN NO-GROUPING. "不使用科学计数法
        IF it_komv-kbetr < 0.
          <fs_fld>(1) = '-'.
          CONDENSE <fs_fld> NO-GAPS.
        ENDIF.
        ASSIGN COMPONENT 'KONWA' OF STRUCTURE <fs_out_wa> TO <fs_fld>.
        <fs_fld> = it_komv-kwaeh.
      ENDIF.


      IF lw_desc-matnr IS NOT INITIAL.
        READ TABLE hs_makt TRANSPORTING NO FIELDS WITH TABLE KEY matnr = lw_desc-matnr.
        IF sy-subrc <> 0.
          hs_makt-matnr = lw_desc-matnr.
          INSERT TABLE hs_makt.
        ENDIF.
      ENDIF.


      IF lw_desc-kunnr IS NOT INITIAL.
        READ TABLE hs_kna1 TRANSPORTING NO FIELDS WITH TABLE KEY kunnr = lw_desc-kunnr.
        IF sy-subrc <> 0.
          hs_kna1-kunnr = lw_desc-kunnr.
          INSERT TABLE hs_kna1.
        ENDIF.
      ENDIF.
      IF lw_desc-kunag IS NOT INITIAL.
        READ TABLE hs_kna1 TRANSPORTING NO FIELDS WITH TABLE KEY kunnr = lw_desc-kunag.
        IF sy-subrc <> 0.
          hs_kna1-kunnr = lw_desc-kunnr.
          INSERT TABLE hs_kna1.
        ENDIF.
      ENDIF.
      IF lw_desc-kunwe IS NOT INITIAL.
        READ TABLE hs_kna1 TRANSPORTING NO FIELDS WITH TABLE KEY kunnr = lw_desc-kunwe.
        IF sy-subrc <> 0.
          hs_kna1-kunnr = lw_desc-kunnr.
          INSERT TABLE hs_kna1.
        ENDIF.
      ENDIF.


      LOOP AT it_konm WHERE knumh = knumh.
        MOVE-CORRESPONDING it_konm TO <fs_out_wa>.
        APPEND <fs_out_wa> TO <fs_out>.
      ENDLOOP.
      IF sy-subrc <> 0.
        APPEND <fs_out_wa> TO <fs_out>.
      ENDIF.


      CLEAR <fs_out_wa>.
    ENDLOOP.
  ENDLOOP.


  IF <fs_out> IS INITIAL.
    MESSAGE s000(oo) WITH '无数据'.
    STOP.
  ENDIF.


  SELECT vkorg vtext INTO TABLE hs_tvkot
    FROM tvkot
    WHERE spras = sy-langu.


  IF hs_makt[] IS NOT INITIAL.
    SELECT matnr maktx INTO TABLE hs_makt
      FROM makt
      FOR ALL ENTRIES IN hs_makt
      WHERE matnr = hs_makt-matnr AND
            spras = sy-langu.
  ENDIF.


  IF hs_kna1[] IS NOT INITIAL.
    SELECT kunnr name1 INTO TABLE hs_kna1
      FROM kna1
      FOR ALL ENTRIES IN hs_kna1
      WHERE kunnr = hs_kna1-kunnr.
  ENDIF.


***描述
  LOOP AT <fs_out> INTO <fs_out_wa>.
    CLEAR lw_desc.
    MOVE-CORRESPONDING <fs_out_wa> TO lw_desc.


    READ TABLE hs_tvkot WITH TABLE KEY vkorg = lw_desc-vkorg.
    lw_desc-vtext = hs_tvkot-vtext.


    READ TABLE hs_makt WITH TABLE KEY matnr = lw_desc-matnr.
    lw_desc-maktx = hs_makt-maktx.


    READ TABLE hs_kna1 WITH TABLE KEY kunnr = lw_desc-kunnr.
    lw_desc-name1 = hs_kna1-name1.
    READ TABLE hs_kna1 WITH TABLE KEY kunnr = lw_desc-kunag.
    IF sy-subrc = 0.
      lw_desc-namag = hs_kna1-name1.
    ENDIF.
    READ TABLE hs_kna1 WITH TABLE KEY kunnr = lw_desc-kunwe.
    IF sy-subrc = 0.
      lw_desc-namwe = hs_kna1-name1.
    ENDIF.


    MOVE-CORRESPONDING lw_desc TO <fs_out_wa>.
    MODIFY <fs_out> FROM <fs_out_wa>.
  ENDLOOP.
ENDFORM.                    "getdata


*&---------------------------------------------------------------------*
*&      Form  outdata
*&---------------------------------------------------------------------*
FORM outdata.
  DATA lines(10).


  slayt-zebra             = 'X'.
  slayt-cwidth_opt        = 'X'.
  repid = sy-repid.
  varnt-report = sy-repid.
  varnt-handle = p_kotab.


  lines = lines( <fs_out> ).
  IF p_kotab = ''.
    CONCATENATE p_kschl '所有条件表' lines '条' INTO title SEPARATED BY space.
  ELSE.
    READ TABLE it_kotab WITH KEY kschl = p_kschl kotab = p_kotab .
    CONCATENATE it_kotab-kschl it_kotab-gstxt lines '条' INTO title SEPARATED BY space.
  ENDIF.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      it_fieldcat_lvc          = fldct[]
      i_save                   = 'A'
      i_grid_title             = title
      is_variant               = varnt
      is_layout_lvc            = slayt
      i_callback_program       = repid
      i_callback_user_command  = 'USER_COMMAND'
      i_callback_pf_status_set = 'SET_STATUS'
    TABLES
      t_outtab                 = <fs_out>
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.
ENDFORM.                    "outdata


*&--------------------------------------------------------------------*
*&      Form  set_status
*&--------------------------------------------------------------------*
FORM set_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD' EXCLUDING rt_extab .
ENDFORM.                    "set_status


*&---------------------------------------------------------------------*
*&      Form  fill_fcat
*&---------------------------------------------------------------------*
FORM fill_fcat USING fldname reftab reffld.
  fldct-fieldname = fldname.
  fldct-ref_table = reftab.
  fldct-ref_field = reffld.


  IF fldct-fieldname = 'KPEIN' OR fldct-fieldname = 'KSTBM'.
    fldct-no_zero   = 'X'.
  ENDIF.
  IF fldct-fieldname = 'KBETR'.
    fldct-just = 'R'.
  ENDIF.
  IF fldct-fieldname = 'KNUMH'.
    fldct-no_out = 'X'.
  ENDIF.
  IF fldct-fieldname = 'KOSTKZ'.
    fldct-checkbox = 'X'.
  ENDIF.
  IF fldct-fieldname = 'KSTBM'.
    fldct-qfieldname = 'KONMS'.
  ENDIF.


  APPEND fldct.
  CLEAR fldct.
ENDFORM.                    "fill_fcat


*&--------------------------------------------------------------------*
*&      Form  user_command
*&--------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
                        rs_selfld TYPE slis_selfield.
  READ TABLE <fs_out> INTO <fs_out_wa> INDEX rs_selfld-tabindex.
  CASE r_ucomm.
    WHEN '&IC1'.
      ASSIGN COMPONENT 'KNUMH' OF STRUCTURE <fs_out_wa> TO <fs_fld>.
      CALL FUNCTION 'RV_CONDITION_RECORD'
        EXPORTING
          condition_number = <fs_fld>
          item_number      = '01'
          condition_use    = 'A'
          check_memory     = 'X'.
  ENDCASE.
ENDFORM.                    "user_command


*&---------------------------------------------------------------------*
*&      Form  add_fld
*&---------------------------------------------------------------------*
FORM add_fld USING fldname.
  DATA lt_report TYPE TABLE OF char1024 WITH HEADER LINE.
  DATA tmpstr TYPE string.


  CALL FUNCTION 'ENQUEUE_ESRDIRE'
    EXPORTING
      name           = 'ZGETSDPRICEINC'
    EXCEPTIONS
      foreign_lock   = 1
      system_failure = 2
      OTHERS         = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


  CONCATENATE ` ` fldname ` ` INTO tmpstr.
  READ REPORT 'ZGETSDPRICEINC' INTO lt_report.
  FIND FIRST OCCURRENCE OF tmpstr IN TABLE lt_report IGNORING CASE.
  IF sy-subrc = 0.
    RETURN.
  ENDIF.


  CONCATENATE `SELECT-OPTIONS ` fldname ` FOR KOMG-` fldname ` MODIF ID s.` INTO tmpstr.
  APPEND tmpstr TO lt_report.


  INSERT REPORT 'ZGETSDPRICEINC' FROM lt_report.
ENDFORM.                    "add_fld
*&---------------------------------------------------------------------*
*&  包含文件              ZGETSDPRICEINC
*&---------------------------------------------------------------------*
SELECT-OPTIONS VKORG FOR KOMG-VKORG MEMORY ID VKO MODIF ID S.
SELECT-OPTIONS KUNNR FOR KOMG-KUNNR MODIF ID s.
SELECT-OPTIONS KUNWE FOR KOMG-KUNWE MODIF ID s.
SELECT-OPTIONS CHARG FOR KOMG-CHARG MODIF ID s.

49c198cae47c3a5d708193c29eed7dd1.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值