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 :

Run-time error pour un module de concatenation lorsque des valeurs sont vides


Sujet :

VBA Access

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Run-time error pour un module de concatenation lorsque des valeurs sont vides
    bonjour a tous

    j'ai un crash sur un module (que j'ai recupere ici http://www.tek-tips.com/faqs.cfm?fid=4233) qui me sert a concatener 2 enregistrements sur la meme ligne.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
    Function Concatenate(pstrSQL As String, _
            Optional pstrDelim As String = ", ") _
                As String
        'example
        'tblFamily with FamID as numeric primary key
        'tblFamMem with FamID, FirstName, DOB,...
        'return a comma separated list of FirstNames
        'for a FamID
        '    John, Mary, Susan
        'in a Query
        '(This SQL statement assumes FamID is numeric)
        '===================================
        'SELECT FamID,
        'Concatenate("SELECT FirstName FROM tblFamMem
        '     WHERE FamID =" & [FamID]) as FirstNames
        'FROM tblFamily
        '===================================
        '
        'If the FamID is a string then the SQL would be
        '===================================
        'SELECT FamID,
        'Concatenate("SELECT FirstName FROM tblFamMem
        '     WHERE FamID =""" & [FamID] & """") as FirstNames
        'FROM tblFamily
        '===================================
     
        '======For DAO uncomment next 4 lines=======
        '======     comment out ADO below    =======
        'Dim db As DAO.Database
        'Dim rs As DAO.Recordset
        'Set db = CurrentDb
        'Set rs = db.OpenRecordset(pstrSQL)
     
        '======For ADO uncomment next two lines=====
        '======     comment out DAO above     ======
        Dim rs As New ADODB.Recordset
        rs.Open pstrSQL, CurrentProject.Connection, _
                adOpenKeyset, adLockOptimistic
     
        Dim strConcat As String 'build return string
        With rs
            If Not .EOF Then
                .MoveFirst
                Do While Not .EOF
                    strConcat = strConcat & _
                        .Fields(0) & pstrDelim
                    .MoveNext
                Loop
            End If
            .close
        End With
        Set rs = Nothing
        '====== uncomment next line for DAO ========
        'Set db = Nothing
        If Len(strConcat) > 0 Then
            strConcat = Left(strConcat, _
                Len(strConcat) - Len(pstrDelim))
        End If
        Concatenate = strConcat
    End Function
    j'ai une requete qui affiche tous les enregistrements de 2 tables meme lorsque les donnees de la 2eme sont vides (LEFT JOIN).
    Donc dans la requete lorsque j'utilise cette fonction Concatenate tout va bien mais lorsque l'un des champ identifiants est vide j'ai le message d'erreur suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Run-time error-2147217900 (80040e14)’:
    Syntax error (missing operator) in query expression ‘MgtProjectNo=’
    et lorsque je click sur debug cette partie du code est souligne en jaune
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    rs.Open pstrSQL, CurrentProject.Connection, _
                adOpenKeyset, adLockOptimistic
    Je suis incapable de trouver une solution au probleme car je ne suis que debutant en programmation VBA.

    il y a t-il un moyen de contourner l'erreur?. j'ai essaye d'inserer un mais ca ne marche pas. Idealement il faudrait qu'il ignore l'erreur lorsque l'un des identifiants est vide et laisse vide la ligne de la colonne ou se trouve la concatenation.

    j'espere que l'un des genies du forum pourra m'aider.

    Merci d'avance

  2. #2
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 626
    Points : 726
    Points
    726
    Par défaut debug
    Bonjour,

    Bon je n'ai pas lu le code, mais quand cela s'arrête au niveau de l'ouverture du recordset tu fais dans la fenêtre des modules :

    Affichage > Fenêtre Exécution (ou ctrl + G)
    debug.print pstrSQL
    Copier le résultat
    Stopper l'exécution du code
    Aller dans les requêtes créer une nouvelle requête en SQL
    Coller
    puis voir avec le générateur, exécuter la requête
    et là tu vois si ta requête est bonne

    apparemment le code d'erreur te dit il me manque l'opérateur, à mon humble avis ta variable est vide

    a+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par naphta Voir le message
    Bonjour,

    Bon je n'ai pas lu le code, mais quand cela s'arrête au niveau de l'ouverture du recordset tu fais dans la fenêtre des modules :

    Affichage > Fenêtre Exécution (ou ctrl + G)
    debug.print pstrSQL
    Copier le résultat
    Stopper l'exécution du code
    Aller dans les requêtes créer une nouvelle requête en SQL
    Coller
    puis voir avec le générateur, exécuter la requête
    et là tu vois si ta requête est bonne

    apparemment le code d'erreur te dit il me manque l'opérateur, à mon humble avis ta variable est vide

    a+
    Bonjour naphta

    c'est exactement ca le probleme, c'est que la variable est vide. Est-ce qu'il y a moyen de contourner ce probleme?

    Entre temps meme si j'ai pas tout compris a ton conseil je vais aller essayer.

    Merci

  4. #4
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2005
    Messages : 626
    Points : 726
    Points
    726
    Par défaut OK
    Bonsoir,

    Et bien non, on ne peut pas ouvrir un recordset "non conforme",
    faut que tu testes la longueur ou le fait que la variable soit vide avant de l'ouvrir.

    Si elle est vide alors on fait pas, ou on fait autrement.

    il y a bien un truc mais c'est pas très "cacher"
    Tu peux ouvrir un recordset sans where puis faire un "find" où on sera autorisé à chercher des valeurs nulles ou vides, si ton champ prévoit dans les paramètres de la table (nul autorisé et/ou valeur nulle).

    a+

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par naphta Voir le message
    Bonsoir,

    Et bien non, on ne peut pas ouvrir un recordset "non conforme",
    faut que tu testes la longueur ou le fait que la variable soit vide avant de l'ouvrir.

    Si elle est vide alors on fait pas, ou on fait autrement.

    il y a bien un truc mais c'est pas très "cacher"
    Tu peux ouvrir un recordset sans where puis faire un "find" où on sera autorisé à chercher des valeurs nulles ou vides, si ton champ prévoit dans les paramètres de la table (nul autorisé et/ou valeur nulle).

    a+
    Ok merci naphta. Je vais y reflechir et plancher dessus.

Discussions similaires

  1. Excel - macro (format conditionnel - run-time error 1004)
    Par Chewi dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/09/2006, 19h18
  2. [ Recordset DAO ] run time error
    Par Jeremie_Vi dans le forum VBA Access
    Réponses: 6
    Dernier message: 29/06/2006, 10h28
  3. Run Time Access pour Access 2000
    Par Jeannot2 dans le forum Access
    Réponses: 2
    Dernier message: 02/05/2006, 12h34
  4. Réponses: 7
    Dernier message: 04/04/2006, 14h35
  5. Run-time error '5':
    Par zazaraignée dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 16/01/2006, 13h53

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