J'ai des données de requête qui devraient être insérées dans la structure. Lors de la boucle sur les données, chaque valeur doit être affectée à la colonne correspondante. Voici un exemple de données de requête:
1 REC_ID 01 2 REC_ID 06 3 REC_ID 48 4 REC_ID 43 5 REC_ID 61
Ces données doivent être organisées pour ressembler à ceci:
function formatData(qryData) { local.fnResult = structNew(); local.fnData = structNew(); if(qryData.recordcount){ for(row in qryData) { for(column in qryData.columnList) { local.strRec = structNew(); structInsert(strRec, column, row[column]); local.fnData[qryData.currentrow] = strRec; } } } writeDump(fnData); }
J'ai essayé d'obtenir le format de données souhaité avec cette fonction:
1 REC_ID 01 NAME PARIS STATUS Approved TYPE 1 YEAR 2019 2 REC_ID 06 NAME AUSTIN STATUS Inactive TYPE 3 YEAR 2017 3 REC_ID 48 NAME LONDON STATUS Approved TYPE 2 YEAR 2018 4 REC_ID 43 NAME ROME STATUS Inactive TYPE 5 YEAR 2019 5 REC_ID 61 NAME DUBLIN STATUS Inactive TYPE 4 YEAR 2019
Voici à quoi ressemble mon résultat:
REC_ID NAME STATUS TYPE YEAR 1 01 PARIS Approved 1 2019 2 06 AUSTIN Inactive 3 2017 3 48 LONDON Approved 2 2018 4 43 ROME Inactive 5 2019 5 61 DUBLIN Inactive 4 2019
J'utilise la syntaxe cfscript de ColdFusion 11. Si quelqu'un peut m'aider à résoudre ce problème, veuillez me le faire savoir. Merci.
3 Réponses :
Il y a un problème avec votre boucle de liste de colonnes, vous créez une nouvelle structure pour chaque colonne et qui est réinitialisée dans la boucle suivante.
Cette boucle doit être modifiée
local.strRec = structNew(); for(column in qryData.columnList) { structInsert(strRec, column, row[column]); } local.fnData[qryData.currentrow] = strRec;
pour ressembler à
for(column in qryData.columnList) { local.strRec = structNew(); structInsert(strRec, column, row[column]); local.fnData[qryData.currentrow] = strRec; }
Définissez donc fondamentalement la structure en dehors de la boucle qui itère sur les colonnes, puis ajoutez l'enregistrement.
Ouais, c'est fondamentalement ça.
@espresso_coffee, voici votre problème. J'espère que vous devez créer une structure avec la clé comme nombre de lignes et chaque valeur de clé doit être dans un format de structure. Ici, j'ai fourni un exemple de code pour ma requête. J'espère que cela vous sera utile.
<cfscript> myStr = {}; for (row in readStudent) { structInsert(myStr, #readStudent.currentrow#, row); } writeDump(myStr); </cfscript>
Dans ma table d'utilisateurs ayant 6 enregistrements avec prénom, nom et id. Ici, j'ai bouclé la requête et l'ai convertie en valeurs de clé de structure. J'ai utilisé la syntaxe de script parce que votre code a un style de script. :)
<cfquery name="readStudent" datasource="student"> select * from user </cfquery>
Ici, j'ai créé mon premier nom de structure en tant que myStr, et une boucle sur les données de la requête et inséré une valeur de structure pour la clé avec la ligne actuelle qui est readStudent .currentRow et la valeur est dans la ligne . La ligne ayant le prénom, le nom et l'identifiant comme clé de structure et sa valeur.
FYR: J'ai joint mon exemple de requête et je l'ai converti en valeur de structure. Corrigez-moi si j'ai mal compris votre problème
J'espère que cela vous sera utile. Merci.
Si je comprends bien, il semble que vous pourriez simplement
array function formatData(qryData) { var result = []; for (var row in qryData) { result.append(row); } return result; }
Exemple exécutable sur trycf.com
>Alternativearray function formatData(qryData) {
return DeserializeJSON(SerializeJSON(arguments.qryData, "struct"));
}
Je ne pense pas que "struct" soit supporté dans serializeJSON () dans CF11.
Apparemment, c'est , bien que mal documenté. @JamesAMohler - Bien. Apprendre quelque chose de nouveau chaque jour....
@JamesAMohler - Pour aider à convaincre les sceptiques (comme moi), j'ai ajouté l'essentiel et l'image des résultats ;-). N'hésitez pas à le modifier ou à l'annuler si vous n'aimez pas les modifications.
Pourquoi réorganisez-vous un résultat de requête? Est-ce pour l'affichage? Si tel est le cas, cela doit être géré avec votre code frontal.
En y regardant de plus près, il semble que vous vouliez une structure avec des clés numérotées. Cela semble être une approche inhabituelle. Y a-t-il une raison de ne pas utiliser de baie?
@JamesAMohler Je préfère travailler avec des structures et avoir une clé unique pour chaque enregistrement. Y a-t-il une différence majeure dans l'utilisation du tableau?
@Shawn Oui, ceci est utilisé à des fins d'affichage. J'organise les données de la requête avec CF puis les sorties dans la variable JS. Avez-vous une meilleure façon de faire cela?
@espresso_coffee. Les avantages sont 1) les tableaux sont plus légers que les structures 2) les structures sont intrinsèquement des chaînes qui sont plus lentes à comparer que les nombres 3) les tableaux sont plus rapides. Je peux démontrer le plus rapide avec ce lien cffiddle.org/app/... 4) J'ai eu à structs avec des nombres comme clé une seule fois en 20+ ans. C'était parce que les nombres étaient importants et quelque peu aléatoires. Si j'aurais utilisé un tableau, je serais très vide
Il semble que vous incitez FC à faire un travail supplémentaire. Comment utilisez-vous finalement ces données?
@Shawn Au chargement de la page, je dois renvoyer le nombre d'enregistrements à partir de la requête. Ce sont les seules informations qui seront affichées à ce stade. Pendant que je charge les données pour le nombre d'enregistrements, je souhaite charger la requête dans une variable javascript. Ensuite, lorsque l'utilisateur a besoin d'accéder à ces données de requête, je peux simplement les extraire avec javascript. Cela a-t-il du sens?
Vous attendez-vous à ce que ces résultats soient classés d'une manière ou d'une autre?
Oui, ils doivent être commandés par recid.
@JamesAMohler J'ai oublié la mention de l'autre raison pour laquelle j'utiliserais struct avec la méthode clé est principalement parce que la situation où je dois extraire un enregistrement spécifique de l'objet. Dans ce cas, je peux simplement passer la clé dans la structure et obtenir les données.
Les tableaux sont identiques. Si vous avez un tableau et que vous avez besoin de l'élément x, on peut utiliser
myArray [x]
@JamesAMohler Puis-je, par exemple, définir x comme un nombre unique aléatoire (type entier) dans ce cas?
Il peut être défini sur n'importe quel nombre aléatoire. Il n'est pas nécessaire de le remplir complètement. Cela dit, je n'ai utilisé cette approche que peut-être 1% du temps et je la commente beaucoup. Cela dit, il peut être utile de mettre sur SO, comment vous utilisez des structures avec des clés numérotées. Je sais que je suggère une approche assez différente, il serait bon de savoir à quel point le code serait différent.
Transmettez-vous les résultats de la requête à la page ou la requête est-elle exécutée en même temps que la page? Quel est le flux de travail de base de cette page. Je ne fais que deviner comment votre page fonctionne. Comment sortez-vous les variables?
@Shawn Ceci est une page d'accueil dans le système (très ancien système). Lorsque l'utilisateur se connecte pour la première fois, il accède à cette page. À ce moment-là, je dois extraire le nombre d'enregistrements de la requête et les afficher sur la page pour l'utilisateur (oui, la requête est exécutée au chargement de la page). Une fois cela terminé, l'utilisateur peut cliquer sur le lien qui affiche le nombre d'enregistrements. À ce stade, je dois afficher les données de la requête à l'utilisateur. Mon idée est d'exécuter une requête lors du chargement de la page, puis de stocker les données dans la variable JS. Les données doivent être déjà organisées à ce stade, la seule chose que je dois faire est d'appeler la fonction JS qui affichera les données à l'utilisateur.
Je ne sais pas à quoi ressemble votre code d'affichage, mais vous pouvez transmettre des données JSON via des attributs de données HTML normaux. Ces attributs peuvent être renseignés directement à partir de votre requête ColdFusion. Sans connaître le flux de ce système, je pense que cela fait ce que vous recherchez. CRÉATION D'UN NOUVEAU TABLEAU DE DONNÉES: trycf.com/gist/7821ba728fdd591eb JUSTE UTILISER L'OBJET CF QUERY: trycf.com/gist/bca9e78fdafb8