3
votes

Comment faire une boucle sur les données de requête et les insérer dans la structure?

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.


16 commentaires

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


3 Réponses :


4
votes

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;
}


2 commentaires

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.



3
votes

@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

 entrez la description de l'image ici

J'espère que cela vous sera utile. Merci.


0 commentaires

2
votes

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

 Capture d'écran du résultat p>

>Alternative

array function formatData(qryData) {
   return DeserializeJSON(SerializeJSON(arguments.qryData, "struct"));
}


3 commentaires

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.