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

Macros et VBA Excel Discussion :

Problème de recupération des données MySQL avec un attribut type longtext [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Par défaut Problème de recupération des données MySQL avec un attribut type longtext
    Bonjour,

    Je suis en train de créer une application qui récupère les valeurs d'une base de données pour les insérer dans des listbox d'un UserForm
    voici une image d'un des listbox qui fonctionne bien pour illustrer :
    Nom : imprecran.png
Affichages : 216
Taille : 11,1 Ko
    Mon problème est dans l'alimentation d'une autre listbox, qui fait planter l'application lorsque UN des attributs (qu'on va appeler DATASHEET) de ma table possède une valeur autre que null. Cet attribut est de type 'longtext', et c'est le seul de ce type là. Je soupçonne donc une erreur à cause du type, mais comment y remédier?

    Note : L'application ne plante pas si on lui demande d'alimenter la listbox et que l'attribut DATASHEET est null
    Note 2 : lorsque j'exécute l'application en mode pas à pas détaillé (et que DATASHEET) contient une valeur, elle ne plante pas mais remplace la valeur par null puis par "". Ceci est dû à une fonction que j'ai créé qui remplace toute les valeurs null de la BDD par "" pour les affecter aux attributs de mes objets dans l'appli. voir capture d'écran ci dessous :

    Cette fonction est utilisé pour chaque attribut de chaque objet de toute mon appli et marche bien sauf avec DATASHEET.
    1) fonctionnement de la fonction avec un attribut quelconque, qui marche :
    Nom : screenOK 1.png
Affichages : 195
Taille : 9,6 Ko
    le parametre contient la bonne valeur et le pas à pas va me faire aller au else et la fonction ne modifie pas la valeur



    Nom : screenOK 1.png
Affichages : 252
Taille : 10,0 Ko
    deux "pas" (F8) après, tout va bien

    2) exemple avec la valeur de l'attribut DATASHEET:
    Nom : screenOK 1.png
Affichages : 199
Taille : 9,3 Ko
    Jusqu'ici, tout semble fonctionner. le parametre récupère bien la valeur de mon attribut DATASHEET dans la base, qui est bien égal à "DSH"



    Nom : screenOK 1.png
Affichages : 191
Taille : 10,1 Ko
    cependant, un "pas" (F8) après, la valeur du paramètre s'est changé en null (????) donc la fonction le change en "", et l'application ne plante pas. (je rappelle qu'lle plante dans les mêmes conditions si on n'exécute pas en mode pas à pas)




    Voici tout les indices que je peux fournir.. je n'ai pas d'autre idée, merci de m'aider si vous avez des idées
    n'hésitez pas à me poser des questions pour des précisions si je n'ai pas été assez clair

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    note que ça ne présente pas d’intérêt de tester un null! tu concatène un text null avec ta valeur et le tour est joué!

    dommage de devoir modifier ton code avec Photoshop!

    Nom : Sans titre.png
Affichages : 177
Taille : 6,4 Ko

    note qu'il es possible que le champ mémo soient trop lon pour ta liste! tronque la!

    Code dans ta fonction : Sélectionner tout - Visualiser dans une fenêtre à part
    txt =trim(left( "" & champ.value & space(255),255))

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Par défaut
    Bonjour et merci pour votre temps,

    j'ai inséré des images au lieu du code pour qu'on puisse voir avec les infobulles les valeurs des variables.
    L'interet de cette fonction est de remplacer les valeurs null par "". En effet, exel refuse d'affecter à une variable une valeur null (ou refuse d'afficher le contenu de celle ci, je ne sais plus mais en totu cas ca plante).
    Je crois que je n'ai pas bien compris votre solution, pouvez vous préciser.

    Merci d'avance,

    JahE

  4. #4
    Invité
    Invité(e)
    Par défaut
    si je concatène "" avec null le résultat devient ""

    si une colonne ne peux pas accepter un lontext alors je le tronc à la valeur max admissible pour la cotonne!

    en revanche tu pourrais faire tous le ajustement directement dans ta requête MySql et ainsi envoyer le résultat directement dans ta liste sens faire de movenext!

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Par défaut
    Ok c'est compris merci.
    Dernière question, l'hypothèse de la valeur maximale me semble probable, cependant dans l'exemple que j'ai montré, la valeur qui posait problème était uniquement coposé de 3 caractère. Est ce que cela veut dire que peu importe la longueur de la chaine dans un longtext, celui ci peut dépasser la valeur maximale ? Et je ne comprends pas pourquoi ma fonction marche pour tout sauf cet attribut..
    Malheureusement je ne peut pas tronquer, les valeurs contenues dans DATASHEET vont être des chemins absolus, donc c'est gênant si on les coupe.

    Merci pour vos réponses, je vais essayer de trouver une autre solution

  6. #6
    Invité
    Invité(e)
    Par défaut
    bonjour,
    en réalité un champ d'une base de donnée occupe la longueur max?

    pour définir la taille d'une base de données, c'est la somme des taille de champ * par le nombre d'enregistrement!

    une base SGBD utilise un masque de type champ dans un masque de type record dans un masque de type table;base; fichier séquentiel!


    un champs texte 50 fait une longueur de 50 même avec 2 caractère (on appel ça un buffer), en d'autre terme on réserve l'espace utilisable pour ne pas devoir décaler tout l'espace mémoire en en cas de modification:

    note également que pour le même raison un enregistrement supprimé ne l'est pas vraiment il devient visible=false!

    "AB|-----------------------------------------------"
    Le | représente le caractère de fin de ligne!
    Dernière modification par Invité ; 12/05/2017 à 09h31.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Par défaut
    Merci pour ces précisions,

    Peut etre que cela veut dire que le String de VBA possède une valeur max inférieure a la valeur de longtext de MySQL, ce qui expliquerait pourquoi il transforme la valeur en null

    EDIT: apparemment non car String peut contenir 2 milliards de caractères

    EDIT: après vérification, longtext pourrait contenir 4 milliards de caractères, donc ma première hypothèse est possible

  8. #8
    Invité
    Invité(e)
    Par défaut
    les champ mémo(ongtext) sont difficile à cerner en vba du fait que leur taille est 4,294,967,295 caractères!

    c'est pour cela que la seule façon de les utiliser dans une close where est le Like!

    en revanche la taille maximale utilisable dans Windows pour définir le chemin d'un répertoire est bien plus limité! je te suggère de demander Google l'information et de limiter ton champ à nvarchar(255) par exemple!

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Par défaut
    J'ai essayé de tronquer directement dans l'objet de recordset (donc avant ma fonction NVL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set CCompoManufacturerSource = PAR_CCompoManufacturerSource_Col.Add( ............. , Left(FCT_STR_NVL(OBJ_TestRS.fields(4)), 2) ..........)
    cependant, celui renvoie directement une valeur null en parametre de ma fonction NVL. (auparavant, ca renvoyait la valeur null juste après)


    -> Est ce que cela veut dire qu'il est impossible de faire un traitement sur ce type de donnée et que la seule solution est de changer le type de donnée dans la BDD ?

  10. #10
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT CONVERT(id, CHAR(50) )FROM tabletest t;

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Par défaut
    Ca fonctionne!! super!


    Je résume pour ceux qui auraient à l'avenir le même problème : le type longtext de MySQL est trop grand pour le type String de VBA et ne peut donc pas être traité correctement dans le code vba

    La solution est donc de modifier le type dans la BDD pour un type plus petit comme Varchar ou mediumtext ou de le convertir directement dans la requete comme indiqué au dessus,

    je met le sujet en résolu

    merci pour tout

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/01/2014, 10h44
  2. Réponses: 1
    Dernier message: 01/08/2013, 18h23
  3. Problème connexion base de données MySQL avec VB.net
    Par fridrai dans le forum Administration
    Réponses: 3
    Dernier message: 28/05/2013, 18h59
  4. Chargement des données à Mysql avec Talend
    Par srera dans le forum Développement de jobs
    Réponses: 16
    Dernier message: 29/11/2011, 16h34
  5. Réponses: 1
    Dernier message: 31/01/2007, 11h59

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