Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di zoom
    Registrato dal
    Dec 2001
    Messaggi
    1,737

    problema con funzione ricorsiva in CF

    ho un problema con una funzione ricorsiva in ColdFusion...
    non sapendo dove postare l'ho messo qui che mi sembra il più generico...

    io ho questa funzione che deve ricavare un albero di navigazione.
    Nella tabella ogni record ha un id_padre che lo collega al padre.
    A me serve conoscendo l'id ricavare tutti i parenti più bassi (quindi figli, nipoti, ecc...) perchè devo aggiornare un campo nel db.

    la funzione è questa.

    codice:
    	function figlio(id){
    		var i=1;
    		SQLString = "SELECT scheda_id from scheda where id_padre=" & id;
      		selezionando=QUERY(SQLString: SQLString);
    		writeOutput("SELECT scheda_id from scheda where id_padre=" & id & "
    
    ");		
    		if(selezionando.recordCount){
    			for(i = 1; i lt selezionando.recordCount; i = i + 1){ 
    				aggiorna(selezionando.scheda_id);
    	    		figlio(selezionando.scheda_id);
    				writeOutput("Figli di " & id & "
    
    ");
    			} 
    		}
    	}
    il problema è che se un elemento non ha record non entra nell'if e si blocca tutto.
    Se io chiamo la funzione figlio non dovrebbe continuare a girare fino a quando non finisce?
    Mica non dovrebbe interessargli se si fermano le ricorsive richiamate?
    non so come mai...
    qualcuno ha un'idea?
    aggiorna e query sono altre due funzioni esterne...
    :master:
    Chicco Ravaglia per sempre con noi!

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    14
    Il problema sembra essere nello scopo delle variabili/nomequery della funzione, ( non mi è molto chiaro come mai se la funzione si chiama allo stesso modo le variabili interagiscano tra loro...)

    comunque questa potrebbe essere una soluzione:

    ho creato la seguente tabella "pippo" ( se ho ben capito è la tua struttura, io uso oracle ma di fatto non cambia null)
    IDPADRE IDFIGLIO
    1 100
    100 1000
    100 1100
    1000 10000
    1000 10001
    1 200

    questa la funzione (ho usato i tag perchè mi trovo meglio)

    <cffunction name="fn_pippo" returntype="any" output="true" >
    <cfargument name="pk" type="any" default="-1">
    <cfoutput>
    figli di #pk# </cfoutput>
    <cfquery name=#iif(1 eq 1 ,DE("sel" & pk),de(" "))# datasource="pluto">
    select * from pippo where
    idpadre = <cfqueryparam cfsqltype="cf_sql_numeric" value="#pk#">
    order by idfiglio
    </cfquery>
    <cfif #Evaluate("sel#pk#.recordcount")# gt 0 >
    <cfloop query=#iif(1 eq 1 ,DE("sel" & pk) , de(" "))#>
    <cfoutput>
    #Evaluate("sel#pk#.idfiglio")# ----</cfoutput>
    <cfset aa = #fn_pippo(Evaluate("sel#pk#.idfiglio"))#>
    </cfloop>
    <cfelse>
    <cfoutput>
    no figli</cfoutput>
    </cfif>
    <cfreturn "ok">
    </cffunction>

    quando la lancio con

    <cfset zz = fn_pippo(1) >

    ottengo

    figli di 1
    100
    figli di 100
    1000
    figli di 1000
    10000
    figli di 10000
    no figli
    10001
    figli di 10001
    no figli
    1100
    figli di 1100
    no figli
    200
    figli di 200
    no figli

  3. #3
    Utente di HTML.it L'avatar di zoom
    Registrato dal
    Dec 2001
    Messaggi
    1,737

    un po' vecchietta come richiesta...
    sorry, già risolto...
    avendo risolto quando era già finita in seconda pagina non mi è sembrato necessario uppare per dirlo...
    cmq il problema era il nome della query.
    Come facevo io davo lo stesso nome e quindi veniva tutte le volte sovrascritta...

    mi spiace perchè ti sei sbattuto
    Chicco Ravaglia per sempre con noi!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.