PDA

Ver la Versión Completa : SQL DINAMICO - UPDATE y WHERE de tablas Z


Juan Fernando Ruelas Noa
15/11/07, 15:58:33
Hola Amigos del Mundo ABAP
Que tal, espero todo bien, un favor tenemos un dilema con un Req. Por cambio de moneda en Venezuela

Lo que pasa es que es necesario dividir algunas columnas tipo moneda de casi todas las tablas Z de SAP, entre 1000.

Como veran la descripción funcional es bien sencilla, la complicación surge en la parte técnica, ya que según lo que han solicitado, los usuarios podrán mantener una tabla ZHardCode con las tablas que se van a tratar, sus respectivos campos a dividir y los filtros que se tendrá (Sociedad, País, Centro, etc) aparentemente estos filtros serán los mismos pero no es así, ya que el nombre de los campos en las diferentes tablas Z es diferente, eso complica la situación.

Las tablas internas cargadas de la ZhardCode que servirían para procesar la información tendrían la siguiente estructura:

Cargar tablasZ ti_tablasz
Numero Nombre Tabla
1 ZABC1
2 ZABC2
3 ZABC3
4 ZABC4
….
n ZABCn

Cargar camposupdateTablasZ (ZABCn) ti_campos_tz
Numero Nombre Tabla Campos UPDATE
1 ZABC1 CampoTABC1_1
CampoTABC1_2
2 ZABC2 CampoTABC2_1
CampoTABC2_2
CampoTABC2_3
CampoTABC2_4
3 ZABC3 CampoTABC3_1
4 ZABC4 CampoTABC4_1
….
n ZABCn CampoTABCn_n

Cargar camposwhereTablaZ (ZABCn) ti_condiciones_tz
Numero Nombre Tabla Campos WHERE
1 ZABC1 CampoTABC1_1
CampoTABC1_2
2 ZABC2 CampoTABC2_3
CampoTABC2_4
3 ZABC3 CampoTABC3_1
4 ZABC4 CampoTABC4_1
….
n ZABCn CampoTABCn_n

Ejem de un loop:
Loop at ti_tablasZ (ZABC2)
Cargar camposupdateTablasZ (ZABC2) ¨ Devuelve str_campos_update ejemplo CampoTABC2_3 / 1000, CampoTABC2_4 / 1000
Cargar camposwhereTablaZ (ZABC2) ¨ Devuelve str_campos_where ejemplo CampoTABC2_1 = ‘VE01’ AND, CampoTABC2_2 = ‘C01’

UPDATE (ZABC2) SET CampoTABC2_3 / 1000, CampoTABC2_4 / 1000 WHERE CampoTABC2_1, CampoTABC2_2

Endloop.
Endloop.

Pls has visto algo así antes? O sabes si es posible hacerlo? Sobre todo en la parte de los wheres ya que son dinamicos también, en realidad es como si el usuario estaría construyendo una sentencia update pero desde una interfaz,

Gracias por el apoyo, y disculpen las molestias.

Saudos
Fernando

Juan Fernando Ruelas Noa
15/11/07, 16:54:43
Amigos, encontramos este link muy interesante

http://www.sapfans.com/forums/viewtopic.php?t=44852

Les copio el codigo tb, gracias.

PERFORM F_GET_DATA IN PROGRAM YCOMMON_PERFORM
USING &KNA1&
USING &W_KUNNR&
CHANGING &W_KUNNR&
CHANGING &W_LAND1&
CHANGING &W_NAME1&

FORM f_get_data TABLES i_inval STRUCTURE itcsy
i_outval STRUCTURE itcsy.
DATA : w_field(10).
DATA : i_field LIKE TABLE OF w_field.

DATA : w_condition(50),
i_condition LIKE TABLE OF w_condition,
w_where TYPE i,
w_outvalue TYPE i.

DATA : w_table TYPE tabname.
DATA : i_alv_cat TYPE TABLE OF lvc_s_fcat,
ls_alv_cat LIKE LINE OF i_alv_cat.
DATA : d_ref TYPE REF TO data.

FIELD-SYMBOLS : <f_table> TYPE table,
<f_wa> TYPE ANY,
<f_field> TYPE ANY.
* sy-cprog = 'YCOMMON_PERFORM'.
* read table i_inval index 1.
DESCRIBE TABLE i_inval LINES w_where.
DESCRIBE TABLE i_outval LINES w_outvalue.

w_where = w_where - 1. "to eliminate the table record.

LOOP AT i_inval.
IF sy-tabix EQ 1.
w_table = i_inval-name. "get the table name.
"name of the table must be declared
"as it is.. eg KNA1
ELSE.
w_field = i_inval-name+2. "the field name to be
"declared as w_xxx.
IF w_where EQ 1.
CONCATENATE w_field ' EQ ''' i_inval-value ''''
INTO w_condition.
ELSE.
CONCATENATE w_field ' EQ ''' i_inval-value ''' AND'
INTO w_condition.

ENDIF.
w_where = w_where - 1.
APPEND w_condition TO i_condition.
ENDIF.
ENDLOOP.

LOOP AT i_outval.
MOVE i_outval-name+2 TO w_field. "the field name to be declared
"as W_XXXX.
APPEND w_field TO i_field.
ls_alv_cat-fieldname = w_field.
ls_alv_cat-ref_table = w_table.
ls_alv_cat-ref_field = w_field.
APPEND ls_alv_cat TO i_alv_cat.

ENDLOOP.
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING it_fieldcatalog = i_alv_cat
IMPORTING ep_table = d_ref .
ASSIGN d_ref->* TO <f_table>.

SELECT (i_field) FROM (w_table)
INTO CORRESPONDING FIELDS OF TABLE
<f_table> WHERE (i_condition).
LOOP AT <f_table> ASSIGNING <f_wa>.
EXIT.
ENDLOOP.

DO w_outvalue TIMES.
ASSIGN COMPONENT sy-index OF STRUCTURE <f_wa> TO <f_field>.
READ TABLE i_outval INDEX sy-index.
MOVE <f_field> TO i_outval-value.
MODIFY i_outval INDEX sy-index.
ENDDO.

ENDFORM.