miércoles, julio 25, 2007

DYNPRO - Textos

La primera idea que nos viene a la cabeza cuando queremos guardar texto es crear un campo de char255 en una tabla Z. Pero no se mantendría el formato (negrita, cursiva, salta de línea). Para resolver este problema se pueden utilizar los textos de sap.

Los diferentes id de textos se guardan en la tabla TTXID.

1) Configurar Texto nuevo Tx. SE75.

Si vamos a la sm30 hay un botón donde para buscar pasos en el Customizing que trabajen con esta tabla. Debemos buscar una descripción parecida a 'Definir ID de texto'. Aquí crearemos nuestros objetos y clases nuevas. Previamente hay que buscar un tipo de objeto al que queremos añadir los nuevos ID's.

2) Inicializar variables
IF NOT cc_org IS INITIAL.
CALL METHOD cc_org->free.
ENDIF.

IF NOT txtedit_nota IS INITIAL.
CALL METHOD txtedit_nota->free.
ENDIF.

3) Recuperar Texto.

Programa Control =>
DATA: cc_nota TYPE REF TO cl_gui_custom_container.
DATA: txtedit_nota TYPE REF TO cl_gui_textedit.
************************************************************************************
PBO
************************************************************************************
* Crear CUSTOM-CONTROL
IF cc_nota IS INITIAL.

CREATE OBJECT cc_nota
EXPORTING
container_name = 'CC_TEXTO' "Nombre del custom control del Dynpro
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
others = 6.

ENDIF.

* Asignarle edición de texto
IF txtedit_nota IS INITIAL.

CREATE OBJECT txtedit_nota
EXPORTING
wordwrap_mode = 2
wordwrap_position = 72
parent = cc_nota
EXCEPTIONS
error_cntl_create = 1
error_cntl_init = 2
error_cntl_link = 3
error_dp_create = 4
gui_type_not_supported = 5
others = 6.

* Quitar botones
CALL METHOD txtedit_nota->set_toolbar_mode.
CALL METHOD txtedit_nota->set_statusbar_mode.
PERFORM llenar_texto.
ENDIF.

* Visualizar/Modificar
IF action EQ 'DISP'.
CALL METHOD txtedit_nota->set_readonly_mode
EXPORTING
readonly_mode = '1'.
ELSE.
CALL METHOD txtedit_nota->set_readonly_mode
EXPORTING
readonly_mode = '0'.
ENDIF.

****************************************************************************
Rutina=> PERFORM llenar_texto.
****************************************************************************
DATA: w_header TYPE thead,
t_tline TYPE TABLE OF tline,
w_tline TYPE tline,
t_texto TYPE TABLE OF char255.

w_header-tdobject = 'FORMMAT'.
w_header-tdname = zwf_mat_alta_dg-formnumber.
w_header-tdspras = sy-langu.

CALL FUNCTION 'READ_TEXT'
EXPORTING
id = w_header-tdid "Tipo de texto
language = w_header-tdspras "Idioma
name = w_header-tdname "Id del texto
object = w_header-tdobject "Nombre del objeto
TABLES
lines = t_tline
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.

*Copiar texto con formato a sólo texto
LOOP AT t_tline INTO w_tline.
APPEND w_tline-tdline TO t_texto.
ENDLOOP.

* Guardar texto en objeto
CALL METHOD txtedit_nota->set_text_as_r3table
EXPORTING
table = t_texto
EXCEPTIONS
error_dp = 1
error_dp_create = 2
OTHERS = 3.

3) Guardar texto.
DATA: w_header TYPE thead,
t_tline TYPE TABLE OF tline,
w_tline TYPE tline,
t_texto TYPE TABLE OF char255,
w_texto TYPE char255.

CLEAR w_header.
w_header-tdobject = 'FORMMAT'.
w_header-tdname = zwf_mat_alta_dg-formnumber.
w_header-tdspras = sy-langu.
w_header-tdid = 'DG'. " texto datos generales

* Eliminar texto anterior
CALL FUNCTION 'DELETE_TEXT'
EXPORTING
id = w_header-tdid
language = w_header-tdspras
name = w_header-tdname
object = w_header-tdobject
EXCEPTIONS
not_found = 1
OTHERS = 2.

* Recuperar texto de la pantalla
CALL METHOD txtedit_nota->get_text_as_r3table
IMPORTING
table = t_texto.

LOOP AT t_texto INTO w_texto.
w_tline-tdformat = '*'.
w_tline-tdline = w_texto.
APPEND w_tline TO t_tline .
ENDLOOP.

* Guardar texto nuevo
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
header = w_header
TABLES
lines = t_tline
EXCEPTIONS
id = 1
language = 2
name = 3
object = 4
OTHERS = 5.

CALL FUNCTION 'COMMIT_TEXT'.

* Para deshabilitar el scroll horitzontal al realizar el CREATE OBJECT informar         wordwrap_mode              = cl_gui_textedit=>wordwrap_off

miércoles, julio 18, 2007

TC - TABLE CONTROL

Este es un de los temas que menos me apasiona pero me gustaría hacer unos comentarios. Como ejemplo en hay los programas DEMO_DYNPRO_TABCONT_LOOP y demo_dynpro_tabcont_loop_at.

1) En un DYNPRO podemos tener varios TABLE CONTROL (TC). Comentar que a la hora de crear el segundo TC no funciona correctamente el asistente por la tanto se deberá utilizar la técnica de copy&paste. También tenemos que ir con ojo a la hora de tratar 2 TC en el PBO,
primer tratar el TC que este más abajo, y así hasta el primero.

2) Eliminar barra de SCROLL HORIZONTAL. Rellenar el atributo Col.fijas del TC en el editor de SCREEN PAINTER.

3) Eliminar barra de SCROLL VERTICAL. Ajustar tamaño TC en el editor de SCREEN PAINTER para mostrar el núm. de registros y modificar atributo del TC lines= 0.

4) Actualización de los registros del TC. El modify que automáticamente se realiza no funciona correctamente, se debe modificar la condición. Probar de modificar registro de la tabla y en caso de que no exista crearlo.

5) SY-TCODE del SCROLL. Al utilizar el SCROLL se pasa por el PAI. En la rutina se chequea el valor del ok-code (variable que le hemos asignado al DYNPRO para que nos retorna la función ejecutada). Es este caso el valor ok-code no se actualiza y tiene el valor de la última operación ejecutada, por lo tanto se debe de limpiar la variable ok-code. El scroll es realizado por el estandard.

6) Mediante las instrucciones GET CURSOR y SET CURSOR podemos movernos por el TABLE CONTROL. Esto es muy útil cuando el usuario esta utilizando el SCROLL y queremos que visualice el mismo trozo de pantalla.
-> GET CURSOR field gv_field LINE gv_line. Obtenemos la fila y columna donde tenemos el cursor. Se debe ejecutar en el PAI. Es recomendable que borremos el valor de la dos variables antes de ejecutar la sentancia
-> SET CURSOR FIELD gv_field line gv_line. Se ejecuta en el PBO. Se tendría que chequear que fueran correctos los valores de la variables.

5) A la hora de modificar el tamaño del TC hay que vigilar que el atributo resizing no esté activado. Si está activado es el propio SAP quien decide cuantos registros mostrar.

6) Para añadir un nueva linea en blanco se hace un DESCRIBE TABLE de la tabla y campo TC-lines = sy-tfill + 1. Después habría que desplazarse hasta la nueva linea.

7) Para habilitar/deshabilitar columnas realizar MODULE en el PBO después del LOOP AT ... WITH CONTROL.

8) Para habilitar/deshabilitar files, añadir código dentro del LOOP AT ... WITH CONTROL.
Por ejemplo:
LOOP AT SCREEN.
IF screen-name(3) EQ 'LIN' AND
screen-name NE 'LIN-POSTC' AND
screen-name NE 'LIN-MAKTX' AND
screen-name NE 'LIN-AGRUP' AND
screen-name NE 'LIN-CHECK'.
screen-input = 1.
ENDIF.
ENDLOOP.

9) Para indicar la selección de un registro, informar flag c.marc.col. y poner el campo que indique la marcar G_WA-CHECK.