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.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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+

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