Actualización masiva tabla interna

Estimados, tengo una consulta que tal vez es muy fácil de resolver, como puedo actualizar de forma masiva una tabla interna?.

He utilizado el MODIFY dentro de un LOOP, pero no he encontrado la manera de hacerlo de manera masiva, les comento, tengo una tabla interna que se llena con datos de pagos de facturas de deudor, en esta tabla se tiene las condiciones de pago de la factura, hasta ahi todo bien, sin embargo a los usuarios finales se les ocurrió que necesitan que aparezca además la denominación de las condiciones de pago de la factura de deudor, los datos que se cargan en la ti es de un promedio de 52000 registros por día, por lo cual el reporte tarda demasiado, la mejora es significativa si se usa FIELD-SYMBOLS, el código que estoy usando es el siguiente:

LOOP AT ti_tvzbt ASSIGNING <wa_tvzbt>. LOOP AT ti_data ASSIGNING <wa_data> WHERE zterm EQ <wa_tvzbt>-zterm. <wa_data>-vtext=<wa_tvzbt>-vtext. ENDLOOP. ENDLOOP.

La tabla ti_tvzbt tiene las condiciones de pago y denominaciones, la tabla ti_data contiene los pagos de las facturas de deudor.

Por favor si pueden orientarme un poco estaré agradecido.

Asi como lo estas haciendo esta bien, solo se pudiera mejorar con un poco de estrategia, pero recuerda que son 52, 000 registros, vargame, si que va a tardar, yo para agilizarlo un tantisimo mas, buscaria la forma de segmentar el proceso, y si es ya con ese loop que quieres resolver, agrega una columna como indicador de lectura, para que el loop no de las mismas vuelta en cada interaccion. Te ahorras un tanto, sin embargo 52 son 52.

2 Me gusta

Gracias smota, obviamente los conocimientos de la comunidad son mas amplios que los míos, la segmentación a mi parecer la hago en la condición del segundo LOOP, donde solamente selecciono los datos correspondientes a la actual condición de pago de ti_tvzbt, sin embargo estoy abierto a que puedan indicarme si existe otra manera.

Hay algo que puedes mejorar con ese loop, pero necesito saber si se puede aplicar, primero dime cuantos datos contiene ti_tvzbt y cuantos datos contiene ti_data. (promedio)

Gracias nuevamente smota, ti_tvzbt tiene 6 registros, que son las condiciones de pago, ti_data tiene en promedio 52000 registros por día que son los pagos de factura de deudor. Cada factura de deudor tiene una condición de pago correspondiente a ti_tvzbt.

Gracias Seba_Scono, tenía entendido que la sentencia UPDATE solo se podía utilizar con tablas base de datos y no así con tablas internas, pero tu experiencia me da mucha tranquilidad, probaré y les compartiré el resultado.

1 me gusta

Espera con esa prueba, el update es para base de datos.

Debemos tener cuidado con las respuestas que damos, pues pueden empeorar la situacion.
EL UPDATE espara base de datos, o tablas del dicionario.

Lo que tienes que hacer es lo siguiente.

LOOP AT ti_tvzbt ASSIGNING <wa_tvzbt>.

      wa_data-vtext=<wa_tvzbt>-vtext. "fijate que elimine el field symbol aqui

     modify ti_data transporting vtex WHERE zterm EQ <wa_tvzbt>-zterm.

ENDLOOP.

Con este cambio resuelves.

NOTA: de todos modos recuerda que estas trabajando con mucha data, tienes hana? no, entonces sabes que tendras lag en el proceso, lo otro que puedes hacer, es dividir la carga, solo te hago mencion, porque solo tu conoces el proceso completo.
Espero te sea de ayuda, me retiro por ahora.

1 me gusta

Perdón por disentir, pero lo he usado en tablas internas.
De todas maneras di la respuesta para que pruebe, no era mi intención generar confusión o empeorar la situación.
Saludos.

1 me gusta

Gracias a ambos, por sus respuestas, probaré ambas y validaré los resultados, les comentaré cual es la solución que se acomoda mejor a mi problema.

Habrire un tema, para que hagamso un debate del update vs el modify.
Para nada pretendo decir que algo esta mal. Mejor vamos a debatir ^^

2 Me gusta

Un post fue trasladado al siguiente tema: UPDATE vs MODIFY

Hay una forma muy fácil y rápida de hacerlo:

*** Inicio del Código
LOOP AT ti_tvzbt ASSIGNING <wa_tvzbt>.
CLEAR: wa_data.

wa_data-vtext = <wa_tvzbt>-vtext.

MODIFY ti_data FROM wa_data
TRANSPORTING vtext
WHERE zterm = <wa_tvzbt>-zterm.

ENDLOOP, " TI_TVZBT
*** Fin del Código

Pruébalo y comentanos lo que veas.

Un Saludo.

Yo igual pido disculpas…por un momento no lei bien !! claro, para tablas internas mejor el modify pero si quieres modificar dentro de un loop y lo estas haciendo con field symbols, no es necesario hacer la sentencia MODIFY !! disculpas a todos de nuevo.

Gracias smota y Jotojori, ambos ayudaron muchisimo, de la manera que indicaron no funcionó, sin embargo haciendo unos ajustes, quedó de maravilla y el tiempo se redujo de 30 minutos a un promedio de 7 minutos, el código que solucionó el problema es el siguiente:

LOOP AT ti_tvzbt ASSIGNING <wa_tvzbt>. CLEAR: wa_data. wa_data-vtext = <wa_tvzbt>-vtext. MODIFY ti_data FROM wa_data TRANSPORTING vtext WHERE zterm = <wa_tvzbt>-zterm. ENDLOOP.

Gracias a todos.

4 Me gusta

Saludos @3729573RST

Excelente, disminuyo el tiempo.

Ahora.
Seria interesante, realizar una validación en tiempos de de la tecnica Método de cursos paralelo Vs Modify ó por el contrario para que lo tengas presente en futuros desarrollos.

Aqui dejo el Link de la tecnica.
h_tps://wiki.scn.sap.com/wiki/display/Snippets/ABAP+Code+for+Parallel+Cursor+-+Loop+Processing

1 me gusta

Gracias David147, me parece muy bueno lo propuesto lo implementaré de inmediato.

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.