PDA

Ver la Versión Completa : Sumar cadenas de caracteres?


Astaroth_SA
01/08/16, 08:34:23
Buenas. Acabo de empezar en esto y tengo una duda:

Además de otros campos, para lo ke me interesa, tengo un campo distribuidor (char4) y consumo (char16) en una trabla:

----ditribuidor----- consumo ----
001 100
001 50
002 110
003 200

Y necesito que en otra me guarde las líneas que coincidan distribuidor con el campo consumo sumado:

----ditribuidor----- consumo ----
001 150 <===== 100 + 50
002 110
003 200

¿Se pueden sumar las cadenas? He investigado algo del COLLECT pero no sé si el campo a sumar tiene que ser numérico o valen caracteres. Muchas gracias.

dantepx
01/08/16, 10:59:43
Hola Astaroth_SA,

Viendo tu duda se me ha ocurrido una solución relativamente simple. En primer lugar te tendrías que crear una tabla de soporte para el distribuidor.

La idea es hacer dos LOOP's anidados. En la tabla de soporte haces un loop por distribuidor, y con este valor hacer otro LOOP a la tabla en la que tienes toda la información. Sumas el valor de los consumos y lo guardas en la tabla del sumatorio. A continuación te pongo como quedaría el código más o menos.

* Tabla que guarda la información. No se cual es su estructura
* pero al menos tiene los campos distribuidor y consumo

DATA: lt_normal TYPE TABLE OF " El que posea

* Tabla con la misma estructura que lt_normal en la que vamos
* a guardar los sumatorios por distribuidor

data: lt_sumada TYPE TABLE OF " El que posea

* Estructuras de carga

DATA: ls_normal TYPE TABLE OF " El que posea
ls_sumada TYPE TABLE OF " El que posea

* Tipo para la tabla de apollo de los distribuidores

TYPES: BEGIN OF ts_distribuidor,
distribuidor TYPE char4,
END OF ts_distribuidor.

DATA: lt_distribuidor TYPE TABLE OF ts_distribuidor.
DATA: ls_distribuidor TYPE ts_distribuidor.

CLEAR: ls_distribuidor,
ls_normal.

* Se carga la tabla de apollo con los distribuidores

LOOP AT lt_normal INTO ls_normal.

ls_distribuidor-distribuidor = ls_normal-distribuidor.

APPEND ls_distribuidor TO lt_distribuidor.

ENDLOOP.

* Se ordena

SORT lt_distribuidor.

* Se eliminan los duplicados

DELETE ADJACENT DUPLICATES FROM lt_distribuidor.

* Importante la limpieza de variables

CLEAR: ls_distribuidor,
ls_normal,
ls_sumada.

* LOOP por distribuidor

LOOP AT lt_distribuidor TO ls_distribuidor.

CLEAR: ls_normal,
ls_sumada.

LOOP AT lt_normal INTO ls_normal WHERE distribuidor = ls_distribuidor-distribuidor.

* Sumatorio del valor del consumo

ls_sumada-consumo = ls_normal-consumo + ls_sumada-consumo.

ENDLOOP.

ls_sumada-distribuidor = ls_distribuidor-distribuidor.

* Con el sumatorio del consumo y el distribuidor cargamos la tabla
* lt_sumada que es la contiene los valores sumados

APPEND ls_sumada TO lt_sumada.

ENDLOOP.

Espero que te sirva de ayuda,

Un cordial saludo.

Astaroth_SA
02/08/16, 07:29:25
Voy a intentarlo así. Mi duda principal era esa que si creando una variable tipo char16 para el total podía hacer eso:

total (char16) = total (char16) + consumo (char16) y me diera el resultado numérico de la suma al ser cadenas de caracteres. Muchas gracias.

IPASCA02
02/08/16, 07:46:55
¿ Se pueden sumar campos que sean definidos como tipo char? ¿Si son campos númericos que se van a sumar, no deberían ser de tipo númerico?

Un saludo

Astaroth_SA
02/08/16, 12:25:01
Sí. Lo he probado con este programilla.

*&---------------------------------------------------------------------*
*& Report Z_SUMAR_CHAR
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT Z_SUMAR_CHAR.

DATA: total TYPE char16,
num1 TYPE char16 VALUE '0000000000015000',
num2 TYPE char16 VALUE '315'.

total = num1 + num2.

WRITE:/'TOTAL: ' , total.
2269