SAP/ABAP 发票校验

SAP ABAP 发票校验

需求:

SAP读取函数
输入:

供应商编号:  日期:

输出:

> 采购订单 行项目 料号 物料描述 收货数量 收货金额 发票数量 发票金额 需开票数量 需开票金额

代码实现步骤

需要用到三个表EKBE(采购凭证历史),EKPO(采购凭证项目),EKKO(采购凭证抬头),其中主表为EKBE

创建两个内表,一个负责存储处理数值的内表,一个输出的内表。

    DATA:BEGIN OF LT_EKBE OCCURS 0,”输出表
       LIFNR LIKE EKKO-LIFNR, "供应商编号
       MATNR LIKE EKPO-MATNR, "物料编号
       EBELN LIKE EKBE-EBELN, "采购凭证编号
       EBELP LIKE EKBE-EBELP, "行项目
       BWART LIKE EKBE-BWART,
       TXZ01 LIKE EKPO-TXZ01, "
       BELNR LIKE EKBE-BELNR, "物料凭证编号
       BEWTP LIKE EKBE-BEWTP, "e收货 q发票
       BUDAT LIKE EKBE-BUDAT, "过账日期
       MENGE LIKE EKBE-MENGE, "
       DMBTR LIKE EKBE-DMBTR, ""库存现金
       SHKZG LIKE EKBE-SHKZG, "S借 h贷
       WESBS LIKE EKBE-WESBS, "库存数量
       BPWES LIKE EKBE-DMBTR,
       MWSKZ LIKE EKBE-MWSKZ, "税码
     END   OF LT_EKBE.
    DATA:BEGIN OF LT_RESULT OCCURS 0,”输入计算表
       EBELN    LIKE EKPO-EBELN,
       EBELP    LIKE EKPO-EBELP,
       MATNR    LIKE EKPO-MATNR,
       TXZ01    LIKE EKPO-TXZ01,
       MENGE    LIKE EKBE-MENGE, "收货数量
       DMBTR    LIKE EKBE-DMBTR, "收货金额
       MENGE_FP LIKE EKBE-MENGE, "发票数量
       DMBTR_FP LIKE EKBE-DMBTR, "发票金额
       MENGE_CY LIKE EKBE-MENGE, "需开票数量 = 收货数量-发票数量
       DMBTR_CY LIKE EKBE-DMBTR, "需开票金额 =  收货金额-发票金额
       MWSKZ    LIKE EKBE-MWSKZ, "税码
     END  OF LT_RESULT.

再建立两个表操作的工作区

    DATA:WA_EKBE   LIKE LINE OF LT_EKBE,
         WA_RESULT LIKE LINE OF  LT_RESULT.

取数据到表LT_EKBE中

    SELECT K~LIFNR O~MATNR  E~EBELN  E~EBELP
           E~BELNR E~BEWTP E~BUDAT E~MENGE  E~DMBTR
           E~SHKZG E~MWSKZ O~TXZ01
    INTO CORRESPONDING FIELDS OF TABLE LT_EKBE
    FROM EKKO AS K
    INNER JOIN EKPO AS O
    ON O~EBELN = K~EBELN
    INNER JOIN EKBE AS E
    ON  E~EBELN = O~EBELN
    AND E~EBELP = O~EBELP
    WHERE   K~LIFNR IN S_LIFNR
    AND   E~BUDAT IN  S_BUDAT
    AND   E~BEWTP IN ('E','Q').
    SORT LT_EKBE BY EBELN EBELP BEWTP SHKZG .

处理数据


  LOOP AT LT_EKBE INTO WA_EKBE .
    WA_RESULT-EBELN = WA_EKBE-EBELN.
    WA_RESULT-EBELP = WA_EKBE-EBELP.
    WA_RESULT-MATNR = WA_EKBE-MATNR.
    WA_RESULT-TXZ01 = WA_EKBE-TXZ01.
    WA_RESULT-MWSKZ = WA_EKBE-MWSKZ.
    IF WA_EKBE-SHKZG = 'H'.
      WA_EKBE-MENGE = WA_EKBE-MENGE * -1.
    ENDIF.
    IF WA_EKBE-BEWTP = 'E' .
      WA_RESULT-MENGE = WA_RESULT-MENGE + WA_EKBE-MENGE.
      WA_RESULT-DMBTR = WA_RESULT-DMBTR + WA_EKBE-DMBTR.
      WA_RESULT-MENGE_CY = WA_RESULT-MENGE_CY - WA_EKBE-MENGE.
    ENDIF.
    IF WA_EKBE-BEWTP = 'Q' .

      WA_RESULT-MENGE_FP = WA_RESULT-MENGE_FP + WA_EKBE-MENGE.
      WA_RESULT-DMBTR_FP = WA_RESULT-DMBTR_FP + WA_EKBE-DMBTR.
      WA_RESULT-MENGE_CY = WA_RESULT-MENGE_CY + WA_EKBE-MENGE.
    ENDIF.

    AT END OF EBELP.
      APPEND WA_RESULT TO LT_RESULT.
      CLEAR: WA_EKBE,WA_RESULT.
    ENDAT.
*    COLLECT WA_RESULT INTO LT_RESULT.
*    CLEAR: WA_EKBE,WA_RESULT."使用COLLECT计算
  ENDLOOP.

  DELETE LT_RESULT WHERE MENGE_CY = 0."若需开票数量为0,则删除此条数据
  • 将EKBE中的表数据处理以后,APPEND到LT_RESULT上。
    其中算法可以使用AT END OF 也可以使用COLLECT

AT END OF 和 COLLECT不同算法

首先强调一点,使用at end of 和 collect 的前提条件是要先SORT对表内数据排序,因为这两个关键字段都是在LOOP对内表搜索的时候从头到尾一行一行遍历

  • at end of 方法
  1. 在ABAP报表程序中,经常会涉及到内表字段的统计。而统计一般会以一个或多个Key字段为节点,统计其他某些数值类型字段。这里我们就会用到AT().. ENDAT
    这里包括: new , first , last , end of .
  2. 使用at end of,需要另外定义内表的工作区,否则直接使用表头,得到的数据会变成一串。
  3. 只汇总内表中字段 EBELP 之后的字段,因此定义内表时要把不需要汇总的数字字段以及非数字字段放在字段(此处为EBELP)前面,需要汇总的字段放在后面。
    注意!
    使用at new, at first, at last, at end of的时候要注意:loop的时候不能加条件;at和endat之间不能使用loop into的working area。手动实现at new, at end of的时候,需要注意,容易出错,尤其是在at end of的时候。
  • collect 方法
    1. collect [ into] .使用该语句,系统会检查内表条目的标准关键字(所有非数字字段)是否相同,如果不同,collect语句的作用与append语句相似,将新行添至内表中;如果相同,collect语句不附加新行,但将工作区中的数字字段内容添加到现有条目中数字字段的内容中。使用该语句前,同样需要先对内表进行排序。

因为一个采购订单可能会有多个行项目,因此可以通过对EBELP字段的审阅,只要EBELN和EBELP的组合变化了,就是一个新的需要COLLECT的行。

EBELN EBELP
4500005141 00010
4500005141 00010
4500005141 00010
4500005307 00010
4500005518 00020
4500005618 00010
posted @ 2022-03-29 16:33  瑟瑟发抖又害怕的萌新  阅读(699)  评论(0编辑  收藏  举报