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
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