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 ASCII30/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í:
Para esto se puede usar la clase y método cl_abap_conv_in_ce=>uccpi. Tan solo
necesitaremos saber el código ascii de dicho char.
Ejemplo:
l_field_sep = cl_abap_conv_in_ce=>uccpi( 28 ).
l_lf = cl_abap_conv_in_ce=>uccpi( 10 ).
Posted in ABAP, Tips And Tricks. Leave a Comment »
Agregar campos a los reportes FBL1N/FBL3N/FBL5N (BTE SAMPLE_INTERFACE_00001650)08/03/2012 — Rodrigo Giner de la Vega
Para agregar campos a dichos reportes hay que realizar lo siguiente:
1- Agregar, por medio de append, los campos deseados en las estructuras RFPOS y RFPOSX.
2- Implementar la BTE SAMPLE_INTERFACE_00001650. Crear un grupo de función Z y la
función Z copia de la función SAMPLE_INTERFACE_00001650. Ver sección BTE para más
detalles.
FUNCTION Z_SAMPLE_INTERFACE_00001650.
*"--------------------------------------------------------------------
--
*"*"Local Interface:
*" IMPORTING
*" VALUE(I_POSTAB) LIKE RFPOS STRUCTURE RFPOS
*" EXPORTING
*" VALUE(E_POSTAB) LIKE RFPOS STRUCTURE RFPOS
*"-------------------------------------------------------------------
e_postab = i_postab.
CLEAR e_postab-zzmotivo.
SELECT SINGLE ZZMOTIVO
FROM bkpf
INTO (e_postab-zzmotivo)
WHERE bukrs = i_postab-bukrs
AND belnr = i_postab-belnr
AND gjahr = i_postab-gjahr.
ENDFUNCTION.
3- Ejecutar estos dos reportes para regenerar las estructuras de los reportes standard. (esto
tiene que correrse por sistemas) o sea que al trasnportar a QAS hay que volver a correrlos.
RFPOSXEXTEND
BALVBUFDEL
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.
FIELD-GROUPS: HEADER, SPFLI_FG, SFLIGHT_FG, SBOOK_FG.
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
NOTA: Los patrones no pueden tener más de 100 líneas
Luego de vuelta al programa tan solo hay que elegir el patrón creado. (Antes yo seleccione y
borré todo ya que es un encabezado)
Y nos aparecerá el patrón que armamos.
Posted in ABAP, Tips And Tricks. Leave a Comment »
Custom Field usando la BAPI_INCOMINGINVOICE_CREATE03/06/2011 — Rodrigo Giner de la Vega
Esta BAPI nos permite crear una Factura de MM, el problema es que no tiene extensiones, por
lo cual si tenemos custom fields en la MIRO. (ver el link para ver como se hace)
http://wiki.sdn.sap.com/wiki/display/Snippets/
Display+customer+fields+in+header+of+logistics+invoice+verification+transactions
Yo amplié la RBKP (Cabecera) con un campo Z
Lamentablemente tenemos que me temer mano a la BAPI, busqué y no hay EXIT o BADI en la
MIRO que nos permita cambiar dichos campos.
Lo que se hizo fue implementar un ehancement point implícito al finalizar la subrutina
“rbkpv_fill” la cual posee la estructura e_rbkpv con los campos de cabecera y le pasaba el
valor deseado a mi campo Z.
Posted in ABAP, MM, MM - Function. Leave a Comment »
BTE SAMPLE_PROCESS_00001120 – Substituir valores en doc. contable.27/05/2011 — Rodrigo Giner de la Vega
Si necesitamos cambiar valores en el doc. contable podemos usar la BTE 1120.
En la FIBF en Opciones –> Módulos de proceso
Creamos la entrada
IMPORTANTE: NO PONER NADA EN EL CAMPO APLICACION, DEJARLO VACIO. SINO
NO FUNCIONA
Si queres ver como se crea una BTE desde cero mira esta entrada que tiene el paso a paso.
CREACION BTE PASO A PASO
Los campos que podemos sustituir son los campos que estén presentes en las estructuras
BKPF_SUBST y BSEG_SUBST por lo cual si nuestro campo no está deberemos ampliarlo con
un APPEND por ejemplo yo amplié la BSEG_SUBST para poder modificar los montos DMBTR y
WRBTR.
El código fuente de la función es el siguiente, es a modo ejemplo.
ZSAMPLE_PROCESS_00001120
DATA: l_cont TYPE i.
IF sy-tcode = ‘MIRO’.
LOOP AT t_bkpfsub.
MOVE ‘PRUEBA BTE’ TO t_bkpfsub-bktxt.
MODIFY t_bkpfsub.
ENDLOOP.
LOOP AT t_bsegsub.
l_cont = l_cont + 1.
IF l_cont = 5.
t_bsegsub-dmbtr = t_bsegsub-dmbtr - 5000.
ENDIF.
IF l_cont = 6.
t_bsegsub-dmbtr = t_bsegsub-dmbtr + 5000.
ENDIF.
MODIFY t_bsegsub.
ENDLOOP.
ENDIF.
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
disponibles en SAP con su ID.
DATA :
gs_icon TYPE ICON,
gt_icon TYPE TABLE OF ICON.
SELECT * FROM icon INTO TABLE gt_icon.
LOOP AT gt_icon INTO gs_icon.
WRITE :/
gs_icon-name,
33 ‘@’,
34 gs_icon-id+1(2),
36 ‘@’,
40 gs_icon-id.
ENDLOOP.
Este reporte muestra lo siguiente:
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
Cita:
REPORT ZICONS .TABLES: ICON.INCLUDE .FIELD-SYMBOLS: .
SELECT * FROM ICON.ASSIGN (ICON-NAME) TO .WRITE: /(5) , 20 '@',21 ICON-ID+1(2),23 '@',ICON-OLENG,ICON-BUTTON,ICON-STATUS,ICON-MESSAGE,ICON-FUNCTION,ICON-NAME.ENDSELECT.
Posted in ABAP, Report, Tips And Tricks. Leave a Comment »
‘RKE_DELETE_REPORT’ Función que elimina un programa report13/04/2011 — Rodrigo Giner de la Vega
Está función sirve para cuando necesitamos ejecutar un programa que se debe correr una
sola vez (inicialización de alguna tabla o borrar registros erroneos).
Al final del programa llamamos a la función que tiene un único parámetro que es el nombre
del programa.
Por lo cual el programa se ejecuta y luego es borrado, de esta forma se evita que se vuelva a
correr o dejar un programa innecesario.
Posted in ABAP, Function, Tips And Tricks. Leave a Comment »
‘GET_JOB_RUNTIME_INFO’ – Función que nos devuelve el nombre del job ejecutándose (runtime)07/04/2011 — Rodrigo Giner de la Vega
Si por algún motivo necesitamos saber el nombre del job con el cual un report está siendo
ejecutado podemos usar la siguiente función. Útil cuando se necesita usar una lógica
particular si el reporte es ejecutado con determinado nombre.
DATA: l_job TYPE ZRPT_HPARAM1-DESCRIPCION.
CALL FUNCTION ‘GET_JOB_RUNTIME_INFO’
IMPORTING
JOBNAME = l_jobname
EXCEPTIONS
NO_RUNTIME_INFO = 1
OTHERS = 2 .
Posted in ABAP, Function, Tips And Tricks. Leave a Comment »
LT_DBDATA_READ_FROM_LTDX – Catálogo de una variante de disposición07/04/2011 — Rodrigo Giner de la Vega
Con esta función se podrá leer el catálogo de una variante de disposición.
A mi particularmente me fue útil al tener que bajar en .xls un reporte grid que era corrido de
fondo.
DATA: l_varkey TYPE LTDXKEY,
TI_LTDXDATA TYPE TABLE OF LTDXDATA WITH HEADER LINE,
WA_LTDXDATA TYPE LTDXDATA,
l_variante = ‘Nombre_variante’
l_varkey-REPORT = sy-repid.
l_varkey-VARIANT = l_variante.
l_varkey-TYPE = ‘F’.
* Se lee el catálogo de la variante
CALL FUNCTION ‘LT_DBDATA_READ_FROM_LTDX’
EXPORTING
I_TOOL = ‘LT’
IS_VARKEY = l_varkey
TABLES
T_DBFIELDCAT = TI_LTDXDATA
EXCEPTIONS
NOT_FOUND = 1
WRONG_RELID = 2
OTHERS = 3 .
IF SY-SUBRC = 0.
Posted in ABAP, Function, Tips And Tricks. Leave a Comment »
Bajar un reporte de fondo en .xls07/04/2011 — Rodrigo Giner de la Vega
El usuario requería bajar la información de un ALV grid a un xls, pero la corrida iba a ser en
fondo. Y la bajada tenía que ser tal cual el ALV grid, mismo orden de columnas, nombres, etc.
En resumen, antes de la ejecución del ALV se uso la función ‘LT_DBDATA_READ_FROM_LTDX’
para leer el catálogo de una variante de disposición, después por medio de una tabla
dinámica parseo los datos y son bajados en el servidor por medio de OPEN DATASET en un
texto plano separado con tabuladores pero con extensión .xls
El Excel ya automáticamente lo abre correctamente.
Dejo el código para darse una idea del desarrollo.
DATA: l_varkey TYPE LTDXKEY,
TI_LTDXDATA TYPE TABLE OF LTDXDATA WITH HEADER LINE,
WA_LTDXDATA TYPE LTDXDATA,
flag_no_out(1),
l_variante TYPE ZRPT_HPARAM1-DESCRIPCION,
l_ruta TYPE ZRPT_HPARAM1-DESCRIPCION,
l_archivo TYPE ZRPT_HPARAM1-DESCRIPCION,
l_path(120).
l_varkey-REPORT = sy-repid.
l_varkey-VARIANT = l_variante.
l_varkey-TYPE = ‘F’.
* Se lee el catálogo de la variante
CALL FUNCTION ‘LT_DBDATA_READ_FROM_LTDX’
EXPORTING
I_TOOL = ‘LT’
IS_VARKEY = l_varkey
TABLES
T_DBFIELDCAT = TI_LTDXDATA
EXCEPTIONS
NOT_FOUND = 1
WRONG_RELID = 2
OTHERS = 3 .
IF SY-SUBRC = 0.
LOOP AT TI_LTDXDATA.
WA_LTDXDATA = TI_LTDXDATA.
AT NEW KEY1.
CLEAR flag_no_out.
ENDAT.
IF WA_LTDXDATA-PARAM = ‘NO_OUT’ AND WA_LTDXDATA-VALUE = ‘X’.
flag_no_out = ‘X’.
ENDIF.
AT END OF KEY1.
IF flag_no_out IS INITIAL.
ti_columns-name = TI_LTDXDATA-KEY1.
APPEND ti_columns.
ENDIF.
ENDAT.
ENDLOOP.
ENDIF.
* Creación de tabla interna dinámica
TYPE-POOLS : abap.
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
<dyn_wa>,
<dyn_field>.
DATA: dy_table TYPE REF TO data,
dy_line TYPE REF TO data,
xfc TYPE lvc_s_fcat,
ifc TYPE lvc_t_fcat,
l_string(1024),
l_xls(1024).
class cl_abap_char_utilities definition load.
DATA: tab type x value 9,
htab(1) type c,
l_newline(1),
f_flag(1),
ls_fieldcat TYPE LINE OF slis_t_fieldcat_alv..
htab = cl_abap_char_utilities=>horizontal_tab.
l_newline = cl_abap_char_utilities=>CR_LF.
DATA: begin of ti_lines OCCURS 0,
texto(40),
END OF ti_lines.
LOOP AT ti_columns.
CLEAR xfc.
xfc-fieldname = ti_columns-name .
xfc-datatype = ‘CHAR’.
xfc-OUTPUTLEN = ’40′.
APPEND xfc TO ifc.
ENDLOOP.
* Create dynamic internal table and assign to FS
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = ifc
i_length_in_byte = ‘X’
IMPORTING
ep_table = dy_table.
ASSIGN dy_table->* TO <dyn_table>.
* Create dynamic work area and assign to FS
CREATE DATA dy_line LIKE LINE OF <dyn_table>.
ASSIGN dy_line->* TO <dyn_wa>.
CONCATENATE l_ruta l_archivo ‘.xls’ INTO l_path.
OPEN DATASET l_path FOR OUTPUT IN TEXT MODE ENCODING DEFAULT .
IF sy-subrc <> 0.
WRITE: / text-M05, l_path.
ENDIF.
CLEAR: l_xls, f_flag.
LOOP AT ti_columns.
READ TABLE gt_fieldcat WITH KEY fieldname = ti_columns-name INTO ls_fieldcat.
IF sy-subrc = 0.
IF f_flag IS INITIAL.
l_xls = ls_fieldcat-seltext_l.
f_flag = ‘X’.
ELSE.
concatenate l_xls ls_fieldcat-seltext_l INTO l_xls SEPARATED BY htab.
ENDIF.
ENDIF.
ENDLOOP.
TRANSFER l_xls TO l_path.
DATA: TYP(1),
col(40),
l_i TYPE I,
col_wa(40).
FIELD-SYMBOLS: <col_value> TYPE ANY,
<column> TYPE ANY.
CLEAR: l_xls, f_flag.
LOOP AT gt_outtab. “gt_outtab es la tabla que muestra el ALV con sus datos y columnas.
MOVE-CORRESPONDING gt_outtab TO <dyn_wa>.
LOOP AT ti_columns.
READ TABLE gt_fieldcat WITH KEY fieldname = ti_columns-NAME INTO ls_fieldcat.
IF sy-subrc = 0.
CONCATENATE ls_fieldcat-tabname ‘-’ ls_fieldcat-fieldname INTO col.
CONCATENATE ‘<dyn_wa>-’ ls_fieldcat-fieldname INTO col_wa.
ASSIGN (col) TO <col_value>.
ASSIGN (col_wa) TO <column>.
CLEAR typ.
DESCRIBE FIELD <col_value> TYPE typ LENGTH l_i.
IF typ = ‘D’.
CONCATENATE <col_value>+6(2) <col_value>+4(2) <col_value>(4) INTO <column>
SEPARATED BY ‘-’.
ELSEIF typ = ‘P’.
<column> = <col_value>.
TRANSLATE <column> USING ‘.,’.
ELSEIF typ = ‘I’.
<column> = <col_value>.
IF <col_value> < 0.
<column> = <col_value>.
CALL FUNCTION ‘CLOI_PUT_SIGN_IN_FRONT’
CHANGING
VALUE = <column>.
ENDIF.
ENDIF.
CONDENSE <column>.
IF f_flag IS INITIAL.
l_xls = <column>.
f_flag = ‘X’.
ELSE.
concatenate l_xls <column> INTO l_xls SEPARATED BY htab.
ENDIF.
ENDIF.
ENDLOOP.
TRANSFER l_xls TO l_path.
CLEAR: l_xls, f_flag.
ENDLOOP.
CLOSE DATASET l_path.
ENDIF. "Variant
Posted in ABAP, Report. 6 Comments »
Signo Negativo a la izq. en ALV GRID14/01/2011 — Rodrigo Giner de la Vega
Por default, el ALV siempre muestra el signo negativo del lado derecho. Si deseamos mostrar
un valor numérico negativo con signo a la izq. sin tener que pasarlo a CHAR (porque si se
tenemos que hacer sumatorias, no nos sirve).
En el Catálogo setear la siguiente máscara de edición.
LV_FIELDCAT-EDIT_MASK = 'RRV________,__'.
Esto dará como resultado:
- 82,90
Posted in ABAP, Report. Leave a Comment »
Footer (Pie de Página) en un ALV GRID07/01/2011 — Rodrigo Giner de la Vega
Buscando otra cosa por la web me cruce con esta página, quizás en algún momento tenga
que usarla, así que la agrego en mi blog, poniendo el link original del artículo. Es como
agregar un footer en un ALV GRID con la restricción que no va a salir impreso.
Artículo original: http://www.sapdev.co.uk/reporting/alv/alvgrid_endlist.htm
In order to add a footer which is always displayed on screen to an ALV grid report you need to
perform the steps below. Please note this will not be displayed in the printed output
Step 1. Update ‘REUSE_ALV_GRID_DISPLAY’ FM call to include parameter
‘i_callback_html_end_of_list’
Step 2. Create new FORM ‘END_OF_LIST_HTML’ for building footer
call function 'REUSE_ALV_GRID_DISPLAY'
exporting
i_callback_program = gd_repid
i_callback_top_of_page = 'TOP-OF-PAGE'
i_callback_html_end_of_list = 'END_OF_LIST_HTML'
is_layout = gd_layout
it_fieldcat = fieldcatalog[]
i_save = 'X'
tables
t_outtab = it_ekko
exceptions
program_error = 1
others = 2.
*&-----------------------------------------------------------*
*& Form end_of_list_html
*&-----------------------------------------------------------*
* output at the end of the list - not in printed output*
*&-----------------------------------------------------------*
FORM end_of_list_html USING end TYPE REF TO cl_dd_document.
DATA: ls_text TYPE sdydo_text_element,
l_grid TYPE REF TO cl_gui_alv_grid,
f(14) TYPE c VALUE 'SET_ROW_HEIGHT'.
ls_text = 'Footer title'.
* adds and icon (red triangle)
CALL METHOD end->add_icon
EXPORTING
sap_icon = 'ICON_MESSAGE_ERROR_SMALL'.
* adds test (via variable)
CALL METHOD end->add_text
EXPORTING
text = ls_text
sap_emphasis = 'strong'.
* adds new line (start new line)
CALL METHOD end->new_line.
* display text(bold)
CALL METHOD end->add_text
EXPORTING
text = 'Bold text'
sap_emphasis = 'strong'.
* adds new line (start new line)
CALL METHOD end->new_line.
* display text(normal)
CALL METHOD end->add_text
EXPORTING
text = 'Normal text'.
* adds new line (start new line)
CALL METHOD end->new_line.
* display text(bold)
CALL METHOD end->add_text
EXPORTING
text = 'Yellow triangle'
sap_emphasis = 'strong'.
* adds and icon (yellow triangle)
CALL METHOD end->add_icon
EXPORTING
sap_icon = 'ICON_LED_YELLOW'.
* display text(normal)
CALL METHOD end->add_text
EXPORTING
text = 'More text'.
*set height of this section
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = l_grid.
CALL METHOD l_grid->parent->parent->(f)
EXPORTING
id = 3
height = 14.
ENDFORM. "end_of_list_html.
Posted in ABAP, Report. Leave a Comment »
RSNAST00 – Disparar Clases de Mensajes en la NAST21/12/2010 — Rodrigo Giner de la Vega
El programa RSNAST00 nos permite ejecutar una impresión por primera vez o reimprimir un
registro ya existe en la tabla NAST
El tilde Volver a enviar es el que tenemos que usar si deseamos reeimprimir, esto es por si
queremos en un programa Z tenemos un listado de facturas y el usuario desea visualizar
dicha factura en el modo “preview” standard de SAP.
Corriendo este programa y dentro del programa impresor antes del OPEN_FORM le seteamos
las valores para que previsualize y no imprima nada.
Si llego a encontrar, o alguno conoce, alguna otra forma más prolija de lograr previsualizar
una factura desde un botón de un programa Z, actualizare la info.
Posted in ABAP, Program. Leave a Comment »
Valores fijos de un dominio – DDIF_DOMA_GET21/12/2010 — Rodrigo Giner de la Vega
Si se desea obtener los valores fijos de un dominio podemos usar la función DDIF_DOMA_GET
123456789101112131415161718192021
DATA l_name LIKE dcobjdef-name. DATA it_dd07v LIKE dd07v OCCURS 0 WITH HEADER LINE.
REFRESH: it_dd07v. l_name = 'STATV'. CALL FUNCTION 'DDIF_DOMA_GET' EXPORTING name = l_name langu = sy-langu TABLES dd07v_tab = it_dd07v EXCEPTIONS illegal_input = 1 OTHERS = 2. IF sy-subrc = 0. SORT it_dd07v BY domvalue_l. READ TABLE it_dd07v WITH KEY domvalue_l = TI_TABLE-GBSTK. IF sy-subrc = 0. TI_TABLE-ESTADO = it_dd07v-DDTEXT. ENDIF. ENDIF.
Posted in ABAP, DDIC, Function. Leave a Comment »
Leer un set de Datos14/12/2010 — Rodrigo Giner de la Vega
Muchas veces en lugar de utilizar una tabla Z para leer datos variables, podemos usar un set
de datos (G02, GS02, GS03). El cual se lee de la siguiente forma.
Primero usamos la función G_SET_GET_ID_FROM_NAME para obtener el nombre “interno” del
set y luego la función G_SET_FETCH nos devuelve los valores del set.
123456789
CALL FUNCTION 'G_SET_GET_ID_FROM_NAME' EXPORTING shortname = 'CME_RET_IMP_CUENTAS' IMPORTING NEW_SETID = lv_setid EXCEPTIONS NO_SET_FOUND = 1 NO_SET_PICKED_FROM_POPUP = 2 WRONG_CLASS = 3
1011121314151617181920212223242526272829
WRONG_SUBCLASS = 4 TABLE_FIELD_NOT_FOUND = 5 FIELDS_DONT_MATCH = 6 SET_IS_EMPTY = 7 FORMULA_IN_SET = 8 SET_IS_DYNAMIC = 9 OTHERS = 10.
IF sy-subrc = 0. CALL FUNCTION 'G_SET_FETCH' EXPORTING setnr = lv_setid TABLES SET_LINES_BASIC = TI_RGSBV EXCEPTIONS NO_AUTHORITY = 1 SET_IS_BROKEN = 2 SET_NOT_FOUND = 3 OTHERS = 4.ENDIF.
SAPGUI_SET_FUNCTIONCODE – Simulación enter o cualquier comando en browser.27/05/2011 — Rodrigo Giner de la Vega
Esta función permite ejecutar comandos en el browser de SAP, el =00 simulará un enter.
Pero por ejemplo si ponemos el comando /i se cerrará la ventana.
Nos puede ser útil en alguna situación done hay que obtener algún valor que aparece luego
de un enter, para disparar alguna validación o abrir otra tx.
CALL FUNCTION ‘SAPGUI_SET_FUNCTIONCODE’ EXPORTING functioncode = ‘=00′ EXCEPTIONS function_not_supported = 1 OTHERS = 2.
IMPORTANTE: si se usa en un module pool cuidado con el loop infinito, porque el enter
disparará un PAI, se mostrará el PBO y luego el enter nuevamente disparará el PAI y así
sucesivamente.
Y tampoco sirve para programas ejecutados de fondo, ya que usa el GUI.
Posted in ABAP, Function, Tips And Tricks, Uncategorized. Leave a Comment »
Tabstrip – Solapas en reportes24/05/2011 — Rodrigo Giner de la Vega
Una manera de organizar distintos grupos de parámetros de selección es escondiendo y
mostrando los parámetros con un radio buton dinámico por ejemplo como se explica en la
siguiente entrada.
Radio Buttons dinámicos – ocultar/mostrar grupos de parámetros de selección
Otra forma es dividir la pantalla de selección con TabStrip sin tener que usar Module Pool
En el ejemplo de abajo si corremos el reporte en la primer solapa mostrará 20 clientes, si se
ejecuta en la segunda solapa mostrará 20 acreedores y si se ejecuta en la tercera mostrará
un simple ‘Hola Mundo’.
REPORT zreport_tab.
*———————————————————————*
* Declaraciones *
*———————————————————————*
TABLES: kna1, lfa1.
DATA: ti_kna1 TYPE TABLE OF kna1 WITH HEADER LINE,
ti_lfa1 TYPE TABLE OF lfa1 WITH HEADER LINE,
g_tab(1) VALUE ’1′.
*———————————————————————*
* selection screen *
*———————————————————————*
* Primer Tab
SELECTION-SCREEN BEGIN OF SCREEN 101 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-t00.
SELECT-OPTIONS so_kunnr FOR kna1-kunnr.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN END OF SCREEN 101.
* Segundo Tab
SELECTION-SCREEN BEGIN OF SCREEN 102 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-t02.
SELECT-OPTIONS so_lifnr FOR lfa1-lifnr.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN END OF SCREEN 102.
* Tercer Tab
SELECTION-SCREEN BEGIN OF SCREEN 103 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-t03.
SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN END OF SCREEN 103.
* Pantalla de Tabs
SELECTION-SCREEN BEGIN OF TABBED BLOCK t1 FOR 20 LINES.
SELECTION-SCREEN TAB (10) name1 USER-COMMAND ucomm1 DEFAULT SCREEN 101.
SELECTION-SCREEN TAB (20) name2 USER-COMMAND ucomm2 DEFAULT SCREEN 102.
SELECTION-SCREEN TAB (30) name3 USER-COMMAND ucomm3 DEFAULT SCREEN 103.
SELECTION-SCREEN END OF BLOCK t1.
INITIALIZATION.
* Nombre de los Tabs
name1 = ‘Primer Tab ‘.
name2 = ‘Segundo Tab’.
name3 = ‘Tercer Tab’.
AT SELECTION-SCREEN.
* Control de que tab fue elegido
CHECK sy-ucomm = ‘UCOMM1′
OR sy-ucomm = ‘UCOMM2′
OR sy-ucomm = ‘UCOMM3′.
CASE sy-ucomm.
WHEN ‘UCOMM1′.
g_tab = ’1′.
WHEN ‘UCOMM2′.
g_tab = ’2′.
WHEN ‘UCOMM3′.
g_tab = ’3′.
ENDCASE.
START-OF-SELECTION.
* Al ejecutar el reporte, dependiendo del tab seleccionado
* Correrá una lógica o la otra.
CASE g_tab.
* Primer Tab
WHEN ’1′.
SELECT * UP TO 20 ROWS FROM kna1 INTO TABLE ti_kna1.
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
i_callback_program = sy-repid
i_structure_name = ‘KNA1′
i_grid_title = ‘Datos de Clientes’
TABLES
t_outtab = ti_kna1
EXCEPTIONS
program_error = 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.
* Segundo Tab
WHEN ’2′.
SELECT * UP TO 20 ROWS FROM lfa1 INTO TABLE ti_lfa1.
CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’
EXPORTING
i_callback_program = sy-repid
i_structure_name = ‘LFA1′
i_grid_title = ‘Datos de Acreedores’
TABLES
t_outtab = ti_lfa1
EXCEPTIONS
program_error = 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.
* Tercer Tab
WHEN ’3′.
WRITE ‘Hola Mundo’.
ENDCASE.
Posted in ABAP, Program, Report, Tips And Tricks. Leave a Comment »
Agregar Botones en Toolbar dentro de la pantalla de selección23/05/2011 — Rodrigo Giner de la Vega
El siguiente código es un ejemplo de como agregar botones en la toolbar dentro de la
pantalla de selección.
REPORT zreport . TABLES: sscrfields.
DATA smp_dyntxt TYPE smp_dyntxt.
SELECTION-SCREEN FUNCTION KEY 1. SELECTION-SCREEN FUNCTION KEY 2. PARAMETERS : p_m TYPE mara-matnr .
*&———————————————————————* *& INITIALIZATION *&———————————————————————* INITIALIZATION .
CLEAR smp_dyntxt. smp_dyntxt-text = text-t01. smp_dyntxt-icon_id = ‘@1U@’. smp_dyntxt-icon_text = ‘Icon 1′. smp_dyntxt-QUICKINFO = ‘Tooltip 1′. sscrfields-functxt_01 = smp_dyntxt.
CLEAR smp_dyntxt. smp_dyntxt-text = text-t02. smp_dyntxt-icon_id = ‘@A8@’. smp_dyntxt-icon_text = ‘Icon 2′. smp_dyntxt-QUICKINFO = ‘Tooltip 2′. sscrfields-functxt_02 = smp_dyntxt.
*&———————————————————————* *& AT SELECTION-SCREEN *&———————————————————————* AT SELECTION-SCREEN.
CASE sscrfields-ucomm. WHEN ‘FC01′. "PERFORM custom_button_a.
WHEN ‘FC02′. "PERFORM custom_button_b. ENDCASE .
Posted in ABAP, Report. Leave a Comment »
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.
El resultado de algunos días de trabajo fue esto:
Esa imagen en realidad son muchísimas celdas de un solo color, que de forma dinámica les
cambio los colores para que de el look gráfico de barras.
Les voy a dar las pautas que yo seguí por si tienen que usarlas en algún futuro.
1. Definir los datos del grafico, o sea la longitud de las barras del gráfico. Para que sea
sencillo para verlo a simple vista lo que hice fue crear una tabla interna de 100 registros
(cada registro equivale a una unidad, que puede ser de 0 a 100) y 31 columnas (1 por cada
día).
Al formulario le pase en una estructura con 31 campos el valor de dicho día y con la siguiente
lógica armo una tabla que queda así , similar al gráfico de barras a nivel tabla interna
*Armado de la tabla TI_GRAFICO que determina las barra del grafico
* La tabla TI_GRAFICO va a ser una tabla 100 x 31
* En cada celda quedará una X en el caso de que deba ir valor de columna
l_cont = 100.
DO 100 times.
DO 31 times.
l_dia = l_dia + 1.
CONCATENATE ‘WA_NOTIF-DIA_’ l_dia INTO l_campo.
ASSIGN (l_campo) to <fs>.
CONCATENATE ‘WA_GRAFICO-DAY_’ l_dia INTO l_campo1.
ASSIGN (l_campo1) to <fs1>.
l_ritmo = <fs>. "WA_NOTIF-DIA_01.
IF l_ritmo >= l_cont.
<fs1> = ‘X’.
ENDIF.
ENDDO.
CLEAR l_dia.
* Va del 100 al 0.
l_cont = l_cont – 1.
APPEND wa_grafico TO ti_grafico.
CLEAR wa_grafico.
ENDDO.
2. Armado del esqueleto del gráfico de barras:
En el MAIN del Smartforms cree 100 templates 1 para cada valor del porcentaje 1%-100%
Cada template tiene 63 columnas de 1 MM de alto y 0,43 CM de largo. de color Verde
63 columnas porque como no tengo líneas dejo una columna de separación
O sea que tengo 6300 celdas de color verde a mi disposición.
3. La lógica de la tabla TSFTABDEF.
Antes de explicar la lógica, algunas observaciones:
No se pueden modificar las líneas o bordes del template, solamente los colores. Los
colores funcionan con código R,G,B de 0-255 (también hay que setearlos en notación
hexadecimal).
Se debe modificar ANTES de procesar las ventanas con los templates del grafico de
barras, lo que significa que no puedo editar dinámicamente los valores en el MAIN, sino
que en un bloque de código ABAP tengo que definir toda la tabla.
* Declaraciones
DATA: l_cont(2) TYPE N,
l_mod TYPE I,
l_index TYPE I,
l_col TYPE I,
l_campo TYPE STRING.
FIELD-SYMBOLS: <fs>.
FIELD-SYMBOLS: <F_TAB> TYPE TSFTABDEF. " Table – Actual SF definitions
DATA: L_TABDEF TYPE SSFTABDEF, " Work Area for the Table
T_LTYPES TYPE TSFLTYPE, " Table – Line types
L_LTYPES TYPE SSFLTYPE, " Work Area for the table
T_COLINFO TYPE TSFCOLINFO, " Table – Columns
L_COLINFO TYPE SSFCOLINFO, " Work area for the table
T_BORDER TYPE TSFCTABA, " Tables – Borders
L_BORDER TYPE SSFCTABA. " Work Area for the border
* Assign the table definition to the table field symbol
* Assiging by ‘(Program)Tablename’ will give as the actual table
* which contains the defination of the Smartform. We will change
* respective table background color.
ASSIGN (‘(SAPLSTXBC)TABDEFS’) TO <F_TAB>.
* Table definition table
LOOP AT <F_TAB> INTO L_TABDEF.
*/Solamente se loopean los 100 template del gráfico
CHECK L_TABDEF-NAME+1(8) = ‘TEMPLATE’.
l_index = l_index + 1.
* En TI_GRAFICO tengo el layout del gráfico a mostrar
READ TABLE TI_GRAFICO INDEX l_index INTO WA_GRAFICO.
* Table line Types
* Line type TYPE1 from the table MAIN_TABLE
LOOP AT L_TABDEF-TLTYPE INTO L_LTYPES.
* Coloum information
* Column1 (cell) of the TYPE1
CLEAR: l_col, l_cont.
LOOP AT L_LTYPES-TCOLINFO INTO L_COLINFO.
l_col = l_col + 1.
l_mod = l_col MOD 2.
* Solamente chequeo las columanas Pares
IF l_mod = 0. "Col pares
l_cont = l_cont + 1.
CONCATENATE ‘WA_GRAFICO-DAY_’ l_cont INTO l_campo.
ASSIGN (l_campo) to <fs>.
*Si <fs> esta vacío limpio la celda
IF <fs> IS INITIAL.
* Borders
* Background color and borders for that cell
LOOP AT L_COLINFO-BORDERS INTO L_BORDER.
* Clearing the color parameters for the cell
CLEAR: L_BORDER-INTENSITY, " Intensity
L_BORDER-FILLCOLOR, " Color Used
L_BORDER-CFILLCOLOR. " Color used in Hexa
MODIFY L_COLINFO-BORDERS FROM L_BORDER.
ENDLOOP.
MODIFY L_LTYPES-TCOLINFO FROM L_COLINFO.
ENDIF.
* Las columnas impares siempre se limpian
ELSE. " col impares
* Background color and borders for that cell
LOOP AT L_COLINFO-BORDERS INTO L_BORDER.
* Clearing the color parameters for the cell
CLEAR: L_BORDER-INTENSITY, " Intensity
L_BORDER-FILLCOLOR, " Color Used
L_BORDER-CFILLCOLOR. " Color used in Hexa
MODIFY L_COLINFO-BORDERS FROM L_BORDER.
ENDLOOP.
MODIFY L_LTYPES-TCOLINFO FROM L_COLINFO.
ENDIF.
ENDLOOP.
MODIFY L_TABDEF-TLTYPE FROM L_LTYPES.
ENDLOOP.
MODIFY <F_TAB> FROM L_TABDEF.
ENDLOOP.
CLEAR l_index.
** Linea Promedio
*——————————————————
LOOP AT <F_TAB> INTO L_TABDEF.
CHECK L_TABDEF-NAME+1(8) = ‘TEMPLATE’.
l_index = l_index + 1.
* Linea promedio
IF l_index = g_promedio.
LOOP AT L_TABDEF-TLTYPE INTO L_LTYPES.
LOOP AT L_LTYPES-TCOLINFO INTO L_COLINFO.
LOOP AT L_COLINFO-BORDERS INTO L_BORDER.
IF ( L_BORDER-FILLCOLOR-RED <> ’078′ AND
L_BORDER-FILLCOLOR-GREEN <> ’146′ AND
L_BORDER-FILLCOLOR-BLUE <> ’088′ ).
L_BORDER-INTENSITY = ’100′.
L_BORDER-FILLCOLOR-RED = ’021′.
L_BORDER-FILLCOLOR-GREEN = ’137′.
L_BORDER-FILLCOLOR-BLUE = ’255′.
L_BORDER-FILLCOLOR-USED = ‘X’.
L_BORDER-CFILLCOLOR-XRED = ’15′.
L_BORDER-CFILLCOLOR-XGREEN = ’89′.
L_BORDER-CFILLCOLOR-XBLUE = ‘FF’.
L_BORDER-CFILLCOLOR-COLOR = ‘X’.
MODIFY L_COLINFO-BORDERS FROM L_BORDER.
ENDIF.
ENDLOOP.
MODIFY L_LTYPES-TCOLINFO FROM L_COLINFO.
ENDLOOP.
MODIFY L_TABDEF-TLTYPE FROM L_LTYPES.
ENDLOOP.
MODIFY <F_TAB> FROM L_TABDEF.
ENDIF.
ENDLOOP.
*——————————————————
Si bien parece complicado es bastante simple, primero tomamos los valores de la tabla
TABDEFS.
ASSIGN (‘(SAPLSTXBC)TABDEFS’) TO <F_TAB>.
En esta tabla estan TODAS las deficiones de tablas, por lo cual yo restrinjo que loopee los
templates que use para el gráfico.
CHECK L_TABDEF-NAME+1(8) = ‘TEMPLATE’.
Viendo en modo debug a la tabla TABDEFS se van a dar cuenta de como funciona, por lo cual
tan solo veo contra mi tabla TI_GRAFICO (la del punto 1) si ese lugar tiene que seguir
coloreado o si debe limpiarse, como todas las columnas impares (que se usan para separar
las columnas).
Luego dejé el código de como hacer una de las líneas de referencia.
4. Retocar y agregarle información al gráfico de barras.
Luego de que logre funcionar el gráfico en sí, decidí mejorarle la estética del form, le agregué
el cuadro de referencias y una tabla superior con los valores numéricos de la tabla.
Posted in Smartform. Leave a Comment »
Smartforms – Imprimir varios formularios pidiendo los datos de impresión una sola vez07/01/2011 — Rodrigo Giner de la Vega
Si necesitamos imprimir varios formularios cada vez que llamemos al Smartforms nos saltará
la ventana de dialogo preguntándonos con que dispositivo deseamos imprimir.
Si queremos evitar esto para que salga una vez y luego utilizar las mismas opciones para el
resto de las impresiones debemos hacer lo siguiente:
Suponiendo que cada loop imprime un formulario.
DATA:ssfctrlop TYPE ssfctrlop.
* Llamada Smartform
CALL FUNCTION ‘SSF_FUNCTION_MODULE_NAME’
EXPORTING
formname = ‘ZPP_RITMO_MAQ’
IMPORTING
FM_NAME = fm_name
EXCEPTIONS
NO_FORM = 1
NO_FUNCTION_MODULE = 2
OTHERS = 3.
LOOP AT ITAB.
* Para que aparezca un solo dialogo determino si es el primero o no con el flag g_flag.
IF g_flag IS INITIAL.
ssfctrlop-no_open = space.
ssfctrlop-no_close = ‘X’.
g_flag = ‘X’.
ELSE.
ssfctrlop-no_open = ‘X’.
ssfctrlop-no_close = ‘X’.
ENDIF.
* Llamada al Smartform
CALL FUNCTION fm_name
EXPORTING
CONTROL_PARAMETERS = ssfctrlop
WA_NOTIF = NOTIF_PRINT
ARBPL = l_ARBPL
KTEXT = l_KTEXT
FECHA_INI = g_fecha_ini
FECHA_FIN = g_fecha_fin
PROMEDIO = l_prom
PROMEDIO_PLANTA = l_prom_planta
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5.
AT LAST.
* En el último registro cheque si es un solo puesto o no para setear Smartforms
IF g_flag IS NOT INITIAL.
ssfctrlop-no_open = ‘X’.
ssfctrlop-no_close = space.
ENDIF.
* Llamada al Smartform
CALL FUNCTION fm_name
EXPORTING
CONTROL_PARAMETERS = ssfctrlop
WA_NOTIF = NOTIF_PRINT
ARBPL = l_ARBPL
KTEXT = l_KTEXT
FECHA_INI = g_fecha_ini
FECHA_FIN = g_fecha_fin
PROMEDIO = l_prom
PROMEDIO_PLANTA = l_prom_planta
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR = 2
SEND_ERROR = 3
USER_CANCELED = 4
OTHERS = 5.
EXIT.
ENDAT.
ENDLOOP.
Posted in Smartform. Leave a Comment »
Bug – Smartforms sin valores en la interfaz12/12/2008 — Rodrigo Giner de la Vega
A veces suele suceder que al modificar un smartforms, al problarlo hay datos que
desaparecen como por arte de magia. Esto es un bug, por no usar el verificar y solamente el
activar.
Si sucede esto, Verificar y luego Activar. Y se soluciona.
Posted in Report. Leave a Comment »
Bajada de PDF de forma local31/03/2009 — Rodrigo Giner de la Vega
Si bien existen las funciones para bajar un OTF (SapScript o Smartforms) a PDF de esta
manera es mucho más sencilla, este programa ya tiene el proceso de conversión a PDF,
simplemente le pasamos la orden de SPOOL y la ruta donde queremos el archivo y listo.
SUBMIT rstxpdft4
USING SELECTION-SCREEN ’1000′
WITH spoolno EQ w_spool_num
WITH download EQ ‘X’
WITH p_file EQ ‘c:\download.pdf’
EXPORTING LIST TO MEMORY
AND RETURN.
Posted in Program, Report. Leave a Comment »
Estructura SFSY17/04/2008 — Rodrigo Giner de la Vega
Similar a la estructura SYST posee información propia del smartforms que podemos ver en
tiempo de ejecución.
PAGE
Número/Cantidad páginas
FORMPAGES
Ctd.total páginas formularios
JOBPAGES
Ctd.total páginas job de salida
COPYCOUNT
Contador de copias ( 1 = original, 2 = 1ª copia, …)
COPYCOUNT0
Contador de copias (0 = original, 1 = 1ª copia…)
DATE
Fecha y hora, fecha (servidor de aplicaciones) actual
TIME
Fecha y hora, hora (servidor de aplicaciones) actual
SUBRC
Código retorno, código retorno tras sentencias ABAP
USERNAME
Sistema SAP, nombre de acceso del usuario
PAGENAME
Nombre página + Variante
WINDOWNAME
Nombre ventana + Variante
XSF
Salida XSF activa/inactiva
XDF
Smart Forms SAP: Salida activa XDF
XDF2
Smart Forms SAP: Salida activa XDF
Posted in Smartform. Leave a Comment »
Traducir un Smartform05/10/2007 — Rodrigo Giner de la Vega
Si se desea traducir un smartforms Z de español y a ingles, debemos utilizar la transaccion
SE63 para realizar la misma y luego transportarla.
SE63 – Menu Traducción -> R/3 Enterprise -> Otros textos explicativos
Elejimos Smart Form SAP
En nombre de objeto ponemos el Smartforms que deseamos traducir. Con su repectivo
Idioma origen y destino.
Nos aparecera una Doble ventana en la superior estan los textos y debajo su valor (en el
idioma original) con su respectivo tipografia.
Nosotros debemos completar el cuadro de abajo elejiendo el valor que querramos en el
idioma destino, o sea traducir nosotros la palabra del español a ingles.
NOTA: tratar de dejar la misma alineación de los textos, asi no tenemos problemos con las
posiciones.
Al terminar, grabamos y activamos. Notese que no se genero ninguna orden de transporte.
Para poder transportar la traducción debemos agregar nosotros mismos la traducción a una
Orden de transporte (algo similar con los textos creados con la SO10).
Ejecutar programa RS_LXE_RECORD_TORDER
Elejimos Create Transport Request ( )
Ponemos el idioma Destino
En Clase de orden elejimos T para que al liberar no se importen automaticamente en los
otros sistemas o K para que siga la ruta especificada.
Grabamos. Esto genera una orden sin objetos. Ahora debemos llenarla.
Ejecutar programa RS_LXE_RECORD_TORDER
Ponemos el Idioma Destino ‘EN’ (ingles)
El tipo de objeto ‘SSF’ (Smartform)
Y la fecha y autor para restingir busqueda.
Nos aparecen las encontradas, ahi deberiamos ver la nuestra. La seleccionamos, ejecutamos
y nos aparece un log de concluido.
Vamos a la SE10 y vamos a ver nuestra orden creada con el respectivo Objeto de traducción.
Listo para ser transportada a QA.
http://ramgvsap.wordpress.com/?s=smartforms
Top Related