PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Requete API + remplissable Table
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
Salut
Tu peux déjà mettre dans un champ table hiérarchique pour te rendre compte de ce que cela donnera
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/243300-afficher-contenu-json-donc-tout-type-structure-dans/read.awp
Par la suite il est alors facile d'enregistrer dans une table hfsql.
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 tourne
Message 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)

// Création des colonnes de la table
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)
// Déclaration des variables
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 // Vérification du statut de la réponse

SI cookies <> "" ALORS
// Stocker les cookies pour les utiliser dans les requêtes suivantes
h.Entête["Cookie"] = cookies
FIN
//InfoConstruit(reponse.Contenu)
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

// Assurez-vous que les deux tableaux ont la même taille
SI Dimension(NomsMembres) = Dimension(ValeursMembres) ALORS
// Parcourez les tableaux
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

// Assurez-vous que les deux tableaux ont la même taille
SI Dimension(NomsMembres) = Dimension(ValeursMembres) ALORS
// Parcourez les tableaux
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 tourne
Message 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