Difference between revisions of "SAP ABAP IDOC"

From SapWiki
 
(3 intermediate revisions by the same user not shown)
Line 5: Line 5:
 
   
 
   
 
1) Trn. Se11  
 
1) Trn. Se11  
 
+
*copiar estructura BAPICC1DNPERSO a ZBAPICC1DNPERSO
copiar estructura BAPICC1DNPERSO a ZBAPICC1DNPERSO
+
*agregar nuevos campos: COMMUNICATION_ID_LONG type COM_ID_LONG
 
 
agregar nuevos campos: COMMUNICATION_ID_LONG type COM_ID_LONG
 
 
 
2) Trn. Se37
 
2) Trn. Se37
 
+
*copiar BAPI_CC1_DNLOAD_MINIMASTER a ZBAPI_CC1_DNLOAD_MINIMASTER (crear Grp. Funciones ZHR_MINIMASTER), parám. MINI_MASTER con tipo ZBAPICC1DNPERSO.
copiar BAPI_CC1_DNLOAD_MINIMASTER a ZBAPI_CC1_DNLOAD_MINIMASTER (crear Grp. Funciones ZHR_MINIMASTER), parám. MINI_MASTER con tipo ZBAPICC1DNPERSO.
 
 
   
 
   
 
3) Trn. SWO1
 
3) Trn. SWO1
+
*Crear tipo interface ZRCVPMINIM basado en RCVPMINIMD
Crear tipo interface ZRCVPMINIM basado en RCVPMINIMD
+
*Crear método ZbapiCc1DnloadMinimaster basado en función ZBAPI_CC1_DNLOAD_MINIMASTER (ABAP-->Funciones API)
+
*Generar.
Crear método ZbapiCc1DnloadMinimaster basado en función ZBAPI_CC1_DNLOAD_MINIMASTER (ABAP-->Funciones API)
 
 
Generar.
 
 
 
 
4) Trn. BDBG
 
4) Trn. BDBG
 
+
*Crear interface:
Crear interface:
 
 
  Tipo objeto/Tp.interfase: ZRCVPMINIM
 
  Tipo objeto/Tp.interfase: ZRCVPMINIM
 
  Método:                  ZBAPICC1DNLOADMINIMASTER
 
  Método:                  ZBAPICC1DNLOADMINIMASTER
Line 40: Line 30:
 
   
 
   
 
y modificar con la nueva estructura y nueva función ZZALE_CC1_DNLOAD_MINIMASTER
 
y modificar con la nueva estructura y nueva función ZZALE_CC1_DNLOAD_MINIMASTER
 +
 +
==MASTER_IDOC_DISTRIBUTE==
 +
<nowiki>FORM genera_idoc.
 +
DATA: idoc_control            TYPE edidc,
 +
      idoc_data                TYPE TABLE OF edidd,
 +
      e_idoc_data              TYPE edidd,
 +
      idoc_tcontrol            TYPE TABLE OF edidc,
 +
      e_idoc_control          TYPE edidc,
 +
      state_of_processing_ing  TYPE sysubrc,
 +
      inbound_process_data_in  TYPE tede2,
 +
      idoc_num                TYPE edi_docnum.
 +
 +
      idoc_control-direct = '1'.
 +
      idoc_control-status = '03'.
 +
      idoc_control-outmod = '2'.
 +
      idoc_control-idoctp = 'ZTIHRIPA'.
 +
      idoc_control-mestyp = 'Z1HRIPA'.
 +
 +
*** Destinatario
 +
      idoc_control-RCVPOR = p_rcvpor.    "Puerta Destinatario
 +
      idoc_control-RCVPRT = p_rcvprt.    "Tipo Mensaje
 +
      idoc_control-RCVPRN = p_rcvprn.    "Nro. Interlocutor
 +
 +
***Remitente.
 +
      idoc_control-SNDPOR = p_sndpor.    "Puerta Remitente
 +
      idoc_control-SNDPRT = p_sndprt.    "Tipo Mensaje
 +
      idoc_control-SNDPRN = p_sndprn.    "Nro. Interlocutor
 +
 +
      LOOP AT ti_salida.
 +
        e_idoc_data-SEGNUM = '0000'.  "1.
 +
        e_idoc_data-PSGNUM = '000000'.
 +
        e_idoc_data-SEGNAM = 'Z1HRIPA'.
 +
        e_idoc_data-SDATA = ti_salida.
 +
        APPEND e_idoc_data to idoc_data .
 +
        CLEAR e_idoc_data.
 +
      ENDLOOP.
 +
 +
      IF idoc_data[] IS NOT INITIAL.
 +
        e_idoc_control = idoc_control.
 +
        APPEND e_idoc_control TO idoc_tcontrol.
 +
 +
        CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
 +
            EXPORTING
 +
            MASTER_IDOC_CONTROL                  = idoc_control
 +
          TABLES
 +
            COMMUNICATION_IDOC_CONTROL          = idoc_tcontrol
 +
            MASTER_IDOC_DATA                    = idoc_data
 +
          EXCEPTIONS ERROR_IN_IDOC_CONTROL      = 1
 +
                    ERROR_WRITING_IDOC_STATUS  = 2
 +
                    ERROR_IN_IDOC_DATA          = 3
 +
                    SENDING_LOGICAL_SYSTEM_UNKNOWN = 4.
 +
 +
        IF sy-subrc EQ 0.
 +
            COMMIT WORK.
 +
            WAIT UP TO 1 SECONDS.
 +
 +
            READ TABLE idoc_tcontrol INTO e_idoc_control
 +
                WITH KEY status = '30'.
 +
            WRITE: /01 'Se Creo IDOC Nro. : ', e_idoc_control-docnum.
 +
        ENDIF.
 +
      ENDIF.
 +
ENDFORM.</nowiki>
 +
 +
==Notas==
 +
Si los idocs generados por esta se crean con status '30' ,siendo que en la WE20 se definió el Idoc como salida inmediata,
 +
entonces agregar
 +
 +
CALL FUNCTION 'DB_COMMIT'.
 +
CALL FUNCTION 'DEQUEUE_ALL'.
 +
 +
después de la llamada a MASTER_IDOC_DISTRIBUTE y antes del COMMIT WORK.
 +
 +
  IF i_flag_commit_work = sbiwa_c_flag_on.
 +
    CALL FUNCTION 'DB_COMMIT'.                      "note 839614
 +
    CALL FUNCTION 'DEQUEUE_ALL'.                    "note 839614
 +
    COMMIT WORK.
 +
  ELSE.
 +
 +
También existe el programa RSEOUT00 para pasar los Idocs de status '30' a '03'.

Latest revision as of 17:58, 6 April 2020

Extend the BAPI or complex data type for the IDoc.

(ver nota 1579037 - "ACTION IS NOT POSSIBLE FOR GENERATED IDOCTYPES" when Extending IDOCs)

En este ejemplo extenderemos el tipo de mensaje HRCC1DNPERSO (HR-PDC: Download mini maestro de personal)

1) Trn. Se11

  • copiar estructura BAPICC1DNPERSO a ZBAPICC1DNPERSO
  • agregar nuevos campos: COMMUNICATION_ID_LONG type COM_ID_LONG

2) Trn. Se37

  • copiar BAPI_CC1_DNLOAD_MINIMASTER a ZBAPI_CC1_DNLOAD_MINIMASTER (crear Grp. Funciones ZHR_MINIMASTER), parám. MINI_MASTER con tipo ZBAPICC1DNPERSO.

3) Trn. SWO1

  • Crear tipo interface ZRCVPMINIM basado en RCVPMINIMD
  • Crear método ZbapiCc1DnloadMinimaster basado en función ZBAPI_CC1_DNLOAD_MINIMASTER (ABAP-->Funciones API)
  • Generar.

4) Trn. BDBG

  • Crear interface:
Tipo objeto/Tp.interfase: ZRCVPMINIM
Método:                   ZBAPICC1DNLOADMINIMASTER

Tipo de mensaje:          ZHRCC1DNPERSO
Tipo IDOC:                ZHRCC1DNPERSO01
Paquete:                  ZHCM
Módulo funciones:         ZZALE_CC1_DNLOAD_MINIMASTER
Grupo funciones:          ZHR_MINIMASTER

5) Copiar programas

RPTCC101 --> ZRPTCC101_V2

y modificar con la nueva estructura y nueva función ZZALE_CC1_DNLOAD_MINIMASTER

MASTER_IDOC_DISTRIBUTE

FORM genera_idoc.
DATA: idoc_control             TYPE edidc,
      idoc_data                TYPE TABLE OF edidd,
      e_idoc_data              TYPE edidd,
      idoc_tcontrol            TYPE TABLE OF edidc,
      e_idoc_control           TYPE edidc,
      state_of_processing_ing  TYPE sysubrc,
      inbound_process_data_in  TYPE tede2,
      idoc_num                 TYPE edi_docnum.

      idoc_control-direct = '1'.
      idoc_control-status = '03'.
      idoc_control-outmod = '2'.
      idoc_control-idoctp = 'ZTIHRIPA'.
      idoc_control-mestyp = 'Z1HRIPA'.

*** Destinatario
      idoc_control-RCVPOR = p_rcvpor.     "Puerta Destinatario
      idoc_control-RCVPRT = p_rcvprt.     "Tipo Mensaje
      idoc_control-RCVPRN = p_rcvprn.     "Nro. Interlocutor

***Remitente.
      idoc_control-SNDPOR = p_sndpor.     "Puerta Remitente
      idoc_control-SNDPRT = p_sndprt.     "Tipo Mensaje
      idoc_control-SNDPRN = p_sndprn.     "Nro. Interlocutor

      LOOP AT ti_salida.
         e_idoc_data-SEGNUM = '0000'.  "1.
         e_idoc_data-PSGNUM = '000000'.
         e_idoc_data-SEGNAM = 'Z1HRIPA'.
         e_idoc_data-SDATA = ti_salida.
         APPEND e_idoc_data to idoc_data .
         CLEAR e_idoc_data.
      ENDLOOP.

      IF idoc_data[] IS NOT INITIAL.
         e_idoc_control = idoc_control.
         APPEND e_idoc_control TO idoc_tcontrol.

         CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
            EXPORTING
            MASTER_IDOC_CONTROL                  = idoc_control
          TABLES
            COMMUNICATION_IDOC_CONTROL           = idoc_tcontrol
            MASTER_IDOC_DATA                     = idoc_data
          EXCEPTIONS ERROR_IN_IDOC_CONTROL       = 1
                     ERROR_WRITING_IDOC_STATUS   = 2
                     ERROR_IN_IDOC_DATA          = 3
                     SENDING_LOGICAL_SYSTEM_UNKNOWN = 4.

         IF sy-subrc EQ 0.
            COMMIT WORK.
            WAIT UP TO 1 SECONDS.

            READ TABLE idoc_tcontrol INTO e_idoc_control
                 WITH KEY status = '30'.
            WRITE: /01 'Se Creo IDOC Nro. : ', e_idoc_control-docnum.
         ENDIF.
      ENDIF.
ENDFORM.

Notas

Si los idocs generados por esta se crean con status '30' ,siendo que en la WE20 se definió el Idoc como salida inmediata, entonces agregar

CALL FUNCTION 'DB_COMMIT'.
CALL FUNCTION 'DEQUEUE_ALL'.

después de la llamada a MASTER_IDOC_DISTRIBUTE y antes del COMMIT WORK.

 IF i_flag_commit_work = sbiwa_c_flag_on.
   CALL FUNCTION 'DB_COMMIT'.                      "note 839614
   CALL FUNCTION 'DEQUEUE_ALL'.                    "note 839614
   COMMIT WORK.
 ELSE.

También existe el programa RSEOUT00 para pasar los Idocs de status '30' a '03'.