iconos en pantalla de selección, smartforms y mas!

48
Fuente: http://ramgvsap.wordpress.com/category/abap/ Obtener la transacción real (reemplazo de SY- TCODE) 07/06/2012 — Rodrigo Giner de la Vega Hay veces que la variable sy-tcode no nos trae la transacción real. Suele pasar mucho en FI, por ejemplo si entramos en la F-02 el sy-tcode nos aparece FB01 y no F-02. Si necesitamos saber la transacción real y no podemos usar el sy-tcode se puede utilizar el siguiente código: DATA: l_tcode TYPE SHKONTEXT-TCODE. CALL ‘GET_PARAM_TCOD’ ID ‘PTCOD’ FIELD l_tcode. De esta forma tendremos la transacción “real” Posted in ABAP, Tips And Tricks. Leave a Comment » Convertir código ASCII 30/03/2012 — Rodrigo Giner de la Vega Cuando se tiene que usar caracteres que no tienen representación gráfica, como el tab horizontal o el retorno de carro usamos la clase CL_ABAP_CHAR_UTILITIES con sus atributos. HORIZONTAL_TAB VERTICAL_TAB NEWLINE CR_LF FORM_FEED BACKSPACE SPACE_STR Pero si necesitamos usar por ejemplo código ascii que no están ahí, como por ejemplo FS (File Separator) el cual en el notepad de windows no lo distingueremos pero si usamos el Notepad++ lo veremos así:

Upload: gabriel-alejandro-arcia-rivas

Post on 28-Dec-2015

165 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Iconos en Pantalla de Selección, SmartForms y Mas!

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:

Page 2: Iconos en Pantalla de Selección, SmartForms y Mas!

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

Page 3: Iconos en Pantalla de Selección, SmartForms y Mas!

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( ).

Page 4: Iconos en Pantalla de Selección, SmartForms y Mas!

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.

Page 5: Iconos en Pantalla de Selección, SmartForms y Mas!

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.

Page 6: Iconos en Pantalla de Selección, SmartForms y Mas!

**************************************************************************& 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.

Page 7: Iconos en Pantalla de Selección, SmartForms y Mas!

  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 »

Page 8: Iconos en Pantalla de Selección, SmartForms y Mas!

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

Page 9: Iconos en Pantalla de Selección, SmartForms y Mas!

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)

Page 10: Iconos en Pantalla de Selección, SmartForms y Mas!

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

Page 11: Iconos en Pantalla de Selección, SmartForms y Mas!

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.

Page 12: Iconos en Pantalla de Selección, SmartForms y Mas!

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.

Page 13: Iconos en Pantalla de Selección, SmartForms y Mas!

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.

 

Page 14: Iconos en Pantalla de Selección, SmartForms y Mas!

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).

Page 15: Iconos en Pantalla de Selección, SmartForms y Mas!

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’.

 

Page 16: Iconos en Pantalla de Selección, SmartForms y Mas!

* 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 

Page 17: Iconos en Pantalla de Selección, SmartForms y Mas!

      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), 

Page 18: Iconos en Pantalla de Selección, SmartForms y Mas!

      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. 

Page 19: Iconos en Pantalla de Selección, SmartForms y Mas!

   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>. 

Page 20: Iconos en Pantalla de Selección, SmartForms y Mas!

        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

Page 21: Iconos en Pantalla de Selección, SmartForms y Mas!

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'

Page 22: Iconos en Pantalla de Selección, SmartForms y Mas!

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.

Page 23: Iconos en Pantalla de Selección, SmartForms y Mas!

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 »

Page 24: Iconos en Pantalla de Selección, SmartForms y Mas!

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

Page 25: Iconos en Pantalla de Selección, SmartForms y Mas!

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

Page 26: Iconos en Pantalla de Selección, SmartForms y Mas!

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.

Page 27: Iconos en Pantalla de Selección, SmartForms y Mas!

* 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′ 

Page 28: Iconos en Pantalla de Selección, SmartForms y Mas!

          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.

Page 29: Iconos en Pantalla de Selección, SmartForms y Mas!

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. 

Page 30: Iconos en Pantalla de Selección, SmartForms y Mas!

    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 %).

Page 31: Iconos en Pantalla de Selección, SmartForms y Mas!

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’

Page 32: Iconos en Pantalla de Selección, SmartForms y Mas!

      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

Page 33: Iconos en Pantalla de Selección, SmartForms y Mas!

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 »

Page 34: Iconos en Pantalla de Selección, SmartForms y Mas!

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 »

Page 35: Iconos en Pantalla de Selección, SmartForms y Mas!

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:

Page 36: Iconos en Pantalla de Selección, SmartForms y Mas!

                

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

Page 37: Iconos en Pantalla de Selección, SmartForms y Mas!

                            

*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

Page 38: Iconos en Pantalla de Selección, SmartForms y Mas!

        

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>.

Page 39: Iconos en Pantalla de Selección, SmartForms y Mas!

* 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. 

Page 40: Iconos en Pantalla de Selección, SmartForms y Mas!

*             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. 

Page 41: Iconos en Pantalla de Selección, SmartForms y Mas!

    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.

 

Page 42: Iconos en Pantalla de Selección, SmartForms y Mas!

* 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’. 

Page 43: Iconos en Pantalla de Selección, SmartForms y Mas!

          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

Page 44: Iconos en Pantalla de Selección, SmartForms y Mas!

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

Page 45: Iconos en Pantalla de Selección, SmartForms y Mas!

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 (  )

Page 46: Iconos en Pantalla de Selección, SmartForms y Mas!

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