棘手的包装声明

2020-08-19 02:28发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)你好 我必须实现一些并行处理逻...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


你好

我必须实现一些并行处理逻辑,因此必须创建定义包大小的数据包。

标准文档(Horst Keller)中的示例使第一步变得容易。

使用此编码打包非常容易


DATA(n)=10。
cl_demo_input => request(导出文本="包装尺寸"
更改字段= n)。
如果n <= 0。 。
ENDIF。

cl_demo_output => begin_section(| {n包||的包)。
数据组像itab。 (sy-tabix-1)DIV n + 1.
清除组。
组上的循环wa分配字段符号()。 )。
ENDLOOP。
cl_demo_output => write(group)。
ENDLOOP。

但是对于此软件包构建,我还有其他条件。 我正在处理定价条件,并且在处理包裹时,定价表的所有部分都必须位于同一包裹中。
我可以在声明后添加其他表达式。

GROUP BY(sy-tabix-1)DIV n + 1。

我还可以使用哪种说法将定价比例打包在一个包中,同时正确地跳到下一个包? (包装可能小于包装尺寸n)

4条回答
callcenter油条
2020-08-19 03:12

问题中用于创建包的示例与行内容无关。 但是,您的要求也确实取决于行的内容。 而且您的包装尺寸要求也使它变得稍微复杂一点,因为包装只允许较小,但绝对不允许更大。

  • 在最坏的情况下确实会导致"错误", 如果包装的尺寸小于某个条件下的秤数->因此,我将能够允许比包装的尺寸更大的包装,仅在必须"挤压"这些多余的秤的情况下

我假设,您要使用GROUP BY函数,因为与您自己编程该逻辑背后的函数相比,它看起来更有条理,编码更少。 请注意,更少的编码并不一定意味着更高的性能。

根据您的要求,有几项要计算并要按条件分组。 因此,您将最终以一种或另一种方式再次进行更多的编码。

在使用LOOP AT语句的GROUP BY参数进行所有可能的操作之前,您肯定可以使用方法( 请参阅内部表,使用方法使用LOOP分组):

  1. 按价格条件的关键对itab进行排序,以便将具有多个比例的定价条件"分组"在一起
  2. 计算每个键对应的比例数
  3. 创建一个"散列"函数,将最多n条记录分组在一起,然后将具有"重叠"定价条件的记录扔到下一组中
< p>对于第2点),我使用了多带带的LOOP ... GROUP BY ...,使用列值并将计算出的值存储在表的附加字段中(您也可以通过key-id拥有一个参考表并存储计算出的值

对于第3点),我使用LOOP ... GROUP BY ...,使用一种方法来创建所需的软件包。 请注意,如果密钥中有许多重复的密钥条目大于程序包大小,则这些程序包最终将大于程序包大小,以避免不必遗漏那些记录。 另外,如果下一个具有重复键条目的键不适合当前程序包,则还会有较小的程序包。

 CLASS demo DEFINITION。
   公共部分。
     类方法:
       主要,
       class_constructor。
     类别数据:
      max_package_size TYPE int4 VALUE 4。
   专用部分。
     类别数据:
       current_carrid TYPE spfli-carrid,
       current_package TYPE int4 VALUE 1
       current_package_size TYPE int4,
       开始飞行。
         包括类型spfli。
         CLASS-DATA:key_cnt TYPE int4,
       飞行结束,
       航班类似于航班表。
     类方法
       get_package IMPORTING航班和LIKE航班
                   返回值(包)的类型int4。
 ENDCLASS。

 类演示实施。
   方法主要。
     DATA(out)= cl_demo_output => new()。

     DATA成员喜欢航班。
     LOOP AT航班INTO DATA(wa)
          GROUP BY(包= get_package(wa)
                     大小= GROUP SIZE索引= GROUP INDEX)
          分配FIELD-SYMBOL()。
       out-> write(name =`Group key` data = )。
       清除成员。
       在组上分配ASSIGNING FIELD-SYMBOL()。
         成员= VALUE#(基本成员())。
       结局。
       out-> write(成员)-> line()。
     结局。

     out-> display()。
   终结法。

   方法class_constructor。
     SELECT * FROM spfli INTO TABLE航班,按卡尔里德排序。
     LOOP AT航班INTO DATA(wa)
              GROUP BY(carrid = wa-carrid
                         大小= GROUP SIZE索引= GROUP INDEX)
              分配FIELD-SYMBOL()。
       在组上分配ASSIGNING FIELD-SYMBOL()。
         <成员> -key_cnt = <组>-大小。
       结局。
     结局。
   终结法。

   方法get_package。
     包= current_package。
     如果current_carrid =飞行航班。
       将1加到current_package_size。
     其他。
       current_carrid =飞行飞行。
       如果current_package_size> = max_package_size
       或current_package_size + flight-key_cnt> max_package_size。
         将1添加到:current_package,程序包。
         current_package_size = 1。
       其他。
         将1加到current_package_size。
       万一。
     万一。
   终结法。

 ENDCLASS。

 选择开始。
   demo => main()。
 

一周热门 更多>