在SAP APO中的采购计划协议中删除和创建新的计划行

2020-08-23 01:45发布

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

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


专家您好,

我需要删除旧的计划行并通过文件创建新的计划行。 我当时正在调频/SAPAPO/DM_PO_CHANGE。

当传递参数'Method'='D'" D进行删除时,计划行将通过FM删除。

但是,当我将文件参数映射到FM/SAPAPO/DM_PO_CHANGE的it_schedule参数时,使用" method"参数=" A"(表示添加的A)来创建新的计划行,则得到" LC_APP_ERROR"(sy-subrc = 3)。 我无法理解需要在it_schedule内部表中填充哪些参数才能创建新的计划行。

目前,我的代码如下所示-

<代码>

将lt_file循环到ls_file中。

ls_schedule -method ='A'。 " A代表添加

ls_schedule-orderid = ls_file-orderid。 "通过将ebeln(计划协议编号)转换为orderid来填充

ls_schedule-itemno = ls_file-itemno。

ls_schedule-schedno = ls_file-schedno。


通话功能'/SAPAPO/DATE_CONVERT_TIMESTAMP'

导出

iv_date = ls_file-avl_date

iv_time = sy-uzeit

导入

ev_timestamp = ls_schedule-avail_time。

通话功能'/SAPAPO/DATE_CONVERT_TIMESTAMP'

导出

iv_date = ls_file-ship_date

iv_time = sy-uzeit

导入

ev_timestamp = ls_schedule-gi_end_time。

ls_schedule-to_org_quantity = ls_file-sch_qty。

ls_schedule-to_ext_fixed = ls_file-fixed。

附加ls_schedule至lt_schedule。

ENDLOOP。

ls_gen_aprm-simversion ='000'。

通话功能'/SAPAPO/DM_PO_CHANGE'

导出

is_gen_params = ls_gen_parm

it_schedule = lt_schedule

导入

et_rc = lt_rc

et_sched_failures = lt_schd_fail

例外情况

lc_connect_failed = 1

lc_com_error = 2

lc_appl_error = 3

其他= 4。

我得到sy-subrc ='3'。

我想在这里添加的一件事是

我正在使用以下方法-

/SAPAPO/CMDS_TPSRC_GET-通过从文件传递EBELN来获取BZQID。

/SAPAPO/PWB_BZQID_GET_ORDER-通过传递从先前FM和IV_ORDER_TYPE ='16'接收的BZQID来获取结构ES_ORDKEY中的ORDERID。

如果我将iv_order_type传递为" 16"(用于调度协议),那么我会在FM/SAPPO/DM_PO_READ中获得日程表行的详细信息,但是如果我将iv_order_type传递为" 17"(发布计划),那么我将在FM/SAPAPO中获得发布日程表/DM_PO_READ。 类型" 16"的ORDERID与类型" 17"的ORDERID不同。

一旦我删除了订单类型" 16"的计划行,那么我就没有获得类型" 16"的订单号,而是只获得了订单类型" 17"的详细信息。

如果这是我无法添加新计划行的原因,那么有人可以建议一种更好的方法吗? 如何使用FM/Class方法删除旧的计划行并创建新的计划行?

致谢

Yayati Ekbote

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

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


专家您好,

我需要删除旧的计划行并通过文件创建新的计划行。 我当时正在调频/SAPAPO/DM_PO_CHANGE。

当传递参数'Method'='D'" D进行删除时,计划行将通过FM删除。

但是,当我将文件参数映射到FM/SAPAPO/DM_PO_CHANGE的it_schedule参数时,使用" method"参数=" A"(表示添加的A)来创建新的计划行,则得到" LC_APP_ERROR"(sy-subrc = 3)。 我无法理解需要在it_schedule内部表中填充哪些参数才能创建新的计划行。

目前,我的代码如下所示-

<代码>

将lt_file循环到ls_file中。

ls_schedule -method ='A'。 " A代表添加

ls_schedule-orderid = ls_file-orderid。 "通过将ebeln(计划协议编号)转换为orderid来填充

ls_schedule-itemno = ls_file-itemno。

ls_schedule-schedno = ls_file-schedno。


通话功能'/SAPAPO/DATE_CONVERT_TIMESTAMP'

导出

iv_date = ls_file-avl_date

iv_time = sy-uzeit

导入

ev_timestamp = ls_schedule-avail_time。

通话功能'/SAPAPO/DATE_CONVERT_TIMESTAMP'

导出

iv_date = ls_file-ship_date

iv_time = sy-uzeit

导入

ev_timestamp = ls_schedule-gi_end_time。

ls_schedule-to_org_quantity = ls_file-sch_qty。

ls_schedule-to_ext_fixed = ls_file-fixed。

附加ls_schedule至lt_schedule。

ENDLOOP。

ls_gen_aprm-simversion ='000'。

通话功能'/SAPAPO/DM_PO_CHANGE'

导出

is_gen_params = ls_gen_parm

it_schedule = lt_schedule

导入

et_rc = lt_rc

et_sched_failures = lt_schd_fail

例外情况

lc_connect_failed = 1

lc_com_error = 2

lc_appl_error = 3

其他= 4。

我得到sy-subrc ='3'。

我想在这里添加的一件事是

我正在使用以下方法-

/SAPAPO/CMDS_TPSRC_GET-通过从文件传递EBELN来获取BZQID。

/SAPAPO/PWB_BZQID_GET_ORDER-通过传递从先前FM和IV_ORDER_TYPE ='16'接收的BZQID来获取结构ES_ORDKEY中的ORDERID。

如果我将iv_order_type传递为" 16"(用于调度协议),那么我会在FM/SAPPO/DM_PO_READ中获得日程表行的详细信息,但是如果我将iv_order_type传递为" 17"(发布计划),那么我将在FM/SAPAPO中获得发布日程表/DM_PO_READ。 类型" 16"的ORDERID与类型" 17"的ORDERID不同。

一旦我删除了订单类型" 16"的计划行,那么我就没有获得类型" 16"的订单号,而是只获得了订单类型" 17"的详细信息。

如果这是我无法添加新计划行的原因,那么有人可以建议一种更好的方法吗? 如何使用FM/Class方法删除旧的计划行并创建新的计划行?

致谢

Yayati Ekbote

付费偷看设置
发送
3条回答
风早神人
1楼 · 2020-08-23 02:00.采纳回答

专家您好,

我找到了一种创建计划行的方法。

<代码>

将lt_file放到ls_file中。

CALL FUNCTION'/SAPAPO/RRP_SOURCES_GET'

导出

iv_pegid = lv_pegid"以前是使用产品和位置找到的

iv_quantity = ls_file-sch_qty

iv_reqdat = ls_file-reqdat

iv_dialog = abap_false

iv_buffer_flg = abap_true

iv_order_create = abap_true

导入

et_source = lt_source

et_sources_valid = lt_src_vld

例外情况

user_canceled = 1

not_qualified = 2

unknown_error = 3

其他= 4。

使用键ebeln = ls_file-ebeln将表lt_src_vld读入数据(ls_src_vld)

ebelp = ls_file-itmno。

如果sy-subrc是INITIAL AND

ls_src_vld不是初始化的。

使用键trpid = ls_src_vld-trpid读取表lt_source到DATA(ls_src)中。

如果sy-subrc是INITIAL AND

ls_src不是INITIAL。

CALL FUNCTION'/SAPAPO/RRP_ORDER_CREATE'

导出

iv_pegid = lv_pegid

iv_quantity = ls_file-sch_qty

iv_scrap = 0

iv_rqmtti = lv_reqtti"日期已转换为时间戳记

iv_startti = lv_strtti"日期已转换为时间戳记

iv_firmed = abap_true

iv_priority = 0

is_source = ls_src

iv_application = lv_app

iv_dialog = abap_false

导入

ev_ordid = ls_srec-ordid

ev_schedid = ls_srec-schedid

ev_ordno = ls_srec-ordno

ev_position_no = ls_srec-posno

ev_line_no = ls_srec-linno

ev_subrc = ls_srec-subrc

ev_actid = ls_srec-actid

ev_io_time = ls_srec-iotim

ev_ippe_id = ls_srec-ippeid

ev_no_inputs = ls_srec-ipno


APPEND将ls_rec转到lt_rec。

清除ls_rec。

ENDLOOP。

在lt_rec INTO ls_rec中将LOOP AT定位到子订阅NE 0。

lv_fail = abap_true。

ENDLOOP。

如果lv_fail均衡器abap_false。

提交工作。

ENDIF。

但是,即使我确实提交工作,新创建的计划行也不会保存到系统中。

请让我知道我想念的东西。

我怀疑某些全局缓冲区表没有被填充。

如果是这种情况,谁能让我知道怎么做?

此致

Yayati Ekbote

微wx笑
2楼-- · 2020-08-23 02:02

已解决。 我使用了/SAPAPO/CL_TDL_LC_DS_DAO类的方法。

顺序使用的方法-

/SCMB/IF_TDL_DAO_GENERAL〜INIT

/SCMB/IF_TDL_DELIVERYSCHEDULE〜SET

/SCMB/IF_TDL_DAO_GENERAL〜SAVE_TO_DB

谢谢!

浮生未央
3楼-- · 2020-08-23 02:11

尊敬的先生,晚上好。 我想从记录集中删除某些记录。 我通过参考您的演示进行了尝试,但是我删除了该集中的所有记录,而不是其中的一些记录。 我很困惑,因为我找不到原因。 您能帮我看看我的代码在哪里吗?

代码附在下面:

创建对象zob_dao_ds。

LS_PARAM-PARAM ='USE_SIMSESSION'。
LS_PARAM-VALUE ='-'。
将LS_PARAM附加到LT_PARAM。
清除LS_PARAM。


LS_PARAM-PARAM ='VERSION_ID'。
LS_PARAM-VALUE ='000'。
将LS_PARAM追加到LT_PARAM。
清除LS_PARAM。

尝试。
调用方法ZOB_DAO_DS->/scmb/if_tdl_dao_general〜init
导出
it_init_paramtab = LT_PARAM。

捕获/scmb/cx_tdl_dao。
尝试。


清除lv_msg。
尝试。
调用方法ZOB_DAO_DS- >/SCMB/IF_TDL_DELIVERYSCHEDULE〜GET
导出
IV_VRSIOID ='000'
IT_ORDID = LT_ORDID
IT_MATIDLOCID = LT_MATID
* IT_SELPARAMS =
* IV_BUFFER_CTRL =/SCMB/CL
* IV_LOCKFLAG = ABAP_FALSE
导入
ET_ORDER = lt_order
更改
CV_MSGTY = lv_msg
CT_RETURN = lt_return。
捕获/SCMB/CX_TDL_DAO。
ENDTRY。 >

数据LV_ITEMNO类型/SCMB/TDL_DELPS。
数据LV_NO TYPE/SCMB/TDL_RLINE。
数据LS_NO类型/SCMB/TDL_RLINE。
数据LT_NO TYPE标准。/SCMB/TDL_RLINE的表。
*数据ls_item类型/SCMB/TDL_DS_SDL_STR。




清除LV_TABIX。

如果LT_ORDER []不初始化 。

将LT_ORDER放入US_ORDER中。

LS_ORDER-ORDNO = US_ORDER-ORDNO。
LS_ORDER-ITEMNO = US_ORDER-ITEMNO。
LS_ORDER-VRSIOID = US_ORDER-VRSIOID。< br> LS_ORDER-ORDID = US_ORDER-ORDID。
LS_ORDER-LOCIDFROM = US_ORDER-LOCIDFROM。
LS_ORDER-BZQID = US_ORDER-BZQID。
LS_ORDER-TRPID = US_ORDER-TRPID = LTO US_ORDER-LOCIDTO。
LS_ORDER-MATID = US_ORDER-MATID。
LS_ORDER-APPRVL_STATE = US_ORDER-APPRVL_STATE。
LS_ORDER-NOTE_EXISTS = US_ORDER-NOTE_EXISTS。




LV_ITEMNO。

LV_ITEMNO = US_ORDER-ITEMNO。

在GT_IO处循环ORDNO = US_ORDER-ORDNO AND
POSITION_NO = LV_ITEMNO。


调用功能'CONVERSION_EXIT_ALPHA_IN >导出
输入= GT_IO-LINE_NO
导入
输出= GT_IO-LINE_NO




清除LV_NO。
LV_NO = GT_IO-LINE_N O.

用键SCHEDNO = LV_NO。
IF SY-SUBRC = 0读取表US_ORDER-ITEM分配
LS_ITEM-SDLID = -SDLID。
LS_ITEM -BUYTYPE_CODE = -BUYTYPE_CODE。
LS_ITEM-SUPPLIER_BUYTYPE_CODE = -SUPPLIER_BUYTYPE_CODE。
LS_ITEM-ORIGQTY = -ORIGQTY。
LS_ITEM-RECQTY =。 > LS_ITEM-OPENQTY = -OPENQTY。
LS_ITEM-OPENQTY = -OPENQTY。
LS_ITEM-AVAIL_TIME = -AVAIL_TIME。
LS_ITEM-GR_TIME = -GR_
LS_ITEM-GI_TIME = -GI_TIME。
LS_ITEM-TTYPE = -TTYPE。
LS_ITEM-FIXED = -FIXED。
LS_ITEM-FROM_CAT = - FROM_CAT。
LS_ITEM-TO_CAT = -TO_CAT。


LS_ITEM-SCHEDNO = LV_NO。
将LS_ITEM追加到LS_ORDER-ITEM。
ELSE。
继续。
ENDIF。
CLEAR LS_ITEM。
CLEAR GT_IO。
ENDLOOP。

将LS_ORDER追加到UT_ORDER。
CLEAR LS_ORDER。
CLEAR US_ORDER。

> ENDLOOP。


ENDIF。

如果是Ut_o rder不是INITIAL。

TRY。
呼叫方法ZOB_DAO_DS->/SCMB/IF_TDL_DELIVERYSCHEDULE〜SET
EXPORTING
IV_VRSIOID ='000'
IT_ORDER = Ut_order
CHANGING < br> * CV_MSGTY =
CT_RETURN = ut_return。

CATCH/SCMB/CX_TDL_DAO。
ENDTRY。
ENDIF。


TRY。
致电 方法ZOB_DAO_DS->/SCMB/IF_TDL_DELIVERYSCHEDULE〜DELETE
导出
IV_VRSIOID ='000'
IT_ORDID = lt_ORDID
CHANGING
* CV_MSGTY =
CT_RETURN = UT_RETURN。 SCMB/CX_TDL_DAO。
ENDTRY。





TRY。
呼叫方法ZOB_DAO_DS->/SCMB/IF_TDL_DAO_GENERAL〜SAVE_TO_DB
更改
* CV_MSGTY =
CT_RETURN = LT_RETTAB。

捕捉/SCMB/CX_TDL_DAO。回滚工作。
ENDTRY。


TRY。
呼叫方法ZOB_DAO_DS->/SCMB/IF_TDL_DAO_GENERAL〜FREE

捕捉/SCMB/CX_TDL_DAO。
回滚工作。
ENDTRY。

非常感谢您的帮助。 期待您的回音。

最好的问候!

艾米莉。

一周热门 更多>