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 ADO: Clause Where sur Open recordset


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut problème ADO: Clause Where sur Open recordset
    Bonjour à tous,
    j'utilise depuis un bon moment le code suivant pour récupérer des données du serveur central via excel.

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    Public Sub ReadFileI5Full(ByVal Input_File As String, ByVal Target_worksheet As String, ByVal Target_range As String)
    'ReadFileI5Full : get I5 data from Lib.file(member) and insert that in Worksheet at désired range cell
    'usage : ReadFileI5Full (File, Worksheet, Range)
    ' Input_File : can be either Lib.file
    '                    or Lib.File(member)
    ' Target_Worksheet : Must be a valid Worksheet Name : if exists : cleared before fullfillment
    '                                              if not exists : will be created
    ' Target_Range     : Must be a valid cell name : Example "A1"
    
        On Error GoTo ErrorHandler
     
        Dim cn          As New ADODB.Connection
        Dim rs          As New ADODB.Recordset
        Dim sConn       As String
        Dim SqlString   As String
        Dim FileName    As String
        Dim DSN_Name As String
        Dim ws          As String 'Results Storing Worksheet name
        Dim Rg          As String 'results Cells top left
        Dim cellule     As Range
        Dim CompA       As Integer
        Dim idx         As Long
        Dim sheet_found As Boolean
        Dim ActShName   As String
        
    
            
            
     
        sConn = "provider=IBMDA400;Data source=xxx.xxx.xxx.xxx;USER ID=TAGA;PASSWORD=DADA"
        FileName = Trim(Input_File)
        ws = Trim(Target_worksheet)
        Rg = Trim(Target_range)
            
        'check target Worsksheet exists and if not build
        sheet_found = False
        For idx = 1 To Sheets.Count
            If Sheets(idx).Name = ws Then
                Application.DisplayAlerts = False
                Sheets(idx).Cells.Clear
                Application.DisplayAlerts = True
                sheet_found = True
                Exit For
            End If
        Next idx
        'Build Ws
        If Not sheet_found Then
            ActShName = ActiveSheet.Name
            Sheets.Add
            ActiveSheet.Name = ws
            Sheets(ActShName).Activate
        End If
     
        'Open Connection
        cn.ConnectionString = sConn
        cn.Open
        SqlString = "SELECT * FROM " & FileName & ""
        
        'open record Set
        rs.Open SqlString, cn
        
        
        
        'Paste Fields names in line 1
        Set cellule = Worksheets(ws).Range(Rg)
        For CompA = 0 To rs.Fields.Count - 1
            cellule.Offset(0, CompA).Value = rs.Fields(CompA).Name
        Next CompA
        'Paste results line above names
        Worksheets(ws).Range(Rg).Offset(1, 0).CopyFromRecordset rs
    
        rs.Close
        cn.Close
        Set cn = Nothing
        Set rs = Nothing
     
        Exit Sub
    ErrorHandler:
        ' clean up
        If Not cn Is Nothing Then
            If cn.State = adstateopen Then cn.Close
        End If
        Set cn = Nothing
        If Not rs Is Nothing Then
            If rs.State = adstateopen Then rs.Close
        End If
        If Err <> 0 Then
          MsgBox Err.Source & "-->" & Err.Description, , "Error"
        End If
     
    End Sub
    ce code fonctionne parfaitement bien sauf qu'il lui manque une clause Where dont j'ai impérativement besoin (avec plusieurs conditions).

    Je n'ai pas pu trouver de doc ADO pour m'aider pour ce WHERE et j'ai fait tout un tas d'essais dont aucun ne fonctionne : le résultat de mon code est toujours l'ensemble des records du fichier source.

    Si quelqu'un peut me donner un exemple qui fonctionne d'une méthode OPEN du recordset avec une clause WHERE (idéallement plusieurs conditions) cela me serait très utile.

    Pour info, voici un exemple de la clause SELECT que je voudrais mettre en place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE FCOL.CONCL=17495
    Le fichier source est TRANSFERT.FCOL(FCOL)
    La colonne à filtrer dans mon test est CONCL qui est numérique.

    J'ai essayé tout un tas de syntaxe sans jamais aucun succès.

    Merci d'avance.

  2. #2
    Membre éclairé Avatar de Basicnav
    Profil pro
    Inscrit en
    Février 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2008
    Messages : 245
    Par défaut
    Ben il me semble que ta valeur 17495 doir être encadrée de '

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE FCOL.CONCL='17495'

  3. #3
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Citation Envoyé par Basicnav Voir le message
    Ben il me semble que ta valeur 17495 doir être encadrée de '

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE FCOL.CONCL='17495'
    Bonjour Basicnav et merci pour ta réponse.

    Cela ne semble pas être le problème car j'avais déjà testé cela.

    C'est étrange car la clause WHERE semble bien être analysée car si je spécifie une autre source de donnée je reçois une erreur ADO qui indique que l'élément ne se trouve pas dans le recodset.

    Je pense avoir essayé toutes les syntaxes suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE FCOL.CONCL='17495'
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE CONCL='17495'
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE FCOL.CONCL=17495
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE CONCL=17495
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE 'FCOL.CONCL'=17495
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE 'CONCL'=17495'
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE FCOL.CONCL='17495'
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE 'FCOL.CONCL=17495'
    SELECT * FROM TRANSFERT.FCOL(FCOL) WHERE 'CONCL=17495'


    Edit--------
    J'ai regardé dans ce tuto mais je ne trouve rien sur WHERE.

  4. #4
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    bonjour,
    peut être un workaround..

    cela fonctionne sans clause where?

    alors pourquoi ne pas récuperer le recordset sans clause where et ensuite lui appliquer un filtre?

    ça devrait pouvoir le faire non?

  5. #5
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Citation Envoyé par mayekeul Voir le message
    bonjour,
    peut être un workaround..

    cela fonctionne sans clause where?

    alors pourquoi ne pas récuperer le recordset sans clause where et ensuite lui appliquer un filtre?

    ça devrait pouvoir le faire non?
    Salut Mayekeul,
    excellente idée qui est en fait mon choix de secours, mais bon, je trouve cette option un peu une réinvention de la roue car diantre, pourquoi se farcir un filtre (élaboré à mon avis) alors que la clause WHERE est faire pour.

    Pour le workaround, je ne sais pas de quoi tu parles.

    Edit------------
    Pour le nom des zones, je n'ai pas de problèmes car dans mon codes tu peux voir que je récupére ces noms et que je les injecte en ligne 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        'Paste Fields names in line 1
        Set cellule = Worksheets(Ws_tmp).Range(Rg)
        For CompA = 0 To rs.Fields.Count - 1
            cellule.Offset(0, CompA).Value = rs.Fields(CompA).Name
        Next CompA
    CVe qui m'étonne c'est que quelle que soit la syntaxe, je n'ai jamais d'erreur ADO.

    Je vais essayer en remplaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TRANSFERT.FCOL (FCOL) WHERE CONCL='17495'
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TRANSFERT.FCOL (FCOL) WHERE CONCL = '17495'
    On se sait jamais.

  6. #6
    Membre éclairé Avatar de Basicnav
    Profil pro
    Inscrit en
    Février 2008
    Messages
    245
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2008
    Messages : 245
    Par défaut
    Bonjour,

    j'ai cherché un peu deci delà et il est clair qu'il s'agit d'un problème de syntaxe.

    Regarde ce post, sans pour autant te donner la réponse il te mettra sur la voie :

    http://www.developpez.net/forums/d22...utilisant-ado/

    Le réponse en cherchant dans se sens avec les [] donne pas mal d'indice sur le net...

    Je continue mes recherches, tiens nous au courant si tu as la réponse

  7. #7
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    a noter que le mode pas à pas te permettrais de vérifier les noms de champs dans le recordset. et par la même t'aider à revoir ta clause where.

  8. #8
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Citation Envoyé par Basicnav Voir le message
    Bonjour,

    j'ai cherché un peu deci delà et il est clair qu'il s'agit d'un problème de syntaxe.

    Regarde ce post, sans pour autant te donner la réponse il te mettra sur la voie :

    http://www.developpez.net/forums/d22...utilisant-ado/

    Le réponse en cherchant dans se sens avec les [] donne pas mal d'indice sur le net...

    Je continue mes recherches, tiens nous au courant si tu as la réponse
    Bon tuyau ce post merci, surtout que moi aussi je fonctionne depuis 1 AS400, mais dans mon cas pas de premier record avec les noms de zones, pas de ligne blanche, format AS400 tout à fait standard.
    La zone pour le Where est en packed dans le fichier AS400. Serait-ce une cause possible.

  9. #9
    Membre Expert Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Par défaut
    pourquoi se farcir un filtre (élaboré à mon avis) alors que la clause WHERE est faire pour.

    Pour le workaround, je ne sais pas de quoi tu parles.
    entièrement d'accord

    et un workaround, c'est ça justement
    prendre des chemins détourné pour rallonger la route toute droite!

Discussions similaires

  1. Réponses: 11
    Dernier message: 06/05/2011, 15h34
  2. [DTS] Problème avec clause WHERE sur Date
    Par bibou dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 28/06/2006, 12h18
  3. [SQL] clause Where sur un booléen
    Par mosquitout dans le forum Access
    Réponses: 3
    Dernier message: 21/12/2005, 21h29
  4. Clause Where sur une Date
    Par Zebulonn dans le forum Installation
    Réponses: 31
    Dernier message: 20/10/2005, 11h56
  5. [requete] Mysql problème de clause where
    Par Raideman dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/07/2005, 18h00

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