选择最多N行

2020-08-20 20:20发布

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

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


专家您好,

我需要使用" BAPI_PO_CHANGE"更新与某个特定类型" XYZ"相关的所有采购订单。

在生产环境中,我在EKPO表中有超过一百万条与此采购订单相关的生产线。 来自EKKO内部联接EKPO的简单选择语句将导致性能问题。

我想从EKKO/EKPO中选择一定数量的行,例如1000,使用" BAPI_PO_CHANGE"更新这1000行,然后从EKKO/EKPO中选择接下来的1000行。 处理应该像这样继续进行,直到所有行(百万行)都更新为止。

有什么建议吗? 或其他解决方案?

此致

盟友

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

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


专家您好,

我需要使用" BAPI_PO_CHANGE"更新与某个特定类型" XYZ"相关的所有采购订单。

在生产环境中,我在EKPO表中有超过一百万条与此采购订单相关的生产线。 来自EKKO内部联接EKPO的简单选择语句将导致性能问题。

我想从EKKO/EKPO中选择一定数量的行,例如1000,使用" BAPI_PO_CHANGE"更新这1000行,然后从EKKO/EKPO中选择接下来的1000行。 处理应该像这样继续进行,直到所有行(百万行)都更新为止。

有什么建议吗? 或其他解决方案?

此致

盟友

付费偷看设置
发送
5条回答
大简至美
1楼 · 2020-08-20 21:14.采纳回答

嗨,盟友,

您可以尝试在SELECT ... ENDSELECT块中使用PACKAGE SIZE添加

选择...从表...位置到表... itab包大小1000 ...在哪里...调用函数'BAPI_PO_CHANGE'。ENDSELECT。

根据关键字文档:

如果指定PACKAGE SIZE加法,则SELECT的结果集的所有行都将循环处理,必须用ENDSELECT封闭。 这些行以n行的包的形式插入内部表itab中。 n必须是包含行数的类型i数据对象。 如果n的值小于0,则发生无法处理的异常。 如果n等于0,则将结果集的所有行插入内部表itab中。 如果在FETCH语句中使用,将从当前光标位置提取n行。

如果使用INTO,则在每次插入之前初始化内部表,并且在SELECT循环中,内部表仅包含当前包的行。 如果使用了APPENDING,则会为每个SELECT循环或使用FETCH的每个提取将另一个包添加到内部表的现有行中。

干杯

Amy

nice_wp
2楼-- · 2020-08-20 21:10

当我使用带有" CALL FUNCTION'GUI_DOWNLOAD'"的内部表进行处理时,我会使用" OPEN CURSOR"来解决此问题,就像 调用时有一个"提交工作"。只有使用本地SQL时,"保持"状态才处于活动状态...

天桥码农
3楼-- · 2020-08-20 21:04

Ally,

我也遇到了同样的问题,我使用的解决方案是将前端和后端处理结合在一起。 程序逻辑为:

如果sy-batch =''"前端处理

---处理1,准备好内部表

Elseif sy-batch ='X'"背景处理

----流程2,BAPI_PO_CHANGE和BAPI_TRANSACTION_COMMIT

Endif。

---处理1,准备好内部表

从EKKO/EKPO中选择数据,准备内部表。

将内部表导出到数据库索引(将itab导出到DATABASE indx(index)ID'TABLE'。这会将您的内部表存储到Database Index中,您可以从中检索相同的表。

导出内部表后,在后台模式下再次调用同一程序(提交)。 您也可以计划在给定时间开始作业。 再次提交程序以在后台模式下调用后,请退出该程序并查看作业是否已在后台模式下调度。 这将调用上面的过程2。

----流程2,BAPI_PO_CHANGE和BAPI_TRANSACTION_COMMIT

一旦程序在后台执行,您就可以从数据库索引中调用内部表(从itab2 DATABASE indx(index)ID'TABLE'中导入IMPORT itab1)。 这将准备好表以供进一步处理。 然后,您需要在表上循环,并保留1000条记录的计数器。 一旦达到1000条记录,请调用BAPI_PO_CHANGE,然后调用BAPI_TRANSACTION_COMMIT。 这将更新记录。 清除字段,然后再次循环以获取更多记录。 记录日志,您可以将其另存为文件。

如果您尝试同时在前台或后台运行这两个部分,则将花费大量时间。 发现这种方法更好,因为它可以照顾到所有方面,并且在前台执行时不会出现超时错误。

Aaron 3364
4楼-- · 2020-08-20 21:02

您也可以使用OPEN光标/FETCH光标/Close光标技术。

Bunny_CDM
5楼-- · 2020-08-20 20:56

最终可以做到,而无需打开带有程序包大小的游标。

https://help.sap.com/doc/ abapdocu_752_index_htm/7.52/zh-CN/abapselect_up_to_offset.htm

最终支持
从T最多选择N行,偏移量为O"。
             哪里(继续)
             按F ...排序。

一周热门 更多>