此博客为原创博客,都是个人工作经历所得,转载请注明出处

20170325 生产订单完工/冲销数量同步SCP系统

一、需求

业务目的
将Sap生产订单完工信息定时推送到SCP。
接口方式
1.    采用RFC;
2.    采用同步传输;
3.    提供RFC 接口供SCP调用;
业务逻辑
    选择屏幕输入字段:
字段    类型    长度    字段名称fieldname    字段内容解释
AUFNR    CHAR    12   生产订单---表
BUDAT    DAYS    8    日期区间             默认为当天

输出的表接口表及其字段:
字段    Key    类型    长度    字段名称fieldname    字段内容解释
AUFNR    Y    CHAR    12    生产订单    
BUDAT    Y    DATS    8    过帐日期    
CPUTM    Y    TIMS    6    输入时间    
MENGE         QUAN    13    本次完工数量    
GWEMG         CHAR    12    完工总数量    
MSGTX         CHAR    100    预留文本    
ZDATUM        DATS    8    创建日期    
ZCPUTM        TIMS    6    创建时间    
USNAM         CHAR    12    用户    
       

处理逻辑:
1. 
Select AUFM -AUFNR,AUFM -MENGE, AUFNR-BUDAT, MKPF- CPUTM,AUFM-BWART , 
FROM AUFM , MKPF
ORDER BY AUFM-BWART , MKPF- CPUTM 
WHERE AUFM-MBLNR = MKPF-MBLNR 
And (WERKS = ‘I060’ OR WERKS = ‘I061’ OR WERKS = ‘I070’ OR WERKS = ‘I071’ OR WERKS = ‘I080’ OR WERKS = ‘I081’)
And ( AUFM- BWART = ‘101’ or AUFM-BWART = ‘102’)
And BUDAT = 选择屏幕输入
And KZBEW = ‘F’

2.移动类型处理,若为101移动类型MENGE为正值,若为102移动类型MENGE为负值
3.计算完工总数量:对相同的生产订单,完工总数量GWEMG= 上条记录的本次完工数量MENGE+当前记录的本次完工数量MENGE,
4.将过账日期和输入时间以两个字段分别存值,
5. 将输出结果存放在自建表 ZMLSCP_LOG002 中,

  

 

二、实现

FUNCTION ZMLSCP1_FR0007.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_BUDAT) TYPE  ZST_BUDAT
*"  EXPORTING
*"     VALUE(O_STATU) TYPE  CHAR1
*"     VALUE(O_MSG) TYPE  CHAR255
*"  TABLES
*"      OT_FINISHED STRUCTURE  ZMLSCP_LOG002
*"----------------------------------------------------------------------
  TYPES:BEGIN OF TY_AUFM,
MBLNR LIKE AUFM-MBLNR,
MJAHR LIKE AUFM-MJAHR,
ZEILE LIKE AUFM-ZEILE,
AUFNR LIKE AUFM-AUFNR,
BUDAT LIKE AUFM-BUDAT,
MENGE LIKE AUFM-MENGE,
BWART LIKE AUFM-BWART,
CPUTM LIKE MKPF-CPUTM,
GWEMG LIKE AUFM-MENGE,
        END OF TY_AUFM.
  DATA:LT_AUFM TYPE TABLE OF TY_AUFM,
       LW_AUFM LIKE LINE OF LT_AUFM.
  DATA:GR_WERKS TYPE RANGE OF WERKS_D,
       GW_WERKS LIKE LINE  OF GR_WERKS.
  DATA:GR_BUDAT TYPE RANGE OF AUFM-BUDAT,
       GW_BUDAT LIKE LINE OF GR_BUDAT.
  RANGES:R_AUFNR FOR AUFM-AUFNR.
  DATA:LT_ZMLCND LIKE TABLE OF ZMLCND WITH HEADER LINE.
  DATA:L_TABIX TYPE SY-TABIX.
  DATA:L_MENGE LIKE AUFM-MENGE.

  CLEAR:GR_BUDAT[],GR_WERKS[],R_AUFNR[].

*&s1.input check
*  IF I_AUFNR IS INITIAL.
*    O_STATU = 'E'.
*    O_MSG   = '生产订单号必输!'.
*    RETURN.
*  ENDIF.
  R_AUFNR(3) = 'IEQ'.
  LOOP AT OT_FINISHED WHERE AUFNR NE SPACE.
    R_AUFNR-LOW = OT_FINISHED-AUFNR.
    APPEND R_AUFNR.
  ENDLOOP.
  IF R_AUFNR[] IS INITIAL.
    O_STATU = 'E'.
    O_MSG   = '生产订单号必输!'.
    RETURN.
  ELSE.
    CLEAR OT_FINISHED[].
  ENDIF.

  IF I_BUDAT IS INITIAL.
    O_STATU = 'E'.
    O_MSG   = '过帐日期必输!'.
    RETURN.
  ENDIF.
  IF I_BUDAT-BUDAT_E IS INITIAL.
    I_BUDAT-BUDAT_E = I_BUDAT-BUDAT_B.
  ENDIF.
  IF  I_BUDAT-BUDAT_B > I_BUDAT-BUDAT_E.
    O_STATU = 'E'.
    O_MSG   = '过账日期的开始日期不能大于结束日期!'.
    RETURN.
  ENDIF.

*&get budat
  GW_BUDAT(3) = 'IBT'.
  GW_BUDAT-LOW = I_BUDAT-BUDAT_B.
  GW_BUDAT-HIGH = I_BUDAT-BUDAT_E.
  APPEND GW_BUDAT TO GR_BUDAT.

*&get werks
  SELECT *
    INTO TABLE LT_ZMLCND
    FROM ZMLCND
   WHERE TYPE_01 = 'A01'.

  GW_WERKS(3) = 'IEQ'.
  LOOP AT LT_ZMLCND.
    GW_WERKS-LOW = LT_ZMLCND-VALUE.
    APPEND GW_WERKS TO GR_WERKS.
  ENDLOOP.

*&s2.get data
  SELECT A~MBLNR
         A~MJAHR
         A~ZEILE
         A~AUFNR
         A~BUDAT
         A~MENGE
         A~BWART
         B~CPUTM
    INTO TABLE LT_AUFM
    FROM AUFM AS A
    JOIN MKPF AS B
      ON A~MBLNR = B~MBLNR
     AND A~MJAHR = B~MJAHR
   WHERE A~AUFNR IN R_AUFNR
     AND A~BUDAT IN GR_BUDAT
     AND A~WERKS IN GR_WERKS
     AND A~BWART IN ('101' , '102')
     AND A~KZBEW = 'F'."移动标识-有关生产单的货物移动
  IF SY-SUBRC NE 0.
    O_STATU = 'E'.
    O_MSG   = '没有找到符合条件的数据!'.
    RETURN.
  ENDIF.
*&需要sort by budat cputm.
  SORT LT_AUFM BY AUFNR BUDAT CPUTM.

*&s3.deal with data
  CLEAR:L_MENGE.
  LOOP AT LT_AUFM INTO LW_AUFM.
    L_TABIX = SY-TABIX.
    IF LW_AUFM-BWART = '102'.
      LW_AUFM-MENGE = LW_AUFM-MENGE * -1.
    ENDIF.
    L_MENGE = L_MENGE + LW_AUFM-MENGE.
    LW_AUFM-GWEMG = L_MENGE.
* SELECT SINGLE CPUTM INTO LW_AUFM-CPUTM
*   FROM MKPF
*  WHERE MBLNR = LW_AUFM-MBLNR
*    AND MJAHR = LW_AUFM-MJAHR.

    OT_FINISHED-AUFNR = LW_AUFM-AUFNR.
    OT_FINISHED-BUDAT = LW_AUFM-BUDAT.
    OT_FINISHED-CPUTM = LW_AUFM-CPUTM.
    OT_FINISHED-MENGE = LW_AUFM-MENGE.
    OT_FINISHED-GWEMG = LW_AUFM-GWEMG.

    OT_FINISHED-ZDATUM = SY-DATUM.
    OT_FINISHED-ZCPUTM = SY-UZEIT.
    OT_FINISHED-USNAM = SY-UNAME.
    APPEND OT_FINISHED.
    CLEAR:OT_FINISHED.

    MODIFY LT_AUFM FROM LW_AUFM INDEX L_TABIX.
    CLEAR:LW_AUFM.
  ENDLOOP.

*&s4.modify into ZLOG
  IF OT_FINISHED[] IS NOT INITIAL.
    MODIFY ZMLSCP_LOG002 FROM TABLE OT_FINISHED.
    IF SY-SUBRC EQ 0.
      COMMIT WORK AND WAIT .
      DESCRIBE TABLE OT_FINISHED LINES L_TABIX.
      O_STATU = 'S'.
      O_MSG   = '成功存入ZMLSCP_LOG002表' && L_TABIX && '条记录!'.
    ELSE.
      ROLLBACK WORK.
      O_STATU = 'E'.
      O_MSG   = '数据存入ZMLSCP_LOG002表失败!'.
    ENDIF.
  ENDIF.



ENDFUNCTION.

 

posted @ 2017-03-25 12:03  Rainystuday  阅读(316)  评论(0)    收藏  举报