如何计算ABAP中的“计数”逻辑?

时间:2014-09-23 06:32:33

标签: sql sap abap

专家,

请告诉我如何在ABAP中编写代码以实现以下逻辑?

从下面的屏幕截图中,对于每个" S_ORD_ITM",我必须确定Order_Qty = Dlv_Qty。如果是,请确定Order_Qty = Dlv_Qty的S_ORD_ITM总数。在此示例中,对于S_ORD_ITM的所有6行,Order_Qty = Dlv_Qty。所以,这个值将是6.让我们说这是' X'下一步是查找S_ORD_ITM列的总记录数。在这种情况下它也是6。让我们说这是' Y'。

我的结果应该是[X / Y] * 100。

在某些情况下,总共可能有18个S_ORD_ITM,其中只有6个S_ORD_ITM记录,其中Ord_Qty = Dlv_Qty。所以,我的结果是[6/18] * 100 = 33.33%

此逻辑必须针对具有第一遍指示符的交付号码实施为' X'。想象一下,这个销售订单有许多交货编号,本例中的交货编号是带有' X'的第一个通过指示。我的结束例程中已经有一个循环语句,即

结果包中的循环分配结果字段在哪里/ BIC / FIRSTPASS =' X'。

请让我知道如何使用这个已经可用的循环语句并实现上述逻辑。

非常感谢, -G。

2 个答案:

答案 0 :(得分:1)

更新:

你好Goutham, 你可以轻松解决整个事情。您只需要从订单数据所在的DSO创建数据流,然后进行查找。然后循环遍历结果数据并仅在新DSO中推送提取的聚合行。首先构建目标结构和DSO,然后使用专家例程/结束例程和我所描述的abap编码。

END UPDATE

所以结构就像

sales_order, plant, shipping_point, delivery_number, s_ord_itm, ord_qty, dlv_qty

结果包变量中的

。那是对的吗?没有截图,很难知道你的意思,你的意思是SAP BW转换还是ABAP代码? 你可以在你的结构中添加一些辅助变量或在循环中执行它,我更喜欢在循环中执行它。但首先你需要对结果包进行排序!

您的编码应该是这样的(伪代码),其中x变量是v_counter_ord_itm而v_counter_ord_dlv是你的y:

制作一些数据定义,如

WA_RESULT.../END OF...  (build a workarea for sales_order, result)
T_RESULT (make an itab out of workarea)
WA (workarea with sales_order, counter_ord_itm, counter_ord_dlv)
  

伪码!!!

SORT RESULT_PACKAGE BY /BIC/SALES_ORDER
WA-SALES_ORDER = 0.
WA-COUNTER_ORD_ITM = 0
WA-COUNTER_ORD_DLV = 0
LOOP AT RESULT PACKAGE ASSIGNING RESULT FIELDS WHERE /BIC/FIRSTPASS = 'X'.
  IF WA-SALES_ORDER NE /BIC/SALES_ORDER.
    IF WA-SALES_ORDER NE 0.
      WA_RESULT-RESULT = WA-COUNTER_ORD_DLV / WA-COUNTER_ORD_ITM * 100.
      WA_RESULT-SALES_ORDER = WA-SALES_ORDER.
      APPEND WA_RESULT TO T_RESULT.
      CLEAR WA, WA_RESULT.
    ENDIF.
    WA-SALES_ORDER = /BIC/SALES_ORDER.
  ENDIF.
  WA-COUNTER_ORD_ITM = WA-COUNTER_ORD_ITM + 1.
  IF result_fields-ord_qty EQ result_fields-dlv_qty.
    WA-COUNTER_ORD_DLV = WA-COUNTER_ORD_DLV + 1.
  ENDIF.
ENDLOOP.

然后你的itab中有变量。要在sap bw中的数据处理中使用,请执行另一个循环,使用查找将结果数据推送到新字段“result”中(您必须将其添加到输出结构中):

LOOP AT RESULT_PACKAGE ...
  LOOP AT IT_RESULT ASSIGNING <z>
   WHERE /BIC/SALES_ORDER = <z>-SALES_ORDER.
  RESULT_PACKAGE-RESULT = <z>-RESULT.
ENDLOOP

答案 1 :(得分:0)

This is the code that I used:


 SELECT DOC_NUMBER PLANT SHIP_POINT DSDEL_DATE S_ORD_ITEM DELIV_NUMB
 /BIC/ZLORD_QTY /BIC/ZLDLV_QTY
           INTO CORRESPONDING FIELDS OF TABLE IT_DOC_TABLE
           FROM /BIC/AZORD_DSO00.



 SELECT DOC_NUMBER COUNT( DISTINCT S_ORD_ITEM ) AS NUMR
  FROM /BIC/AZSD_O11000
         INTO CORRESPONDING FIELDS OF TABLE IT_COUNT_TABLE
         GROUP BY DOC_NUMBER.


Z_NUMR = 0.
Z_DNMR = 0.


READ TABLE LT_MIN_FLAG
          WITH KEY
        DOC_NUMBER = SOURCE_FIELDS-DOC_NUMBER
        PLANT =  SOURCE_FIELDS-PLANT
        SHIP_POINT   = SOURCE_FIELDS-SHIP_POINT
        DELIV_NUMB =  SOURCE_FIELDS-DELIV_NUMB
        DSDEL_DATE = SOURCE_FIELDS-DSDEL_DATE

            INTO LT_MIN_FLAG_WA
            BINARY SEARCH.


    IF SY-SUBRC = 0.
      Z_FIRST_ROW = LT_MIN_FLAG_WA-ZFIRSTROW.
    ELSE.
      Z_FIRST_ROW = ''.
    ENDIF.



IF Z_FIRST_ROW = 'X'.

LOOP AT IT_DOC_TABLE INTO WA_DOC_TABLE WHERE

DOC_NUMBER = SOURCE_FIELDS-DOC_NUMBER AND
PLANT = SOURCE_FIELDS-PLANT AND
SHIP_POINT = SOURCE_FIELDS-SHIP_POINT AND
DELIV_NUMB = SOURCE_FIELDS-DELIV_NUMB AND
DSDEL_DATE = SOURCE_FIELDS-DSDEL_DATE.

IF WA_DOC_TABLE-/BIC/ZLORD_QTY = WA_DOC_TABLE-/BIC/ZLDLV_QTY.

Z_NUMR = Z_NUMR + 1 .

ENDIF.

ENDLOOP.

ENDIF.

READ TABLE IT_COUNT_TABLE INTO WA_COUNT_TABLE WITH KEY
DOC_NUMBER = SOURCE_FIELDS-DOC_NUMBER.

IF SY-SUBRC = 0.

Z_DNMR = WA_COUNT_TABLE-NUMR.

ENDIF.

IF Z_DNMR <> 0.

 RESULT = ( Z_NUMR / Z_DNMR ) * 100 .

ELSE.

  RESULT = 0.

ENDIF.