Autor Tema: FIELD-SYMBOLS : Asignacion y Comparacion de Datos en Forma Dinamica  (Leído 23697 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Enrique.Borroni

  • Moderador_
  • Usuario Completo
  • *****
  • Mensajes: 89
    • Ver Perfil
FIELD-SYMBOLS : Asignacion y Comparacion de Datos en Forma Dinamica
« en: 09 de Noviembre de 2012, 05:43:56 am »
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.                                                                                                          "
*

Saludos.

Atte.,
Enrique Borroni

maito : enrique.borroni@abap.es