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