保存到数据库表的问题

2020-08-19 06:16发布

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

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


嗨,我似乎无法在进行更改后将修改后的数据保存到数据库表(zekko03)中。 我现在正在保存标题。

示例程序并不像我尝试过的那样真正适用于我的情况。

应该是逻辑问题,可以列出/显示save_database_update子例程应该如何按逻辑顺序工作以及使用什么语法?

 数据:G_GRID_LEFT TYPE REF CL_GUI_ALV_GRID,
       G_GRID_RIGHT类型参考CL_GUI_ALV_GRID,
       GS_LAYOUT类型LVC_S_LAYO。


  执行FIELDCAT。
   GS_LAYOUT-EDIT = ABAP_TRUE。
   呼叫方法G_GRID_LEFT-> SET_TABLE_FOR_FIRST_DISPLAY
     出口
       IS_VARIANT = LS_VARIANT
       I_STRUCTURE_NAME ='ZEKKO03'
       I_SAVE =保存
       IS_LAYOUT = GS_LAYOUT
     改变
       IT_OUTTAB = GT_ZHEADER
       IT_FIELDCATALOG = GT_FIELDCAT
     例外情况
       INVALID_PARAMETER_COMBINATION = 1
       PROGRAM_ERROR = 2
       TOO_MANY_LINES = 3
       其他= 4。
   如果SY-SUBRC <> 0。
     消息ID SY-MSGID类型SY-MSGTY编号SY-MSGNO
                与SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4。
   ENDIF。
 MODULE USER_COMMAND_0100输入。

   调用方法CL_GUI_CFW => DISPATCH。

   案例SY-UCOMM。
  
     当"更新"。
       执行SAVE_DATABASE_UPDATE。
     当"切换"时。
       进行SWITCH_EDIT_MODE。
     当别人。
   结束。


 ENDMODULE。  

更新方法有效,这意味着记录已更新。 但是,在调用alv程序时,标头zekko03记录不会被更新。

当我调试时,修改过的字段首先会更新(从YNB更改为ZNB)

稍后只需要一条记录(第一条记录),执行完调试模式后,记录就不会更新

 FORM SAVE_DATABASE_UPDATE。

   将gt_zheader循环到gs_zheader。
         呼叫方法ZCL_03_DATA_MODEL => SELECT_PURCHASE_ORDERS
       出口
        IV_KEY = gs_zheader-ebeln
         IV_MAX_ROWS = IV_MAX_ROWS
       输入
         IT_ZHEADER = gt_zheader
       。


     呼叫方法ZCL_03_DATA_MODEL => UPDATE_PURCHASE_ORDERS
       出口
         IT_ZHEADER = GT_ZHEADER
         IT_ZITEMS = GT_ZITEMS
       输入
         ES_BAPIRET2 = BAPIRET2。

 结局。


 ENDFORM。

这些是我使用过的一些参考书

http://saptechnical.com/Tutorials/ALV/Edit/demo.htm

https://answers.sap。 com/questions/5294394/problem-with-alv-edit-and-save.html

https://oprsteny.com/?p=843

(64.9 kB)

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

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


嗨,我似乎无法在进行更改后将修改后的数据保存到数据库表(zekko03)中。 我现在正在保存标题。

示例程序并不像我尝试过的那样真正适用于我的情况。

应该是逻辑问题,可以列出/显示save_database_update子例程应该如何按逻辑顺序工作以及使用什么语法?

 数据:G_GRID_LEFT TYPE REF CL_GUI_ALV_GRID,
       G_GRID_RIGHT类型参考CL_GUI_ALV_GRID,
       GS_LAYOUT类型LVC_S_LAYO。


  执行FIELDCAT。
   GS_LAYOUT-EDIT = ABAP_TRUE。
   呼叫方法G_GRID_LEFT-> SET_TABLE_FOR_FIRST_DISPLAY
     出口
       IS_VARIANT = LS_VARIANT
       I_STRUCTURE_NAME ='ZEKKO03'
       I_SAVE =保存
       IS_LAYOUT = GS_LAYOUT
     改变
       IT_OUTTAB = GT_ZHEADER
       IT_FIELDCATALOG = GT_FIELDCAT
     例外情况
       INVALID_PARAMETER_COMBINATION = 1
       PROGRAM_ERROR = 2
       TOO_MANY_LINES = 3
       其他= 4。
   如果SY-SUBRC <> 0。
     消息ID SY-MSGID类型SY-MSGTY编号SY-MSGNO
                与SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4。
   ENDIF。
 MODULE USER_COMMAND_0100输入。

   调用方法CL_GUI_CFW => DISPATCH。

   案例SY-UCOMM。
  
     当"更新"。
       执行SAVE_DATABASE_UPDATE。
     当"切换"时。
       进行SWITCH_EDIT_MODE。
     当别人。
   结束。


 ENDMODULE。  

更新方法有效,这意味着记录已更新。 但是,在调用alv程序时,标头zekko03记录不会被更新。

当我调试时,修改过的字段首先会更新(从YNB更改为ZNB)

稍后只需要一条记录(第一条记录),执行完调试模式后,记录就不会更新

 FORM SAVE_DATABASE_UPDATE。

   将gt_zheader循环到gs_zheader。
         呼叫方法ZCL_03_DATA_MODEL => SELECT_PURCHASE_ORDERS
       出口
        IV_KEY = gs_zheader-ebeln
         IV_MAX_ROWS = IV_MAX_ROWS
       输入
         IT_ZHEADER = gt_zheader
       。


     呼叫方法ZCL_03_DATA_MODEL => UPDATE_PURCHASE_ORDERS
       出口
         IT_ZHEADER = GT_ZHEADER
         IT_ZITEMS = GT_ZITEMS
       输入
         ES_BAPIRET2 = BAPIRET2。

 结局。


 ENDFORM。

这些是我使用过的一些参考书

http://saptechnical.com/Tutorials/ALV/Edit/demo.htm

https://answers.sap。 com/questions/5294394/problem-with-alv-edit-and-save.html

https://oprsteny.com/?p=843

(64.9 kB)
付费偷看设置
发送
5条回答
Baoming ROSE
1楼-- · 2020-08-19 06:36

对数据库表进行更改后,您是否执行数据库提交?

关于

Mateusz

My梦
2楼-- · 2020-08-19 06:47

您是说对G_GRID_LEFT-> GET_SELECTED_ROWS的调用返回空参数ET_INDEX_ROWS和ET_ROW_NO吗?

如果用户未明确选择任何行,则通常为空。 但是,您真的只想保存用户标记的行吗?

此外,我认为您不了解所选行的概念,因为默认情况下GET_SELECTED_ROWS最多可以返回一行,因为您没有 不能设置布局选项SEL_MODE(必须为'A','C'或'D'才能选择几行)。

无论如何,为什么要在循环内更新数据库表? 为什么不一次调用UPDATE_PURCHASE_ORDERS,而内部表包含要更新的行呢?

clasier
3楼-- · 2020-08-19 06:34

调用G_GRID_LEFT-> GET_SELECTED_ROWS ET_ROW_NO

实际上我上面的get_selected_row代码用于删除子例程,当切换到不可编辑模式(switch_mode)时,选择一行并删除。

我尝试对update应用相同的操作,以查看所选行的修改后的值是否得到更新

只要表更新即使没有选择的行也可以,问题就在于没有选择的行。 在调试模式下,修改后的记录甚至不会反映出来,也不会执行任何更新。

我想不出其他方式编写代码,否则更新无法反映在视频中

在调试模式下(屏幕截图),内部表中没有反映更新的值

 FORM SAVE_DATABASE_UPDATE。

  数据:ZEKKO03的LT_ZHEADER_UPD TYPE TABLE,
  ZEKPO03的LT_ZITEMS_UPD TYPE TABLE,
  LS_ZHEADER_UPD TYPE ZEKKO03,
  LS_ZITEMS_UPD之类的LT_ZITEMS_UPD。

  数据:ZEKKO03的LT_ZHEADER_UPD_N TYPE TABLE,
  ZEKPO03的LT_ZITEMS_UPD_N类型表,
  LS_ZHEADER_UPD_N与LT_ZHEADER_UPD_N类似,
  LS_ZITEMS_UPD_N与LINE_ZITEMS_UPD_N类似。

  数据:LT_INDEX_UPD类型LVC_T_ROW,
  LT_ROWID_UPD TYPE LVC_T_ROID,
  LS_ROWID_UPD之类的LT_ROWID_UPD。
  呼叫方法ZCL_03_DATA_MODEL => SELECT_PURCHASE_ORDERS
  出口
 * IV_KEY =
  IV_MAX_ROWS = IV_MAX_ROWS
  输入
  IT_ZHEADER = LT_ZHEADER_UPD_N
 * IT_ZITEMS =
 * ES_BAPIRET2 =
  。
  呼叫方法ZCL_03_DATA_MODEL => SELECT_PURCHASE_ORDERS
  出口
  IV_KEY = LS_ZHEADER_UPD-EBELN
 * IV_MAX_ROWS = 0
  输入
 * IT_ZHEADER =
  IT_ZITEMS = LT_ZITEMS_UPD_N
 * ES_BAPIRET2 =
  。

  呼叫方法ZCL_03_DATA_MODEL => UPDATE_PURCHASE_ORDERS
  出口
  IT_ZHEADER = LT_ZHEADER_UPD_N
  IT_ZITEMS = LT_ZITEMS_UPD_N
  输入
  ES_BAPIRET2 = BAPIRET2。
  GT_ZHEADER = LT_ZHEADER_UPD_N。
  GT_ZITEMS = LT_ZITEMS_UPD_N。
  G_GRID_LEFT-> REFRESH_TABLE_DISPLAY()。
  G_GRID_RIGHT-> REFRESH_TABLE_DISPLAY()。


  清除LT_ZITEMS_UPD_N。
  清除LT_ZHEADER_UPD_N。
  清除LT_ZITEMS_UPD。
 ENDFORM。
悠然的二货
4楼-- · 2020-08-19 06:52

最后的评论不再与原始问题相关,对以后的访问者不再有用。 无论如何,我认为没有人知道这里发生了什么。

您先前的评论是关于GET_SELECTED_ROWS的,而现在您谈论的是删除和未反映的数据,而没有提供关于我的最后评论的反馈。 很难理解您是否做了任何事情,改变了主意,以及您的最新评论是否与我的最新评论有任何关系。

让我们回答您的一个担忧:您说用户输入了 屏幕没有反映出来。 那很正常 您必须调用方法CHECK_CHANGED_DATA才能将输入值传输到内部表中。

一只江湖小虾
5楼-- · 2020-08-19 06:45

最好一次性修改表。 不是按记录记录,而是使用整个IT_ZHEADER表。

从表it_zheader修改zekko03。

注意

Mateusz

一周热门 更多>