PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Requete API + remplissable Table
Requete API + remplissable Table
Iniciado por maxencergenty, jul., 16 2024 4:41 PM - 18 respostas
Membro registado
19 mensagems
Publicado em julho, 16 2024 - 4:41 PM
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 !!!!
Membro registado
3.452 mensagems
Publicado em julho, 16 2024 - 5:24 PM
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.
Membro registado
4.111 mensagems
Publicado em julho, 16 2024 - 5:34 PM
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
Membro registado
19 mensagems
Publicado em julho, 18 2024 - 4:24 PM
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 !!!!
Membro registado
4.111 mensagems
Publicado em julho, 18 2024 - 9:24 PM
É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
Membro registado
19 mensagems
Publicado em julho, 23 2024 - 12:38 PM
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 !!!!
Membro registado
2.676 mensagems
Publicado em julho, 23 2024 - 5:02 PM
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
Membro registado
4.111 mensagems
Publicado em julho, 24 2024 - 7:55 AM
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
Membro registado
19 mensagems
Publicado em julho, 24 2024 - 4:24 PM
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 !!!!
Membro registado
2.676 mensagems
Publicado em julho, 25 2024 - 8:47 AM
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
Membro registado
4.111 mensagems
Publicado em julho, 25 2024 - 12:09 PM
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
Mensagem modificada, julho, 25 2024 - 12:14 PM
Membro registado
19 mensagems
Publicado em julho, 25 2024 - 4:41 PM
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 !!!!
Membro registado
4.111 mensagems
Publicado em julho, 25 2024 - 5:24 PM
Un cas concret serait le bienvenu.

--
Il y a peut être plus simple, mais, ça tourne
Membro registado
19 mensagems
Publicado em julho, 30 2024 - 11:40 AM
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 !!!!
Membro registado
2.676 mensagems
Publicado em julho, 30 2024 - 2:55 PM
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
Membro registado
19 mensagems
Publicado em agosto, 01 2024 - 4:54 PM
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 !!!!
Membro registado
4.111 mensagems
Publicado em agosto, 01 2024 - 9:25 PM
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
Mensagem modificada, agosto, 01 2024 - 9:40 PM
Membro registado
4.111 mensagems
Publicado em agosto, 02 2024 - 12:10 AM
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
Membro registado
2.676 mensagems
Publicado em agosto, 02 2024 - 10:11 AM
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