Difference between revisions of "SAP ABAP IDOC"

From SapWiki
 
Line 93: Line 93:
 
ENDFORM.</nowiki>
 
ENDFORM.</nowiki>
  
===Notas===
+
==Notas==
 
Si los idocs generados por esta se crean con status '30' ,siendo que en la WE20 se definió el Idoc como salida inmediata,  
 
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  
 
entonces agregar  

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'.