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

VBA Access Discussion :

Exploiter champ stocké au format JSON


Sujet :

VBA Access

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut Exploiter champ stocké au format JSON
    Bonsoir le forum,

    Encore une fois, j'ai besoin de vos connaissances car je suis face à un mur...

    J'ai une table liée dont des valeurs d'un champ sont stockées au format JSON et j'ai besoin soit :
    - d'afficher les données de ce champ comme s'il s'agissait d'une table classique (nom du champ en en-tête de colonne et les valeurs par ligne)
    - créer une table locale au format classique en créant un champ pour chaque en-tête JSON.

    Ce n'est peut-être pas possible mais je préfère poser la question à ceux qui maîtrisent bien mieux que moi.

    Merci et bonne soirée à tous,

    Farid

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Salut,

    tous tes enregistrements auront-ils le meme format JSON ?

    Si c'est le cas, pourquoi ne pas passer par un controleur standard json ?
    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
    Sub Exemple()
    Dim TaValeurRetourJSON As String
    'tu alimentes la valeur depuis ta table
    Dim TonObjetStructure As Object
        Dim scriptControl As Object
     
        Set scriptControl = CreateObject("MSScriptControl.ScriptControl")
        scriptControl.Language = "JScript"
            Set TonObjetStructure = scriptControl.Eval("(" + TaValeurRetourJSON + ")")
    'tu pourras ensuite manipuler ton objet par ses propriétés
    MsgBox TonObjetStructure.Prop1
                'etc.
            End With
        End With
     
    End Sub
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Salut Jean-Philippe,

    Tous les enregistrements de ce champ seront effectivement au format JSON. Par contre, j'ai 4 autres champs qui sont eux sur des formats standards (numérique et texte).

    Je teste ton code ce matin ou du moins je vais essayer car je t'avoue que je n'y comprends pas grand chose, heureusement que tu l'as commenté.
    Y a-t-il une référence particulière à activer ?

    Bonne journée et encore merci,

    Farid

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    comme tu as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim scriptControl As Object 'Typé comme un objet sans précision, peut prendre n'importe quoi y compris un ScriptControl.
     
    Set scriptControl = CreateObject("MSScriptControl.ScriptControl") 'Créer vraiment l'objet ScriptControl
    Il n'est pas nécessaire d'ajouter une référence, Access va créer l'objet à la demande.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.
    Il n'est pas nécessaire d'ajouter une référence, Access va créer l'objet à la demande.
    Bonjour,

    C'est noté, merci pour cette précision.

    Néanmoins, au risque de passer pour le dernier des imbéciles, j'ai pour habitude d'utiliser Access via l'interface et un peu (mais alors vraiment très peu) de VBA et du coup, je ne sais pas comment utiliser ce code pour obtenir les données sous la forme souhaitée.

    Il ne serait pas possible de passer par une requête pour créer une table classique répertoriant tous les champs actuellement au format JSON ?

    Bonne fin de journée,

    Farid

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    "au risque de passer pour le dernier des imbéciles"
    Non, non, je te rassure, le dernier c'est moi :-).

    Autant que je sache, Access ne lit pas directement le format JSON donc il faut forcément passer par du code VBA pour le lire.
    Une fois que tu es dans le code et que tu as lu ton information tu peux en effet (toujours par code) l'ajouter à une table.
    En gros cela donne cela :

    1. Vider la table temporaire.
    2. Lire l'info du fichier, un "enregistrement" à la fois (ou tout d'un bloc et parcourir les "enregistrements" chargées)
    3. Écrire les champs qui t'intéressent dans un nouvel enregistrement de la table temporaire.


    Je ne peux pas être tellement plus précis sur comment faire car je n'ai jamais utilisé JSON.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Salut,

    Merci pour ton intervention et c'est moi qui vais te rassurer je pense qu'il y a bien pire que toi ou moi.

    Les étapes que tu décris correspondent exactement ce que j'aimerais faire mais je m'attaque à trop gros, je ne sais même pas par où commencer.

    Créer la table temporaire et la vider, je sais faire mais sans la suite ça ne me sert pas à grand chose.

    En tout cas merci à vous pour votre aide et le temps que vous m'avez consacré.

    Farid

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Est-ce que tu peux poster un extrait de ton fichier JSON ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.
    Est-ce que tu peux poster un extrait de ton fichier JSON ?
    A+
    Re,

    La table liée se nomme "destlogs" et c'est le champ "content" qui stocke les données au format JSON :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    {"civilite":"M.","nom":"XXX","prenom":"XXX","email":"XXXX@free.fr","telephone":"0123456789","adr1":"ALLEZ L'OHEME","cp":"13000","ville":"MARSEILLE","date_naissance":"1975-07-06","num_bs":"XY1234567","vendeur":"Agent1","vendeur_id":"3128","nb_appels":"0","duree":"0","infra":"A"}
    Pour faire le lien, j'aimerais créer une table qui reprend le champ "deal_id" et tous les champs ci-dessus.

    Merci pour l'intérêt que tu portes à mon casse-tête.

    Farid

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Je vais laisser un peu de temps passer si Jean-Philippe André a le temps je pense qu'il sera la meilleur personne pour cela.

    Sinon comme on a une structure fixe, il est assez facile de faire du code pour "lire" les données sans passer par un programme externe.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  11. #11
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 257
    Points
    34 257
    Par défaut
    Salut,

    un exemple :

    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
    Sub Exemple()
    Dim TaValeurRetourJSON As String
    'tu alimentes la valeur depuis ta table
    TaValeurRetourJSON = Dlookup("TonChampJSON","TaTable","FilterSurID")
    Dim TonObjetStructure As Object
        Dim scriptControl As Object
     
        Set scriptControl = CreateObject("MSScriptControl.ScriptControl")
        scriptControl.Language = "JScript"
            Set TonObjetStructure = scriptControl.Eval("(" + TaValeurRetourJSON + ")")
    'tu pourras ensuite manipuler ton objet par ses propriétés
    MsgBox TonObjetStructure.civilite
    MsgBox TonObjetStructure.telephone
                'etc.
    End Sub
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Salut Jean-Philippe,

    Merci pour ce boulot !
    TaValeurRetourJSON = Dlookup("TonChampJSON","TaTable","FilterSurID")
    Pour les 2 premiers, je sais quoi faire mais que dois-je mettre en remplacement de "FilterSurID" ?

    Vraiment désolé et encore merci

    Farid

  13. #13
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Tu mentionnes un table destlogs donc je suppose que c'est un identifiant qui permet de retrouver un enregistrement en particulier dans ta table.

    Si tu n'en as pas et en capitalisant sur le code fourni.

    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
    Sub Exemple()
        Dim TaValeurRetourJSON As String
        'tu alimentes la valeur depuis ta table
        Dim TonObjetStructure As Object
        Dim scriptControl As Object
     
        Set scriptControl = CreateObject("MSScriptControl.ScriptControl")
        scriptControl.Language = "JScript"
     
        dim db as dao.database: set db=currentdb
        dim r as dao.recordset: set r=db.openRecordset("destlogs", dbOpenSnapshot)
        dim rSortie as dao.recordset:set rSortie=db.openRecordset("TaTableTempo", dbOpenDynaset)
     
        do while not r.eof 'Pour tous les enregistrements
           TaValeurRetourJSON=r![TonChampJSON]
           Set TonObjetStructure = scriptControl.Eval("(" + TaValeurRetourJSON + ")")
          'tu pourras ensuite manipuler ton objet par ses propriétés
          rSortie.AddNew
          rSortie![Civilite]=TonObjetStructure.civilite
          rSortie![Telephoe]=TonObjetStructure.telephone
          'etc.
          rSortie.update
          r.movenext
       loop
     
       r.close:set r=nothing
       rSortie.close:set rSortie=nothing
       db.close:set db=nothing
       set TonObjetStructure =nothing
       set scriptControl =nothing
    End Sub
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  14. #14
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Désolé, je pense que je suis très chiant mais il semble qu'il est nécessaire de cocher une référence particulière pour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    rSortie As dao.recorset
    J'ai un message d'erreur : "Erreur de compilation : type défini par l'utilisateur non défini" (ils ne se sont pas foulés sur le message d'erreur chez MicroSoft )

  15. #15
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 878
    Points : 4 754
    Points
    4 754
    Par défaut
    bonjour
    of course

    Cdlt
    "Always look at the bright side of life." Monty Python.

  16. #16
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Arf' ! Mais quel imbécile je suis !

    Merci beaucoup.

  17. #17
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci d'avoir signalé l'erreur, j'ai corrigé le code source.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  18. #18
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 101
    Points : 58
    Points
    58
    Par défaut
    Bah écoute... Ca marche impec' !

    Le seul truc c'est que j'ai dû quitter à la sauvage pour interrompre l'exécution et en rouvrant, j'ai vu ma table renseignée avec le même nombre de lignes donc c'est nickel !

    Je vais voir comment récupérer également le champ 'ID' qui est un champ numérique classique et essayer de comprendre pourquoi ça continue de tourner.

    Un énorme MERRCIIIIIII !

    Bonne soirée,

    Farid

  19. #19
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    465
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 465
    Points : 549
    Points
    549
    Par défaut
    Bonjour,

    Il semble que vous ayez trouvé une solution qui vous comble de bonheur mais une solution simple peut provenir de la fonction VBA split.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim varLines() As String
    Dim strJSON As String
     
    varLines = Split(strJSON, ",")
     
    For i = LBound(varLines) To UBound(varLines)
        Debug.Print varLines(i)
    Next i
    récupérer le JSON et le diviser en tous ses composants dans un array puis exploiter l'array.

  20. #20
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Oui on aurait pu utiliser Split mais c'est plus compliqué car en plus devoir découper sur les virgules il faut aussi récupérer le nom de l'attribut et la valeur. Bref du travail et des validations à faire alors que la méthode avec l'interpréteur de script (que je ne connaissais pas) est beaucoup plus éléguante et sûre.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. Masquer certains champs d'un résultat d'une requête http get au format json
    Par new_wave dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 01/03/2017, 18h44
  2. [11gR2] [JSON/SQL] Extraction de données dans un champ au format JSON
    Par Filippo dans le forum PL/SQL
    Réponses: 3
    Dernier message: 12/03/2015, 11h27
  3. [MySQL] Résultat requête au format JSON, afficher que les champs vide ou null
    Par ilanb dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 12/02/2014, 14h00
  4. [CR9] Mise en forme de champ avec des formats
    Par Sytchev3 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 01/03/2007, 16h35
  5. Tri dans une DBGrid sur un champ date au format jj/mm
    Par Jeankiki dans le forum Bases de données
    Réponses: 10
    Dernier message: 31/10/2004, 12h32

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