Fuente: http://ramgvsap.wordpress.com/category/abap/ Obtener la transacción real (reemplazo de SY- TCODE) 07/06/2012 — Rodrigo Giner de la Vega Hay veces que la variable sy-tcode no nos trae la transacción real. Suele pasar mucho en FI, por ejemplo si entramos en la F-02 el sy-tcode nos aparece FB01 y no F-02. Si necesitamos saber la transacción real y no podemos usar el sy-tcode se puede utilizar el siguiente código: DATA: l_tcode TYPE SHKONTEXT-TCODE. CALL ‘GET_PARAM_TCOD’ ID ‘PTCOD’ FIELD l_tcode. De esta forma tendremos la transacción “real” Posted in ABAP, Tips And Tricks. Leave a Comment » Convertir código ASCII 30/03/2012 — Rodrigo Giner de la Vega Cuando se tiene que usar caracteres que no tienen representación gráfica, como el tab horizontal o el retorno de carro usamos la clase CL_ABAP_CHAR_UTILITIES con sus atributos. HORIZONTAL_TAB VERTICAL_TAB NEWLINE CR_LF FORM_FEED BACKSPACE SPACE_STR Pero si necesitamos usar por ejemplo código ascii que no están ahí, como por ejemplo FS (File Separator) el cual en el notepad de windows no lo distingueremos pero si usamos el Notepad++ lo veremos así:
48
Embed
Iconos en Pantalla de Selección, SmartForms y Mas!
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Haciendo esto ya seremos capaces de ver el campo en los reportes, ver las campos de la
variante de visualización y deberá estar disponible.
Posted in ABAP, BTE. 1 Comment »
Manejo de mensajes en BADI ME_PROCESS_PO_CUST (Orden de Compra)24/10/2011 — Rodrigo Giner de la Vega
En el Método Check de la BADI ME_PROCESS_PO_CUST, podemos realizar chequeos y
validaciones. El tema es que si utilizamos la sentencia “MESSAGE” el error aparecerá en la
última posición del pedido. Nosotros debemos controlar el error en que posición o si es de
cabecera.
Dejo un ejemplo de como sería el caso de mostrar error en una determinada posición o a
nivel cabecera
Agregar el Include “MM_MESSAGES_MAC”. Nos servirá para tener las macros disponibles.
INCLUDE MM_MESSAGES_MAC.
DATA: LS_HEADER TYPE MEPOHEADER.
DATA: LT_ITEMS TYPE PURCHASE_ORDER_ITEMS,
LS_ITEMS TYPE LINE OF PURCHASE_ORDER_ITEMS,
LS_ITEM TYPE REF TO IF_PURCHASE_ORDER_ITEM_MM,
LS_MEPOITEM TYPE MEPOITEM.
*Cabecera
LS_HEADER = IM_HEADER->GET_DATA( ).
“Si no se cumple la validación
MMPUR_BUSINESS_OBJ_ID LS_HEADER-ID. " ID cabecera
CALL METHOD IM_HEADER->INVALIDATE( ).
MMPUR_MESSAGE_FORCED ‘E’
‘ZMEN’ ’000′
‘texto’
”
”
”.
CH_FAILED = ‘X’.
*Posiciones
LT_ITEMS = IM_HEADER->GET_ITEMS( ).
LOOP AT LT_ITEMS INTO LS_ITEMS.
LS_ITEM ?= LS_ITEMS-ITEM.
LS_MEPOITEM = LS_ITEM->GET_DATA( ).
“Si no se cumple la validación"
MMPUR_BUSINESS_OBJ_ID LS_MEPOITEM-ID. " ID del item
CALL METHOD LS_ITEM->INVALIDATE( ).
MMPUR_MESSAGE_FORCED ‘E’
‘ZGIC’ ’000′
‘texto error’
”
”
”.
CH_FAILED = ‘X’. “Evita que permita grabar
ENDLOOP.
Posted in ABAP, BADI, MM. 1 Comment »
Pasar una tabla interna a un Field Symbol06/07/2011 — Rodrigo Giner de la Vega
Si deseamos asignar una tabla interna a un field symbol. Lo que debemos hacer es declarar
el Field Symbol con el agregado TYPE ANY TABLE.
Ejemplo sencillo:
DATA: it_mara TYPE TABLE OF mara. FIELD-SYMBOLS: <fs> TYPE ANY TABLE. SELECT * UP TO 10 ROWS FROM mara INTO TABLE it_mara. ASSIGN it_mara TO <fs>.Posted in ABAP. Leave a Comment »
Field Groups – Como funcionan ? caso del famoso LOOP.03/06/2011 — Rodrigo Giner de la Vega
Los Fields Groups son muy comunes al momento de usar Base de datos lógicas. Por lo tanto
seguramente lo veremos mucho en reportes standard de HR y de FI.
Seguramente alguna vez nos hemos cruzado con el famoso “LOOP. … ENDLOOP.” y nos
habremos preguntado que es eso.
Como funcionan ?
Los fields groups trabajan de la siguiente manera:
INSERT field1 field2 INTO fg
EXTRACT fg.
SORT BY fg.
LOOP. … ENDLOOP.
INSERT field1 field2 INTO fg : La instrucción INSERT es usado para crear el field grupo de
forma dinámica. Algo importante es que solamente variables globales pueden ser insertados
en un field group. Así que si estamos dentro de una subrutina no podemos usar una variable
declarada en forma local.
EXTRACT fg: Esta instrucción “combina” todos los campos en el field group y los va
grabando en forma secuencial.
SORT BY fg: Simplemente ordena el field group.
LOOP AND ENDLOOP: Va recorriendo el field group creado. Se pueden usar cortes de
control AT.
LOOP.
AT ***
……
….
ENDAT.
AT ***
…..
….
ENDAT.
ENDLOOP.
Cuando usarlos ?
En simples palabras técnicamente los field groups no están en memoria sino que están en un
espacio de paginado. así que deberían ser usado cuando estamos tratando con más de
50.000 registros. Sino no tiene sentido.
Como usarlos ?
Dejo un reporte simple de ejemplo que encontré por la web usando las tablas de de SPFLI
típicas en los tutoriales de SAP.
**************************************************************************& Report ZSPFLI * ************************************************************************* REPORT ZSPFLI LINE-SIZE 132 LINE-COUNT 65(3) NO STANDARD PAGE HEADING. TABLES:SPFLI,SCARR, SFLIGHT, SBOOK. SELECT-OPTIONS: MYCARRID FOR SPFLI-CARRID.
INSERT: SPFLI-CARRID SPFLI-CONNID SFLIGHT-FLDATE SBOOK-BOOKID INTO HEADER,
SPFLI-CARRID SPFLI-CONNID SPFLI-CITYFROM SPFLI-AIRPFROM SPFLI-CITYTO SPFLI-AIRPTO SPFLI-DEPTIME SCARR-CARRNAME INTO SPFLI_FG,
SFLIGHT-FLDATE SFLIGHT-SEATSMAX SFLIGHT-SEATSOCC SFLIGHT-PRICE INTO SFLIGHT_FG,
SBOOK-BOOKID SBOOK-CUSTOMID SBOOK-CUSTTYPE SBOOK-SMOKER INTO SBOOK_FG.
SELECT * FROM SPFLI WHERE CARRID IN MYCARRID. SELECT SINGLE * FROM SCARR WHERE CARRID = SPFLI-CARRID. EXTRACT SPFLI_FG.
SELECT * FROM SFLIGHT WHERE CARRID = SPFLI-CARRID AND CONNID = SPFLI-CONNID. EXTRACT SFLIGHT_FG.
SELECT * FROM SBOOK WHERE CARRID = SFLIGHT-CARRID AND CONNID = SFLIGHT-CONNID AND FLDATE = SFLIGHT-FLDATE. EXTRACT SBOOK_FG. CLEAR SBOOK. ENDSELECT. CLEAR SFLIGHT. ENDSELECT. CLEAR SPFLI. ENDSELECT.
SORT. LOOP. AT SPFLI_FG. FORMAT COLOR COL_HEADING. WRITE: / SCARR-CARRNAME, SPFLI-CONNID, SPFLI-CITYFROM, SPFLI-AIRPFROM, SPFLI-CITYTO, SPFLI-AIRPTO, SPFLI-DEPTIME. FORMAT COLOR OFF. ENDAT.
AT SFLIGHT_FG. WRITE: /15 SFLIGHT-FLDATE, SFLIGHT-PRICE, SFLIGHT-SEATSMAX, SFLIGHT-SEATSOCC. ENDAT.
AT SBOOK_FG. WRITE: /30 SBOOK-BOOKID, SBOOK-CUSTOMID, SBOOK-CUSTTYPE, SBOOK-SMOKER. ENDAT. ENDLOOP.
************************************************************************ *& END OF REPORT * ************************************************************************
Posted in ABAP, Report. Leave a Comment »
Crear un Patrón – Header de reporte o tal vez comentarios personalizados03/06/2011 — Rodrigo Giner de la Vega
Hay mucha gente que no sabe que SAP nos permite crear nuestros propios patrones.
Este es un ejemplo sencillo de creación de un Header para cuando creamos un reporte, como
también puede ser usado para cuando hacemos una modificación o comentarios
personalizados.
Utilidades > Más utilidades > Tratar patrón > Crear Patrón
Ponemos el nombre que deseamos en mi caso ZHEADER
Y a continuación armamos el comentario y lo Salvamos
Si modificamos los montos DEBEMOS asegurarnos que el doc. cierre (o sea que el saldo sea
0) sinó nos aparecerá el mensaje de dump luego de la ejecución.
La BTE la podemos debuguear tranquilamente poniendo un break en la función creada.
Posted in ABAP, BTE. 4 Comments »
Base de Datos Lógica – PNP – Esconder parámetros de selección27/05/2011 — Rodrigo Giner de la Vega
Muchos reportes y transacciones de HR usan la base de datos lógica PNP, y muchas veces
tenemos que hacer un Z de dichos reportes y no queremos mostrar TODOS los elementos
definidos en la LDB PNP, así que el siguiente código nos permite identificar ciertas secciones
para decidir ocultarlas.
El código oculta todas las secciones, tan solo hay que poner las que nos interesa ocultar
AT SELECTION-SCREEN OUTPUT. LOOP AT SCREEN. CHECK SCREEN-GROUP1 = ‘MSL’ OR "further selections button SCREEN-GROUP1 = ‘MCD’ OR "matchcodes button SCREEN-GROUP1 = ‘SRT’ OR "sort button SCREEN-GROUP1 = ‘ZBK’ OR "today & other period radiobuttons SCREEN-GROUP1 = ‘ZB2′ OR "upto & from today, current year & month radiobuttons SCREEN-GROUP1 = ‘XDA’ OR "other period boxes SCREEN-GROUP1 = ‘XPS’ OR "person selection period & boxes SCREEN-GROUP1 = ‘PER’. "payroll period button SCREEN-ACTIVE = ’0′. MODIFY SCREEN. ENDLOOP.
Iconos en pantalla de selección14/04/2011 — Rodrigo Giner de la Vega
Si deseamos que nuestra pantalla de selección salga por ejemplo así:
Lo único que debemos hacer es editar los textos de parámetro de selección de la siguiente
forma:
Para saber que código de ID es cada ícono dejo un programa que lista todos los íconos
Agregar iconosComprobar el código de un icono usando la transacción ICON. Puedes encontrar una vista técnica en el include llamado «ICON». Las secuencias de caracteres comienzan y terminan con el símbolo @. Incluso textos planos bajo sistemas operativos puede contener estos caracteres.
Os dejo aquí un programa que lista todos los iconos que hay en sap
GET RUN TIME – Medir el tiempo de una búsqueda o proceso lógico19/05/2011 — Rodrigo Giner de la Vega
Si deseamos saber cuanto tarda una búsqueda o un determinado proceso podemos usar el
siguiente bloque de código:
DATA: T1 TYPE I,T2 TYPE I,T TYPE P DECIMALS 2,N TYPE I VALUE 10000.
T = 0.DO N TIMES. GET RUN TIME FIELD T1.
****************************** Codigo a testear ******************************
GET RUN TIME FIELD T2. T2 = T2 - T1. T = T + T2 / N.ENDDO.
WRITE: / 'Tiempo de ejecución: ', T, 'microsegundos'.
Esto sirve cuando queremos testear distintos tipos de búsquedas o si el usuario desea saber
cuanto tardó en correr el programa o reporte.
Posted in ABAP, Tips And Tricks. Leave a Comment »
Programas Z sin transacción asociada18/05/2011 — Rodrigo Giner de la Vega
La tabla que contiene todos los programas en SAP es la TRDIR y la tabla que posee todas las
transacciones es la TSTC.
La tabla TSTC tiene la asociación del nombre de la transacción con su respectivo programa.
Por lo cual sabiendo esto. Podemos obtener de la TRDIR todos los programas Z* e Y*
(recordar que al hacer el SELECT deberíamos usar wildcard %).
Programa Ejemplo que lista programas Z* e Y* sin transacción asociada.
REPORT Z_PROGRAMAS_SIN_TX.
DATA: ti_trdir TYPE TABLE OF trdir, ti_tstc TYPE TABLE OF tstc, wa_trdir TYPE trdir.
* Tomamos todas las transacciones Z* e Y*SELECT * FROM tstc INTO TABLE ti_tstc WHERE tcode LIKE 'Z%' OR tcode LIKE 'Y%'.
* Tomamos todas las programas Z* e Y*SELECT * FROM trdir INTO TABLE ti_trdir WHERE ( NAME LIKE 'Z%' OR NAME LIKE 'Y%' ) AND subc = '1'. "Reporte Ejecutable SORT ti_tstc BY pgmna.
LOOP AT ti_trdir INTO wa_trdir. READ TABLE ti_tstc TRANSPORTING NO FIELDS WITH KEY pgmna = wa_trdir-NAME.
IF sy-subrc NE 0. WRITE: / wa_trdir-NAME. ENDIF.ENDLOOP.
Posted in ABAP, BASIS, Program, Tips And Tricks. Leave a Comment »
FIMA_DAYS_AND_MONTHS_AND_YEARS – Diferencia de días, meses años entre dos fechas17/05/2011 — Rodrigo Giner de la Vega
Con la función FIMA_DAYS_AND_MONTHS_AND_YEARS podremos ver la diferencia en días,
meses y años que tienen dos fechas ingresadas como parámetro.
El ejemplo que sigue saca la diferencia entre el LOW y HIGH de un select option.
DATA: l_dif TYPE VTBBEWE-ATAGE.
CALL FUNCTION ‘FIMA_DAYS_AND_MONTHS_AND_YEARS’
EXPORTING
I_DATE_FROM = so_AIDAT-LOW
I_DATE_TO = so_AIDAT-HIGH
IMPORTING
E_DAYS = l_dif.
Posted in ABAP, Function. Leave a Comment »
ASCII Table16/05/2011 — Rodrigo Giner de la Vega
Dejo la una página donde podemos ver la tabla ASCII, hace no mucho la tuve que usar para
convertir ciertos caracteres en un tema de Webservice y nunca está de más.
http://www.asciitable.com/
Posted in ABAP. 3 Comments »
%_HINTS – Forzar búsqueda por índice16/05/2011 — Rodrigo Giner de la Vega
Nosotros podemos adicionar una opción a la instrucción SELECT para forzar el uso de un
índice en particular para mejorar la performance. Dicho índice debe existir en el diccionario
de datos (DDIC) y solo sirve para tablas transparentes.
El adicional %_HINTS variará dependiendo de la DB que use SAP, dejo los ejemplos más
comunes para Oracle y MS SQL además las notas respectivas para quien quiera investigar un
poco más fondo.
El índice sería el ERD de la tabla VBAK.
ORACLE:
SELECT * FROM VBAK INTO TABLE TI_VBAK WHERE ERDAT IN so_ERDAT %_HINTS ORACLE 'INDEX(“VBAK” “VBAK-ERD”)'.
MS SQL:
SELECT * FROM VBAK INTO TABLE TI_VBAK
WHERE ERDAT IN so_ERDAT %_HINTS MSSQLNT 'TABLE &TABLE& ABINDEX(ERD)'.
NOTAS RELACIONADAS:
129385 -Database Hints in OPEN SQL
130480 – Database Hints in OPEN SQL for ORACLE
133381 – Database Hints in OPEN SQL for MS SQL SERVER
150037 – Database Hints in OPEN SQL for DB6(DB2 UDB)
152913 – Database Hints in OPEN SQL for INFORMIX
652096 – Database Hints in OPEN SQL for SAPDB / MaxDB
Posted in ABAP, DB, DDIC. 1 Comment »
(Horizontal tab – New Line) Tab y retorno de carro en versión 4.611/05/2011 — Rodrigo Giner de la Vega
En la versión 4.6B/C no existe la clase CL_ABAP_CHAR_UTILITIES por lo que si necesitamos
usar dichos caracteres especiales.
Tendremos que hacer lo siguiente:
DATA: BEGIN OF new_line, x(2) TYPE x VALUE '0D0A', END OF new_line.DATA: BEGIN OF tab, t(1) TYPE x VALUE '09', END OF tab.Con esas declaraciones hechas ya podemos usarla como constantes, por ejemplo:SPLIT l_string AT tab INTO TABLE ti_datos. Esto es útil ya que la GUI_UPLOAD por ejemplo, en la versión 4.6 no tiene el parámetro HAS_FIELD_SEPARATOR, por lo cual si deseamos levantarun .txt tabulado necesitaremos grabarlo en un tabla que sea string y luego hacer el split. Posted in ABAP, Tips And Tricks. Leave a Comment »
CG3Y – CG3Z (Download – Upload) File into application server – AL1128/04/2011 — Rodrigo Giner de la Vega
Transacción CG3Y: Sirve para bajar un archivo que está en el application server.
Transacción CG3Z: Sirve para subir un archivo que está al application server.
Esto es útil cuando hay un archivo muy extenso (a lo ancho) en la AL11 que no podemos
bajarlo desde la misma transacción porque se “corta”.
Posted in ABAP, Tips And Tricks. Leave a Comment »
TABDEFS (TSFTABDEF) – Gráfico de barras en form Smartforms07/01/2011 — Rodrigo Giner de la Vega
Mi requerimiento era imprimir en un formulario un grafico de barras que muestre el ritmo de
máquinas a lo largo de un mes, mi primera opción era usar IGS para generar el gráfico de
barras en un formato de imagen y luego “subir” dicha imagen a SAP de forma dinámica para
que luego en el smartforms levante dicha imagen. El problema pasa que la SE78 solo soporta
BMP y TIFF y el IGS genera GIF o JPG. Hay una forma de hacerlo, investigue y existe una
forma de convertir una imagen JPG a BMP, por ejemplo. El problema es que tarda bastante
en realizar dicha conversión y como mi requerimiento era imprimir varios formularios en una
sola corrida no podía darme el lujo de que tarde mucho.
Por lo cual tuve que usar otra opción y la solución fue la tabla TABDEFS de
tipo TSFTABDEF. Esta tabla mantiene la información de las definiciones de las Tablas de un
Smartform, incluyendo el color de los Templates, entonces se me ocurrió la idea de Editar
dicha tabla de forma dinámica para realizar el “look” de un gráfico de barras. Así que hice
todo el gráfico en base de tablas y templates de smartforms.