IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Utilisation des fichiers exportés par HExporteJSON() [WD23]


Sujet :

WinDev

  1. #1
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 767
    Par défaut Utilisation des fichiers exportés par HExporteJSON()
    Bonjour,

    Je butte sur un truc depuis un petit moment, ça me semblait simple, mais bon ...

    J'ai créé un type de fichier (c'est perso, en fait un fichier *.zip renommé) afin de pouvoir "transporter" des bouts d'applications que je crée directement dans mon appli :

    - fichiers texte de scripts
    - fichiers divers
    - fichier *.wde d'Etats et requêtes
    - ..

    ça me permet de créer les "bouts d'appli" en local et de les envoyer à un client et dans son appli il a une fonction "Charger un fichier de fonctions" pour mettre en place ces fonctions.

    Jusque là, tout bon, mais je viens de créer un (mini) éditeur de fenêtre pour rendre mes scripts plus sympas et visuels et je voudrais passer ces fenêtres personnalisées dans mon fichier.

    Comme il y a pas mal d'infos qui viennent de la BDD, et que c'est compliqué a tout mettre dans un fichier à plat (ini ou autre) comme il y a des infos différentes , booléens, mémos, entiers, ... la bonne solution me semblait être :

    - 1 je requête les infos désirées (fenêtres et composants de la fenêtre)
    - 2 un petit HxporteJSON() dans un fichier texte
    - 3 je mets ce fichier dans mon zip

    Jusque-là , tout bon ça marche très bien

    C'est la récupération des données du JSON qui me pose des soucis :

    Je charger les infos du JSON par :

    C'est juste un bout de code de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    sFile est une chaîne = "C:\temp\NOK_FEN_UI.txt"
     
    vListe est un Variant   = JSONVersVariant(fChargeTexte(sFile))
     
    SI vListe = Null  ALORS RETOUR 
     
    nCpt est un entier = 1
    POUR TOUS elements DE vListe
     
    	Trace(elements[nCpt].FEN_Titre)
     
    	nCpt++
     
    FIN
    Voila ce que donne le variant récupéré par la fonction JSONVersVariant() :

    Nom : json_0.png
Affichages : 254
Taille : 41,0 Ko

    Nom : json_1.png
Affichages : 252
Taille : 37,2 Ko

    J'ai un ancien bout de code qui fonctionnait parfaitement avec un import de JSON que je crée depuis un site web et qui fonctionne parfaitement dans le cas du code récupéré via http :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    nCpt est un entier = 1
    POUR TOUS elements DE vListe
     
    	Trace(elements[nCpt].FEN_Titre)
     
    	nCpt++
     
    FIN
    Mais dans mon cas je ne réupère que la première ligne, ce qui est logique vu que le premier niveau c'est _QUERY_sSQL_UI_1, mais je n'arrive pas a trouver la façon lister les éléments de ce dernier...

    C'est surement tout bête ... mais je tourne en rond autour du truc je n'ai que des "impossible d'accéder au sous-élément"

    Une idée ?

  2. #2
    Expert confirmé
    Avatar de frenchsting
    Homme Profil pro
    multitâches-multifonctions
    Inscrit en
    Juin 2003
    Messages
    5 709
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : multitâches-multifonctions
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 709
    Par défaut
    Bonjour,

    Juste une question : tu as quoi dans "elements" (de vliste) ?

    Je me rappelle que quand j'avais manipulé un json, j'avais écrit un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UneBranche est un variant
    UneBranche = vListe.elements[1]
    Et à partir de là, je travaillais sur UneBranche.

    Je ne me rappelle plus exactement. Et surtout, j'espère ne pas t'avoir raconté une ânerie...

  3. #3
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 767
    Par défaut
    Je ne me rappelle plus exactement. Et surtout, j'espère ne pas t'avoir raconté une ânerie...
    ça m'aurait beaucoup étonné de ta part !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UneBranche = vListe.elements[1]
    Ne fonctionne pas directement (en tout cas en 23) , mais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    sFile est une chaîne = "C:\temp\NOK_FEN_UI.txt"
    vListe est un Variant   = JSONVersVariant(fChargeTexte(sFile))
    
    SI vListe = Null  ALORS RETOUR 
    
    UneBranche est un Variant
    UneBranche = vListe._QUERY_sSQL_UI_1
    
    nCpt est un entier = 1
    POUR TOUS elements DE UneBranche
    	Trace(UneBranche[nCpt].FEN_Titre  + " -- " + UneBranche[nCpt].FEN_Nom + " -- " + UneBranche[nCpt].FEN_Code  )
    	nCpt++
    FIN

    donc tu es assez juste dans ta solution, ce qui me chagrine, c'est que je ne gère pas le nom "_QUERY_sSQL_UI_1" qui et ajouté automatiquement dans le JSON ...

    Pour pouvoir m'assurer du nom de la variable du premier niveau, j'ai changé la création de la requête a exporter du type "requete sql" en "source de données", le nom de la source est repris tel quel, sans que WD m'ajoute des _1 ou autre ...

    ça marche bien ainsi, merci de m'avoir orienté vers la solution !


  4. #4
    Expert confirmé
    Avatar de Voroltinquo
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2017
    Messages
    3 039
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2017
    Messages : 3 039
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Pourquoi travailler directement sur le JSON ? Qui, je le rappelle n'est qu'un emballage pour assurer le transport de données en mémoire (en l'occurrence le résultat de ta requête) pour être utilisé ailleurs, une fois chargé en mémoire.
    Une sérialisation de ta requête (à la place de ton HExporteJSON) sur ton poste de travail peut faire le boulot. Il suffira alors de désérialiser le buffer issu du .JSON sur une autre poste.
    Pour limiter la taille du fichier de transport, tu peux même faire une sérialisation binaire.

  5. #5
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9
    Par défaut
    Salut

    J'ai ce bout de code qui parcourt l'arborescence d'un JSON (ça doit marcher avec un variant en changeant le type de la variable en pramètre), Peut être que ça pourra t'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    PROCÉDURE PROTÉGÉ Trace_Reponse(vp_JSON_Reponse est un JSON)
    SI vp_JSON_Reponse..Occurrence <> 0 ALORS
    	Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)-1) + "Le Json est un tableau de " + vp_JSON_Reponse..Occurrence + " lignes")					
    	Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)-1) + "[")					
    	POUR i = 1 _À_ vp_JSON_Reponse..Occurrence					
    		Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "{")					
    		Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "élément [%vp_JSON_Reponse..Nom%] [%i%]")
    		_ListeMembres(vp_JSON_Reponse[i])					
    		Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "},")					
    	FIN				
    	Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)-1) + "]")					
     
    SINON	
    	_ListeMembres(vp_JSON_Reponse)
    FIN
     
    	PROCÉDURE INTERNE _ListeMembres(_ObjetJSON est un JSON)	                                                            	
    	// Parcours de l'objet JSON	
    	POUR TOUT _Membre DE _ObjetJSON..Membre		
    		// Selon le type on sait si c'est un membre ou un JSON		
    		SI _Membre..Type <> wlVariantObjet ALORS			
    			SI _Membre..Type <> wlVariantTableau				
    				// C'est un membre simple				
    				Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) +""""+ _Membre..Nom + """: " + _Membre..Valeur+ ",")				
    			SINON				
    				// C'est un membre tableau				
    				Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "Le membre " + _Membre..Nom + " est un tableau de " + _Membre..Occurrence + " lignes")				
    				Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "[")					
    				POUR i = 1 _À_ _Membre..Occurrence					
    					Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "{")					
    					Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "élément [%_Membre..Nom%] [%i%]")
    					_ListeMembres(_Membre[i])					
    					Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "},")					
    				FIN				
    				Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + "]")					
     
    			FIN			
    		SINON			
    			// C'est un nouveau JSON			
    			_vl_JSON est un JSON = _Membre..FormatJSON			
    			Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) + """"+_Membre..Nom+ """: {")				
    			_ListeMembres(_vl_JSON)		
    			Trace(Répète("  ", ChaîneOccurrence(dbgInfo(dbgPile), RC)) +"}")
     
    		FIN		
    	FIN	
    	FIN

  6. #6
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 767
    Par défaut
    @ laurentp83 :

    Merci pour ton code, j'ai fais quelques tests avec, mais en version 23 , c'est un peu galère avec le type JSON qui n'existe pas encore et le ..FormatJSON non plus.

    Ce sera pour le jour ou je me déciderais à passer dans la dernière version (que je remets chaque année à la prochaine, c'est certain je ne veux pas passer à côté des 6475 nouveautés entre la 23 et la future 30 )

    @ Voroltinquo

    Je n'avais pas pensé à la sérialisation ... je vais voir ce que ça donne, merci pour le tuyau.

  7. #7
    Membre du Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juillet 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9
    Par défaut
    Salut,

    Je pense que ça devrait marcher en remplaçant le type Json pat le type variant.

    Bonne journée.

  8. #8
    Membre chevronné Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 767
    Par défaut
    J'ai tenté avec le type variant, mais non ça n'a pas l'air de fonctionner

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/11/2005, 18h52
  2. Réponses: 1
    Dernier message: 01/11/2005, 02h29
  3. Est-il possible d'utiliser des fichiers xsl en cascade ?
    Par Faekk dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 22/08/2005, 12h34
  4. Copie de 2 bases SQLserver en utilisant des fichiers
    Par dimdidi dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/08/2005, 09h26
  5. [NASM] Utiliser des fichiers ressources
    Par trax44 dans le forum Assembleur
    Réponses: 8
    Dernier message: 26/09/2004, 18h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo