ColdFusion - RECURSIVIDAD

 
Vista:

RECURSIVIDAD

Publicado por WEBNESS (14 intervenciones) el 29/01/2008 01:50:08
hola, alguien sabe como manejar recursividad con coldfusion, tengo este codigo recursivo el cual funciona, pero al hacer el retorno, solo me retorna el valor almecenado en la primera pasada

<cffunction access="public" name="crearEnlaces">
<cfargument name="id" type="numeric" required="true" >
<cfargument name="pasadas" type="numeric" required="false" default=0>
<cfscript>
if(pasadas NEQ 2)
{
qMain = this.mainQuery(#id#);
SESSION.enlaces = SESSION.enlaces&" <b>"&qMain.tipoPresupuesto&"(</b>"&qMain.descripcion&"<b>)</b>";

nombre=this.getContratoTipoPresupuesto(qMain.tipoPadre);

switch(nombre)
{
case "periodo" : break;

case "Centros de costo" : if(qMain.id NEQ qMain.id_centro_costo)
qAgrupacion=this.getIdPresupuestoPadreCC(qMain.id_centro_costo,qMain.id_contrato_tipo_presupuesto-1);
else
qAgrupacion=this.getIdPresupuestoPadreCC(qMain.id_presupuesto_padre,qMain.id_contrato_tipo_presupuesto);

pasadas = pasadas + 1;
this.crearEnlaces(qAgrupacion.id_presupuesto,pasadas);
break;

case "Agrupacion" : qAgrupacion=this.getIdPresupuestoPadreAgrupacion(qMain.id_presupuesto_padre,qMain.id_centro_costo);
pasadas = pasadas + 1;
this.crearEnlaces(qAgrupacion.id_presupuesto,pasadas);
break;
}
}
</cfscript>
</cffunction>
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Manejo de recursividad

Publicado por Alejandro (108 intervenciones) el 14/09/2023 17:19:55
En tu código ColdFusion, parece que estás tratando de implementar una función recursiva llamada `crearEnlaces` para crear enlaces basados en ciertas condiciones. Sin embargo, mencionas que solo obtienes el valor almacenado en la primera pasada. Esto podría estar relacionado con cómo estás almacenando los resultados en la variable de sesión `SESSION.enlaces`.

La variable de sesión `SESSION.enlaces` se sobrescribe en cada llamada recursiva, lo que significa que solo retendrás los resultados de la última llamada recursiva. Para solucionar esto, puedes modificar tu código para que `SESSION.enlaces` sea una variable local dentro de la función y la vayas concatenando en cada llamada recursiva. Luego, puedes devolver el valor final después de todas las llamadas recursivas.

Aquí está la versión modificada de tu función `crearEnlaces`:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<cffunction access="public" name="crearEnlaces" returntype="string">
  <cfargument name="id" type="numeric" required="true">
  <cfargument name="pasadas" type="numeric" required="false" default=0>
 
  <cfset var enlaces = ""> <!-- Variable local para almacenar enlaces -->
 
  <cfscript>
    if (pasadas NEQ 2) {
      qMain = this.mainQuery(arguments.id);
      enlaces = "<b>#qMain.tipoPresupuesto#(</b>#qMain.descripcion#<b>)</b>";
 
      nombre = this.getContratoTipoPresupuesto(qMain.tipoPadre);
 
      switch (nombre) {
        case "periodo":
          break;
 
        case "Centros de costo":
          if (qMain.id NEQ qMain.id_centro_costo)
            qAgrupacion = this.getIdPresupuestoPadreCC(qMain.id_centro_costo, qMain.id_contrato_tipo_presupuesto-1);
          else
            qAgrupacion = this.getIdPresupuestoPadreCC(qMain.id_presupuesto_padre, qMain.id_contrato_tipo_presupuesto);
 
          pasadas = pasadas + 1;
          enlaces = enlaces & this.crearEnlaces(qAgrupacion.id_presupuesto, pasadas); <!-- Concatenar el resultado de la llamada recursiva -->
          break;
 
        case "Agrupacion":
          qAgrupacion = this.getIdPresupuestoPadreAgrupacion(qMain.id_presupuesto_padre, qMain.id_centro_costo);
          pasadas = pasadas + 1;
          enlaces = enlaces & this.crearEnlaces(qAgrupacion.id_presupuesto, pasadas); <!-- Concatenar el resultado de la llamada recursiva -->
          break;
      }
    }
 
    return enlaces; <!-- Devolver los enlaces concatenados -->
  </cfscript>
</cffunction>

De esta manera, cada llamada recursiva concatenará su resultado en la variable local `enlaces`, y al final de todas las llamadas recursivas, tendrás el valor completo de `enlaces` que puedes devolver como resultado de la función.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar