PDA

Ver la Versión Completa : Ayuda informe complejo


kruspex
22/04/09, 09:08:19
Hola a todos!!

Veamos, os explico un poco lo que tengo para ver si alguien puede ayudarme.

Tengo tres tablas internas:
1. t_orden -> con todas las ordenes que necesito para obtener los datos
2. tinf_cuentas_lines -> con las lineas relacionadas por orden y sus importes.
3. tinf_cuentas_reg -> con los registros por orden y sus importes.

Ahora tengo juntar todos los datos para generar un informe y no sé como rellenar la estructura donde guardar los datos combinados.

1. Recorro la t_orden para obtener la orden correspondiente.
2. Con esa orden debo recorrer tanto la tabla de lineas como de registros para tellenas la estructura total de datos:
2.1. comparo el numero de lineas para saber donde tengo más datos por orden.
2.2. debo acceder a la interna de quien tenga más lineas primero y a la otra después.
2.3. voy insertando los datos en la estructura total de datos.
3. muestro la estructura total de datos.

La duda es como acceder a los datos de lineas y registros e ir obteniendo sus datos para pasarlos a la estructura.
Cada tabla, lineas y registros, tiene un estado. He pensado recorrer ambas tablas con loops e ir marcando el estado de las ya vistas. Si para una orden todos los estados están marcados, calculo los totales de importes y salgo de los loops para pasar a la siguiente orden.

¿Alguien tiene una idea más óptima de hacerlo?
¿Se os ocurre alguna sugerencia de cómo hacer el traspaso de datos?

Según voy implementando el programa me surgen más dudas y me vuelvo a estancar.

Gracias por vuestra ayuda!!

kruspex
23/04/09, 07:28:14
LOOP AT tinf_cuentas_linea WHERE orden = t_orden-orden.

READ TABLE tinf_cuentas_reg WITH KEY orden = t_orden estado = '' INTO d_registro.

IF sy-subrc = 0.

t_datos_totales-orden = t_orden-orden.
t_datos_totales-linpr = tinf_cuentas_linea-linpr.
t_datos_totales-netwc = tinf_cuentas_linea-netwc.
t_datos_totales-reg = d_registro-reg.
t_datos_totales-importe = d_registro-importe.

total_linea = total_linea + tinf_cuentas_linea-netwc.
total_reg = total_reg + d_registro-importe.

append t_datos_totales.

d_registro-estado = 'X'.
modify tinf_cuentas_reg from d_registro.

ELSE.

t_datos_totales-orden = t_orden-orden.
t_datos_totales-linpr = tinf_cuentas_linea-linpr.
t_datos_totales-netwc = tinf_cuentas_linea-netwc.

total_linea = total_linea + tinf_cuentas_linea-netwc.

append t_datos_totales.

ENDIF.

ENDLOOP.

Nos da un DUMP en la linea que he remarcado.

Hemos leido en otro foro que al hacer el modify debemos especificar el INDEX.

Miky_cer
23/04/09, 10:01:27
Hola kruspex, no se si te servira, hace poco que me inicie en esto del ABAP. Pero la tormenta de ideas a veces es buena.

Las tablas internas cogen datos de tablas BD? porque no creas una vista de las tablas bd que necesites. Es decir una vista con la tabla de ordenes tabla de lineas y tabla de registros. Relacionando el campo orden de cada tabla. Asi tendras una tabla de bd con todos los registros de lineas y registros por orden.

Luego n el select a la tabla interna cribas por el numero de orden que quieras.

No se si te sirve, o he dicho una burreria, pero la intención es lo que cuenta.

ballan
23/04/09, 10:05:57
Efectivamente te da dump por que no has especificado el indice entonces puedes hacer dos cosas:

1.- data: lv_tabix type sytabix.

loop at tabla into linea.

lv_tabix = sy-tabix.

linea-campo1 = valor1.
linea-campo2 = valor2.

modify tabla from linea index lv_tabix.

endloop.

2.- field-symbols: <linea> type ... (aqui pondrias el tipo de linea de la tabla)

loop at tabla assigning <linea>.

<linea>-campo1 = valor1.
<linea>-campo2 = valor2.

endloop.

Ya tendrias los valores modificados

kruspex
23/04/09, 14:16:13
¡¡ Muchas gracias a ambos !!

Os pongo el código que hemos puesto por si a alguien le sirve en el futuro:

data: d_registro like tinf_cuentas_reg.

clear t_datos_totales.
refresh t_datos_totales.

clear: total_linea, total_reg, diferencia.

* recorremos la tabla donde estan todas las ordenes t_orden
DATA indice_orden_reg type i value 0.
LOOP AT t_orden.

* recorremos las lineas para cada oden
LOOP AT tinf_cuentas_linea WHERE orden = t_orden-orden.

* leemos los registros
READ TABLE tinf_cuentas_reg WITH KEY orden = t_orden estado = '' INTO d_registro.
indice_orden_reg = indice_orden_reg + 1.

IF sy-subrc = 0.

t_datos_totales-orden = t_orden-orden.
t_datos_totales-linpr = tinf_cuentas_linea-linpr.
t_datos_totales-netwc = tinf_cuentas_linea-netwc.
t_datos_totales-reg = d_registro-reg.
t_datos_totales-importe = d_registro-importe.

total_linea = total_linea + tinf_cuentas_linea-netwc.
total_reg = total_reg + d_registro-importe.

append t_datos_totales.
clear t_datos_totales.

d_registro-estado = 'X'.
modify tinf_cuentas_reg from d_registro index indice_orden_reg.

ELSE.


Y ya sale correcto.

Gracias!! :rolleyes: