es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

REDUCE crea una estructura plana en lugar de una tabla. ¿Por qué?

Mi objetivo es lograr lo siguiente usando un bucle FOR.

DATA(lt_wherecondn) = VALUE string_table( ).
DATA(lt_fields) = VALUE rsds_frange_t(
( fieldname = ‘A~FLD1’ ) ( fieldname = ‘A~FLD2’ ) ).
DATA(lv_lines) = lines( lt_fields ).
LOOP AT lt_fields ASSIGNING FIELD-SYMBOL().
DATA(lv_length) = strlen( -fieldname ) – 2.
DATA(lv_line) = COND string(
WHEN lv_lines <> sy-tabix
THEN -fieldname+2(lv_length) && | IN | && |@| && -fieldname && | AND |
ELSE -fieldname+2(lv_length) && | IN | && |@| && -fieldname ).
APPEND lv_line TO lt_wherecondn.
ENDLOOP.

Además:

Hay nombres de campos en LT_FIELDS.
Concatenar los datos de LT_FIELDS-FIELDNAME en un formato específico.
Añádelo a LT_WHERE.

Resultado en LT_WHERECONDN:

FLD1 IN @A~FLD1 AND
FLD2 IN @A~FLD2

A continuación se muestra mi código (no estoy seguro de dónde añadir mi lógica de lv_length en el bucle):

TYPES: BEGIN OF ty_whr,
fieldname TYPE string,
END OF ty_whr.

DATA(lt_where) = REDUCE ty_whr(
INIT whereclause = VALUE ty_whr( )
FOR IN lt_fields
NEXT whereclause-fieldname =
COND #( WHEN whereclause IS NOT INITIAL
THEN -fieldname && | IN | && |@| && -fieldname && | AND |
ELSE -fieldname && | IN | && |@| && -fieldname ) ).

El fragmento anterior está creando una estructura profunda lt_where con fieldname y contiene solo una línea de datos. Parece ser un problema de sintaxis. ¿Qué hay que corregir aquí?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Necesitas usar la instrucción REDUCE para iterar a través de la tabla LT_FIELDS y agregar los datos a LT_WHERECONDN. La lógica de lv_length debe incluirse en la cláusula NEXT de la instrucción REDUCE. El código debe verse así:

    TYPES: BEGIN OF ty_whr,
             fieldname TYPE string,
           END OF ty_whr.
    
    DATA(lt_where) = REDUCE ty_whr(
                       INIT whereclause = VALUE ty_whr( )
                       FOR <fields> IN lt_fields
                       NEXT whereclause-fieldname = 
                         COND #( WHEN whereclause IS NOT INITIAL
                                 THEN <fields>-fieldname+2(lv_length) && | IN | && |@| && <fields>-fieldname && | AND |
                                 ELSE <fields>-fieldname+2(lv_length) && | IN | && |@| && <fields>-fieldname ) ).
    

Comments are closed.