使用CRM_ORDER_MAINTAIN主逻辑进行更新

2020-08-20 19:56发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)专家,我试图了解CRM_ORDE...

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

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


专家,我试图了解CRM_ORDER_MAINTAIN的主要逻辑。
对于我来说,我需要更新 crmd_orderadm_i crmd_customer_h。
这是我的参考链接链接

这是我的代码块。

包含crm_object_names_con。
 数据:
   lt_orderadm_i TYPE crmt_orderadm_i_comt,
   ls_orderadm_i TYPE crmt_orderadm_i_com,
   lt_customer_h TYPE crmt_customer_h_comt,
   ls_customer_h TYPE crmt_customer_h_com,
 *其他重要事项
   lt_input_fields TYPE crmt_input_field_tab,
   ls_input_fields TYPE crmt_input_field,
   lt_nametab TYPE crmt_input_field_names_tab,
   ls_nametab TYPE crmt_input_field_names,
   lt_save_guid TYPE crmt_object_guid_tab,
   ls_save_guid TYPE crmt_object_guid,
   lt_saved_objects TYPE crmt_return_objects,
   ls_saved_objects类型crmt_return_objects_struc,
   lv_lin TYPE i,
   lv_order_object_id TYPE crmt_object_id,
   lv_order_object_guid TYPE crmt_object_guid32,
   lt_exception TYPE crmt_exception_t。


 *更新ORDERADM_I ***********************************
 清除:ls_nametab,lt_nametab [],ls_input_fields。

 ls_orderadm_i-ordered_prod ='已更新'。
 ls_nametab ='ORDERED_PROD'。
 附加ls_nametab到lt_nametab。

 ******************************************************  **************************************
 *第一个错误发生在下面的描述中,附加ls_nametab,当我对其进行注释时,会发生另一个错误。
 *******************************************
 * ls_orderadm_i-description ='已更新'。
 * ls_nametab ='DESCRIPTION'。
 * APPEND ls_nametab至lt_nametab。


 ls_orderadm_i-subst_reason ='更新'。
 ls_nametab ='SUBST_REASON'。
 附加ls_nametab到lt_nametab。


 ls_orderadm_i-header ='DFCA012BA36C85F195C578E7D1DF19EC'。
 附加ls_orderadm_i至lt_orderadm_i。

 ls_input_fields-ref_kind ='A'。
 ls_input_fields-ref_guid ='DFCA012BA36C85F195C578E7D1DF19EC'。
 ls_input_fields-objectname ='ORDERADM_I'。
 ls_input_fields-field_names [] = lt_nametab []。

 将ls_input_fields插入表lt_input_fields中。

 ******************************************************  ***********

 *更新COSTUMER_H

 清除:ls_nametab,lt_nametab [],ls_input_fields。

 ls_customer_h-zzafld00000p ='更新'。
 ls_nametab ='ZZAFLD00000P'。
 附加ls_nametab到lt_nametab。

 ls_customer_h-zzafld00000q ='更新'。
 ls_nametab ='ZZAFLD00000Q'。
 附加ls_nametab到lt_nametab。

 ls_customer_h-ref_guid ='DFCA012BA36C85F195C578E7D1DF19EC'。
 APPEND ls_customer_h至lt_customer_h。

 ls_input_fields-ref_kind ='A'。
 ls_input_fields-ref_guid ='DFCA012BA36C85F195C578E7D1DF19EC'。
 ls_input_fields-objectname ='CUSTOMER_H'。
 ls_input_fields-field_names [] = lt_nametab []。

 将ls_input_fields插入表lt_input_fields中。
 ******************************************************  ********************



 通话功能'CRM_ORDER_MAINTAIN'
   出口
     it_customer_h = lt_customer_h
   输入
     et_exception = lt_exception
   改变
     ct_orderadm_i = lt_orderadm_i
   例外情况
     error_occurred = 1
     document_locked = 2
     no_change_allowed = 3
     no_authority = 4
     其他= 5。


 案例sy-subrc。
   何时0。
 * ls_save_guid = iv_guid。
     附录ls_save_guid至lt_save_guid。
 结束。

 通话功能'CRM_ORDER_SAVE'
   出口
     it_objects_to_save = lt_save_guid
   输入
     et_saved_objects = lt_saved_objects
   例外情况
     document_not_saved = 1
     其他= 2。


 案例sy-subrc。
   当为" 0"时。
     清除lv_lin。
     描述表lt_saved_objects线lv_lin。
     如果lv_lin = 1。
       读取表lt_saved_objects INTO ls_saved_objects索引1。
       lv_order_object_guid = ls_saved_objects-guid。
       lv_order_object_id = ls_saved_objects-object_id。
 * 5.调用该函数以提交对CRM的更改。
       调用功能" BAPI_TRANSACTION_COMMIT"。
     万一。
 结束。

我想念什么? 我找不到关于此的任何官方文件。
亲切的问候。

付费偷看设置
发送
4条回答
代楠1984
1楼 · 2020-08-20 20:04.采纳回答

1。 第一次错误

在已排序的密钥表上使用APPEND永远不是一个好主意,除非您确定要按密钥顺序对APPEND进行排序。 几乎所有CRM_ORDER *的表类型都是基于具有唯一键的TYPE SORTED TABLE。

几乎总是使用INSERT ... INTO TABLE!

" APPEND ls_nametab到lt_nametab  "->不要对排序的表类型使用APPEND
 插入ls_nametab插入表lt_nametab中。  "->几乎在所有情况下都使用INSERT 

在您的情况下,由于您尝试执行操作的顺序,您会收到错误消息(将其很好地发布以供将来参考) 附录,我想您的下一个错误也是由于这个原因。请尝试更具体地说明实际发生的错误。在大多数情况下,社区甚至可以通过错误消息为您提供帮助,而无需了解特定的FM。/p>

这是为什么您会遇到第一个错误的原因:

>>短文本:在排序表中插入或更改时出现错误
>>错误分析:将插入一行 或在已排序的位置1更改 内部表(类型为SORTED_TABLE) " \ PROGRAM = ... \ DATA = LT_NAMETAB"。 这样,排序顺序(由表键确定)为

 ls_nametab ='ORDERED_PROD'。
 附加ls_nametab到lt_nametab。
 ls_nametab ='DESCRIPTION'。
 附加ls_nametab到lt_nametab。  "错误,因为'O ..'>'D ..'
 ls_nametab ='SUBST_REASON'。
 附加ls_nametab到lt_nametab。  

侧面说明:因此,我还建议始终使用INSERT ... INTO TABLE ...而不是APPEND ... TO ....,这样,插入是基于 表格类型(如果不是排序键类型,它也将其"附加"为最后一项)。

例如,如果要指出一点,则必须使用APPEND作为最后一项(如果不受表类型的限制,则必须"插入"作为最后一项)。

2。 第二个错误

由于您不熟悉CRM_ORDER * FM,因此我强烈建议您,因为您在编码过程中会进一步陷入困境,并且如果您真的想知道CRM_ORDER_MAINTAIN的工作原理,请使用Trx。 CRMD_ORDER,更改您想更改的内容,然后调试CRM_ORDER _ *** FM。

在第二个错误的情况下,您尝试更新头寸,但使用标头ref_type和标头guid :

 ls_input_fields-ref_kind ='B'。  " B,而不是A,因为这是位置,而不是标头级别
 ls_input_fields-ref_guid ='DFCA012BA36C85F195C578E7D1DF19EC'。  "不是标题,而是pos-guid
 ls_input_fields-objectname ='ORDERADM_I'。
 ls_input_fields-field_names [] = lt_nametab []。
 将ls_input_fields插入表lt_input_fields中。
 

请张贴您收到的错误,以便我们为您提供帮助。

昵称总是被占用
2楼-- · 2020-08-20 20:15

任何想法都很有用

悠然的二货
3楼-- · 2020-08-20 20:12

如果它没有按预期工作,请查看错误消息。 我们无法为您做到这一点。

野沐沐
4楼-- · 2020-08-20 20:00
初级Abap开发人员

对不起 ,但是您的编码有很多错误,随着我深入研究它,情况只会变得更糟。 请调试Trx。 CRMD_ORDER和CRM_ORDER_MAINTAIN中的断点,并查看如何对标头和位置值执行更改。 只有这样,您才能真正了解必须执行的操作。

1。 错误:程序错误; 接口参数值错误

在调用CRM_ORDER_SAVE时,您需要告诉FM您需要保存哪些已由CRM_ORDER_MAINTAIN更改的订单指南。 当前,在您的情况下,该GUID表为空,从而导致上述错误!

 CASE sy-subrc。
   何时0。
     ls_save_guid ='DFCA012BA36C85F195C578E7D1DF19EC'。  "需要更改的订单的标题GUID
     附录ls_save_guid至lt_save_guid。
 结束。
2.更改结构中字段的值并使lt_input_fields知道这些更改您很可能从CRMD_ORDERADM_H获得订单标头guid,并且正确地将其用作CRMD_CUSTOMER_H的ref_guid,但是您不能将其用于CRMD_ORDERADM_I的ref_guid 为此,您需要使用头寸guid,否则SAP标准将无法区分订单的头寸(仅设置orderadm_i-header guid并不能解决问题)。您实际上想实现什么?
  1. 更新现有订单吗?
  2. 使用"更新" SUBST_REASON来更新订单的一项或全部内容吗?
  3. 更新CUSTOMER_H上的自定义标题字段?
  4. 就这样吗?
 ls_orderadm_i-guid ='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'。  "来自CRMD_ORDERADM_I的位置指导
 附加ls_orderadm_i至lt_orderadm_i。

 ls_input_fields-ref_kind ='B'。  " B,而不是A,因为这是位置,而不是标头级别
 ls_input_fields-ref_guid ='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'。  "不是标题,而是pos-guid,请参见上文
 ls_input_fields-objectname ='ORDERADM_I'。
 ls_input_fields-field_names [] = lt_nametab []。
 插入ls_input_fields插入表lt_input_fields

 " ...

 通话功能'CRM_ORDER_MAINTAIN'
   出口
     it_customer_h = lt_customer_h
   输入
     et_exception = lt_exception
   改变
     ct_orderadm_i = lt_orderadm_i
     ct_input_fields = lt_input_fields"-> FM需要知道您要更改的内容
   例外情况
     error_occurred = 1
     document_locked = 2
     no_change_allowed = 3
     no_authority = 4
     其他= 5。

一周热门 更多>