业务要求用信息记录维护采购合同,同时要记录采购和财务复核合同的信息。下面程序就是利用采购信息记录的文本(居于采购组织的文本)实现。


后台配置:


源程序:
*&---------------------------------------------------------------------*
*& Report ZMM_INFO_RECORD_EDIT
*&---------------------------------------------------------------------*
*& 编辑采购信息记录文本
*& 功能:1. ALV显示 2. 复选框选择 3. 保存按钮 4. TXZ01可编辑+下拉选择
*& 5. 显示EINA和EINE长文本
*&---------------------------------------------------------------------*
REPORT zmmr_013.
TABLES: eina, eine, makt.
TYPES: BEGIN OF ty_data,
sel TYPE c LENGTH 1, " 选择复选框
infnr TYPE eina-infnr, " 采购信息记录
matnr TYPE eina-matnr, " 物料
ekorg TYPE eine-ekorg, " 采购组织
lifnr TYPE eina-lifnr, " 供应商
txz01 TYPE eina-txz01, " 信息记录文本(可编辑)
maktx TYPE makt-maktx, " 物料描述
esokz TYPE eine-esokz, " 信息记录类别
ekgrp TYPE eine-ekgrp, " 采购组
aplfz TYPE eine-aplfz, " 计划交货时间
netpr TYPE eine-netpr, " 净价
effpr TYPE eine-effpr, " 有效价格
peinh TYPE eine-peinh, " 每(价格单位)
bprme TYPE eine-bprme, " 订单价单位
meins TYPE mara-meins, " 基本计量单位
waers TYPE eine-waers, " 货币
erdat TYPE eine-erdat, " 创建日期
mwskz TYPE eine-mwskz, " 税码
datlb TYPE eine-datlb, " 日期(有效至)
norbm TYPE eine-norbm, " 标准数量
bpumz TYPE eine-bpumz, " 转换分子
bpumn TYPE eine-bpumn, " 转换分母
knumh TYPE a018-knumh, " 条件记录号
NA_ltex1 TYPE string, " EINA长文本(AT-信息记录注释)
NA_ltex2 TYPE string, " EINA长文本(AT-信息记录注释)
NA_ltex3 TYPE string, " EINA长文本(AT-信息记录注释)
NE_ltex1 TYPE string, " EINE长文本(BT-采购订单文本)
NE_ltex2 TYPE string, " EINE长文本(BT-采购订单文本)
NE_ltex3 TYPE string, " EINE长文本(BT-采购订单文本)
message TYPE string,
END OF ty_data.
DATA: gt_data TYPE TABLE OF ty_data,
gs_data TYPE ty_data.
" ALV相关变量
DATA: gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat,
gs_layout TYPE lvc_s_layo.
DATA: gt_event TYPE slis_t_event,
gs_event TYPE slis_alv_event.
DATA: g_repid LIKE sy-repid.
DATA: go_grid TYPE REF TO cl_gui_alv_grid. " ALV对象
" 新增:下拉相关变量
DATA: gt_dropdown TYPE lvc_t_drop,
gs_dropdown TYPE lvc_s_drop.
" 新增:长文本相关变量
DATA: gt_lines TYPE STANDARD TABLE OF tline WITH DEFAULT KEY,
gs_lines TYPE tline,
gt_stxh TYPE TABLE OF stxh,
gs_stxh TYPE stxh.
DATA: gt_bdcdata TYPE TABLE OF bdcdata WITH HEADER LINE.
DATA:
gc_fi TYPE c.
" 选择屏幕定义
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
s_matnr FOR eina-matnr,
s_ekorg FOR eine-ekorg," OBLIGATORY,
s_lifnr FOR eina-lifnr." OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
" 事件类定义
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS:
handle_modify
FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after
e_ucomm sender,
handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive.
ENDCLASS.
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_modify.
DATA: ls_stbl TYPE lvc_s_stbl.
IF e_modified = 'X'.
" 当TXZ01字段被修改时,更新内部表
LOOP AT et_good_cells INTO DATA(ls_good_cells).
IF ls_good_cells-fieldname = 'TXZ01'.
READ TABLE gt_data INTO gs_data INDEX ls_good_cells-row_id.
IF sy-subrc = 0.
" 验证输入值是否在下拉列表中
READ TABLE gt_dropdown WITH KEY
handle = '1'
value = ls_good_cells-value
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
" 值有效,更新数据
gs_data-txz01 = ls_good_cells-value.
ELSE.
" 值无效,清空或显示错误
gs_data-txz01 = ''.
MESSAGE '请从下拉列表中选择有效的值'
TYPE 'I'.
ENDIF.
MODIFY gt_data FROM gs_data INDEX ls_good_cells-row_id.
ENDIF.
ENDIF.
ENDLOOP.
" 刷新显示
ls_stbl-row = 'X'.
ls_stbl-col = 'X'.
CALL METHOD go_grid->refresh_table_display
EXPORTING
is_stable = ls_stbl.
ENDIF.
ENDMETHOD.
METHOD handle_data_changed.
" 可以在这里添加更复杂的校验逻辑
ENDMETHOD.
METHOD handle_toolbar.
" 工具栏处理
ENDMETHOD.
ENDCLASS.
DATA: go_event_receiver TYPE REF TO lcl_event_receiver.
*----------------------------------------------------------------------*
* START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_data.
*----------------------------------------------------------------------*
* END-OF-SELECTION
*----------------------------------------------------------------------*
END-OF-SELECTION.
PERFORM show_alv.
*&---------------------------------------------------------------------*
*& Form GET_DATA
*&---------------------------------------------------------------------*
FORM get_data .
DATA: lt_eina TYPE TABLE OF eina,
ls_eina TYPE eina,
lt_eine TYPE TABLE OF eine,
ls_eine TYPE eine,
lt_makt TYPE TABLE OF makt,
ls_makt TYPE makt,
lt_mara TYPE TABLE OF mara,
ls_mara TYPE mara,
lt_a018 TYPE TABLE OF a018,
ls_a018 TYPE a018.
DATA: lt_matnr TYPE RANGE OF matnr,
ls_matnr LIKE LINE OF lt_matnr.
CLEAR: gc_fi.
" 获取采购信息记录主数据
SELECT * FROM eina
INTO TABLE lt_eina
WHERE matnr IN s_matnr
AND lifnr IN s_lifnr.
IF lt_eina IS NOT INITIAL.
" 构建MATNR范围表
CLEAR lt_matnr.
LOOP AT lt_eina INTO ls_eina.
ls_matnr-sign = 'I'.
ls_matnr-option = 'EQ'.
ls_matnr-low = ls_eina-matnr.
APPEND ls_matnr TO lt_matnr.
ENDLOOP.
" 获取采购组织数据
SELECT * FROM eine
INTO TABLE lt_eine
FOR ALL ENTRIES IN lt_eina
WHERE infnr = lt_eina-infnr
AND ekorg IN s_ekorg
AND loekz = ''.
" 获取物料主数据
IF lt_matnr IS NOT INITIAL.
SELECT * FROM mara
INTO TABLE lt_mara
WHERE matnr IN lt_matnr.
ENDIF.
" 获取物料描述
IF lt_matnr IS NOT INITIAL.
SELECT * FROM makt
INTO TABLE lt_makt
WHERE matnr IN lt_matnr
AND spras = sy-langu.
ENDIF.
" 获取价格条件记录
SELECT * FROM a018
INTO TABLE lt_a018
WHERE kappl = 'M'
AND kschl = 'PB00'
AND lifnr IN s_lifnr
AND matnr IN s_matnr
AND ekorg IN s_ekorg
AND datab <= sy-datum
AND datbi >= sy-datum.
ENDIF.
" 组合数据
LOOP AT lt_eine INTO ls_eine.
CLEAR gs_data.
" 从 EINE 获取数据
gs_data-infnr = ls_eine-infnr.
gs_data-ekorg = ls_eine-ekorg.
gs_data-esokz = ls_eine-esokz.
gs_data-ekgrp = ls_eine-ekgrp.
gs_data-aplfz = ls_eine-aplfz.
gs_data-netpr = ls_eine-netpr.
gs_data-effpr = ls_eine-effpr.
gs_data-peinh = ls_eine-peinh.
gs_data-bprme = ls_eine-bprme.
gs_data-waers = ls_eine-waers.
gs_data-erdat = ls_eine-erdat.
gs_data-mwskz = ls_eine-mwskz.
gs_data-datlb = ls_eine-datlb.
gs_data-norbm = ls_eine-norbm.
gs_data-bpumz = ls_eine-bpumz.
gs_data-bpumn = ls_eine-bpumn.
" 根据INFNR从EINA读取数据
READ TABLE lt_eina INTO ls_eina WITH KEY infnr = ls_eine-infnr.
IF sy-subrc = 0.
gs_data-matnr = ls_eina-matnr.
gs_data-lifnr = ls_eina-lifnr.
gs_data-txz01 = ls_eina-txz01.
ENDIF.
" 读取物料描述
READ TABLE lt_makt INTO ls_makt
WITH KEY matnr = gs_data-matnr.
IF sy-subrc = 0.
gs_data-maktx =

707

被折叠的 条评论
为什么被折叠?



