如何实现ooalv回车事件处理
1. 方法类的定义与实现
CLASS cl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
METHODS:
handle_data_changed_finished
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING et_good_cells.
" ENTE时触发
METHODS handle_enter
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells.
METHODS: handle_f4_help FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname
es_row_no
er_event_data
et_bad_cells
e_display.
PRIVATE SECTION.
ENDCLASS. "CL_EVENT_RECEIVER DEFINITION
CLASS cl_event_receiver IMPLEMENTATION.
METHOD handle_data_changed.
DATA gs_layout TYPE lvc_s_layo.
DATA: lv_stable TYPE lvc_s_stbl.
* IF er_data_changed->mt_good_cells IS NOT INITIAL.
* READ TABLE er_data_changed->mt_good_cells ASSIGNING FIELD-SYMBOL(<lfs_cell>) INDEX 1.
* READ TABLE gt_outtab ASSIGNING <gfs_outtab> INDEX <lfs_cell>-row_id.
* IF sy-subrc = 0.
* <gfs_outtab>-waerk = gs_header-waerk.
* ENDIF.
* ENDIF.
*
* "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
* CALL METHOD cl_gui_cfw=>set_new_ok_code
* EXPORTING
* new_code = 'RELOAD'.
*
* lv_stable-row = '1'.
* lv_stable-col = '1'.
*
* gs_layout-cwidth_opt = 'X'.
*
* CALL METHOD go_grid->set_frontend_layout
* EXPORTING
* is_layout = gs_layout.
*
* CALL METHOD go_grid->refresh_table_display
* EXPORTING
* is_stable = lv_stable.
*
* CALL METHOD cl_gui_control=>set_focus
* EXPORTING
* control = go_grid.
* CALL METHOD cl_gui_cfw=>flush.
ENDMETHOD.
METHOD handle_data_changed_finished.
DATA gs_layout TYPE lvc_s_layo.
DATA: lv_stable TYPE lvc_s_stbl.
TYPES: BEGIN OF lty_combine,
aland TYPE mlan-aland,
taxkd TYPE knvi-taxkd,
taxm1 TYPE mlan-taxm1,
END OF lty_combine.
DATA: lv_kunnr TYPE kna1-kunnr,
ls_knvv TYPE knvv,
ls_kna1 TYPE kna1,
lt_knmt TYPE TABLE OF knmt,
ls_knmt TYPE knmt,
ls_tcurr TYPE tcurr,
lt_mlan TYPE TABLE OF mlan,
ls_mlan TYPE mlan,
lt_knvi TYPE TABLE OF knvi,
ls_knvi TYPE knvi,
lt_t007s TYPE TABLE OF t007s,
ls_t007s TYPE t007s,
lt_a002 TYPE TABLE OF a002,
ls_a002 TYPE a002,
lt_konp TYPE TABLE OF konp,
ls_konp TYPE konp,
lt_combine TYPE TABLE OF lty_combine,
ls_combine TYPE lty_combine.
CLEAR: lv_kunnr,
ls_knvv,
ls_kna1,
lt_knmt,
ls_knmt,
ls_tcurr,
lt_mlan,
ls_mlan,
lt_knvi,
ls_knvi,
lt_t007s,
ls_t007s,
lt_a002,
ls_a002,
lt_konp,
ls_konp,
lt_combine,
ls_combine.
lv_kunnr = gs_header-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_kunnr
IMPORTING
output = lv_kunnr.
IF et_good_cells IS NOT INITIAL.
READ TABLE et_good_cells ASSIGNING FIELD-SYMBOL(<lfs_cell>) INDEX 1.
READ TABLE gt_outtab ASSIGNING <gfs_outtab> INDEX <lfs_cell>-row_id.
IF sy-subrc = 0.
<gfs_outtab>-waerk = gs_header-waerk.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <gfs_outtab>-matnr
IMPORTING
output = <gfs_outtab>-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
SELECT * INTO TABLE lt_knmt
FROM knmt
WHERE matnr = <gfs_outtab>-matnr
AND vkorg = gs_header-vkorg
AND vtweg = gs_header-vtweg
AND kunnr = lv_kunnr.
SELECT * INTO TABLE lt_mlan
FROM mlan
WHERE matnr = <gfs_outtab>-matnr.
SELECT * INTO TABLE lt_knvi
FROM knvi
WHERE kunnr = lv_kunnr
AND tatyp = 'MWST'.
LOOP AT lt_mlan INTO ls_mlan.
READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
IF ls_mlan-aland = ls_knvi-aland.
ls_combine-aland = ls_mlan-aland.
ls_combine-taxkd = ls_knvi-taxkd.
ls_combine-taxm1 = ls_mlan-taxm1.
COLLECT ls_combine INTO lt_combine.
CLEAR: ls_combine.
ENDIF.
ENDLOOP.
SELECT * INTO TABLE lt_a002
FROM a002
FOR ALL ENTRIES IN lt_combine
WHERE kappl = 'V'
AND kschl = 'MWST'
AND aland = lt_combine-aland
AND taxk1 = lt_combine-taxkd
AND taxm1 = lt_combine-taxm1
AND datbi >= sy-datum
AND datab <= sy-datum.
IF lt_a002 IS NOT INITIAL.
SELECT * INTO TABLE lt_konp
FROM konp
FOR ALL ENTRIES IN lt_a002
WHERE knumh = lt_a002-knumh
AND kappl = 'V'
AND kschl = 'MWST'.
ENDIF.
SELECT SINGLE * INTO ls_tcurr
FROM tcurr
WHERE kurst = 'M'
AND fcurr = gs_header-waerk
AND tcurr = 'CNY'.
<gfs_outtab>-waerk = gs_header-waerk. "货币
IF <gfs_outtab>-zdyhl IS INITIAL.
IF <gfs_outtab>-waerk = 'CNY'.
<gfs_outtab>-zdyhl = '1.00000'. "当月汇率
ELSE.
<gfs_outtab>-zdyhl = ls_tcurr-ukurs. "
ENDIF.
ENDIF.
IF <gfs_outtab>-zbjhl IS INITIAL.
<gfs_outtab>-zbjhl = '1.00000'. "报价汇率
ENDIF.
IF <gfs_outtab>-kdmat IS INITIAL.
READ TABLE lt_knmt INTO ls_knmt WITH KEY matnr = <gfs_outtab>-matnr.
IF sy-subrc = 0.
<gfs_outtab>-kdmat = ls_knmt-kdmat. "客户物料
ENDIF.
ENDIF.
IF <gfs_outtab>-zhjsz IS INITIAL.
READ TABLE lt_mlan INTO ls_mlan WITH KEY matnr = <gfs_outtab>-matnr.
READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
IF ls_mlan-aland = ls_knvi-aland.
READ TABLE lt_a002 INTO ls_a002 WITH KEY aland = ls_mlan-aland
taxk1 = ls_knvi-taxkd
taxm1 = ls_mlan-taxm1.
IF sy-subrc = 0.
READ TABLE lt_konp INTO ls_konp WITH KEY knumh = ls_a002-knumh.
IF sy-subrc = 0.
<gfs_outtab>-zhjsz = ls_konp-mwsk1. "税种
ENDIF.
ENDIF.
ENDIF.
ENDIF.
<gfs_outtab>-zxzj = <gfs_outtab>-zxjg + <gfs_outtab>-zxmjjg. "调整后总单价(未税) = 新产品售价(未税)+新模具分摊售价(未税)
IF <gfs_outtab>-zyzj IS INITIAL.
<gfs_outtab>-zjgbd = 0.
ELSE.
<gfs_outtab>-zjgbd = ( ( <gfs_outtab>-zxzj - <gfs_outtab>-zyzj ) / <gfs_outtab>-zyzj ) * 100. "价格变动比例 = 100* (【调整后总单价(未税)➖调整前总单价(未税)】/调整前总单价(未税) )
ENDIF.
IF <gfs_outtab>-zthsx IS INITIAL.
<gfs_outtab>-zthsx = sy-datum. "调后生效日期
ENDIF.
ENDIF.
ENDIF.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
lv_stable-row = 'X'.
lv_stable-col = 'X'.
gs_layout-cwidth_opt = 'X'.
CALL METHOD go_grid->set_frontend_layout
EXPORTING
is_layout = gs_layout.
CALL METHOD go_grid->refresh_table_display
EXPORTING
is_stable = lv_stable.
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = go_grid.
CALL METHOD cl_gui_cfw=>flush.
ENDMETHOD.
" 实现ENTER 事件方法
METHOD handle_enter.
TYPES: BEGIN OF lty_data,
zdjba TYPE zsdt040a-zdjba,
vkorg TYPE zsdt040a-vkorg,
zhjrq TYPE zsdt040a-zhjrq,
kunnr TYPE zsdt040a-kunnr,
vtweg TYPE zsdt040a-vtweg,
posnr TYPE zsdt040b-posnr,
matnr TYPE zsdt040b-matnr,
zyjg TYPE zsdt040b-zyjg,
zyjg1 TYPE zsdt040b-zyjg1,
zyks TYPE zsdt040b-zyks,
zyjs TYPE zsdt040b-zyjs,
zyzj TYPE zsdt040b-zyzj,
ztqsx TYPE zsdt040b-ztqsx,
ztqsxrq TYPE zsdt040b-ztqsxrq,
END OF lty_data.
DATA gs_layout TYPE lvc_s_layo.
DATA: lv_stable TYPE lvc_s_stbl.
DATA: lt_makt TYPE TABLE OF makt,
ls_makt TYPE makt,
lt_mara TYPE TABLE OF mara,
ls_mara TYPE mara,
lt_head TYPE TABLE OF zsdt040a,
ls_head TYPE zsdt040a,
lt_data TYPE TABLE OF lty_data,
ls_data TYPE lty_data.
CLEAR: lv_stable,
lt_makt,
ls_makt,
lt_mara,
ls_mara,
lt_head,
ls_head,
lt_data,
ls_data.
LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <gfs_outtab>-matnr
IMPORTING
output = <gfs_outtab>-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDLOOP.
IF gt_outtab IS NOT INITIAL.
SELECT * INTO TABLE lt_makt
FROM makt
FOR ALL ENTRIES IN gt_outtab
WHERE matnr = gt_outtab-matnr
AND spras = sy-langu.
SELECT * INTO TABLE lt_mara
FROM mara
FOR ALL ENTRIES IN gt_outtab
WHERE matnr = gt_outtab-matnr.
ENDIF.
SELECT zsdt040a~zdjba
zsdt040a~vkorg
zsdt040a~zhjrq
zsdt040a~kunnr
zsdt040a~vtweg
zsdt040b~posnr
zsdt040b~matnr
zsdt040b~zyjg
zsdt040b~zyjg1
zsdt040b~zyks
zsdt040b~zyjs
zsdt040b~zyzj
zsdt040b~ztqsx
zsdt040b~ztqsxrq
INTO TABLE lt_data
FROM zsdt040a INNER JOIN zsdt040b ON zsdt040a~zdjba = zsdt040b~zdjba
FOR ALL ENTRIES IN gt_outtab
WHERE vkorg = gs_header-vkorg
AND kunnr = gs_header-kunnr
AND vtweg = gs_header-vtweg
AND matnr = gt_outtab-matnr.
SORT lt_data BY zhjrq DESCENDING.
LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
READ TABLE lt_makt INTO ls_makt WITH KEY matnr = <gfs_outtab>-matnr.
IF sy-subrc = 0.
<gfs_outtab>-maktx = ls_makt-maktx. "物料描述
ENDIF.
READ TABLE lt_mara INTO ls_mara WITH KEY matnr = <gfs_outtab>-matnr.
IF sy-subrc = 0.
<gfs_outtab>-zprodmodel = ls_mara-zprodmodel. "规格型号
<gfs_outtab>-meins = ls_mara-meins. "单位
ENDIF.
IF gs_header-status <> '1' AND gs_header-status <> '2' AND gs_header-status <> '4'.
READ TABLE lt_data INTO ls_data WITH KEY matnr = <gfs_outtab>-matnr.
IF sy-subrc = 0.
<gfs_outtab>-zyjg = ls_data-zyjg.
<gfs_outtab>-zyjg1 = ls_data-zyjg1.
<gfs_outtab>-zyks = ls_data-zyks.
<gfs_outtab>-zyjs = ls_data-zyjs.
<gfs_outtab>-zyzj = ls_data-zyzj.
<gfs_outtab>-ztqsx = ls_data-ztqsx.
<gfs_outtab>-ztqsxrq = ls_data-ztqsxrq.
ENDIF.
ENDIF.
ENDLOOP.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
lv_stable-row = 'X'.
lv_stable-col = 'X'.
gs_layout-cwidth_opt = 'X'.
CALL METHOD go_grid->set_frontend_layout
EXPORTING
is_layout = gs_layout.
CALL METHOD go_grid->refresh_table_display
EXPORTING
is_stable = lv_stable.
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = go_grid.
CALL METHOD cl_gui_cfw=>flush.
ENDMETHOD. "HANDLE_MODIFY
METHOD handle_f4_help.
FIELD-SYMBOLS:<fs_outtab> LIKE LINE OF gt_outtab.
CASE e_fieldname.
WHEN 'ZJGLX'.
READ TABLE gt_outtab ASSIGNING <fs_outtab> INDEX es_row_no-row_id.
IF sy-subrc = 0.
PERFORM frm_get_arktx_f4 CHANGING <fs_outtab>-zjglx.
ENDIF.
WHEN 'ZHJSZ'.
READ TABLE gt_outtab ASSIGNING <fs_outtab> INDEX es_row_no-row_id.
IF sy-subrc = 0.
PERFORM frm_get_zhjsz_f4 CHANGING <fs_outtab>-zhjsz.
ENDIF.
WHEN OTHERS.
ENDCASE.
CALL METHOD go_grid->refresh_table_display.
ENDMETHOD.
ENDCLASS. "cl_event_receiver IMPLEMENTATION
DATA: lo_event TYPE REF TO cl_event_receiver.
2. PBO和PAI实现
PROCESS BEFORE OUTPUT.
MODULE status_9001.
*
PROCESS AFTER INPUT.
MODULE user_eixt AT EXIT-COMMAND.
CHAIN.
FIELD gs_header-kunnr MODULE change_data ON CHAIN-REQUEST.
ENDCHAIN.
MODULE user_command_9001.
3. PBO MODULE代码实现
*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
DATA: rt_extab TYPE slis_t_extab,
ls_extab TYPE slis_extab.
IF gs_header-status <> '0'. "修改按钮是否灰掉状态控制
ls_extab-fcode = '&EDIT'.
APPEND ls_extab TO rt_extab.
CLEAR: ls_extab.
ENDIF.
IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
ls_extab-fcode = '&SAVE'.
APPEND ls_extab TO rt_extab.
CLEAR: ls_extab.
ls_extab-fcode = '&SUBMIT'.
APPEND ls_extab TO rt_extab.
CLEAR: ls_extab.
ENDIF.
IF gs_header-status <> '2'. "反审核按钮是否灰掉状态控制
ls_extab-fcode = '&RECHECK'.
APPEND ls_extab TO rt_extab.
CLEAR: ls_extab.
ENDIF.
ls_extab-fcode = 'SAVE'.
APPEND ls_extab TO rt_extab.
CLEAR: ls_extab.
SET PF-STATUS 'PF-STATUS9001' EXCLUDING rt_extab.
SET TITLEBAR 'TITLEBAR9001'.
IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
LOOP AT SCREEN.
IF screen-name = 'GS_HEADER-ZKHJL' OR screen-name = 'GS_HEADER-VKORG'
OR screen-name = 'GS_HEADER-ZHJRQ' OR screen-name = 'GS_HEADER-KUNNR'
OR screen-name = 'GS_HEADER-WAERK' OR screen-name = 'GS_HEADER-VTWEG'
OR screen-name = 'GS_HEADER-ZGCML' OR screen-name = 'GS_HEADER-ZSJML'
OR screen-name = 'GS_HEADER-ZSFMJ'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
* 明细行展示
* 初始化
PERFORM frm_instantiation.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_instantiation
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_instantiation .
DATA: ls_stbl TYPE lvc_s_stbl,
ls_layout TYPE lvc_s_layo.
* PERFORM frm_set_fieldcat_9001.
IF go_container IS INITIAL.
CREATE OBJECT go_container
EXPORTING
container_name = 'CONT'.
CREATE OBJECT go_grid
EXPORTING
i_parent = go_container.
* ALV展示
*
* CALL METHOD cl_gui_cfw=>set_new_ok_code
* EXPORTING
* new_code = '&REFRESH'.
PERFORM frm_display.
ELSE.
* IF go_container IS NOT INITIAL.
* CREATE OBJECT go_grid
* EXPORTING
* i_parent = go_container.
IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
CALL METHOD go_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 0.
ENDIF.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
ls_layout-cwidth_opt = 'X'.
CALL METHOD go_grid->set_frontend_layout
EXPORTING
is_layout = ls_layout.
ls_stbl-row = 'X'." 基于行的稳定刷新
ls_stbl-col = 'X'." 基于列稳定刷新
CALL METHOD go_grid->refresh_table_display
EXPORTING
is_stable = ls_stbl
EXCEPTIONS
finished = 1
OTHERS = 2.
CALL METHOD cl_gui_cfw=>flush.
* ENDIF.
ENDIF.
ENDFORM.
4. 注册事件实现
DATA: g_tool_data TYPE scc_wb_tool_data.
DATA: ls_layout TYPE lvc_s_layo,
lt_fieldcat TYPE TABLE OF lvc_s_fcat,
ls_fieldcat TYPE lvc_s_fcat,
ls_stbl TYPE lvc_s_stbl.
DATA:lt_f4 TYPE lvc_t_f4,
ls_f4 TYPE lvc_s_f4.
FIELD-SYMBOLS: <lfs_fieldcat> TYPE lvc_s_fcat.
DEFINE d1.
ls_fieldcat-fieldname = &1.
ls_fieldcat-scrtext_l = &2.
ls_fieldcat-edit = &3.
ls_fieldcat-intlen = &4.
ls_fieldcat-outputlen = &5.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
END-OF-DEFINITION.
d1: 'POSNR' '序号' '' 10 10.
d1:'MATNR' '物料编码' '' 40 40.
d1:'MAKTX' '物料名称' '' 40 40.
d1:'ZPRODMODEL' '产品型号' '' 50 50.
d1:'MEINS' '单位' '' 10 10.
d1: 'ZJGLX' '价格类型' '' 10 10.
d1: 'ZHJSZ' '税种' '' 2 2.
LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'MATNR'.
<lfs_fieldcat>-ref_table = 'MARA'.
<lfs_fieldcat>-ref_field = 'MATNR'.
<lfs_fieldcat>-dd_outlen = 40.
IF sy-langu = '1'.
<lfs_fieldcat>-coltext = '物料编码'.
ELSE.
<lfs_fieldcat>-coltext = 'Material No'.
ENDIF.
ENDLOOP.
LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZJGLX' OR fieldname = 'ZHJSZ'. "价格类型搜索帮助
<lfs_fieldcat>-f4availabl = 'X'.
ENDLOOP.
CREATE OBJECT lo_event.
* 注册事件handler方法
SET HANDLER lo_event->handle_enter FOR go_grid.
SET HANDLER lo_event->handle_data_changed FOR go_grid.
SET HANDLER lo_event->handle_data_changed_finished FOR go_grid.
CALL METHOD go_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
CALL METHOD go_grid->register_edit_event "为ALV_GRID设置enter事件
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
is_layout = ls_layout
CHANGING
it_fieldcatalog = lt_fieldcat
it_outtab = gt_outtab[].
* Set editable cells to ready for input initially
CALL METHOD go_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
CLEAR:ls_f4.
ls_f4-fieldname = 'ZJGLX'. "价格类型搜索帮助
ls_f4-register = 'X'.
ls_f4-getbefore = 'X'.
ls_f4-chngeafter = ''.
ls_f4-internal = ''.
INSERT ls_f4 INTO TABLE lt_f4.
CLEAR:ls_f4.
ls_f4-fieldname = 'ZHJSZ'. "价格类型搜索帮助
ls_f4-register = 'X'.
ls_f4-getbefore = 'X'.
ls_f4-chngeafter = ''.
ls_f4-internal = ''.
INSERT ls_f4 INTO TABLE lt_f4.
CALL METHOD go_grid->register_f4_for_fields
EXPORTING
it_f4 = lt_f4.
SET HANDLER lo_event->handle_f4_help FOR go_grid .
IF go_container IS NOT INITIAL.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
ls_layout-cwidth_opt = 'X'.
CALL METHOD go_grid->set_frontend_layout
EXPORTING
is_layout = ls_layout.
ls_stbl-row = 'X'." 基于行的稳定刷新
ls_stbl-col = 'X'." 基于列稳定刷新
CALL METHOD go_grid->refresh_table_display
EXPORTING
is_stable = ls_stbl
EXCEPTIONS
finished = 1
OTHERS = 2.
CALL METHOD cl_gui_cfw=>flush.
ENDIF.
完整代码实现如下:
*&---------------------------------------------------------------------*
*& Report ZSD040
*&---------------------------------------------------------------------*
*&销售核价平台
*&---------------------------------------------------------------------*
REPORT zsd040.
*--------------------------------------------------------------------*
*变量定义
*--------------------------------------------------------------------*
TYPE-POOLS:icon.
TABLES: vbak, zsdt040a, zsdt040b.
DATA: ok_code TYPE sy-ucomm,
gt_header TYPE TABLE OF zsdt040a,
gs_header TYPE zsdt040a,
gt_item TYPE TABLE OF zsdt040b,
gs_item TYPE zsdt040b,
gv_vtext TYPE tvkot-vtext. "销售组织名称
DATA: gv_vtext_jt TYPE tvk6t-vtext, "集团
gv_vtext_hy TYPE tbrct-vtext. "行业
DATA: go_grid TYPE REF TO cl_gui_alv_grid,
go_container TYPE REF TO cl_gui_custom_container.
CLASS cl_event_receiver DEFINITION DEFERRED.
DATA: g_verifier TYPE REF TO cl_event_receiver.
DATA: gt_outtab TYPE TABLE OF zsdt040b.
DATA: gs_outtab TYPE zsdt040b.
DATA: initial_table TYPE c.
DATA: error_in_data TYPE c.
*DATA: lt_fieldcat TYPE TABLE OF lvc_s_fcat,
* ls_fieldcat TYPE lvc_s_fcat.
TYPES: BEGIN OF gty_alv,
sel TYPE c LENGTH 1, "选择
msg_type TYPE c, "消息类型
msg_status TYPE c LENGTH 4, "消息状态
message TYPE bapi_msg, "消息
knumv TYPE knumv, "定价记录号
kschl TYPE kscha, "条件类型
zdjba TYPE zdjba, "单据编号
posnr TYPE posnr, "行项目编号
kunnr TYPE kna1-kunnr, "客户
name1 TYPE c LENGTH 70, "客户名称
vkorg TYPE vbak-vkorg, "销售组织
vtext TYPE tvkot-vtext, "销售组织描述
status TYPE zsdt040a-status, "单据状态
status_text TYPE c LENGTH 10, "单据状态描述
vtweg TYPE vbak-vtweg, "分销渠道
matnr TYPE mara-matnr, "物料
meins TYPE mara-meins, "单位
zyjg TYPE zsdt040b-zyjg, "原商品售价(未税)
zysl TYPE zsdt040b-zysl, "原分摊数量
zyks TYPE zsdt040b-zyks, "原模具分摊日期起始日期
zyjs TYPE zsdt040b-zyjs, "原分摊日期截止日期
zthsxrq TYPE zsdt040b-zthsxrq, "调后失效日期
zthsx TYPE zsdt040b-zthsx, "调后生效日期
waerk TYPE zsdt040b-waerk, "币别
zxzj TYPE zsdt040b-zxzj, "调整后总单价(未税)
END OF gty_alv.
DATA: gt_structure TYPE lvc_t_fcat,
gs_structure TYPE lvc_s_fcat,
gs_layout TYPE lvc_s_layo,
gt_alv TYPE TABLE OF gty_alv,
gs_alv TYPE gty_alv,
gv_upd TYPE c.
CONSTANTS: gc_red TYPE char04 VALUE '@0A@'. "红色
CONSTANTS: gc_green TYPE char04 VALUE '@08@'. "绿色
CONSTANTS: gc_yellow TYPE char04 VALUE '@09@'. "黄色
CONSTANTS: gc_grey TYPE char04 VALUE '@EB@'. "灰色
FIELD-SYMBOLS: <gfs_outtab> TYPE zsdt040b.
CLASS cl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.
METHODS:
handle_data_changed_finished
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING et_good_cells.
" ENTE时触发
METHODS handle_enter
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells.
METHODS: handle_f4_help FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname
es_row_no
er_event_data
et_bad_cells
e_display.
PRIVATE SECTION.
ENDCLASS. "CL_EVENT_RECEIVER DEFINITION
CLASS cl_event_receiver IMPLEMENTATION.
METHOD handle_data_changed.
DATA gs_layout TYPE lvc_s_layo.
DATA: lv_stable TYPE lvc_s_stbl.
* IF er_data_changed->mt_good_cells IS NOT INITIAL.
* READ TABLE er_data_changed->mt_good_cells ASSIGNING FIELD-SYMBOL(<lfs_cell>) INDEX 1.
* READ TABLE gt_outtab ASSIGNING <gfs_outtab> INDEX <lfs_cell>-row_id.
* IF sy-subrc = 0.
* <gfs_outtab>-waerk = gs_header-waerk.
* ENDIF.
* ENDIF.
*
* "冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
* CALL METHOD cl_gui_cfw=>set_new_ok_code
* EXPORTING
* new_code = 'RELOAD'.
*
* lv_stable-row = '1'.
* lv_stable-col = '1'.
*
* gs_layout-cwidth_opt = 'X'.
*
* CALL METHOD go_grid->set_frontend_layout
* EXPORTING
* is_layout = gs_layout.
*
* CALL METHOD go_grid->refresh_table_display
* EXPORTING
* is_stable = lv_stable.
*
* CALL METHOD cl_gui_control=>set_focus
* EXPORTING
* control = go_grid.
* CALL METHOD cl_gui_cfw=>flush.
ENDMETHOD.
METHOD handle_data_changed_finished.
DATA gs_layout TYPE lvc_s_layo.
DATA: lv_stable TYPE lvc_s_stbl.
TYPES: BEGIN OF lty_combine,
aland TYPE mlan-aland,
taxkd TYPE knvi-taxkd,
taxm1 TYPE mlan-taxm1,
END OF lty_combine.
DATA: lv_kunnr TYPE kna1-kunnr,
ls_knvv TYPE knvv,
ls_kna1 TYPE kna1,
lt_knmt TYPE TABLE OF knmt,
ls_knmt TYPE knmt,
ls_tcurr TYPE tcurr,
lt_mlan TYPE TABLE OF mlan,
ls_mlan TYPE mlan,
lt_knvi TYPE TABLE OF knvi,
ls_knvi TYPE knvi,
lt_t007s TYPE TABLE OF t007s,
ls_t007s TYPE t007s,
lt_a002 TYPE TABLE OF a002,
ls_a002 TYPE a002,
lt_konp TYPE TABLE OF konp,
ls_konp TYPE konp,
lt_combine TYPE TABLE OF lty_combine,
ls_combine TYPE lty_combine.
CLEAR: lv_kunnr,
ls_knvv,
ls_kna1,
lt_knmt,
ls_knmt,
ls_tcurr,
lt_mlan,
ls_mlan,
lt_knvi,
ls_knvi,
lt_t007s,
ls_t007s,
lt_a002,
ls_a002,
lt_konp,
ls_konp,
lt_combine,
ls_combine.
lv_kunnr = gs_header-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_kunnr
IMPORTING
output = lv_kunnr.
IF et_good_cells IS NOT INITIAL.
READ TABLE et_good_cells ASSIGNING FIELD-SYMBOL(<lfs_cell>) INDEX 1.
READ TABLE gt_outtab ASSIGNING <gfs_outtab> INDEX <lfs_cell>-row_id.
IF sy-subrc = 0.
<gfs_outtab>-waerk = gs_header-waerk.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <gfs_outtab>-matnr
IMPORTING
output = <gfs_outtab>-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
SELECT * INTO TABLE lt_knmt
FROM knmt
WHERE matnr = <gfs_outtab>-matnr
AND vkorg = gs_header-vkorg
AND vtweg = gs_header-vtweg
AND kunnr = lv_kunnr.
SELECT * INTO TABLE lt_mlan
FROM mlan
WHERE matnr = <gfs_outtab>-matnr.
SELECT * INTO TABLE lt_knvi
FROM knvi
WHERE kunnr = lv_kunnr
AND tatyp = 'MWST'.
LOOP AT lt_mlan INTO ls_mlan.
READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
IF ls_mlan-aland = ls_knvi-aland.
ls_combine-aland = ls_mlan-aland.
ls_combine-taxkd = ls_knvi-taxkd.
ls_combine-taxm1 = ls_mlan-taxm1.
COLLECT ls_combine INTO lt_combine.
CLEAR: ls_combine.
ENDIF.
ENDLOOP.
SELECT * INTO TABLE lt_a002
FROM a002
FOR ALL ENTRIES IN lt_combine
WHERE kappl = 'V'
AND kschl = 'MWST'
AND aland = lt_combine-aland
AND taxk1 = lt_combine-taxkd
AND taxm1 = lt_combine-taxm1
AND datbi >= sy-datum
AND datab <= sy-datum.
IF lt_a002 IS NOT INITIAL.
SELECT * INTO TABLE lt_konp
FROM konp
FOR ALL ENTRIES IN lt_a002
WHERE knumh = lt_a002-knumh
AND kappl = 'V'
AND kschl = 'MWST'.
ENDIF.
SELECT SINGLE * INTO ls_tcurr
FROM tcurr
WHERE kurst = 'M'
AND fcurr = gs_header-waerk
AND tcurr = 'CNY'.
<gfs_outtab>-waerk = gs_header-waerk. "货币
IF <gfs_outtab>-zdyhl IS INITIAL.
IF <gfs_outtab>-waerk = 'CNY'.
<gfs_outtab>-zdyhl = '1.00000'. "当月汇率
ELSE.
<gfs_outtab>-zdyhl = ls_tcurr-ukurs. "
ENDIF.
ENDIF.
IF <gfs_outtab>-zbjhl IS INITIAL.
<gfs_outtab>-zbjhl = '1.00000'. "报价汇率
ENDIF.
IF <gfs_outtab>-kdmat IS INITIAL.
READ TABLE lt_knmt INTO ls_knmt WITH KEY matnr = <gfs_outtab>-matnr.
IF sy-subrc = 0.
<gfs_outtab>-kdmat = ls_knmt-kdmat. "客户物料
ENDIF.
ENDIF.
IF <gfs_outtab>-zhjsz IS INITIAL.
READ TABLE lt_mlan INTO ls_mlan WITH KEY matnr = <gfs_outtab>-matnr.
READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
IF ls_mlan-aland = ls_knvi-aland.
READ TABLE lt_a002 INTO ls_a002 WITH KEY aland = ls_mlan-aland
taxk1 = ls_knvi-taxkd
taxm1 = ls_mlan-taxm1.
IF sy-subrc = 0.
READ TABLE lt_konp INTO ls_konp WITH KEY knumh = ls_a002-knumh.
IF sy-subrc = 0.
<gfs_outtab>-zhjsz = ls_konp-mwsk1. "税种
ENDIF.
ENDIF.
ENDIF.
ENDIF.
<gfs_outtab>-zxzj = <gfs_outtab>-zxjg + <gfs_outtab>-zxmjjg. "调整后总单价(未税) = 新产品售价(未税)+新模具分摊售价(未税)
IF <gfs_outtab>-zyzj IS INITIAL.
<gfs_outtab>-zjgbd = 0.
ELSE.
<gfs_outtab>-zjgbd = ( ( <gfs_outtab>-zxzj - <gfs_outtab>-zyzj ) / <gfs_outtab>-zyzj ) * 100. "价格变动比例 = 100* (【调整后总单价(未税)➖调整前总单价(未税)】/调整前总单价(未税) )
ENDIF.
IF <gfs_outtab>-zthsx IS INITIAL.
<gfs_outtab>-zthsx = sy-datum. "调后生效日期
ENDIF.
ENDIF.
ENDIF.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
lv_stable-row = 'X'.
lv_stable-col = 'X'.
gs_layout-cwidth_opt = 'X'.
CALL METHOD go_grid->set_frontend_layout
EXPORTING
is_layout = gs_layout.
CALL METHOD go_grid->refresh_table_display
EXPORTING
is_stable = lv_stable.
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = go_grid.
CALL METHOD cl_gui_cfw=>flush.
ENDMETHOD.
" 实现ENTER 事件方法
METHOD handle_enter.
TYPES: BEGIN OF lty_data,
zdjba TYPE zsdt040a-zdjba,
vkorg TYPE zsdt040a-vkorg,
zhjrq TYPE zsdt040a-zhjrq,
kunnr TYPE zsdt040a-kunnr,
vtweg TYPE zsdt040a-vtweg,
posnr TYPE zsdt040b-posnr,
matnr TYPE zsdt040b-matnr,
zyjg TYPE zsdt040b-zyjg,
zyjg1 TYPE zsdt040b-zyjg1,
zyks TYPE zsdt040b-zyks,
zyjs TYPE zsdt040b-zyjs,
zyzj TYPE zsdt040b-zyzj,
ztqsx TYPE zsdt040b-ztqsx,
ztqsxrq TYPE zsdt040b-ztqsxrq,
END OF lty_data.
DATA gs_layout TYPE lvc_s_layo.
DATA: lv_stable TYPE lvc_s_stbl.
DATA: lt_makt TYPE TABLE OF makt,
ls_makt TYPE makt,
lt_mara TYPE TABLE OF mara,
ls_mara TYPE mara,
lt_head TYPE TABLE OF zsdt040a,
ls_head TYPE zsdt040a,
lt_data TYPE TABLE OF lty_data,
ls_data TYPE lty_data.
CLEAR: lv_stable,
lt_makt,
ls_makt,
lt_mara,
ls_mara,
lt_head,
ls_head,
lt_data,
ls_data.
LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <gfs_outtab>-matnr
IMPORTING
output = <gfs_outtab>-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDLOOP.
IF gt_outtab IS NOT INITIAL.
SELECT * INTO TABLE lt_makt
FROM makt
FOR ALL ENTRIES IN gt_outtab
WHERE matnr = gt_outtab-matnr
AND spras = sy-langu.
SELECT * INTO TABLE lt_mara
FROM mara
FOR ALL ENTRIES IN gt_outtab
WHERE matnr = gt_outtab-matnr.
ENDIF.
SELECT zsdt040a~zdjba
zsdt040a~vkorg
zsdt040a~zhjrq
zsdt040a~kunnr
zsdt040a~vtweg
zsdt040b~posnr
zsdt040b~matnr
zsdt040b~zyjg
zsdt040b~zyjg1
zsdt040b~zyks
zsdt040b~zyjs
zsdt040b~zyzj
zsdt040b~ztqsx
zsdt040b~ztqsxrq
INTO TABLE lt_data
FROM zsdt040a INNER JOIN zsdt040b ON zsdt040a~zdjba = zsdt040b~zdjba
FOR ALL ENTRIES IN gt_outtab
WHERE vkorg = gs_header-vkorg
AND kunnr = gs_header-kunnr
AND vtweg = gs_header-vtweg
AND matnr = gt_outtab-matnr.
SORT lt_data BY zhjrq DESCENDING.
LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
READ TABLE lt_makt INTO ls_makt WITH KEY matnr = <gfs_outtab>-matnr.
IF sy-subrc = 0.
<gfs_outtab>-maktx = ls_makt-maktx. "物料描述
ENDIF.
READ TABLE lt_mara INTO ls_mara WITH KEY matnr = <gfs_outtab>-matnr.
IF sy-subrc = 0.
<gfs_outtab>-zprodmodel = ls_mara-zprodmodel. "规格型号
<gfs_outtab>-meins = ls_mara-meins. "单位
ENDIF.
IF gs_header-status <> '1' AND gs_header-status <> '2' AND gs_header-status <> '4'.
READ TABLE lt_data INTO ls_data WITH KEY matnr = <gfs_outtab>-matnr.
IF sy-subrc = 0.
<gfs_outtab>-zyjg = ls_data-zyjg.
<gfs_outtab>-zyjg1 = ls_data-zyjg1.
<gfs_outtab>-zyks = ls_data-zyks.
<gfs_outtab>-zyjs = ls_data-zyjs.
<gfs_outtab>-zyzj = ls_data-zyzj.
<gfs_outtab>-ztqsx = ls_data-ztqsx.
<gfs_outtab>-ztqsxrq = ls_data-ztqsxrq.
ENDIF.
ENDIF.
ENDLOOP.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
lv_stable-row = 'X'.
lv_stable-col = 'X'.
gs_layout-cwidth_opt = 'X'.
CALL METHOD go_grid->set_frontend_layout
EXPORTING
is_layout = gs_layout.
CALL METHOD go_grid->refresh_table_display
EXPORTING
is_stable = lv_stable.
CALL METHOD cl_gui_control=>set_focus
EXPORTING
control = go_grid.
CALL METHOD cl_gui_cfw=>flush.
ENDMETHOD. "HANDLE_MODIFY
METHOD handle_f4_help.
FIELD-SYMBOLS:<fs_outtab> LIKE LINE OF gt_outtab.
CASE e_fieldname.
WHEN 'ZJGLX'.
READ TABLE gt_outtab ASSIGNING <fs_outtab> INDEX es_row_no-row_id.
IF sy-subrc = 0.
PERFORM frm_get_arktx_f4 CHANGING <fs_outtab>-zjglx.
ENDIF.
WHEN 'ZHJSZ'.
READ TABLE gt_outtab ASSIGNING <fs_outtab> INDEX es_row_no-row_id.
IF sy-subrc = 0.
PERFORM frm_get_zhjsz_f4 CHANGING <fs_outtab>-zhjsz.
ENDIF.
WHEN OTHERS.
ENDCASE.
CALL METHOD go_grid->refresh_table_display.
ENDMETHOD.
ENDCLASS. "cl_event_receiver IMPLEMENTATION
DATA: lo_event TYPE REF TO cl_event_receiver.
*--------------------------------------------------------------------*
*选择屏幕
*--------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_r1 TYPE c RADIOBUTTON GROUP grp USER-COMMAND uc DEFAULT 'X'. "核价申请
SELECTION-SCREEN COMMENT 2(23) TEXT-002 FOR FIELD p_r1.
PARAMETERS: p_r2 TYPE c RADIOBUTTON GROUP grp. "核价清单
SELECTION-SCREEN COMMENT 27(23) TEXT-003 FOR FIELD p_r2.
SELECTION-SCREEN END OF LINE.
PARAMETERS: p_vkorg TYPE vbak-vkorg MODIF ID md1.
SELECT-OPTIONS: s_zdjba FOR zsdt040a-zdjba MODIF ID md2 MATCHCODE OBJECT zdjba_esh, "核价单号
s_zhjrq FOR zsdt040a-zhjrq MODIF ID md2, "核价日期
s_kunnr FOR zsdt040a-kunnr MODIF ID md2, "客户
s_vkorg FOR zsdt040a-vkorg MODIF ID md2, "销售组织
s_status FOR zsdt040a-status MODIF ID md2. "审批状态
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
PERFORM frm_init.
AT SELECTION-SCREEN OUTPUT.
PERFORM frm_set_attribute.
AT SELECTION-SCREEN.
PERFORM frm_check_input.
START-OF-SELECTION.
IF p_r1 IS NOT INITIAL. "核价申请
PERFORM frm_get_data.
CALL SCREEN 9001.
ELSE. "核价清单
* PERFORM frm_set_fieldcat.
*
* PERFORM frm_set_layout.
*
* PERFORM frm_get_data_list.
*
* PERFORM frm_display_alv_list.
SUBMIT zsd040a USING SELECTION-SCREEN '1000'
WITH s_zdjba IN s_zdjba
WITH s_zhjrq IN s_zhjrq
WITH s_kunnr IN s_kunnr
WITH s_vkorg IN s_vkorg
WITH s_status IN s_status
AND RETURN.
ENDIF.
*&---------------------------------------------------------------------*
*& Form frm_init
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_init .
DATA: ls_header TYPE zsdt040a,
lt_outtab TYPE TABLE OF zsdt040b,
lv_upd TYPE c.
CLEAR: gt_header,
gs_header,
gt_item,
gs_item,
gt_structure,
gs_structure,
gs_layout,
gt_alv,
gs_alv,
ls_header,
lt_outtab,
gv_upd,
lv_upd.
IMPORT ls_header FROM MEMORY ID 'ZSD040A-1'.
IMPORT lt_outtab FROM MEMORY ID 'ZSD040A-2'.
IMPORT lv_upd FROM MEMORY ID 'ZSD040A-3'.
gs_header = ls_header.
gt_outtab = lt_outtab.
gv_upd = lv_upd.
FREE MEMORY ID 'ZSD040A-1'.
FREE MEMORY ID 'ZSD040A-2'.
FREE MEMORY ID 'ZSD040A-3'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_attribute
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_attribute .
LOOP AT SCREEN.
IF p_r1 IS NOT INITIAL.
IF screen-group1 = 'MD2'.
screen-invisible = 1.
screen-active = 0.
screen-required = 0.
ELSE.
screen-invisible = 0.
screen-active = 1.
screen-required = 2.
ENDIF.
ELSE.
IF screen-group1 = 'MD1'.
screen-invisible = 1.
screen-active = 0.
ELSE.
screen-invisible = 0.
screen-active = 1.
IF screen-name = 'S_ZHJRQ-LOW'.
screen-required = 2.
ENDIF.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_input
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_check_input .
IF sy-ucomm <> 'UC' AND
sy-ucomm <> '%011'.
IF p_r1 IS NOT INITIAL.
IF p_vkorg IS INITIAL.
IF sy-langu = '1'.
MESSAGE '在必填字段 "销售组织" 中进行输入' TYPE 'E'.
ELSE.
MESSAGE 'Make an entry in mandatory field "Sales Organization"' TYPE 'E'.
ENDIF.
ENDIF.
ELSE.
IF s_zhjrq[] IS INITIAL.
IF sy-langu = '1'.
MESSAGE '在必填字段 "核价日期" 中进行输入' TYPE 'E'.
ELSE.
MESSAGE 'Make an entry in mandatory field "Valuation date"' TYPE 'E'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
* 权限检查
IF p_r1 IS NOT INITIAL.
AUTHORITY-CHECK OBJECT 'V_VBRK_VKO'
ID 'VKORG' FIELD p_vkorg
ID 'ACTVT' FIELD '03'.
IF sy-subrc <> 0.
IF sy-langu = '1'.
MESSAGE '您没有权限,请联系管理员' TYPE 'E'.
ELSE.
MESSAGE 'You do not have permission, please contact the administrator' TYPE 'E'.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
DATA: rt_extab TYPE slis_t_extab,
ls_extab TYPE slis_extab.
IF gs_header-status <> '0'. "修改按钮是否灰掉状态控制
ls_extab-fcode = '&EDIT'.
APPEND ls_extab TO rt_extab.
CLEAR: ls_extab.
ENDIF.
IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
ls_extab-fcode = '&SAVE'.
APPEND ls_extab TO rt_extab.
CLEAR: ls_extab.
ls_extab-fcode = '&SUBMIT'.
APPEND ls_extab TO rt_extab.
CLEAR: ls_extab.
ENDIF.
IF gs_header-status <> '2'. "反审核按钮是否灰掉状态控制
ls_extab-fcode = '&RECHECK'.
APPEND ls_extab TO rt_extab.
CLEAR: ls_extab.
ENDIF.
ls_extab-fcode = 'SAVE'.
APPEND ls_extab TO rt_extab.
CLEAR: ls_extab.
SET PF-STATUS 'PF-STATUS9001' EXCLUDING rt_extab.
SET TITLEBAR 'TITLEBAR9001'.
IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
LOOP AT SCREEN.
IF screen-name = 'GS_HEADER-ZKHJL' OR screen-name = 'GS_HEADER-VKORG'
OR screen-name = 'GS_HEADER-ZHJRQ' OR screen-name = 'GS_HEADER-KUNNR'
OR screen-name = 'GS_HEADER-WAERK' OR screen-name = 'GS_HEADER-VTWEG'
OR screen-name = 'GS_HEADER-ZGCML' OR screen-name = 'GS_HEADER-ZSJML'
OR screen-name = 'GS_HEADER-ZSFMJ'.
screen-input = 0.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDIF.
* 明细行展示
* 初始化
PERFORM frm_instantiation.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_EIXT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_eixt INPUT.
CLEAR: ok_code.
ok_code = sy-ucomm.
CASE ok_code.
WHEN 'EXIT' OR 'BACK' OR 'CANCEL'.
CLEAR: gs_header,
gt_outtab,
gs_outtab,
go_grid,
go_container.
LEAVE TO SCREEN 0.
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9001 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_9001 INPUT.
TYPES: BEGIN OF lty_combine,
aland TYPE mlan-aland,
taxkd TYPE knvi-taxkd,
taxm1 TYPE mlan-taxm1,
END OF lty_combine.
DATA: lv_kunnr TYPE kna1-kunnr,
ls_knvv TYPE knvv,
ls_kna1 TYPE kna1,
lt_knmt TYPE TABLE OF knmt,
ls_knmt TYPE knmt,
ls_tcurr TYPE tcurr,
lt_mlan TYPE TABLE OF mlan,
ls_mlan TYPE mlan,
lt_knvi TYPE TABLE OF knvi,
ls_knvi TYPE knvi,
lt_t007s TYPE TABLE OF t007s,
ls_t007s TYPE t007s,
lt_a002 TYPE TABLE OF a002,
ls_a002 TYPE a002,
lt_konp TYPE TABLE OF konp,
ls_konp TYPE konp,
lt_combine TYPE TABLE OF lty_combine,
ls_combine TYPE lty_combine,
nr TYPE inri-nrrangenr,
object TYPE inri-object,
lv_zdjba TYPE zdjba,
lv_error TYPE c,
lt_header_data TYPE TABLE OF zsdt040a,
ls_header_data TYPE zsdt040a,
lt_item_data TYPE TABLE OF zsdt040b,
ls_item_data TYPE zsdt040b,
lv_msg TYPE string,
es_return TYPE zxxs_005.
* lv_lifnr TYPE knvp-lifnr.
CLEAR: lv_kunnr,
ls_knvv,
ls_kna1,
lt_knmt,
ls_knmt,
ls_tcurr,
lt_mlan,
ls_mlan,
lt_knvi,
ls_knvi,
lt_t007s,
ls_t007s,
lt_a002,
ls_a002,
lt_konp,
ls_konp,
lt_combine,
ls_combine,
lv_zdjba,
lv_error,
lt_header_data,
ls_header_data,
lt_item_data,
ls_item_data,
lv_msg,
* lv_lifnr,
es_return.
nr = '01'. "间隔编辑里面起始编号前面的:号"
object = 'ZSD040'. " 'ZSD040 SNRO创建的对象名称"
CLEAR: ok_code.
ok_code = sy-ucomm.
lv_kunnr = gs_header-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_kunnr
IMPORTING
output = lv_kunnr.
LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <gfs_outtab>-matnr
IMPORTING
output = <gfs_outtab>-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDLOOP.
IF gt_outtab IS NOT INITIAL.
SELECT * INTO TABLE lt_knmt
FROM knmt
FOR ALL ENTRIES IN gt_outtab
WHERE matnr = gt_outtab-matnr
AND vkorg = gs_header-vkorg
AND vtweg = '00'
AND kunnr = lv_kunnr.
SELECT * INTO TABLE lt_mlan
FROM mlan
FOR ALL ENTRIES IN gt_outtab
WHERE matnr = gt_outtab-matnr.
SELECT * INTO TABLE lt_knvi
FROM knvi
WHERE kunnr = lv_kunnr
AND tatyp = 'MWST'.
LOOP AT lt_mlan INTO ls_mlan.
READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
IF ls_mlan-aland = ls_knvi-aland.
ls_combine-aland = ls_mlan-aland.
ls_combine-taxkd = ls_knvi-taxkd.
ls_combine-taxm1 = ls_mlan-taxm1.
COLLECT ls_combine INTO lt_combine.
CLEAR: ls_combine.
ENDIF.
ENDLOOP.
SELECT * INTO TABLE lt_a002
FROM a002
FOR ALL ENTRIES IN lt_combine
WHERE kappl = 'V'
AND kschl = 'MWST'
AND aland = lt_combine-aland
AND taxk1 = lt_combine-taxkd
AND taxm1 = lt_combine-taxm1
AND datbi >= sy-datum
AND datab <= sy-datum.
IF lt_a002 IS NOT INITIAL.
SELECT * INTO TABLE lt_konp
FROM konp
FOR ALL ENTRIES IN lt_a002
WHERE knumh = lt_a002-knumh
AND kappl = 'V'
AND kschl = 'MWST'.
ENDIF.
ENDIF.
SELECT SINGLE * INTO ls_tcurr
FROM tcurr
WHERE kurst = 'M'
AND fcurr = gs_header-waerk
AND tcurr = 'CNY'.
LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
<gfs_outtab>-waerk = gs_header-waerk. "货币
IF <gfs_outtab>-zdyhl IS INITIAL.
IF <gfs_outtab>-waerk = 'CNY'.
<gfs_outtab>-zdyhl = '1.00000'. "当月汇率
ELSE.
<gfs_outtab>-zdyhl = ls_tcurr-ukurs. "
ENDIF.
ENDIF.
IF <gfs_outtab>-zbjhl IS INITIAL.
<gfs_outtab>-zbjhl = '1.00000'. "报价汇率
ENDIF.
IF <gfs_outtab>-kdmat IS INITIAL.
READ TABLE lt_knmt INTO ls_knmt WITH KEY matnr = <gfs_outtab>-matnr.
IF sy-subrc = 0.
<gfs_outtab>-kdmat = ls_knmt-kdmat. "客户物料
ENDIF.
ENDIF.
IF <gfs_outtab>-zhjsz IS INITIAL.
READ TABLE lt_mlan INTO ls_mlan WITH KEY matnr = <gfs_outtab>-matnr.
READ TABLE lt_knvi INTO ls_knvi WITH KEY kunnr = lv_kunnr.
IF ls_mlan-aland = ls_knvi-aland.
READ TABLE lt_a002 INTO ls_a002 WITH KEY aland = ls_mlan-aland
taxk1 = ls_knvi-taxkd
taxm1 = ls_mlan-taxm1.
IF sy-subrc = 0.
READ TABLE lt_konp INTO ls_konp WITH KEY knumh = ls_a002-knumh.
IF sy-subrc = 0.
<gfs_outtab>-zhjsz = ls_konp-mwsk1. "税种
ENDIF.
ENDIF.
ENDIF.
ENDIF.
<gfs_outtab>-zxzj = <gfs_outtab>-zxjg + <gfs_outtab>-zxmjjg. "调整后总单价(未税) = 新产品售价(未税)+新模具分摊售价(未税)
IF <gfs_outtab>-zyzj IS INITIAL.
<gfs_outtab>-zjgbd = 0.
ELSE.
<gfs_outtab>-zjgbd = ( ( <gfs_outtab>-zxzj - <gfs_outtab>-zyzj ) / <gfs_outtab>-zyzj ) * 100. "价格变动比例 = 100* (【调整后总单价(未税)➖调整前总单价(未税)】/调整前总单价(未税) )
ENDIF.
IF <gfs_outtab>-zthsx IS INITIAL.
<gfs_outtab>-zthsx = sy-datum. "调后生效日期
ENDIF.
ENDLOOP.
CASE ok_code.
WHEN 'ENTER'. "回车
SELECT SINGLE * INTO ls_knvv
FROM knvv
WHERE kunnr = lv_kunnr
AND vkorg = gs_header-vkorg.
IF sy-subrc <> 0.
IF sy-langu = '1'.
MESSAGE '请维护当前销售组织下的客户信息' TYPE 'E'.
ELSE.
MESSAGE 'Please maintain customer information under the current sales organization' TYPE 'E'.
ENDIF.
ELSE.
IF ls_knvv-vtweg = gs_header-vtweg AND ls_knvv-spart = '00'.
gs_header-waerk = ls_knvv-waers. "币别
ENDIF.
ENDIF.
* CLEAR: lv_lifnr.
* IF gs_header-zkhjl IS INITIAL.
* SELECT SINGLE lifnr INTO lv_lifnr "客户经理
* FROM knvp
* WHERE kunnr = lv_kunnr
* AND vkorg = gs_header-vkorg
* AND vtweg = '00'
* AND spart = '00'
* AND parvw = 'V1'.
* IF lv_lifnr IS NOT INITIAL.
* gs_header-zkhjl = lv_lifnr.
* ENDIF.
*
* ELSE.
* SELECT SINGLE lifnr INTO lv_lifnr "客户经理
* FROM knvp
* WHERE kunnr = lv_kunnr
* AND vkorg = gs_header-vkorg
* AND vtweg = '00'
* AND spart = '00'
* AND parvw = 'V1'.
* IF lv_lifnr IS NOT INITIAL.
* gs_header-zkhjl = lv_lifnr.
* ENDIF.
* ENDIF.
SELECT SINGLE * INTO ls_kna1
FROM kna1
WHERE kunnr = lv_kunnr.
IF sy-subrc = 0.
CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_header-name1. "客户名称
gs_header-katr6 = ls_kna1-katr6.
CLEAR: gv_vtext_jt.
SELECT SINGLE vtext INTO gv_vtext_jt "集团
FROM tvk6t
WHERE spras = sy-langu
AND katr6 = ls_kna1-katr6.
CLEAR: gv_vtext_hy.
gs_header-bran1 = ls_kna1-bran1.
SELECT SINGLE vtext INTO gv_vtext_hy "行业
FROM tbrct
WHERE spras = sy-langu
AND braco = ls_kna1-bran1.
ENDIF.
WHEN '&SAVE'. "保存
CLEAR: lv_error,
lv_zdjba.
PERFORM frm_check_data CHANGING lv_error. "检查数据
IF lv_error IS INITIAL.
IF gs_header-zdjba IS INITIAL.
PERFORM frm_get_number USING nr object CHANGING lv_zdjba. "生成核价单号内部流水
gs_header-zdjba = lv_zdjba.
gs_header-status = '0'. "审批状态 :设为保存
ELSE.
gs_header-aedat = sy-datum.
gs_header-aezet = sy-uzeit.
gs_header-aenam = sy-uname.
ENDIF.
MOVE-CORRESPONDING gs_header TO ls_header_data.
APPEND ls_header_data TO lt_header_data.
CLEAR: ls_header_data.
LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
<gfs_outtab>-zdjba = gs_header-zdjba.
"反审之后,进行单据修改,自动将之前的调整后总单价(未税)写入到调整前总单价(未税)&新产品售价(未税)写入原产品售价(未税)中
IF gs_header-status = '0' AND gv_upd = 'X'.
<gfs_outtab>-zyzj = <gfs_outtab>-zxzj.
<gfs_outtab>-zyjg = <gfs_outtab>-zxjg.
<gfs_outtab>-zyjg1 = <gfs_outtab>-zxmjjg.
<gfs_outtab>-zyks = <gfs_outtab>-zxks.
<gfs_outtab>-zyjs = <gfs_outtab>-zxjs.
<gfs_outtab>-ztqsx = <gfs_outtab>-zthsx.
<gfs_outtab>-ztqsxrq = <gfs_outtab>-zthsxrq.
ENDIF.
ENDLOOP.
lt_item_data[] = gt_outtab[].
IF lt_header_data IS NOT INITIAL.
MODIFY zsdt040a FROM TABLE lt_header_data. "抬头数据
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
IF lt_item_data IS NOT INITIAL.
MODIFY zsdt040b FROM TABLE lt_item_data. "明细行数据
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
CLEAR: lv_msg.
IF sy-langu = '1'.
CONCATENATE '核价单号' gs_header-zdjba '已保存.' INTO lv_msg SEPARATED BY space.
ELSE.
CONCATENATE 'Pricing number' gs_header-zdjba 'has been saved.' INTO lv_msg SEPARATED BY space.
ENDIF.
MESSAGE lv_msg TYPE 'S'.
ELSE.
ENDIF.
WHEN '&SUBMIT'. "提交
CLEAR: lv_error,
lv_zdjba.
PERFORM frm_check_data CHANGING lv_error. "检查数据
IF lv_error IS INITIAL.
IF gs_header-zdjba IS INITIAL.
PERFORM frm_get_number USING nr object CHANGING lv_zdjba. "生成核价单号内部流水
gs_header-zdjba = lv_zdjba.
gs_header-status = '1'. "审批状态 :设为审批中
ENDIF.
MOVE-CORRESPONDING gs_header TO ls_header_data.
APPEND ls_header_data TO lt_header_data.
CLEAR: ls_header_data.
LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
<gfs_outtab>-zdjba = gs_header-zdjba.
ENDLOOP.
lt_item_data[] = gt_outtab[].
IF lt_header_data IS NOT INITIAL.
MODIFY zsdt040a FROM TABLE lt_header_data. "抬头数据
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
IF lt_item_data IS NOT INITIAL.
MODIFY zsdt040b FROM TABLE lt_item_data. "明细行数据
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
CLEAR: lv_msg.
IF sy-langu = '1'.
CONCATENATE '核价单号' gs_header-zdjba '已保存.' INTO lv_msg SEPARATED BY space.
ELSE.
CONCATENATE 'Pricing number' gs_header-zdjba 'has been saved.' INTO lv_msg SEPARATED BY space.
ENDIF.
MESSAGE lv_msg TYPE 'S'.
CALL FUNCTION 'ZFM_SD_041_POST_TO_0A' "推送到OA
IMPORTING
es_return = es_return
TABLES
it_head = lt_header_data
it_item = lt_item_data.
IF es_return-type = 'S'.
MESSAGE s019(zpp001) WITH es_return-fkey_value01.
ELSE.
MESSAGE e020(zpp001) .
ENDIF.
ENDIF.
WHEN '&EDIT'. "修改
MOVE-CORRESPONDING gs_header TO ls_header_data.
APPEND ls_header_data TO lt_header_data.
CLEAR: ls_header_data.
LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
<gfs_outtab>-zdjba = gs_header-zdjba.
ENDLOOP.
lt_item_data[] = gt_outtab[].
IF lt_header_data IS NOT INITIAL.
MODIFY zsdt040a FROM TABLE lt_header_data. "抬头数据
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
IF lt_item_data IS NOT INITIAL.
MODIFY zsdt040b FROM TABLE lt_item_data. "明细行数据
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDIF.
CLEAR: lv_msg.
IF sy-langu = '1'.
CONCATENATE '核价单号' gs_header-zdjba '已保存.' INTO lv_msg SEPARATED BY space.
ELSE.
CONCATENATE 'Pricing number' gs_header-zdjba 'has been saved.' INTO lv_msg SEPARATED BY space.
ENDIF.
MESSAGE lv_msg TYPE 'S'.
WHEN '&RECHECK'. "反审
DATA ls_003c TYPE zxxt_003.
DATA: lr_zdjba TYPE RANGE OF zsdt040a-zdjba,
ls_zdjba LIKE LINE OF lr_zdjba,
lr_zhjrq TYPE RANGE OF zsdt040a-zhjrq,
ls_zhjrq LIKE LINE OF lr_zhjrq,
lv_fs TYPE c.
CLEAR: lr_zdjba,
ls_zdjba,
lr_zhjrq,
ls_zhjrq,
lv_fs.
ls_zdjba-sign = 'I'.
ls_zdjba-option = 'EQ'.
ls_zdjba-low = gs_header-zdjba.
APPEND ls_zdjba TO lr_zdjba.
CLEAR: ls_zdjba.
ls_zhjrq-sign = 'I'.
ls_zhjrq-option = 'EQ'.
ls_zhjrq-low = gs_header-zhjrq.
APPEND ls_zhjrq TO lr_zhjrq.
CLEAR: ls_zhjrq.
SELECT SINGLE * INTO ls_003c
FROM zxxt_003
WHERE zmk = 'SD'
AND key1 = 'ZSD040'
AND key2 = 'FANSHEN'
AND key3 = gs_header-vkorg
AND value1 = sy-uname.
IF sy-subrc <> 0.
MESSAGE '您没有操作反审的权限' TYPE 'E'.
ELSE.
gs_header-status = '0'.
UPDATE zsdt040a SET status = '0'
WHERE zdjba = gs_header-zdjba.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
lv_fs = 'X'.
EXPORT lv_fs TO MEMORY ID 'ZSD040-M1'.
SUBMIT zsd040A USING SELECTION-SCREEN '1000'
WITH s_zdjba IN lr_zdjba
WITH s_zhjrq IN lr_zhjrq
WITH s_kunnr IN s_kunnr
WITH s_vkorg IN s_vkorg
WITH s_status IN s_status
AND RETURN.
ENDIF.
WHEN '&QUERY'. "关联查询
WHEN OTHERS.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_instantiation
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_instantiation .
DATA: ls_stbl TYPE lvc_s_stbl,
ls_layout TYPE lvc_s_layo.
* PERFORM frm_set_fieldcat_9001.
IF go_container IS INITIAL.
CREATE OBJECT go_container
EXPORTING
container_name = 'CONT'.
CREATE OBJECT go_grid
EXPORTING
i_parent = go_container.
* ALV展示
*
* CALL METHOD cl_gui_cfw=>set_new_ok_code
* EXPORTING
* new_code = '&REFRESH'.
PERFORM frm_display.
ELSE.
* IF go_container IS NOT INITIAL.
* CREATE OBJECT go_grid
* EXPORTING
* i_parent = go_container.
IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
CALL METHOD go_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 0.
ENDIF.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
ls_layout-cwidth_opt = 'X'.
CALL METHOD go_grid->set_frontend_layout
EXPORTING
is_layout = ls_layout.
ls_stbl-row = 'X'." 基于行的稳定刷新
ls_stbl-col = 'X'." 基于列稳定刷新
CALL METHOD go_grid->refresh_table_display
EXPORTING
is_stable = ls_stbl
EXCEPTIONS
finished = 1
OTHERS = 2.
CALL METHOD cl_gui_cfw=>flush.
* ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display .
DATA: g_tool_data TYPE scc_wb_tool_data.
DATA: ls_layout TYPE lvc_s_layo,
lt_fieldcat TYPE TABLE OF lvc_s_fcat,
ls_fieldcat TYPE lvc_s_fcat,
ls_stbl TYPE lvc_s_stbl.
DATA:lt_f4 TYPE lvc_t_f4,
ls_f4 TYPE lvc_s_f4.
FIELD-SYMBOLS: <lfs_fieldcat> TYPE lvc_s_fcat.
DEFINE d1.
ls_fieldcat-fieldname = &1.
ls_fieldcat-scrtext_l = &2.
ls_fieldcat-edit = &3.
ls_fieldcat-intlen = &4.
ls_fieldcat-outputlen = &5.
APPEND ls_fieldcat TO lt_fieldcat.
CLEAR ls_fieldcat.
END-OF-DEFINITION.
IF sy-langu = '1'.
IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
d1: 'POSNR' '序号' '' 10 10.
d1:'ZBJDH' '报价单号' '' 10 10.
d1:'ZBJDH1' '报价单项次' '' 10 10.
d1:'MATNR' '物料编码' '' 40 40.
d1:'MAKTX' '物料名称' '' 40 40.
d1:'ZPRODMODEL' '产品型号' '' 50 50.
d1:'MEINS' '单位' '' 10 10.
d1: 'KDMAT' '客户物料编码' '' 35 35.
d1: 'ZJGLX' '价格类型' '' 10 10.
d1:'ZBGYY' '变更原因' '' 60 60.
d1:'WAERK' '币别' '' 5 5.
d1: 'ZDYHL' '当月汇率' '' 15 15.
d1: 'ZBJHL' '报价汇率' '' 15 15.
d1: 'ZHJSZ' '税种' '' 2 2.
d1:'ZYJG' '原商品售价(未税)' '' 14 14.
d1:'ZYSL' '原分摊数量' '' 17 17.
d1:'ZYJG1' '原模具分摊售价(未税)' '' 14 14.
d1: 'ZYKS' '原模具分摊日期起始日期' '' 10 12.
d1:'ZYJS' '原分摊日期截止日期' '' 10 10.
d1:'ZYZJ' '调整前总单价(未税)' '' 14 14.
d1:'ZXJG' '新产品售价(未税)' '' 14 14.
d1:'ZXSJ' '新模具分摊数量' '' 17 17.
d1:'ZXMJJG' '新模具分摊售价(未税)' '' 14 14.
d1:'ZXKS' '模具分摊起始日期' '' 10 10.
d1:'ZXJS' '模具分摊截止日期' '' 10 10.
d1:'ZXZJ' '调整后总单价(未税)' '' 14 14.
d1:'ZJGBD' '价格变动比例%' '' 14 14.
d1:'ZTQSX' '调前生效日期' '' 10 10.
d1:'ZTHSX' '调后生效日期' '' 10 10.
d1:'ZTQSXRQ' '调前失效日期' '' 10 10.
d1:'ZTHSXRQ' '调后失效日期' '' 10 10.
d1:'ZHGBM' '海关编码' '' 20 20.
d1:'ZZTCY' '征退差异%' '' 14 14.
d1:'ZCKTS' '出口退税率%' '' 14 14.
d1:'ZEXYF' '额外出口运费' '' 14 14.
d1:'ZGCCB' '工程成本' '' 14 14.
d1:'ZSHCB' '实际成本单价' '' 14 14.
d1:'ZGCML' '工程毛利率' '' 14 14.
d1:'ZSJML' '实际毛利率' '' 14 14.
ELSE.
d1: 'POSNR' '序号' 'X' 10 10.
d1:'ZBJDH' '报价单号' 'X' 10 10.
d1:'ZBJDH1' '报价单项次' 'X' 10 10.
d1:'MATNR' '物料编码' 'X' 40 40.
d1:'MAKTX' '物料名称' '' 40 40.
d1:'ZPRODMODEL' '产品型号' '' 50 50.
d1:'MEINS' '单位' '' 10 10.
d1: 'KDMAT' '客户物料编码' 'X' 35 35.
d1: 'ZJGLX' '价格类型' 'X' 10 10.
d1:'ZBGYY' '变更原因' 'X' 60 60.
d1:'WAERK' '币别' '' 5 5.
d1: 'ZDYHL' '当月汇率' 'X' 15 15.
d1: 'ZBJHL' '报价汇率' 'X' 15 15.
d1: 'ZHJSZ' '税种' 'X' 2 2.
d1:'ZYJG' '原商品售价(未税)' '' 14 14.
d1:'ZYSL' '原分摊数量' '' 17 17.
d1:'ZYJG1' '原模具分摊售价(未税)' '' 14 14.
d1: 'ZYKS' '原模具分摊日期起始日期' '' 10 12.
d1:'ZYJS' '原分摊日期截止日期' '' 10 10.
d1:'ZYZJ' '调整前总单价(未税)' '' 14 14.
d1:'ZXJG' '新产品售价(未税)' 'X' 14 14.
d1:'ZXSJ' '新模具分摊数量' 'X' 17 17.
d1:'ZXMJJG' '新模具分摊售价(未税)' 'X' 14 14.
d1:'ZXKS' '模具分摊起始日期' 'X' 10 10.
d1:'ZXJS' '模具分摊截止日期' 'X' 10 10.
d1:'ZXZJ' '调整后总单价(未税)' '' 14 14.
d1:'ZJGBD' '价格变动比例%' '' 14 14.
d1:'ZTQSX' '调前生效日期' '' 10 10.
d1:'ZTHSX' '调后生效日期' 'X' 10 10.
d1:'ZTQSXRQ' '调前失效日期' '' 10 10.
d1:'ZTHSXRQ' '调后失效日期' 'X' 10 10.
d1:'ZHGBM' '海关编码' 'X' 20 20.
d1:'ZZTCY' '征退差异%' 'X' 14 14.
d1:'ZCKTS' '出口退税率%' 'X' 14 14.
d1:'ZEXYF' '额外出口运费' 'X' 14 14.
d1:'ZGCCB' '工程成本' 'X' 14 14.
d1:'ZSHCB' '实际成本单价' 'X' 14 14.
d1:'ZGCML' '工程毛利率' 'X' 14 14.
d1:'ZSJML' '实际毛利率' 'X' 14 14.
ENDIF.
ELSE.
IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
d1: 'POSNR' 'Item No' '' 10 10.
d1:'ZBJDH' 'Quotation no' '' 10 10.
d1:'ZBJDH1' 'Quotation item number' '' 10 10.
d1:'MATNR' 'Material No' '' 40 40.
d1:'MAKTX' 'Material Name' '' 40 40.
d1:'ZPRODMODEL' 'Product Model' '' 50 50.
d1:'MEINS' 'Base Unit of Measure' '' 10 10.
d1: 'KDMAT' 'Customer Material No' '' 35 35.
d1: 'ZJGLX' 'Price Type' '' 10 10.
d1:'ZBGYY' 'Reason for Change' '' 60 60.
d1:'WAERK' 'Currency' '' 5 5.
d1: 'ZDYHL' 'Current month exchange rate' '' 15 15.
d1: 'ZBJHL' 'Quotation exchange rate' '' 15 15.
d1: 'ZHJSZ' 'Categories of taxes' '' 2 2.
d1:'ZYJG' 'Original product selling price (before tax)' '' 14 14.
d1:'ZYSL' 'Original allocation quantity' '' 17 17.
d1:'ZYJG1' 'Shared selling price of the original mold (before tax)' '' 14 14.
d1: 'ZYKS' 'Starting date of original mold allocation' '' 10 12.
d1:'ZYJS' 'Original allocation date deadline' '' 10 10.
d1:'ZYZJ' 'Total unit price before adjustment (before tax)' '' 14 14.
d1:'ZXJG' 'New product selling price (before tax)' '' 14 14.
d1:'ZXSJ' 'New mold allocation quantity' '' 17 17.
d1:'ZXMJJG' 'Shared selling price of new molds (before tax)' '' 14 14.
d1:'ZXKS' 'Starting date of mold allocation' '' 10 10.
d1:'ZXJS' 'Mold allocation deadline' '' 10 10.
d1:'ZXZJ' 'Adjusted total unit price (before tax)' '' 14 14.
d1:'ZJGBD' 'Price change ratio%' '' 14 14.
d1:'ZTQSX' 'Effective date before adjustment' '' 10 10.
d1:'ZTHSX' 'Effective date after adjustment' '' 10 10.
d1:'ZTQSXRQ' 'Pre adjustment expiration date' '' 10 10.
d1:'ZTHSXRQ' 'Expiration date after adjustment' '' 10 10.
d1:'ZHGBM' 'Customs code' '' 20 20.
d1:'ZZTCY' 'Tax refund difference%' '' 14 14.
d1:'ZCKTS' 'Export tax refund rate%' '' 14 14.
d1:'ZEXYF' 'Additional export shipping costs' '' 14 14.
d1:'ZGCCB' 'Project cost' '' 14 14.
d1:'ZSHCB' 'Actual cost unit price' '' 14 14.
d1:'ZGCML' 'Engineering gross profit margin' '' 14 14.
d1:'ZSJML' 'Actual gross profit margin' '' 14 14.
ELSE.
d1: 'POSNR' 'Item No' 'X' 10 10.
d1:'ZBJDH' 'Quotation no' 'X' 10 10.
d1:'ZBJDH1' 'Quotation item number' 'X' 10 10.
d1:'MATNR' 'Material No' 'X' 40 40.
d1:'MAKTX' 'Material Name' '' 40 40.
d1:'ZPRODMODEL' 'Product Model' '' 50 50.
d1:'MEINS' 'Base Unit of Measure' '' 10 10.
d1: 'KDMAT' 'Customer Material No' 'X' 35 35.
d1: 'ZJGLX' 'Price Type' 'X' 10 10.
d1:'ZBGYY' 'Reason for Change' 'X' 60 60.
d1:'WAERK' 'Currency' '' 5 5.
d1: 'ZDYHL' 'Current month exchange rate' 'X' 15 15.
d1: 'ZBJHL' 'Quotation exchange rate' 'X' 15 15.
d1: 'ZHJSZ' 'Categories of taxes' 'X' 2 2.
d1:'ZYJG' 'Original product selling price (before tax)' '' 14 14.
d1:'ZYSL' 'Original allocation quantity' '' 17 17.
d1:'ZYJG1' 'Shared selling price of the original mold (before tax)' '' 14 14.
d1: 'ZYKS' 'Starting date of original mold allocation' '' 10 12.
d1:'ZYJS' 'Original allocation date deadline' '' 10 10.
d1:'ZYZJ' 'Total unit price before adjustment (before tax)' '' 14 14.
d1:'ZXJG' 'New product selling price (before tax)' 'X' 14 14.
d1:'ZXSJ' 'New mold allocation quantity' 'X' 17 17.
d1:'ZXMJJG' 'Shared selling price of new molds (before tax)' 'X' 14 14.
d1:'ZXKS' 'Starting date of mold allocation' 'X' 10 10.
d1:'ZXJS' 'Mold allocation deadline' 'X' 10 10.
d1:'ZXZJ' 'Adjusted total unit price (before tax)' '' 14 14.
d1:'ZJGBD' 'Price change ratio%' '' 14 14.
d1:'ZTQSX' 'Effective date before adjustment' '' 10 10.
d1:'ZTHSX' 'Effective date after adjustment' 'X' 10 10.
d1:'ZTQSXRQ' 'Pre adjustment expiration date' '' 10 10.
d1:'ZTHSXRQ' 'Expiration date after adjustment' 'X' 10 10.
d1:'ZHGBM' 'Customs code' 'X' 20 20.
d1:'ZZTCY' 'Tax refund difference%' 'X' 14 14.
d1:'ZCKTS' 'Export tax refund rate%' 'X' 14 14.
d1:'ZEXYF' 'Additional export shipping costs' 'X' 14 14.
d1:'ZGCCB' 'Project cost' 'X' 14 14.
d1:'ZSHCB' 'Actual cost unit price' 'X' 14 14.
d1:'ZGCML' 'Engineering gross profit margin' 'X' 14 14.
d1:'ZSJML' 'Actual gross profit margin' 'X' 14 14.
ENDIF.
ENDIF.
LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'MATNR'.
<lfs_fieldcat>-ref_table = 'MARA'.
<lfs_fieldcat>-ref_field = 'MATNR'.
<lfs_fieldcat>-dd_outlen = 40.
IF sy-langu = '1'.
<lfs_fieldcat>-coltext = '物料编码'.
ELSE.
<lfs_fieldcat>-coltext = 'Material No'.
ENDIF.
ENDLOOP.
LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZHJSZ'.
* <lfs_fieldcat>-ref_table = 'T007S'.
* <lfs_fieldcat>-ref_field = 'MWSKZ'.
<lfs_fieldcat>-dd_outlen = 2.
IF sy-langu = '1'.
<lfs_fieldcat>-coltext = '税种'.
ELSE.
<lfs_fieldcat>-coltext = 'Categories of taxes'.
ENDIF.
ENDLOOP.
LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZJGLX' OR fieldname = 'ZHJSZ'. "价格类型搜索帮助
<lfs_fieldcat>-f4availabl = 'X'.
ENDLOOP.
LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZTHSX' OR fieldname = 'ZXKS'
OR fieldname = 'ZXJS' OR fieldname = 'ZTQSX'
OR fieldname = 'ZTQSXRQ' OR fieldname = 'ZTHSXRQ'
OR fieldname = 'ZYKS' OR fieldname = 'ZYJS'.
IF sy-langu = '1'.
IF <lfs_fieldcat>-fieldname = 'ZTHSX'.
<lfs_fieldcat>-coltext = '调后生效日期'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZXKS'.
<lfs_fieldcat>-coltext = '模具分摊起始日期'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZXJS'.
<lfs_fieldcat>-coltext = '模具分摊截止日期'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZTQSX'.
<lfs_fieldcat>-coltext = '调前生效日期'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZTQSXRQ'.
<lfs_fieldcat>-coltext = '调前失效日期'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZTHSXRQ'.
<lfs_fieldcat>-coltext = '调后失效日期'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZYKS'.
<lfs_fieldcat>-coltext = '原模具分摊日期起始日期'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZYJS'.
<lfs_fieldcat>-coltext = '原分摊日期截止日期'.
ENDIF.
ELSE.
IF <lfs_fieldcat>-fieldname = 'ZTHSX'.
<lfs_fieldcat>-coltext = 'Effective date after adjustment'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZXKS'.
<lfs_fieldcat>-coltext = 'Starting date of mold allocation'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZXJS'.
<lfs_fieldcat>-coltext = 'Mold allocation deadline'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZTQSX'.
<lfs_fieldcat>-coltext = 'Effective date before adjustment'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZTQSXRQ'.
<lfs_fieldcat>-coltext = 'Pre adjustment expiration date'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZTHSXRQ'.
<lfs_fieldcat>-coltext = 'Expiration date after adjustment'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZYKS'.
<lfs_fieldcat>-coltext = 'Starting date of original mold allocation'.
ENDIF.
IF <lfs_fieldcat>-fieldname = 'ZYJS'.
<lfs_fieldcat>-coltext = 'Original allocation date deadline'.
ENDIF.
ENDIF.
<lfs_fieldcat>-ref_table = 'VBAK'.
<lfs_fieldcat>-ref_field = 'ERDAT'.
ENDLOOP.
LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZYJG' OR fieldname = 'ZYJG1'
OR fieldname = 'ZYZJ' OR fieldname = 'ZXJG'
OR fieldname = 'ZXMJJG' OR fieldname = 'ZXZJ'
OR fieldname = 'ZJGBD' OR fieldname = 'ZZTCY'
OR fieldname = 'ZCKTS' OR fieldname = 'ZEXYF'
OR fieldname = 'ZGCCB' OR fieldname = 'ZSHCB'
OR fieldname = 'ZGCML' OR fieldname = 'ZSJML'
OR fieldname = 'ZDYHL' OR fieldname = 'ZBJHL'.
IF <lfs_fieldcat>-fieldname = 'ZDYHL' OR <lfs_fieldcat>-fieldname = 'ZBJHL'.
<lfs_fieldcat>-decimals = 5.
ELSEIF <lfs_fieldcat>-fieldname = 'ZJGBD' OR <lfs_fieldcat>-fieldname = 'ZZTCY'
OR <lfs_fieldcat>-fieldname = 'ZCKTS' OR <lfs_fieldcat>-fieldname = 'ZEXYF'
OR <lfs_fieldcat>-fieldname = 'ZGCML' OR <lfs_fieldcat>-fieldname = 'ZSJML' .
<lfs_fieldcat>-decimals = 3.
ELSE.
<lfs_fieldcat>-datatype = 'CURR'.
ENDIF.
ENDLOOP.
LOOP AT lt_fieldcat ASSIGNING <lfs_fieldcat> WHERE fieldname = 'ZYSL' OR fieldname = 'ZXSJ'.
<lfs_fieldcat>-decimals = 3.
ENDLOOP.
ls_layout-sel_mode = 'D'.
ls_layout-cwidth_opt = 'X'.
ls_layout-zebra = 'X'.
IF sy-langu = '1'.
ls_layout-grid_title = '项目概览'.
ELSE.
ls_layout-grid_title = 'Item Overview'.
ENDIF.
CREATE OBJECT lo_event.
* 注册事件handler方法
SET HANDLER lo_event->handle_enter FOR go_grid.
SET HANDLER lo_event->handle_data_changed FOR go_grid.
SET HANDLER lo_event->handle_data_changed_finished FOR go_grid.
CALL METHOD go_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
CALL METHOD go_grid->register_edit_event "为ALV_GRID设置enter事件
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
is_layout = ls_layout
CHANGING
it_fieldcatalog = lt_fieldcat
it_outtab = gt_outtab[].
* Set editable cells to ready for input initially
CALL METHOD go_grid->set_ready_for_input
EXPORTING
i_ready_for_input = 1.
* CALL METHOD cl_gui_cfw=>set_new_ok_code
* EXPORTING
* new_code = '&REFRESH'.
CLEAR:ls_f4.
ls_f4-fieldname = 'ZJGLX'. "价格类型搜索帮助
ls_f4-register = 'X'.
ls_f4-getbefore = 'X'.
ls_f4-chngeafter = ''.
ls_f4-internal = ''.
INSERT ls_f4 INTO TABLE lt_f4.
CLEAR:ls_f4.
ls_f4-fieldname = 'ZHJSZ'. "价格类型搜索帮助
ls_f4-register = 'X'.
ls_f4-getbefore = 'X'.
ls_f4-chngeafter = ''.
ls_f4-internal = ''.
INSERT ls_f4 INTO TABLE lt_f4.
CALL METHOD go_grid->register_f4_for_fields
EXPORTING
it_f4 = lt_f4.
SET HANDLER lo_event->handle_f4_help FOR go_grid .
IF go_container IS NOT INITIAL.
"冲销设置tcode 为 RELOAD,防止因为原来的tcode影响程序执行
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'RELOAD'.
ls_layout-cwidth_opt = 'X'.
CALL METHOD go_grid->set_frontend_layout
EXPORTING
is_layout = ls_layout.
ls_stbl-row = 'X'." 基于行的稳定刷新
ls_stbl-col = 'X'." 基于列稳定刷新
CALL METHOD go_grid->refresh_table_display
EXPORTING
is_stable = ls_stbl
EXCEPTIONS
finished = 1
OTHERS = 2.
CALL METHOD cl_gui_cfw=>flush.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_arktx_f4
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- <FS_OUTTAB>_ZJGLX
*&---------------------------------------------------------------------*
FORM frm_get_arktx_f4 CHANGING zjglx TYPE zsdt040c-zjglx.
DATA: value_tab TYPE TABLE OF dfies,
ls_value_tab TYPE dfies,
return_tab TYPE TABLE OF ddshretval,
ls_return_tab TYPE ddshretval,
lt_zsdt040c TYPE TABLE OF zsdt040c,
ls_zsdt040c TYPE zsdt040c.
SELECT * INTO TABLE lt_zsdt040c
FROM zsdt040c.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
* DDIC_STRUCTURE = ' '
retfield = 'ZJGLX'
* PVALKEY = ' '
* DYNPPROG = ' '
* DYNPNR = ' '
* DYNPROFIELD = ' '
* STEPL = 0
* WINDOW_TITLE =
* VALUE = ' '
value_org = 'S'
* MULTIPLE_CHOICE = ' '
* DISPLAY = ' '
* CALLBACK_PROGRAM = ' '
* CALLBACK_FORM = ' '
* CALLBACK_METHOD =
* MARK_TAB =
* IMPORTING
* USER_RESET =
TABLES
value_tab = lt_zsdt040c
* FIELD_TAB =
return_tab = return_tab
* DYNPFLD_MAPPING =
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ELSE.
READ TABLE return_tab INTO ls_return_tab INDEX 1.
IF sy-subrc = 0 AND ls_return_tab-fieldval IS NOT INITIAL.
zjglx = ls_return_tab-fieldval.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data .
gs_header-vkorg = p_vkorg.
SELECT SINGLE vtext INTO gv_vtext "获取销售组织描述
FROM tvkot
WHERE spras = sy-langu
AND vkorg = gs_header-vkorg.
IF gs_header-katr6 IS NOT INITIAL.
SELECT SINGLE vtext INTO gv_vtext_jt "集团
FROM tvk6t
WHERE spras = sy-langu
AND katr6 = gs_header-katr6.
ENDIF.
IF gs_header-bran1 IS NOT INITIAL.
SELECT SINGLE vtext INTO gv_vtext_hy "行业
FROM tbrct
WHERE spras = sy-langu
AND braco = gs_header-bran1.
ENDIF.
gs_header-ernam = sy-uname.
gs_header-erdat = sy-datum.
gs_header-erzet = sy-uzeit.
ENDFORM.
FORM frm_get_number USING p_nr LIKE inri-nrrangenr
p_object LIKE inri-object "编号范围对象名称 Add By Code_Tool"
CHANGING p_number TYPE zdjba.
"调用函数: Number range: Lock object Add By Code_Tool"
CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
EXPORTING
object = p_object
EXCEPTIONS
foreign_lock = 1
object_not_found = 2
system_failure = 3
OTHERS = 4.
IF sy-subrc = 0.
"调用函数: NUmber range: Assigns next free number Add By Code_Tool"
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = p_nr
object = p_object
quantity = '1'
IMPORTING
number = p_number
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4
quantity_is_not_1 = 5
interval_overflow = 6
buffer_overflow = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE e001(00) WITH '无法获取新的号码: ' p_object.
ENDIF.
"调用函数: Number range: Unlock object Add By Code_Tool
CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
EXPORTING
object = p_object
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_check_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LV_ERROR
*&---------------------------------------------------------------------*
FORM frm_check_data CHANGING p_error TYPE c.
DATA: lt_mara TYPE TABLE OF mara,
ls_mara TYPE mara,
lt_t007s TYPE TABLE OF t007s,
ls_t007s TYPE t007s,
lv_msg TYPE string,
lt_a305 TYPE TABLE OF a305,
ls_a305 TYPE a305,
lv_kunnr TYPE kna1-kunnr.
CLEAR: lt_mara,
ls_mara,
lt_t007s,
ls_t007s,
lv_msg,
lt_a305,
ls_a305,
lv_kunnr.
IF gt_outtab IS NOT INITIAL.
SELECT * INTO TABLE lt_mara
FROM mara
FOR ALL ENTRIES IN gt_outtab
WHERE matnr = gt_outtab-matnr.
SELECT * INTO TABLE lt_t007s
FROM t007s
FOR ALL ENTRIES IN gt_outtab
WHERE mwskz = gt_outtab-zhjsz.
lv_kunnr = gs_header-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_kunnr
IMPORTING
output = lv_kunnr.
SELECT * INTO TABLE lt_a305
FROM a305
FOR ALL ENTRIES IN gt_outtab
WHERE kappl = 'V'
AND vkorg = gs_header-vkorg
AND vtweg = gs_header-vtweg
AND kunnr = lv_kunnr
AND matnr = gt_outtab-matnr.
LOOP AT gt_outtab ASSIGNING <gfs_outtab>.
"检查行项目编号是否为空
IF <gfs_outtab>-posnr IS INITIAL.
p_error = 'X'.
lv_msg = '行项目不能为空!'.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
IF <gfs_outtab>-matnr IS INITIAL.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '物料编码不能为空!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
IF <gfs_outtab>-kdmat IS INITIAL.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '客户部物料编码不能为空!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
IF <gfs_outtab>-zjglx IS INITIAL.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '价格类型不能为空!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
IF <gfs_outtab>-zbgyy IS INITIAL.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '变更原因不能为空!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
IF <gfs_outtab>-zbjhl IS INITIAL.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '报价汇率不能为空!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
IF <gfs_outtab>-zxjg IS INITIAL.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '新产品售价(未税)不能为空!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
IF <gfs_outtab>-zxzj IS INITIAL.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '调整后总单价(未税)不能为空!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
IF <gfs_outtab>-zthsx IS INITIAL.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '调后生效日期不能为空!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
IF <gfs_outtab>-zthsxrq IS INITIAL.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '调后失效日期不能为空!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
"检查物料是否存在
READ TABLE lt_mara INTO ls_mara WITH KEY matnr = <gfs_outtab>-matnr.
IF sy-subrc <> 0.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '物料' <gfs_outtab>-matnr '不存在,请维护!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
"检查税种是否存在
READ TABLE lt_t007s INTO ls_t007s WITH KEY mwskz = <gfs_outtab>-zhjsz.
IF sy-subrc <> 0.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '税种' <gfs_outtab>-zhjsz '不存在,请重新选择!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
"检查调后失效日期:调后失效日期必须大于调后生效日期
IF <gfs_outtab>-zthsxrq < <gfs_outtab>-zthsx.
p_error = 'X'.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '调后失效日期小于调后生效日期,请检查!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'E'.
ENDIF.
* "检查是否有价格信息记录
READ TABLE lt_a305 INTO ls_a305 WITH KEY matnr = <gfs_outtab>-matnr.
IF sy-subrc = 0.
CONCATENATE '当前行项目' <gfs_outtab>-posnr '已经存在价格信息记录,请检查!' INTO lv_msg SEPARATED BY space.
MESSAGE lv_msg TYPE 'I'.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat .
FIELD-SYMBOLS: <lfs_structure> TYPE lvc_s_fcat.
DEFINE d1.
gs_structure-fieldname = &1.
gs_structure-scrtext_l = &2.
gs_structure-edit = &3.
gs_structure-intlen = &4.
gs_structure-outputlen = &5.
gs_structure-no_zero = abap_true.
APPEND gs_structure TO gt_structure.
CLEAR gs_structure.
END-OF-DEFINITION.
IF sy-langu = '1'.
d1: 'MSG_STATUS' '消息状态' '' 4 4,
'MESSAGE' '消息' '' 220 75,
'KNUMV' '定价记录号' '' 10 10,
'KSCHL' '条件类型' '' 4 4,
'ZDJBA' '单据编号' '' 10 10,
'POSNR' '行项目编号' '' 6 6,
'KUNNR' '客户编号' '' 10 10,
'NAME1' '客户名称' '' 70 70,
'VKORG' '销售组织' '' 4 4,
'VTEXT' '销售组织描述' '' 30 30,
'STATUS_TEXT' '单据状态' '' 10 10,
'VTWEG' '分销渠道' '' 2 4,
'MATNR' '物料编码' '' 40 40,
'ZYJG' '原商品售价(未税)' '' 13 13,
'ZYSL' '原分摊数量' '' 14 14,
'ZYKS' '原模具分摊日期起始日期' '' 10 20,
'ZYJS' '原分摊日期截止日期' '' 10 20.
ELSE.
d1: 'MSG_STATUS' 'Message Status' '' 4 4,
'MESSAGE' 'Message Text' '' 220 75,
'KNUMV' 'Pricing record number' '' 10 10,
'KSCHL' 'Condition type' '' 4 4,
'ZDJBA' 'Document number' '' 10 10,
'POSNR' 'Item number' '' 6 6,
'KUNNR' 'Customer No' '' 10 10,
'NAME1' 'Customer name' '' 70 70,
'VKORG' 'Sales Organization' '' 4 4,
'VTEXT' 'Sales Organization Description' '' 30 30,
'STATUS_TEXT' 'Document Status' '' 10 10,
'VTWEG' 'Distribution channel' '' 2 4,
'MATNR' 'Material No' '' 40 40,
'ZYJG' 'Original product selling price (before tax)' '' 13 13,
'ZYSL' 'Original allocation quantity' '' 14 14,
'ZYKS' 'Starting date of original mold allocation' '' 10 20,
'ZYJS' 'Original allocation date deadline' '' 10 20.
ENDIF.
LOOP AT gt_structure ASSIGNING <lfs_structure> WHERE fieldname = 'MSG_STATUS'.
<lfs_structure>-icon = 'X'.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_layout
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_layout .
gs_layout-zebra = 'X'.
gs_layout-cwidth_opt = 'X'.
gs_layout-box_fname = 'SEL'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_data_list
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_get_data_list .
TYPES: BEGIN OF lty_data,
vkorg TYPE a305-vkorg,
vtweg TYPE a305-vtweg,
kunnr TYPE a305-kunnr,
matnr TYPE a305-matnr,
datab TYPE a305-datab,
datbi TYPE a305-datbi,
END OF lty_data.
DATA: lt_head TYPE TABLE OF zsdt040a,
ls_head TYPE zsdt040a,
lt_item TYPE TABLE OF zsdt040b,
ls_item TYPE zsdt040b,
lt_tvkot TYPE TABLE OF tvkot,
ls_tvkot TYPE tvkot,
lt_kna1 TYPE TABLE OF kna1,
ls_kna1 TYPE kna1,
lt_a305 TYPE TABLE OF a305,
ls_a305 TYPE a305,
lt_Data TYPE TABLE OF lty_Data,
ls_Data TYPE lty_Data,
lv_create TYPE c,
lv_update TYPE c,
lv_date_s TYPE datum,
lv_date_e TYPE datum,
lv_flag.
FIELD-SYMBOLS: <lfs_alv> TYPE gty_alv.
DATA: ti_bapicondct TYPE TABLE OF bapicondct,
ls_ti_bapicondct TYPE bapicondct,
ti_bapicondhd TYPE TABLE OF bapicondhd,
ls_ti_bapicondhd TYPE bapicondhd,
ti_bapicondit TYPE TABLE OF bapicondit,
ls_ti_bapicondit TYPE bapicondit,
ti_bapicondqs TYPE TABLE OF bapicondqs,
ls_ti_bapicondqs TYPE bapicondqs,
ti_bapicondvs TYPE TABLE OF bapicondvs,
ls_ti_bapicondvs TYPE bapicondvs,
to_bapiret2 TYPE TABLE OF bapiret2,
ls_to_bapiret2 TYPE bapiret2,
to_bapiknumhs TYPE TABLE OF bapiknumhs,
ls_to_bapiknumhs TYPE bapiknumhs,
to_mem_initial TYPE TABLE OF cnd_mem_initial,
ls_to_mem_initial TYPE cnd_mem_initial,
h_varkey(100).
CLEAR: ti_bapicondct,
ls_ti_bapicondct,
ti_bapicondhd,
ls_ti_bapicondhd,
ti_bapicondit,
ls_ti_bapicondit,
ti_bapicondqs,
ls_ti_bapicondqs,
ti_bapicondvs,
ls_ti_bapicondvs,
to_bapiret2,
ls_to_bapiret2,
to_bapiknumhs,
ls_to_bapiknumhs,
to_mem_initial,
ls_to_mem_initial,
h_varkey.
CLEAR: lt_head,
ls_head,
lt_item,
ls_item,
lt_tvkot,
ls_tvkot,
lt_kna1,
ls_kna1,
lt_a305,
ls_a305,
lt_Data,
ls_Data,
lv_create,
lv_update,
lv_date_s,
lv_date_e,
lv_flag.
DATA: lr_zdjba TYPE RANGE OF zsdt040a-zdjba,
lrs_zdjba LIKE LINE OF lr_zdjba.
IF s_zdjba[] IS NOT INITIAL.
LOOP AT s_zdjba.
lrs_zdjba-sign = s_zdjba-sign.
lrs_zdjba-option = s_zdjba-option.
CLEAR: lv_zdjba.
IF s_zdjba-low IS NOT INITIAL.
lv_zdjba = s_zdjba-low.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_zdjba
IMPORTING
output = lv_zdjba.
ENDIF.
lrs_zdjba-low = lv_zdjba.
CLEAR: lv_zdjba.
IF s_zdjba-high IS NOT INITIAL.
lv_zdjba = s_zdjba-high.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_zdjba
IMPORTING
output = lv_zdjba.
ENDIF.
lrs_zdjba-high = lv_zdjba.
APPEND lrs_zdjba TO lr_zdjba.
CLEAR: lrs_zdjba, s_zdjba.
ENDLOOP.
ENDIF.
SELECT * INTO TABLE lt_head "核价申请抬头信息
FROM zsdt040a
WHERE zdjba IN lr_zdjba
AND zhjrq IN s_zhjrq
AND kunnr IN s_kunnr
AND vkorg IN s_vkorg
AND status IN s_status.
IF lt_head IS NOT INITIAL.
SELECT * INTO TABLE lt_item "核价申请明细数据
FROM zsdt040b
FOR ALL ENTRIES IN lt_head
WHERE zdjba = lt_head-zdjba.
SELECT * INTO TABLE lt_tvkot "销售组织描述
FROM tvkot
FOR ALL ENTRIES IN lt_head
WHERE spras = sy-langu
AND vkorg = lt_head-vkorg.
SELECT * INTO TABLE lt_kna1
FROM kna1
FOR ALL ENTRIES IN lt_head
WHERE kunnr = lt_head-kunnr.
ENDIF.
LOOP AT lt_head INTO ls_head.
LOOP AT lt_item INTO ls_item WHERE zdjba = ls_head-zdjba.
ls_data-vkorg = ls_head-vkorg.
ls_data-vtweg = ls_head-vtweg.
ls_data-kunnr = ls_head-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_data-kunnr
IMPORTING
output = ls_data-kunnr.
ls_data-matnr = ls_item-matnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = ls_data-matnr
IMPORTING
output = ls_data-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ls_data-datab = ls_item-zthsx. "
ls_data-datbi = ls_item-zthsxrq.
COLLECT ls_data INTO lt_data.
CLEAR: ls_data.
ENDLOOP.
ENDLOOP.
IF lt_data IS NOT INITIAL.
SELECT * INTO TABLE lt_a305
FROM a305
FOR ALL ENTRIES IN lt_data
WHERE kappl = 'V'
AND vkorg = lt_data-vkorg
AND vtweg = lt_data-vtweg
AND kunnr = lt_data-kunnr
AND matnr = lt_data-matnr.
ENDIF.
LOOP AT lt_head INTO ls_head.
LOOP AT lt_item INTO ls_item WHERE zdjba = ls_head-zdjba.
CLEAR: lv_create,
lv_update.
gs_alv-msg_status = gc_grey. "初始状态
gs_alv-zdjba = ls_head-zdjba. "单据编号
gs_alv-kunnr = ls_head-kunnr."客户编号
READ TABLE lt_kna1 INTO ls_kna1 WITH KEY kunnr = ls_head-kunnr.
IF sy-subrc = 0.
CONCATENATE ls_kna1-name1 ls_kna1-name2 INTO gs_alv-name1. "客户名称
ENDIF.
gs_alv-vtweg = ls_head-vtweg. "分销渠道
gs_alv-vkorg = ls_head-vkorg. "销售组织
READ TABLE lt_tvkot INTO ls_tvkot WITH KEY vkorg = ls_head-vkorg.
IF sy-subrc = 0.
gs_alv-vtext = ls_tvkot-vtext. "销售组织描述
ENDIF.
gs_alv-status = ls_head-status.
IF ls_head-status = '0'.
gs_alv-status_text = '保存'.
ELSEIF ls_head-status = '1'.
gs_alv-status_text = '审批中'.
ELSEIF ls_head-status = '2'.
CLEAR: lv_create,
lv_update.
gs_alv-status_text = '已审批'.
"检查是否已经创建价格条件记录
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = ls_item-matnr
IMPORTING
output = ls_item-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_head-kunnr
IMPORTING
output = ls_head-kunnr.
READ TABLE lt_a305 INTO ls_a305 WITH KEY vkorg = ls_head-vkorg
vtweg = ls_head-vtweg
kunnr = ls_head-kunnr
matnr = ls_item-matnr
datab = ls_item-zthsx
datbi = ls_item-zthsxrq.
IF sy-subrc <> 0.
LOOP AT lt_a305 INTO ls_a305 WHERE vkorg = ls_head-vkorg
AND vtweg = ls_head-vtweg
AND kunnr = ls_head-kunnr
AND matnr = ls_item-matnr .
IF ls_item-zthsx <= ls_a305-datab AND ls_item-zthsxrq >= ls_a305-datbi. "如果新建的日期区间包含历史的日期区间,则报错E,MESSAGE‘存在包含的价格数据,请手工执行’。
gs_alv-msg_type = 'E'.
gs_alv-msg_status = gc_red.
gs_alv-message = '存在包含的价格数据,请手工执行'.
EXIT.
ENDIF.
ENDLOOP.
IF gs_alv-msg_type <> 'E'.
lv_create = 'X'.
ENDIF.
ELSE.
lv_update = 'X'.
ENDIF.
ENDIF.
gs_alv-posnr = ls_item-posnr. "行项目编号
gs_alv-matnr = ls_item-matnr. "物料
gs_alv-meins = ls_item-meins. "单位
gs_alv-zyjg = ls_item-zyjg."原商品售价(未税)
gs_alv-zysl = ls_item-zysl."原分摊数量
gs_alv-zyks = ls_item-zyks."原模具分摊日期起始日期
gs_alv-zyjs = ls_item-zyjs."原分摊日期截止日期
gs_alv-zthsxrq = ls_item-zthsxrq."调后失效日期
gs_alv-zthsx = ls_item-zthsx."调后生效日期
gs_alv-waerk = ls_item-waerk."币别
gs_alv-zxzj = ls_item-zxzj."调整后总单价(未税)
IF lv_create = 'X'. "创建
LOOP AT lt_a305 INTO ls_a305 WHERE vkorg = ls_head-vkorg
AND vtweg = ls_head-vtweg
AND kunnr = ls_head-kunnr
AND matnr = ls_item-matnr .
* 系统里存在价格记录A305 : 开始日期: 2023.09.22 截止日期:2023.09.30
* 1. 调后生效日期: 2023.09.19 调后失效日期: 2023.09.23
* 2. 调后生效日期: 2023.09.23 调后失效日期: 2023.10.09
* 3. 调后生效日期: 2023.09.23 调后失效日期: 2023.09.27
* 4. 调后生效日期: 2023.10.10 调后失效日期: 2023.11.01
* 5. 调后生效日期: 2023.09.19 调后失效日期: 2023.09.21
"1. 调后生效日期: 2023.09.19 调后失效日期: 2023.09.23
IF ls_item-zthsx <= ls_a305-datab AND ls_item-zthsxrq >= ls_a305-datab AND ls_item-zthsxrq <= ls_a305-datbi.
CLEAR: lv_date_s, lv_date_e, lv_flag.
lv_date_s = ls_item-zthsx.
lv_date_e = ls_item-zthsxrq.
PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
CLEAR: lv_date_s, lv_date_e, lv_flag.
lv_date_s = ls_item-zthsxrq + 1.
lv_date_e = ls_a305-datbi.
lv_flag = 'X'. "保持a305的价格
PERFORM frm_change_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
"2. 调后生效日期: 2023.09.23 调后失效日期: 2023.10.09
ELSEIF ls_item-zthsx >= ls_a305-datab AND ls_item-zthsx <= ls_a305-datbi AND ls_item-zthsxrq >= ls_a305-datbi.
CLEAR: lv_date_s, lv_date_e, lv_flag.
lv_date_s = ls_a305-datab.
lv_date_e = ls_item-zthsx - 1.
lv_flag = 'X'. "保持a305的价格
PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
CLEAR: lv_date_s, lv_date_e, lv_flag.
lv_date_s = ls_item-zthsx.
lv_date_e = ls_item-zthsxrq.
PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
"3. 调后生效日期: 2023.09.23 调后失效日期: 2023.09.27
ELSEIF ls_item-zthsx >= ls_a305-datab AND ls_item-zthsxrq <= ls_a305-datbi.
CLEAR: lv_date_s, lv_date_e, lv_flag.
lv_date_s = ls_a305-datab.
lv_date_e = ls_item-zthsx - 1.
lv_flag = 'X'. "保持a305的价格
PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
CLEAR: lv_date_s, lv_date_e, lv_flag.
lv_date_s = ls_item-zthsx.
lv_date_e = ls_item-zthsxrq.
PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
CLEAR: lv_date_s, lv_date_e, lv_flag.
lv_date_s = ls_item-zthsxrq + 1.
lv_date_e = ls_a305-datbi.
lv_flag = 'X'. "保持a305的价格
PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
*
"4. 调后生效日期: 2023.10.10 调后失效日期: 2023.11.01
ELSEIF ls_item-zthsx >= ls_a305-datbi.
CLEAR: lv_date_s, lv_date_e, lv_flag.
lv_date_s = ls_item-zthsx.
lv_date_e = ls_item-zthsxrq.
PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
"5. 调后生效日期: 2023.09.19 调后失效日期: 2023.09.21
ELSEIF ls_item-zthsxrq <= ls_a305-datab.
CLEAR: lv_date_s, lv_date_e, lv_flag.
lv_date_s = ls_item-zthsx.
lv_date_e = ls_item-zthsxrq.
PERFORM frm_create_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
ENDIF.
ENDLOOP.
ENDIF.
IF lv_update = 'X'. "修改
CLEAR: lv_date_s, lv_date_e, lv_flag.
lv_date_s = ls_item-zthsx.
lv_date_e = ls_item-zthsxrq.
PERFORM frm_change_price_record USING lv_date_s lv_date_e ls_a305-knumh lv_flag CHANGING gs_alv.
ENDIF.
APPEND gs_alv TO gt_alv.
CLEAR: gs_alv, ls_item.
ENDLOOP.
CLEAR: ls_head.
ENDLOOP.
SORT gt_alv BY zdjba.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_display_alv_list
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_display_alv_list .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
i_callback_program = sy-repid
i_callback_pf_status_set = 'FRM_SET_PFSTATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
* I_CALLBACK_TOP_OF_PAGE = ' '
* i_callback_html_top_of_page = 'HTML_TOP_OF_PAGE'
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_structure
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS_LVC =
* IT_SORT_LVC =
* IT_FILTER_LVC =
* IT_HYPERLINK =
* IS_SEL_HIDE =
i_default = 'X'
i_save = 'A'
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT_LVC =
* IS_REPREP_ID_LVC =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP =
* I_HTML_HEIGHT_END =
* IT_ALV_GRAPHICS =
* IT_EXCEPT_QINFO_LVC =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = gt_alv
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
FORM frm_set_pfstatus USING p_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD_FULLSCREEN'.
ENDFORM. "FRM_SET_STATUS
FORM frm_user_command USING p_ucomm TYPE sy-ucomm
rs_selfield TYPE slis_selfield.
TYPES: BEGIN OF lty_zdjba,
zdjba TYPE zdjba,
END OF lty_zdjba,
BEGIN OF lty_temp,
vkorg TYPE a305-vkorg,
vtweg TYPE a305-vtweg,
kunnr TYPE a305-kunnr,
matnr TYPE a305-matnr,
END OF lty_temp.
DATA: lo_grid TYPE REF TO cl_gui_alv_grid,
lv_valid TYPE c,
ls_stbl TYPE lvc_s_stbl,
lt_zdjba TYPE TABLE OF lty_zdjba,
ls_zdjba TYPE lty_zdjba,
lt_zsdt040a TYPE TABLE OF zsdt040a,
lt_zsdt040b TYPE TABLE OF zsdt040b,
es_return TYPE zxxs_005,
answer TYPE c,
lt_temp TYPE TABLE OF lty_temp,
ls_temp TYPE lty_temp,
lt_a305 TYPE TABLE OF a305,
ls_a305 TYPE a305.
DATA: ti_bapicondct TYPE TABLE OF bapicondct,
ls_ti_bapicondct TYPE bapicondct,
ti_bapicondhd TYPE TABLE OF bapicondhd,
ls_ti_bapicondhd TYPE bapicondhd,
ti_bapicondit TYPE TABLE OF bapicondit,
ls_ti_bapicondit TYPE bapicondit,
ti_bapicondqs TYPE TABLE OF bapicondqs,
ls_ti_bapicondqs TYPE bapicondqs,
ti_bapicondvs TYPE TABLE OF bapicondvs,
ls_ti_bapicondvs TYPE bapicondvs,
to_bapiret2 TYPE TABLE OF bapiret2,
ls_to_bapiret2 TYPE bapiret2,
to_bapiknumhs TYPE TABLE OF bapiknumhs,
ls_to_bapiknumhs TYPE bapiknumhs,
to_mem_initial TYPE TABLE OF cnd_mem_initial,
ls_to_mem_initial TYPE cnd_mem_initial,
h_varkey(100).
CLEAR: ti_bapicondct,
ls_ti_bapicondct,
ti_bapicondhd,
ls_ti_bapicondhd,
ti_bapicondit,
ls_ti_bapicondit,
ti_bapicondqs,
ls_ti_bapicondqs,
ti_bapicondvs,
ls_ti_bapicondvs,
to_bapiret2,
ls_to_bapiret2,
to_bapiknumhs,
ls_to_bapiknumhs,
to_mem_initial,
ls_to_mem_initial,
h_varkey.
FIELD-SYMBOLS: <lfs_alv> TYPE gty_alv.
CLEAR: lo_grid,
lv_valid,
ls_stbl,
lt_zdjba,
ls_zdjba,
lt_zsdt040a,
lt_zsdt040b,
es_return,
answer.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lo_grid.
CALL METHOD lo_grid->check_changed_data
IMPORTING
e_valid = lv_valid.
CASE p_ucomm.
WHEN '&IC1'. "双击
CLEAR: gs_header,
gt_outtab,
gs_outtab.
* go_grid,
* go_container.
CALL METHOD cl_gui_cfw=>flush.
IF rs_selfield-fieldname = 'ZDJBA'.
lv_zdjba = rs_selfield-value.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_zdjba
IMPORTING
output = lv_zdjba.
SELECT SINGLE * INTO gs_header
FROM zsdt040a
WHERE zdjba = lv_zdjba.
SELECT * INTO TABLE gt_outtab
FROM zsdt040b
WHERE zdjba = lv_zdjba.
CALL METHOD cl_gui_cfw=>dispatch.
CALL SCREEN 9001.
ENDIF.
WHEN '&SUBMIT'. "提交
READ TABLE gt_alv INTO gs_alv WITH KEY sel = 'X'.
IF sy-subrc <> 0.
MESSAGE '请至少选择一条数据!' TYPE 'E'.
ENDIF.
LOOP AT gt_alv INTO gs_alv WHERE sel = 'X'
AND status = '0'.
ls_zdjba-zdjba = gs_alv-zdjba.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_zdjba-zdjba
IMPORTING
output = ls_zdjba-zdjba.
COLLECT ls_zdjba INTO lt_zdjba.
CLEAR: ls_zdjba.
ls_temp-vkorg = gs_alv-vkorg.
ls_temp-vtweg = gs_alv-vtweg.
ls_temp-kunnr = gs_alv-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = ls_temp-kunnr
IMPORTING
output = ls_temp-kunnr.
ls_temp-matnr = gs_alv-matnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = ls_temp-matnr
IMPORTING
output = ls_temp-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
COLLECT ls_temp INTO lt_temp.
CLEAR: ls_temp.
ENDLOOP.
IF lt_zdjba IS NOT INITIAL.
SELECT * INTO TABLE lt_zsdt040a
FROM zsdt040a
FOR ALL ENTRIES IN lt_zdjba
WHERE zdjba = lt_zdjba-zdjba.
SELECT * INTO TABLE lt_zsdt040b
FROM zsdt040b
FOR ALL ENTRIES IN lt_zdjba
WHERE zdjba = lt_zdjba-zdjba.
SELECT * INTO TABLE lt_a305
FROM a305
FOR ALL ENTRIES IN lt_temp
WHERE kappl = 'V'
AND vkorg = lt_temp-vkorg
AND vtweg = lt_temp-vtweg
AND kunnr = lt_temp-kunnr
AND matnr = lt_temp-matnr.
ENDIF.
LOOP AT gt_alv ASSIGNING <lfs_alv> WHERE sel = 'X'
AND status = '0'.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <lfs_alv>-kunnr
IMPORTING
output = <lfs_alv>-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <lfs_alv>-matnr
IMPORTING
output = <lfs_alv>-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
READ TABLE lt_a305 INTO ls_a305 WITH KEY vkorg = <lfs_alv>-vkorg
vtweg = <lfs_alv>-vtweg
kunnr = <lfs_alv>-kunnr
matnr = <lfs_alv>-matnr.
IF sy-subrc = 0.
<lfs_alv>-msg_type = 'I'.
<lfs_alv>-msg_status = gc_yellow.
<lfs_alv>-message = '当前已存在相关价格信息记录,请检查'.
ENDIF.
ENDLOOP.
READ TABLE gt_Alv INTO <lfs_alv> WITH KEY msg_type = 'I'.
IF sy-subrc = 0.
MESSAGE '当前已存在相关价格信息记录,请确认是否继续提交OA' TYPE 'I'.
ENDIF.
LOOP AT lt_zdjba INTO ls_zdjba. "点击提交按钮可以对‘保存’状态的单据进行推送至OA,
CALL FUNCTION 'ZFM_SD_041_POST_TO_0A'
IMPORTING
es_return = es_return
TABLES
it_head = lt_zsdt040a
it_item = lt_zsdt040b.
IF es_return-type = 'S'."发送OA成功,流程单号是&1
LOOP AT gt_alv ASSIGNING <lfs_alv> WHERE zdjba = ls_zdjba-zdjba.
<lfs_alv>-msg_type = 'S'.
<lfs_alv>-msg_status = gc_green.
CONCATENATE '发送OA成功,流程单号是' es_return-fkey_value01 INTO <lfs_alv>-message.
ENDLOOP.
ELSE. "发送OA失败
<lfs_alv>-msg_type = 'E'.
<lfs_alv>-msg_status = gc_red.
<lfs_alv>-message = '发送OA失败'.
ENDIF.
ENDLOOP.
LOOP AT gt_alv ASSIGNING <lfs_alv> WHERE sel = 'X' "‘审批中’或‘已审批’的单据则报错E,MESSAGE'审批中或已审批的单据不可提交'
AND status <> '0'.
<lfs_alv>-msg_type = 'E'.
<lfs_alv>-msg_status = gc_red.
<lfs_alv>-message = '审批中或已审批的单据不可提交'.
ENDLOOP.
WHEN '&EXECUTE'. "手动执行
READ TABLE gt_alv INTO gs_alv WITH KEY sel = 'X'.
IF sy-subrc <> 0.
MESSAGE '请至少选择一条数据!' TYPE 'E'.
ENDIF.
LOOP AT gt_alv ASSIGNING <lfs_alv> WHERE sel = 'X' "对于已审批的价格创建价格数据报错,MESSAGE'存在包含的价格数据,请手动执行'
AND status = '2'.
<lfs_alv>-msg_type = 'E'.
<lfs_alv>-msg_status = gc_red.
<lfs_alv>-message = '存在包含的价格数据,请手动执行'.
ENDLOOP.
CALL FUNCTION 'POPUP_TO_CONFIRM'
EXPORTING
* TITLEBAR = ' '
* DIAGNOSE_OBJECT = ' '
text_question = '需替代原来的价格吗?'
text_button_1 = 'Yes'
icon_button_1 = 'icon_checked'
text_button_2 = 'No'
icon_button_2 = 'icon_incomplete'
* DEFAULT_BUTTON = '1'
* DISPLAY_CANCEL_BUTTON = 'X'
* USERDEFINED_F1_HELP = ' '
* START_COLUMN = 25
* START_ROW = 6
* POPUP_TYPE =
* IV_QUICKINFO_BUTTON_1 = ' '
* IV_QUICKINFO_BUTTON_2 = ' '
IMPORTING
answer = answer "1-YES; 2-NO; A-CANCEL
* TABLES
* PARAMETER =
EXCEPTIONS
text_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
IF answer = '1'. "替代原来的条件记录生成新的条件记录
LOOP AT gt_alv ASSIGNING <lfs_alv> WHERE sel = 'X'
AND status = '2'.
CLEAR: ti_bapicondct,
ls_ti_bapicondct,
ti_bapicondhd,
ls_ti_bapicondhd,
ti_bapicondit,
ls_ti_bapicondit,
ti_bapicondqs,
ls_ti_bapicondqs,
ti_bapicondvs,
ls_ti_bapicondvs,
to_bapiret2,
ls_to_bapiret2,
to_bapiknumhs,
ls_to_bapiknumhs,
to_mem_initial,
ls_to_mem_initial,
h_varkey.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <lfs_alv>-kunnr
IMPORTING
output = <lfs_alv>-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = <lfs_alv>-matnr
IMPORTING
output = <lfs_alv>-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
CONCATENATE <lfs_alv>-vkorg <lfs_alv>-vtweg <lfs_alv>-kunnr <lfs_alv>-matnr INTO h_varkey.
"condition table 条件表A305
ls_ti_bapicondct-table_no = '305'.
ls_ti_bapicondct-applicatio = 'V'.
ls_ti_bapicondct-cond_usage = 'A'. "条件表用途 ‘A' 定价
ls_ti_bapicondct-cond_type = 'ZPR1'. "定价条件
*wa_bapicondct-operation = '009'. "消息功能 : 003 DEL ; 004 MODIFY ;005 REPLACE 009 INITIAL
ls_ti_bapicondct-operation = '009'. "更改
ls_ti_bapicondct-varkey = h_varkey.
ls_ti_bapicondct-valid_to = <lfs_alv>-zthsxrq. "调后失效日期
ls_ti_bapicondct-valid_from = <lfs_alv>-zthsx. "调后生效日期
ls_ti_bapicondct-cond_no = '$000000001'. "创建
APPEND ls_ti_bapicondct TO ti_bapicondct.
CLEAR: ls_ti_bapicondct.
"*KONH
ls_ti_bapicondhd-operation = '009'.
* wa_bapicondhd-operation = '004'.
ls_ti_bapicondhd-cond_no = '$000000001'.
* wa_bapicondhd-cond_no = '0000015528'.
ls_ti_bapicondhd-created_by = sy-uname.
ls_ti_bapicondhd-creat_date = sy-datum.
ls_ti_bapicondhd-cond_usage = 'A'.
ls_ti_bapicondhd-table_no = '305'.
ls_ti_bapicondhd-applicatio = 'V'.
ls_ti_bapicondhd-cond_type = 'ZPR1'.
ls_ti_bapicondhd-varkey = h_varkey.
ls_ti_bapicondhd-valid_from = <lfs_alv>-zthsx. "调后生效日期
ls_ti_bapicondhd-valid_to = <lfs_alv>-zthsxrq. "调后失效日期
APPEND ls_ti_bapicondhd TO ti_bapicondhd .
CLEAR: ls_ti_bapicondhd.
"KONP
* wa_bapicondit-operation = '004'. ”修改
ls_ti_bapicondit-operation = '009'. "创建
ls_ti_bapicondit-cond_no = '$000000001'.
* ls_ti_bapicondit-cond_no = '0000015528'.
ls_ti_bapicondit-cond_count = '01'. "条件序列号
ls_ti_bapicondit-applicatio = 'V'.
ls_ti_bapicondit-cond_type = 'ZPR1'. "条件类型
ls_ti_bapicondit-scaletype = 'A'. "STFKZ Staffelsoort
ls_ti_bapicondit-scalebasin = ''. "KZBZG Teken:rekeneenheid " wa_bapicondit-scalebasin = 'C'. 存在数量等级
ls_ti_bapicondit-scale_qty = '1'. "KSTBM Conditiestaffelbasis hoeveelheid
ls_ti_bapicondit-cond_p_unt = '1'. "KPEIN prijseenheid
ls_ti_bapicondit-cond_unit = <lfs_alv>-meins. "KMEIN Conditie-hoeveelheidseenheid
ls_ti_bapicondit-calctypcon = 'C'. "KRECH Conditie-rekenregel
ls_ti_bapicondit-cond_value = <lfs_alv>-zxzj. "调整后总单价(未税)
ls_ti_bapicondit-condcurr = <lfs_alv>-waerk."货币
APPEND ls_ti_bapicondit TO ti_bapicondit .
CLEAR: ls_ti_bapicondit.
CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
* EXPORTING
* PI_INITIALMODE = ' '
* PI_BLOCKNUMBER =
* PI_PHYSICAL_DELETION =
TABLES
ti_bapicondct = ti_bapicondct
ti_bapicondhd = ti_bapicondhd
ti_bapicondit = ti_bapicondit
ti_bapicondqs = ti_bapicondqs
ti_bapicondvs = ti_bapicondvs
to_bapiret2 = to_bapiret2
to_bapiknumhs = to_bapiknumhs
to_mem_initial = to_mem_initial
EXCEPTIONS
update_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT to_bapiret2 INTO ls_to_bapiret2 WHERE type = 'A' OR type = 'E'.
lv_error = 'X'.
EXIT.
ENDLOOP.
IF lv_error = 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
* IMPORTING
* RETURN =
.
<lfs_alv>-msg_type = 'E'.
<lfs_alv>-msg_status = gc_red.
READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'E'.
IF sy-subrc = 0.
<lfs_alv>-message = ls_to_bapiret2-message.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
* IMPORTING
* RETURN =
.
<lfs_alv>-msg_type = 'S'.
<lfs_alv>-msg_status = gc_green.
READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'S'
id = 'CND_EXCHANGE'
number = '003'.
IF sy-subrc = 0.
<lfs_alv>-message = ls_to_bapiret2-message.
<lfs_alv>-knumv = ls_to_bapiret2-message_v1.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
WHEN OTHERS.
ENDCASE.
gs_layout-cwidth_opt = 'X'.
CALL METHOD lo_grid->set_frontend_layout
EXPORTING
is_layout = gs_layout.
ls_stbl-row = 'X'." 基于行的稳定刷新
ls_stbl-col = 'X'." 基于列稳定刷新
CALL METHOD lo_grid->refresh_table_display
EXPORTING
is_stable = ls_stbl
EXCEPTIONS
finished = 1
OTHERS = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_create_price_record
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LV_DATE_S
*& --> LV_DATE_E
*& --> GS_ALV
*&---------------------------------------------------------------------*
FORM frm_create_price_record USING pdate_s TYPE datum
pdate_e TYPE datum
p_knumh TYPE a305-knumh
p_flag TYPE c
CHANGING p_alv TYPE gty_alv.
DATA: ti_bapicondct TYPE TABLE OF bapicondct,
ls_ti_bapicondct TYPE bapicondct,
ti_bapicondhd TYPE TABLE OF bapicondhd,
ls_ti_bapicondhd TYPE bapicondhd,
ti_bapicondit TYPE TABLE OF bapicondit,
ls_ti_bapicondit TYPE bapicondit,
ti_bapicondqs TYPE TABLE OF bapicondqs,
ls_ti_bapicondqs TYPE bapicondqs,
ti_bapicondvs TYPE TABLE OF bapicondvs,
ls_ti_bapicondvs TYPE bapicondvs,
to_bapiret2 TYPE TABLE OF bapiret2,
ls_to_bapiret2 TYPE bapiret2,
to_bapiknumhs TYPE TABLE OF bapiknumhs,
ls_to_bapiknumhs TYPE bapiknumhs,
to_mem_initial TYPE TABLE OF cnd_mem_initial,
ls_to_mem_initial TYPE cnd_mem_initial,
h_varkey(100).
DATA: ls_konp TYPE konp.
CLEAR: ls_konp.
CLEAR: ti_bapicondct,
ls_ti_bapicondct,
ti_bapicondhd,
ls_ti_bapicondhd,
ti_bapicondit,
ls_ti_bapicondit,
ti_bapicondqs,
ls_ti_bapicondqs,
ti_bapicondvs,
ls_ti_bapicondvs,
to_bapiret2,
ls_to_bapiret2,
to_bapiknumhs,
ls_to_bapiknumhs,
to_mem_initial,
ls_to_mem_initial,
h_varkey.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = p_alv-kunnr
IMPORTING
output = p_alv-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = p_alv-matnr
IMPORTING
output = p_alv-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
IF p_flag = 'X'.
SELECT SINGLE * INTO ls_konp
FROM konp
WHERE knumh = p_knumh
AND kappl = 'V'
AND kschl = 'ZPR1'.
ENDIF.
CONCATENATE p_alv-vkorg p_alv-vtweg p_alv-kunnr p_alv-matnr INTO h_varkey.
"condition table 条件表A305
ls_ti_bapicondct-table_no = '305'.
ls_ti_bapicondct-applicatio = 'V'.
ls_ti_bapicondct-cond_usage = 'A'. "条件表用途 ‘A' 定价
ls_ti_bapicondct-cond_type = 'ZPR1'. "定价条件
*wa_bapicondct-operation = '009'. "消息功能 : 003 DEL ; 004 MODIFY ;005 REPLACE 009 INITIAL
ls_ti_bapicondct-operation = '009'. "创建
ls_ti_bapicondct-varkey = h_varkey.
ls_ti_bapicondct-valid_to = pdate_e. "调后失效日期
ls_ti_bapicondct-valid_from = pdate_s. "调后生效日期
ls_ti_bapicondct-cond_no = '$000000001'. "创建
APPEND ls_ti_bapicondct TO ti_bapicondct.
CLEAR: ls_ti_bapicondct.
"*KONH
ls_ti_bapicondhd-operation = '009'.
* wa_bapicondhd-operation = '004'.
ls_ti_bapicondhd-cond_no = '$000000001'.
* wa_bapicondhd-cond_no = '0000015528'.
ls_ti_bapicondhd-created_by = sy-uname.
ls_ti_bapicondhd-creat_date = sy-datum.
ls_ti_bapicondhd-cond_usage = 'A'.
ls_ti_bapicondhd-table_no = '305'.
ls_ti_bapicondhd-applicatio = 'V'.
ls_ti_bapicondhd-cond_type = 'ZPR1'.
ls_ti_bapicondhd-varkey = h_varkey.
ls_ti_bapicondhd-valid_from = pdate_s. "生效日期
ls_ti_bapicondhd-valid_to = pdate_e. "失效日期
APPEND ls_ti_bapicondhd TO ti_bapicondhd .
CLEAR: ls_ti_bapicondhd.
"KONP
* wa_bapicondit-operation = '004'. ”修改
ls_ti_bapicondit-operation = '009'. "创建
ls_ti_bapicondit-cond_no = '$000000001'.
* ls_ti_bapicondit-cond_no = '0000015528'.
ls_ti_bapicondit-cond_count = '01'. "条件序列号
ls_ti_bapicondit-applicatio = 'V'.
ls_ti_bapicondit-cond_type = 'ZPR1'. "条件类型
ls_ti_bapicondit-scaletype = 'A'. "STFKZ Staffelsoort
ls_ti_bapicondit-scalebasin = ''. "KZBZG Teken:rekeneenheid " wa_bapicondit-scalebasin = 'C'. 存在数量等级
ls_ti_bapicondit-scale_qty = '1'. "KSTBM Conditiestaffelbasis hoeveelheid
ls_ti_bapicondit-cond_p_unt = '1'. "KPEIN prijseenheid
ls_ti_bapicondit-cond_unit = p_alv-meins. "KMEIN Conditie-hoeveelheidseenheid
ls_ti_bapicondit-calctypcon = 'C'. "KRECH Conditie-rekenregel
IF p_flag = 'X'.
ls_ti_bapicondit-cond_value = ls_konp-kbetr. "
ELSE.
ls_ti_bapicondit-cond_value = p_alv-zxzj. "调整后总单价(未税)
ENDIF.
* ls_ti_bapicondit-cond_value = p_alv-zxzj. "调整后总单价(未税)
ls_ti_bapicondit-condcurr = p_alv-waerk."货币
APPEND ls_ti_bapicondit TO ti_bapicondit .
CLEAR: ls_ti_bapicondit.
CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
* EXPORTING
* PI_INITIALMODE = ' '
* PI_BLOCKNUMBER =
* PI_PHYSICAL_DELETION =
TABLES
ti_bapicondct = ti_bapicondct
ti_bapicondhd = ti_bapicondhd
ti_bapicondit = ti_bapicondit
ti_bapicondqs = ti_bapicondqs
ti_bapicondvs = ti_bapicondvs
to_bapiret2 = to_bapiret2
to_bapiknumhs = to_bapiknumhs
to_mem_initial = to_mem_initial
EXCEPTIONS
update_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT to_bapiret2 INTO ls_to_bapiret2 WHERE type = 'A' OR type = 'E'.
lv_error = 'X'.
EXIT.
ENDLOOP.
IF lv_error = 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
* IMPORTING
* RETURN =
.
p_alv-msg_type = 'E'.
p_alv-msg_status = gc_red.
READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'E'.
IF sy-subrc = 0.
p_alv-message = ls_to_bapiret2-message.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
* IMPORTING
* RETURN =
.
p_alv-msg_type = 'S'.
p_alv-msg_status = gc_green.
READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'S'
id = 'CND_EXCHANGE'
number = '003'.
IF sy-subrc = 0.
p_alv-message = ls_to_bapiret2-message.
p_alv-knumv = ls_to_bapiret2-message_v1.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_change_price_record
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LV_DATE_S
*& --> LV_DATE_E
*& --> GS_ALV
*&---------------------------------------------------------------------*
FORM frm_change_price_record USING pdate_s TYPE datum
pdate_e TYPE datum
p_knumh TYPE a305-knumh
p_flag TYPE c
CHANGING p_alv TYPE gty_alv.
DATA: ti_bapicondct TYPE TABLE OF bapicondct,
ls_ti_bapicondct TYPE bapicondct,
ti_bapicondhd TYPE TABLE OF bapicondhd,
ls_ti_bapicondhd TYPE bapicondhd,
ti_bapicondit TYPE TABLE OF bapicondit,
ls_ti_bapicondit TYPE bapicondit,
ti_bapicondqs TYPE TABLE OF bapicondqs,
ls_ti_bapicondqs TYPE bapicondqs,
ti_bapicondvs TYPE TABLE OF bapicondvs,
ls_ti_bapicondvs TYPE bapicondvs,
to_bapiret2 TYPE TABLE OF bapiret2,
ls_to_bapiret2 TYPE bapiret2,
to_bapiknumhs TYPE TABLE OF bapiknumhs,
ls_to_bapiknumhs TYPE bapiknumhs,
to_mem_initial TYPE TABLE OF cnd_mem_initial,
ls_to_mem_initial TYPE cnd_mem_initial,
h_varkey(100).
DATA: ls_a305 TYPE a305,
ls_konp TYPE konp.
CLEAR: ls_a305,
ls_konp.
CLEAR: ti_bapicondct,
ls_ti_bapicondct,
ti_bapicondhd,
ls_ti_bapicondhd,
ti_bapicondit,
ls_ti_bapicondit,
ti_bapicondqs,
ls_ti_bapicondqs,
ti_bapicondvs,
ls_ti_bapicondvs,
to_bapiret2,
ls_to_bapiret2,
to_bapiknumhs,
ls_to_bapiknumhs,
to_mem_initial,
ls_to_mem_initial,
h_varkey.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = p_alv-kunnr
IMPORTING
output = p_alv-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = p_alv-matnr
IMPORTING
output = p_alv-matnr
EXCEPTIONS
length_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
IF p_flag = 'X'.
SELECT SINGLE * INTO ls_konp
FROM konp
WHERE knumh = p_knumh
AND kappl = 'V'
AND kschl = 'ZPR1'.
ENDIF.
CONCATENATE p_alv-vkorg p_alv-vtweg p_alv-kunnr p_alv-matnr INTO h_varkey.
"condition table 条件表A305
ls_ti_bapicondct-table_no = '305'.
ls_ti_bapicondct-applicatio = 'V'.
ls_ti_bapicondct-cond_usage = 'A'. "条件表用途 ‘A' 定价
ls_ti_bapicondct-cond_type = 'ZPR1'. "定价条件
*wa_bapicondct-operation = '009'. "消息功能 : 003 DEL ; 004 MODIFY ;005 REPLACE 009 INITIAL
ls_ti_bapicondct-operation = '004'. "更改
ls_ti_bapicondct-varkey = h_varkey.
ls_ti_bapicondct-valid_to = pdate_e. "失效日期
ls_ti_bapicondct-valid_from = pdate_s. "生效日期
* ls_ti_bapicondct-cond_no = '$000000001'. "创建
ls_ti_bapicondct-cond_no = p_knumh. "修改
APPEND ls_ti_bapicondct TO ti_bapicondct.
CLEAR: ls_ti_bapicondct.
"*KONH
* ls_ti_bapicondhd-operation = '009'.
ls_ti_bapicondhd-operation = '004'.
* ls_ti_bapicondhd-cond_no = '$000000001'.
ls_ti_bapicondhd-cond_no = p_knumh.
ls_ti_bapicondhd-created_by = sy-uname.
ls_ti_bapicondhd-creat_date = sy-datum.
ls_ti_bapicondhd-cond_usage = 'A'.
ls_ti_bapicondhd-table_no = '305'.
ls_ti_bapicondhd-applicatio = 'V'.
ls_ti_bapicondhd-cond_type = 'ZPR1'.
ls_ti_bapicondhd-varkey = h_varkey.
ls_ti_bapicondhd-valid_from = pdate_s. "调后生效日期
ls_ti_bapicondhd-valid_to = pdate_e. "调后失效日期
APPEND ls_ti_bapicondhd TO ti_bapicondhd .
CLEAR: ls_ti_bapicondhd.
"KONP
ls_ti_bapicondit-operation = '004'. "修改
* ls_ti_bapicondit-operation = '009'. "创建
* ls_ti_bapicondit-cond_no = '$000000001'.
ls_ti_bapicondit-cond_no = p_knumh.
ls_ti_bapicondit-cond_count = '01'. "条件序列号
ls_ti_bapicondit-applicatio = 'V'.
ls_ti_bapicondit-cond_type = 'ZPR1'. "条件类型
ls_ti_bapicondit-scaletype = 'A'. "STFKZ Staffelsoort
ls_ti_bapicondit-scalebasin = ''. "KZBZG Teken:rekeneenheid " wa_bapicondit-scalebasin = 'C'. 存在数量等级
ls_ti_bapicondit-scale_qty = '1'. "KSTBM Conditiestaffelbasis hoeveelheid
ls_ti_bapicondit-cond_p_unt = '1'. "KPEIN prijseenheid
ls_ti_bapicondit-cond_unit = p_alv-meins. "KMEIN Conditie-hoeveelheidseenheid
ls_ti_bapicondit-calctypcon = 'C'. "KRECH Conditie-rekenregel
IF p_flag = 'X'.
ls_ti_bapicondit-cond_value = ls_konp-kbetr. "
ELSE.
ls_ti_bapicondit-cond_value = p_alv-zxzj. "调整后总单价(未税)
ENDIF.
* ls_ti_bapicondit-cond_value = ls_konp-kbetr. "调整后总单价(未税)
ls_ti_bapicondit-condcurr = p_alv-waerk."货币
APPEND ls_ti_bapicondit TO ti_bapicondit .
CLEAR: ls_ti_bapicondit.
CALL FUNCTION 'BAPI_PRICES_CONDITIONS'
* EXPORTING
* PI_INITIALMODE = ' '
* PI_BLOCKNUMBER =
* PI_PHYSICAL_DELETION =
TABLES
ti_bapicondct = ti_bapicondct
ti_bapicondhd = ti_bapicondhd
ti_bapicondit = ti_bapicondit
ti_bapicondqs = ti_bapicondqs
ti_bapicondvs = ti_bapicondvs
to_bapiret2 = to_bapiret2
to_bapiknumhs = to_bapiknumhs
to_mem_initial = to_mem_initial
EXCEPTIONS
update_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT to_bapiret2 INTO ls_to_bapiret2 WHERE type = 'A' OR type = 'E'.
lv_error = 'X'.
EXIT.
ENDLOOP.
IF lv_error = 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
* IMPORTING
* RETURN =
.
p_alv-msg_type = 'E'.
p_alv-msg_status = gc_red.
READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'E'.
IF sy-subrc = 0.
p_alv-message = ls_to_bapiret2-message.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
* IMPORTING
* RETURN =
.
p_alv-msg_type = 'S'.
p_alv-msg_status = gc_green.
READ TABLE to_bapiret2 INTO ls_to_bapiret2 WITH KEY type = 'S'
id = 'CND_EXCHANGE'
number = '003'.
IF sy-subrc = 0.
p_alv-message = ls_to_bapiret2-message.
p_alv-knumv = ls_to_bapiret2-message_v1.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_set_fieldcat_9001
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_set_fieldcat_9001 .
* CLEAR: lt_fieldcat,
* ls_fieldcat.
* DEFINE d1.
* ls_fieldcat-fieldname = &1.
* ls_fieldcat-scrtext_l = &2.
* ls_fieldcat-edit = &3.
* ls_fieldcat-intlen = &4.
* ls_fieldcat-outputlen = &5.
* APPEND ls_fieldcat TO lt_fieldcat.
* CLEAR ls_fieldcat.
* END-OF-DEFINITION.
*
* IF sy-langu = '1'.
* IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
* d1: 'POSNR' '序号' '' 10 10.
* d1:'ZBJDH' '报价单号' '' 10 10.
* d1:'ZBJDH1' '报价单项次' '' 10 10.
* d1:'MATNR' '物料编码' '' 40 40.
* d1:'MAKTX' '物料名称' '' 40 40.
* d1:'ZPRODMODEL' '产品型号' '' 50 50.
* d1:'MEINS' '单位' '' 10 10.
* d1: 'KDMAT' '客户物料编码' '' 35 35.
* d1: 'ZJGLX' '价格类型' '' 10 10.
* d1:'ZBGYY' '变更原因' '' 60 60.
* d1:'WAERK' '币别' '' 5 5.
* d1: 'ZDYHL' '当月汇率' '' 15 15.
* d1: 'ZBJHL' '报价汇率' '' 15 15.
* d1: 'ZHJSZ' '税种' '' 2 2.
* d1:'ZYJG' '原商品售价(未税)' '' 14 14.
* d1:'ZYSL' '原分摊数量' '' 17 17.
* d1:'ZYJG1' '原模具分摊售价(未税)' '' 14 14.
* d1: 'ZYKS' '原模具分摊日期起始日期' '' 10 12.
* d1:'ZYJS' '原分摊日期截止日期' '' 10 10.
* d1:'ZYZJ' '调整前总单价(未税)' '' 14 14.
* d1:'ZXJG' '新产品售价(未税)' '' 14 14.
* d1:'ZXSJ' '新模具分摊数量' '' 17 17.
* d1:'ZXMJJG' '新模具分摊售价(未税)' '' 14 14.
* d1:'ZXKS' '模具分摊起始日期' '' 10 10.
* d1:'ZXJS' '模具分摊截止日期' '' 10 10.
* d1:'ZXZJ' '调整后总单价(未税)' '' 14 14.
* d1:'ZJGBD' '价格变动比例%' '' 14 14.
* d1:'ZTQSX' '调前生效日期' '' 10 10.
* d1:'ZTHSX' '调后生效日期' '' 10 10.
* d1:'ZTQSXRQ' '调前失效日期' '' 10 10.
* d1:'ZTHSXRQ' '调后失效日期' '' 10 10.
* d1:'ZHGBM' '海关编码' '' 20 20.
* d1:'ZZTCY' '征退差异%' '' 14 14.
* d1:'ZCKTS' '出口退税率%' '' 14 14.
* d1:'ZEXYF' '额外出口运费' '' 14 14.
* d1:'ZGCCB' '工程成本' '' 14 14.
* d1:'ZSHCB' '实际成本单价' '' 14 14.
* d1:'ZGCML' '工程毛利率' '' 14 14.
* d1:'ZSJML' '实际毛利率' '' 14 14.
* ELSE.
* d1: 'POSNR' '序号' 'X' 10 10.
* d1:'ZBJDH' '报价单号' 'X' 10 10.
* d1:'ZBJDH1' '报价单项次' 'X' 10 10.
* d1:'MATNR' '物料编码' 'X' 40 40.
* d1:'MAKTX' '物料名称' '' 40 40.
* d1:'ZPRODMODEL' '产品型号' '' 50 50.
* d1:'MEINS' '单位' '' 10 10.
* d1: 'KDMAT' '客户物料编码' 'X' 35 35.
* d1: 'ZJGLX' '价格类型' 'X' 10 10.
* d1:'ZBGYY' '变更原因' 'X' 60 60.
* d1:'WAERK' '币别' '' 5 5.
* d1: 'ZDYHL' '当月汇率' 'X' 15 15.
* d1: 'ZBJHL' '报价汇率' 'X' 15 15.
* d1: 'ZHJSZ' '税种' 'X' 2 2.
* d1:'ZYJG' '原商品售价(未税)' '' 14 14.
* d1:'ZYSL' '原分摊数量' '' 17 17.
* d1:'ZYJG1' '原模具分摊售价(未税)' '' 14 14.
* d1: 'ZYKS' '原模具分摊日期起始日期' '' 10 12.
* d1:'ZYJS' '原分摊日期截止日期' '' 10 10.
* d1:'ZYZJ' '调整前总单价(未税)' '' 14 14.
* d1:'ZXJG' '新产品售价(未税)' 'X' 14 14.
* d1:'ZXSJ' '新模具分摊数量' 'X' 17 17.
* d1:'ZXMJJG' '新模具分摊售价(未税)' 'X' 14 14.
* d1:'ZXKS' '模具分摊起始日期' 'X' 10 10.
* d1:'ZXJS' '模具分摊截止日期' 'X' 10 10.
* d1:'ZXZJ' '调整后总单价(未税)' '' 14 14.
* d1:'ZJGBD' '价格变动比例%' '' 14 14.
* d1:'ZTQSX' '调前生效日期' '' 10 10.
* d1:'ZTHSX' '调后生效日期' 'X' 10 10.
* d1:'ZTQSXRQ' '调前失效日期' '' 10 10.
* d1:'ZTHSXRQ' '调后失效日期' 'X' 10 10.
* d1:'ZHGBM' '海关编码' 'X' 20 20.
* d1:'ZZTCY' '征退差异%' 'X' 14 14.
* d1:'ZCKTS' '出口退税率%' 'X' 14 14.
* d1:'ZEXYF' '额外出口运费' 'X' 14 14.
* d1:'ZGCCB' '工程成本' 'X' 14 14.
* d1:'ZSHCB' '实际成本单价' 'X' 14 14.
* d1:'ZGCML' '工程毛利率' 'X' 14 14.
* d1:'ZSJML' '实际毛利率' 'X' 14 14.
* ENDIF.
*
* ELSE.
* IF gs_header-status = '1' OR gs_header-status = '2' OR gs_header-status = '4'.
* d1: 'POSNR' 'Item No' '' 10 10.
* d1:'ZBJDH' 'Quotation no' '' 10 10.
* d1:'ZBJDH1' 'Quotation item number' '' 10 10.
* d1:'MATNR' 'Material No' '' 40 40.
* d1:'MAKTX' 'Material Name' '' 40 40.
* d1:'ZPRODMODEL' 'Product Model' '' 50 50.
* d1:'MEINS' 'Base Unit of Measure' '' 10 10.
* d1: 'KDMAT' 'Customer Material No' '' 35 35.
* d1: 'ZJGLX' 'Price Type' '' 10 10.
* d1:'ZBGYY' 'Reason for Change' '' 60 60.
* d1:'WAERK' 'Currency' '' 5 5.
* d1: 'ZDYHL' 'Current month exchange rate' '' 15 15.
* d1: 'ZBJHL' 'Quotation exchange rate' '' 15 15.
* d1: 'ZHJSZ' 'Categories of taxes' '' 2 2.
* d1:'ZYJG' 'Original product selling price (before tax)' '' 14 14.
* d1:'ZYSL' 'Original allocation quantity' '' 17 17.
* d1:'ZYJG1' 'Shared selling price of the original mold (before tax)' '' 14 14.
* d1: 'ZYKS' 'Starting date of original mold allocation' '' 10 12.
* d1:'ZYJS' 'Original allocation date deadline' '' 10 10.
* d1:'ZYZJ' 'Total unit price before adjustment (before tax)' '' 14 14.
* d1:'ZXJG' 'New product selling price (before tax)' '' 14 14.
* d1:'ZXSJ' 'New mold allocation quantity' '' 17 17.
* d1:'ZXMJJG' 'Shared selling price of new molds (before tax)' '' 14 14.
* d1:'ZXKS' 'Starting date of mold allocation' '' 10 10.
* d1:'ZXJS' 'Mold allocation deadline' '' 10 10.
* d1:'ZXZJ' 'Adjusted total unit price (before tax)' '' 14 14.
* d1:'ZJGBD' 'Price change ratio%' '' 14 14.
* d1:'ZTQSX' 'Effective date before adjustment' '' 10 10.
* d1:'ZTHSX' 'Effective date after adjustment' '' 10 10.
* d1:'ZTQSXRQ' 'Pre adjustment expiration date' '' 10 10.
* d1:'ZTHSXRQ' 'Expiration date after adjustment' '' 10 10.
* d1:'ZHGBM' 'Customs code' '' 20 20.
* d1:'ZZTCY' 'Tax refund difference%' '' 14 14.
* d1:'ZCKTS' 'Export tax refund rate%' '' 14 14.
* d1:'ZEXYF' 'Additional export shipping costs' '' 14 14.
* d1:'ZGCCB' 'Project cost' '' 14 14.
* d1:'ZSHCB' 'Actual cost unit price' '' 14 14.
* d1:'ZGCML' 'Engineering gross profit margin' '' 14 14.
* d1:'ZSJML' 'Actual gross profit margin' '' 14 14.
* ELSE.
* d1: 'POSNR' 'Item No' 'X' 10 10.
* d1:'ZBJDH' 'Quotation no' 'X' 10 10.
* d1:'ZBJDH1' 'Quotation item number' 'X' 10 10.
* d1:'MATNR' 'Material No' 'X' 40 40.
* d1:'MAKTX' 'Material Name' '' 40 40.
* d1:'ZPRODMODEL' 'Product Model' '' 50 50.
* d1:'MEINS' 'Base Unit of Measure' '' 10 10.
* d1: 'KDMAT' 'Customer Material No' 'X' 35 35.
* d1: 'ZJGLX' 'Price Type' 'X' 10 10.
* d1:'ZBGYY' 'Reason for Change' 'X' 60 60.
* d1:'WAERK' 'Currency' '' 5 5.
* d1: 'ZDYHL' 'Current month exchange rate' 'X' 15 15.
* d1: 'ZBJHL' 'Quotation exchange rate' 'X' 15 15.
* d1: 'ZHJSZ' 'Categories of taxes' 'X' 2 2.
* d1:'ZYJG' 'Original product selling price (before tax)' '' 14 14.
* d1:'ZYSL' 'Original allocation quantity' '' 17 17.
* d1:'ZYJG1' 'Shared selling price of the original mold (before tax)' '' 14 14.
* d1: 'ZYKS' 'Starting date of original mold allocation' '' 10 12.
* d1:'ZYJS' 'Original allocation date deadline' '' 10 10.
* d1:'ZYZJ' 'Total unit price before adjustment (before tax)' '' 14 14.
* d1:'ZXJG' 'New product selling price (before tax)' 'X' 14 14.
* d1:'ZXSJ' 'New mold allocation quantity' 'X' 17 17.
* d1:'ZXMJJG' 'Shared selling price of new molds (before tax)' 'X' 14 14.
* d1:'ZXKS' 'Starting date of mold allocation' 'X' 10 10.
* d1:'ZXJS' 'Mold allocation deadline' 'X' 10 10.
* d1:'ZXZJ' 'Adjusted total unit price (before tax)' '' 14 14.
* d1:'ZJGBD' 'Price change ratio%' '' 14 14.
* d1:'ZTQSX' 'Effective date before adjustment' '' 10 10.
* d1:'ZTHSX' 'Effective date after adjustment' 'X' 10 10.
* d1:'ZTQSXRQ' 'Pre adjustment expiration date' '' 10 10.
* d1:'ZTHSXRQ' 'Expiration date after adjustment' 'X' 10 10.
* d1:'ZHGBM' 'Customs code' 'X' 20 20.
* d1:'ZZTCY' 'Tax refund difference%' 'X' 14 14.
* d1:'ZCKTS' 'Export tax refund rate%' 'X' 14 14.
* d1:'ZEXYF' 'Additional export shipping costs' 'X' 14 14.
* d1:'ZGCCB' 'Project cost' 'X' 14 14.
* d1:'ZSHCB' 'Actual cost unit price' 'X' 14 14.
* d1:'ZGCML' 'Engineering gross profit margin' 'X' 14 14.
* d1:'ZSJML' 'Actual gross profit margin' 'X' 14 14.
* ENDIF.
* ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Module CHANGE_DATA INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE change_data INPUT.
DATA: lv_lifnr TYPE knvp-lifnr,
lv_kunnr_c TYPE kna1-kunnr..
CLEAR: lv_lifnr,
lv_kunnr_c.
lv_kunnr_c = gs_header-kunnr.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_kunnr_c
IMPORTING
output = lv_kunnr_c.
CLEAR: gs_header-zkhjl.
SELECT SINGLE lifnr INTO lv_lifnr "客户经理
FROM knvp
WHERE kunnr = lv_kunnr_c
AND vkorg = gs_header-vkorg
AND vtweg = '00'
AND spart = '00'
AND parvw = 'V1'.
IF lv_lifnr IS NOT INITIAL.
gs_header-zkhjl = lv_lifnr.
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Form frm_get_zhjsz_f4
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- <FS_OUTTAB>_ZHJSZ
*&---------------------------------------------------------------------*
FORM frm_get_zhjsz_f4 CHANGING zhjsz TYPE zsdt040b-zhjsz.
DATA: value_tab TYPE TABLE OF dfies,
ls_value_tab TYPE dfies,
return_tab TYPE TABLE OF ddshretval,
ls_return_tab TYPE ddshretval,
lt_zsdt040d TYPE TABLE OF zsdt040d,
ls_zsdt040d TYPE zsdt040d.
SELECT * INTO TABLE lt_zsdt040d
FROM zsdt040d.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
* DDIC_STRUCTURE = ' '
retfield = 'ZHJSZ'
* PVALKEY = ' '
* DYNPPROG = ' '
* DYNPNR = ' '
* DYNPROFIELD = ' '
* STEPL = 0
* WINDOW_TITLE =
* VALUE = ' '
value_org = 'S'
* MULTIPLE_CHOICE = ' '
* DISPLAY = ' '
* CALLBACK_PROGRAM = ' '
* CALLBACK_FORM = ' '
* CALLBACK_METHOD =
* MARK_TAB =
* IMPORTING
* USER_RESET =
TABLES
value_tab = lt_zsdt040d
* FIELD_TAB =
return_tab = return_tab
* DYNPFLD_MAPPING =
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
* Implement suitable error handling here
ELSE.
READ TABLE return_tab INTO ls_return_tab INDEX 1.
IF sy-subrc = 0 AND ls_return_tab-fieldval IS NOT INITIAL.
zhjsz = ls_return_tab-fieldval.
ENDIF.
ENDIF.
ENDFORM.