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

Requêtes et SQL. Discussion :

Problème code SQL


Sujet :

Requêtes et SQL.

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 16
    Par défaut Problème code SQL
    Bonjour,

    J'essaie de faire une recherche multi-critères sur deux tables en m'inspirant de l'aide de Charles A. de 2005 publiée sur votre site.

    Mes tables : - KALAM01_HVIPAT ( ses champs : PATNUM,SIPNOM,SIPPREN, PATNAISD, NUMARCH)
    - Table_atalante ( ses champs : N° IPP, NUM_DOS_ATA)
    les deux tables sont liées par PATNUM vers N° IPP;

    Dans mon code VB il me reste semble-t-il deux problèmes :

    1°) l'insertion du nom de ma table : Table_atalante
    2°) et un problème sur ma ligne de code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.lblStats.Caption = DCount("*", "KALAM01_HVIPAT", SQLWhere) & " / " & DCount("*", "KALAM01_HVIPAT")
    Cela fait des heures que je cherche la solution sans résultat; si une bonne âme pouvait m'aider je serais le plus heureux.
    Avec mes remerciements anticipés.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    Il te faut une instruction SQL de ce style
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT PATNUM, SIPNOM, SIPPREN, PATNAISD, NUMARCH, NUM_DOS_ATA
    FROM KALAM01_HVIPAT INNER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.[N° IPP]
    Dans la procédure événementielle de chargement du formulaire :
    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
    Private Sub Form_Load()
    Dim SQL As String
    Dim ctl As Control
     
    For Each ctl In Me.Controls
        Select Case Left(ctl.Name, 3)
            Case "chk"
                ctl.Value = -1
     
            Case "lbl"
                ctl.Caption = "- * - * -"
     
            Case "txt"
                ctl.Visible = False
                ctl.Value = ""
     
            Case "cmb"
                ctl.Visible = False
     
        End Select
    Next ctl
     
    SQL = "SELECT PATNUM, SIPNOM, SIPPREN, PATNAISD, NUMARCH, NUM_DOS_ATA "
    SQL = SQL & "FROM KALAM01_HVIPAT INNER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.[N° IPP]"
    Me.lstResults.RowSource = SQL
    Me.lstResults.Requery
    End Sub
    Dans la sub RefreshQuery() on ne va plus pouvoir utiliser DCount car cette fonction ne supporte que les tables et les requêtes en tant qu'objets de la base de données.
    On fera le comptage d'enregistrement via des instructions SQL du type SELECT Count(*) FROM ... avec DAO.
    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
    Private Sub RefreshQuery()
    Dim SQL As String
    Dim SQLWhere As String
    Dim SQLCompteTout As String, SQLCompteWhere As String
    Dim lgCompteTout As Long, lgCompteWhere As String
    Dim db As DAO.Database, rs As DAO.Recordset
     
    SQL = "SELECT PATNUM, SIPNOM, SIPPREN, PATNAISD, NUMARCH, NUM_DOS_ATA" & vbCrLf
    SQL = SQL & "FROM KALAM01_HVIPAT INNER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.[N° IPP]" & vbCrLf
    SQL = SQL & "Where KALAM01_HVIPAT.PATNUM <> 0 "
     
    SQLCompteTout = "SELECT Count(*) FROM KALAM01_HVIPAT INNER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.[N° IPP]"
     
    If Not Me.chkNumArchHex Then
        SQL = SQL & "And KALAM01_HVIPAT!NUMARCH like '*" & Me.txtRechNumArchHex & "*' "
     
    End If
    If Not Me.chkNom Then
        SQL = SQL & "And KALAM01_HVIPAT!SIPNOM  like '*" & Me.txtRechNom & "*' "
    End If
    If Not Me.chkprenom Then
        SQL = SQL & "And KALAM01_HVIPAT!SIPPREN like '*" & Me.txtRechPrenom & "*' "
    End If
    If Not Me.chkDateNaissance Then
        SQL = SQL & "And KALAM01_HVIPAT!PATNAISD like '*" & Me.txtRechDateNaissance & "*' "
    End If
     
    If Not Me.chkNumAta Then
        SQL = SQL & "And Table_atalante!Type  like '*" & Me.txtRechNumAta & "*' "
    End If
     
    SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     
    SQL = SQL & ";"
     
    SQLCompteWhere = SQLCompteTout & " WHERE " & SQLWhere
     
    Set db=CurrentDb()
    Set rs = db.OpenRecordset(SQLCompteTout)
    if not rs.EOF then lgCompteTout = rs(0)
    rs.Close
    Set rs = db.OpenRecordset(SQLCompteWhere)
    if not rs.EOF then lgCompteWhere = rs(0)
    rs.Close
     
    Me.lblStats.Caption = lgCompteWhere & " / " & lgCompteTout
    Me.lstResults.RowSource = SQL
    Me.lstResults.Requery
     
    End Sub
    Pour pouvoir utiliser DAO, il faut s'assurer d'avoir une référence VB à ...
    "Microsoft DAO 3.6 Object Library" pour Acces 2000~2003
    ou "Microsoft Office 12.0 Access database engine Object Library" pour Access 2007 (fichier .accdb)
    ou "Microsoft Office 14.0 Access database engine Object Library" pour Access 2010 (fichier .accdb)

    A+

  3. #3
    Membre averti
    Homme Profil pro
    Médecin responsable département information médicale
    Inscrit en
    Décembre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Médecin responsable département information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 30
    Par défaut Problème Private Sub RefreshQuery()
    Bonjour,

    Je te remercie pour ton aide qui m'est fort précieuse; il me reste un problème que je n'arrive pas à résoudre:
    - la ligne Set rs = db.OpenRecordset(SQLCompteWhere) ne lui convient pas

    J'avoue ne pas bien comprendre pourquoi.

    Merci encore pour une nouvelle suggestion.

  4. #4
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    Je pense que c'est un problème dans la syntaxe des critères de la clause WHERE.
    Dans cette partie du code :
    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
    If Not Me.chkNumArchHex Then
        SQL = SQL & "And KALAM01_HVIPAT!NUMARCH like '*" & Me.txtRechNumArchHex & "*' "
    End If
     
    If Not Me.chkNom Then
        SQL = SQL & "And KALAM01_HVIPAT!SIPNOM  like '*" & Me.txtRechNom & "*' "
    End If
    If Not Me.chkprenom Then
        SQL = SQL & "And KALAM01_HVIPAT!SIPPREN like '*" & Me.txtRechPrenom & "*' "
    End If
    If Not Me.chkDateNaissance Then
        SQL = SQL & "And KALAM01_HVIPAT!PATNAISD like '*" & Me.txtRechDateNaissance & "*' "
    End If
     
    If Not Me.chkNumAta Then
        SQL = SQL & "And Table_atalante!Type  like '*" & Me.txtRechNumAta & "*' "
    End If
    L'opérateur de comparaison LIKE n'est applicable qu'à des champs de type texte.
    Y a-t-il des champs qui ne sont pas de type texte ?

    A+

  5. #5
    Membre averti
    Homme Profil pro
    Médecin responsable département information médicale
    Inscrit en
    Décembre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Médecin responsable département information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 30
    Par défaut Problème LIKE
    Bonjour,
    Effectivement j'ai trois champs qui ne sont pas du TEXTE:
    - NumArch = Numéro Auto
    -NUM_DOS_ATA = Numérique
    PATNAISD = Date/heure

    J'ai essayé les syntaxes suivantes sans succès:
    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
    Private Sub RefreshQuery()
    Dim SQL As String
    Dim SQLWhere As String
    Dim SQLCompteTout As String, SQLCompteWhere As String
    Dim lgCompteTout As Long, lgCompteWhere As String
    Dim db As DAO.Database, rs As DAO.Recordset
     
    SQL = "SELECT PATNUM, SIPNOM,SIPPREN, PATNAISD, NUMARCH, NUM_DOS_ATA" & vbCrLf
    SQL = SQL & "FROM KALAM01_HVIPAT INNER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.IPP" & vbCrLf
    SQL = SQL & "Where KALAM01_HVIPAT.PATNUM <> 0 "
     
    SQLCompteTout = "SELECT Count(*) FROM KALAM01_HVIPAT INNER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.[N°IPP]"
     
    If Not Me.chkNumArchHex Then
    SQL = SQL & "And KALAM01_HVIPAT!NUMARCH = '" & Me.txtRechNumArchHex & "' "
    End If
    If Not Me.chkNom Then
    SQL = SQL & "And KALAM01_HVIPAT!SIPNOM like '*" & Me.txtRechNom & "*' "
    End If
    If Not Me.chkprenom Then
    SQL = SQL & "And KALAM01_HVIPAT!SIPPREN like '*" & Me.txtRechPrenom & "*' "
    End If
    If Not Me.chkDateNaissance Then
    SQL = SQL & "And KALAM01_HVIPAT!PATNAISD = '" & Me.txtRechDateNaissance & "' "
    End If
    If Not Me.chkNumAta Then
    SQL = SQL & "And Table_atalante!NUM_DOS_ATA = '" & Me.txtRechNumAta & "' "
    End If
     
    SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     
    SQL = SQL & ";"
     
    SQLCompteWhere = SQLCompteTout & " WHERE " & SQLWhere
     
    Set db = CurrentDb()
    Set rs = db.OpenRecordset(SQLCompteTout)
    If Not rs.EOF Then lgCompteTout = rs(0)
    rs.Close
    Set rs = db.OpenRecordset(SQLCompteWhere)
    If Not rs.EOF Then lgCompteWhere = rs(0)
    rs.Close
     
    Me.lblStats.Caption = lgCompteWhere & " / " & lgCompteTout
    Me.lstResults.RowSource = SQL
    Me.lstResults.Requery
    Encore un grand merci pour ton aide.

  6. #6
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonsoir,

    Pour des champs numériques :
    L'opérateur Like fonctionne, mais tu perds en performance, en obligeant le moteur de base données à convertir le champ numérique en chaîne de caractère, afin de pouvoir la comparer à ce qui est à droite de l'opérateur Like.
    Le plus approprié pour des Entiers est l'opérateur = , à droite duquel on met le nombre entier sans guillemets simples.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Not Me.chkNumArchHex Then
    SQL = SQL & "And KALAM01_HVIPAT!NUMARCH = " & Me.txtRechNumArchHex & " "
    End If
    Pour des champs dates :
    L'opérateur Like peut aussi fonctionner mais, je dirai, de manière plus hasardeuse.
    Là encore le moteur va convertir un champ non-texte en texte.
    Il utilisera le format date des paramètres régionaux.
    La manière classique de comparer un champ date à une date est par exemple (pour le 6-déc-2011) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ChampDate = #12/06/2011#
    Dans ton code VB :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If Not Me.chkDateNaissance Then
    SQL = SQL & "And KALAM01_HVIPAT!PATNAISD = #" & Format(Me.txtRechDateNaissance, "mm\/dd\/yyyy") & "# "
    End If
    Cela suppose aussi que VB est capable de reconnaître Me.txtRechDateNaissance comme étant une date.
    Si tu imposes un format Date («Date, abrégé» par exemple) dans ton contrôle txtRechDateNaissance, ça aide.

    A+

  7. #7
    Membre averti
    Homme Profil pro
    Médecin responsable département information médicale
    Inscrit en
    Décembre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Médecin responsable département information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 30
    Par défaut Suite erreur clause FROM
    Bonjour,

    J'ai bien modifié comme tu me l'indiquais les différentes valeurs et j'ai notamment mis dans mon controle txtRechDateNaissance en format "date, abrégé".
    J'ai toujours un message d'erreur sur la même ligne de code et comme message VB "trop peu de paramètres; 1 attendu".

    D'autre part et cela n'a je pense rien à voir, dans la jointure j'ai remplacé INNER par LEFT OUTER, car tous les PATNUM de KALAM01 ne sont pas dans N° IPP de Table_atalante.

    En tous cas ton aide est très sympa de ta part et particulièrement enrichissant sur le plan intellectuel. Je ne saurai comment te remercier.

    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
    Private Sub RefreshQuery()
    Dim SQL As String
    Dim SQLWhere As String
    Dim SQLCompteTout As String, SQLCompteWhere As String
    Dim lgCompteTout As Long, lgCompteWhere As String
    Dim db As DAO.Database, rs As DAO.Recordset
     
    SQL = "SELECT PATNUM, SIPNOM,SIPPREN, PATNAISD, NUMARCH, NUM_DOS_ATA" & vbCrLf
    SQL = SQL & "FROM KALAM01_HVIPAT LEFT OUTER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.IPP" & vbCrLf
    SQL = SQL & "Where KALAM01_HVIPAT.PATNUM <> 0 "
     
    SQLCompteTout = "SELECT Count(*) FROM KALAM01_HVIPAT LEFT OUTER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.[N°IPP]"
     
    If Not Me.chkNumArchHex Then
        SQL = SQL & "And KALAM01_HVIPAT!NUMARCH = " & Me.txtRechNumArchHex & " "
     End If
    If Not Me.chkNom Then
        SQL = SQL & "And KALAM01_HVIPAT!SIPNOM  like '*" & Me.txtRechNom & "*' "
    End If
    If Not Me.chkprenom Then
        SQL = SQL & "And KALAM01_HVIPAT!SIPPREN like '*" & Me.txtRechPrenom & "*' "
    End If
     If Not Me.chkDateNaissance Then
        SQL = SQL & "And KALAM01_HVIPAT!PATNAISD = #" & Format(Me.txtRechDateNaissance, "dd\/mm\/yyyy") & "# "
    End If
     If Not Me.chkNumAta Then
        SQL = SQL & "And Table_atalante!NUM_DOS_ATA = " & Me.txtRechNumAta & " "
    End If
     
    SQLWhere = Trim(Right(SQL, Len(SQL) - InStr(SQL, "Where ") - Len("Where ") + 1))
     
    SQL = SQL & ";"
     
    SQLCompteWhere = SQLCompteTout & " WHERE " & SQLWhere
     
    Set db = CurrentDb()
    Set rs = db.OpenRecordset(SQLCompteTout)
    If Not rs.EOF Then lgCompteTout = rs(0)
    rs.Close
    Set rs = db.OpenRecordset(SQLCompteWhere)
    If Not rs.EOF Then lgCompteWhere = rs(0)
    rs.Close
     
    Me.lblStats.Caption = lgCompteWhere & " / " & lgCompteTout
    Me.lstResults.RowSource = SQL
    Me.lstResults.Requery
     
    End Sub

  8. #8
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,
    comme message VB "trop peu de paramètres; 1 attendu"
    Cette erreur se produit quand un nom de champ n'est pas reconnu.
    Le moteur de base de données l'interprète comme étant paramètre.

    Pour avancer dans le débogage, je te propose ...
    - de mettre en commentaire le code concernant le compte d'enregistrements.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ' Set db = CurrentDb()
    ' Set rs = db.OpenRecordset(SQLCompteTout)
    ' If Not rs.EOF Then lgCompteTout = rs(0)
    ' rs.Close
    ' Set rs = db.OpenRecordset(SQLCompteWhere)
    ' If Not rs.EOF Then lgCompteWhere = rs(0)
    ' rs.Close
    ' 
    ' Me.lblStats.Caption = lgCompteWhere & " / " & lgCompteTout
    - de tester les critères indépendamment, un par un.
    • Tester uniquement avec le critère saisi dans txtRechNumArchHex
    • Tester uniquement avec le critère saisi dans txtRechNom
    • Tester uniquement avec le critère saisi dans txtRechPrenom
    • .... etc

    S'il y une erreur de syntaxe SQL cela se traduit, en principe, par une liste de résultats vide.
    Ça ne veut pas dire que si la liste est vide il y a une erreur.
    Donc, tester avec des critères dont on est est sûr qu'ils produiront des lignes de résultat.
    Pour tester le SQL en cas de suspicion d'erreur :
    Après la ligne ...
    ajouter une ligne
    Aller dans la fenêtre d'exécution de l'éditeur VB (Ctrl + G depuis l'éditeur VB).
    Copier le SQL (Ctrl + C) (Trois ligne, normalement, SELECT ... FROM ... WHERE ...).
    Dans Acces, créer une nouvelle requête.
    Fermer la boîte de dialogue d'ajout de tables à la requête.
    Passer en mode d'affichage SQL.
    Supprimer SELECT ; et coller le contenu du presse papier.
    Passer en mode d'affichage feuille de données.
    S'il y a une erreur, Acces l'affiche.

    Si tu as des erreurs SQL, poste l'erreur et le SQL venant de la fenêtre d'exécution.

    A+

    Ajout:
    Je viens de voir dans ton dernier code que le champ de table Table_atalante utilisé dans la liaison est IPP dans la variable SQL
    et [N°IPP] dans la variable SQLCompteTout.
    Il y en a un des deux qui doit être mauvais.

  9. #9
    Membre averti
    Homme Profil pro
    Médecin responsable département information médicale
    Inscrit en
    Décembre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Médecin responsable département information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 30
    Par défaut Resultat recherche erreur
    Bonjour,

    Voici le résutat de la manip:

    Code testé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SQL = "SELECT PATNUM, SIPNOM,SIPPREN, PATNAISD, NUMARCH, NUM_DOS_ATA" & vbCrLf
    SQL = SQL & "FROM KALAM01_HVIPAT LEFT OUTER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.[N°IPP]" & vbCrLf
    SQL = SQL & "Where KALAM01_HVIPAT.PATNUM <> 0 "
    Le résultat: " Instruction SQL non valide: DELETE, INSERT,PROCEDURE,SELECT ou UPDATE attendus"

    Pour le N° IPP je m'ensuis rendu compte juste après mon dernier envoi et je l'avais corrigé ( le bon : [N° IPP]

    Avec mes remerciements

  10. #10
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    Ça ne me paraît pas possible que tu ai une telle erreur avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SQL = "SELECT PATNUM, SIPNOM,SIPPREN, PATNAISD, NUMARCH, NUM_DOS_ATA" & vbCrLf
    SQL = SQL & "FROM KALAM01_HVIPAT LEFT OUTER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.[N°IPP]" & vbCrLf
    SQL = SQL & "Where KALAM01_HVIPAT.PATNUM <> 0 "
    En effet, le code SQL commence bien par SELECT.
    Le code SQL se trouvant dans la variable SQL est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT PATNUM, SIPNOM,SIPPREN, PATNAISD, NUMARCH, NUM_DOS_ATA
    FROM KALAM01_HVIPAT LEFT OUTER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.[N°IPP]
    Where KALAM01_HVIPAT.PATNUM <> 0
    C'est ça que le Debug.Print SQL a du mettre dans la fenêtre d'exécution.

    On est bien d'accord que pour déboguer, on copie le code SQL que l'on trouve dans la fenêtre d'exécution,
    puis on le colle dans une nouvelle requête vierge.
    On ne copie pas le code VBA pour le coller dans une requête. Ce sont deux languages distincts.

    A+

  11. #11
    Membre averti
    Homme Profil pro
    Médecin responsable département information médicale
    Inscrit en
    Décembre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Médecin responsable département information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 30
    Par défaut Resultat recherche erreur
    Je te joins une copie d'écran pour être sûre de ma manip

    A+
    Images attachées Images attachées  

  12. #12
    Membre averti
    Homme Profil pro
    Médecin responsable département information médicale
    Inscrit en
    Décembre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Médecin responsable département information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 30
    Par défaut Recherche erreur code sql
    Je crois que j'ai trouvé d'où venait mon erreur, j'ai enlevé le SQL de la première ligne

    Voici les copies d'écran du résultat, avec code erreur VB, puis après avoir cliqué sur OK

    A+
    Images attachées Images attachées   

  13. #13
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    C'est exactement ce que je te disais de ne pas faire.

    Voir Débogage des requêtes écrites en VBA.
    Images attachées Images attachées  

  14. #14
    Membre averti
    Homme Profil pro
    Médecin responsable département information médicale
    Inscrit en
    Décembre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Médecin responsable département information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 30
    Par défaut
    Excuses moi j'ai m.....

    J'avais déjà vu le site que tu me suggères mais je n'avais pas tout compris de son fonctionnement.

    Je tejoins une capture de ce que j'espère la bonne version de la requete.
    A+
    Images attachées Images attachées  

  15. #15
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Il traine un caractère, qui n'a rien à faire là, à la fin après le zéro.
    Je ne suis pas certain mais on dirait un "
    A+

  16. #16
    Membre averti
    Homme Profil pro
    Médecin responsable département information médicale
    Inscrit en
    Décembre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Médecin responsable département information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 30
    Par défaut Problème erreur SQL
    Bonjour,

    Effectivement il s'agit bien de " ; mais il refuse obstinément que je l'enlève, mettant la ligne de code en rouge.

    Je vais essayer un système plus simple, c'est de t'envoyer mon fichier, bien sûr très simplifié; que quelques lignes de données totalement anomymisées.

    Merci pour ton aide
    Fichiers attachés Fichiers attachés

  17. #17
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    Le champ PATNUM n'est pas numérique, donc cette clause SQL est invalide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where KALAM01_HVIPAT.PATNUM <> 0
    Pour du texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where KALAM01_HVIPAT.PATNUM <> ''
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Where KALAM01_HVIPAT.PATNUM Is Not Null
    Le nom de champ N° IPP (avec espace entre ° et I) n'est pas correct partout.
    Bonne version pour la variable SQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SQL = "SELECT PATNUM, SIPNOM,SIPPREN, PATNAISD, NUMARCH, NUM_DOS_ATA" & vbCrLf
    SQL = SQL & "FROM KALAM01_HVIPAT LEFT OUTER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.[N° IPP]" & vbCrLf
    SQL = SQL & "Where KALAM01_HVIPAT.PATNUM <>'' "
    Bonne version pour la variable SQLCompteTout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLCompteTout = "SELECT Count(*) FROM KALAM01_HVIPAT LEFT OUTER JOIN Table_atalante ON KALAM01_HVIPAT.PATNUM = Table_atalante.[N° IPP]"
    La propriété Contenu du contrôle lstResults n'est pas bonne.
    Le plus simple est de la supprimer, puisque de toute façon le code définit cette propriété,
    au chargement du formulaire dans Form_Load().

    La logique (Visible True/False) des cases à cocher chkNumArchHex et chkNom a été inversée,
    ce qui a une incidence sur le code de RefreshQuery().
    Remettre comme c'était à l'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub chkNumArchHex_Click()
     
    If Me.chkNumArchHex Then
        Me.txtRechNumArchHex.Visible = False
    Else
        Me.txtRechNumArchHex.Visible = True
    End If
     
    RefreshQuery
     
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub chkNom_Click()
     
    If Me.chkNom Then
        Me.txtRechNom.Visible = False
    Else
        Me.txtRechNom.Visible = True
    End If
     
    RefreshQuery
     
    End Sub

    Concernant le champ de type date, le code plante la première fois qu'on décoche "Date de naisssance"
    parce que le contrôle txtRechDateNaissance est vide.
    Pour palier à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Not Me.chkDateNaissance Then
       If IsDate(Me.txtRechDateNaissance) Then
          SQL = SQL & "And KALAM01_HVIPAT!PATNAISD = #" & Format(Me.txtRechDateNaissance, "dd\/mm\/yyyy") & "# "
       End If
    End If
    Même problème avec "Numéro Archive".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Not Me.chkNumArchHex Then
       If Len(Nz(Me.txtRechNumArchHex, "")) > 0 Then
          SQL = SQL & "And KALAM01_HVIPAT!NUMARCH =" & Me.txtRechNumArchHex & " "
       End If
    End If
    Qui plus est la zone de texte a été renommée de txtNumArchHex en txtRechNumArchHex
    mais il n'y a pas de gestion d'événement "Avant MAJ" pour exécuter RefreshQuery().

    Même chose que "Numéro Archive" pour "Numéro Atalante".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If Not Me.chkNumAta Then
        If Len(Nz(Me.txtRechNumAta, "")) > 0 Then
           SQL = SQL & "And Table_atalante!NUM_DOS_ATA = " & Me.txtRechNumAta & " "
        End If
    End If
    Ensuite, ça fonctionne

    Version avec corrections : test-archive.2.zip

    A+

  18. #18
    Membre averti
    Homme Profil pro
    Médecin responsable département information médicale
    Inscrit en
    Décembre 2011
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Médecin responsable département information médicale
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 30
    Par défaut Remerciements
    Bonjour,

    Je tiens à te remercier pour ton aide qui m'a été précieuse, patiente et surtout pédagogique.

    Je te souhaite de bonnes fêtes à toi et toute ta famille.

    UN GRAND MERCI

  19. #19
    Expert confirmé
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Par défaut
    Bonjour,

    Il n'y a pas de quoi.
    Je te souhaite aussi de bonnes fêtes de fin d'année.

    Merci de clore la discussion avec le bouton (voir ici ou ici).

    A+

Discussions similaires

  1. Problème code SQL
    Par delgicoule dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 15/11/2013, 10h25
  2. Problème Génération code SQL
    Par tigzirt dans le forum Webi
    Réponses: 6
    Dernier message: 10/08/2012, 17h41
  3. Problème Code SQL Server
    Par nadeson dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 09/05/2012, 08h32
  4. Problème de requête (code SQL)
    Par Franck_P dans le forum Débuter
    Réponses: 1
    Dernier message: 11/05/2011, 17h47
  5. [2K8] Problème connexion sql dans "code intégré"
    Par dirakocha dans le forum SSRS
    Réponses: 0
    Dernier message: 30/07/2009, 11h17

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