Lectura de campos de una tabla

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • CRISTINO.GARCIA
    Senior Member
    • ago
    • 101

    #1

    Lectura de campos de una tabla

    Hola

    Necesito ir leyendo los campos de una tabla (son 20 en total) pero cuando consiga que dos campos consecutivos estan en blanco es decir no tienen datos ejecute un proceso. He estado usando loop pero no he conseguido que funcione. Alguna idea que me puedan aportar.

    Gracias

    Saludos
  • vanesamacri
    Senior Member
    • jun
    • 146

    #2
    Buenas noches.

    A continuación adjunto un código muy básico que, en teoría, debería cumplir el propósito de lo solicitado. Tomé como base un código que encontré en internet (adjunto link de fuente: CLICK y le agregué un poco de contenido adicional). Vas a notar que la tabla interna principal utilizada tiene solamente cuatro campos (en vez de 20). La lógica que aplica es indiferente a la cantidad, por lo que no será problema.

    Alcanza con copiar y pegar este código en un nuevo reporte de prueba para que puedas ejecutarlo y comprobar su funcionamiento. Si bien incluí líneas de comentario (como para facilitar la lectura de su contenido), si hay algo que no entendés, avisame y lo vemos.

    Incluí un BREAK-POINT duro en el momento en el que comienza la parte interesente del código (dudo que "código" e "interesante" deberían utilizarse en la misma oración, pero bueh...), como para que puedas debuguear paso a paso y comprender más detalladamente.

    Espero que se de utilidad.
    Un saludo.

    Código:
    REPORT  yprueba                                 .
    
    TYPE-POOLS: abap.
    
    *** Se declara estructura de campos de la tabla interna (suponer que esta es la estructura de los 20 campos).
    TYPES: BEGIN OF x_final,
      matnr TYPE matnr,
      werks TYPE werks_d,
      flag TYPE C LENGTH 1,
      VALUE TYPE p LENGTH 10 DECIMALS 2,
    END OF x_final.
    
    DATA: i_data TYPE STANDARD TABLE OF x_final,    " Tabla interna (símil en comportamiento a la de los 20 campos).
          registro TYPE x_final,
          tab_return TYPE abap_compdescr_tab,       " Tabla interna que contendrá info de campos de tabla interna principal.
          components LIKE LINE OF tab_return,       " Registro para tabla TAB_RETURN.
          flag TYPE char1,
          campo TYPE string.
    
    FIELD-SYMBOLS <fs_campo> TYPE ANY.
    
    *** Llamado a subrutina que devuelve la información de campos de la tabla interna principal.
    PERFORM get_int_table_fields USING i_data
    CHANGING tab_return.
    
    
    *** A modo ejemplificador, se imprime en pantalla la lista de nombres de campos de la tabla
    *** interna principal.
    *** Esta tabla interna servirá para recorrer horizontalmente la tabla principal e ir comparando
    *** el valor de cada uno de sus campos.
    LOOP AT tab_return INTO components.
      WRITE: / components-name.
    ENDLOOP.
    
    SKIP 2.
    
    APPEND INITIAL LINE TO i_data.
    
    BREAK-POINT.
    
    *** Se recorre tabla interna principal.
    LOOP AT i_data INTO registro.
    
      CLEAR flag.
    
    *** Se recorre tabla interna con información de campos de la tabla principal.
      LOOP AT tab_return INTO components.
    
        CLEAR campo.
    
        CONCATENATE 'REGISTRO-' components-name INTO campo.
    
        UNASSIGN <fs_campo>.
        ASSIGN (campo) TO <fs_campo>.
    
    *** Se verifica que la asignación dinámica haya sido exitosa.
        IF <fs_campo> IS ASSIGNED.
    
    *** El campo actual está vacío pero el anterior no lo estuvo.
          IF <fs_campo> IS INITIAL AND flag IS INITIAL.
    
            flag = 'X'.    " Variable bandera indicadora de campo vacío.
    
    *** El campo actual está vacío, al igual que lo estuvo el campo anterior.
        ELSEIF <fs_campo> IS INITIAL AND flag IS NOT INITIAL.
    
    *** En esta instancia es donde debés incluir el proceso a ejecutar al encontrarse dos campos
    *** consecutivos vacíos.
            WRITE: 'Se han encontrado dos campos consecutivos con valores iniciales.'.
    
        ELSEIF <fs_campo> IS NOT INITIAL.
    
    *** Cuando se encuentra un campo NO vacío, se inicializa la variable bandera auxiliar.
            CLEAR flag.
    
          ENDIF.
    
        ENDIF.
    
      ENDLOOP.
    
    ENDLOOP.
    *&---------------------------------------------------------------------*
    *&      Form  get_int_table_fields
    *&---------------------------------------------------------------------*
    FORM get_int_table_fields  USING    t_data TYPE ANY TABLE
    CHANGING t_return TYPE abap_compdescr_tab.
    
      DATA: oref_table TYPE REF TO cl_abap_tabledescr,
            oref_struc TYPE REF TO cl_abap_structdescr,
            oref_error TYPE REF TO cx_root,
            TEXT TYPE string.
    
    *** Se obtiene información de estructura de tabla interna principal.
      TRY.
        oref_table ?=
        cl_abap_tabledescr=>describe_by_data( t_data ).
      CATCH cx_root INTO oref_error.
        TEXT = oref_error->get_text( ).
        WRITE: / TEXT.
        EXIT.
      ENDTRY.
    
      TRY.
        oref_struc ?= oref_table->get_table_line_type( ).
      CATCH cx_root INTO oref_error.
        TEXT = oref_error->get_text( ).
        WRITE: / TEXT.
        EXIT.
      ENDTRY.
    
      APPEND LINES OF oref_struc->components TO t_return.
    
    ENDFORM.                    " GET_INT_TABLE_FIELDS

    Comentario

    Trabajando...