FUNCTION zmm_saptooa_001.
*"----------------------------------------------------------------------
*"*"本地接口:
*" TABLES
*" T_DATA STRUCTURE ZSMMOA_001
*" T_MESSAGE STRUCTURE ZZS_MESSAGE
*"----------------------------------------------------------------------
DATA:lv_menge_101 TYPE ekpo-menge,
lv_menge_102 TYPE ekpo-menge,
lv_menge_122 TYPE ekpo-menge,
lv_menge_123 TYPE ekpo-menge.
TYPES : BEGIN OF ty_mseg,
mblnr TYPE mseg-mblnr, "物料凭证号
mjahr TYPE mseg-mjahr, "物料凭证年份
zeile TYPE mseg-zeile, "项次
werks TYPE mseg-werks, "工厂
lifnr TYPE mseg-lifnr, "供应商编码
menge TYPE mseg-menge, "本次数量
charg TYPE mseg-charg, "批次
hsdat TYPE mseg-hsdat,
ebeln TYPE mseg-ebeln, "采购单号
ebelp TYPE mseg-ebelp, "采购凭证的项目编号
matnr TYPE mseg-matnr, "物料编号
usnam_mkpf TYPE mseg-usnam_mkpf, "人员
anln1 TYPE mseg-anln1, " 资产号
anln2 TYPE mseg-anln2,
erfmg TYPE mseg-erfmg,
lgort TYPE mseg-lgort,
bwkey TYPE t001w-bwkey,"公司代码
vfdat TYPE mcha-vfdat, "有效日期
sgtxt TYPE mseg-sgtxt,
END OF ty_mseg.
TYPES : BEGIN OF ty_ekko,
ebeln TYPE ekko-ebeln, "采购单号
zterm TYPE ekko-zterm, "付款条件
ekgrp TYPE ekko-ekgrp,
inco1 TYPE ekko-inco1, "国际贸易条款(第 1 部分)
bsart TYPE ekko-bsart,
ernam TYPE ekko-ernam,
END OF ty_ekko.
TYPES : BEGIN OF ty_lfa1,
lifnr TYPE lfa1-lifnr, "供应商帐户号
name1 TYPE lfa1-name1, "供应商描述
land1 TYPE lfa1-land1, "国家地区代码
END OF ty_lfa1.
TYPES : BEGIN OF ty_mkpf,
mblnr TYPE mkpf-mblnr, "物料凭证编号
bldat TYPE mkpf-bldat, "收货日期
budat TYPE mkpf-budat, "入账日期
usnam TYPE mkpf-usnam,
END OF ty_mkpf.
TYPES : BEGIN OF ty_eban,"采购申请
ebeln TYPE eban-ebeln, "采购订单号
ebelp TYPE eban-ebelp, "采购订单项目号
afnam TYPE eban-afnam, "申请者/检验者工号
END OF ty_eban.
TYPES : BEGIN OF ty_ekpo,
ebeln TYPE ekpo-ebeln, "采购凭证编号
ebelp TYPE ekpo-ebelp, "采购凭证的项目编号
menge TYPE ekpo-menge, "PO总数量
meins TYPE ekpo-meins, " 单位
matnr TYPE ekpo-matnr, "料号/资产编号
banfn TYPE ekpo-banfn, "请购单号
txz01 TYPE ekpo-txz01, "品名
knttp TYPE ekpo-knttp,
afnam TYPE ekpo-afnam,
emlif TYPE ekpo-emlif, "供应商
lblkz TYPE ekpo-lblkz, "转包供应商
matkl TYPE ekpo-matkl,
zspec TYPE ekpo-zspec,
END OF ty_ekpo.
TYPES : BEGIN OF ty_mard,
matnr TYPE mard-matnr, "物料编号
*& 添加筛选字段,补充数据残缺 By E101018 20190730 &*
werks TYPE mard-werks,
lgort TYPE mard-lgort,
lgpbe TYPE mard-lgpbe, "库房架位
END OF ty_mard.
TYPES : BEGIN OF ty_usr21,
bname TYPE usr21-bname, "用户主记录中的用户名称
persnumber TYPE usr21-persnumber, "人员编号
END OF ty_usr21.
TYPES : BEGIN OF ty_adrp,
persnumber TYPE adrp-persnumber, "人员编号
name_text TYPE adrp-name_text, "完整的人员名称
END OF ty_adrp.
TYPES : BEGIN OF ty_marc,
matnr TYPE marc-matnr,
werks TYPE marc-werks,
insmk TYPE marc-insmk, "过帐到检验库存
END OF ty_marc.
TYPES : BEGIN OF ty_mara,
matnr TYPE mara-matnr,
mhdhb TYPE mara-mhdhb, "总货架寿命
END OF ty_mara.
TYPES : BEGIN OF ty_ztmm009,
mblnr TYPE ztmm009-mblnr,
mjahr TYPE ztmm009-mjahr,
usnam TYPE ztmm009-usnam, "用户名
name_text TYPE ztmm009-name_text, "完整的人员名称
bktxt TYPE ztmm009-bktxt,
ysd_type TYPE ztmm009-ysd_type,
END OF ty_ztmm009.
DATA : wa_ztmm009 TYPE ty_ztmm009,
it_ztmm009 LIKE TABLE OF wa_ztmm009.
DATA : wa_mseg TYPE ty_mseg,
it_mseg LIKE TABLE OF wa_mseg.
DATA : wa_ekko TYPE ty_ekko,
it_ekko LIKE TABLE OF wa_ekko.
DATA : wa_lfa1 TYPE ty_lfa1,
it_lfa1 LIKE TABLE OF wa_lfa1.
DATA : wa_mkpf TYPE ty_mkpf,
it_mkpf LIKE TABLE OF wa_mkpf.
DATA : wa_eban TYPE ty_eban,
it_eban LIKE TABLE OF wa_eban.
DATA : wa_ekpo TYPE ty_ekpo,
it_ekpo LIKE TABLE OF wa_ekpo.
DATA : wa_mard TYPE ty_mard,
it_mard LIKE TABLE OF wa_mard.
DATA : wa_usr21 TYPE ty_usr21,
it_usr21 LIKE TABLE OF wa_usr21.
DATA : wa_adrp TYPE ty_adrp,
it_adrp LIKE TABLE OF wa_adrp.
DATA : wa_alv TYPE zsmmoa_001.
DATA:it_ztmm003 LIKE TABLE OF ztmm003,
wa_ztmm003 TYPE ztmm003.
DATA : wa_marc TYPE ty_marc,
it_marc LIKE TABLE OF wa_marc.
DATA : wa_mara TYPE ty_mara,
it_mara LIKE TABLE OF wa_mara.
DATA: wa_mcha TYPE mcha,
it_mcha TYPE STANDARD TABLE OF mcha.
DATA: ls_ztmm013 TYPE ztmm013.
SELECT
a~mblnr "物料凭证号
a~mjahr "物料凭证年份
a~zeile "项次
a~werks "工厂
a~lifnr "供应商编码
menge "本次数量
charg "批次
hsdat
ebeln "采购单号
ebelp "采购凭证的项目编号
a~matnr "物料编号
usnam_mkpf "人员
a~anln1"主资产号
a~anln2
erfmg
lgort
b~bwkey
sgtxt
INTO CORRESPONDING FIELDS OF TABLE it_mseg
FROM mseg AS a
INNER JOIN t001w AS b ON a~werks = b~werks
INNER JOIN ztmm003 AS c
ON a~mblnr = c~mblnr AND a~mjahr = c~mjahr AND a~zeile = c~zeile AND c~z_flag = 'N'
WHERE a~bwart <> '161'.
IF it_mseg IS NOT INITIAL.
SELECT
zmatnr,
zmeslotid,
matnr,
kostl,
zuse_type
INTO TABLE @DATA(lt_ztsd017)
FROM ztsd017
FOR ALL ENTRIES IN @it_mseg
WHERE zmatnr = @it_mseg-matnr.
* AND zmeslotid = @gt_update_batch-vbatch.
SORT lt_ztsd017 BY zmatnr zmeslotid.
SELECT
*
INTO TABLE @DATA(lt_zv_fi_002)
FROM zv_fi_002
FOR ALL ENTRIES IN @it_mseg
WHERE bukrs = @it_mseg-bwkey AND anln1 = @it_mseg-anln1 AND
anln2 = @it_mseg-anln2.
SELECT
mblnr
mjahr
usnam
name_text
bktxt
ysd_type
INTO CORRESPONDING FIELDS OF TABLE it_ztmm009
FROM ztmm009
FOR ALL ENTRIES IN it_mseg
WHERE mjahr = it_mseg-mjahr AND mblnr = it_mseg-mblnr.
SELECT
*
INTO TABLE @DATA(lt_ztmm016)
FROM ztmm016
FOR ALL ENTRIES IN @it_mseg
WHERE mjahr = @it_mseg-mjahr AND mblnr = @it_mseg-mblnr.
SORT lt_ztmm016 BY mjahr mblnr.
SELECT
ebeln "采购单号
zterm "付款条件
ekgrp
inco1
bsart"采购凭证类型
ernam
INTO CORRESPONDING FIELDS OF TABLE it_ekko
FROM ekko
FOR ALL ENTRIES IN it_mseg WHERE ebeln = it_mseg-ebeln.
SORT it_ekko BY ebeln.
SELECT
lifnr "供应商帐户号
name1"供应商描述
land1 "国家地区代码
INTO CORRESPONDING FIELDS OF TABLE it_lfa1
FROM lfa1
FOR ALL ENTRIES IN it_mseg WHERE lifnr = it_mseg-lifnr.
SORT it_lfa1 BY lifnr.
SELECT
mblnr "物料凭证编号
bldat "收货日期
budat "入账日期
usnam
INTO CORRESPONDING FIELDS OF TABLE it_mkpf
FROM mkpf
FOR ALL ENTRIES IN it_mseg WHERE mblnr = it_mseg-mblnr AND mjahr = it_mseg-mjahr.
SORT it_mkpf BY mblnr.
SELECT
ebeln "采购凭证编号
ebelp "采购凭证的项目编号
menge "PO总数量
meins " 单位
matnr "料号/资产编号
banfn "请购单号
txz01 "品名
knttp
afnam
emlif "供应商
lblkz "转包供应商
matkl
zspec
INTO CORRESPONDING FIELDS OF TABLE it_ekpo
FROM ekpo
FOR ALL ENTRIES IN it_mseg WHERE ebeln = it_mseg-ebeln AND ebelp = it_mseg-ebelp.
SORT it_ekpo BY ebeln.
IF it_ekpo IS NOT INITIAL.
SELECT
mblnr,
mjahr,
zeile,
bwart,
erfmg,
ebeln,
ebelp
INTO TABLE @DATA(lt_mseg_all)
FROM mseg
FOR ALL ENTRIES IN @it_ekpo
WHERE ebeln = @it_ekpo-ebeln AND ebelp = @it_ekpo-ebelp AND ( bwart = '101' OR bwart = '102' OR bwart = '123' OR bwart = '122').
ENDIF.
SELECT
matnr "物料编号
werks
lgort
lgpbe "库房架位
INTO CORRESPONDING FIELDS OF TABLE it_mard
FROM mard
FOR ALL ENTRIES IN it_mseg WHERE matnr = it_mseg-matnr AND werks = it_mseg-werks AND lgort = it_mseg-lgort.
* FOR ALL ENTRIES IN it_mseg WHERE matnr = it_mseg-matnr .
SORT it_mard BY matnr werks lgort.
SELECT
bname
persnumber
FROM usr21 INTO TABLE it_usr21
FOR ALL ENTRIES IN it_mseg
WHERE bname = it_mseg-usnam_mkpf.
SELECT
matnr
werks
insmk
INTO CORRESPONDING FIELDS OF TABLE it_marc
FROM marc
FOR ALL ENTRIES IN it_mseg WHERE matnr = it_mseg-matnr AND werks = it_mseg-werks.
SORT it_marc BY matnr werks.
SELECT
matnr,
matkl,
mhdhb,
meins
INTO TABLE @DATA(lt_mara)
FROM mara
FOR ALL ENTRIES IN @it_mseg
WHERE matnr = @it_mseg-matnr.
SORT lt_mara BY matnr.
IF lt_mara IS NOT INITIAL.
SELECT
matnr,
maktx
INTO TABLE @DATA(lt_makt)
FROM makt
FOR ALL ENTRIES IN @lt_mara
WHERE matnr = @lt_mara-matnr AND spras = @sy-langu.
SORT lt_makt BY matnr.
ENDIF.
IF it_usr21 IS NOT INITIAL.
SELECT
persnumber
name_text
FROM adrp INTO TABLE it_adrp
FOR ALL ENTRIES IN it_usr21
WHERE persnumber = it_usr21-persnumber.
ENDIF.
SELECT matnr
werks
charg
licha
INTO CORRESPONDING FIELDS OF TABLE it_mcha
FROM mcha
FOR ALL ENTRIES IN it_mseg
WHERE matnr = it_mseg-matnr AND werks = it_mseg-werks AND charg = it_mseg-charg.
SORT it_mcha BY matnr werks charg.
ENDIF.
LOOP AT it_mseg INTO wa_mseg.
CLEAR wa_alv.
wa_alv-mblnr = wa_mseg-mblnr. "物料凭证号
wa_alv-mjahr = wa_mseg-mjahr. "物料凭证年份
wa_alv-zeile = wa_mseg-zeile. "项次
wa_alv-werks = wa_mseg-werks. "工厂
wa_alv-lifnr = wa_mseg-lifnr. "供应商编码
wa_alv-charg = wa_mseg-charg. "批次
wa_alv-hsdat = wa_mseg-hsdat.
wa_alv-ebeln = wa_mseg-ebeln . "采购单号
wa_alv-ebelp = wa_mseg-ebelp . "采购订单行项目
wa_alv-lgort = wa_mseg-lgort. "库存地点
READ TABLE lt_zv_fi_002 INTO DATA(ls_zv_fi_002) WITH KEY bukrs = wa_mseg-bwkey anln1 = wa_mseg-anln1
anln2 = wa_mseg-anln2.
IF sy-subrc = 0.
wa_alv-zktogr = ls_zv_fi_002-zktogr.
ENDIF.
IF wa_alv-zktogr IS INITIAL.
wa_alv-zktogr = '8'.
ENDIF.
READ TABLE it_lfa1 INTO wa_lfa1 WITH KEY lifnr = wa_mseg-lifnr BINARY SEARCH.
IF sy-subrc = 0.
wa_alv-name1 = wa_lfa1-name1.
wa_alv-land1 = wa_lfa1-land1.
CLEAR wa_lfa1.
ENDIF.
READ TABLE it_mkpf INTO wa_mkpf WITH KEY mblnr = wa_mseg-mblnr BINARY SEARCH.
IF sy-subrc = 0.
wa_alv-bldat = wa_mkpf-bldat.
wa_alv-budat = wa_mkpf-budat.
wa_alv-usnam = wa_mkpf-usnam.
CLEAR wa_mkpf.
ENDIF.
READ TABLE it_ekpo INTO wa_ekpo WITH KEY ebeln = wa_mseg-ebeln ebelp = wa_mseg-ebelp. "采购凭证 项目
IF sy-subrc = 0.
CLEAR:lv_menge_101,lv_menge_102,lv_menge_123,lv_menge_122.
LOOP AT lt_mseg_all INTO DATA(ls_mseg_all_101) WHERE bwart = '101' AND ebeln = wa_ekpo-ebeln AND ebelp = wa_ekpo-ebelp.
lv_menge_101 = lv_menge_101 + ls_mseg_all_101-erfmg.
ENDLOOP.
LOOP AT lt_mseg_all INTO DATA(ls_mseg_all_102) WHERE bwart = '102' AND ebeln = wa_ekpo-ebeln AND ebelp = wa_ekpo-ebelp.
lv_menge_102 = lv_menge_102 + ls_mseg_all_102-erfmg.
ENDLOOP.
LOOP AT lt_mseg_all INTO DATA(ls_mseg_all_123) WHERE bwart = '123' AND ebeln = wa_ekpo-ebeln AND ebelp = wa_ekpo-ebelp.
lv_menge_123 = lv_menge_123 + ls_mseg_all_123-erfmg.
ENDLOOP.
LOOP AT lt_mseg_all INTO DATA(ls_mseg_all_122) WHERE bwart = '122' AND ebeln = wa_ekpo-ebeln AND ebelp = wa_ekpo-ebelp.
lv_menge_122 = lv_menge_122 + ls_mseg_all_122-erfmg.
ENDLOOP.
wa_alv-menge = wa_ekpo-menge - lv_menge_101 + lv_menge_102 + lv_menge_122 - lv_menge_123."PO未交货数量
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT'
EXPORTING
input = wa_ekpo-meins
language = sy-langu
IMPORTING
* LONG_TEXT =
output = wa_alv-meins
* SHORT_TEXT =
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
wa_alv-knttp = wa_ekpo-knttp. "科目分配类别
wa_alv-zspec = wa_ekpo-zspec. "规格型号
IF wa_alv-knttp = 'A' OR wa_alv-knttp = 'K'.
IF wa_alv-knttp = 'K'.
IF wa_ekpo-matnr IS NOT INITIAL.
wa_alv-matnr = wa_ekpo-matnr."料号/资产编号
ELSE.
wa_alv-matnr = wa_mseg-anln1.
ENDIF.
ELSE.
wa_alv-matnr = wa_mseg-anln1.
ENDIF.
wa_alv-anln2 = wa_mseg-anln2.
wa_alv-zmeng = wa_mseg-erfmg.
ELSE.
wa_alv-matnr = wa_ekpo-matnr."料号/资产编号
wa_alv-zmeng = wa_mseg-menge. "本次数量
ENDIF.
wa_alv-banfn = wa_ekpo-banfn."请购单号
wa_alv-txz01 = wa_ekpo-txz01."品名
wa_alv-afnam = wa_ekpo-afnam.
wa_alv-emlif = wa_ekpo-emlif.
wa_alv-lblkz = wa_ekpo-lblkz.
IF wa_ekpo-matkl = 'M011' OR wa_ekpo-matkl = 'M013' OR wa_ekpo-matkl = 'M014' OR wa_ekpo-matkl = 'M016'.
wa_alv-zaccep_cat = '1'.
ELSEIF wa_ekpo-matkl = 'M015' OR wa_ekpo-matkl = 'Z001' OR wa_ekpo-matkl = 'Z002' OR wa_ekpo-matkl+0(1) = 'F'.
wa_alv-zaccep_cat = '2'.
ELSE.
wa_alv-zaccep_cat = '3'.
ENDIF.
CLEAR wa_ekpo.
ELSE.
wa_alv-matnr = wa_mseg-matnr."料号/资产编号
wa_alv-zmeng = wa_mseg-menge.
READ TABLE lt_makt INTO DATA(ls_makt) WITH KEY matnr = wa_mseg-matnr BINARY SEARCH.
IF sy-subrc = 0.
wa_alv-txz01 = ls_makt-maktx.
ENDIF.
ENDIF.
READ TABLE it_ekko INTO wa_ekko WITH KEY ebeln = wa_mseg-ebeln BINARY SEARCH.
IF sy-subrc = 0.
wa_alv-zterm = wa_ekko-zterm.
wa_alv-ekgrp = wa_ekko-ekgrp.
wa_alv-inco1 = wa_ekko-inco1.
wa_alv-ernam = wa_ekko-ernam.
IF wa_ekko-bsart = 'Z001'.
wa_alv-zaccep_ord_cat = '1'.
ELSEIF wa_ekko-bsart = 'Z002' AND wa_alv-knttp = 'A'.
wa_alv-zaccep_ord_cat = '2'.
ELSEIF wa_ekko-bsart = 'Z002'AND wa_alv-knttp = 'K'.
wa_alv-zaccep_ord_cat = '3'.
ENDIF.
CLEAR wa_ekko.
ENDIF.
READ TABLE it_mard INTO wa_mard WITH KEY matnr = wa_mseg-matnr werks = wa_mseg-werks lgort = wa_mseg-lgort BINARY SEARCH.
IF sy-subrc = 0.
wa_alv-lgpbe = wa_mard-lgpbe.
CLEAR wa_mard.
ENDIF.
READ TABLE it_marc INTO wa_marc WITH KEY matnr = wa_mseg-matnr werks = wa_mseg-werks BINARY SEARCH.
IF sy-subrc = 0.
wa_alv-insmk = wa_marc-insmk.
CLEAR wa_marc.
ENDIF.
READ TABLE lt_mara INTO DATA(ls_mara) WITH KEY matnr = wa_mseg-matnr BINARY SEARCH.
IF sy-subrc = 0.
wa_alv-matkl = ls_mara-matkl.
wa_alv-vfdat = wa_mseg-hsdat + ls_mara-mhdhb - 1. "到期日 BY E000548 20240621
IF ls_mara-matkl = 'M017'.
wa_alv-zaccep_cat = '3'.
wa_alv-zaccep_ord_cat = '4'.
wa_alv-meins = ls_mara-meins.
ENDIF.
ENDIF.
READ TABLE it_usr21 INTO wa_usr21 WITH KEY bname = wa_mseg-usnam_mkpf.
IF sy-subrc = 0.
CLEAR wa_adrp.
READ TABLE it_adrp INTO wa_adrp WITH KEY persnumber = wa_usr21-persnumber.
wa_alv-name_text = wa_adrp-name_text.
ENDIF.
READ TABLE it_mcha INTO wa_mcha WITH KEY matnr = wa_mseg-matnr werks = wa_mseg-werks charg = wa_mseg-charg.
IF sy-subrc = 0.
wa_alv-zchag = wa_mcha-licha.
ENDIF.
READ TABLE lt_ztsd017 INTO DATA(ls_ztsd017) WITH KEY zmatnr = wa_mseg-matnr zmeslotid = wa_alv-zchag.
IF sy-subrc = 0.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input = ls_ztsd017-kostl
IMPORTING
output = ls_ztsd017-kostl
.
wa_alv-kostl = ls_ztsd017-kostl.
* wa_alv-zuse_type = ls_ztsd017-zuse_type. "校验MASK的用途 E001593 20251020
wa_alv-product_id = ls_ztsd017-matnr.
ENDIF.
* IF wa_alv-usnam = 'JCK_RFC' OR wa_alv-usnam = 'WEB_PRD'.
IF wa_alv-usnam = 'OA_INTF' OR wa_alv-usnam = 'E000219'.
READ TABLE it_ztmm009 INTO wa_ztmm009 WITH KEY mblnr = wa_mseg-mblnr mjahr = wa_mseg-mjahr.
IF sy-subrc = 0.
wa_alv-usnam = wa_ztmm009-name_text.
wa_alv-name_text = wa_ztmm009-usnam.
wa_alv-ysd_type = wa_ztmm009-ysd_type.
CLEAR wa_ztmm009.
ENDIF.
ENDIF.
READ TABLE lt_ztmm016 INTO DATA(ls_ztmm016) WITH KEY mjahr = wa_mseg-mjahr mblnr = wa_mseg-mblnr BINARY SEARCH .
IF sy-subrc = 0.
wa_alv-bktxt = ls_ztmm016-bktxt."进出口编号
wa_alv-zmf = ls_ztmm016-zmf. "免表号 BY E000548 20240815
wa_alv-zdeno = ls_ztmm016-zdeno. "报关单号
ENDIF.
APPEND wa_alv TO t_data.
ENDLOOP.
IF t_data[] IS NOT INITIAL.
CLEAR t_message.
t_message-zis_ok = 'S'.
t_message-msg = TEXT-037."'有待检验数据'.
LOOP AT t_data.
CLEAR ls_ztmm013.
MOVE-CORRESPONDING t_data TO ls_ztmm013.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = ls_ztmm013-meins
language = sy-langu
IMPORTING
* LONG_TEXT =
output = ls_ztmm013-meins
* SHORT_TEXT =
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
ls_ztmm013-zis_ok = t_message-zis_ok.
ls_ztmm013-msg = t_message-msg.
ls_ztmm013-datum = sy-datum.
ls_ztmm013-times = sy-uzeit.
INSERT ztmm013 FROM ls_ztmm013.
ENDLOOP.
ELSE.
CLEAR t_message.
t_message-zis_ok = 'E'.
t_message-msg = TEXT-038."'无待检验数据'.
ENDIF.
APPEND t_message.
ENDFUNCTION.把用哈希表取zuse_type的逻辑放进去