2010-05-31 7 views
8

Je génère une requête mais j'ai besoin de spécifier la première ligne du résultat. J'ajoute la ligne avec QueryAddRow() et en définissant les valeurs avec QuerySetCell(). Je peux créer la ligne bien, je peux ajouter le contenu à cette ligne bien. Si je laisse l'argument pour le numéro de ligne hors de QuerySetCell() alors tout cela fonctionne très bien comme le dernier résultat de la requête lors de la sortie. Toutefois, j'en ai besoin pour être la première ligne de la requête, mais lorsque j'essaie de définir l'attribut row avec QuerySetCell, il écrase simplement la première ligne renvoyée de ma requête (c'est-à-dire ma QueryAddRow() remplace le premier enregistrement de ma requête). Ce que j'ai actuellement est de mettre une variable à partir de recordCount et d'organiser la sortie, mais il doit y avoir un moyen très simple de faire cela que je ne reçois tout simplement pas. Ce code définit la valeur de ligne sur 1 mais écrase la première ligne renvoyée de la requête.Comment faire une ligne ajoutée à partir de QueryAddRow() la première ligne du résultat d'une requête?

<cfquery name="qxLookup" datasource="#application.datasource#"> 
    SELECT xID, xName, execution 
    FROM table 
</cfquery> 

<cfset QueryAddRow(qxLookup)/> 
<cfset QuerySetCell(qxLookup, "xID","0",1)/> 
<cfset QuerySetCell(qxLookup, "xName","Delete",1)/> 
<cfset QuerySetCell(qxLookup, "execution", "Select this to delete",1)/> 

<cfoutput query="qxLookup"> 
    <tr> 
     <td> 
      <a href="##" onclick="javascript:ColdFusion.navigate('xSelect/x.cfm?xNameVar=#url.xNameVar#&xID=#qxLookup.xID#&xName=#URLEncodedFormat(qxLookup.xName)#', '#xNameVar#');ColdFusion.Window.hide('#url.window#')">#qxLookup.xName#</a> 
     </td> 
     <td>#qxLookup.execution#</td> 
    </tr> 
</cfoutput> 

Merci pour toute aide.

Répondre

6

J'ajouterais une sorte de colonne d'ordre de tri à votre requête d'origine, la remplissant avec une valeur fixe de 1.

<cfquery name="qxLookup" datasource="#application.datasource#"> 
SELECT xID, xName, execution, 1 as sortorder 
FROM table 
</cfquery> 

Définissez la valeur de cette colonne dans votre ligne synthétique à une valeur de 0.

<cfset QueryAddRow(qxLookup)> 
... 
<cfset QuerySetCell(qxLookup, "sortorder", "0",1)> 

Ensuite, utilisez requête de requêtes SQL pour réorganiser la colonne recordset par la sortorder.

<cfquery name="qxLookup" dbtype="query"> 
select xid, xname, execution 
from qxLookup 
order by sortorder 
</cfquery> 
+0

merci. c'est mieux que ce que j'ai en ce moment. J'espérais vraiment qu'il me manquait quelque chose de simple (comme un attribut pour QueryAddRow - puisque la valeur par défaut est d'ajouter la dernière ligne, peut-être y a-t-il un attribut pour le faire en première ligne?). –

+0

@JS - +1 à la suggestion de Ken. AFAIK, vous ne manquez rien et QueryAddRow n'autorise l'ajout de lignes qu'à la fin de la requête. – Leigh

+0

cela fonctionne, merci. J'ai laissé l'attribut row # et je les ai simplement ajoutés comme la dernière ligne par défaut, puis j'ai fait le QOQ pour trier. –

0

Juste une alternative ci-dessus, mais vous pouvez prendre ColdFusion sur l'image et le faire uniquement dans le SQL en utilisant quelque chose comme (par exemple dans l'oracle)

select « myinsertedvalue » de double union sélectionnez myrealvalues ​​from mutable

Vous pouvez combiner avec la colonne de tri Kens pour obtenir une commande complète. En supposant que vous obtenez la requête principale d'une base de données!

+0

merci pour cela. J'utilise la même requête à quelques endroits différents et je n'ai pas toujours besoin de faire ce genre, donc je me suis dit que puisque je l'avais déjà en mémoire, aller en CF serait simple et 1 appel en moins à la DB. –

1

Eh bien, j'ai déjà traité ce problème, pour moi la réponse était d'avoir 2 requêtes séparées. 1er, étant votre requête normale, 2ème étant la requête de requêtes, puis faire une union de celles-ci, avec le qofq étant au-dessus de la requête normale, et cela devrait vous donner des résultats dans l'ordre que vous voulez.

Quelque chose comme ceci:

<cfquery name="table_a_results" datasource=""> 
select a, b, c 
from table_a 
</cfquery> 

cfset table_b = querynew("a, b, c") 
cfset temp = queryaddrow("table_b") 
cfset temp = querysetcell(table_b,10) 
cfset temp = querysetcell(table_b,20) 
cfset temp = querysetcell(table_b,30) 

<cfquery name="final_query" dbtype="query"> 
select a, b, c 
from table_b 
union 
select a, b, c 
from table_a_results 
</cfquery> 

Ensuite, en utilisant cet outil, vous pouvez mettre des requêtes dans l'ordre que vous voulez, mais rappelez-vous d'utiliser l'ordre par tag, pour changer l'ordre ...