La de idea de esta rutina es no tener que estar asignando variables, estructuras o comparando siempre línea a línea...
Esta idea llego cuando estaba desarrollando una aplicación que debe maneja bastantes datos en memoria, poder modificar
datos y luego reversar los datos, asignar valores a variables desde una pantalla a varios campos de distintas áreas de trabajo...
entonces pensé...si SAP maneja el concepto de áreas de trabajo...porque no aplicar esto a mi programa...entonces pensé en crear una
tabla interna con correlativos de áreas o procesos y los campos de estructuras o variables que deseo estar asignando de un lado a otro y
como resultado salió este programita...Ojala les sirva ...El código fuente da para mucho mas...
Cualquier idea o aporte...será bien recibido
REPORT y_proceso_dinamico.
*-----------------------------------------------------------------------------------------------------------------*
* Tabla para Catalogo de Campos de TBI's y Variables
* Para Utilizar Field-Symbols en Asignacion Dinamica
* De Datos desde un Lado a Otro...
*-----------------------------------------------------------------------------------------------------------------*
TYPES : BEGIN OF ty_itab,
proceso(5) TYPE n, " Correlativo Identifica Datos a Procesar
tabla01 TYPE tabname, " Area de Trabajo 01
campo01 TYPE fieldname, " Campo / Variable Area de Trabajo 01
tabla02 TYPE tabname, " Area de Trabajo 01
campo02 TYPE fieldname, " Campo / Variable Area de Trabajo 01
END OF ty_itab.
DATA : ti_itab TYPE STANDARD TABLE OF ty_itab,
wa_itab TYPE ty_itab.
*-----------------------------------------------------------------------------------------------------------------*
DATA : gd_telefono_01(15) TYPE c,
gd_telefono_02(15) TYPE c.
*-----------------------------------------------------------------------------------------------------------------*
DATA : lx_kna1 TYPE kna1.
*-----------------------------------------------------------------------------------------------------------------*
DATA : gd_retorno(1) TYPE c.
*-----------------------------------------------------------------------------------------------------------------*
DATA : BEGIN OF wa_area_001,
name1 LIKE lx_kna1-name1,
ort01 LIKE lx_kna1-ort01,
regio LIKE lx_kna1-regio,
name3 LIKE lx_kna1-name3,
fono_01(20) TYPE c,
fono_02(20) TYPE c,
fecha TYPE datum,
hora TYPE uzeit,
END OF wa_area_001.
DATA : gd_usuario(15) TYPE c.
*
*-----------------------------------------------------------------------------------------------------------------*
* MACRO : MC_ADD_TO_ITAB : Agrega definiciones de asignacion o comparacion
*-----------------------------------------------------------------------------------------------------------------*
*
DEFINE mc_add_to_itab.
*
clear : wa_itab.
wa_itab-proceso = &1.
wa_itab-tabla01 = &2.
wa_itab-campo01 = &3.
wa_itab-tabla02 = &4.
wa_itab-campo02 = &5.
append wa_itab to ti_itab.
*
END-OF-DEFINITION.
*
*-----------------------------------------------------------------------------------------------------------------*
* START-OF-SELECTION
*-----------------------------------------------------------------------------------------------------------------*
*
START-OF-SELECTION.
*
PERFORM llena_tbi_diccionario.
*-----------------------------------------------------------------------------------------------------------------*
* llenado de las tablas internas o variables
* Aqui el Codigo...de Ejemplo. AREA 01
*-----------------------------------------------------------------------------------------------------------------*
wa_area_001-name1 = 'JUAN PEREZ GONZALEZ'.
wa_area_001-ort01 = 'CUALQUIER COSA'.
wa_area_001-regio = '13'.
wa_area_001-name3 = 'NOMBRE TRES'.
wa_area_001-fono_01 = '(56 2) 6771474'.
wa_area_001-fono_02 = '(56 9) 9234532'.
gd_usuario = 'XXXX'.
BREAK-POINT.
* REVISAR ESTADO DE WA_AREA_001 Y LX_KNA1 Y LA VARIABLE GD_USUARIO
*-----------------------------------------------------------------------------------------------------------------*
* Mover de Izquierda a Derecha.
PERFORM frm_proceso_dinamico USING 'DE_01_A_02'
'00001'
CHANGING gd_retorno.
BREAK-POINT.
* GD_RETORNO = 'T' --> OK
* GD_RETORNO = 'F' --> ERROR
*
* REVISAR ESTADO DE WA_AREA_001 Y LX_KNA1 Y LA VARIABLE GD_USUARIO
*-----------------------------------------------------------------------------------------------------------------*
* llenado de las tablas internas o variables
* Aqui el Codigo...de Ejemplo. AREA 02
*-----------------------------------------------------------------------------------------------------------------*
lx_kna1-name1 = 'JOSE LX_KNA1'.
gd_telefono_01 = '(56 2) LX_KNA1'.
gd_telefono_02 = '(56 9) LX_KNA1'.
*-----------------------------------------------------------------------------------------------------------------*
* Mover de Derecha a Izquierda.
PERFORM frm_proceso_dinamico USING 'DE_02_A_01'
'00001'
CHANGING gd_retorno.
BREAK-POINT.
* GD_RETORNO = 'T' --> OK
* GD_RETORNO = 'F' --> ERROR
*
* REVISAR ESTADO DE WA_AREA_001 Y LX_KNA1 Y LA VARIABLE GD_USUARIO
*-----------------------------------------------------------------------------------------------------------------*
* Validar si contenido de los campos son iguales.
PERFORM frm_proceso_dinamico USING '01_EQ_02'
'00001'
CHANGING gd_retorno.
BREAK-POINT.
* GD_RETORNO = 'T' --> OK
* GD_RETORNO = 'F' --> ERROR
*
* REVISAR ESTADO DE WA_AREA_001 Y LX_KNA1 Y LA VARIABLE GD_USUARIO
*-----------------------------------------------------------------------------------------------------------------*
* Mover de Izquierda a Derecha.
PERFORM frm_proceso_dinamico USING 'DE_01_A_02'
'00001'
CHANGING gd_retorno.
BREAK-POINT.
* GD_RETORNO = 'T' --> OK
* GD_RETORNO = 'F' --> ERROR
*
* REVISAR ESTADO DE WA_AREA_001 Y LX_KNA1 Y LA VARIABLE GD_USUARIO
*
*
END-OF-SELECTION.
*
*-----------------------------------------------------------------------------------------------------------------*
* Aqui es donde vamos agregando las estrcuras, tablas o variables que deaseamos
* asignar o comparar en un determinado momento
*-----------------------------------------------------------------------------------------------------------------*
*
FORM llena_tbi_diccionario.
REFRESH : ti_itab.
CLEAR : ti_itab, wa_itab.
mc_add_to_itab '00001' 'WA_AREA_001' 'NAME1' 'LX_KNA1' 'NAME1'.
mc_add_to_itab '00001' 'WA_AREA_001' 'ORT01' 'LX_KNA1' 'ORT01'.
mc_add_to_itab '00001' 'WA_AREA_001' 'REGIO' 'LX_KNA1' 'REGIO'.
mc_add_to_itab '00001' 'WA_AREA_001' 'NAME3' 'LX_KNA1' 'NAME3'.
mc_add_to_itab '00001' 'WA_AREA_001' 'FONO_01' '' 'GD_TELEFONO_01'.
mc_add_to_itab '00001' 'WA_AREA_001' 'FONO_02' '' 'GD_TELEFONO_02'.
mc_add_to_itab '00001' 'WA_AREA_001' 'FECHA' '' 'SY-DATUM'.
mc_add_to_itab '00001' 'WA_AREA_001' 'HORA' '' 'SY-UZEIT'.
mc_add_to_itab '00001' '' 'GD_USUARIO' '' 'SY-UNAME'.
ENDFORM. "
*
*-----------------------------------------------------------------------------------------------------------------*
* FORM : FRM_PROCESO_DINAMICO : Realiza Asignaciones o Comparaciones se excluyen
* las asignacines a variables de sistema "SY-*"
*-----------------------------------------------------------------------------------------------------------------*
*
FORM frm_proceso_dinamico USING p_ld_sentido
p_ld_proceso
CHANGING p_gd_retorno.
*
DATA : ld_tbicamp1(40) TYPE c,
ld_tbicamp2(40) TYPE c.
DATA : ld_var_aux1(100) TYPE c,
ld_var_aux2(100) TYPE c.
FIELD-SYMBOLS : <fs_scr>, <fs_tbi>.
FIELD-SYMBOLS : <fs_ax1>, <fs_ax2>.
p_gd_retorno = 'T'.
*
LOOP AT ti_itab INTO wa_itab WHERE proceso EQ p_ld_proceso.
CLEAR : ld_tbicamp1, ld_tbicamp2.
*
IF ( wa_itab-tabla01 NE '' ).
CONCATENATE wa_itab-tabla01 '-' wa_itab-campo01 INTO ld_tbicamp1.
ELSE.
MOVE wa_itab-campo01 TO ld_tbicamp1.
ENDIF.
*
IF ( wa_itab-tabla02 NE '' ).
CONCATENATE wa_itab-tabla02 '-' wa_itab-campo02 INTO ld_tbicamp2.
ELSE.
MOVE wa_itab-campo02 TO ld_tbicamp2.
ENDIF.
ASSIGN (ld_tbicamp1) TO <fs_scr>.
ASSIGN (ld_tbicamp2) TO <fs_tbi>.
CASE p_ld_sentido.
WHEN 'DE_01_A_02'.
*
IF ( wa_itab-campo02+00(03) NE 'SY-' ).
IF ( wa_itab-tabla01 EQ '' ) AND ( wa_itab-tabla02 EQ '' ).
ASSIGN (ld_tbicamp2) TO <fs_ax2>.
<fs_tbi> = <fs_scr>.
ELSE.
<fs_tbi> = <fs_scr>.
ENDIF.
ENDIF.
*
WHEN 'DE_02_A_01'.
*
IF ( wa_itab-campo01+00(03) NE 'SY-' ).
IF ( wa_itab-tabla01 EQ '' ) AND ( wa_itab-tabla02 EQ '' ).
ASSIGN (ld_tbicamp2) TO <fs_ax2>.
<fs_scr> = <fs_ax2>.
ELSE.
<fs_scr> = <fs_tbi>.
ENDIF.
ENDIF.
*
WHEN '01_EQ_02'.
IF ( <fs_tbi> NE <fs_scr> ).
p_gd_retorno = 'F'.
EXIT.
ENDIF.
ENDCASE.
*
ENDLOOP.
*
ENDFORM. "
*