Urgente Idocs

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • c_quintero
    Junior Member
    • ago
    • 12

    #1

    Urgente Idocs

    buenos dias
    tengo una duda con respecto a los idocs

    resulta que quiero mandar unos idocs a un sistema xi (por el momento no importa que idocs estoy usando porque me pasa con todos)

    primero lleno los registros control y segmentos de los idocs
    despues mando llamar a la funcion

    CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
    EXPORTING
    master_idoc_control = control_record
    * OBJ_TYPE = ''
    * CHNUM = ''
    TABLES
    communication_idoc_control = i_communication
    master_idoc_data = i_data
    EXCEPTIONS
    error_in_idoc_control = 1
    error_writing_idoc_status = 2
    error_in_idoc_data = 3
    sending_logical_system_unknown = 4
    OTHERS = 5


    depues de eso voy a la we02 para checar si minimo se salieron bien , pero en todos los idocs creados se quedan con un warning con el status 30 , he estado checando y ese status lo pone cuando hay datos erroneos o cuando falta algun campo de algun segmento , pero no , ya los cheque bien y todo
    obviamente tengo un COMMIT WORK despues de llamar a dicha funcion pero aun asi no pasa nada

    el mensaje que me deja es el siguiente

    Destinatario existe , Sin filtrar , Sin convertir , Sin convers.versión .

    aqui les dejo una pantalla para que lo vean bien
    y si me pueden ayudar se los agradeceria mucho
    Archivos Adjuntos
  • c_quintero
    Junior Member
    • ago
    • 12

    #2
    ok ya medio lo resolvi

    tuve que poner varias funciones mas , asi me quedo el codigo

    CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
    EXPORTING
    master_idoc_control = control_record
    * OBJ_TYPE = ''
    * CHNUM = ''
    TABLES
    communication_idoc_control = i_communication
    master_idoc_data = i_data
    EXCEPTIONS
    error_in_idoc_control = 1
    error_writing_idoc_status = 2
    error_in_idoc_data = 3
    sending_logical_system_unknown = 4
    OTHERS = 5
    .
    IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ELSE.

    LOOP AT i_communication.
    WRITE: / 'IDOC GENERATED', i_communication-docnum.

    CALL FUNCTION 'EDI_DOCUMENT_OPEN_FOR_PROCESS'
    EXPORTING
    DOCUMENT_NUMBER = i_communication-docnum
    IMPORTING
    IDOC_CONTROL = control_record
    EXCEPTIONS
    DOCUMENT_FOREIGN_LOCK = 01
    DOCUMENT_NOT_EXIST = 02
    DOCUMENT_NUMBER_INVALID = 03
    ERROR_MESSAGE = 04
    OTHERS = 05.


    clear edi_ds.
    edi_ds-docnum = i_communication-docnum.
    edi_ds-status = '03'.


    CALL FUNCTION 'EDI_DOCUMENT_STATUS_SET'
    EXPORTING
    DOCUMENT_NUMBER = i_communication-DOCNUM
    IDOC_STATUS = edi_ds
    IMPORTING
    IDOC_CONTROL = control_record
    EXCEPTIONS
    DOCUMENT_NUMBER_INVALID = 1
    OTHER_FIELDS_INVALID = 2
    STATUS_INVALID = 3
    OTHERS = 4
    .

    CALL FUNCTION 'EDI_DOCUMENT_CLOSE_PROCESS'
    EXPORTING
    DOCUMENT_NUMBER = i_communication-DOCNUM.

    COMMIT WORK.
    endloop.

    y ademas vi que en el acuerdo de interlocutores vi que algunos idocs estaban en el modo de salida 4 , osea agrupando idocs en vez de lanzarlos inmediatamente , aunque no estoy muy seguro de que por eso haya sido

    mi problema ahora es que manda algunos pero otros no
    extrañamente no manda solo primero 2 o 3 y todos los demas si

    alguna sugerencia?
    Archivos Adjuntos

    Comentario

    • c_quintero
      Junior Member
      • ago
      • 12

      #3
      ok ya lo resolvi , pues resulta que todo tiene que ver desde sap
      al parecer en la version 7.0 en una parte de la funcion MASTER_IDOC_DISTRIBUTE deberia llamar a la funcion EDI_DOCUMENT_DEQUEUE_LATER pero por alguna excepcion que se dispara , digase FOREIGN_LOCK , previene que se llame a dicha funcion y por lo tanto el idoc permanece con el status 30

      asi que lo que hice fue simplemtente llamar a esa funcion despues de master idoc distributed , solo por si las dudas le deje las otras funciones

      asi que mi codigo quedo asi

      CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
      EXPORTING
      master_idoc_control = control_record
      * OBJ_TYPE = ''
      * CHNUM = ''
      TABLES
      communication_idoc_control = i_communication
      master_idoc_data = i_data
      EXCEPTIONS
      error_in_idoc_control = 1
      error_writing_idoc_status = 2
      error_in_idoc_data = 3
      sending_logical_system_unknown = 4
      OTHERS = 5.



      IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ELSE.

      COMMIT WORK.

      LOOP AT i_communication.
      WRITE: / 'IDOC GENERATED', i_communication-docnum.

      CALL FUNCTION 'EDI_DOCUMENT_OPEN_FOR_PROCESS'
      EXPORTING
      DOCUMENT_NUMBER = i_communication-docnum
      * IMPORTING
      * IDOC_CONTROL = control_record
      EXCEPTIONS
      DOCUMENT_FOREIGN_LOCK = 01
      DOCUMENT_NOT_EXIST = 02
      DOCUMENT_NUMBER_INVALID = 03
      ERROR_MESSAGE = 04
      OTHERS = 05.


      clear edi_ds.
      edi_ds-docnum = i_communication-docnum.
      edi_ds-status = '03'.


      CALL FUNCTION 'EDI_DOCUMENT_STATUS_SET'
      EXPORTING
      DOCUMENT_NUMBER = i_communication-DOCNUM
      IDOC_STATUS = edi_ds
      * IMPORTING
      * IDOC_CONTROL = control_record
      EXCEPTIONS
      DOCUMENT_NUMBER_INVALID = 1
      OTHER_FIELDS_INVALID = 2
      STATUS_INVALID = 3
      OTHERS = 4
      .

      CALL FUNCTION 'EDI_DOCUMENT_CLOSE_PROCESS'
      EXPORTING
      DOCUMENT_NUMBER = i_communication-DOCNUM.


      CALL FUNCTION 'EDI_DOCUMENT_DEQUEUE_LATER'
      EXPORTING
      docnum = i_communication-docnum
      EXCEPTIONS
      OTHERS = 0.


      COMMIT WORK.

      ENDLOOP.

      saludos a todos

      Comentario

      • DCErick
        Moderator
        • mar
        • 1090

        #4
        Se puede usar la función 'MASTER_IDOC_DISTRIBUTE' pero para un IDoc de entrada? El IDoc en cuestion es QALITY02.

        Le intenté alimentando :
        Código:
        s_master_idoc_control-direct = 2.           "Direction for IDoc transmission 1	Outbound 2	Inbound.
        Pero al verlo por la WE02 me dice que el IDoc es de Salida ....
        -------------------
        ¿Dudas para descargar manuales? Ver este tema -> Cómo descargar manuales de la sección "Descargas" ?

        Comentario

        • jtristan
          Senior Member
          • oct
          • 240

          #5
          Hola DCErick,

          aunque sea un tema viejo estoy ahora con él así que os cuento el porqué no funciona el valor 2. Curiosamente, a pesar de admitir el tipo de dirección, siempre coge el de salida. Debugueando la función vi que pongas el valor que pongas, se le asigna por defecto el valor de una constante, que es el 1.
          Luego pensándolo, me di cuenta que el propio nombre de la función lo explica: "distribuite", es decir, que esta función sólo valdría para generar idocs de salida. Si quieres tratar con idocs de entradas ya habría que usar funciones de tipo inbound como IDOC_INBOUND_SYNCHRONOUS o IDOC_INBOUND_ASYNCHRONOUS.

          Un saludo.

          Originalmente publicado por DCErick
          Se puede usar la función 'MASTER_IDOC_DISTRIBUTE' pero para un IDoc de entrada? El IDoc en cuestion es QALITY02.

          Le intenté alimentando :
          Código:
          s_master_idoc_control-direct = 2.           "Direction for IDoc transmission 1	Outbound 2	Inbound.
          Pero al verlo por la WE02 me dice que el IDoc es de Salida ....

          Comentario

          Trabajando...