diciembre 19, 2002

SQL Dinamico

FORM f_armo_sql.
DATA: t_fields(50) OCCURS 10 WITH HEADER LINE.
DATA: t_values(100) OCCURS 10 WITH HEADER LINE.
DATA: t_where_tab(80) OCCURS 10 WITH HEADER LINE.

CLEAR t_fields.
REFRESH t_fields.

CLEAR t_values.
REFRESH t_values.

CLEAR t_where_tab.
REFRESH t_where_tab.

t_fields = 'BUKRS'.
APPEND t_fields.
t_values = p_bukrs.
APPEND t_values.

t_fields = 'ANLN1'.
APPEND t_fields.
t_values = p_anln1.
APPEND t_values.

PERFORM f_armar_sentencia_sql TABLES
t_fields
t_values
t_where_tab.

SELECT * INTO CORRESPONDING FIELDS OF TABLE i_anla
FROM anla
WHERE (t_where_tab).

*---------------------------------------------------------------------------------------------

FORM f_armar_sentencia_sql TABLES table_fields
table_values
table_where_tab.

DATA: v_cadena(200) TYPE c.
DATA: v_first_sql TYPE i VALUE 0.
DATA: v_cadena_escapada(200) TYPE c.
DATA: v_index TYPE i.

LOOP AT table_fields.

v_index = v_index + 1.
READ TABLE table_values INDEX v_index.

IF NOT table_values IS INITIAL.

PERFORM f_escapar_comilla_simple USING table_values
CHANGING v_cadena_escapada.

TRANSLATE v_cadena_escapada TO UPPER CASE.

CONCATENATE '''' v_cadena_escapada '''' INTO v_cadena.

CONCATENATE table_fields "Nombre del campo
'like' "
v_cadena "Valor del campo
INTO table_where_tab SEPARATED BY ' '.


IF v_first_sql EQ 1.
CONCATENATE 'and'
table_where_tab
INTO table_where_tab SEPARATED BY ' '.
ELSE.
v_first_sql = 1.
ENDIF.

APPEND table_where_tab.

ENDIF.

ENDLOOP.

ENDFORM.

*---------------------------------------------------------------------------------------------

FORM f_escapar_comilla_simple USING v_input
CHANGING v_output.

DATA: v_len TYPE i.
DATA: v_cont TYPE i.
DATA: v_salida(100) TYPE c.
DATA: v_input_aux(100) TYPE c.

* Obtiene la longitud de la cadena de entrada
v_len = STRLEN( v_input ).
IF sy-subrc EQ 0.
* Verifica si la cadena de entrada contiene el caracter comilla simple.
SEARCH v_input FOR ''''.

* Si no encontrĂ³ la comilla simple, devuelve la misma cadena recibida.
IF sy-subrc NE 0.
v_output = v_input.
ELSE.
* Reemplaza cada comilla simple por DOS comillas simples.
* El resto de los caracteres los deja igual
WHILE v_cont < v_len.

* Si el caracter es comilla simple.
CLEAR v_input_aux.
MOVE v_input+v_cont(1) TO v_input_aux.
* IF v_input+v_cont(1) EQ ''''.
IF v_input_aux EQ ''''.

* Agrega DOS comillas simples a la cadena de salida.
CONCATENATE v_salida '''''' INTO v_salida.
ELSE.
* Copia el mismo caracter de la cadena de entrada a la de salida.
* CONCATENATE v_salida v_input+v_cont(1) INTO v_salida.
CONCATENATE v_salida v_input_aux INTO v_salida.
ENDIF.

ADD 1 TO v_cont.

ENDWHILE.

* Copia la nueva cadena generada a la cadena pasada por parĂ¡metro
v_output = v_salida.
ENDIF.
ENDIF. " sy-subrc ne 0.

ENDFORM. " F_ESCAPAR_COMILLA_SIMPLE
Field Simbols

REPORT zpruebabet1 .

data: pepe1(5),
pepe2(5),
pepe3(5).

FIELD-SYMBOLS <F_DESC>.

data: v_conta type n.
data:v_descripcion(15) type c.

clear v_conta.

add 1 to v_conta.
concatenate 'pepe' v_conta into v_descripcion.
assign (v_descripcion) to <f_desc>.

<f_desc> = 'Uno'.

add 1 to v_conta.
concatenate 'pepe' v_conta into v_descripcion.
assign (v_descripcion) to <f_desc>.

<f_desc> = 'Dos'.

add 1 to v_conta.
concatenate 'pepe' v_conta into v_descripcion.
assign (v_descripcion) to <f_desc>.

<f_desc> = 'Tres'.

write: /01 pepe01, '|', pepe02, '|', pepe03.