|
Requete API + remplissable Table |
Débuté par maxencergenty, 16 juil. 2024 16:41 - 18 réponses |
| |
| | | |
|
| |
Membre enregistré 19 messages |
|
Posté le 16 juillet 2024 - 16:41 |
Bonjour, je suis en train d'essayer de développer un petit outils pour récupérer les données API d'un de notre service. J'arrive a bien les récupérer et a les afficher mais je bloque pour remplir une table dynamiquement ou mon fichier HFSQL.
Procedure ParcoursJSON_Tableau(x) POUR TOUT membre de x..Membre SI membre..Membre..Occurrence = 0 ALORS SI membre..Type = 142 ALORS Trace ("Le membre " + membre..Nom + " a les valeurs : ") POUR TOUT elem de membre..Valeur Trace(elem) FIN SINON Trace(Répète("", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "Le membre " + membre..Nom + " a la valeur : " + membre..Valeur) FIN SINON ParcoursJSON(membre) FIN FIN
Donc 2 questions : -Peut-on créer le fichier HFSQL dynamiquement avec les colonnes membre..nom ? -Ou alors je créée manuellement le fichier avec toute les colonnes correspondantes. Mais comment le remplir ?
merci
-- En apprend tous les jours et adore !!!! |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 3 450 messages |
|
Posté le 16 juillet 2024 - 17:24 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 111 messages |
|
Posté le 16 juillet 2024 - 17:34 |
Bonjour, En ce qui concerne la création, il vaut passer par HDécritFichier et les fonction attachée. En ce qui concerne le remplissage, regarde du côté des indirection.
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 19 messages |
|
Posté le 18 juillet 2024 - 16:24 |
Bonjour, j'ai regardé les indirections mais je ne sais pas si c'est possible dans ce sens la.
Car il faudrait que sa se fasse dans le sens :
monfichierHFSL.{membre..Nom}
j'ai essayé sans succès
-- En apprend tous les jours et adore !!!! |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 111 messages |
|
Posté le 18 juillet 2024 - 21:24 |
Évidemment, que cela ne fonctionne pas, les indirection se font de la manière suivante : {<expression>,<TypeIndirection>}, comme précisé dans les exemples. MonFIchierSQL doit être inclus dans l'expression.
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 19 messages |
|
Posté le 23 juillet 2024 - 12:38 |
Du coup, j'ai remplis 2 tableaux de chaines avec les valeurs. Un pour les noms, un autre pour les valeurs. Comment remplir une table, avec toute les valeur du tableau sur une ligne.
Passer d'un tableau 1 colonne avec 30 lignes à un tableau de 1 lignes avec 30 colonnes en fait.
-- En apprend tous les jours et adore !!!! |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 676 messages |
|
Posté le 23 juillet 2024 - 17:02 |
Pourquoi avoir fait 2 tableaux de chaines ? Il te suffit de créer un structure ou une classe contenant comme membres nom et valeur. Ensuite tu crées un tableau de cette structure ou classe, puis tu remplis ton tableau
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 111 messages |
|
Posté le 24 juillet 2024 - 07:55 |
Ton JSON est il "fixe" i.e. il a toujours la même structure, ou sa structure est elle susceptible de varier ?
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 19 messages |
|
Posté le 24 juillet 2024 - 16:24 |
Pour la structure, j'ai essayé, mais cela reste du verticale. Une donnée par ligne.
Mon JSON est susceptible de varier selon les requêtes. C'est pour cela que je veux du dynamique. La génération des colonnes du champ table avec un champclone sur la valeur membre.nom fonctionne. C'est toujours l'ajout des données sur une seul ligne qui me pose problème. J'ai réussi en C# sur un autre projet, mais en Windev je sèche.
-- En apprend tous les jours et adore !!!! |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 676 messages |
|
Posté le 25 juillet 2024 - 08:47 |
Peux-tu rajouter un exemple de ce que tu souhaites (exemple de fichier et de résultat) parce que j'ai du mal à comprendre ta problématique.
Ton JSON ne te sert qu'à créer les colonnes de ta table ? Tu veux créer une table contenant autant de colonnes que de membres de ton JSON ? Tu veux créer une table contenant autant de colonnes que de membres de ton JSON puis remplir ta table avec les valeurs de ton JSON ?
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 111 messages |
|
Posté le 25 juillet 2024 - 12:09 |
maxencer21 a écrit :
Mon JSON est susceptible de varier selon les requêtes.
Mais pour un type de requête (e.g. Liste des clients, Liste des produits ...) la structure renvoyée (le JSON) sera toujours la même (données mises à part bien entendu) ? Éventuellement un JSON d'erreur, mais, de structure connue. Comme l'écrivait Philippe, un peut plus de détails serait bien utile. -- Il y a peut être plus simple, mais, ça tourneMessage modifié, 25 juillet 2024 - 12:14 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 19 messages |
|
Posté le 25 juillet 2024 - 16:41 |
Par exemple sur une boucle de requête je reçois 20 membre..nom qui correspond à mes colonnes de ma table. Cette partie j'ai réussi a créer les 20 colonnes facilement. Mais j'ai aussi 20 membre..valeurs qui doit correspondre a une ligne de données. Et ainsi de suite pour mes autres requêtes.
-- En apprend tous les jours et adore !!!! |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 111 messages |
|
Posté le 25 juillet 2024 - 17:24 |
Un cas concret serait le bienvenu.
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 19 messages |
|
Posté le 30 juillet 2024 - 11:40 |
Je fait ma requête, et je reçois les données sous cette forme :
Model : R350 Name : RuckusAP description : en stock Latitude : 5,123456 Longitude : 1,1234567 location : au stock LocationAdditionalInfo : 10,1,2,3 port 42 administrativeState : Unlocked ...
Model : T350 Name : RuckusAP description : en stock Latitude : 6,98765432 Longitude : 9,654321 location : chez le client LocationAdditionalInfo : 20,4,5,6 administrativeState : Unlocked ...
membre..nom : membre..valeurs
je remplis les colonnes de ma table avec membre..nom. je veux juste remplir la valeur correspondante sur une ligne. Je ne vois pas bien ce que j'explique mal depuis le début.
Model Name description latitude longitude location locationadditionalinfo administrativestate R350 RuckusAP en stock 5,123456 1,1234567 en stock 10,1,2,3 port 42 unlocked T350 RuckusAP en stock 6,98765432 9,654321 chez le client 20,4,5,6 unlocked
-- En apprend tous les jours et adore !!!! |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 676 messages |
|
Posté le 30 juillet 2024 - 14:55 |
En partant du principe que tu récupères un tableau simple, voici ce que tu peux faire
sMaChaineJson est chaîne = `[{"administrativeState":"Unlocked","description":"en stock","Latitude":"5,123456","location":"au stock","LocationAdditionalInfo":"10,1,2,3 port 42","Longitude":"1,1234567","Model":"R350","Name":"RuckusAP"},{"administrativeState":"Unlocked","description":"en stock","Latitude":"6,98765432","location":"chez le client","LocationAdditionalInfo":"20,4,5,6","Longitude":"9,654321","Model":"T350","Name":"RuckusAP"}]` MonJson est un JSON = ChaîneVersJSON(sMaChaineJson)
SI MonJson..Occurrence > 0 ALORS POUR i = 1 _À_ MonJson[1]..Membre..Occurrence oColonne est un Champ <type champ=typColonne> <- ChampCrée("TABLE_SansNom1.COL_" + MonJson[1]..Membre[i]..Nom,typColonne) oColonne..Libellé = MonJson[1]..Membre[i]..Nom FIN FIN
POUR i = 1 _À_ MonJson..Occurrence nIndiceTable est un entier = TableAjouteLigne(TABLE_SansNom1) POUR j = 1 _À_ MonJson[i]..Membre..Occurrence {"TABLE_SansNom1.COL_" + MonJson[i]..Membre[j]..Nom,indChamp}[nIndiceTable] = MonJson[i]..Membre[j]..Valeur FIN FIN TABLE_SansNom1.Ajuste()
Résultat
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 19 messages |
|
Posté le 01 août 2024 - 16:54 |
Bonjour, Du coup j'ai réussi. Il faut je pense optimiser tout cela car quand je fait une requete sur 400 API, cela met un peu de temps. Mais cela Fonctionne.
je commence par récupérer mes valeurs API avec :
Procedure Requete_GET_Tableau_Variant(valeurapi)
sUrlsession est une chaîne = Connexion.url + "/"+valeurapi vdonnées est un Variant
h est un httpRequête h.Méthode = httpGet h.URL = sUrlsession h.ContentType = "application/json" h.Entête["Cookie"] = Connexion.cookie
reponse est un httpRéponse = RESTEnvoie(h) SI reponse.CodeEtat = 200 ALORS SI cookies <> "" ALORS h.Entête["Cookie"] = cookies FIN vdonnées = JSONVersVariant(reponse.Contenu) ParcoursJSON_Tableau(vdonnées) SINON Erreur("Erreur durant la requête de login : "+ RC + reponse.Contenu) FIN
Ensuite je parcours cette valeur et ajoute dynamiquement dans un tableau :
Procedure ParcoursJSON_Tableau(z)
NomsMembres est un tableau de chaînes ValeursMembres est un tableau de chaînes
PROCEDURE INTERNE ParcoursJson2(x) POUR TOUT membre de x..Membre SI membre..Membre..Occurrence = 0 ALORS SI membre..Type = 142 ALORS Trace ("Le MEMbre " + membre..Nom + " a les valeurs : ") POUR TOUT elemen de membre..Valeur Trace(elemen) Ajoute(NomsMembres, membre..Nom) Ajoute(ValeursMembres, elemen) FIN SINON Trace(Répète("", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "Le membre " + membre..Nom + " a la valeur : " + membre..Valeur) Ajoute(NomsMembres, membre..Nom) Ajoute(ValeursMembres, membre..Valeur) FIN SINON ParcoursJson2(membre) FIN FIN FIN
ParcoursJson2(z)
sNomcolonne est une chaîne sMadonnee est une chaîne
SI Dimension(NomsMembres) = Dimension(ValeursMembres) ALORS POUR i = 1 _À_ Dimension(NomsMembres) sNomcolonne = NomsMembres[i] sMadonnee = ValeursMembres[i] SI ChampExiste(sNomcolonne) = Faux ALORS ChampClone(FEN_MENU.TABLE_BorneConfig.COL_clone,sNomcolonne) {"FEN_MENU.TABLE_BorneConfig."+sNomcolonne}..Libellé = sNomcolonne {"FEN_MENU.TABLE_BorneConfig."+sNomcolonne}..Visible = Vrai FIN FIN TableAjoute(FEN_MENU.TABLE_BorneConfig,""+TAB+"12345") nMonnombredeligne est un entier = FEN_MENU.TABLE_BorneConfig..Occurrence POUR r = 1 _À_ Dimension(NomsMembres) FEN_MENU.TABLE_BorneConfig[nMonnombredeligne][r+1] = ValeursMembres[r] FIN
SINON Info("Les tableaux n'ont pas la même taille.") FIN
FEN_MENU.TABLE_BorneConfig.Ajuste()
Procedure ParcoursJSON_Tableau(z)
NomsMembres est un tableau de chaînes ValeursMembres est un tableau de chaînes
PROCEDURE INTERNE ParcoursJson2(x) POUR TOUT membre de x..Membre SI membre..Membre..Occurrence = 0 ALORS SI membre..Type = 142 ALORS Trace ("Le MEMbre " + membre..Nom + " a les valeurs : ") POUR TOUT elemen de membre..Valeur Trace(elemen) Ajoute(NomsMembres, membre..Nom) Ajoute(ValeursMembres, elemen) FIN SINON Trace(Répète("", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "Le membre " + membre..Nom + " a la valeur : " + membre..Valeur) Ajoute(NomsMembres, membre..Nom) Ajoute(ValeursMembres, membre..Valeur) FIN SINON ParcoursJson2(membre) FIN FIN FIN
ParcoursJson2(z)
sNomcolonne est une chaîne sMadonnee est une chaîne
SI Dimension(NomsMembres) = Dimension(ValeursMembres) ALORS POUR i = 1 _À_ Dimension(NomsMembres) sNomcolonne = NomsMembres[i] sMadonnee = ValeursMembres[i] SI ChampExiste(sNomcolonne) = Faux ALORS ChampClone(FEN_MENU.TABLE_BorneConfig.COL_clone,sNomcolonne) {"FEN_MENU.TABLE_BorneConfig."+sNomcolonne}..Libellé = sNomcolonne {"FEN_MENU.TABLE_BorneConfig."+sNomcolonne}..Visible = Vrai FIN FIN TableAjoute(FEN_MENU.TABLE_BorneConfig,""+TAB+"12345") nMonnombredeligne est un entier = FEN_MENU.TABLE_BorneConfig..Occurrence POUR r = 1 _À_ Dimension(NomsMembres) FEN_MENU.TABLE_BorneConfig[nMonnombredeligne][r+1] = ValeursMembres[r] FIN
SINON Info("Les tableaux n'ont pas la même taille.") FIN
FEN_MENU.TABLE_BorneConfig.Ajuste()
-- En apprend tous les jours et adore !!!! |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 111 messages |
|
Posté le 01 août 2024 - 21:25 |
Afin d'améliorer le temps de traitement, tu devrais regarder du côté de table affiche. Tu devrais aussi songer à utiliser la désérialisation. 1-Cela ralentirait le temps de traitement 2-Cela fonctionne même si le résultat est un XML ou un binaire 3-Enfin, si comme je le suppose à la lecture de tes premières questions, ton champ table ne sert que de transition afin d'enregistrer les données reçues dans une table de ta base, l'utilisation de MemoireVersFichier sur le résultat de la désérialisation fait facilement le boulot. C'est le seul moment où tu serais obligé de boucler.
-- Il y a peut être plus simple, mais, ça tourneMessage modifié, 01 août 2024 - 21:40 |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 4 111 messages |
|
Posté le 02 août 2024 - 00:10 |
En fonction de ce que tu veux faire du résultat, tu peux même éventuellement penser à sauvegarde le résultat tel quel dans un fichier (fSauveBuffer)
-- Il y a peut être plus simple, mais, ça tourne |
| |
| |
| | | |
|
| | |
| |
Membre enregistré 2 676 messages |
|
Posté le 02 août 2024 - 10:11 |
Plusieurs choses : - Lorsque tu auras retiré les "Trace", ton code va s'accélérer - Plutôt que d'utiliser la fonction "Dimension()", utilises la propriété "..Occurrence" qui va être bien plus rapide puisque c'est une propriété. - N'utilise pas "TableAjoute" mais "TableAjouteLigne". Si tu as une tabulation dans ta chaine, tu vas perdre des données - La fonction ChampExiste() prend aussi du temps
Je ne saisis pas bien non plus pourquoi tu tiens à utiliser des tableaux. Tu fais 2 fois le parcours: - la première fois tu remplis tes tableaux - la deuxième fois tu parcours tes tableaux pour remplir ta table
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | | | |
| | |
|