Está en la página 1de 46

Fuente: http://ramgvsap.wordpress.

com/category/abap/

Obtener la transaccin real (reemplazo de SY-TCODE)
07/06/2012 Rodrigo Giner de la Vega
Hay veces que la variable sy-tcode no nos trae la transaccin 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 transaccin real y no podemos usar el sy-tcode se puede utilizar el siguiente cdigo:
DATA: l_tcode TYPE SHKONTEXT-TCODE.
CALL GET_PARAM_TCOD ID PTCOD FIELD l_tcode.
De esta forma tendremos la transaccin real
Posted in ABAP, Tips And Tricks. Leave a Comment
Convertir cdigo ASCII
30/03/2012 Rodrigo Giner de la Vega
Cuando se tiene que usar caracteres que no tienen representacin grfica, 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 cdigo ascii que no estn 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 mtodo cl_abap_conv_in_ce=>uccpi. Tan solo
necesitaremos saber el cdigo 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 funcin Z y la
funcin Z copia de la funcin SAMPLE_INTERFACE_00001650. Ver seccin BTE para ms
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 visualizacin 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 Mtodo 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 posicin del pedido. Nosotros debemos controlar el error en que posicin o si es de
cabecera.
Dejo un ejemplo de como sera el caso de mostrar error en una determinada posicin 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 validacin
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 validacin"
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 Symbol
06/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 lgicas. 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 instruccin INSERT es usado para crear el field grupo de
forma dinmica. 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 instruccin 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 tcnicamente los field groups no estn en memoria sino que estn en un
espacio de paginado. as que deberan ser usado cuando estamos tratando con ms 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
tpicas 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 Patrn Header de reporte o tal vez
comentarios personalizados
03/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 creacin de un Header para cuando creamos un reporte, como
tambin puede ser usado para cuando hacemos una modificacin o comentarios
personalizados.
Utilidades > Ms utilidades > Tratar patrn > Crear Patrn

Ponemos el nombre que deseamos en mi caso ZHEADER
Y a continuacin armamos el comentario y lo Salvamos

NOTA: Los patrones no pueden tener ms de 100 lneas
Luego de vuelta al programa tan solo hay que elegir el patrn creado. (Antes yo seleccione y
borr todo ya que es un encabezado)

Y nos aparecer el patrn que armamos.
Posted in ABAP, Tips And Tricks. Leave a Comment
Custom Field usando la BAPI_INCOMINGINVOICE_CREATE
03/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+logis
tics+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 implcito 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 > Mdulos 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 estn 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 cdigo fuente de la funcin 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 ejecucin.
La BTE la podemos debuguear tranquilamente poniendo un break en la funcin creada.
Posted in ABAP, BTE. 4 Comments
Base de Datos Lgica PNP Esconder parmetros de
seleccin
27/05/2011 Rodrigo Giner de la Vega
Muchos reportes y transacciones de HR usan la base de datos lgica 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 cdigo nos permite identificar ciertas secciones
para decidir ocultarlas.
El cdigo 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 seleccin
14/04/2011 Rodrigo Giner de la Vega
Si deseamos que nuestra pantalla de seleccin salga por ejemplo as:

Lo nico que debemos hacer es editar los textos de parmetro de seleccin de la siguiente
forma:

Para saber que cdigo 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 iconos
Comprobar el cdigo de un icono usando la transaccin ICON. Puedes encontrar
una vista tcnica en el include llamado ICON. Las secuencias de caracteres
comienzan y terminan con el smbolo @. 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 Funcin que elimina un
programa report
13/04/2011 Rodrigo Giner de la Vega
Est funcin sirve para cuando necesitamos ejecutar un programa que se debe correr una
sola vez (inicializacin de alguna tabla o borrar registros erroneos).
Al final del programa llamamos a la funcin que tiene un nico parmetro 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 Funcin que nos devuelve el
nombre del job ejecutndose (runtime)
07/04/2011 Rodrigo Giner de la Vega
Si por algn motivo necesitamos saber el nombre del job con el cual un report est siendo
ejecutado podemos usar la siguiente funcin. til cuando se necesita usar una lgica
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 Catlogo de una variante
de disposicin
07/04/2011 Rodrigo Giner de la Vega
Con esta funcin se podr leer el catlogo de una variante de disposicin.
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 catlogo 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 .xls
07/04/2011 Rodrigo Giner de la Vega
El usuario requera bajar la informacin de un ALV grid a un xls, pero la corrida iba a ser en
fondo. Y la bajada tena que ser tal cual el ALV grid, mismo orden de columnas, nombres,
etc.
En resumen, antes de la ejecucin del ALV se uso la
funcin LT_DBDATA_READ_FROM_LTDX para leer el catlogo de una variante de
disposicin, despus por medio de una tabla dinmica parseo los datos y son bajados en el
servidor por medio de OPEN DATASET en un texto plano separado con tabuladores pero con
extensin .xls
El Excel ya automticamente lo abre correctamente.
Dejo el cdigo 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 catlogo 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.
* Creacin de tabla interna dinmica
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 GRID
14/01/2011 Rodrigo Giner de la Vega
Por default, el ALV siempre muestra el signo negativo del lado derecho. Si deseamos mostrar
un valor numrico negativo con signo a la izq. sin tener que pasarlo a CHAR (porque si se
tenemos que hacer sumatorias, no nos sirve).
En el Catlogo setear la siguiente mscara de edicin.
LV_FIELDCAT-EDIT_MASK = 'RRV________,__'.
Esto dar como resultado:
- 82,90
Posted in ABAP, Report. Leave a Comment
Footer (Pie de Pgina) en un ALV GRID
07/01/2011 Rodrigo Giner de la Vega
Buscando otra cosa por la web me cruce con esta pgina, quizs en algn momento tenga
que usarla, as que la agrego en mi blog, poniendo el link original del artculo. Es como
agregar un footer en un ALV GRID con la restriccin que no va a salir impreso.
Artculo 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 NAST
21/12/2010 Rodrigo Giner de la Vega
El programa RSNAST00 nos permite ejecutar una impresin 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 ms prolija de lograr previsualizar
una factura desde un botn de un programa Z, actualizare la info.
Posted in ABAP, Program. Leave a Comment
Valores fijos de un dominio DDIF_DOMA_GET
21/12/2010 Rodrigo Giner de la Vega
Si se desea obtener los valores fijos de un dominio podemos usar la funcin
DDIF_DOMA_GET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 Datos
14/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 funcin G_SET_GET_ID_FROM_NAME para obtener el nombre interno
del set y luego la funcin G_SET_FETCH nos devuelve los valores del set.

1
2
3
4
5
CALL FUNCTION 'G_SET_GET_ID_FROM_NAME'
EXPORTING
shortname = 'CME_RET_IMP_CUENTAS'
IMPORTING
NEW_SETID = lv_setid
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
EXCEPTIONS
NO_SET_FOUND = 1
NO_SET_PICKED_FROM_POPUP = 2
WRONG_CLASS = 3
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 Simulacin enter o cualquier
comando en browser.
27/05/2011 Rodrigo Giner de la Vega
Esta funcin 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 situacin done hay que obtener algn valor que aparece luego
de un enter, para disparar alguna validacin 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 reportes
24/05/2011 Rodrigo Giner de la Vega
Una manera de organizar distintos grupos de parmetros de seleccin es escondiendo y
mostrando los parmetros con un radio buton dinmico por ejemplo como se explica en la
siguiente entrada.
Radio Buttons dinmicos ocultar/mostrar grupos de parmetros de seleccin
Otra forma es dividir la pantalla de seleccin 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 lgica 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 seleccin
23/05/2011 Rodrigo Giner de la Vega
El siguiente cdigo es un ejemplo de como agregar botones en la toolbar dentro de la
pantalla de seleccin.

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 bsqueda o
proceso lgico
19/05/2011 Rodrigo Giner de la Vega
Si deseamos saber cuanto tarda una bsqueda o un determinado proceso podemos usar el
siguiente bloque de cdigo:
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 ejecucin: ', T, 'microsegundos'.
Esto sirve cuando queremos testear distintos tipos de bsquedas 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 transaccin asociada
18/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 asociacin del nombre de la transaccin 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 deberamos usar wildcard %).
Programa Ejemplo que lista programas Z* e Y* sin transaccin 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 das,
meses aos entre dos fechas
17/05/2011 Rodrigo Giner de la Vega
Con la funcin FIMA_DAYS_AND_MONTHS_AND_YEARS podremos ver la diferencia en das,
meses y aos que tienen dos fechas ingresadas como parmetro.
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 Table
16/05/2011 Rodrigo Giner de la Vega
Dejo la una pgina 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 ms.
http://www.asciitable.com/
Posted in ABAP. 3 Comments
%_HINTS Forzar bsqueda por ndice
16/05/2011 Rodrigo Giner de la Vega
Nosotros podemos adicionar una opcin a la instruccin 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 ms
comunes para Oracle y MS SQL adems las notas respectivas para quien quiera investigar un
poco ms fondo.
El ndice sera 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 versin 4.6
11/05/2011 Rodrigo Giner de la Vega
En la versin 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
versin 4.6 no tiene el parmetro HAS_FIELD_SEPARATOR, por
lo cual si deseamos levantar
un .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
AL11
28/04/2011 Rodrigo Giner de la Vega
Transaccin CG3Y: Sirve para bajar un archivo que est en el application server.
Transaccin 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 transaccin porque se corta.
Posted in ABAP, Tips And Tricks. Leave a Comment


TABDEFS (TSFTABDEF) Grfico de barras en
form Smartforms
07/01/2011 Rodrigo Giner de la Vega
Mi requerimiento era imprimir en un formulario un grafico de barras que muestre el ritmo de
mquinas a lo largo de un mes, mi primera opcin era usar IGS para generar el grfico de
barras en un formato de imagen y luego subir dicha imagen a SAP de forma dinmica 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 conversin y como mi requerimiento era imprimir varios formularios en una
sola corrida no poda darme el lujo de que tarde mucho.
Por lo cual tuve que usar otra opcin y la solucin fue la tabla TABDEFS de
tipo TSFTABDEF. Esta tabla mantiene la informacin 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 dinmica para realizar el look de un grfico de barras. As que hice
todo el grfico en base de tablas y templates de smartforms.
El resultado de algunos das de trabajo fue esto:


Esa imagen en realidad son muchsimas celdas de un solo color, que de forma dinmica les
cambio los colores para que de el look grfico de barras.

Les voy a dar las pautas que yo segu por si tienen que usarlas en algn futuro.
1. Definir los datos del grafico, o sea la longitud de las barras del grfico. 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
da).
Al formulario le pase en una estructura con 31 campos el valor de dicho da y con la
siguiente lgica armo una tabla que queda as , similar al grfico 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 grfico 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 lneas dejo una columna de separacin
O sea que tengo 6300 celdas de color verde a mi disposicin.
3. La lgica de la tabla TSFTABDEF.
Antes de explicar la lgica, algunas observaciones:
No se pueden modificar las lneas o bordes del template, solamente los colores. Los
colores funcionan con cdigo R,G,B de 0-255 (tambin hay que setearlos en notacin
hexadecimal).
Se debe modificar ANTES de procesar las ventanas con los templates del grafico de
barras, lo que significa que no puedo editar dinmicamente los valores en el MAIN, sino
que en un bloque de cdigo 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 grfico
CHECK L_TABDEF-NAME+1(8) = TEMPLATE.
l_index = l_index + 1.
* En TI_GRAFICO tengo el layout del grfico 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 vaco 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 grfico.
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 cdigo de como hacer una de las lneas de referencia.
4. Retocar y agregarle informacin al grfico de barras.
Luego de que logre funcionar el grfico en s, decid mejorarle la esttica del form, le
agregu el cuadro de referencias y una tabla superior con los valores numricos de la tabla.
Posted in Smartform. Leave a Comment
Smartforms Imprimir varios formularios pidiendo los datos de
impresin una sola vez
07/01/2011 Rodrigo Giner de la Vega
Si necesitamos imprimir varios formularios cada vez que llamemos al Smartforms nos saltar
la ventana de dialogo preguntndonos 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 interfaz
12/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 local
31/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 ms sencilla, este programa ya tiene el proceso de conversin 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 SFSY
17/04/2008 Rodrigo Giner de la Vega
Similar a la estructura SYST posee informacin propia del smartforms que podemos ver en
tiempo de ejecucin.
PAGE
Nmero/Cantidad pginas
FORMPAGES
Ctd.total pginas formularios
JOBPAGES
Ctd.total pginas 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
Cdigo retorno, cdigo retorno tras sentencias ABAP
USERNAME
Sistema SAP, nombre de acceso del usuario
PAGENAME
Nombre pgina + 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 Smartform
05/10/2007 Rodrigo Giner de la Vega
Si se desea traducir un smartforms Z de espaol y a ingles, debemos utilizar la transaccion
SE63 para realizar la misma y luego transportarla.
SE63 Menu Traduccin -> 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 espaol a ingles.
NOTA: tratar de dejar la misma alineacin 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 traduccin debemos agregar nosotros mismos la traduccin 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 traduccin.
Listo para ser transportada a QA.
http://ramgvsap.wordpress.com/?s=smartforms

También podría gustarte