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

Abap 按条件计算订单行数,并计算占订单行总数的百分比,abap,Abap,专家们 请让我知道如何在ABAP中编写代码来实现以下逻辑 从下面的屏幕截图中,对于每个“订单ITM”,我必须确定订单数量是否=Dlv数量。如果是,确定订单数量=Dlv数量的订单ITM总数。在本例中,对于所有6行订单ITM,订单数量=Dlv数量。所以,这个值是6。让我们将其称为“X”,下一步是查找S_ORD_ITM列的总记录计数。在这种情况下也是6。让我们把它称为“Y” 我的结果应该是[X/Y]*100 在某些情况下,可能总共有18条订单ITM,其中只有6条订单数量=Dlv数量的订单ITM记录。因

专家们

请让我知道如何在ABAP中编写代码来实现以下逻辑

从下面的屏幕截图中,对于每个“订单ITM”,我必须确定订单数量是否=Dlv数量。如果是,确定订单数量=Dlv数量的订单ITM总数。在本例中,对于所有6行订单ITM,订单数量=Dlv数量。所以,这个值是6。让我们将其称为“X”,下一步是查找S_ORD_ITM列的总记录计数。在这种情况下也是6。让我们把它称为“Y”

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

在某些情况下,可能总共有18条订单ITM,其中只有6条订单数量=Dlv数量的订单ITM记录。因此,我的结果是[6/18]*100=33.33%

对于首过指示器为“X”的交货编号,必须实施此逻辑。假设此销售订单有多个交货编号,本例中的交货编号是带有“X”的首次通过指示器。在我的结束例程中已经有了一个循环语句,即

在结果包处循环分配结果字段,其中/BIC/FIRSTPASS='X'

请告诉我如何使用这个已经可用的循环语句并实现上述逻辑

非常感谢, G.

更新:

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

结束更新 所以结构就像

销售订单、工厂、装运点、交货编号、订单itm、订单数量、dlv数量

在结果包变量中。对吗?如果没有屏幕截图,很难理解您的意思,您指的是SAPBW转换还是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)
伪代码

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

在结果\u包处循环。。。
在IT上循环\u结果分配
其中/BIC/SALES\u ORDER=-SALES\u ORDER。
RESULT_PACKAGE-RESULT=-RESULT。
端环
这是我使用的代码:
选择单据号工厂发货点数据删除日期订单项目交货编号/bic/zlord\U数量/bic/zldlv\U数量
进入表it\U doc\U表的相应字段
来自/bic/azord_dso00。
选择单据编号计数(不同的订单项目)作为numr
自/bic/azsd_o11000
进入表it\u count\u表的相应字段
按单据号分组。
读取表lt\U min\U标志,键doc\U编号=源doc\U字段-doc\U编号
plant=源\u-plant
发货点=源字段-发货点
deliver\u numb=源字段-deliver\u numb
dsdel_日期=源字段-dsdel_日期
进入lt_min_flag_wa
二进制搜索。
检查sy subrc=0。结果很清楚。
IT文档表=值/bic/azord\u dso00(对于IT文档表中的ls文档,其中(文档编号=源字段-文档编号和工厂=源字段-工厂和发货点=源字段-发货点和发货编号=源字段-发货编号和发货编号=源字段-发货编号和发货日期=源字段-发货日期和/bic/zlord数量=/bic/zldlv数量)(ls文档))。
z_numr=行(it_文档_表)。
将表it\U count\U表读入wa\U count\U表,键doc\U number=源字段-doc\U number。
如果sy subrc=0且wa_count_table-numr为0。
结果=(z_numr/wa_count_table-numr)*100。
恩迪夫。

我无法发布屏幕截图。想象一下销售订单、工厂、装运点、交货编号、S_ORD_项目(订单行项目)、ORD_数量、Dlv_数量作为列。虽然我可能了解您的意思,但我不得不说我不想为您编写业务需求代码,特别是如果问题出现在一个非常具体的问题中,而这个问题不太可能对任何人都有帮助。那么您到目前为止都做了哪些尝试?您好,首先我必须感谢您抽出时间回答我的问题!。你是第一个有意向的人。很抱歉,我无法发布屏幕截图,因为堆栈溢出不允许我发布屏幕截图。来源(DSO)应首先以所需格式提供销售订单、行项目、设计编号、工厂、装运地点、交货日期、订单数量和交货数量。然后,我可以尝试在从DSO到多维数据集的代码中实现您的上述逻辑。您好,Goutham,所以我们谈论的是与您的第一个问题完全不同的内容。@上文-我成功地编写了代码,并完成了这项工作!非常感谢你的帮助。那太好了,请标记为已解决并投票表决我的答案!嗯,虽然我当然感谢你的帮助,但我没有使用你发布的代码来解决这个问题。
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.
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.