Skip to Content
author's profile photo Former Member
Former Member

IDOCS : Production orders and order receipt

Hi

We have a extenal non-SAP warehouse system. When production order P123 has been created, i want to send this order to this external system via some message. As soon as the items on these production order get of the production line, i want to send a message to SAP and confirm or do a production order receipt on this Order 123.

I've setup the ALE RFC connection between these two systems.

I need to know how to do the followning.

1. How do i configure the system to send outbound Production order idocs to an external system.

2.How should i setup the SAP system to receive the inbound confirmation of this order.

Add a comment
10|10000 characters needed characters exceeded

Assigned Tags

Related questions

10 Answers

  • Best Answer
    Posted on May 16, 2006 at 04:25 PM

    Attach an output type for the production order transaction through the transaction NACE, for communication method ALE/EDI.

    Regards,

    Ravi

    Add a comment
    10|10000 characters needed characters exceeded

  • Posted on May 16, 2006 at 08:27 PM

    Hi Giovanni,

    You can use this program <b>RBDSEMAT</b> or execute t/code <b>BD10</b> to send material master.

    Again you can use the same above approaches or using change pointer (I need to confirm).

    Hope this will help.

    Regards,

    Ferry Lianto

    Please reward points if helpful.

    Add a comment
    10|10000 characters needed characters exceeded

    • Former Member

      Ferry

      How will the external system know what IDOC type it is if all the creations and changes to/of master data and transactional data will be mixed in a sequence .

      eg.
      idoc 1 material master create
      idoc 2 Production order create
      idoc 3 Vendor master create

  • author's profile photo Former Member
    Former Member
    Posted on May 16, 2006 at 04:57 PM

    Ravi

    To which application do i have to use. I don't see production order.

    Add a comment
    10|10000 characters needed characters exceeded

  • author's profile photo Former Member
    Former Member
    Posted on May 16, 2006 at 05:41 PM

    Hi ,

    To configure the system for the outbound idocs. You need to do the following .

    1. Set up the logical systems.

    2. set up the rfc destination /SM59

    3. Assign ports to the rfc destination. /WE21

    4. Set up partner profiles . /we20

    5. Distribute the logical system to the non- sap sustem. /BD64

    You should be all set . Do let me know if you are looking for anything specific .

    Thanks

    Hari

    Add a comment
    10|10000 characters needed characters exceeded

  • Posted on May 16, 2006 at 06:29 PM

    Hi Giovanni,

    NACE will NOT work for production order IDoc.

    You need to do the following steps.

    1. Setup ALE distribution model (BD64) for message type <b>LOIPRO</b> and IDoc type <b>LOIPRO01</b>.

    2. Setup the partner profile (t/code WE20) for message type <b>LOIPRO</b> and IDoc type <b>LOIPRO01</b>.

    3. Use transaction code <b>POIT</b> or execute standard SAP program <b>RCCLTRAN</b> to generate production order IDocs and send to other SAP system.

    Hope this will help.

    Regards,

    Ferry Lianto

    Please reward points if helpful.

    Add a comment
    10|10000 characters needed characters exceeded

  • author's profile photo Former Member
    Former Member
    Posted on May 16, 2006 at 06:51 PM

    Ferry

    This is mass creation of idocs. How can i ensure that only when a Production order are created that one idoc are send?

    Add a comment
    10|10000 characters needed characters exceeded

  • Posted on May 16, 2006 at 07:20 PM

    Hi Giovanni,

    If you do not want to generate mass creation of IDoc,

    you can use this standard program <b>RCCLORD</b> to generate production order IDoc based on individual production order.

    Hope this will help.

    Regards,

    Ferry Lianto

    Please reward points if helpful.

    Add a comment
    10|10000 characters needed characters exceeded

    • Former Member

      Hi

      I'm struggeling with program RCCLORD.

      When it run for a second time immediately after a sucessfull export with the same paramaters it does not generate the IDOCS.

      Is there some sort of buffer or something that prohibits it to execute immediately.

      If i use RCCLTRAN which calls RCCLORD it works every time i execute RCCLTRAN.

  • Posted on May 16, 2006 at 08:06 PM

    Hi Giovanni,

    If you want to generate IDoc during saving production order, you can use this user exits <b>EXIT_SAPLCOZV_001</b> (Exit when saving production order).

    In this user exits, you can submit program RCCLORD by passing the production order number. Please test to ensure the production order has been saved in database prior to submit program.

    If you do not need alomost real time, you can write a custom program to collect new production order created (let's say today) and call program RCCLORD by passing the production order number to generate IDocs.

    Again hope this will help.

    Regards,

    Ferry Lianto

    Please reward points if helpful.

    Add a comment
    10|10000 characters needed characters exceeded

  • Posted on May 16, 2006 at 08:56 PM

    Hi Giovanni,

    I am pretty sure (I can not remember on top of my head now) there is an IDoc segment which indicate the status of activity (Create/Change/Delete). Please go through the IDoc documentation for IDoc type (t/code WE60) to find out the exact segment name. Then use this segment as indicator updates for non SAP external system.

    By the way, you can use change pointer for material master IDoc. You need to activate the change pointer (BD52) for MATMAS and specify field name(s) that you want to monitor for changes. Then you can execute t/code BD21 to send the IDoc.

    Hope this will help.

    Regards,

    Ferry Lianto

    Please reward points if helpful.

    Add a comment
    10|10000 characters needed characters exceeded

  • author's profile photo Former Member
    Former Member
    Posted on Dec 04, 2007 at 11:32 AM

    Hi,

    You can check this program:

    *&----


    *

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

    • PROGRAM....... ZRCCLORDPROC

    • TITLE......... Production Odrer Idocs

    • AUTHOR........ Aveek Ghose

    • DATE WRITTEN.. 15/09/2006

    • R/3 RELEASE... 4.6C

    • =====================================================================*

    • COPIED FROM... N/A

    • DESCRIPTION...

    *& Creation of production order IDOCs to a given selection

    *& This program selects to an input given via the selection screen the *

    *& corresponding production orders from the database. Then the function

    *& module for creation of planned order idocs is called. *

    *& In general this report is called from the report RCCLTRAN, but it *

    *& can also be used for its own. *

    • =====================================================================*

    • PROGRAM TYPE.. Outbound Interface

    • DEV. CLASS.... ZPD1

    • LOGICAL DB.... N/A

    • =====================================================================*

    • SCREENS....... N/A

    • GUI TITLE..... N/A

    • GUI STATUS.... N/A

    • TRANSACTIONS.. N/A

    • USER EXITS.... N/A

    • =====================================================================*

    • CHANGE HISTORY *

    • Date By Correction Number & Brief Description Release

    *----


    *

    • Tables / Structures

    *----


    *

    REPORT zrcclordproc

    NO STANDARD PAGE HEADING

    MESSAGE-ID ZCUST

    LINE-COUNT 65(0)

    LINE-SIZE 255.

    • INCLUDE RCORDO01. " PBO-Modules *

    • INCLUDE RCORDI01. " PAI-Modules *

    • INCLUDE RCORDF01. " FORM-Routines *

    • --> Global data

    TYPE-POOLS: cloi.

    include zprodata. "Types / constants for Orderselection

    include zrcordtop. "Tables / Data for this report

    include zrcordtop1.

    • BEGIN OF INSERTION DS001

    include yrccl_constants.

    TABLES : jcds,

    tvarv,

    zzzz_xref_data.

    TYPES: BEGIN OF ty_date,

    aufnr TYPE aufnr,

    aedat TYPE aufaedat,

    aezeit TYPE co_chg_time,

    erdat TYPE auferfdat,

    erfzeit TYPE co_ins_time,

    loekz TYPE aufloekz,

    indicator(1) TYPE c,

    END OF ty_date.

    DATA: is_enhancement type isu_ord_segments_determine.

    DATA: itab_date TYPE STANDARD TABLE OF ty_date

    INITIAL SIZE 0 WITH HEADER LINE.

    DATA: f_objnr TYPE j_objnr.

    DATA: g_report_sub_head(72) TYPE c, "Sub-Header hold area

    g_report_head(72) TYPE c, "Header hold area

    g_run_date(72) TYPE c, "Holds message for Run date

    g_run_time(72) TYPE c. "Holds message for Run time

    DATA:

    f_old_date TYPE datum,

    f_old_time TYPE uzeit,

    f_continue(1) TYPE c.

    • END OF INSERTION DS001

    • --> Überschrift für sonstige Einstellungen

    SELECTION-SCREEN SKIP 2.

    SELECTION-SCREEN BEGIN OF BLOCK miscellaneous WITH FRAME.

    SELECTION-SCREEN SKIP 1.

    SELECTION-SCREEN COMMENT 1(30) text-001. "#EC

    SELECTION-SCREEN SKIP 1.

    *>> Logical system comes from Report RCCLTRANS

    SELECTION-SCREEN BEGIN OF LINE.

    SELECTION-SCREEN COMMENT 3(30) text-002.

    SELECTION-SCREEN POSITION 35.

    PARAMETERS opt_sys LIKE tbdlst-logsys.

    SELECTION-SCREEN END OF LINE.

    *>> Messagetype comes from Report RCCLTRANS

    SELECTION-SCREEN BEGIN OF LINE.

    SELECTION-SCREEN COMMENT 3(30) text-003.

    SELECTION-SCREEN POSITION 35.

    PARAMETERS mestyp LIKE tbdme-mestyp.

    SELECTION-SCREEN END OF LINE.

    *>> Messagetype comes from Report RCCLTRANS

    SELECTION-SCREEN BEGIN OF LINE.

    SELECTION-SCREEN COMMENT 3(30) text-004.

    SELECTION-SCREEN POSITION 35.

    PARAMETERS: p_date TYPE sydatum. "last run date

    SELECTION-SCREEN END OF LINE.

    *>> Messagetype comes from Report RCCLTRANS

    SELECTION-SCREEN BEGIN OF LINE.

    SELECTION-SCREEN COMMENT 3(30) text-005.

    SELECTION-SCREEN POSITION 35.

    PARAMETERS: p_time TYPE syuzeit. "last run time

    SELECTION-SCREEN END OF LINE.

    • SELECTION-SCREEN END OF BLOCK MISCELLANEOUS.

    *MOD-006

    *>> Messagetype comes from Report RCCLTRANS

    SELECTION-SCREEN BEGIN OF LINE.

    SELECTION-SCREEN COMMENT 3(30) text-006.

    SELECTION-SCREEN POSITION 35.

    PARAMETERS: p_update AS CHECKBOX DEFAULT space.

    SELECTION-SCREEN END OF LINE.

    *MOD-006

    *MOD-006

    *>> Messagetype comes from Report RCCLTRANS

    SELECTION-SCREEN BEGIN OF LINE.

    SELECTION-SCREEN COMMENT 3(30) text-007.

    SELECTION-SCREEN POSITION 32.

    SELECT-OPTIONS: s_rundt FOR sy-datum NO-EXTENSION.

    SELECTION-SCREEN END OF LINE.

    *MOD-006

    *MOD-006

    *>> Messagetype comes from Report RCCLTRANS

    SELECTION-SCREEN BEGIN OF LINE.

    SELECTION-SCREEN COMMENT 3(30) text-008.

    SELECTION-SCREEN POSITION 32.

    SELECT-OPTIONS: s_runtm FOR sy-uzeit NO-EXTENSION.

    SELECTION-SCREEN END OF LINE.

    *MOD-006

    **MOD-006

    *SELECTION-SCREEN BEGIN OF LINE.

    *SELECTION-SCREEN COMMENT 3(30) text-009.

    *SELECTION-SCREEN POSITION 32.

    *SELECT-OPTIONS: s_emat FOR zzzz_xref_data-z_in_value.

    *SELECTION-SCREEN END OF LINE.

    SELECTION-SCREEN END OF BLOCK miscellaneous.

    **MOD-006

    • Write selected AUFPL numbers via ranges table to memory ?

    PARAMETERS:

    ordtomem TYPE cloi_x DEFAULT '' NO-DISPLAY. "X: yes

    • do not select from MARC, but use ranges tables directly. MK 4.0C

    • matnr_gl and werks_gl must have the same length.

    PARAMETERS: no_sel TYPE c DEFAULT ' ' NO-DISPLAY.

    • --> Normal selection parameters for ORD comes from the logical db

    *&----


    *

    *& Event START-OF-SELECTION

    *&----


    *

    START-OF-SELECTION.

    • --> Select the ORD according to the selected

    • MRP controller, Material, work center and plant

    *MOD-006

    • Validate the last run date & Time

    • PERFORM validate_last_run_date_time.

    *MOD-006

      • BEGIN OF INSERTION DS001

      • get the entry of the last program run

    • select single * for update from ycloidownlprot

    • where logsys = OPT_SYS and

    • downloadtype eq C_DOWNL_PROCESS_ORDERS.

      • if YCLOIDOWNLPROT-IN_PROGRESS eq CLOI_TRUE.

      • program is already running, do not allow to start again

    • write : / text-004, YCLOIDOWNLPROT-USERNAME.

    • exit.

    • endif.

    • YCLOIDOWNLPROT-MANDT = SY-MANDT.

    • YCLOIDOWNLPROT-LOGSYS = OPT_SYS.

    • YCLOIDOWNLPROT-START_DATE = SY-DATUM.

    • YCLOIDOWNLPROT-START_TIME = SY-UZEIT.

    • YCLOIDOWNLPROT-USERNAME = SY-UNAME.

    • YCLOIDOWNLPROT-DOWNLOADTYPE = C_DOWNL_PROCESS_ORDERS.

    • YCLOIDOWNLPROT-IN_PROGRESS = CLOI_TRUE.

      • insert or update entry (dependant if entry already exists)

    • MODIFY YCLOIDOWNLPROT.

    • COMMIT WORK.

    • CLEAR CREATED_MASTERIDOCS_PRO.

    • EXPORT CREATED_MASTERIDOCS_PRO TO MEMORY ID 'YLOI001'.

      • END OF INSERTION DS001

    • BEGIN OF INSERTION DS001

      • if not sscrfields-ucomm = 'ONLI'. mk zu 4.0

      • exit.

      • endif.

      • if s_dispo is initial and

      • s_matnr is initial and

      • s_arbpl is initial and

      • s_werks is initial.

      • exit.

      • endif.

        • Send only orders with type 40 - process orders

      • p_autyp = '40'.

        • END OF INSERTION DS001

        *>> Put the ranges tabs back into matwrk list if no selection (NO_SEL)

        IF no_sel = cloi_true.

        CLEAR t_matwrk_key. REFRESH t_matwrk_key.

        LOOP AT s_matnr.

        t_matwrk_key-matnr = s_matnr-low.

        READ TABLE s_werks INDEX sy-tabix.

        t_matwrk_key-werks = s_werks-low.

        APPEND t_matwrk_key.

        ENDLOOP.

        SORT t_matwrk_key BY matnr werks.

        DELETE ADJACENT DUPLICATES FROM t_matwrk_key.

        • delete duplicate duplicates from ranges table. Therfore sort by LOW

        • (HIGH is not used in this case).

        SORT s_matnr BY low.

        DELETE ADJACENT DUPLICATES FROM s_matnr.

        SORT s_werks BY low.

        DELETE ADJACENT DUPLICATES FROM s_werks.

        ENDIF.

        • --> Determine which segments are selected in the message type

        PERFORM ord_segments_determine

        USING mestyp

        CHANGING afpo_x

        jstk_x

        afab_x

        affl_x

        afvo_x

        kbed_x

        jstv_x

        resb_x

        kbeu_x

        afuv_x

        is_enhancement

        jstu_x.

        • Export the flags to the memory, because the following subroutine

        • must not have any parameters !!!

        EXPORT affl_x

        afvo_x

        kbed_x

        resb_x

        kbeu_x

        afuv_x

        TO MEMORY ID 'LOI03'.

        • MK 19980326 enhanced selections on header/operation level

        • get selection profile for log system from customizing if available

        SELECT SINGLE * FROM tcloi9 WHERE logsys = opt_sys.

        • if entry exists for the logical system

        IF sy-subrc = 0.

        • if an selection profile for the order is entered, use it for selection

        IF NOT tcloi9-ord_selid IS INITIAL.

        p_selid = tcloi9-ord_selid.

        ENDIF.

        IF NOT tcloi9-ord_opr_selid IS INITIAL AND

        NOT afvo_x IS INITIAL AND NOT affl_x IS INITIAL.

        ord_opr_selid = tcloi9-ord_opr_selid.

        ENDIF.

        ENDIF.

        • initialize control key table for selections

        CALL FUNCTION 'CLOI_STEUS_GET'

        EXPORTING

        logsys_to_init = opt_sys

        IMPORTING

        no_entry_for_logsys = no_entry_for_logsys

        TABLES

        t_steus = t_steus

        EXCEPTIONS

        logsys_not_initialized = 1

        OTHERS = 2.

        • Write structure information into the memory

        • perform fill_memory_selobj.

        • -> import table with already sent orders

        IMPORT gt_aufnrdone FROM MEMORY ID 'LOIAUFNRTAB'. "N599845

        SORT gt_aufnrdone BY low. "N599845

        • --> Read header information

        GET ioheader.

        • Check if material/plant combination is selected MK 4.0C

        CLEAR check_flg.

        IF no_sel = cloi_true.

        READ TABLE t_matwrk_key

        WITH KEY matnr = ioheader-matnr

        werks = ioheader-werks BINARY SEARCH.

        IF sy-subrc <> 0.

        check_flg = cloi_true.

        ENDIF.

        ENDIF.

        • -> check if order was already sent

        IF NOT gt_aufnrdone[] IS INITIAL. "N599845

        READ TABLE gt_aufnrdone WITH KEY "N599845

        low = ioheader-aufnr "N599845

        TRANSPORTING NO FIELDS "N599845

        BINARY SEARCH. "N599845

        IF sy-subrc = 0. "N599845

        • -> order already sent

        check_flg = cloi_true. "N599845

        ENDIF. "N599845

        ENDIF. "N599845

        • leave GET routine if check_flg is set.

        CHECK check_flg IS INITIAL.

        CLEAR t_afpo. REFRESH t_afpo.

        CLEAR t_affl. REFRESH t_affl.

        MOVE-CORRESPONDING ioheader TO t_afko.

        GET ioheader LATE.

          • BEGIN OF INSERTION DS001

          • Check whether the process order has been changed since the last

          • run of the program

        • clear f_continue.

          • if the CHANGED date is greater than the last run or initial

        • IF IOHEADER-AEDAT GT F_OLD_DATE OR

        • ( ioheader-aedat is initial and

        • ioheader-aezeit is initial ).

          • if the CHANGED date is initial check the creation date

        • if ioheader-aedat is initial.

          • if the creation date is greater than or equal to the date of the last

          • run, if it is equal the creation time must be later or equal to the

          • start time of the last run

        • IF IOHEADER-ERDAT GT F_OLD_DATE OR

        • ( IOHEADER-ERDAT EQ F_OLD_DATE AND

        • IOHEADER-ERFZEIT GE F_OLD_TIME ).

        • f_continue = 'X'.

        • endif.

        • else.

        • f_continue = 'X'.

        • endif.

          • if the CHANGED dat is not initial check it against the last run

        • ELSEIF IOHEADER-AEDAT EQ F_OLD_DATE AND

        • IOHEADER-AEZEIT GE F_OLD_TIME.

        • f_continue ='X'.

        • endif.

        • *

            • Aenderung 295/99 Selektions-Aenderung vom 26. August 99

            • Wenn Auftrag bereits techn. abgeschlossen ist, so darf kein IDOC

            • erzeugt werden, wenn Auftrag zum löschen vorgemerkt wird.

          • CONCATENATE 'OR' IOHEADER-AUFNR INTO F_OBJNR.

          • SELECT SINGLE * FROM JEST

          • WHERE OBJNR = F_OBJNR

          • AND STAT = 'I0045'.

          • IF JEST-INACT EQ SPACE AND SY-SUBRC EQ 0.

          • SELECT * FROM JCDS WHERE OBJNR EQ F_OBJNR AND

          • STAT EQ 'I0045' AND

          • INACT EQ SPACE.

            • letzte Aenderung des Status TABG wird geprueft Beg. WA 354/99

          • ENDSELECT.

          • IF ( F_OLD_DATE GT JCDS-UDATE OR " Beg JB_02

          • ( F_OLD_DATE EQ JCDS-UDATE AND

          • F_OLD_TIME GT JCDS-UTIME ) ) AND " End JB_02

          • SY-SUBRC EQ 0.

          • CLEAR F_CONTINUE.

          • ENDIF.

          • *

            • ENDIF.

            • Ende 295/99

            • check f_continue eq 'X'.

            • END OF INSERTION DS001

            t_afko-t_afpo = t_afpo[].

            t_afko-t_jstk = t_jstk[].

            t_afko-t_affl = t_affl[].

            t_afko-t_afab = t_afab[].

            APPEND t_afko.

            IF jstk_x = cloi_x.

            t_objnr-objnr = ioheader-objnr.

            APPEND t_objnr.

            ENDIF.

            *---> Remember the orders that are already selected for the global

            • selection parameters

            IF ordtomem = cloi_x. "write order numbers to memory

            t_aufnr_range_done-sign = 'I'.

            t_aufnr_range_done-option = 'NE'.

            t_aufnr_range_done-low = ioheader-aufpl.

            APPEND t_aufnr_range_done.

            ENDIF.

            *---> Remember the orders internal/external keys for AFAB (relationship)

            IF afab_x = cloi_x.

            MOVE-CORRESPONDING ioheader TO t_aufpl_aufnr.

            APPEND t_aufpl_aufnr.

            ENDIF.

            • check afpo_x = cloi_x.

            GET ioitem.

              • BEGIN OF INSERTION DS001

              • Check whether the process order has been changed since the last

              • run of the program

            • CLEAR F_CONTINUE.

              • if the CHANGED date is greater than the last run or initial

            • IF IOHEADER-AEDAT GT F_OLD_DATE OR

            • ( ioheader-aedat is initial and

            • ioheader-aezeit is initial ).

              • if the CHANGED date is initial check the creation date

            • if ioheader-aedat is initial.

              • if the creation date is greater than or equal to the date of the last

              • run, if it is equal the creation time must be later or equal to the

              • start time of the last run

            • IF IOHEADER-ERDAT GT F_OLD_DATE OR

            • ( IOHEADER-ERDAT EQ F_OLD_DATE AND

            • IOHEADER-ERFZEIT GE F_OLD_TIME ).

            • f_continue = 'X'.

            • endif.

            • else.

            • f_continue = 'X'.

            • endif.

              • if the CHANGED date is not initial check it against the last run

            • ELSEIF IOHEADER-AEDAT EQ F_OLD_DATE AND

            • IOHEADER-AEZEIT GE F_OLD_TIME.

            • f_continue ='X'.

            • endif.

              • Aenderung 295/99 Selektions-Aenderung vom 26. August 99

              • Wenn Auftrag bereits techn. abgeschlossen ist, so darf kein IDOC

              • erzeugt werden, wenn Auftrag zum löschen vorgemerkt wird.

            • CONCATENATE 'OR' IOHEADER-AUFNR INTO F_OBJNR.

            • SELECT SINGLE * FROM JEST

            • WHERE OBJNR = F_OBJNR

            • AND STAT = 'I0045'.

            • IF JEST-INACT EQ SPACE AND SY-SUBRC EQ 0.

            • SELECT * FROM JCDS WHERE OBJNR EQ F_OBJNR AND

            • STAT EQ 'I0045' AND

            • INACT EQ SPACE.

              • letzte Aenderung des Status TABG wird geprueft

            • ENDSELECT.

            • IF ( F_OLD_DATE GT JCDS-UDATE OR " Beg JB_02

            • ( F_OLD_DATE EQ JCDS-UDATE AND

            • F_OLD_TIME GT JCDS-UTIME ) ) AND " End JB_02

            • SY-SUBRC EQ 0.

            • CLEAR F_CONTINUE.

            • ENDIF.

            • *

              • ENDIF.

              • Ende 295/99

              • check f_continue eq 'X'.

              • END OF INSERTION DS001

              IF afpo_x = cloi_x.

              MOVE-CORRESPONDING ioitem TO t_afpo.

              APPEND t_afpo.

              ENDIF.

              • Put matnr and ltrmi in a help structure, which later goes to t_afpo

              IF ioitem-posnr = '0001'.

              MOVE-CORRESPONDING ioitem TO help_afpo.

              APPEND help_afpo.

              • put PSP element (internal key) into order header. Unique for positions

              IF t_afko-pspel IS INITIAL.

              t_afko-pspel = ioitem-projn.

              ENDIF.

              ENDIF.

              CHECK affl_x = cloi_x.

              GET iosequen.

              CLEAR t_afvo. REFRESH t_afvo.

              MOVE-CORRESPONDING iosequen TO t_affl.

              GET iosequen LATE.

              t_affl-t_afvo = t_afvo[].

              APPEND t_affl.

              CHECK afvo_x = cloi_x.

              GET iooper.

              CLEAR t_kbed. REFRESH t_kbed.

              CLEAR t_afuv. REFRESH t_afuv.

              CLEAR t_resb. REFRESH t_resb.

              MOVE-CORRESPONDING iooper TO t_afvo.

              "Temporary storing of operation information if for a phase

              "the corresponding operation has is needed

              MOVE-CORRESPONDING iooper TO t_aufpl_aplzl_vornr.

              APPEND t_aufpl_aplzl_vornr.

              • check, if selection profile (if exists) for the operation is ok

              IF NOT ord_opr_selid IS INITIAL.

              CALL FUNCTION 'STATUS_CHECK_BY_SELSCHEM'

              EXPORTING

              objnr = iooper-objnr

              selid = ord_opr_selid

              IMPORTING

              fullfill = status_ok

              EXCEPTIONS

              no_stat_tab = 1

              no_stat_scheme = 2

              OTHERS = 3.

              IF sy-subrc <> 0.

              status_ok = cloi_x.

              ENDIF.

              ELSE.

              status_ok = cloi_x.

              ENDIF.

              • check if control key (STEUS) should not be selected.

              control_key_ok = cloi_x.

              IF no_entry_for_logsys IS INITIAL.

              READ TABLE t_steus WITH KEY

              steus = iooper-steus BINARY SEARCH.

              IF sy-subrc <> 0.

              CLEAR control_key_ok.

              ENDIF.

              ENDIF.

              CHECK NOT status_ok IS INITIAL.

              CHECK NOT control_key_ok IS INITIAL.

              GET iooper LATE.

              t_afvo-t_kbed = t_kbed[].

              t_afvo-t_afuv = t_afuv[].

              t_afvo-t_resb = t_resb[].

              APPEND t_afvo.

              IF jstv_x = cloi_x.

              t_objnr-objnr = iooper-objnr.

              APPEND t_objnr.

              ENDIF.

              CHECK kbed_x = cloi_x.

              GET ioopcap.

              MOVE-CORRESPONDING ioopcap TO t_kbed.

              APPEND t_kbed.

              CHECK resb_x = cloi_x.

              GET ioopcomp.

              • do not transfer RESB entries with deletion flag

              CHECK ioopcomp-xloek IS INITIAL.

              MOVE-CORRESPONDING ioopcomp TO t_resb.

              APPEND t_resb.

              CHECK afuv_x = cloi_x.

              GET iosoper.

              CLEAR t_kbeu. REFRESH t_kbeu.

              MOVE-CORRESPONDING iosoper TO t_afuv.

              • check if control key (STEUS) should not be selected.

              control_key_ok = cloi_x.

              IF no_entry_for_logsys IS INITIAL.

              READ TABLE t_steus WITH KEY

              steus = iooper-steus BINARY SEARCH.

              IF sy-subrc <> 0.

              CLEAR control_key_ok.

              ENDIF.

              ENDIF.

              CHECK NOT control_key_ok IS INITIAL.

              GET iosoper LATE.

              t_afuv-t_kbeu = t_kbeu[].

              APPEND t_afuv.

              IF jstv_x = cloi_x.

              t_objnr-objnr = iosoper-objnr.

              APPEND t_objnr.

              ENDIF.

              CHECK kbeu_x = cloi_x.

              GET iosocap.

              MOVE-CORRESPONDING iosocap TO t_kbeu.

              APPEND t_kbeu.

              *&----

              -


              *& Event END-OF-SELECTION

              *&----

              -


              END-OF-SELECTION.

              *MOD-006

              DATA: itab_matnr TYPE zzzz_xref_data OCCURS 0.

              DATA: l_wa_matnr TYPE zzzz_xref_data.

              DATA: l_wa_matnr_value TYPE zzzz_xref_data-z_in_value.

              DATA: l_wa_afko TYPE cloi_afko_struct.

              • SELECT *

              • FROM zzzz_xref_data

              • APPENDING TABLE itab_matnr

              • WHERE trans_id = 'ZELCUSMATLOOKUP' AND

              • ( z_in_value IN s_matnr OR

              • z_out_value IN s_matnr ).

              • IF sy-subrc = 0.

              • LOOP AT ITAB_MATNR INTO L_WA_MATNR.

              • L_WA_MATNR_VALUE = L_WA_MATNR-z_OUT_VALUE.

              • S_MATNR-LOW = L_WA_MATNR_VALUE.

              • S_MATNR-SIGN = 'I'.

              • S_MATNR-OPTION = 'EQ'.

              • APPEND S_MATNR.

              • ENDLOOP.

              • DELETE itab_matnr WHERE NOT in_value IN s_emat.

              • SORT itab_matnr BY out_value.

              • ENDIF.

              • CLEAR: l_wa_matnr.

              **MOD-010

              • Data which is not in the material lookup table but in the T_AFKO.

              LOOP AT t_afko INTO l_wa_afko.

              • READ TABLE S_MATNR WITH KEY LOW = L_WA_AFKO-MATNR BINARY SEARCH.

              READ TABLE itab_matnr INTO l_wa_matnr

              WITH KEY z_out_value = l_wa_afko-matnr BINARY SEARCH.

              IF sy-subrc NE 0.

              l_wa_afko-rgekz = 'X'.

              MODIFY t_afko FROM l_wa_afko TRANSPORTING rgekz.

              ENDIF.

              • IF NOT P_DATE IS INITIAL.

              • IF T_AFKO-GSTRP < p_date OR

              • ( T_AFKO-GSTRP = p_date AND

              • T_AFKO-GSUZP > p_time ).

              • L_WA_AFKO-RGEKZ = 'X'.

              • MODIFY T_AFKO FROM L_WA_AFKO TRANSPORTING RGEKZ.

              • ENDIF.

              • ENDIF.

              ENDLOOP.

              • Delete Data which is not in the material lookup

              • table but in the T_AFKO.

              • DELETE t_afko WHERE rgekz = 'X'.

              *MOD-010

              *MOD-006

              • BEGIN OF INSERTION DS001

              DATA: l_wa_itab_date TYPE ty_date.

              • Check whether the process order has been changed since the last

              • run of the program

              CLEAR f_continue.

              IF NOT t_afko IS INITIAL.

              SELECT aufnr aedat aezeit erdat erfzeit loekz

              INTO TABLE itab_date

              FROM aufk

              FOR ALL ENTRIES IN t_afko

              WHERE aufnr = t_afko-aufnr.

              IF sy-subrc = 0.

              IF NOT p_date IS INITIAL.

              CLEAR: itab_date.

              • Check whether the process order has been changed since the last

              • run of the program

              LOOP AT itab_date INTO l_wa_itab_date.

              • if the CHANGED date is greater than the last run or initial

              IF l_wa_itab_date-aedat GT p_date OR

              ( l_wa_itab_date-aedat IS INITIAL AND

              l_wa_itab_date-aezeit IS INITIAL ).

              • if the CHANGED date is initial check the creation date

              IF l_wa_itab_date-aedat IS INITIAL.

              • if the creation date is greater than or equal to the date of the last

              • run, if it is equal the creation time must be later or equal to the

              • start time of the last run

              IF l_wa_itab_date-erdat GT p_date OR

              ( l_wa_itab_date-erdat EQ p_date AND

              l_wa_itab_date-erfzeit GE p_time ).

              f_continue = 'X'.

              ELSE.

              l_wa_itab_date-indicator = 'X'.

              MODIFY itab_date FROM l_wa_itab_date TRANSPORTING indicator.

              ENDIF.

              ELSE.

              f_continue = 'X'.

              ENDIF.

              • if the CHANGED dat is not initial check it against the last run

              ELSEIF l_wa_itab_date-aedat EQ p_date AND

              l_wa_itab_date-aezeit GE p_time.

              f_continue ='X'.

              ELSE.

              l_wa_itab_date-indicator = 'X'.

              MODIFY itab_date FROM l_wa_itab_date TRANSPORTING indicator.

              ENDIF.

              ENDLOOP.

              *MOD-006

              • ELSE.

              • CLEAR: ITAB_DATE.

              • LOOP AT ITAB_DATE INTO L_WA_ITAB_DATE.

              • if the CHANGED date is greater than the last run or initial

            • IF L_WA_ITAB_DATE-AEDAT GT P_RUNDT OR

            • ( L_WA_ITAB_DATE-aedat is initial and

            • L_WA_ITAB_DATE-aezeit is initial ).

              • if the CHANGED date is initial check the creation date

            • if l_wa_itab_date-aedat is initial.

              • if the creation date is greater than or equal to the date of the last

              • run, if it is equal the creation time must be later or equal to the

              • start time of the last run

            • IF L_WA_ITAB_DATE-ERDAT GT P_RUNDT OR

            • ( L_WA_ITAB_DATE-ERDAT EQ P_RUNDT AND

            • L_WA_ITAB_DATE-ERFZEIT GE S_RUNTM-LOW OR

            • L_WA_ITAB_DATE-ERFZEIT LE S_RUNTM-HIGH ).

            • f_continue = 'X'.

            • else.

            • l_wa_itab_date-indicator = 'X'.

            • MODIFY ITAB_DATE FROM L_WA_ITAB_DATE

            • TRANSPORTING INDICATOR.

            • endif.

            • else.

            • f_continue = 'X'.

            • endif.

              • if the CHANGED dat is not initial check it against the last run

            • ELSEIF L_WA_ITAB_DATE-AEDAT EQ P_RUNDT AND

            • L_WA_ITAB_DATE-AEZEIT GE S_RUNTM-LOW.

            • f_continue ='X'.

            • ELSE.

            • l_wa_itab_date-indicator = 'X'.

            • MODIFY ITAB_DATE FROM L_WA_ITAB_DATE

            • TRANSPORTING INDICATOR.

            • endif.

            • ENDLOOP.

            • *MOD-006

              ENDIF.

              ENDIF.

              ENDIF.

              • DELETE ITAB_DATE WHERE INDICATOR = 'X'.

              *MOD-006

              CLEAR: itab_date.

              IF s_rundt-high IS INITIAL AND NOT s_rundt IS INITIAL.

              s_rundt-high = sy-datum.

              ENDIF.

              LOOP AT itab_date INTO l_wa_itab_date.

              IF NOT s_rundt IS INITIAL.

              • if the CHANGED date is greater than the last run or initial

              IF ( l_wa_itab_date-aedat IS INITIAL AND

              l_wa_itab_date-aezeit IS INITIAL ).

              • if the CHANGED date is initial check the creation date

              IF l_wa_itab_date-aedat IS INITIAL.

              • if the creation date is greater than or equal to the date of the last

              • run, if it is equal the creation time must be later or equal to the

              • start time of the last run

              IF ( l_wa_itab_date-erdat GT s_rundt-low AND

              l_wa_itab_date-erfzeit GT s_runtm-low ) AND

              ( l_wa_itab_date-erdat LT s_rundt-high AND

              l_wa_itab_date-erfzeit LT s_runtm-high ).

              f_continue = 'X'.

              ELSE.

              l_wa_itab_date-indicator = 'X'.

              MODIFY itab_date FROM l_wa_itab_date

              TRANSPORTING indicator.

              ENDIF.

              ELSE.

              f_continue = 'X'.

              ENDIF.

              • if the CHANGED dat is not initial check it against the last run

              ELSEIF ( l_wa_itab_date-aedat GE s_rundt-low AND

              l_wa_itab_date-aezeit GE s_runtm-low ) AND

              ( l_wa_itab_date-aedat LE s_rundt-high AND

              l_wa_itab_date-aezeit LE s_runtm-high ).

              f_continue ='X'.

              ELSE.

              l_wa_itab_date-indicator = 'X'.

              MODIFY itab_date FROM l_wa_itab_date

              TRANSPORTING indicator.

              ENDIF.

              ENDIF.

              ENDLOOP.

              • DELETE itab_date WHERE indicator = 'X'.

              *MOD-006

              **MOD-006

              • LOOP AT t_afko INTO l_wa_afko.

              • READ TABLE itab_date INTO l_wa_itab_date

              • WITH KEY aufnr = l_wa_afko-aufnr BINARY SEARCH.

              • IF sy-subrc NE 0.

              • l_wa_afko-rgekz = 'X'.

              • MODIFY t_afko FROM l_wa_afko TRANSPORTING rgekz.

              • ENDIF.

              • ENDLOOP.

              • DELETE t_afko WHERE rgekz = 'X'.

              **MOD-006

              *----

              -


              • -> initialize logical data base to reduce memory consumption

              *----

              -


              PERFORM ldb_process_init(sapdbioc)

              CHANGING

              lv_subrc.

              *----

              -


              • --> add information to the order structure that is not

              • selected via logical database:

              • - if AFVO-entry is a phase (phflg) --> fill field for

              • corresponding operation number (PVZNR)

              • The internal node number (aplzl) of the corresponding operation

              • is in field PVZKN of the phase

              *

              • - relationship information: E1AFABL

              • especially: select external numbers for the used

              • internal numbers in the table AFAB

              • - status information of the order header: E1JSTKL

              • - status information of the operation: E1JSTVL

              *----

              -


              *----

              -


              • --> Put matnr and ltrmi in the table t_afko

              *----

              -


              SORT t_afko BY aufnr.

              LOOP AT help_afpo.

              READ TABLE t_afko WITH KEY aufnr = help_afpo-aufnr

              ASSIGNING -gltri = help_afpo-ltrmi.

              ENDIF.

              ENDLOOP.

              *----

              -


              • --> Select entries for order and operation status

              *----

              -


              IF NOT t_objnr[] IS INITIAL.

              SELECT objnr stat FROM jest INTO TABLE t_jest2

              FOR ALL ENTRIES IN t_objnr

              WHERE objnr = t_objnr-objnr

              AND inact <> 'X'.

              ENDIF.

              *----

              -


              • --> Select entries for relationships from afab for all orders

              • into table t_afab_tmp

              *----

              -


              SORT t_aufpl_aplzl_vornr BY aufpl aplzl.

              IF afab_x = cloi_x AND NOT t_aufpl_aufnr[] IS INITIAL.

              • -> select afab data

              SELECT * FROM afab INTO TABLE t_afab_tmp

              FOR ALL ENTRIES IN t_aufpl_aufnr

              WHERE aufpl_vor = t_aufpl_aufnr-aufpl.

              SELECT * FROM afab APPENDING TABLE t_afab_tmp

              FOR ALL ENTRIES IN t_aufpl_aufnr

              WHERE aufpl_nch = t_aufpl_aufnr-aufpl.

              SORT t_afab_tmp

              BY aufpl_vor aplzl_vor aufpl_nch aplzl_nch aobar mimax.

              DELETE ADJACENT DUPLICATES FROM t_afab_tmp

              COMPARING aufpl_vor aplzl_vor aufpl_nch aplzl_nch aobar mimax.

              • -> read external order numbers out of data base

              CLEAR t_aufpl. REFRESH t_aufpl.

              LOOP AT t_afab_tmp ASSIGNING -aufpl_nch.

              COLLECT t_aufpl.

              ENDLOOP.

              CLEAR t_aufpl_aufnr. REFRESH t_aufpl_aufnr.

              IF NOT t_aufpl[] IS INITIAL.

              SELECT aufpl aufnr FROM afko INTO TABLE t_aufpl_aufnr

              FOR ALL ENTRIES IN t_aufpl

              WHERE aufpl = t_aufpl-aufpl.

              SORT t_aufpl_aufnr BY aufpl.

              ENDIF.

              • -> add order numbers to afab data

              LOOP AT t_afab_tmp ASSIGNING -aufnr_nch = t_aufpl_aufnr-aufnr.

              ENDIF.

              ENDLOOP.

              • -> read operation numbers out of data base

              CLEAR t_aufpl_aplzl. REFRESH t_aufpl_aplzl.

              LOOP AT t_afab_tmp ASSIGNING -aplzl_nch.

              COLLECT t_aufpl_aplzl.

              ENDLOOP.

              IF NOT t_aufpl_aplzl[] IS INITIAL.

              SELECT aufpl aplzl vornr FROM afvc

              APPENDING TABLE t_aufpl_aplzl_vornr

              FOR ALL ENTRIES IN t_aufpl_aplzl

              WHERE aufpl = t_aufpl_aplzl-aufpl

              AND aplzl = t_aufpl_aplzl-aplzl.

              SORT t_aufpl_aplzl_vornr BY aufpl aplzl.

              ENDIF.

              • -> add operation numbers to afab data

              LOOP AT t_afab_tmp ASSIGNING -vornr_nch = t_aufpl_aplzl_vornr-vornr.

              ENDIF.

              ENDLOOP.

              ENDIF. "afab_x

              *----

              -


              • --> fill AFAB (relationship information) and status information

              *----

              -


              SORT t_aufpl_aufnr BY aufnr.

              LOOP AT t_afko ASSIGNING .

              • -> fill order head status information

              IF jstk_x = cloi_x.

              CLEAR t_jstk. REFRESH t_jstk.

              LOOP AT t_jest2 INTO wa_tjest2 WHERE objnr = -t_jstk = t_jstk[].

              ENDIF.

              • -> fill afab information

              IF afab_x = cloi_x.

              CLEAR t_aufpl_aufnr.

              READ TABLE t_aufpl_aufnr WITH KEY

              aufnr = -t_afab = t_afab[].

              ENDIF.

              • -> fill operation and suboperation status information

              IF jstv_x = cloi_x OR afvo_x = cloi_x.

              LOOP AT .

              • -> read status information of suboperation

              IF jstu_x = cloi_x.

              LOOP AT -t_jstu = t_jstu[].

              ENDLOOP.

              ENDIF.

              • -> read status information of operation

              IF jstv_x = cloi_x.

              CLEAR t_jstv. REFRESH t_jstv.

              LOOP AT t_jest2 INTO wa_tjest2 WHERE objnr = -t_jstv = t_jstv[].

              ENDIF.

              • -> Read operation for a phase

              IF NOT -pvznr = t_aufpl_aplzl_vornr-vornr.

              ENDIF.

              ENDIF.

              ENDLOOP.

              ENDLOOP.

              ENDIF.

              • -> collect order numbers

              CLEAR wa_aufnrdone.

              wa_aufnrdone-low = -aufnr.

              APPEND wa_aufnrdone TO lt_aufnrdone.

              ENDLOOP.

              • -> append collected order numbers to global table

              APPEND LINES OF lt_aufnrdone TO gt_aufnrdone.

              EXPORT gt_aufnrdone TO MEMORY ID 'LOIAUFNRTAB'.

              • -> free large tables

              CLEAR t_jest2. REFRESH t_jest2.

              CLEAR t_afab_tmp. REFRESH t_afab_tmp.

              CLEAR t_aufpl. REFRESH t_aufpl.

              CLEAR t_aufpl_aufnr. REFRESH t_aufpl_aufnr.

              CLEAR t_aufpl_aplzl. REFRESH t_aufpl_aplzl.

              CLEAR t_aufpl_aplzl_vornr. REFRESH t_aufpl_aplzl_vornr.

                • -> create idocs

                CALL FUNCTION 'CLOI_MASTERIDOC_CREATE_LOIPRO'

                EXPORTING

                opt_sys = opt_sys

                message_type = mestyp

                TABLES

                order_data = t_afko

                EXCEPTIONS

                OTHERS = 1.

                • -> export already selected order numbers via ranges tab to memory

                EXPORT t_aufnr_range_done TO MEMORY ID 'LOI002'.

                **MOD-006

                • IMPORT created_masteridocs_pro FROM MEMORY ID 'YLOI001'.

                • ycloidownlprot-end_date = sy-datum.

                • ycloidownlprot-end_time = sy-uzeit.

                • ycloidownlprot-idocs_selected = created_masteridocs_pro.

                • ycloidownlprot-in_progress = cloi_false.

                *

                  • insert or update entry (dependant if entry already exists)

                • MODIFY ycloidownlprot.

                • COMMIT WORK.

                • MESSAGE i967(z001) WITH created_masteridocs_pro.

                • **MOD-006

                  • Update last run date and time

                  IF p_update = 'X'.

                  PERFORM update_last_run.

                  ELSE.

                  • MESSAGE s000 WITH text-022.

                  "Last Run Date and Last Run Time not updated

                  LEAVE LIST-PROCESSING.

                  ENDIF.

                  INCLUDE rcordf01.

                  *&----


                  *

                  *& Form validate_last_run_date_time

                  *&----


                  *

                  • text

                  *----


                  *

                  • --> p1 text

                  • <-- p2 text

                  *----


                  *

                  *FORM validate_last_run_date_time.

                  *

                  • IF p_date IS INITIAL OR

                  • p_time IS INITIAL.

                  • IF sy-batch IS INITIAL.

                  • MESSAGE s000 WITH text-017.

                  • "Last Run date & Last Run Time can not be blank

                  • LEAVE LIST-PROCESSING.

                  • ELSE.

                  • MESSAGE e000 WITH text-017.

                  • "Last Run date & Last Run Time can not be blank

                  • ENDIF.

                  • ENDIF.

                  *

                  *ENDFORM. " validate_last_run_date_time

                  *&----


                  *

                  *& Form update_last_run

                  *&----


                  *

                  • text

                  *----


                  *

                  • --> p1 text

                  • <-- p2 text

                  *----


                  *

                  FORM update_last_run.

                  CONSTANTS:

                  l_c_name TYPE rvari_vnam VALUE 'Z_PROC_DATE',

                  l_c_name1 TYPE rvari_vnam VALUE 'Z_PROC_TIME',

                  l_c_type TYPE rsscr_kind VALUE 'P',

                  l_c_numb TYPE tvarv_numb VALUE '0000'.

                  • Update last run date

                  UPDATE tvarv SET low = sy-datum

                  WHERE name = l_c_name AND

                  type = l_c_type AND

                  numb = l_c_numb.

                  IF sy-subrc = 0.

                  COMMIT WORK.

                  ELSE.

                  ROLLBACK WORK.

                  g_run_date = text-015. "#EC

                  "Updation of TVARV table failed for ZLAST_RUN_DATE. Update manually

                  ENDIF.

                  • Update last run time

                  UPDATE tvarv SET low = sy-uzeit

                  WHERE name = l_c_name1 AND

                  type = l_c_type AND

                  numb = l_c_numb.

                  IF sy-subrc = 0.

                  COMMIT WORK.

                  ELSE.

                  ROLLBACK WORK.

                  g_run_time = text-016. "#EC

                  "Updation of TVARV table failed for ZLAST_RUN_TIME. Update manually

                  ENDIF.

                  ENDFORM. " update_last_run

                Add a comment
                10|10000 characters needed characters exceeded

                Before answering

                You should only submit an answer when you are proposing a solution to the poster's problem. If you want the poster to clarify the question or provide more information, please leave a comment instead, requesting additional details. When answering, please include specifics, such as step-by-step instructions, context for the solution, and links to useful resources. Also, please make sure that you answer complies with our Rules of Engagement.
                You must be Logged in to submit an answer.

                Up to 10 attachments (including images) can be used with a maximum of 1.0 MB each and 10.5 MB total.