使用打开的游标下载数据块时出错

2020-08-27 22:07发布

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

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


嗨,

我想将数据块(每次10万条记录)下载到本地系统中。 在这里,我正在使用游标来做到这一点。 但是,只要系统要求用户更改或创建文件并导致转储,游标就会隐式关闭。

在第二次获取期间,我正在获取转储。 我尝试将光标与'WITH HOLD'一起使用以避免隐式关闭,但我一直遇到相同的错误。 有什么办法可以避免这种情况。

我的代码:

数据:lfa1的itab类型表,
 * lfa1的it2类型表,
  当前类型光标
  file_no TYPE i,
  c(1),
  路径TYPE字符串VALUE'F:\'。
  带有cur的OPEN CURSOR用于SELECT * FROM lfa1。
 做。
  在表itab包大小100000中获取下一个光标。
  如果sy-subrc ne 0。
  出口。
  万一。
  path ='F:\'。
  file_no = file_no + 1。
  c = file_no。
  CONCATENATE路径'file'c​​'.csv'INTO路径。
  通话功能'GUI_DOWNLOAD'
  出口
 * BIN_FILESIZE =
  FILENAME =路径
  桌子
  DATA_TAB = Itab。
 ENDDO。
 CLOSE CURSOR当前。

错误:

ABAP类别编程错误

运行时错误DBSQL_INVALID_CURSOR

除外。 CX_SY_OPEN_SQL_DB

未分配应用程序组件

短文本:光标已关闭或尚未打开。

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

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


嗨,

我想将数据块(每次10万条记录)下载到本地系统中。 在这里,我正在使用游标来做到这一点。 但是,只要系统要求用户更改或创建文件并导致转储,游标就会隐式关闭。

在第二次获取期间,我正在获取转储。 我尝试将光标与'WITH HOLD'一起使用以避免隐式关闭,但我一直遇到相同的错误。 有什么办法可以避免这种情况。

我的代码:

数据:lfa1的itab类型表,
 * lfa1的it2类型表,
  当前类型光标
  file_no TYPE i,
  c(1),
  路径TYPE字符串VALUE'F:\'。
  带有cur的OPEN CURSOR用于SELECT * FROM lfa1。
 做。
  在表itab包大小100000中获取下一个光标。
  如果sy-subrc ne 0。
  出口。
  万一。
  path ='F:\'。
  file_no = file_no + 1。
  c = file_no。
  CONCATENATE路径'file'c​​'.csv'INTO路径。
  通话功能'GUI_DOWNLOAD'
  出口
 * BIN_FILESIZE =
  FILENAME =路径
  桌子
  DATA_TAB = Itab。
 ENDDO。
 CLOSE CURSOR当前。

错误:

ABAP类别编程错误

运行时错误DBSQL_INVALID_CURSOR

除外。 CX_SY_OPEN_SQL_DB

未分配应用程序组件

短文本:光标已关闭或尚未打开。
付费偷看设置
发送
6条回答
吹牛啤
1楼 · 2020-08-27 22:20.采纳回答

正如文档所述,WITH HOLD选项仅保护您免受通过本机SQL执行的提交。 对于通常会关闭光标的GUI交互而言,它无效,因此您必须使用某种解决方法,例如使用表的主键来拆分记录:

 DATA:last_vendor TYPE lfa1  -lifnr,
       lfa1的vendor_data类型标准表。

 做。
  
 *获取下一块
   选择*从lfa1
     高达100000行
     到表vendor_data
     在哪lifnr> last_vendor
     通过主键订购。
  
   如果sy-subrc <> 0。
     出口。
   万一。

 *下载下一块
   呼叫" GUI_DOWNLOAD"。

 *确定密钥以继续处理
   last_vendor = vendor_data [lines(vendor_data)] -lifnr。
  
 恩多
 
nice_wp
2楼-- · 2020-08-27 22:07

最新代码:

字段符号:类型标准表。
数据:cur TYPE光标, file_no TYPE i, c(1), 路径TYPE字符串VALUE'F:\'。
参数:选项卡,如dd03l-tabname。
数据:引用类型引用数据。 创建数据请参考"类型表"(选项卡)。 ASSIGN参考-> * TO
按住cur打开以选择* * FROM(选项卡)。 " INTO TABLE。
做。 将下一光标Cur插入表包大小1000。
如果sy-subrc ne 0。 出口。 endif。
path ='F:\'。 file_no = file_no + 1。 c =文件号。
CONCATENATE路径'file'c​​'.csv'INTO路径。
通话功能'GUI_DOWNLOAD' 出口 * BIN_FILESIZE = FILENAME =路径 桌子 DATA_TAB =
ENDDO。
CLOSE CURSOR当前。
wang628962
3楼-- · 2020-08-27 22:25

您还可以使用EXPORT/IMPORT到DB的概念。

  • 获取数据并将其保存在INDX表中
    ->将数据保存在群集中时->保留群集名称,例如TABLE1、2、3->,以便在下载时易于理解。 一旦数据保留下来,就可以循环下载或执行操作。
  • 从集群中下载数据
    只需获取所有集群->遍历它并下载数据。 下载后,从群集中删除数据。
小灯塔
4楼-- · 2020-08-27 22:25

因此,从本质上讲,您希望能够将任何数据库表下载到PC。 对我来说似乎有点疯狂的要求。 目的是什么? 将SAP数据库备份到PC?

黑丝骑士
5楼-- · 2020-08-27 22:23

嗨,Sandra Rossi,

我的意思是,我将使用您的建议在运行时定义一个where条件。

 DO。
   OPEN CURSOR cur FOR SELECT * FROM(db_table)ORDER BY PRIMARY KEY。
   不要在TIMES内下载_packages。  "以跳过已处理的记录
     在表 PACKAGE SIZE packsize中获取下一个光标。
   ENDDO。
  在表 PACKAGE SIZE packsize中获取下一个光标。"获取当前pkg 

当我的数据较少时,上面的代码也以相同的方式工作。 使用上面的代码,如果我尝试下载10万个打包大小为10万个记录的记录,则我必须获取65次而不是10次。 不幸的是,我要获取数百万个记录(在极少数情况下为数十亿个),这种方法将比您花费更多的时间。

我只是想说,您的方法更可行。

谢谢

clasier
6楼-- · 2020-08-27 22:07

谢谢。 我说使用SELECT而不是OPEN CURSOR在视觉上更加紧凑。

带有WHERE和向上行的OPEN CURSOR:

 OPEN CURSOR cur for SELECT * FROM(db_table)
     在哪里" <===添加它
     按主键订购
     最多100000行。
 做。
   将下一游标cur插入表包大小packsize。
   如果sy-subrc <> 0。
     出口。
   万一。
 ENDDO。
 CLOSE CURSOR当前。

在技术上与以下命令相同:

 SELECT * FROM(db_table)
     哪里哪里)
     按主键订购
     到表
     多达100000行。

两者之间在数据库方面没有明显的性能差异。 功能没有差异(当然会有一些差异,但是在我们当前的案例中没有使用它们。)

事实上,我确实没有在讨论您的确切问题,这只是一般信息。

p>

SELECT不太详细。 据了解,您因此选择SELECT。

一周热门 更多>