因某些原因,导致一些数据没有从ERP传到CRM。
R3AR2中定义客户,物料,或者价格等的请求。
然后修改R3AR4程序:
REPORT zcrm_bdoc_batch_start MESSAGE-ID smof. INCLUDE smofdirekt. *--------------------------------------------------------------------- * Table definitions *--------------------------------------------------------------------- TABLES: smofrqhd, smofrqdt, smoftables, smofreqtab, smofreltab, smohsiteid. *--------------------------------------------------------------------- * Selection parameters *--------------------------------------------------------------------- SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE text-001. SELECT-OPTIONS: s_reqnam FOR smofrqhd-reqname OBLIGATORY. SELECT-OPTIONS:s_para FOR smofrqdt-low. SELECTION-SCREEN END OF BLOCK block1. SELECTION-SCREEN BEGIN OF BLOCK block5 WITH FRAME TITLE text-005. "'Dataflow'(005). SELECT-OPTIONS: s_sname FOR smohsiteid-site_name NO-EXTENSION NO INTERVALS, s_dname FOR smohsiteid-site_name NO-EXTENSION NO INTERVALS. SELECTION-SCREEN END OF BLOCK block5. PARAMETER p_nodia TYPE c DEFAULT ''."NO-DISPLAY. *--------------------------------------------------------------------- * Internal tables and variables *--------------------------------------------------------------------- DATA: lt_reqname TYPE TABLE OF rsdsselopt, ls_reqname TYPE rsdsselopt, lt_dynpfields TYPE TABLE OF dynpread, ls_dynpfields TYPE dynpread, lt_smofrqhd TYPE TABLE OF smofrqhd, lv_smofrqhd TYPE smofrqhd, lv_smofinicon TYPE smofinicon. DATA: lv_status LIKE crm_para-status_ext, lv_smofreqhd LIKE smofreqhd, lv_sstid TYPE smo_siteid, lv_dstid TYPE smo_siteid, lv_ssttypeid TYPE smw1stid, lv_dsttypeid TYPE smw1stid. INITIALIZATION. AUTHORITY-CHECK OBJECT 'CMW_CRMADP' ID 'ACTVT' FIELD '03'. IF sy-subrc <> 0. MESSAGE e172(00) WITH 'R3AR4'. ENDIF. *--------------------------------------------------------------------- * MAIN PROCESSING *--------------------------------------------------------------------- START-OF-SELECTION. AUTHORITY-CHECK OBJECT 'CMW_CRMADP' ID 'ACTVT' FIELD '16'. IF sy-subrc <> 0. MESSAGE e825(01). ENDIF. * initial checks IF s_sname IS INITIAL OR s_dname IS INITIAL. MESSAGE s170(smof). RETURN. ENDIF. * for some reason, s_reqnam can have one entry too much IF NOT s_reqnam-high IS INITIAL. READ TABLE s_reqnam WITH KEY option = 'EQ'. IF sy-subrc = 0. DELETE s_reqnam INDEX sy-tabix. ENDIF. ENDIF. * get SiteID-GUIDs based on Name IF lv_sstid IS INITIAL. PERFORM lv_tid_determine USING s_sname-low CHANGING lv_sstid lv_ssttypeid. ENDIF. IF lv_dstid IS INITIAL. PERFORM lv_tid_determine USING s_dname-low CHANGING lv_dstid lv_dsttypeid. ENDIF. * Fill structure lt_reqname for function module call SELECT * INTO TABLE lt_smofrqhd FROM smofrqhd "#EC CI_SGLSELECT WHERE reqname IN s_reqnam AND inactive = ''. IF sy-subrc <> 0. MESSAGE s153(smof). RETURN. ENDIF. * check, if Sites entered are valid for all objects LOOP AT lt_smofrqhd INTO lv_smofrqhd. SELECT SINGLE * FROM smofinicon INTO lv_smofinicon WHERE objname = lv_smofrqhd-objname AND sourcestid = lv_ssttypeid AND targetstid = lv_dsttypeid. IF sy-subrc <> 0. IF lv_smofrqhd-reqname = s_reqnam-low OR lv_smofrqhd-reqname = s_reqnam-high. * No entry found - stop it! MESSAGE s170(smof). RETURN. ELSE. * exclude this entry since it does not match Sites DELETE TABLE lt_smofrqhd FROM lv_smofrqhd. ENDIF. ENDIF. ENDLOOP. READ TABLE lt_smofrqhd INTO lv_smofrqhd INDEX 1. IF sy-subrc = 0. LOOP AT s_para. CHECK s_para-low IS NOT INITIAL. UPDATE smofrqdt SET low = s_para-low WHERE reqkey = lv_smofrqhd-reqkey. COMMIT WORK. CALL FUNCTION 'SMOF_START_DOWNLOAD_OR_REQUEST' EXPORTING i_source_site_id = lv_sstid i_target_site_id = lv_dstid i_function = 'R' i_no_dialog = p_nodia IMPORTING e_status = lv_status TABLES t_smofrqhd = lt_smofrqhd. ENDLOOP. ENDIF. * Information messages IF NOT lv_status IS INITIAL. MESSAGE s024(smof). ELSE. MESSAGE s031(smof) WITH 'REQUEST'. ENDIF. AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_reqnam-low. PERFORM f4_help_object USING 'LOW'. AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_reqnam-high. PERFORM f4_help_object USING 'HIGH'. AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_sname-low. PERFORM s_sname_low_select. AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_dname-low. PERFORM s_dname_low_select. AT SELECTION-SCREEN ON s_reqnam. PERFORM propose_site_ids. *----------------------------------------------------------------------* *& Form F4_HELP_OBJECT *&---------------------------------------------------------------------* FORM f4_help_object USING p_low_or_high. DATA: fi LIKE dfies OCCURS 0 WITH HEADER LINE, lt_smofrqhd TYPE TABLE OF smofrqhd, ls_smofrqhd TYPE smofrqhd. DATA: BEGIN OF int_funcs OCCURS 0, reqname LIKE smofrqhd-reqname, objname LIKE smofrqhd-objname, objclass LIKE smofrqhd-objclass, END OF int_funcs. DATA: ind LIKE sy-index. DATA: lt_ddshretval TYPE TABLE OF ddshretval, lv_ddshretval TYPE ddshretval. DATA: l_charsize TYPE i. * Key field in F4 help CALL FUNCTION 'DDIF_FIELDINFO_GET' EXPORTING tabname = 'SMOFRQHD' TABLES dfies_tab = fi. * Unicode system? CALL FUNCTION 'CRM_UC_SYSTEM_CHECK' IMPORTING * E_IS_UC_SYSTEM = e_charsize = l_charsize. LOOP AT fi. CASE fi-fieldname. WHEN 'REQNAME'. fi-offset = 0 * l_charsize. MODIFY fi. WHEN 'OBJNAME'. fi-offset = 15 * l_charsize. MODIFY fi. WHEN 'OBJCLASS'. fi-offset = 30 * l_charsize. MODIFY fi. WHEN OTHERS. DELETE fi. ENDCASE. ENDLOOP. IF p_low_or_high = 'LOW'. ls_dynpfields-fieldname = 'S_REQNAM-LOW'. ELSE. ls_dynpfields-fieldname = 'S_REQNAM-HIGH'. ENDIF. APPEND ls_dynpfields TO lt_dynpfields. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-cprog dynumb = sy-dynnr TABLES dynpfields = lt_dynpfields EXCEPTIONS OTHERS = 1. READ TABLE lt_dynpfields INTO ls_dynpfields INDEX 1. REFRESH lt_dynpfields. IF ls_dynpfields-fieldvalue CA '*+'. REPLACE ALL OCCURRENCES OF '*' IN ls_dynpfields-fieldvalue WITH '%'. REPLACE ALL OCCURRENCES OF '+' IN ls_dynpfields-fieldvalue WITH '_'. ENDIF. SET LOCALE LANGUAGE sy-langu. "#EC TRANSLANG TRANSLATE ls_dynpfields-fieldvalue TO UPPER CASE. IF NOT ls_dynpfields-fieldvalue IS INITIAL. * select Object from SMOFOJBECT SELECT * INTO TABLE lt_smofrqhd "#EC CI_SGLSELECT FROM smofrqhd WHERE reqname LIKE ls_dynpfields-fieldvalue AND inactive = ''. ELSE. * select Object from SMOFOJBECT SELECT * INTO TABLE lt_smofrqhd "#EC CI_SGLSELECT FROM smofrqhd WHERE inactive = ''. ENDIF. LOOP AT lt_smofrqhd INTO ls_smofrqhd. int_funcs-reqname = ls_smofrqhd-reqname. int_funcs-objname = ls_smofrqhd-objname. int_funcs-objclass = ls_smofrqhd-objclass. COLLECT int_funcs. ENDLOOP. CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST' EXPORTING retfield = 'REQNAME' value_org = 'S' TABLES value_tab = int_funcs field_tab = fi return_tab = lt_ddshretval EXCEPTIONS parameter_error = 1 no_values_found = 2 OTHERS = 3. IF sy-subrc <> 0. ENDIF. READ TABLE lt_ddshretval INTO lv_ddshretval INDEX 1. CLEAR lt_dynpfields. IF p_low_or_high = 'LOW'. MOVE 'S_REQNAM-LOW' TO ls_dynpfields-fieldname. ELSE. MOVE 'S_REQNAM-HIGH' TO ls_dynpfields-fieldname. ENDIF. MOVE lv_ddshretval-fieldval TO ls_dynpfields-fieldvalue. APPEND ls_dynpfields TO lt_dynpfields. CALL FUNCTION 'DYNP_VALUES_UPDATE' EXPORTING dyname = sy-cprog dynumb = sy-dynnr TABLES dynpfields = lt_dynpfields EXCEPTIONS invalid_abapworkarea = 1 invalid_dynprofield = 2 invalid_dynproname = 3 invalid_dynpronummer = 4 invalid_request = 5 no_fielddescription = 6 undefind_error = 7 OTHERS = 8. ENDFORM. "F4_HELP_OBJECT *&---------------------------------------------------------------------* *& Form possible_dataflows_for_initdnl *&---------------------------------------------------------------------* FORM possible_dataflows_for_initdnl TABLES pto_smofinicon STRUCTURE smofinicon. DATA lv_msa_active TYPE cmwcdt_smwact. CALL FUNCTION 'SMOF_READ_SMOFAPPL' EXPORTING i_check_active_sync_appl = 'X' IMPORTING e_sync_active = lv_msa_active. REFRESH pto_smofinicon. SELECT * FROM smofinicon INTO TABLE pto_smofinicon. IF lv_msa_active IS INITIAL. DELETE pto_smofinicon WHERE sourcestid EQ 'CDB'. DELETE pto_smofinicon WHERE targetstid EQ 'CDB'. ENDIF. ENDFORM. " possible_dataflows_for_initdnlFORM *&---------------------------------------------------------------------* *& Form f4_choose_siteid *&---------------------------------------------------------------------* FORM f4_choose_siteid USING pu_selopt LIKE rsdsselopt VALUE(pu_fieldname) pv_sstid TYPE smo_siteid pv_dstid TYPE smo_siteid pv_sstype TYPE smw1stid pv_dstype TYPE smw1stid. DATA: lt_f4_fields LIKE help_value OCCURS 0 WITH HEADER LINE, lt_smofinicon LIKE smofinicon OCCURS 0 WITH HEADER LINE, lv_index LIKE sy-index, lv_fieldname(30) TYPE c, lt_dynpfields LIKE dynpread OCCURS 0 WITH HEADER LINE. TYPES: BEGIN OF f4_values, site_id LIKE siteselect-site_id, site_name LIKE siteselect-site_name, sitetypeid LIKE siteselect-sitetypeid, END OF f4_values, BEGIN OF f4_values_display, site_name LIKE siteselect-site_name, sitetypeid LIKE siteselect-sitetypeid, END OF f4_values_display. DATA: lt_f4_values TYPE TABLE OF f4_values, ls_f4_values TYPE f4_values, lt_f4_values_display TYPE TABLE OF f4_values_display, ls_f4_values_display TYPE f4_values_display. * Key field in F4 help REFRESH lt_f4_fields. lt_f4_fields-selectflag = 'X'. lt_f4_fields-tabname = 'SITESELECT'. lt_f4_fields-fieldname = 'SITE_NAME'. APPEND lt_f4_fields. * select possible data flows PERFORM possible_dataflows_for_initdnl TABLES lt_smofinicon. SHIFT pu_selopt LEFT DELETING LEADING space. IF pu_selopt CA '*+'. REPLACE ALL OCCURRENCES OF '*' IN pu_selopt WITH '%'. REPLACE ALL OCCURRENCES OF '+' IN pu_selopt WITH '_'. ENDIF. SET LOCALE LANGUAGE sy-langu. TRANSLATE pu_selopt TO UPPER CASE. "#EC TRANSLANG * Select possible Sites (dependend on possible data flows) IF pu_fieldname EQ 'S_SNAME'. IF NOT pu_selopt IS INITIAL. SELECT site_id site_name sitetypeid FROM siteselect INTO CORRESPONDING FIELDS OF TABLE lt_f4_values FOR ALL ENTRIES IN lt_smofinicon WHERE sitetypeid EQ lt_smofinicon-sourcestid AND site_name LIKE pu_selopt. ELSE. SELECT site_id site_name sitetypeid FROM siteselect INTO CORRESPONDING FIELDS OF TABLE lt_f4_values FOR ALL ENTRIES IN lt_smofinicon WHERE sitetypeid EQ lt_smofinicon-sourcestid. ENDIF. ELSE. IF NOT pu_selopt IS INITIAL. SELECT site_id site_name sitetypeid FROM all_sites INTO CORRESPONDING FIELDS OF TABLE lt_f4_values FOR ALL ENTRIES IN lt_smofinicon WHERE sitetypeid EQ lt_smofinicon-targetstid AND site_name LIKE pu_selopt. ELSE. SELECT site_id site_name sitetypeid FROM all_sites INTO CORRESPONDING FIELDS OF TABLE lt_f4_values FOR ALL ENTRIES IN lt_smofinicon WHERE sitetypeid EQ lt_smofinicon-targetstid. ENDIF. ENDIF. * prepare display-table LOOP AT lt_f4_values INTO ls_f4_values. MOVE-CORRESPONDING ls_f4_values TO ls_f4_values_display. APPEND ls_f4_values_display TO lt_f4_values_display. ENDLOOP. * Display help dialog CALL FUNCTION 'HELP_VALUES_GET_NO_DD_NAME' EXPORTING selectfield = 'SITE_NAME' IMPORTING ind = lv_index TABLES fields = lt_f4_fields full_table = lt_f4_values_display EXCEPTIONS full_table_empty = 1 no_tablestructure_given = 2 no_tablefields_in_dictionary = 3 more_then_one_selectfield = 4 no_selectfield = 5 OTHERS = 6. * Fill report parameter fields READ TABLE lt_f4_values INTO ls_f4_values INDEX lv_index. CLEAR lt_dynpfields. REFRESH lt_dynpfields. MOVE pu_fieldname TO lv_fieldname. CONCATENATE lv_fieldname '-LOW' INTO lv_fieldname. MOVE lv_fieldname TO lt_dynpfields-fieldname. MOVE ls_f4_values-site_name TO lt_dynpfields-fieldvalue. APPEND lt_dynpfields. IF pu_fieldname EQ 'S_SNAME'. MOVE 'S_SSTID-LOW' TO lt_dynpfields-fieldname. MOVE ls_f4_values-site_id TO pv_sstid. MOVE ls_f4_values-site_name TO s_sname-low. MOVE ls_f4_values-sitetypeid TO pv_sstype. ELSE. MOVE 'S_DSTID-LOW' TO lt_dynpfields-fieldname. MOVE ls_f4_values-site_id TO pv_dstid. MOVE ls_f4_values-site_name TO s_dname-low. MOVE ls_f4_values-sitetypeid TO pv_dstype. ENDIF. APPEND lt_dynpfields. CALL FUNCTION 'DYNP_VALUES_UPDATE' EXPORTING dyname = sy-cprog dynumb = sy-dynnr TABLES dynpfields = lt_dynpfields EXCEPTIONS invalid_abapworkarea = 1 invalid_dynprofield = 2 invalid_dynproname = 3 invalid_dynpronummer = 4 invalid_request = 5 no_fielddescription = 6 undefind_error = 7 OTHERS = 8. * ENDFORM. "f4_choose_siteid *&---------------------------------------------------------------------* *& Form lv_tid_determine *&---------------------------------------------------------------------* FORM lv_tid_determine USING pv_sname CHANGING pv_sstid pv_ssttypeid. DATA: lt_siteselect TYPE TABLE OF all_sites, ls_siteselect TYPE all_sites. SELECT * INTO TABLE lt_siteselect FROM all_sites WHERE site_name = pv_sname. READ TABLE lt_siteselect INTO ls_siteselect INDEX 1. IF sy-subrc = 0. pv_sstid = ls_siteselect-site_id. pv_ssttypeid = ls_siteselect-sitetypeid. ELSE. CLEAR: pv_sstid. ENDIF. ENDFORM. "lv_tid_determine *&---------------------------------------------------------------------* *& Form s_sname_low_select *&---------------------------------------------------------------------* FORM s_sname_low_select . DATA lv_selopt LIKE rsdsselopt VALUE IS INITIAL. REFRESH lt_dynpfields. CLEAR: ls_dynpfields. MOVE 'S_SNAME-LOW' TO ls_dynpfields-fieldname. APPEND ls_dynpfields TO lt_dynpfields. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-cprog dynumb = sy-dynnr TABLES dynpfields = lt_dynpfields EXCEPTIONS invalid_abapworkarea = 1 invalid_dynprofield = 2 invalid_dynproname = 3 invalid_dynpronummer = 4 invalid_request = 5 no_fielddescription = 6 invalid_parameter = 7 undefind_error = 8 double_conversion = 9 OTHERS = 10. READ TABLE lt_dynpfields INTO ls_dynpfields INDEX 1. lv_selopt-low = ls_dynpfields-fieldvalue. PERFORM f4_choose_siteid USING lv_selopt 'S_SNAME' lv_sstid lv_dstid lv_ssttypeid lv_dsttypeid. ENDFORM. " s_sname_low_select *&---------------------------------------------------------------------* *& Form s_dname_low_select *&---------------------------------------------------------------------* FORM s_dname_low_select . DATA lv_selopt LIKE rsdsselopt VALUE IS INITIAL. REFRESH lt_dynpfields. CLEAR lt_dynpfields. MOVE 'S_DNAME-LOW' TO ls_dynpfields-fieldname. APPEND ls_dynpfields TO lt_dynpfields. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING dyname = sy-cprog dynumb = sy-dynnr TABLES dynpfields = lt_dynpfields EXCEPTIONS invalid_abapworkarea = 1 invalid_dynprofield = 2 invalid_dynproname = 3 invalid_dynpronummer = 4 invalid_request = 5 no_fielddescription = 6 invalid_parameter = 7 undefind_error = 8 double_conversion = 9 OTHERS = 10. READ TABLE lt_dynpfields INTO ls_dynpfields INDEX 1. lv_selopt-low = ls_dynpfields-fieldvalue. PERFORM f4_choose_siteid USING lv_selopt 'S_DNAME' lv_sstid lv_dstid lv_ssttypeid lv_dsttypeid. ENDFORM. " s_dname_low_select *&---------------------------------------------------------------------* *& Form propose_site_ids *&---------------------------------------------------------------------* FORM propose_site_ids . DATA: lt_smofinicon TYPE TABLE OF smofinicon, lt_smofinicon_copy TYPE TABLE OF smofinicon, ls_smofinicon TYPE smofinicon, ls_siteselect TYPE siteselect, lt_smofrqhd TYPE TABLE OF smofrqhd, ls_smofrqhd TYPE smofrqhd, lv_lines TYPE sytabix, lv_msa_active TYPE cmwcdt_smwact. * initial checks - Proposal makes only sense if one request object is * entered DESCRIBE TABLE s_reqnam LINES lv_lines. CHECK lv_lines = 1. CHECK s_reqnam-option = 'EQ' AND s_reqnam-high = space. * first determine object name SELECT * INTO TABLE lt_smofrqhd FROM smofrqhd "#EC CI_SGLSELECT WHERE reqname IN s_reqnam AND inactive = ''. IF sy-subrc <> 0. MESSAGE s153(smof). ENDIF. DESCRIBE TABLE lt_smofrqhd LINES lv_lines. CHECK lv_lines = 1. READ TABLE lt_smofrqhd INTO ls_smofrqhd INDEX 1. * Based on object name read flow context SELECT * INTO TABLE lt_smofinicon_copy FROM smofinicon WHERE objname = ls_smofrqhd-objname. CALL FUNCTION 'SMOF_READ_SMOFAPPL' EXPORTING i_check_active_sync_appl = 'X' IMPORTING e_sync_active = lv_msa_active. IF lv_msa_active IS INITIAL. DELETE lt_smofinicon WHERE sourcestid EQ 'CDB'. DELETE lt_smofinicon WHERE targetstid EQ 'CDB'. ENDIF. * Automatic fill of source site name IF s_sname-low IS INITIAL. lt_smofinicon[] = lt_smofinicon_copy[]. " How many objects are still possible ? SORT lt_smofinicon BY sourcestid. DELETE ADJACENT DUPLICATES FROM lt_smofinicon COMPARING sourcestid. DESCRIBE TABLE lt_smofinicon LINES lv_lines. IF lv_lines EQ 1. " take over the only possibility READ TABLE lt_smofinicon INTO ls_smofinicon INDEX 1. SELECT * FROM siteselect INTO ls_siteselect WHERE sitetypeid EQ ls_smofinicon-sourcestid. ENDSELECT. IF sy-dbcnt EQ 1. MOVE ls_siteselect-site_name TO s_sname-low. ENDIF. ENDIF. ENDIF. * Automatic fill of destination site name IF s_dname-low IS INITIAL . lt_smofinicon[] = lt_smofinicon_copy[]. SORT lt_smofinicon BY sourcestid. DELETE ADJACENT DUPLICATES FROM lt_smofinicon COMPARING targetstid. DESCRIBE TABLE lt_smofinicon LINES lv_lines. IF lv_lines EQ 1. " take over the only possibility READ TABLE lt_smofinicon INTO ls_smofinicon INDEX 1. SELECT * FROM siteselect INTO ls_siteselect WHERE sitetypeid EQ ls_smofinicon-targetstid. ENDSELECT. IF sy-dbcnt EQ 1. MOVE ls_siteselect-site_name TO s_dname-low. ENDIF. ENDIF. ENDIF. ENDFORM. " propose_site_idsZCRM_BDOC_BATCH_START
运行程序时,先选择请求名称,然后输入批量的客户编码,物料号等。
SMW01查看结果:
标签:抽取,f4,端自,lv,lt,ls,dynpfields,smofinicon,CRM From: https://www.cnblogs.com/sapSB/p/18073339