Con el siguiente reporte vamos a poder mostrar el contenido de un IDOC y luego guardarlo en un fichero.
Simplemente corremos el programa con el número de IDOC y luego que se liste el contenido, podemos grabar un fichero desde el menú Lista —> Grabar/Enviar —> Fichero…
REPORT Z_DISPLAY_IDOC LINE-SIZE 275.
DATA: IDOC_CONTROL LIKE EDIDC,
NUMBER_OF_DATA_RECORDS LIKE SY-DBCNT,
NUMBER_OF_STATUS_RECORDS LIKE SY-DBCNT,
INT_EDIDS LIKE EDIDS OCCURS 0 WITH HEADER LINE,
INT_EDIDD LIKE EDIDD OCCURS 0 WITH HEADER LINE.
TYPE-POOLS : LEDID.
DATA: STRUCT_TYPE TYPE LEDID_STRUCT_TYPE ,
IDOC_STRUCT TYPE LEDID_T_IDOC_STRUCT,
SEGMENTS TYPE LEDID_T_SEGMENT,
SEGMENT_STRUCT TYPE LEDID_T_SEGMENT_STRUCT,
EXCEL_TAB(2000) OCCURS 0 WITH HEADER LINE.
PARAMETER: DOCNUM LIKE EDIDC-DOCNUM OBLIGATORY, «»Idoc Number
SAP_REL LIKE SY-SAPRL DEFAULT SY-SAPRL OBLIGATORY,
PI_VER LIKE EDI_VERREC-VERSION DEFAULT ‘3’ OBLIGATORY.
START-OF-SELECTION.
PERFORM READ_IDOC.
PERFORM PROCESS_IDOC.
END-OF-SELECTION.
*&———————————————————————*
*& Form read_idoc
*&———————————————————————*
* text
*———————————————————————-*
FORM READ_IDOC.
CALL FUNCTION ‘IDOC_READ_COMPLETELY’
EXPORTING
DOCUMENT_NUMBER = DOCNUM
IMPORTING
IDOC_CONTROL = IDOC_CONTROL
NUMBER_OF_DATA_RECORDS = NUMBER_OF_DATA_RECORDS
NUMBER_OF_STATUS_RECORDS = NUMBER_OF_STATUS_RECORDS
TABLES
INT_EDIDS = INT_EDIDS
INT_EDIDD = INT_EDIDD
EXCEPTIONS
DOCUMENT_NOT_EXIST = 1
DOCUMENT_NUMBER_INVALID = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. «» read_idoc
*&———————————————————————*
*& Form process_idoc
*&———————————————————————*
* text
*———————————————————————-*
FORM PROCESS_IDOC.
PERFORM READ_IDOC_STRUCTURE.
PERFORM DISPLAY_DATA_RECORDS.
ENDFORM. «» process_idoc
*&———————————————————————*
*& Form display_data_records
*&———————————————————————*
* text
*———————————————————————-*
FORM DISPLAY_DATA_RECORDS.
DATA: PE_SEG_HEADER LIKE EDI_SAPI01,
SEGNAME LIKE EDI_IAPI12-SEGMENTTYP,
PREV_SEGNAME LIKE EDI_IAPI12-SEGMENTTYP VALUE ‘ ‘,
PT_FIELDS2 LIKE EDI_IAPI12 OCCURS 0 WITH HEADER LINE,
PT_FVALUES2 LIKE EDI_IAPI14 OCCURS 0 WITH HEADER LINE,
BYTE_FIRST TYPE I,
BYTE_LAST TYPE I,
FIELD_VAL(50),
TMP_STR(15),
TMP_STR3(15),
SEG_REPEATS TYPE I VALUE 0,
TMP_STR2(15),
TAB_CR(2) TYPE C VALUE ’09’,
TOT_CTR TYPE I VALUE 0,
CTR TYPE I VALUE 0,
MSG(40) TYPE C.
DATA: IDOC_STRUCT_WA TYPE LEDID_IDOC_STRUCT.
SORT INT_EDIDD BY SEGNUM.
DESCRIBE TABLE INT_EDIDD LINES TOT_CTR.
LOOP AT INT_EDIDD.
MOVE INT_EDIDD-SEGNAM TO SEGNAME.
CLEAR MSG.
CONCATENATE ‘Reading segment ‘ SEGNAME
INTO MSG SEPARATED BY SPACE.
IF TOT_CTR <> 0.
CTR = ( 100 * SY-TABIX ) / TOT_CTR.
ENDIF.
CALL FUNCTION ‘SAPGUI_PROGRESS_INDICATOR’
EXPORTING
PERCENTAGE = CTR
TEXT = MSG.
ADD 1 TO SEG_REPEATS.
CLEAR TMP_STR2.
IF INT_EDIDD-SEGNAM <> PREV_SEGNAME.
SEG_REPEATS = 1.
CLEAR: PE_SEG_HEADER, PT_FIELDS2, PT_FVALUES2.
REFRESH: PT_FIELDS2, PT_FVALUES2.
CALL FUNCTION ‘SEGMENT_READ_COMPLETE’
EXPORTING
PI_SEGTYP = SEGNAME
PI_RELEASE = SAP_REL
PI_VERSION = PI_VER
IMPORTING
PE_HEADER = PE_SEG_HEADER
TABLES
PT_FIELDS = PT_FIELDS2
PT_FVALUES = PT_FVALUES2
EXCEPTIONS
SEGMENT_UNKNOWN = 1
SEGMENT_STRUCTURE_UNKNOWN = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE ‘I’ NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
PREV_SEGNAME = INT_EDIDD-SEGNAM.
ENDIF.
READ TABLE IDOC_STRUCT INTO IDOC_STRUCT_WA WITH KEY
SEGMENT_TYPE = INT_EDIDD-SEGNAM.
IF SY-SUBRC = 0.
IF IDOC_STRUCT_WA-SYNTAX_ATTRIB-MUSTFL = ‘X’.
TMP_STR = ‘Mandatory’. «»Mandatory
ELSE.
TMP_STR = ‘Optional’. «»Optional
ENDIF.
IF IDOC_STRUCT_WA-SEGMENT_TYPE_ATTRIB-QUALIFIER = ‘X’.
TMP_STR3 = ‘Qualified’.
ELSE.
TMP_STR3 = ‘Non-Qualified’.
ENDIF.
SHIFT IDOC_STRUCT_WA-SYNTAX_ATTRIB-OCCMAX
LEFT DELETING LEADING ‘0’.
MOVE SEG_REPEATS TO TMP_STR2.
CONDENSE: IDOC_STRUCT_WA-SYNTAX_ATTRIB-OCCMAX, TMP_STR2.
CONCATENATE TMP_STR2 ‘of’ IDOC_STRUCT_WA-SYNTAX_ATTRIB-OCCMAX
INTO TMP_STR2 SEPARATED BY SPACE.
WRITE IDOC_STRUCT_WA-SEGMENT_TYPE,
TMP_STR,
TMP_STR3,
TMP_STR2,
IDOC_STRUCT_WA-SYNTAX_ATTRIB-HLEVEL,
IDOC_STRUCT_WA-SEGMENT_TYPE_ATTRIB-PLAST,
IDOC_STRUCT_WA-SEGMENT_TYPE_ATTRIB-DESCRP.
ENDIF.
SORT PT_FIELDS2 BY FIELD_POS.
BYTE_FIRST = 0.
LOOP AT PT_FIELDS2.
CLEAR: FIELD_VAL.
BYTE_LAST = PT_FIELDS2-EXTLEN.
WRITE INT_EDIDD-SDATA+BYTE_FIRST(BYTE_LAST) TO
FIELD_VAL LEFT-JUSTIFIED.
SHIFT PT_FIELDS2-EXTLEN LEFT DELETING LEADING ‘0’.
SHIFT PT_FIELDS2-BYTE_FIRST LEFT DELETING LEADING ‘0’.
SHIFT PT_FIELDS2-BYTE_LAST LEFT DELETING LEADING ‘0’.
WRITE:/ ‘ ‘, PT_FIELDS2-FIELDNAME,
PT_FIELDS2-DATATYPE,
PT_FIELDS2-EXTLEN,
PT_FIELDS2-BYTE_FIRST ,
PT_FIELDS2-BYTE_LAST,
PT_FIELDS2-DESCRP,
FIELD_VAL.
READ TABLE PT_FVALUES2 WITH KEY FIELDNAME = PT_FIELDS2-FIELDNAME
FLDVALUE_L = FIELD_VAL.
ADD BYTE_LAST TO BYTE_FIRST.
IF SY-SUBRC = 0.
WRITE : PT_FVALUES2-DESCRP.
ELSE.
CLEAR PT_FVALUES2-DESCRP.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM. «» display_data_records
*&———————————————————————*
*& Form read_idoc_structure
*&———————————————————————*
* text
*———————————————————————-*
FORM READ_IDOC_STRUCTURE.
DATA: IDOCTYPE TYPE LEDID_IDOCTYPE.
IF NOT IDOC_CONTROL-CIMTYP IS INITIAL.
STRUCT_TYPE = ‘E’. «»Extended
IDOCTYPE = IDOC_CONTROL-CIMTYP.
ELSE.
STRUCT_TYPE = ‘B’. «»Basic
IDOCTYPE = IDOC_CONTROL-IDOCTP.
ENDIF.
CALL FUNCTION ‘IDOC_TYPE_COMPLETE_READ’
EXPORTING
RELEASE = SAP_REL
STRUCT_TYPE = STRUCT_TYPE
IDOCTYPE = IDOCTYPE
VERSION = PI_VER
* IMPORTING
* IDOC_TYPE = idoctype
TABLES
IDOC_STRUCT = IDOC_STRUCT
SEGMENTS = SEGMENTS
SEGMENT_STRUCT = SEGMENT_STRUCT
EXCEPTIONS
IDOCTYPE_UNKNOWN = 1
IDOCSTRUCT_UNKNOWN = 2
SEGMENT_DATA_MISSING = 3
ILLEGAL_STRUCT_TYPE = 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.
ENDIF.
ENDFORM. «» read_idoc_structure
Technorati tags: sdn blogger
Comentarios Recientes: