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

作者:郑德鼎 约 6 分钟阅读 更新日期:2024-02-22 2 年前更新 标签:ABAP, SD, 开发, 销售分销

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

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

原创 ABAP老白 ABAP老白 2023-03-12 15:14 发表于山东

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

这个就很烦。

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

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

程序界面如下:

功能如下:

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'.

...

郑德鼎

关于作者:郑德鼎

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「自适应的销售价格查询程序.docx」整理生成,仅用于内部技术分享与学习交流。