|
#1
|
|||
|
|||
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 |
#2
|
|||
|
|||
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??? |
#3
|
|||
|
|||
Hay un tema tecnico que necesitas tener en cuenta
Como ves el metodo para crear la tabla dinamica contempla la excepcion generate_subpool_dir_full Esta excepcion si no recuerdo mal salta a la vez numero 37 que quieras crear una tabla, es decir, si tu tabla de familias tuviera 37 familias diferentes tu codigo daria dump Te pongo un ejemplo de como lo haria, te advierto que es un poco farragoso y es facil perderse por lo que se estricto y hazlo como te indico, si tienes dudas pregunta Lo primero de todo vas a tener que hacer lo siguiente En la se11 create una estructura que se llame ZTY_S_FAMVAL, esta estructura contendra dos campos: familia y valor, a cada uno ponle la longitud correspondiente Una vez que hayas creado la estructura ZTY_S_FAMVAL en la se11 tienes que crear un tipo tabla que llamaras ZTY_T_FAMVAL cuyo tipo de linea sera ZTY_S_FAMVAL En la se11 crea otra estructura que se llame ZTY_S_TABFAMVAL, esta estructura tendra una unico campo que se llamara TABLA, dicho campo sera del tipo ZTY_T_FAMVAL, es decir, esta estructura tendria un unico campo pero ese campo a su vez seria una tabla (con las columnas familia y valor) Por ultimo en la se11 tienes que crear un tipo tabla que se llame ZTY_T_TABFAMVAL, este tipo de tabla tendra como tipo de linea la estructura ZTY_S_TABFAMVAL, es decir, tendremos una TABLA cuyas lineas contendran un unico campo que a su vez sera una tabla La idea fundamental es que para evitar el dump generate_subpool_dir_full lo que haces es crear la tabla una unica vez y luego "reutilizarla" porque al final vas a tener muchas tablas (tantas como familias) pero todas las tablas tienen la misma estructura Ahora te adjunto un ejemplo de codigo de como podrias trabajar con esto, adaptalo a tus necesidades Al final si explotas la logica que te he puesto encima el objetivo es que obtengas una tabla del tipo ZTY_T_TABFAMVAL que tendra tantas lineas como familias diferentes hay A su vez cada linea contendra un campo llamado TABLA y dicha tabla contendra tantas lineas como valores tenga la familia correspondiente Como estas almacenando todo en lineas de tablas no tienes que preocuparte de nombres asignados a las tablas ni nada de eso |
#4
|
|||
|
|||
Genial!
Úlima edición por miko-lynn fecha: 12/09/13 a las 14:46:17. |
#5
|
|||
|
|||
Jeje, gracias hombre !!
Bueno lamento comunicarte que lo de leer la informacion no es algo nada sencillo De hecho hay una cosa que ya te comente que es algo FUNDAMENTAL y es el tema de si importa el orden o no Es decir ¿ A1+B1+C1 es lo mismo que B1+A1+C1 o no? Si NO importa el orden simplemente es hacer loop a cada una de las tablas y guardando todas las combinaciones Si el orden SI importa y tienes que generar todas las combinaciones... Lo primero es que hay que ser consciente de lo que estamos hablando Por ejemplo suponiendo que tenemos 3 tablas (osea, 3 familias) todas las combinaciones posibles en las que podriamos ir recorriendo las tablas para obtener el producto cartesiano serian TABLA1,TABLA2,TABLA3 TABLA1,TABLA3,TABLA2 TABLA2,TABLA3,TABLA1 TABLA2,TABLA1,TABLA3 TABLA3,TABLA1,TABLA2 TABLA3,TABLA2,TABLA1 Es decir para 3 elementos tenemos 6 posibilidades diferentes o dicho de una manera estricta las posibles permutaciones de 3 elementos son 3! (3 factorial) que es 3*2*1 = 6 Si fuera 5 familias diferentes seria 5! = 120 posibilidades diferentes Pero es que ya si hubiera por ejemplo 10 familias seria 10! = 3.628.800 posibilidades diferentes que ya es un numero considerablemente grande (y solo estamos hablando de 10 familias que no es algo descabellado) Para que te hagas una idea, las calculadoras de toda la vida suelen tener capacidad de calculo para calcular hasta 20! a partir de ahi ya salen numeros tan grandes que no son capaces de computarlos Lo que quiero decir con esto es que si por ejemplo tienes 70 familias diferentes (cada una con n valores diferentes) y quieres obtener todas las posibles combinaciones y TENIENDO EN CUENTA EL ORDEN Eso es un calculo monstruoso que puede tomar muchisimo tiempo aunque hagas un algoritmo hiper-mega-optimo |
#6
|
|||
|
|||
Buf, si! pero... [EDITO] !!!! LO CONSEGUI!!!! Después de montar todos los datos en la "tabla de Tablas", he hecho lo siguiente: Entonces, después de romperme los cuernos mil horas y varios minutos de regalo, he conseguido hacer el form recursivo, de manera sencilla y, mejor aún, que funciona. Por el camino, vamos recogiendo muchos datos superfluos, pero como no hacemos nada con ellos ya que llevamos los contadores FROM y TOT para tratar sólo los datos que nos interesa tratar, la ejecución es bastante rápida. (menos de un segundo para cerca de mil registros). Hale, aquí lo dejo para que las futuras generaciones que tengan que lidiar con un form recursivo puedan usarlo (y seguro mejorarlo ) MUCHAS GRACIAS! Úlima edición por miko-lynn fecha: 17/09/13 a las 16:31:15. |
#7
|
|||
|
|||
La combinatoria es una ciencia compleja y ABAP no es un lenguaje orientado a ello por lo que la solucion se ha enrevesado bastante pero creo que al final ha quedado ha quedado un aporte excelente, tambien es de agradecer que hayas pegado el codigo final por si en el futuro alguien se encuentra en esta situacion
Felicitaciones !! |
Herramientas | Buscar en Tema |
Desplegado | |
|
|