ABAP_发料控制批次增强MBCF0002_EXIT_SAPMM07M_001

LV01FFD0 
ENHANCEMENT 1 ZDIALOG_PREPARE_100_06. "active version
“” USE xresult TABLE "
""add 2012.08.13 for 如果没有按FIFO,客户审核问题改善,
TABLES: ZRESULT .

IF yresult[] IS NOT INITIAL.
EXPORT yresult TO MEMORY ID ‘FIFO1’.
""for 内存MO有在发料时自动修改批次时用,有+ -
loop at yresult where ERFMG <> 0.
endloop.
if sy-subrc <> 0.
MESSAGE E398(00) WITH ‘请填写需求数量!’ .
endif.

 LOOP AT yresult WHERE matnr+9(4) >= '1203' AND matnr+9(4) <= '1206'.
   delete from ZRESULT where matnr = yresult-matnr and charg = yresult-charg
                         and werks = yresult-werks and lgort = yresult-lgort .
   move-corresponding yresult to ZRESULT.
   modify ZRESULT .
 ENDLOOP .

ENDIF.

ENDENHANCEMENT.

**********************************************SRART fifo2012.08.13 added by abap
TABLES: zresult,zbwart,zwerks,zreason .
**DATA: ITAB LIKE TABLE OF zresult with header line .
*---- Interne Ergebnistabelle
DATA: BEGIN OF xresult OCCURS 0.
INCLUDE STRUCTURE bdbatch.
DATA: vrfmg_ame LIKE bdbatch-vrfmg,
ext_quan TYPE extmg,
xsele TYPE c,
xread TYPE c,
xkeep TYPE c,
xcorr TYPE c,
xdele TYPE c,
org_tabix LIKE sy-tabix,
sort_tabix LIKE sy-tabix,
cuobj LIKE inob-cuobj.
DATA: END OF xresult.

  • ---- Interne Ergebnistabelle zwisabapeichern
    DATA: BEGIN OF yresult OCCURS 0.
    INCLUDE STRUCTURE xresult.
    DATA: END OF yresult.

    IMPORT yresult FROM MEMORY ID ‘FIFO1’.

  • DELETE FROM MEMORY ID 'FIFO1'.
    

    IF i_mkpf-vgart = ‘WA’ AND i_mseg-bwart = ‘261’.
    SELECT * APPENDING CORRESPONDING FIELDS OF TABLE yresult
    FROM zresult ."where aufnr = i_mseg-aufnr.
    ENDIF.

    IF i_mseg-erfmg <> 0.
    SELECT SINGLE * INTO zbwart FROM zbwart
    WHERE bwart = i_mseg-bwart AND sobkz = i_mseg-sobkz .
    IF sy-subrc = 0.
    SELECT SINGLE * INTO zwerks FROM zwerks
    WHERE werks = i_mseg-werks AND lgort = i_mseg-lgort .
    IF sy-subrc = 0.
    LOOP AT yresult WHERE matnr = i_mseg-matnr AND charg = i_mseg-charg
    AND werks = i_mseg-werks AND lgort = i_mseg-lgort
    AND ( ( menge = 0 AND xsele = ‘’) OR ( menge < i_mseg-menge AND xsele = ‘X’ ) ).
    SELECT SINGLE * INTO zreason FROM zreason
    WHERE code = i_mseg-sgtxt.
    IF sy-subrc <> 0. "i_mseg-sgtxt is initial .
    MESSAGE e398(00) WITH ‘该行未按照FIFO发料,请填写<原因代码>到行项目文本!’.
    ENDIF.
    ENDLOOP.
    ENDIF.
    ENDIF.
    ENDIF.
    ***********************************************************************END

ZXMBCU02
&---------------------------------------------------------------------
*& 包含 ZXMBCU02
&---------------------------------------------------------------------

e_sgtxt = i_mseg-sgtxt.

*>>>>>>>>>>>>>>>>-----begin

  • created by Nicky on 20191012 CR:DEVK936508
  • 月结过帐控制
    DATA: wa_ztfi0051 TYPE ztfi0051.
    DATA: l_zmonth TYPE ztfi0051-zmonth.
    l_zmonth = i_mkpf-budat+0(6).
    SELECT SINGLE *
    FROM ztfi0051
    INTO CORRESPONDING FIELDS OF wa_ztfi0051
    WHERE zcontype EQ ‘A’
    AND werks IN ( ‘’,i_mseg-werks )
    AND zmonth EQ l_zmonth.
    IF sy-subrc = 0.
    *************过帐日期所在月份已经设置物料过帐控制
    SELECT SINGLE *
    FROM ztfi0051
    INTO CORRESPONDING FIELDS OF wa_ztfi0051
    WHERE zcontype EQ ‘A’"物料过帐
    AND zmonth EQ l_zmonth
    AND werks EQ ‘’
    AND bname EQ sy-uname.
    IF sy-subrc = 0.
    "有所有工厂的权限
    ELSE.
    "没有所有工厂的权限
    SELECT SINGLE *
    FROM ztfi0051
    INTO CORRESPONDING FIELDS OF wa_ztfi0051
    WHERE zcontype EQ ‘A’"物料过帐
    AND zmonth EQ l_zmonth
    AND werks EQ i_mseg-werks
    AND bname EQ sy-uname.
    IF sy-subrc = 0.
    "有当前工厂的权限
    ELSE.
    *******************用户帐号未在允许范围中
    "&1年&2月已经被财务设置成不允许过帐!
    MESSAGE e020(zfi) WITH l_zmonth+0(4) l_zmonth+4(2).
    ENDIF.
    ENDIF.
    ELSE.
    ENDIF.
    *<<<<<<<<<<<<<<<<-----end

*& ADD AT 2017-07-25
DATA : zv_qtygr LIKE afpo-wemng,
zv_qtyor LIKE afpo-psmng,
zv_matrq LIKE mseg-menge.

DATA: zv_rsnum LIKE afko-rsnum.

DATA : BEGIN OF zi_resb OCCURS 0,
alpgr LIKE resb-alpgr,
matnr LIKE resb-matnr,
werks LIKE resb-werks,
lgort LIKE resb-lgort, "added at 2012-07-19
charg LIKE resb-charg, "added at 2012-07-19
rgekz LIKE resb-rgekz, "added at 2012-07-19
enmng LIKE resb-enmng,
bdmng LIKE resb-bdmng,
END OF zi_resb,
BEGIN OF resb_stru,
matnr LIKE resb-matnr,
werks LIKE resb-werks,
charg LIKE resb-charg,
enmng LIKE resb-enmng,
bdmng LIKE resb-bdmng,
gpreis LIKE resb-gpreis,
peinh LIKE resb-peinh,
END OF resb_stru.

DATA: BEGIN OF i_resb OCCURS 0,
alpgr LIKE resb-alpgr,
matnr LIKE resb-matnr,
werks LIKE resb-werks,
lgort LIKE resb-lgort, "added at 2012-07-20
charg LIKE resb-charg, "added at 2012-07-20
rgekz LIKE resb-rgekz, "added at 2012-07-20
enmng LIKE resb-enmng,
bdmng LIKE resb-bdmng,
END OF i_resb.

  • 订单确认 added at 2012-07-20
    DATA:
    BEGIN OF it_afru OCCURS 0,
    vornr LIKE afru-vornr, "工序
    smeng LIKE afru-smeng, "工序数量
    lmnga LIKE afru-lmnga, "已报工数量
    stokz LIKE afru-stokz, "标识:凭证已被冲销
    stzhl LIKE afru-stzhl, "被取消确认的确认计数器
    END OF it_afru,

    BEGIN OF it_afvc OCCURS 0,
    aufpl LIKE afvc-aufpl, "订单中工序的工艺路线号
    vornr LIKE afvc-vornr, "工序
    aplzl LIKE afvc-aplzl, "订单的通用计数器
    objnr LIKE jest-objnr, "对象号
    arbid LIKE afvc-arbid, "资源的对象 ID Change For DEVK933250 20180702
    END OF it_afvc.

DATA: v_alpgr LIKE resb-alpgr,
v_auart LIKE aufk-auart, "订单类型
v_qty LIKE resb-bdmng, "统计返工领用成品数量
v_qty1 LIKE resb-bdmng,
v_mat(4), "成品前面4位
v_com(4),
v_matnr LIKE afpo-matnr, "订单的物料编号
v_lmnga LIKE afru-lmnga,
v_vornr LIKE afru-vornr, "工序
v_qtyed LIKE resb-bdmng, "已入库数量
v_aufpl LIKE afvc-aufpl,
v_bdmng LIKE resb-bdmng, "需求量
v_enmng LIKE resb-enmng. "提货数

DATA: tbx LIKE sy-tabix,
c_aufpl(10),
c_aplzl(8),
c_dwerk(4),
s_line LIKE bsvx-sttxt.
DATA:gwatnr1 LIKE mseg-matnr.
DATA: lt_resb TYPE TABLE OF resb,
wa_resb TYPE resb.
DATA: lv_resvqty LIKE resb-bdmng,
lv_clabs LIKE mchb-clabs,
lv_cls TYPE string,
lv_res TYPE string,
lv_msg TYPE string.
DATA:lv_auart TYPE aufk-auart.
DATA:lv_zzrwl TYPE aufk-zzrwl.
DATA:zmatnr TYPE matnr.
DATA:lv_matnr TYPE matnr.
DATA:zspart TYPE spart.
DATA:zrma(3).

DATA:lv_rsnum TYPE afko-rsnum.
DATA:lv_gamng TYPE afko-gamng.
DATA:lv_wemng TYPE afpo-wemng.
DATA:lv_total TYPE menge_d.
DATA:lv_canqty TYPE menge_d.

DATA:BEGIN OF lt_resbx OCCURS 0,
rsnum TYPE resb-rsnum,
rspos TYPE resb-rspos,
matnr TYPE resb-matnr,
werks TYPE resb-werks,
enmng TYPE resb-enmng,
bdmng TYPE resb-bdmng,
meins TYPE resb-meins,
END OF lt_resbx.

DATA:BEGIN OF lt_total OCCURS 0,
matnr TYPE resb-matnr,
werks TYPE resb-werks,
enmng TYPE resb-enmng,
bdmng TYPE resb-bdmng,
mkqty TYPE menge_d,
END OF lt_total.
************************* 2019年1月29日正式使用,结合财务关账协助上线,上线后取消***************
DATA: lv_start_date TYPE sy-datum VALUE ‘20190125’. "20190129
DATA: lv_end_date TYPE sy-datum VALUE ‘20190131’.
DATA: lv_ok_date TYPE sy-datum VALUE ‘20190201’.
************************* 2019年1月29日正式使用,结合财务关账协助上线,上线后取消***************
IF i_mkpf-vgart = ‘WF’ AND i_mseg-bwart = ‘101’.
SELECT SINGLE auart INTO lv_auart FROM aufk WHERE aufnr = i_mseg-aufnr.

  • SELECT SINGLE matnr INTO lv_matnr FROM mseg WHERE aufnr = i_mseg-aufnr.

  • if lv_auart = ‘ZM04’ or lv_auart = ‘ZM05’ or lv_auart = ‘ZM09’ or lv_auart = ‘ZM10’ or lv_auart = ‘ZM11’.
    IF ( lv_auart+0(2) = ‘ZM’ OR lv_auart+0(2) = ‘ZZ’ ) AND lv_auart <> ‘ZZCO’ .

  • IF ( lv_matnr+0(4) <> ‘5005’ OR lv_matnr+0(4) <> ‘5106’).
    SELECT SINGLE afko~rsnum afko~gamng afpo~wemng INTO (lv_rsnum,lv_gamng,lv_wemng) FROM afko INNER JOIN afpo ON afko~aufnr = afpo~aufnr WHERE afko~aufnr = i_mseg-aufnr.
    IF sy-subrc = 0.

    lv_total = lv_wemng + i_mseg-menge. "收货加上即将收货

    SELECT resb~rsnum resb~rspos resb~matnr resb~werks resb~enmng resb~bdmng resb~meins
    INTO TABLE lt_resbx
    FROM resb
    INNER JOIN mara
    ON ( resb~matnr = mara~matnr )
    WHERE resb~rsnum = lv_rsnum
    AND resb~xloek = space
    AND resb~rgekz NE ‘X’
    AND resb~dumps NE ‘X’
    AND resb~bdmng > 0
    AND resb~bwart = ‘261’
    AND ( mara~mtart = ‘ZERT’ OR mara~mtart = ‘ZALB’ ).

    SELECT resb~rsnum resb~rspos resb~matnr resb~werks resb~enmng resb~bdmng resb~meins
    APPENDING TABLE lt_resbx
    FROM resb
    INNER JOIN mara
    ON ( resb~matnr = mara~matnr )
    WHERE resb~rsnum = lv_rsnum
    AND resb~xloek = space
    AND resb~rgekz NE ‘X’
    AND resb~dumps NE ‘X’
    AND resb~bdmng > 0
    AND resb~schgt NE ‘X’
    AND resb~xwaok EQ ‘X’
    AND resb~bwart = ‘261’.

  •         AND ( MARA~MATKL = '1203' OR
    
  •               MARA~MATKL = '1204' OR
    
  •               MARA~MATKL = '1205' OR
    
  •               MARA~MATKL = '1206' OR
    
  •               MARA~MATKL = '1212' OR
    
  •               MARA~MATKL = '1214' OR
    
  •               MARA~MATKL = '1215' OR
    
  •               MARA~MATKL = '1222' OR
    
  •               MARA~MATKL = '1225' OR
    
  •               MARA~MATKL = '1227').
    
    SORT lt_resbx BY rsnum rspos.
    DELETE ADJACENT DUPLICATES FROM lt_resbx COMPARING rsnum rspos.
    
    LOOP AT lt_resbx.
      lt_total-matnr = lt_resbx-matnr.
      lt_total-werks = lt_resbx-werks.
      lt_total-bdmng = lt_resbx-bdmng.
      lt_total-enmng = lt_resbx-enmng.
      COLLECT lt_total.
      CLEAR lt_total.
    ENDLOOP.
    
    LOOP AT lt_total ASSIGNING FIELD-SYMBOL(<fs_total>).
      <fs_total>-mkqty = ( <fs_total>-enmng / <fs_total>-bdmng ) * lv_gamng.  "可以收获数量
    ENDLOOP.
    
    SORT lt_total BY mkqty .
    
    READ TABLE lt_total INDEX 1.
    IF sy-subrc = 0.
      IF lv_total >   lt_total-mkqty.  "收货加上即将收货 大于 工单发料折合成成品数量 ,
        lv_canqty = lt_total-mkqty - lv_wemng.
        MESSAGE e352(zpp) WITH i_mseg-aufnr lv_canqty.
        EXIT.
      ENDIF.
    ENDIF.
    
  •  ENDIF.
    
  • ENDIF.

  • IF ( lv_matnr+0(4) = ‘5005’ OR lv_matnr+0(4) = ‘5106’)…

  •  SELECT SINGLE afko~rsnum afko~gamng afpo~wemng INTO (lv_rsnum,lv_gamng,lv_wemng) FROM afko INNER JOIN afpo ON afko~aufnr = afpo~aufnr WHERE afko~aufnr = i_mseg-aufnr.
    
  •  IF sy-subrc = 0.
    
  •    lv_total  = lv_wemng + i_mseg-menge.  "收货加上即将收货
    
  •    SELECT resb~rsnum resb~rspos resb~matnr resb~werks resb~enmng resb~bdmng resb~meins
    
  •          INTO TABLE lt_resbx
    
  •          FROM resb
    
  •          INNER JOIN mara
    
  •          ON ( resb~matnr = mara~matnr )
    
  •          WHERE resb~rsnum = lv_rsnum
    
  •            AND resb~xloek = space
    
  •            AND resb~rgekz NE 'X'
    
  •            AND resb~dumps NE 'X'
    
  •            AND resb~bdmng > 0
    
  •            AND resb~bwart = '261'
    
  •            AND ( mara~mtart = 'ZERT' OR mara~mtart = 'ZALB' ).
    
  •    SELECT resb~rsnum resb~rspos resb~matnr resb~werks resb~enmng resb~bdmng resb~meins
    
  •         APPENDING TABLE lt_resbx
    
  •         FROM resb
    
  •         INNER JOIN mara
    
  •         ON ( resb~matnr = mara~matnr )
    
  •         WHERE resb~rsnum = lv_rsnum
    
  •           AND resb~xloek = space
    

** AND RESB~RGEKZ NE ‘X’

  •           AND resb~dumps NE 'X'
    
  •           AND resb~bdmng > 0
    
  •           AND resb~schgt NE 'X'
    
  •           AND resb~xwaok EQ 'X'
    
  •           AND resb~bwart   = '261'.
    

** AND ( MARA~MATKL = ‘1203’ OR
** MARA~MATKL = ‘1204’ OR
** MARA~MATKL = ‘1205’ OR
** MARA~MATKL = ‘1206’ OR
** MARA~MATKL = ‘1212’ OR
** MARA~MATKL = ‘1214’ OR
** MARA~MATKL = ‘1215’ OR
** MARA~MATKL = ‘1222’ OR
** MARA~MATKL = ‘1225’ OR
** MARA~MATKL = ‘1227’).
*

  •    SORT lt_resbx BY rsnum rspos.
    
  •    DELETE ADJACENT DUPLICATES FROM lt_resbx COMPARING rsnum rspos.
    
  •    LOOP AT lt_resbx.
    
  •      lt_total-matnr = lt_resbx-matnr.
    
  •      lt_total-werks = lt_resbx-werks.
    
  •      lt_total-bdmng = lt_resbx-bdmng.
    
  •      lt_total-enmng = lt_resbx-enmng.
    
  •      COLLECT lt_total.
    
  •      CLEAR lt_total.
    
  •    ENDLOOP.
    
  •    LOOP AT lt_total ASSIGNING FIELD-SYMBOL(<fs_total1>).
    
  •      <fs_total1>-mkqty = ( <fs_total1>-enmng / <fs_total1>-bdmng ) * lv_gamng.  "可以收获数量
    
  •    ENDLOOP.
    
  •    SORT lt_total BY mkqty .
    
  •    READ TABLE lt_total INDEX 1.
    
  •    IF sy-subrc = 0.
    
  •      IF lv_total >   lt_total-mkqty.  "收货加上即将收货 大于 工单发料折合成成品数量 ,
    
  •        lv_canqty = lt_total-mkqty - lv_wemng.
    
  •        MESSAGE e352(zpp) WITH i_mseg-aufnr lv_canqty.
    
  •        EXIT.
    
  •      ENDIF.
    
  •    ENDIF.
    
  • ENDIF.
    ENDIF.
    ENDIF.

*& ADD 生产入库的逻辑

  • 生产订单收货
    DATA:lv_aufnr TYPE mseg-aufnr.
    IF i_mseg-aufnr IS NOT INITIAL.
    lv_aufnr = i_mseg-aufnr.
    ELSE.
    lv_aufnr = i_mkpf-frbnr.
    ENDIF.

IF ( i_mkpf-vgart = ‘WF’ AND i_mseg-bwart = ‘101’ )

  • OR ( i_mkpf-vgart = ‘WA’ AND i_mseg-bwart = ‘Z31’ ).
    OR ( i_mkpf-vgart = ‘WA’ AND i_mseg-bwart = ‘Y01’ ).

  • SELECT SINGLE auart zzrwl INTO (lv_auart,lv_zzrwl ) FROM aufk WHERE aufnr = i_mseg-aufnr. "abap 20210903
    SELECT SINGLE auart zzrwl INTO (lv_auart,lv_zzrwl ) FROM aufk WHERE aufnr = lv_aufnr.
    IF lv_auart+0(4) = ‘ZM10’ OR lv_auart+0(4) = ‘ZM11’ OR lv_auart+0(4) = ‘ZM05’.
    CLEAR: zmatnr,zspart,zrma.

  • SELECT SINGLE matnr INTO zmatnr FROM afpo WHERE aufnr = i_mseg-aufnr.
    SELECT SINGLE matnr INTO zmatnr FROM afpo WHERE aufnr = lv_aufnr. "abap 20210903
    IF sy-subrc = 0.
    SELECT SINGLE spart INTO zspart FROM mara WHERE matnr = zmatnr.
    IF zspart = ‘10’ OR zspart = ‘11’ OR zspart = ‘12’ OR zspart = ‘20’."内存和CSSD
    IF zmatnr+0(4) NE ‘9901’ AND zmatnr+0(4) NE ‘7002’."华为代工内存,MES报工
    zrma = ‘RMA’. "为真正的RMA的工单需要砟自动报工处.其它也有华为ESSD的RMA工单,但是在车间MES完成的,不需要自动报工
    ENDIF.
    ELSEIF zspart = ‘21’."ESSD 非华为的工单要自动报工
    IF lv_zzrwl IS INITIAL.
    zrma = ‘RMA’.
    ENDIF.
    ENDIF.
    ENDIF.
    ENDIF.

IF lv_auart+0(2) NE ‘ZF’ AND zrma NE ‘RMA’. "只对封装生产和RMA自己维修的工单
EXIT.
ENDIF.

CLEAR:zv_rsnum, v_aufpl.

  • SELECT SINGLE rsnum aufpl FROM afko INTO (zv_rsnum, v_aufpl) WHERE aufnr = i_mseg-aufnr.
    SELECT SINGLE rsnum aufpl FROM afko INTO (zv_rsnum, v_aufpl) WHERE aufnr = lv_aufnr. "abap 20210903

  •     工艺路线
    

    REFRESH it_afvc.
    SELECT * FROM afvc
    INTO CORRESPONDING FIELDS OF TABLE it_afvc
    WHERE aufpl EQ v_aufpl AND loekz <> ‘X’.

    LOOP AT it_afvc.
    tbx = sy-tabix.
    CLEAR: c_aufpl,c_aplzl,s_line.
    c_aufpl = it_afvc-aufpl.
    c_aplzl = it_afvc-aplzl.
    CONCATENATE ‘OV’ c_aufpl c_aplzl INTO it_afvc-objnr.
    CALL FUNCTION ‘STATUS_TEXT_EDIT’
    EXPORTING

  •   CLIENT           = SY-MANDT
    
  •   FLG_USER_STAT    = ' '
      objnr            = it_afvc-objnr
      only_active      = 'X'
      spras            = sy-langu
    IMPORTING
      line             = s_line
    EXCEPTIONS
      object_not_found = 1
      OTHERS           = 2.
    

    IF sy-subrc <> 0.
    ENDIF.
    IF s_line CS ‘DLT’ OR s_line CS ‘删除’. "不管什么情况下的工序删除都要去掉
    DELETE it_afvc INDEX tbx.
    ENDIF.

    ENDLOOP.

    SORT it_afvc BY vornr DESCENDING.

    v_vornr = ‘0001’.
    LOOP AT it_afvc.
    IF v_vornr LT it_afvc-vornr.
    v_vornr = it_afvc-vornr.
    ENDIF.
    ENDLOOP.

  • 找工单类型
    CLEAR v_auart.

  • SELECT SINGLE auart FROM aufk INTO v_auart WHERE aufnr = i_mseg-aufnr.
    SELECT SINGLE auart FROM aufk INTO v_auart WHERE aufnr = lv_aufnr. "abap 20210903

  •     找工单最后一道工序确认数
    

    REFRESH it_afru.
    SELECT * FROM afru
    INTO CORRESPONDING FIELDS OF TABLE it_afru

  • WHERE aufnr = i_mseg-aufnr AND stokz = ‘’ AND stzhl = ‘’.
    WHERE aufnr = lv_aufnr AND stokz = ‘’ AND stzhl = ‘’. "abap 20210903

SORT it_afru BY vornr DESCENDING.
CLEAR:v_matnr,zv_qtyor,zv_qtygr,c_dwerk.
SELECT SINGLE matnr psmng wemng dwerk
FROM afpo
INTO (v_matnr,zv_qtyor,zv_qtygr,c_dwerk)

  • WHERE aufnr = i_mseg-aufnr.
    WHERE aufnr = lv_aufnr. "abap 20210903

CLEAR:v_mat,v_qtyed.
v_mat = v_matnr+0(4).
v_qtyed = zv_qtygr.
zv_qtygr = zv_qtygr + i_mseg-menge.
REFRESH zi_resb.

SELECT * FROM resb INTO CORRESPONDING FIELDS OF TABLE zi_resb WHERE rsnum = zv_rsnum AND rgekz = ’ ’ AND schgt NE ‘X’
AND dumps NE ‘X’ AND xloek NE ‘X’.

SORT zi_resb BY alpgr matnr werks.
CLEAR v_qty.

LOOP AT zi_resb.
v_com = zi_resb-matnr+0(4).

  •      if v_mat = v_com.
    

    v_qty = v_qty + zi_resb-enmng.

  •      endif.
    

    IF zi_resb-alpgr EQ space.
    AT NEW matnr.
    CLEAR i_resb.
    CLEAR: v_bdmng,v_enmng.
    ENDAT.
    v_bdmng = v_bdmng + zi_resb-bdmng.
    v_enmng = v_enmng + zi_resb-enmng.
    MOVE-CORRESPONDING zi_resb TO i_resb.
    AT END OF matnr.
    i_resb-bdmng = v_bdmng.
    i_resb-enmng = v_enmng.
    APPEND i_resb.
    ENDAT.

  •        MOVE-CORRESPONDING zi_resb TO i_resb.
    
  •        APPEND i_resb.
    

    ELSE.
    AT NEW alpgr.
    CLEAR i_resb.
    CLEAR: v_bdmng,v_enmng.
    ENDAT.
    v_bdmng = v_bdmng + zi_resb-bdmng.
    v_enmng = v_enmng + zi_resb-enmng.
    MOVE-CORRESPONDING zi_resb TO i_resb.
    AT END OF alpgr.
    i_resb-bdmng = v_bdmng.
    i_resb-enmng = v_enmng.
    APPEND i_resb.
    ENDAT.
    ENDIF.
    ENDLOOP.

    LOOP AT i_resb.
    zv_matrq = i_resb-bdmng * zv_qtygr / zv_qtyor.
    IF i_resb-enmng < zv_matrq.

  •  MESSAGE e023(zpp) WITH i_mseg-aufnr i_resb-matnr.
    MESSAGE e023(zpp) WITH lv_aufnr i_resb-matnr.                     "abap   20210903
    EXIT.
    

    ENDIF.
    ENDLOOP.

  • IF v_auart = 'ZP02' OR v_auart = 'ZP08'.
    

    IF v_auart = ‘ZF04’ OR v_auart = ‘ZF09’.
    IF v_qty < zv_qtygr.
    v_qty1 = v_qty - v_qtyed.

  •  MESSAGE e102(zpp) WITH i_mseg-aufnr v_qty1.
    MESSAGE e102(zpp) WITH lv_aufnr v_qty1.                            "abap   20210903
    EXIT.
    

    ENDIF.
    ENDIF.

*20120829 abap 增加除板卡外工厂工单入库自动按照入库数量进行报工操作,此处只报数量不报工时。
DATA: gt_tickets TYPE STANDARD TABLE OF bapi_pp_timeticket WITH HEADER LINE.
DATA: zsum LIKE resb-bdmng." TYPE i.
DATA: BEGIN OF gt_resb OCCURS 0,
aufnr LIKE afpo-aufnr, "MO
gamng LIKE afko-gamng,
zgamng LIKE afko-gamng,
matnr LIKE resb-matnr, "物料号
werks LIKE resb-werks,
bdmng LIKE resb-bdmng, "TYPE i, "需求量
enmng LIKE resb-enmng , "工单该料已经提货数 "added by abap 20121030
zbdmng LIKE resb-bdmng, "TYPE i, "当前报工入库扣料按BOM理论需求量
lgort LIKE resb-lgort, "库存地点
rgekz LIKE resb-rgekz,
schgt LIKE resb-schgt,
dumps LIKE resb-dumps,
flag TYPE c, "added by abap 20130304
END OF gt_resb.

DATA: BEGIN OF gt_mard OCCURS 0,
matnr LIKE mard-matnr,
werks LIKE mard-werks,
lgort LIKE mard-lgort,
" charg like mchb-charg,
labst LIKE mard-labst,
END OF gt_mard.

  •      data: gt_mchb1 like gt_mchb occurs 0 with header line.
    
    DATA: gt_return TYPE STANDARD TABLE OF bapi_coru_return WITH HEADER LINE.
    "data: gt_return like bapi_coru_return occurs 0 with header line.
    DATA: gt_return1 TYPE STANDARD TABLE OF bapiret1 WITH HEADER LINE .
    ******************************Change 20180523 start for Abap DEVK932948 \ DEVK932990
  • 需要查找对应工单用到的工艺路线组号和计数器号,再找对应工序代码的8101的标准工时
    DATA: lt_plnnr TYPE afko-plnnr,
    lt_plnal TYPE afko-plnal,
    lt_vgw01 TYPE plpo-vgw01,
    lt_vgw02 TYPE plpo-vgw02,
    lt_conf_activity1 LIKE bapi_pp_timeticket-conf_activity1,
    lt_conf_activity2 LIKE bapi_pp_timeticket-conf_activity2,
    lt_vge01 LIKE plpo-vge01,
    lt_vge02 LIKE plpo-vge02,
    lt_bmsch LIKE plpo-bmsch.
    DATA: ls_int TYPE i.
    DATA:BEGIN OF gs_info_plpo,
    arbid TYPE plpo-arbid, "Change add For DEVK933250 20180702
    vornr TYPE plpo-vornr,
    vgw01 TYPE plpo-vgw01,
    vge01 TYPE plpo-vge01,
    vgw02 TYPE plpo-vgw02,
    vge02 TYPE plpo-vge02,
    bmsch TYPE plpo-bmsch,
    END OF gs_info_plpo.
    DATA: gt_info_plpo LIKE STANDARD TABLE OF gs_info_plpo.

CLEAR: lt_plnnr,lt_plnal.

  • SELECT SINGLE plnnr plnal FROM afko INTO ( lt_plnnr,lt_plnal )

  •                                 WHERE aufnr EQ i_mseg-aufnr.
    

    SELECT SINGLE plnnr plnal FROM afko INTO ( lt_plnnr,lt_plnal )
    WHERE aufnr EQ lV_aufnr.

    IF sy-subrc = 0.
    IF it_afvc IS NOT INITIAL.
    SELECT plpo~arbid plpo~vornr plpo~vgw01 plpo~vge01 plpo~vgw02 plpo~vge02 plpo~bmsch INTO CORRESPONDING FIELDS OF TABLE gt_info_plpo
    FROM plas INNER JOIN plpo ON ( plas~plnnr = plpo~plnnr AND plas~plnkn = plpo~plnkn )
    FOR ALL ENTRIES IN it_afvc
    WHERE plas~plnnr = lt_plnnr
    AND plas~plnal = lt_plnal
    AND plpo~arbid = it_afvc-arbid AND plpo~arbid NE ‘00000000’ "Change For DEVK933250 20180702
    AND plpo~steus NE ‘ZP05’ "Change Add 20180704 DEVK933250

  •                      AND PLPO~VORNR = IT_AFVC-VORNR AND PLPO~ARBID NE '00000000'   "Change For DEVK933250  20180702
                        AND plas~loekz NE 'X'.
    

    ENDIF.
    SORT gt_info_plpo BY arbid vornr. "Change For DEVK933250 20180702 SORT GT_INFO_PLPO BY VORNR
    ENDIF.
    ******************************Change 20180523 end for Abap DEVK932948\DEVK932990

    CLEAR: gt_tickets.
    *******************ADD BY ABAP 2020-05-18
    DATA: l_last TYPE char1.
    SORT it_afvc BY aufpl vornr.
    LOOP AT it_afvc.
    CLEAR: gt_tickets.
    *******************ADD BY ABAP 2020-05-18
    AT END OF aufpl.
    "最后一个工序
    l_last = ‘X’.
    ENDAT.

    MOVE it_afvc-vornr TO gt_tickets-operation.
    *******************ADD BY ABAP 2020-05-18

  • gt_tickets-orderid = i_mseg-aufnr.
    gt_tickets-orderid = lv_aufnr. "abap 20210903
    IF l_last = ‘X’.
    "最后一个工序

  •  IF i_mseg-bwart = 'Z31'.
    IF i_mseg-bwart = 'Y01'.
      "报废
      gt_tickets-scrap = i_mseg-menge."报废数量
      gt_tickets-yield = 0.
    ELSE.
      "正常产出
      gt_tickets-yield = i_mseg-menge.
      gt_tickets-scrap = 0."报废数量
    ENDIF.
    

    ELSE.
    "非最后一个工序
    "正常产出
    gt_tickets-yield = i_mseg-menge.
    gt_tickets-scrap = 0."报废数量
    ENDIF.
    gt_tickets-fin_conf = ‘1’.
    ************************* 2019年1月29日正式使用,结合财务关账协助上线,上线后取消***************
    IF sy-datum >= lv_start_date AND sy-datum <= lv_end_date. "当前日期为:1月29日~31日时,Item过账日期设置为2月1日。
    gt_tickets-postg_date = lv_ok_date.
    ENDIF.
    ************************* 2019年1月29日正式使用,结合财务关账协助上线,上线后取消***************

******************************CHANGE 20180523 START FOR ABAP DEVK932948\DEVK932990
*需要查找对应工单用到的工艺路线组号和计数器号,再找对应工序代码的8101的标准工时

  • IF SY-SUBRC = 0. 直接读取****************

  • IF LT_PLNNR IS NOT INITIAL AND LT_PLNAL IS NOT INITIAL.

  •  CLEAR: LT_VGW01,LT_VGW02.
    
  •  SELECT SINGLE PLPO~VGW01 PLPO~VGW02 PLPO~VGE01 PLPO~VGE02 INTO ( LT_VGW01,LT_VGW02,LT_VGE01,LT_VGE02 )
    
  •                    FROM PLAS INNER JOIN PLPO ON ( PLAS~PLNNR = PLPO~PLNNR AND PLAS~PLNKN = PLPO~PLNKN )  " AND PLAS~PLNKN = PLPO~PLNKN
    
  •                 WHERE PLAS~PLNNR = LT_PLNNR
    
  •                  AND PLAS~PLNAL = LT_PLNAL
    
  •                  AND PLPO~VORNR = IT_AFVC-VORNR
    
  •                  AND PLAS~LOEKZ NE 'X'.
    
  •  CLEAR: LT_PLNNR,LT_PLNAL.
    
  •  IF SY-SUBRC = 0.
    
  •    LT_CONF_ACTIVITY1  = I_MSEG-MENGE * LT_VGW01.
    
  •    LT_CONF_ACTIVITY2  = I_MSEG-MENGE * LT_VGW02.
    
  •    CLEAR: LT_VGW01,LT_VGW02,LT_VGE01,LT_VGE02.
    
  •  ENDIF.
    
  • ENDIF.

  • IF LT_CONF_ACTIVITY1 > 0.

  •  GT_TICKETS-CONF_ACTIVITY1 =  LT_CONF_ACTIVITY1.
    
  •  GT_TICKETS-CONF_ACTI_UNIT1 =  LT_VGE01.
    
  • ENDIF.

  • IF LT_CONF_ACTIVITY2 > 0.

  •  GT_TICKETS-CONF_ACTIVITY2 =  LT_CONF_ACTIVITY2.
    
  •  GT_TICKETS-CONF_ACTI_UNIT2 =  LT_VGE02.
    
  • ENDIF.
    **********直接读取方式

  • READ TABLE 方式

  • READ TABLE GT_INFO_PLPO INTO GS_INFO_PLPO WITH KEY VORNR = IT_AFVC-VORNR BINARY SEARCH. "Change For DEVK933250 20180702
    READ TABLE gt_info_plpo INTO gs_info_plpo WITH KEY arbid = it_afvc-arbid BINARY SEARCH.
    IF sy-subrc = 0 AND gs_info_plpo IS NOT INITIAL.
    lt_vgw01 = gs_info_plpo-vgw01.
    lt_vgw02 = gs_info_plpo-vgw02.
    lt_bmsch = gs_info_plpo-bmsch.
    lt_conf_activity1 = ( lt_vgw01 / lt_bmsch ) * i_mseg-menge. “I_MSEG-MENGE * LT_VGW01.
    lt_conf_activity2 = ( lt_vgw02 / lt_bmsch ) * i_mseg-menge.” I_MSEG-MENGE * LT_VGW02.
    lt_vge01 = gs_info_plpo-vge01.
    lt_vge02 = gs_info_plpo-vge02.
    IF lt_conf_activity1 >= 0.

  •    如果以S为单位,需要进行四舍五入,大于0.5的为1的整数倍,小于0.5的为0.大于1S的为1的整数倍
      IF lt_vge01 = 'S'.
        ls_int = lt_conf_activity1.
        gt_tickets-conf_activity1 =  ls_int.
        gt_tickets-conf_acti_unit1 =  lt_vge01.
      ELSE.
        gt_tickets-conf_activity1 =  lt_conf_activity1.
        gt_tickets-conf_acti_unit1 =  lt_vge01.
      ENDIF.
    ENDIF.
    CLEAR: ls_int.
    IF  lt_conf_activity2 >= 0.
      IF lt_vge02 = 'S'.
        ls_int = lt_conf_activity2.
        gt_tickets-conf_activity2 =  ls_int.
        gt_tickets-conf_acti_unit2 =  lt_vge02.
      ELSE.
        gt_tickets-conf_activity2 =  lt_conf_activity2.
        gt_tickets-conf_acti_unit2 =  lt_vge02.
      ENDIF.
    ENDIF.
    CLEAR: lt_vgw01,lt_vgw02,lt_vge01,lt_vge02,ls_int. ",GT_TICKETS
    

    ENDIF.

******************************Change 20180523 end for Abap DEVK932948 / DEVK932990
APPEND gt_tickets.
CLEAR: lt_conf_activity1,lt_conf_activity2. "*Change 20180523 end for Abap DEVK932948 /DEVK932990
ENDLOOP.
CLEAR: gt_tickets.
SORT gt_tickets BY operation.

SELECT * FROM resb INTO CORRESPONDING FIELDS OF TABLE gt_resb

  • WHERE aufnr = i_mseg-aufnr AND rgekz = ‘X’ AND schgt <> ‘X’ AND dumps <> ‘X’
    WHERE aufnr = lv_aufnr AND rgekz = ‘X’ AND schgt <> ‘X’ AND dumps <> ‘X’ "abap 20210903
    AND xloek NE ‘X’. "flushback material

DATA: g_gamng LIKE afko-gamng.
LOOP AT gt_resb.
SELECT SINGLE gamng
FROM afko INTO g_gamng

  •  WHERE aufnr = i_mseg-aufnr.
    WHERE aufnr = lv_aufnr.                                                          "abap 20210903
    

    gt_resb-gamng = g_gamng.
    gt_resb-zgamng = i_mseg-menge.
    MODIFY gt_resb.
    ENDLOOP.

    LOOP AT gt_resb.
    gt_resb-zbdmng = ( gt_resb-zgamng * gt_resb-bdmng ) / gt_resb-gamng.
    MODIFY gt_resb.
    ENDLOOP.

    SELECT matnr
    werks
    lgort
    labst
    INTO CORRESPONDING FIELDS OF TABLE gt_mard
    FROM mard FOR ALL ENTRIES IN gt_resb
    WHERE matnr = gt_resb-matnr AND werks = gt_resb-werks AND lgort = gt_resb-lgort.

    LOOP AT gt_resb .
    CLEAR gt_mard." add by likui 20160708
    READ TABLE gt_mard WITH KEY matnr = gt_resb-matnr werks = gt_resb-werks lgort = gt_resb-lgort.
    IF gt_resb-zbdmng > gt_mard-labst . "当前报工入库扣料按BOM理论需求量 > 该料在线仓非限制数量
    CLEAR:zsum.
    zsum = gt_resb-enmng + gt_mard-labst."已提货量+库存量
    IF gt_resb-enmng = gt_resb-bdmng."工单料件提货量=料件需求量
    "说明已扣完,不检查报错,应该不用再扣,
    ELSEIF gt_resb-enmng < gt_resb-bdmng."工单料件提货量 < 料件需求量
    IF zsum < gt_resb-bdmng. "已提货量+库存量 < 需求量
    gt_resb-flag = 1. "modify by abap 20130304
    MODIFY gt_resb .
    ENDIF.
    ELSEIF gt_resb-enmng > gt_resb-bdmng."不会
    ENDIF.
    ENDIF.
    ENDLOOP.

************************ Modify abap 20130304 for 一次性把工单所有欠的料显示出来
DATA: conmatnr(200) TYPE c,
flag TYPE c.
LOOP AT gt_resb WHERE flag = 1.
CONCATENATE gt_resb-matnr ‘|’ conmatnr INTO conmatnr .
flag = 1.
ENDLOOP.
IF flag = 1.

  •        message E106(ZPP) with conmatnr gt_resb-lgort." type 'E'.
    
    CONCATENATE conmatnr ‘在’ gt_resb-lgort ‘库存不足’ INTO conmatnr.
    MESSAGE conmatnr TYPE ‘E’.
    ENDIF.

*&begin of mark by nirui 2016-04-19
IF sy-ucomm = ‘OK_CHECK’.
CALL FUNCTION ‘BAPI_PRODORDCONF_CREATE_TT’
EXPORTING
post_wrong_entries = ‘0’
testrun = ‘X’
TABLES
timetickets = gt_tickets
detail_return = gt_return.

  •        SORT gt_return BY type id number. "不能排序,因会把错误排到下面去,无法正确提醒 ABAP 20130121
    

    DELETE ADJACENT DUPLICATES FROM gt_return.

    ROLLBACK WORK. "ADD 20121030

    LOOP AT gt_return WHERE type = ‘E’.
    MESSAGE e105(zpp) WITH gt_return-message.
    ENDLOOP.
    ENDIF.

    "if ( sy-ucomm = ‘OK_POST1’ or sy-ucomm = ‘OK_POST’) and c_dwerk+0(2) ne ‘26’ . "add 入库点击保存时也能报工 ABAP 20121011
    IF ( sy-ucomm = ‘OK_POST1’ OR sy-ucomm = ‘OK_POST’).
    CALL FUNCTION ‘BAPI_PRODORDCONF_CREATE_TT’
    EXPORTING
    post_wrong_entries = ‘0’

  •          IMPORTING
    
  •   return             = gt_return1
    TABLES
      timetickets        = gt_tickets
      detail_return      = gt_return.
    

    IF sy-subrc <> 0.
    ROLLBACK WORK. "ADD 20121030
    ENDIF.

  •    SORT gt_return BY type id number."不能排序,因会把错误排到下面去,无法正确提醒 ABAP 20130121
    

    DELETE ADJACENT DUPLICATES FROM gt_return.

***** 针对工单错误ID为 CO ,NUM为341的错误,系统挂起3秒钟
**** 并执行循环执行3次。如果不成功,则输出错误消息;
READ TABLE gt_return WITH KEY type = ‘E’
id = ‘CO’
number = ‘341’.

IF sy-subrc = 0.  " 如果有此Error
  WAIT UP TO 3 SECONDS.                             " 挂起3秒
  DO 3 TIMES.                                       "再执行3 次.
    CLEAR gt_return[].
    CALL FUNCTION 'BAPI_PRODORDCONF_CREATE_TT'
      EXPORTING
        post_wrong_entries = '0'
  •       testrun            = 'X'
    
  •         importing
    
  •       return             =
        TABLES
          timetickets        = gt_tickets
          detail_return      = gt_return.
    
      IF sy-subrc <> 0.
        ROLLBACK WORK.
      ENDIF.
      READ TABLE gt_return WITH KEY type = 'E'
                             id = 'CO'
                             number = '341'.
    
      IF sy-subrc <> 0.  "没有CO 341 ERROR,可能是其它错误或者没有错误
        EXIT.
      ELSE. " 如果有此Error
        WAIT UP TO 3 SECONDS.
      ENDIF.
    
    ENDDO.
    

***** 处理错误消息
LOOP AT gt_return WHERE type = ‘E’ .
ROLLBACK WORK. "added by abap 20121121 for 有报工,没有入库成功的问题,或者报工COMMIT提交时有错误,还是提交了的问题
MESSAGE e105(zpp) WITH gt_return-message.

  •          PERFORM write_log USING 'M' gt_return-message.
    ENDLOOP.
    

    ELSE.
    ***** 处理错误消息
    LOOP AT gt_return WHERE type = ‘E’ .
    ROLLBACK WORK. "added by abap 20121121 for 有报工,没有入库成功的问题,或者报工COMMIT提交时有错误,还是提交了的问题
    MESSAGE e105(zpp) WITH gt_return-message.
    ENDLOOP.
    ENDIF.
    CLEAR:gt_tickets[],gt_return[].

    ENDIF.

ENDIF.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值