MUNDOSAP

Regresar   MUNDOSAP > DESARROLLO > Programación ABAP IV
Nombre de Usuario
Contraseña
Home Descargas Registrar FAQ Miembros Calendario Buscar Temas de Hoy Marcar Foros Como Leídos




 
Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Viejo 05/09/13, 10:44:42
miko-lynn miko-lynn is offline
Junior Member
 
Fecha de Ingreso: abr 2007
Mensajes: 21
cálculo de combinaciones

Saludos
Tengo un pollo montado y no se cómo salirme de él.
Tengo una tabla con sólo dos campos, familia y característica y he de calcular todas las combinaciones posibles que se puedan dar.
Por ejemplo:
Familia Valor
a 1
a 2
b 1
b 2
b 3
c 1
c 2
y las combinaciones que puedo sacar de aquí son:
a1+b1+c1
a1+b1+c2
a1+b2+c1
a1+b2+c2
a1+b3+c1
a1+b3+c2
a2+b1+c1
a2+b1+c2
a2+b2+c1
a2+b2+c2
a2+b3+c1
a2+b3+c2
Al ser n tanto las familias cómo las caracteristicas, supongo que lo he de realizar de alguna forma dinámica, pero no se me ocurre la manera...
Por favor, por favor, por favor, ¿alguien me puede iluminar un poco?
Responder Con Cita
  #2  
Viejo 05/09/13, 16:51:47
ballan ballan is offline
Senior Member
 
Fecha de Ingreso: oct 2006
Mensajes: 671
Lo primero de todo hay algo que no queda del todo claro en tu post, hablas de combinaciones pero no te refieres a si el orden importa o no, es decir,
a1+b1+c1 es lo mismo que b1+a1+c1

Es un detalle importante que conviene aclarar, aunque por lo que comentas voy a dar por supuesto que te refieres a combinaciones sin orden, es decir a1+b1+c1 es lo mismo que b1+a1+c1

Partiendo de este supuesto hay muchas maneras de hacer ese algoritmo, teniendo en cuenta las limitaciones de abap y que como has dicho es algo que tendras que hacer de manera dinamica puesto que el numero de familias y valores sera variable te digo de que manera lo haria yo

Lo primero y fundamental es ordenar los datos de tal manera que luego el algoritmo para calcular todas las combinaciones sea sencillo

Supongamos que de una manera magica obtenemos una serie de tablas con dos columnas (familia y valor) cada tabla contendra el valor de la familia y una linea por cada diferente valor, asi con los datos que has puesto quedaria

TABLA 1

FAMILIA VALOR
A 1
A 2

TABLA 2

FAMILIA VALOR
B 1
B 2
B 3

TABLA 3

FAMILIA VALOR
C 1
C 2

No nos preocupemos ni de como obtener dichas tablas ni generarlas ni el formato que tendran ni nada, despues hablaremos de ello, solo lo pongo de ejemplo para ver como seria el algoritmo

Para hacerlo mas sencillo voy a suponer que solo hay 3 familias (A, B, C) y que tienen los valores que tu has puesto, despues hablaremos de como seria para hacerlo dinamicamente para el numero de familias que sea

Si tu hicieras


Con esto irias obteniendo en lv_combinacion cada una de las diferentes combinaciones posibles que serian el resultado del producto cartesiano de todos los valores de todas las familias, podrias ir haciendo el append de lv_combinacion en otra tabla o algo asi para ir almacenando todas las combinaciones posibles y tu algoritmo estaria resuelto

Ahora voy a hablar de lo que es lo mas complicado que es organizar la informacion de manera que podamos obtenerla como te he dicho

Como el numero de familias no lo conocemos habria N tablas, tantas como familias existen pero todas las tablas tendrian la misma estructura que serian dos columnas, una para el nombre de la familia y otra para el valor

Para crear una tabla en tiempo de ejecucion podemos utilizar muchos metodos, utilizar la clase cl_rs_struc, utilizar el metodo CREATE_DYNAMIC_TABLE de la clase CL_ALV_TABLE_CREATE, si buscas en el foro encontraras multiples posts explicando la creacion de tablas dinamicamente en tiempo de ejecucion (ojo porque creo que el metodo CREATE_DYNAMIC_TABLE por motivos tecnicos de sap solo puedes llamarlo 36 veces, es decir si hubiera 37 familias diferentes ya no te serviria porque te daria dump al intentar crear la tabla numero 37)

Una vez que hubieramos creado las tablas y tuvieramos una tabla por cada familia la cuestion seria rellenarlas, para eso harias un loop a tu tabla maestra donde tienes todas las familias y todos los valores y con los AT NEW o ON CHANGE OF irias partiendo para ir creando cada una de las diferentes tablas donde tendras la familia y sus posibles valores

Bueno me ha salido un ladrillo terrible, lo que quieres hacer es complicado y ABAP no es un lenguaje muy orientado a hacer cosas asi ve exponiendo las dudas que te vayan surgiendo
Responder Con Cita
  #3  
Viejo 05/09/13, 18:06:40
Avatar de SidV
SidV SidV is offline
Usuario Avanzado
 
Fecha de Ingreso: oct 2008
Localización: Argentina
Mensajes: 1,767
@miko-lynn, por favor recuerda dar mejores detalles cuando abras los temas, así los usuarios que participamos de esta comunidad podemos ayudarte mejor.

OFF TOPIC:
Grosísimo el aporte de ballan.

Se agradece!
Sigue así!
Responder Con Cita
  #4  
Viejo 10/09/13, 08:15:45
miko-lynn miko-lynn is offline
Junior Member
 
Fecha de Ingreso: abr 2007
Mensajes: 21
Bueno, ante todo, muchas gracias,

No he respondido antes ya que he intentado la manera en que en PHP, hace mil años, yo había hecho algo parecido que es llamando un perform de manera recursiva pero con ABAP, no me aclaro.

Bueno, el orden si es importante, pero no tanto ya que estas combinaciones las he de pasar después por un mf que realiza ciertos cálculos y si una de las combinaciones no la acepta, devuelve error, con lo cual, esa, la omito y continuo con la siguiente.

Voy a intentar lo que comentas ya que me parece bastante más sencillo que lo que yo estoy intentando, a ver si pronto cuento como me va y si lo he conseguido...
Gracias!
Responder Con Cita
  #5  
Viejo 10/09/13, 11:19:05
ballan ballan is offline
Senior Member
 
Fecha de Ingreso: oct 2006
Mensajes: 671
Este algoritmo tambien podria resolverse de manera recursiva aunque es algo que no te recomiendo puesto que ABAP no esta muy orientado a ello, ademas la recursividad es algo que nos enseñan mucho en la universidad pero si no es con lenguajes que esten preparados para ello al final en la vida real no es muy util porque a nivel de consumo de recursos y tiempos es bastante ineficiente

El detalle de que importe o no el orden en las combinaciones no es algo trivial puesto que te modificaria el algoritmo

Por ejemplo con el ejemplo que puse arriba serviria si NO importa el orden

Si el orden SI es importante el algoritmo cambiaria un poco y seria algo mas o menos asi

Responder Con Cita
  #6  
Viejo 10/09/13, 14:36:17
miko-lynn miko-lynn is offline
Junior Member
 
Fecha de Ingreso: abr 2007
Mensajes: 21
creando tablas dinamicamente

Gracias Ballan!
Otra cosa, al crear las tablas, como lo tengo que hacer dinamicamente para cada "familia" tengo problemas al asignarles un nombre.
Me explico, creo el field symbol apuntando a una estructura del tipo de mis datos (en este caso familia-valor) pero no sé cómo asignarle un nombre diferente por cada familia.

He intentado varias cosas, entre ellas algo así como:


Pero claro, me dice que nombrefs no es compatible con ep_table.
¿¿¿Cómo puedo asignar este nombre dinámico a la tabla creada dinámicamente???
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Reglas de Mensajes
no puedes crear nuevos temas
no puedes responder temas
no puedes adjuntar archivos
no puedes editar tus mensajes

El código vB está On
Las caritas están On
Código [IMG] está On
Código HTML está Off
Saltar a Foro


Husos Horarios son GMT. La hora en este momento es 08:30:03.


www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web