2016-06-10 42 views
3

Ich habe eine cfc-Datei (info.cfc) mit mehreren Funktionen, wie unten gezeigt.Wie kann ich eine Funktion in einer anderen CFC-Datei innerhalb einer Abfrage einer Funktion in einer cfc-Datei aufrufen?

<cfcomponent output="true" extends="DateFunctions"> 
    <cffunction name="getStatuses" access="remote" returntype="any" output="true" returnformat="plain"> 
     ... 
    </cffunction> 

    <cffunction name="viewDate" access="remote" returntype="any" output="true" returnformat="plain"> 
     <cfquery name="records"> 
       SELECT 
       dbo.tickets.Incident, 
       dbo.tickets.Start_Date, 
       dbo.tickets.Days_Due 
       FROM 
       dbo.tickets  
     </cfquery> 
    </cffunction> 
</component> 

Und die andere cfc-Datei (DateFunctions.cfc) die eine Funktion mit zwei Argumenten und Rückkehr ein Datum enthält. Die DateFunctions.cfc Datei ist wie folgt:

<cfcomponent output="true" name="DateFunctions""> 
    <cffunction name="addBusinessDays" access="remote" returntype="any" output="true" returnformat="plain"> 
     <cfargument name="daysToAdd" 
       required="yes" 
       type="numeric" 
       hint="The number of whole business days to add or subtract from the given date"> 
     <cfargument name="date" 
       required="No" 
       type="date" 
       hint="The date object to start counting from.." 
       default="#NowDateTime#"> 

     ... 
     ... <!--- Perform some tasks ---> 

     <cfreturn Date> 
    </cffunction> 
</cfcomponent> 

Frage: Wie kann ich „addBusinessDays“ aus der Abfrage in (info.cfc) auch eine andere Spalte der Ergebnisse produzieren aufzurufen.

Ich dachte, ich konnte vielleicht wie etwas tun:

<cffunction name="viewDate" access="remote" returntype="any" output="true" returnformat="plain"> 
    <cfquery name="records"> 
      SELECT 
      dbo.tickets.Incident, 
      dbo.tickets.Start_Date, 
      dbo.tickets.Days_Due, 
      (
       <cfinvoke component="DateFunctions" method="addBusinessDays" returnVariable="Date"> 
        <cfinvokeargument name="daysToAdd" value="#dbo.tickets.Days_Due#"> 
        <cfinvokeargument name="date" value="#dbo.tickets.Start_Date#"> 
       </cfinvoke> 
      ) AS Due_DATE 
      FROM 
      dbo.tickets  
    </cfquery> 
</cffunction> 
+0

Diese Verarbeitung sollte auf Sicht Seite getan werden, wenn HTML –

+1

Um erzeugt wird, dies zu beantworten, müssen wir den Code für addBusinessDays sehen. –

+0

(Bearbeiten) CFCs können nicht auf diese Weise verwendet werden. Der ColdFusion-Server und die Datenbank sind vollständig voneinander getrennt. CF kennt nichts von Datenbankobjekten, und die Datenbank weiß nichts über CFML, also können Sie die beiden nicht so kombinieren. Die einzige Aufgabe von ColdFusion ist es, als Bote zu fungieren. Es macht seine Arbeit * bevor * die Abfrage jemals ausgeführt wird. CF wertet jeden cfml-Code aus und konvertiert alles in Literale. Es erstellt dann eine SQL-Zeichenfolge und sendet diese Zeichenfolge zur Ausführung an die Datenbank. Die Datenbank erledigt den Rest. – Leigh

Antwort

0

Sie mit dem Vorbehalt, folgendes tun könnte von dort eine zusätzliche Verarbeitung für die Schleife sein würde.

Edit: Per Diskussion unten, aktualisierte cfoutput

<cffunction name="viewDate" access="remote" returntype="any" output="true" returnformat="plain"> 
    <cfquery name="records"> 
      SELECT 
      dbo.tickets.Incident, 
      dbo.tickets.Start_Date, 
      dbo.tickets.Days_Due, 
      '' as Due_DATE 
      FROM 
      dbo.tickets  
    </cfquery> 

    <cfset df = createobject("component","DateFunctions")> 

    <cfloop query="records"> 
     <cfset records.Due_DATE = df.addBusinessDays(Days_Due, Start_Date)> 
    </cfloop> 

    <cfreturn records> 
</cffunction> 
+1

1) Vergessen Sie nicht, VAR/LOCAL-Bereich alle Funktion lokalen Variablen (auch Abfragenamen) 2) Löschen Sie den "dbo.tablename" aus der CF-Schleife. Es ist nicht Teil der Abfrage Spalte Name 3) Da der Code nichts anzeigt, verwenden Sie 'cfloop' anstelle von 'cfoutput' – Leigh

+0

Auch 4) Verwenden Sie nicht '' 'als Due_DATE'', weil es nicht die richtigen Daten generieren wird Typ und/oder Größe für die neue Spalte. Verwenden Sie stattdessen etwas wie "CAST (NULL AS Datetime) AS Due_Date". Die genaue Syntax ist dbms-spezifisch. – Leigh

+0

cfloop vs cfoutput ist eine Frage der Präferenz, sofern nicht verschachtelte Schleifen beteiligt sind. Ich bin mir nicht sicher, ob das Casting in diesem Fall wirklich etwas anderes als Lesbarkeit betrifft. Guter Punkt auf dem dbo.tablename, den ich korrigieren kann. Und ich stimme dem Scoping zu (aber tue es nie wirklich). – snackboy

0

eher cfloop als das df-Objekt erstellen, sollte es den this Umfang gebunden werden. Auf diese Weise wird das Objekt nur einmal erstellt. Dadurch sollte die viewDate-Funktion schneller ausgeführt werden, da beim Erstellen von df kein Overhead vorhanden ist.

Auch new ist nur eine saubere Syntax

<cfcomponent> 

    <cfset this.df = new DateFunctions()> 

    <cffunction name="viewDate" access="remote" returntype="any" output="false" returnformat="plain"> 
     <cfquery name="Local.records"> 
      SELECT 
       dbo.tickets.Incident, 
       dbo.tickets.Start_Date, 
       dbo.tickets.Days_Due, 
       CAST(NULL AS datetime) 
      FROM 
       dbo.tickets  
     </cfquery> 


     <cfloop query="Local.records"> 
     <cfset Local.records.Due_DATE = this.df.addBusinessDays(Local.records.Days_Due, Local.records.Start_Date)> 
     </cfloop> 

     <cfreturn Local.records> 
    </cffunction> 

<cfcomponent> 
+0

Ich weiß, dass das oben auf der vorherigen Antwort basiert, aber wie [in den Kommentaren erwähnt] (http://stackoverflow.com/questions/37757359/how-can-i-call-a-function-in-another-cfc -file-from-in- nerhalb einer Abfrage-of-a-Funktion # comment63005512_37759519), sollte '' 'als'De_DATE' durch etwas wie' CAST (NULL AS datetime) '(dbms-spezifisch) ersetzt werden, um den korrekten Spaltentyp zu gewährleisten . – Leigh

+0

Siehe auch: http://stackoverflow.com/questions/37779101/are-there-different-kind-of-nulls –