Showing posts with label Report. Show all posts
Showing posts with label Report. Show all posts

Salvar datos en ALV editable con un status bar Z

El otro día me cruce con un error muy bizarro. Yo tenía un ALV editable al cual tuve que agregarle un status bar Z por agregar un botón nuevo.

Copie la status bar standard a mi programa y lo modifique. La status bar STANDARD que esta en el grupo de funciones SALV, no tiene definido el Function Code del boton Grabar (SAVE). entonces le setee el nombre &SAVE.

Que paso ? Si yo cambiaba el valor de algun campo editable del ALV al llegar al USER_COMMAND no veía el nuevo valor ingresado sino que veía el antiguo. Y eso andaba bien por lo cual el error debía estar en la status bar. Y efectivamente así fue.

Para que los datos de un ALV editable sea visibles en el FORM USER_COMMAND, el function code de la status bar tiene que ser &DATA_SAVE. De tener otro nombre la información no es pasada al USER_COMMAND.

Radio Buttons dinámicos y ocultar/mostrar grupos de parámetros de selección

Una vez necesite hacer una pantalla de selección dinámica, es decir que si elegía un radio button debía mostrar X cantidad de parámetros y ocultar otros, y viceversa sin la necesidad de que tengamos que apretar un ENTER para que se dispare el evento AT-SELECTION-SCREEN.

El siguiente código lo arme como modo ejemplo para que se den cuenta de como usarlo

 

REPORT ZRADIO_BUTTONS.
PARAMETERS: p_1(10) MODIF ID A,
                       p_2(2)   MODIF ID B,
                       p_3(5).
PARAMETERS: p_A RADIOBUTTON GROUP rad1 USER-COMMAND ACT DEFAULT 'X',
                       p_B RADIOBUTTON GROUP rad1.

AT SELECTION-SCREEN OUTPUT.
LOOP AT screen.
  IF p_A = 'X'.
     IF screen-group1 = 'B'.
     screen-active = 0.
     ENDIF.
  ELSEIF p_B = 'X'.
    IF screen-group1 = 'A'.
    screen-active = 0.
    ENDIF.
  ENDIF.

  MODIFY screen.
ENDLOOP.

 

El MODIF ID lo que hace es darle un identificador a cada parámetro por lo cual no es necesario ocultar cada uno de los parámetros, sino que es más práctico ocultar directamente todos los elementos de un grupo.

La adición USER-COMMAND es la que permite que la selección sea dinámica y que no haya que apretar un enter para ejecutar un PAI.

NOTA: Al usar este método es muy molesto tener parámetros de selección OBLIGATORIOS, porque de no estar completos nos va a saltar la validación y los radio button no funcionarán de la forma deseada. Así que de usar Radio buttons dinámicos la validaciones las deberemos hacer manualmente nosotros mismos.

Bajada de PDF de forma local

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.

Crear ComboBox en reportes

En SAP tenemos el Matchcode, pero muchas veces es tedioso ya que tarda. De esta forma tendremos un combobox.

El parámetro ps_parm tendrá la opción elejida.

 

TYPE-POOLS: vrm.
DATA: name TYPE vrm_id, list TYPE vrm_values, value LIKE LINE OF list.
PARAMETERS: ps_parm(10) AS LISTBOX VISIBLE LENGTH 10.
AT SELECTION-SCREEN OUTPUT.
  name = 'PS_PARM'.
  value-key = '1'. value-text = 'Linea 1'. APPEND value TO list.
  value-key = '2'. value-text = 'Linea 2'. APPEND value TO list.
  value-key = '3'. value-text = 'Linea 3'. APPEND value TO list.
  value-key = '4'. value-text = 'Linea 4'. APPEND value TO list.
  value-key = '5'. value-text = 'Linea 5'. APPEND value TO list.
  value-key = '6'. value-text = 'Linea 6'. APPEND value TO list.
  CALL FUNCTION 'VRM_SET_VALUES'
       EXPORTING
            id     = name
            values = list.
START-OF-SELECTION.
  WRITE: / 'Parametros : ', ps_parm.

ALV - Catalogo

ALV – Catálogo

ROW_POS:
Solo se informará este campo en el caso en el que el report de salida sea multilínea. Valores: 0, 1, 2 y 3.

COL_POS:
Solo es relevante en el caso que se quiera que la salida en el listado tenga un orden distinto a su posición en la tabla interna de datos.

TABNAME:
Nombre de la tabla interna que contiene los datos a mostrar en el listado.

REF_FIELDNAME:
Nombre del campo de la tabla del diccionario de datos al cual está referenciado el campo de la tabla interna (en el caso en el que lo esté).

CFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la moneda para el campo importe.

CTABNAME:
Este dato sólo es relevante informarlo para listados con más de una cabecera.

QFIELDNAME:
Nombre del campo de la tabla interna de datos que contiene la unidad de medida para el campo cantidad.

QTABNAME:
Este dato solo es relevante informarlo para listados con más de una cabecera.

OUTPUTLEN:
Siempre que el campo a mostrar en el listado de salida no esté referenciado a ningún campo de tabla del diccionario, se especificará aquí la longitud de salida del campo.

KEY:
El campo del registro actual se tomará como clave si se marca este campo. No podrá ocultarse en el listado de salida este campo.

KEY_SEL:
El campo será clave, pero podrá no salir en el listado de salida.

NO_OUT:
El campo no será mostrado en el listado de salida.

TECH:
Si se marca este campo, el campo actual no puede nunca salir en el listado de salida.

EMPHASIZE:
Para mostrar el campo de algún color.

HOTSPOT:
El campo aparece como hotspot.

FIX_COLUMN:
Si se marca, este campo aparecería como columna fija.

DO_SUM:
Se calculará la suma de este campo.

NO_SUM:
No se calculará la suma de este campo.

ICON:
El campo será mostrado como un icono.

SYMBOL:
El campo será mostrado como un símbolo.

JUST:
Justificación del campo. R= justificado a la derecha, L= justificado a la izquierda, C= centrado.

LZERO:
Mostrará los campos de tipo NUMC justificados a la derecha y sin ceros a la izquierda.

NO_SIGN:
Mostrará el campo sin signos.

NO_ZERO:
Suprime los 0’s.

EDIT_MASK:
Mostrará el campo con una máscara.

SELTEXT_L:
Se mostrará en la cabecera de la columna el texto largo de la definición del campo en la tabla del diccinario de datos.

SELTEXT_M:
Se mostrará en la cabecera de la columna el texto medio de la definición del campo en la tabla del diccinario de datos.

SELTEXT_S:
Se mostrará en la cabecera de la columna el texto corto de la definición del campo en la tabla del diccinario de datos.

DDICTXT:
Especificará mediante L, M y S el texto largo, medio o corto que se utilizará en los títulos de las cabeceras.

DATATYPE:
Se especificará cuando el campo de la tabla interna de datos no esté referenciado a ningún campo de tabla del diccionario de datos.

DDIC_OUTPUTLEN:
Especifica la longitud de salida. Para campos no referenciados al diccionario de datos.

SP_GROUP:
Si se marca este campo, el campo actual pertenecerá a un grupo que se especificará después en el parámetro IT_SPECIAL_GROUPS.

REPREP:
El campo será tomado como un criterio de selección

Campo password (oculto) en reporte

Si se desea mostrar un como de entrada como texto oculto, o como un campo de password (ej. carácteres '****') debe insertar un código similar al siguiente ejemplo:

PARAMETERS: P_PASSWD(8) MODIF ID MiTexto. <--- "MiTexto" es un ID de grupo
...
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF SCREEN-GROUP1 = 'MiTexto'. "Comprueba si el ID es = al que queremos que se oculteSCREEN-INVISIBLE = '1'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
END-OF-SELECTION.

Si deseamos insertar un texto en un selection screen debemos agregar el siguiente codigo.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(66) TEXT-001 FOR FIELD p_path.
SELECTION-SCREEN END OF LINE.

y mantener el texto en Elementos de textos 001. (66 es el largo del texto introducido)

Browser file en Matchcode

Es común necesitar de este browser cuando tenemos que elejir la ruta para abrir un archivo o para grabar uno.

DATA: p_path_file TYPE STRING.

PARAMETERS: p_path like rlgrap-filename.

at selection-screen on value-request for p_path.
call function 'F4_FILENAME'
exporting
program_name = sy-repid
dynpro_number = sy-dynnr
field_name = 'PATH'
importing
file_name = p_path.

p_path_file = p_path.

la Función GUI_DOWNLOAD pide que el path sea un STRING, por eso le asigno el valor de p_path a p_path_file.

Crear Matchcode (Search Help) con una tabla interna.

En un momento dado me pidieron hacer un reporte donde el matchode del campo lgort, traía todos los lgort (almacenes) de todos los centros y el requerimiento era solamente los de un determinado centro.

Descubrí que se puede realizar un matchode dinamicamente con una tabla interna nuestra directamente desde el código.

Código:

At selection-screen on value-request for s_lgort-low.
Select LGORT LGOBE
from T001L
into table it_lgort
where werks = '2000'.

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'LGORT'
WINDOW_TITLE = 'Depósitos'
VALUE_ORG = 'S'
TABLES
VALUE_TAB = it_lgort
RETURN_TAB = it_ret
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.

IF SY-SUBRC = 0.
read table it_ret index 1.
move it_ret-fieldval to S_lgort-low.
ENDIF.

Esto muestra el almacén, la descripción del mismo, y al elejir uno nos lleva al select option la opción elejida.

Problemas con el Filtro en reportes ALV

El problema que tenía era que al querer uhacer el filtro de un campo de 16 caracteres, el filtro solamente me dejaba cargar ingresar 10. Por lo tanto nunca realizaba el filtro correctamente.

Hay varias notas con respecto a este tema, si tenes todas aplicadas, como era mi caso y ya no sabía que inventar.

En un momento se iluminó la lamparita y lo solucioné utilizando lo siguiente:

gt_fieldcat-Outputlen = 16.

Esta propiedad del catalago es la que toma el filtro (ademas de ser la que determina el largo del campo a mostrarse).

TIP: En los Filtros se pueden utilizar wildcards (ejemplo: *004)