按条件计算订单行数,并计算占总行数的百分比



专家

请让我知道如何在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.

更新:

你好,Goutham,你可以更容易地解决整个问题。您只需要从订单数据所在的DSO中创建一个数据流,然后进行查找。这样,您就可以循环使用结果数据,并将提取的聚合行推送到新的DSO中。首先构建目标结构和DSO,然后使用专家例程/结束例程,使用如我所描述的abap编码。

结束更新

所以结构就像

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中就有了变量。要在sapbw中的数据处理中使用,请执行另一个查找循环,将结果数据推送到新字段"result"中(您必须将其添加到输出结构中):

LOOP AT RESULT_PACKAGE ...
  LOOP AT IT_RESULT ASSIGNING <z>
   WHERE /BIC/SALES_ORDER = <z>-SALES_ORDER.
  RESULT_PACKAGE-RESULT = <z>-RESULT.
ENDLOOP
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.
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.
CHECK sy-subrc = 0. CLEAR result.
IT_DOC_TABLE = VALUE /bic/azord_dso00( FOR ls_doc IN  it_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 AND /bic/zlord_qty = /bic/zldlv_qty ) ( ls_doc ) ).  
z_numr = lines( it_doc_table ).
READ TABLE it_count_table INTO wa_count_table WITH KEY doc_number = source_fields-doc_number.
IF sy-subrc = 0 AND wa_count_table-numr <> 0.
 result = ( z_numr / wa_count_table-numr ) * 100 .
ENDIF.

相关内容

  • 没有找到相关文章