自适应的销售价格查询程序
自适应的销售价格查询程序
原创 ABAP老白 ABAP老白 2023-03-12 15:14 发表于山东
因为SD模块的销售价格分很多维度,有很多的条件类型,每个条件类型又有多个关键字组合,这就导致做价格查询程序的时候非常麻烦,通常是根据需要做多个程序,如果新加或者更改了条件类型/关键字组合就需要改动程序。
这个就很烦。
那么有没有一个程序可以自动列出所有的条件类型和关键字组合并且查询,并且在新加了条件类型或者关键字组合也不需要改动呢?
既然都这么说了,那肯定就是有这个程序咯。
程序界面如下:
功能如下:
选择界面需要根据条件动态生成,所以程序分成两个,一个是主程序一个是选择界面程序(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_maktWITH 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_tvkotWITH 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_kna1WITH 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~kschlt685a~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 ANDkotab = 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 ANDkotab = p_kotab.
APPEND it_t682-zifna TO it_zifna.ENDLOOP.ENDIF.PERFORM fill_fcat USING 'KOTAB' 'T681' 'KOTAB'.
...