You are on page 1of 29

ABAP / SAP - Tips & Tricks Pàgina 1 de 29

ABAP / SAP - Tips & Tricks


Todo sobre ABAP y SAP: Códigos, funciones, transacciones, herramientas, trucos y demás…

 Página principal
 Bienvenidos...
 Sobre mi...


ALV Tree Orientado a Objetos


26 11 2007

Hace unos días en el trabajo me tocó hacer un reporte ALV Tree .

No encontré mucha información ni manuales al respecto, mucho menos en español. Pero por suerte pude encontrar un
ejemplo que me sirvió mucho. Es un post de ALV Tree orientado a objetos del conocido Alvaro Tejada Galindo
(http://atejada.blogspot.com/2007/05/alv-tree-orientado-objetos.html#links)

Por lo tanto aprovecho para hacer referencia de ese post con algunas cosas que faltaban y cambios en la sintaxis
para que active. Y además voy a describir en detalle como crear una Dynpro y el Custom Control necesarios para
correr el reporte ALV Tree.

1º) Desde la transacción SE38 creamos el reporte Z_ALV_TREE y pegamos el siguiente código:
*&———————————————————————*
*& Report Z_ALV_TREE *
*& *
*&———————————————————————*
*& *
*& *
*&———————————————————————*

REPORT Z_ALV_TREE.

*——————————————————————*
* DECLARACION DE TYPES *
*——————————————————————*
TYPES: BEGIN OF TY_SPFLI,
CARRID TYPE SPFLI-CARRID,
CONNID TYPE SPFLI-CONNID,
COUNTRYFR TYPE SPFLI-COUNTRYFR,
CITYFROM TYPE SPFLI-CITYFROM,
AIRPFROM TYPE SPFLI-AIRPFROM,
COUNTRYTO TYPE SPFLI-COUNTRYTO,
CITYTO TYPE SPFLI-CITYTO,
END OF TY_SPFLI.

TYPES: BEGIN OF TY_HEADER,


CARRID TYPE SPFLI-CARRID,
END OF TY_HEADER.

*—————————————————————–*
* DECLARACION DE TABLAS INTERNAS *
*—————————————————————–*

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 2 de 29

DATA: T_SPFLI TYPE STANDARD TABLE OF TY_SPFLI


WITH HEADER LINE,
TAB_TREE TYPE STANDARD TABLE OF TY_SPFLI
WITH HEADER LINE,
T_TREE TYPE STANDARD TABLE OF TY_SPFLI
WITH HEADER LINE,
T_HEADER TYPE STANDARD TABLE OF TY_HEADER
WITH HEADER LINE.

*—————————————————————–*
* DECLARACION DE VARIABLES *
*—————————————————————–*
DATA: G_ALV_TREE TYPE REF TO CL_GUI_ALV_TREE,
L_HIERARCHY_HEADER TYPE TREEV_HHDR,
GS_FIELDCAT TYPE LVC_S_FCAT,
GT_FIELDCAT_TREE TYPE LVC_T_FCAT,
G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER.

*—————————————————————–*
* DECLARACION DE FIELD-SYMBOLS *
*—————————————————————–*
FIELD-SYMBOLS: <HEADER> LIKE LINE OF T_HEADER,
<SPFLI> LIKE LINE OF T_SPFLI.

*—————————————————————–*
* SELECTION-SCREEN *
*—————————————————————–*
SELECTION-SCREEN BEGIN OF SCREEN 1001.
SELECTION-SCREEN END OF SCREEN 1001.

*—————————————————————–*
* START-OF-SELECTION *
*—————————————————————–*
START-OF-SELECTION.

PERFORM OBTENER_DATOS.

IF G_ALV_TREE IS INITIAL.
PERFORM INIT_TREE.

CALL METHOD CL_GUI_CFW=>FLUSH


EXCEPTIONS CNTL_SYSTEM_ERROR = 1
CNTL_ERROR = 2.
ENDIF.

CALL SCREEN 100.

*—————————————————————–*
* FORM init_tree *
*—————————————————————–*
FORM INIT_TREE.

DATA: L_TREE_CONTAINER_NAME(30) TYPE C.

L_TREE_CONTAINER_NAME = ‘TREE_CONTROL’.

CREATE OBJECT G_CUSTOM_CONTAINER


EXPORTING
CONTAINER_NAME = L_TREE_CONTAINER_NAME
EXCEPTIONS
CNTL_ERROR =1
CNTL_SYSTEM_ERROR =2
CREATE_ERROR =3
LIFETIME_ERROR =4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.

CREATE OBJECT G_ALV_TREE


EXPORTING
PARENT = G_CUSTOM_CONTAINER
NODE_SELECTION_MODE = CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
ITEM_SELECTION =”
NO_HTML_HEADER = ‘X’
NO_TOOLBAR =”
EXCEPTIONS
CNTL_ERROR =1
CNTL_SYSTEM_ERROR =2
CREATE_ERROR =3
LIFETIME_ERROR =4
ILLEGAL_NODE_SELECTION_MODE = 5
FAILED =6
ILLEGAL_COLUMN_NAME = 7.

PERFORM FILL_CATALOG_TREE.
PERFORM BUILD_HIERARCHY_HEADER CHANGING L_HIERARCHY_HEADER.

CALL METHOD G_ALV_TREE->SET_TABLE_FOR_FIRST_DISPLAY


EXPORTING
IS_HIERARCHY_HEADER = L_HIERARCHY_HEADER
CHANGING
IT_OUTTAB = T_TREE[]
IT_FIELDCATALOG = GT_FIELDCAT_TREE.

PERFORM CREATE_HIERARCHY.

ENDFORM.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 3 de 29

*—————————————————————–*
* FORM FILL_CATALOG_TREE *
*—————————————————————–*
FORM FILL_CATALOG_TREE.

DATA: GS_FIELDCAT_ADD TYPE LVC_S_FCAT.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 1.
GS_FIELDCAT-REPTEXT = ‘Flight’.
GS_FIELDCAT-SCRTEXT_S = ‘Flight’.
GS_FIELDCAT-FIELDNAME = ‘CONNID’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 2.
GS_FIELDCAT-REPTEXT = ‘Country’.
GS_FIELDCAT-SCRTEXT_S = ‘Country’.
GS_FIELDCAT-FIELDNAME = ‘COUNTRYFR’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 3.
GS_FIELDCAT-REPTEXT = ‘Dep.City’.
GS_FIELDCAT-SCRTEXT_S = ‘Dep.City’.
GS_FIELDCAT-FIELDNAME = ‘CITYFROM’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
GS_FIELDCAT-OUTPUTLEN = ‘15′.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 4.
GS_FIELDCAT-REPTEXT = ‘Dep.Airp’.
GS_FIELDCAT-SCRTEXT_S = ‘Dep.Airp’.
GS_FIELDCAT-FIELDNAME = ‘AIRPFROM’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
GS_FIELDCAT-OUTPUTLEN = ‘20′.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 5.
GS_FIELDCAT-REPTEXT = ‘Country’.
GS_FIELDCAT-SCRTEXT_S = ‘Country’.
GS_FIELDCAT-FIELDNAME = ‘COUNTRYTO’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
GS_FIELDCAT-OUTPUTLEN = ‘15′.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS = 6.
GS_FIELDCAT-REPTEXT = ‘Arr.City’.
GS_FIELDCAT-SCRTEXT_S = ‘Arr.City’.
GS_FIELDCAT-FIELDNAME = ‘CITYTO’.
GS_FIELDCAT-TABNAME = ‘T_SPFLI’.
GS_FIELDCAT-OUTPUTLEN = ‘20′.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.

ENDFORM.

*———————————————————————*
* FORM build_hierarchy_header *
*———————————————————————*
FORM BUILD_HIERARCHY_HEADER CHANGING
P_HIERARCHY_HEADER TYPE TREEV_HHDR.

CLEAR P_HIERARCHY_HEADER.
P_HIERARCHY_HEADER-HEADING = ‘Airline carrier’(300).
P_HIERARCHY_HEADER-WIDTH = 18.
P_HIERARCHY_HEADER-WIDTH_PIX = ‘ ‘.

ENDFORM.

*———————————————————————*
* FORM create_hierarchy *
*———————————————————————*
FORM CREATE_HIERARCHY.

DATA: L_ROOT_KEY TYPE LVC_NKEY,


L_NEXT_KEY TYPE LVC_NKEY,
L_LAST_KEY TYPE LVC_NKEY,
HEADER TYPE STRING,
W_MENGE_TEXT(13) TYPE C.

CLEAR L_ROOT_KEY.

LOOP AT T_HEADER ASSIGNING <HEADER>.


CLEAR L_ROOT_KEY.
CLEAR L_NEXT_KEY.
PERFORM ADD_NODE USING <HEADER>-CARRID L_ROOT_KEY
CHANGING L_NEXT_KEY.
LOOP AT T_SPFLI ASSIGNING <SPFLI>
WHERE CARRID EQ <HEADER>-CARRID.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 4 de 29

MOVE-CORRESPONDING <SPFLI> TO TAB_TREE.

PERFORM ADD_LEAF USING TAB_TREE L_NEXT_KEY


CHANGING L_LAST_KEY.
ENDLOOP.
ENDLOOP.

CALL METHOD G_ALV_TREE->FRONTEND_UPDATE.

ENDFORM.

*———————————————————————*
* FORM ADD_NODE *
*———————————————————————*
FORM ADD_NODE USING L_NAME L_ROOT_KEY
CHANGING L_NEXT_KEY.

DATA: L_NODE_TEXT TYPE LVC_VALUE,


LS_TREE TYPE TY_SPFLI.

L_NODE_TEXT = L_NAME.
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = L_ROOT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
I_NODE_TEXT = L_NODE_TEXT
IS_OUTTAB_LINE = LS_TREE
IMPORTING
E_NEW_NODE_KEY = L_NEXT_KEY.

ENDFORM.

*———————————————————————*
* FORM ADD_LEAF *
*———————————————————————*
FORM ADD_LEAF USING L_TREE TYPE TY_SPFLI
L_NEXT_KEY
CHANGING L_LAST_KEY.

CALL METHOD G_ALV_TREE->ADD_NODE


EXPORTING
I_RELAT_NODE_KEY = L_NEXT_KEY
I_RELATIONSHIP = CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
IS_OUTTAB_LINE = TAB_TREE
IMPORTING
E_NEW_NODE_KEY = L_LAST_KEY.

ENDFORM.

*———————————————————————*
* FORM OBTENER_DATOS *
*———————————————————————*
FORM OBTENER_DATOS.

SELECT CARRID CONNID COUNTRYFR CITYFROM


AIRPFROM COUNTRYTO CITYTO
INTO TABLE T_SPFLI
FROM SPFLI.

IF SY-SUBRC EQ 0.
LOOP AT T_SPFLI ASSIGNING <SPFLI>.
MOVE <SPFLI>-CARRID TO T_HEADER-CARRID.
APPEND T_HEADER.
ENDLOOP.

SORT T_HEADER.
DELETE ADJACENT DUPLICATES FROM T_HEADER.

ENDIF.

ENDFORM.

2º) Luego de activar el reporte vamos a la transacción SE80:


Buscamos nuestro programa Z_ALV_TREE. Nos paramos sobre la carpeta con mismo nombre, click con el botón derecho
del mouse… opción Crear y luego Dynpro:

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 5 de 29

Ingresamos como número de dynpro 100. Ponemos la descripción que queramos y luego de activar apretamos el
botón “Dispos.“

A continuación se va a abrir el Screen Painter:

Clickeamos en el botón Custom Control ( ) y creamos un cuadrado con el nombre TREE_CONTROL

Simplemente falta guardar, activar… cerrar el Screen Painter. Y por último en la transacción SE80 doble click en
la carpeta Z_ALV_TREE y ejecutamos.
Cabe aclarar que este ejemplo trabaja con la tabla SPFLI que se usa comúnmente en los ejemplos.
Technorati tags: sdn blogger

Comentarios : 10 Comentarios »
Tags : ABAP, abapers, ALV, código, dynpro, objetos, Painter, Reportes, reporting, SAP, Screen, SE80, tips, tree, tricks
Categorías : ALV

Programa para listar el contenido de un IDOC


25 11 2007

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.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 6 de 29

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

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 7 de 29

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.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 8 de 29

ENDFORM. “” read_idoc_structure

Technorati tags: sdn blogger

Comentarios : Sin Comentarios »


Tags : ABAP, abapers, código, contenido, contents, dispays, IDOC, IDOCs, IDOC_READ_COMPLETELY, IDOC_TYPE_COMPLETE_READ,
listar, mostrar, programa, reporte, SAP, SEGMENT_READ_COMPLETE, tips, tricks
Categorías : IDOCs, Reportes

Leer campos de texto en SAP


24 11 2007

Para poder leer los campos de texto se usa la función read_text_inline. Esto generalmente lo usamos en formularios para
mostrar textos de cabecera o de posición por ejemplo.

Para saber como llenar los campos, vamos al lugar donde cargamos el texto:

Una vez ahí clickeamos en el menú Pasar a —> Cabecera…

VG_INLINE suele tener el valor 1 (VG_INLINE = ‘1′.)

El código que tenemos que agregar es:

DATA: VG_INLINE TYPE CHAR1,


VG_NAME LIKE THEAD-TDNAME,
IT_LINES TYPE TABLE OF IT_LIN,
IT_INLINE TYPE TABLE OF IT_LIN,
VG_ID LIKE THEAD-TDID,
VG_LANG LIKE THEAD-TDSPRAS,
VG_OBJ LIKE THEAD-TDOBJECT,

CALL FUNCTION ‘READ_TEXT_INLINE’


EXPORTING
IF = VG_ID
INLINE_COUNT = VG_INLINE
LANGUAGE = VG_LANG
NAME = VG_NAME
OBJECT = VG_OBJ
TABLES
INLINE = IT_INLINE
LINES = IT_LINES
EXCEPTIONS
ID =1
LANGUAGE =2
NAME =3
NOT_FOUND =4
OBJECT =5
REFERENCE_CHECK = 6
OTHERS = 7.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 9 de 29

* En la tabla IT_LINES nos queda el texto guardado

Technorati tags: sdn blogger

Comentarios : Sin Comentarios »


Tags : ABAP, abapers, cabecera, campos, formularios, función, FUNCTION, leer, posición, read_text_inline, SAP, texto, tips, tricks
Categorías : Funciones

Calculadora en un POP-UP
24 11 2007

El siguiente código nos generará una calculadora en una ventana (POP-UP). La función ‘FITRV_CALCULATOR’
nos devolverá en la variable X_VALUE el resultado del cálculo que haya hecho el usuario para luego utilizarlo
como queramos en nuestro programa.

*——————————————–
* Calculadora para usuarios
*——————————————–
REPORT ZCALCULADORA.

DATA: X_VALUE(15) TYPE C.

CALL FUNCTION ‘FITRV_CALCULATOR’


* EXPORTING
* INPUT_VALUE =
* CURRENCY =
* START_COLUMN = ‘10′
* START_ROW = ‘10′
IMPORTING
OUTPUT_VALUE = X_VALUE
EXCEPTIONS
INVALID_INPUT =1
CALCULATION_CANCELED =2
OTHERS = 3.

IF SY-SUBRC = 0. “En este ejemplo imprimimos por pantalla el resultado


WRITE:/ ‘Output Value ‘, X_VALUE.
ENDIF.

Technorati tags: sdn blogger

Comentarios : 2 Comentarios »
Tags : ABAP, abapers, calculadora, calculator, código, code, FITRV_CALCULATOR, función, FUNCTION, POP, programa, programm, report,
reporte, SAP, tips, tricks, UP
Categorías : Reportes

Busca un string en programas

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 10 de 29

23 11 2007

El reporte RSRSCAN1 nos va a servir para buscar un string (palabras, sentencias, mensajes, etc) en uno o más
programas. Además nos listará la cantidad de ocurrencias.

Technorati tags: sdn blogger

Comentarios : Sin Comentarios »


Tags : ABAP, abapers, buscar, caracteres, programa, programm, report, reporte, RSRSCAN1, SAP, serch, string, tips, tricks
Categorías : Trucos

Matchcode Browser (buscador de directorios)


22 11 2007

Con la siguiente función vamos a poder habilitar el matchcode para que abra un browser file (explorador de
directorios). Esto nos va a servir para hacer upload y download de archivos.

Acá el código que debemos ingresar en nuestros programas:

*En P_FILE va a quedar guardada la ruta del archivo


PARAMETERS: P_FILE LIKE RLGRAP-FILENAME.

*Llamamos a la función que abre el browser apretando el matchcode


AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
CALL FUNCTION ‘F4_FILENAME’
EXPORTING
PROGRAM_NAME = SY-REPID
DYNPRO_NUMBER = SY-DYNNR
FIELD_NAME = ‘PATH’
IMPORTING
FILE_NAME = P_FILE .

Technorati tags: sdn blogger

Comentarios : Sin Comentarios »


Tags : ABAP, abapers, archivos, browser, buscador, CALL FUNCTION 'F4_FILENAME', código, directorios, explorador, F4, file, FUNCTION,
matchcode, RLGRAP-FILENAME, ruta, SAP, tips, tricks
Categorías : Funciones, Matchcodes

Download de archivo con formato CSV (campos separados por coma)


21 11 2007

Usando el módulo de función SAP_CONVERT_TO_CSV_FORMAT vamos a poder convertir nuestra tabla interna en
una tabla con formato de separación por coma. Para luego poder generar un archivo.

Veamos el siguiente ejemplo:

*Declaramos el Type pool para la tabla de salida


TYPE-POOLS: truxs.

*Declaración de la tabla interna donde vamos poner los datos


DATA: BEGIN OF IT_TABLA1 OCCURS 0,
campo1 LIKE tabla-campo1,
campo2 LIKE tabla-campo2,
campo3 LIKE tabla-campo3,
END OF IT_TABLA1.

*Declaración de la tabla con formato CSV


DATA: IT_TABLA2 TYPE truxs_t_text_data.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 11 de 29

*Luego de llenar la tabla IT_TABLA1 con los datos


*Convertimos la tabla a formato CSV
CALL FUNCTION ‘SAP_CONVERT_TO_CSV_FORMAT’
EXPORTING
i_field_seperator = ‘;’
TABLES
i_tab_sap_data = IT_TABLA1
CHANGING
i_tab_converted_data = IT_TABLA2
EXCEPTIONS
conversion_failed = 1
others = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

*Hacemos la bajada del archivo utilizando la tabla


*que obtuvimos en el paso anterior.
CALL FUNCTION ‘GUI_DOWNLOAD’
EXPORTING
filename = ‘C:\prueba.txt’
TABLES
data_tab = IT_TABLA2
EXCEPTIONS
FILE_WRITE_ERROR = 1
NO_BATCH = 2
GUI_REFUSE_FILETRANSFER = 3
INVALID_TYPE = 4
NO_AUTHORITY = 5
UNKNOWN_ERROR = 6.

Technorati tags: sdn blogger

Comentarios : 1 Comentario »
Tags : ABAP, archivo, bajar, código, coma, comma, CSV, download, Funciones, FUNCTION, GUI_DOWNLOAD, SAP,
SAP_CONVERT_TO_CSV_FORMAT, separado, separated, tips, tricks, truxs
Categorías : Funciones

Mostrar importe en letras


20 11 2007

A la siguiente función vamos a poder pasarle en una variable un monto (importe) y la misma nos devolverá en una
estructura el importe escrito en letras (el monto en texto).

Esto suele ser muy útil sobre todo en formularios donde debemos dejar explícitos los precios en letras

DATA: IMPORTE_LETRAS TYPE SPELL.

CALL FUNCTION ‘SPELL_AMOUNT’


EXPORTING
AMOUNT = VG_MONTO “importe
CURRENCY = ‘USD’ “moneda
LANGUAGE = SY-LANGU “idioma en que devuelve el texto
IMPORTING
IN_WORDS = IMPORTE_LETRAS
EXCEPTIONS
NOT_FOUND = 1
TOO_LARGE = 2
OTHERS = 3.

* IMPORTE_LETRAS-WORD = tendrá el texto de la parte entera


* IMPORTE_LETRAS-IN_WORDS = tendrá el texto de la parte decimal.

Technorati tags: sdn blogger

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 12 de 29

Comentarios : Sin Comentarios »


Tags : ABAP, abapers, formularios, función, FUNCTION, importe, letras, monto, palabras, precios, SAP, SPELL_AMOUNT, texto, tips, tricks
Categorías : Funciones

Transporte de una orden de un ambiente a otro


19 11 2007

Voy a explicar cómo se transporta una orden de un ambiente a otro. En el ejemplo voy a mostrar como pasar una
orden de DEV (desarrollo) a QUA (calidad o test).

El primer paso es ir a la transacción SE10 (transport organizer). Llenamos el campo Usuario con el nombre de usuario
con el cual creamos la orden que queremos transportar y seleccionamos la opción Modificable.
En la siguiente pantalla nos posicionamos en la orden en cuestión:

Seleccionamos primero la tarea (1º) y clickeamos en el botón ; luego seleccionamos la orden (2º) y volvemos a
clickear el botón .

Nuestra orden ya está liberada y sólo faltaría terminar de pasarla. Generalmente en nuestros clientes suele existir
un job corriendo de fondo que se encarga de terminar de pasar las órdenes.

En caso de que este Job no exista tenemos que ir a la transacción STMS y hacer lo siguiente:

1º_ Hacemos doble click en la opción:

2º_ A continuación vamos al final de la tabla y apretamos el botón hasta que aparezca nuestra orden. Acto seguido
marcamos la orden y clickeamos en el botón .

3º_ Nos saldrá una ventana donde completamos el mandante de destino. Y en la solapa Fecha y Opciones marcamos como
se muestra en las imágenes.

Nos aparecerá un POP UP preguntando si deseamos Iniciar el import, y obviamente elegimos que SÍ.

Luego nos pedirá completar el mandante y un usuario del ambiente de destino:

4º_ Terminado lo anterior, nuestro cuarto y último paso es actualizar nuestra orden hasta que quede con el tilde

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 13 de 29

verde.

Technorati tags: sdn blogger

Comentarios : 2 Comentarios »
Tags : ABAP, abapers, ambiente, calidad, desarrollo, DEV, orden, organizer, QUA, SAP, SE10, STMS, tarea, test, transacción, transport,
transporte
Categorías : Basis, Trucos

Transacciones del Customizing (SPRO)


18 11 2007

Siempre es difícil poder acordarse o conocer las rutas de customizing de la transacción SPRO. Por lo tanto, es
bueno tener una lista de transacciones para acceder directamente a las parametrizaciones.

Con una simple búsqueda obtendremos el Código transacción y la Descripción breve de las parametrizaciones
como:
Precio de Venta, Esquemas y Clases de mensaje, pedidos, entregas, facturas, etc…

Esto es muy sencillo, vamos a la transacción SE93 (acá se crean las transacciones para asociar a los programas).
Completamos el campo “Código transacción” con los caracteres V/* y apretamos F4.

Obtendremos una lista similar con todos los códigos de transacción.

Yo considero muy útiles los códigos V/30 y V/34 que son las customizaciones de las Clases de Mensaje. Ya que
podemos ver los programas impresores y los formularios que tiene asociada una clase de mensaje.

Technorati tags: sdn blogger

Comentarios : Sin Comentarios »


Tags : ABAP, abapers, clases, condiciones, customizaciones, customizing, documento, facturas, formularios, impresores, mensaje,
parametrizaciones, pedidos, precio, programas, SAP, SE93, spro, tips, Transacciones, tricks, V/30, V/34, venta
Categorías : Transacciones

Función para sumarle meses a una fecha


17 11 2007

La siguiente función sirve para sumarle/agregarle meses a una fecha.

A la función le pasamos como parámetros una fecha de entrada (inicial) y un número de meses. La función nos
devolverá una fecha que será el resultado de agregar el número de meses a la fecha inicial.

*——————————————————————————-
*LV_DATE_ENT : Fecha de entrada a la que le calculo los meses

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 14 de 29

*LV_MES: Cantidad de meses que le sumo a LV_DATE_ENT


*LV_DATE_SAL : Fecha que me devuelve la función
*——————————————————————————-

CALL FUNCTION ‘HR_PSD_DATES_ADD_MONTHS’


EXPORTING
V_DATE = LV_DATE_ENT
V_MONTHS = LV_MES
IMPORTING
E_DATE = LV_DATE_SAL
EXCEPTIONS
NOT_POSITIVE = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

Technorati tags: sdn blogger

Comentarios : Sin Comentarios »


Tags : ABAP, abapers, add, agregar, CALL, código, date, fecha, función, Funciones, FUNCTION, HR_PSD_DATES_ADD_MONTHS, mes,
meses, months, SAP, sumar, sumarle, tips, tricks
Categorías : Funciones

Demos Workbench - Centro de Presentaciones Enjoy


16 11 2007

Con la transacción DWDM accedemos al Centro de Presentaciones Enjoy. Allí podremos ver distintos ejemplos para
agregar en nuestro programas.

Encontraremos diversos desarrollos (Controles, elementos de interfase de usuario, integración Office, etc).
A la izquierda de la pantalla veremos el listado de demos y haciendo doble click sobre cualquiera de ellos ejecutaremos el
ejemplo. Luego, apretando el botón Cód.fte. nos llevará al código fuente del demo.

Entre uno de los tantos ejemplos, nos encontraremos con un navegador web:

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 15 de 29

Technorati tags: sdn blogger

Comentarios : Sin Comentarios »


Tags : ABAP, abapers, browser, código, demos, dwdm, ejemplos, enjoy, fuente, html, navegador, presentaciones, SAP, tips, transacción, tricks,
web, workbench
Categorías : Trucos

ZVPN - Reporte que mantiene activa una VPN


14 11 2007

Es común que para trabajar con nuestros clientes utilicemos una VPN (Red privada virtual) para conectarnos.

Muchas veces cuando no hay actividad, la VPN se cae. Para evitarlo podemos dejar corriendo el siguiente reporte en otro
modo.

REPORT zvpn.

DATA: l_cont TYPE i,


l_texto(80),
l_hora(8),
l_tiempo(8),
l_horaini LIKE sy-uzeit,
l_difhora LIKE sy-uzeit.

l_horaini = sy-uzeit.
DO.
l_difhora = sy-uzeit - l_horaini.
WRITE l_difhora TO l_tiempo.
WRITE sy-uzeit TO l_hora.
WRITE sy-index TO l_texto(5).
concatenate l_texto(5) ‘Hora:’ l_hora ‘Tiempo transcurrido’ l_tiempo
into l_texto separated by space.
CALL FUNCTION ‘SAPGUI_PROGRESS_INDICATOR’
EXPORTING
text = l_texto
EXCEPTIONS
OTHERS = 1.
WAIT UP TO 30 SECONDS.
COMMIT WORK AND WAIT.
ENDDO.

Technorati tags: sdn blogger

Comentarios : 2 Comentarios »
Tags : ABAP, abapers, abierta, activa, código, programa, reporte, SAP, tips, tricks, VPN
Categorías : Reportes

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 16 de 29

Creación de IDOCs de Orden de Compra


13 11 2007

El siguiente documento explica como generar IDOCs de Orden de Compra (Purchase order) con “Punteros de
Modificación” (Changer Pointers).
Con las siguientes configuraciones una vez creada una orden de compra desde la transacción ME21N se generará un
archivo de salida (OUTBOUND) de formato XML con el contenido de la orden de compra (IDOC).

Primero un poco de teoría para entender qué es un IDOC y para qué se utilizan:
Los IDocs permiten intercambiar información entre distintos sistemas. Se lo puede ver como un archivo de texto plano,
con registros. Un Idoc es por ejemplo los datos de un proveedor, o una oferta.
Contiene una cabecera y posiciones, pero todos los datos pertenecen a la misma entidad. O sea, para transmitir datos de
más de un proveedor, haría falta más de un Idoc.
Los IDocs se crean y luego se envían. Este envío se realiza en un segundo paso; o sea que podría haber IDocs que todavía
no se hayan enviado.

Un Idoc está formato por tres bloques:

 Un registro de Control.

 Una tabla con los datos del IDoc.

 Varios registros de Estado

El registro de control contiene toda la información administrativa del IDoc, como el origen y el destinatario, y qué tipo de
IDoc es. Sería algo así como el sobre que acompaña a cualquier carta.
Este registro es muy importante ya que es necesario para saber, entre otras cosas, cuál será el destinatario del IDoc. La
tabla SAP donde se guardan es la EDIDC.

Los registros de datos se guardan en la tabla EDID4 en un campo de 1000 caracteres. Para saber interpretar esa cadena, el
registro cuenta con un campo que informa cuál es la estructura con la que se deben interpretar los datos.

Generalmente, varios registros de estado se adjuntan a un IDoc. El sistema


automáticamente asigna registros de estado durante todo el proceso, a medida que el IDoc va alcanzando diversos puntos
de control.
Contienen información de estado, tal como código de estado, fecha y hora en que el punto de control es alcanzado. Estos
registros de estado existen solamente en SAP y no son almacenados en el archivo de salida.La estructura de los
registros de estado está definida por la estructura del DDIC EDI_DS40. La tabla es EDIDS.

Desde la transacción WE30 se puede ver el formato de los Idocs.

IDOCs para órdenes de compra:


Tipo Base de IDoc:
El primer paso es verificar que contemos en el sistema con el Tipo Base de Idoc ORDERS05.

Transacción: WE30

Ingresamos el tipo base ORDERS05 y clickeamos en “visualizar”.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 17 de 29

Debemos obtener algo así.

Tipo de Mensaje en SAP:


En este paso verificamos que tengamos creado el Tipo de Mensaje ORDERS.

Transacción: WE81
Tenemos que encontrar esto.

Relación entre un tipo de Mensaje y un Tipo de IDoc:


Ahora tenemos que controlar que exista la relación entre el tipo de base Idoc y la clase de mensaje.

Transacción: WE82
Controlamos que figure la siguiente línea:

Definición de puerta:
Los Idocs pueden ser enviados y recibidos a través de diferentes medios. Con el objetivo de no acoplar la definición de las
características del medio con la aplicación que lo está utilizando, el medio es accedido vía puertos. En otras palabras, un
puerto es un nombre lógico para un dispositivo de entrada/salida. Los programas se comunican con un puerto a través de
una interfaz estándar.
En vez de definir el medio de comunicación directamente en el Acuerdo de Interlocutor (Partner Profile), se asigna
un número de puerto, y es este puerto el que designa realmente al medio. Esto permite definir las características de
los puertos individualmente y usar un puerto en múltiples Acuerdos de Interlocutores. Los cambios en un puerto se
reflejarán automáticamente en todos los acuerdos que lo estén utilizando.
Al menos un puerto debe existir para cada sistema externo.

Los tipos de puertos más comunes son los siguientes:


Ficheros (File Interface)
Permite intercambiar Idocs a través de archivos del sistema operativo.
El sistema que envía el IDoc crea un archivo en el file system. Luego notifica al sistema receptor vía RFC sincrónico que
el archivo ha sido transferido, que está localizado en un determinado directorio, y que tiene un determinado nombre.
SAP recomienda no usar nombres de archivos estáticos, dado que el archivo es sobre escrito cada vez que el Idoc se envía.
Se recomienda usar el módulo de funciones EDI_PATH_CREATE_CLIENT_DOCNUM, el cual genera el nombre del
archivo a partir del mandante y nro. de Idoc.

RFC Transaccional
Se usa para escenarios de distribución ALE. El nombre del puerto se puede definir a mano o dejar que SAP lo elija.
Además del puerto, hay que definir el destino RFC.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 18 de 29

Archivo XML Envía documentos en formato XML. Para utilizar este tipo de puerto, es necesario definir el nombre del
puerto, el formato del XML, y el nombre del archivo a generar. Al igual que con el tipo de puerto Fichero, se puede
invocar a la función EDI_PATH_CREATE_CLIENT_DOCNUM para que genere los nombres del archivo en forma
dinámica.

XML-HTTP
En vez de definir el nombre del archivo XML, se especifica un destino RFC.

Para nuestro ejemplo vamos a elegir como salida un Archivo XML. Por lo cual invocaremos a la función
EDI_PATH_CREATE_CLIENT_DOCNUM para que genere los nombres del archivo en forma dinámica.

Transacción: WE21
Dentro de la carpeta Fichero XML debemos crear y configurar nuestra Puerta de salida de la siguiente manera.

El Directorio físico lo podemos elegir a nuestro gusto, tiene que ser un directorio del servidor. Los directorios
disponibles los podemos visualizar desde la transacción AL11.

Definición de sistemas lógicos:

Transacción: BD54

Creamos un Sistema Lógico con el nombre y la descripción que queramos.

Creación de los acuerdos de interlocutores:


Un interlocutor ALE es un sistema SAP remoto o un sistema legacy con el que se intercambian datos.
El acuerdo de interlocutor especifica varias de las características de los datos que se intercambian incluyendo el
modo de operación y la organización o persona responsable por el manejo de los errores.
Cuando los datos son intercambiados entre interlocutores, es importante que el emisor y el receptor estén de
acuerdo en la sintaxis y semántica de los datos intercambiados.
Este acuerdo es lo que se llama Acuerdo de Interlocutor, y es lo que le informa al receptor de la estructura de los
datos enviados y cómo los contenidos deben ser interpretados.

Los datos definidos en un acuerdo de interlocutor son:

- Tipo de Idoc y Tipo de mensaje, los cuales son el identificador clave del acuerdo de interlocutor.

- Nombre del Emisor y Receptor que intercambiarán los Idocs para el tipo de Idoc y mensaje.

- Puerto por el cual el emisor y el receptor se comunicarán.

En el interlocutor se definen datos específicos de cada mensaje a transmitir en los parámetros de salida o entrada según
corresponda.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 19 de 29

Mediante la transacción WE20 se crea el acuerdo de interlocutor con el sistema lógico.

Transacción: WE20
Dentro de la carpeta Tp.interlocutor EDI Proveedor/Acreedor creamos lo siguiente:

El “Nº interl.EDI” debe llevar el mismo nombre del “Sistema Lógico” que creamos en el paso anterior.
El “Tp.int.EDI” tiene que ser LI (Proveedor/Acreedor).
Luego en la tabla “Parámetros salida” agregamos en Tipo mensaje: ORDERS.

A continuación hacemos doble click sobre ORDERS y llenamos como muestra esta imagen:

En la solapa “Opciones salida”, ponemos la Puerta destino que definimos anteriormente y completamos los campos
marcados con línea roja.

En la solapa “Control de mensajes” completamos como se muestra en la imagen:

En “Aplicación” ponemos EF (Pedido de compras)


Clase mensaje: NEU
Código de operación: ME10

Hacemos doble click sobre ME10 y chequeamos:

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 20 de 29

El módulo de función IDOC_OUTPUT_ORDERS es la función que se va a encargar de recolectar los datos y


formar nuestro IDOC.

Activación de punteros de modificación en forma global:

Transacción: BD61
Activamos nuestro puntero de modificación:

Activación de punteros de modificación por Tipo de Mensaje:

Transacción: BD50
Agregamos una entrada para el mensaje deseado, y la marcamos como activa.

Creación de una orden de compra:


Transacción: ME21N
Creamos un Pedido estándar (NB) y luego clickeamos en “Mensajes“

Generamos una clase de mensaje como esta:

Clase de mensaje: NEU


Medio: EDI
Función: PV

Interlocutor: ORDERIDOC (nombre del interlocutor que creamos en la definición de sistemas lógicos)

Chequeamos que en “Datos adicionales“ tengamos esto:

Apretamos en el botón GUARDAR y nos saldrá el mensaje:

Con todo esto, nuestro IDOC ya tiene que estar creado!!!. Para verificar vamos a la

Transacción: WE02
Al apretar el botón ejecutar nos listará nuestro IDOC:

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 21 de 29

La cantidad de registros de datos puede variar según la orden que hayamos creado.

Sólo nos resta ir a buscar nuestro IDOC en formato XML en el directorio físico que hayamos definido en la parte de
“Definición de puerta”

Technorati tags: sdn blogger

Comentarios : 3 Comentarios »
Tags : ABAP, abapers, BD50, BD54, BD61, código, changer, compra, EDID4, EDIDC, EDIDS, IDOC, IDOCs, IDOC_OUTPUT_ORDERS,
ME10, ME21N, modificación, NEU, OC, orden, order, ORDERS05, OUTBOUND, PO, pointers, punteros, purchase, SAP, tips, tricks, WE02,
WE20, WE21, WE30, WE81, WE82, XML
Categorías : IDOCs

Campo password (******) en pantalla de selección


11 11 2007

Si deseamos mostrar un campo de entrada como password o contraseña. Es decir que aparezcan asteriscos (****).

Entonces debemos ingresar lo siguiente:

SELECTION-SCREEN BEGIN OF BLOCK BLQ1 WITH FRAME TITLE TEXT-T01.


PARAMETERS: P_PASSWD(8).
SELECTION-SCREEN END OF BLOCK BLQ1.

AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF SCREEN-NAME EQ ‘P_PASSWD’.
SCREEN-INVISIBLE = ‘1′.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
END-OF-SELECTION.

El resultado es:

Technorati tags: sdn blogger

Comentarios : Sin Comentarios »


Tags : *, ABAP, abapers, asteriscos, campo, código, contraseña, parámetro, password, SAP, SCREEN-INVISIBLE, SCREEN-NAME, tips, tricks,
Trucos
Categorías : Códigos ABAP

Eliminar PARAMETERS y SELECT-OPTIONS creados en base de datos


lógicas y programas de control
10 11 2007

Algunas veces nos piden que hagamos una copia Z de un programa estándar para realizar distintos cambios. Uno de
esos cambios puede ser que saquemos SELECT-OPTIONS (opciones de selección) y/o PARAMETERS (parámetros) de

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 22 de 29

la pantalla de selección.

En principio parece algo sencillo pero es posible que los filtros que debemos eliminar no estén declarados en nuestra
copia Z. Esto se debe a que seguramente fueron definidos en programas de control o base de datos lógicas:

A continuación voy mostrar como sacar el filtro Sociedad de la pantalla.

Primero tenemos que saber el nombre del campo (Campo dynpro). Para eso nos paramos sobre el campo, apretamos F1
y observamos los “datos técnicos“:

Y por último vamos a nuestro programa Z y agregamos el siguiente código antes del START-OF-SELECTION:

AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF SCREEN-NAME EQ ‘BR_BUKRS-LOW‘ OR
SCREEN-NAME EQ ‘BR_BUKRS-HIGH‘ OR
SCREEN-NAME EQ ‘%_BR_BUKRS_%_APP_%-TEXT‘ OR
SCREEN-NAME EQ ‘%_BR_BUKRS_%_APP_%-OPTI_PUSH‘ OR
SCREEN-NAME EQ ‘%_BR_BUKRS_%_APP_%-VALU_PUSH‘.

SCREEN-ACTIVE = 0.
SCREEN-INPUT = 0.
MODIFY SCREEN.

ENDIF.
ENDLOOP.

Technorati tags: sdn blogger

Comentarios : Sin Comentarios »


Tags : ABAP, abapers, base, código, control, datos, eliminar, filtros, lógica, opciones, PARAMETERS, parámetros, programas, SAP, SCREEN-
ACTIVE, SCREEN-INPUT, selección, SELECT-OPTION, tips, tricks
Categorías : Códigos ABAP

Creación de Field Exit


8 11 2007

Una field exit es como una user exit que se utiliza para relacionar un campo determinado de una dynpro (pantalla) con un
programa determinado.

A una FIELD EXIT se le llama también EXIT DE CAMPO. Se hace a nivel del elemento de datos. En ella puedes poner
tus comprobaciones para un campo en el programa que quieras. Puedes tener varias field exit para un mismo campo en
distintas pantallas.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 23 de 29

Una FIELD EXIT es una función que tiene la particularidad de que sólo tiene un parámetro de entrada INPUT y uno de
salida OUTPUT.

A priori no puedes conocer ningún dato más, aunque siempre puedes utilizar otras field exits para guardar el contenido de
otros campos en variables globales al grupo de función, o utilizar la función DYNP_VALUES_READ para leer valores de
otros campos de la misma pantalla.

En un Field exit NO podemos usar ninguna de las siguientes instrucciones:

 BREAK-POINT

 CALL SCREEN

 CALL DIALOG

 CALL TRANSACTION

 SUBMIT

 COMMIT WORK

 ROLLBACK WORK

 MESSAGE I

NOTA: Para poder activar los Field Exits debemos tener el parámetro
abap/fieldexit = YES seteado en el servidor (Transacción RZ10).

A continuación voy a mostrar un ejemplo completo de cómo crear una field exit para el campo “Clave de
periodificación” de la solapa Control de la transacción CJ20N. Donde validaremos que ese campo no este vacío.

1º) Lo primero que hay que hacer es crear un grupo de función. Para eso vamos a la transacción SE80 y creamos un
nuevo grupo de función, por ejemplo: Z_ABGR_SCHL

2º) Luego debemos crear nuestra función FIELD EXIT desde la transacción SE37 con el nombre FIELD_EXIT_* ( * =
nombre que queramos ) y asociándole el grupo de función que creamos en el paso anterior. Por ejemplo:

Con esto ya vamos a tener nuestra función creada con el parámetro INPUT creado en la solapa Import y con el parámetro
OUTPUT en la solapa Export.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 24 de 29

Para terminar este paso sólo resta poner nuestro código en la solapa Cód.fte. y ACTIVAR.
Como en este caso sólo queremos validar que nuestro campo no quede vacío, el código sería así:

IF INPUT IS INITIAL.

MESSAGE ‘Complete el campo Clv.periodifica’ TYPE ‘E’.

ENDIF.

3º) En este paso volvemos a la transacción SE80 para ACTIVAR y verificar que aparezca la función que creamos:

4º) El último paso es crear nuestra FIELD EXIT. Esto es muy sencillo, simplemente ejecutamos el reporte RSMODPRF
sin parámetros desde la transacción SE38.

Allí se listarán todas las field exits existentes. Para crear la nuestra clickeamos en el menú “Exit campo” –> “Crear“ e
ingresamos nuestro elemento de datos, en este caso ABGR_SCHL. Veremos que nuestra field exit se agrega a la
lista.

Finalmente, seleccionamos la field exit que acabamos de crear y clickeamos en el botón “Asignar prog./dynpro“.
Debemos llenar los campos con el nombre del programa y el número de dynpro que queremos que nuestra field exit este
asociada (Ver la primera imagen - Datos dynpro):

Nuestra field exit nos debería quedar así:

Como vemos el Status de la field es INACTIVO. Por lo tanto nos resta simplemente volver al menú “Exit campo” y
clickear en la opción Activar

Con esto ya tenemos nuestra field exit creada y podemos verificar en la transacción CJ20N que si NO llenamos el
campo “Clave de periodificación” nos saldrá el mensaje de error que pusimos en el paso 2º

Technorati tags: sdn blogger

Comentarios : 2 Comentarios »
Tags : ABAP, abapers, cj20n, creación, crear, dato, dynpro, DYNP_VALUES_READ, elemento, exit, field, fieldexit, field_exit, input, output,
RSMODPRF, rz10, SAP, SE37, SE80, tips, tricks, user
Categorías : Field Exit

WS_EXECUTE - Función para ejecutar un programa desde SAP


7 11 2007

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 25 de 29

WS_EXECUTE es una función que nos permite ejecutar cualquier programa instalado en nuestra computadora
desde SAP. Cabe aclarar que aquel programa que queramos correr debe permitir parámetros MS-DOS.

En el siguiente ejemplo voy a mostrar como zippear (comprimir) dos archivos desde SAP. Como resultado obtendremos un
archivo WinZip que contendrá dos archivos de texto.
Comprimiremos el archivo 1.txt y el archivo 2.txt, y el resultado será el archivo destino.zip.

Parámetros que acepta WinZip desde MS-DOS: http://www.memecode.com/docs/winzip.html

Rutas de los archivos:

 C:1.txt
 C:2.txt
 C:destino.zip

Código:

CALL FUNCTION ‘WS_EXECUTE’


EXPORTING
* DOCUMENT = ‘ ‘
* CD = ‘ ‘
COMMANDLINE = ‘ -min -a c:destino.zip c:1.txt c:2.txt’
* INFORM = ‘ ‘
PROGRAM = ‘winzip32.exe’
* STAT = ‘ ‘
* WINID = ‘ ‘
* OSMAC_SCRIPT = ‘ ‘
* OSMAC_CREATOR = ‘ ‘
* WIN16_EXT = ‘ ‘
* EXEC_RC = ‘ ‘
* IMPORTING
* RBUFF =
EXCEPTIONS
FRONTEND_ERROR = 1
NO_BATCH = 2
PROG_NOT_FOUND = 3
ILLEGAL_OPTION = 4
GUI_REFUSE_EXECUTE = 5
OTHERS = 6 .

IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

Technorati tags: sdn blogger

Comentarios : 1 Comentario »
Tags : ABAP, abapers, código, comandos, comprimir, correr, DOS, ejecutar, externo, función, MS-DOS, programa, SAP, tips, tricks, WinZip,
WS_EXECUTE, zippear
Categorías : Funciones

Programa que lista USER-EXITS de una transacción


6 11 2007

El siguiente reporte muestra un listado de las USER EXITS de una transacción determinada. Sólo basta ingresar el
nombre de la transacción en la pantalla principal, y como resultado mostrará tanto el nombre como la descripción
de la USER EXIT.

*&———————————————————————*
*& Report ZUSER_EXIT

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 26 de 29

*&
*&———————————————————————*
*&
*&
*&———————————————————————*

REPORT ZUSER_EXIT.
tables : tstc, tadir, modsapt, modact, trdir, tfdir, enlfdir.
tables : tstct.
data : jtab like tadir occurs 0 with header line.
data : field1(30).
data : v_devclass like tadir-devclass.
parameters : p_tcode like tstc-tcode obligatory.

select single * from tstc where tcode eq p_tcode.


if sy-subrc eq 0.
select single * from tadir where pgmid = ‘R3TR’
and object = ‘PROG’
and obj_name = tstc-pgmna.
move : tadir-devclass to v_devclass.
if sy-subrc ne 0.
select single * from trdir where name = tstc-pgmna.
if trdir-subc eq ‘F’.
select single * from tfdir where pname = tstc-pgmna.
select single * from enlfdir where funcname =
tfdir-funcname.
select single * from tadir where pgmid = ‘R3TR’
and object = ‘FUGR’
and obj_name eq enlfdir-area.

move : tadir-devclass to v_devclass.


endif.
endif.
select * from tadir into table jtab
where pgmid = ‘R3TR’
and object = ‘SMOD’
and devclass = v_devclass.
select single * from tstct where sprsl eq sy-langu and
tcode eq p_tcode.
format color col_positive intensified off.
write:/(19) ‘Transaction Code - ‘,
20(20) p_tcode,
45(50) tstct-ttext.
skip.
if not jtab[] is initial.
write:/(95) sy-uline.
format color col_heading intensified on.
write:/1 sy-vline,
2 ‘Exit Name’,
21 sy-vline ,
22 ‘Description’,
95 sy-vline.
write:/(95) sy-uline.
loop at jtab.
select single * from modsapt
where sprsl = sy-langu and
name = jtab-obj_name.
format color col_normal intensified off.
write:/1 sy-vline,
2 jtab-obj_name hotspot on,
21 sy-vline ,
22 modsapt-modtext,
95 sy-vline.
endloop.
write:/(95) sy-uline.
describe table jtab.
skip.

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 27 de 29

format color col_total intensified on.


write:/ ‘No of Exits:’ , sy-tfill.
else.
format color col_negative intensified on.
write:/(95) ‘No User Exit exists’.
endif.
else.
format color col_negative intensified on.
write:/(95) ‘Transaction Code Does Not Exist’.
endif.

at line-selection.
get cursor field field1.
check field1(4) eq ‘JTAB’.
set parameter id ‘MON’ field sy-lisel+1(10).
call transaction ‘SMOD’ and skip first screen.
Technorati tags: sdn blogger

Comentarios : 1 Comentario »
Tags : ABAP, abapers, código, exit, programa, reporte, SAP, tips, transacción, tricks, user, USER-EXIT, USER_EXIT, ZUSER_EXIT
Categorías : Reportes

Cambiar separador decimal a un importe (puntos o comas)


31 10 2007

Generalmente entre distintas computadoras el separador decimal de un importe puede variar. Puede ser un punto o una
coma, por ejemplo 100.60 o bien 100,60 .
Como no sabemos qué configuración tiene el sistema donde se va a ejecutar nuestro programa, con lo siguiente vamos a
poder poner el separador decimal correcto automáticamente.

DATA: FORMATO_DEC LIKE USR01-DCPFM.

*Obtenemos el formato decimal del sistema en la variable FORMATO_DEC


SELECT SINGLE DCPFM
INTO FORMATO_DEC
FROM USR01
WHERE BNAME = SY-UNAME.

*Cambiamos el separador decimal a la variable de importe (LV_DMBTR)


CASE FORMATO_DEC.
WHEN ‘ ‘. “Coma Decimal
REPLACE ‘.’ IN LV_DMBTR WITH ‘,’.
WHEN ‘X’. “Punto Decimal
REPLACE ‘,’ IN LV_DMBTR WITH ‘.’.
ENDCASE.

Technorati tags: sdn blogger

Comentarios : 2 Comentarios »
Tags : ABAP, abapers, comas, dcpfm, decimal, formato, importe, SAP, separador, tips, tricks, usr01, usr01-dcpfm
Categorías : Códigos ABAP

« Entradas anteriores Entradas siguientes »

Buscar

Mi Perfil:

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 28 de 29

Enviarme un E-Mail.

Suscribirse a este blog

Suscribirse a RSS

Add me to your del.icio.us

Location of visitors

Estadísticas Del Blog:


 47,440 Visitas

Páginas:
 Bienvenidos…
 Sobre mi…

Categorías:
 ALV (3)
 Bases de datos lógica - HR (1)
 Basis (6)
 Códigos ABAP (13)
 Reportes (5)
 Field Exit (1)
 Funciones (9)
 IDOCs (2)
 Matchcodes (3)
 Módulo PP/PS (1)
 Módulo SM (1)
 SapScripts (3)
 Transacciones (9)
 Trucos (9)

Mis Últimos Posts:


 Status de Sistema AJTM (Ajuste manual necesario)
 Encabezado (Header) completo para reporte ALV
 Transacción OAER - Objetos de aplicación (imágenes)
 Ocho cosas que (probablemente) no sabías acerca de mi…
 Cambiar la denominación de las clases de órdenes
 Bases de datos lógica - HR
 Transacción SM04 - Lista de usuarios
 Transacción SU01 - Actualización de usuarios
 Transacción SCC4 - Vista de Mandantes
 Transacción SM66 - Resumen general de procesos
 Transacción SU53 - Datos de autorización de usuarios
 Enviar e-mails desde SAP
 Tabla TNAPR - tratamiento de mensajes
 TRY-CATCH para ABAP
 RSTXPDFT4 - Pasar orden de spool (formulario) a PDF

Posts Más Vistos:

http://danielpanaro.wordpress.com/page/2/ 26/05/2008
ABAP / SAP - Tips & Tricks Pàgina 29 de 29

 Bases de datos lógica - HR


 Cambiar la denominación de las clases de órdenes
 Encabezado (Header) completo para reporte ALV
 AL11 - Directorios SAP (Archivos en el servidor)
 Transacciones del Customizing (SPRO)
 ALV Tree Orientado a Objetos

Buscar Posts Por Mes:


 Mayo 2008 (3)
 Abril 2008 (8)
 Enero 2008 (1)
 Diciembre 2007 (5)
 Noviembre 2007 (22)
 Octubre 2007 (10)

Buscar Posts Por Fecha:


Mayo 2008
L MM J V S D
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
« Abr

Comentarios Recientes:
Daniel Panaro en Bases de datos lógica -…
Daniel Panaro en AL11 - Directorios SAP (Archiv…
me caes mal en Bases de datos lógica -…
Luis en AL11 - Directorios SAP (Archiv…
Encabezado (Header) … en Transacción OAER - Obje…
Daniel Panaro en ALV Tree Orientado a Obje…

Blogroll
 ..:: RAMGV::.. -[ Sap Stuff ]-
 BitacoraSapAbap
 El blog tecnológico de Blag.
 MUNDOSAP.COM
 Programación ABAP/4
 SAP COMMUNITY NETWORK
 SAP4 - SAP ABAP en castellano
 Weblogs sobre SAP

Etiquetas:

ABAP abapers activación ALV ambiente archivos búsquedas bajar Basis cálculo código completar datos download fórmula fecha form formulario
formularios función Funciones FUNCTION image imagen logo modificar orden programa programm registros report reporte rutinas SAP sapscript

SapScripts tabla texto tips transacción Transacciones transaction tricks Trucos usuarios

Blog de WordPress.com. • Theme: Freshy by Jide

http://danielpanaro.wordpress.com/page/2/ 26/05/2008

You might also like