2017-04-30 1 views
1

Ich habe eine Abfrage namens "getvalues". Diese Abfrage wird in unterschiedlicher Anzahl wiederholt, wobei jedes Mal eine Zahl am Ende hinzugefügt wird (um mehrere Abfragen zu erstellen).
Beispiel: getvalues1, getvalues2, getvalues3, getvalues ​​(so weiter). Davon abgesehen versuche ich, eine Gesamtanzahl aller Abfragen zu erhalten. Die Variablen Totalrecords werden außerhalb der Schleife auf 0 gesetzt. Danach wird bei jeder Ausführung der Schleife die Anzahl der Datensätze der aktuellen Abfrage zu den Gesamtzahlen addiert.Wie mit Variable in Datensatz umgehen

Das Problem, das ich hier habe, ist mit der Platzierung der Octotorphes. Wenn ich es einrichten als:

<cfset totalrecords = totalrecords + #getvalues1.recordCount#> 

Es läuft ohne Probleme, so dass ich weiß sicher, dass dies das Problem ist.

<cfloop from="1" to=#numberOfTables# index="q"> 
<cfquery name="getvalues#q#" datasource="mydb" 
</cfquery> 
<cfset totalrecords = totalrecords + #getvalues#q#.recordCount#> 
</cfloop> 

Sorry, wenn ich diese Frage seltsam formuliert habe. Ich bin mir nicht sicher, wie ich das fragen soll, aber ich hoffe, dass ich meine Frage beantwortet habe. Jede Hilfe würde sehr geschätzt werden.

+2

(Edit) Sie müssen die falschen Suchbegriff verwendet haben. Kurz gesagt, die meisten Bereiche (Variablen, lokal, URL, usw.) sind Strukturen. Um auf dynamische Variablen zuzugreifen, verwenden Sie die [assoziative Array-Notation] (http://stackoverflow.com/questions/12920155/is-it-possible-to-have-dynamically-generated-query-names-in-coldfusion). Beispiel, 'Variablen [" einigeVariable "& dynamicIndex] .recordCount'. Allerdings ist das Abfragen innerhalb einer Schleife keine gute Idee. Möglicherweise gibt es bessere Möglichkeiten. Erwägen Sie, weitere Details über das Endziel zu veröffentlichen (in einfachem Englisch - nicht Code), damit jemand eine bessere Option vorschlagen kann. – Leigh

+0

Ich nominiere @Leigh, um die Antwort auf diese Frage einzureichen. Aus ihrem Kommentar, 'Variablen [" someVariable "& dynamicIndex] .recordCount' –

Antwort

3

Gibt es einen Grund, warum Sie keine einzige Abfrage für die Datenbank erstellen können, die alle benötigten Daten zurückgibt? Sie können die Schleife innerhalb der Abfrage verschieben und UNION-Abfragen in einer einzelnen SQL-Anweisung erstellen. Alternativ könnten Sie abhängig von Ihrer Datenbank eine gespeicherte Prozedur/Funktion schreiben, die dasselbe getan hat. Wenn Sie einen einzigen Aufruf an die Datenbank senden und alle benötigten Daten, die Sie benötigen, aggregieren, sind Sie effizienter, als wenn Sie eine variable Anzahl von Wiederholungen durchlaufen und jedes Mal einen Datenabschnitt zurückgeben.

+1

Wenn Sie nur die Gesamtzahl der Datensätze benötigen, verwenden Sie stattdessen eine Art' count (...) '. Dies vermeidet die Verschwendung von Bandbreite beim Extrahieren von zusätzlichen Daten, die niemals verwendet werden. – Leigh

1

können Sie evaluate() verwenden:

<cfset totalrecords = totalrecords + #evaluate('getvalues' & q & '.recordCount')#> 
+0

Wenn mir jemand sagen kann, warum ich eine Down-Abstimmung bekommen habe, würde ich es begrüßen. Ich will nicht streiten, ich will nur wissen, was ich in meinen Apps falsch mache. – Jules

1
<cfquery name="getTotals" dbtype="query"> 
    <cfloop from="1" to="#numberOfTables#" index="idx1"> 
     select count(pkID) from getvalues#idx1# as recCount 
     <cfif idx1 lt numberOfTable> 
      UNION 
     </cfif> 
    </cfloop> 
</cfquery> 

<cfquery name="getGrandTotal" dbtype="query"> 
    select sum(recCount) as GrandTotal from getTotals 
</cfquery> 

<cfoutput>#getGrandTotal.GrandTotal#</cfoutput>