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 :

Forcer le type dans une requête SQL en ADODB [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Points : 127
    Points
    127
    Par défaut Forcer le type dans une requête SQL en ADODB
    Bonjour,

    j'ai 3 fichiers :
    • Un fichier de calcul (fichier principal)
    • Deux fichiers de données (qui constituent ma base, même si en vérité j'en ai des centaines) : DataFile1, DataFile2


    L'organisation des deux fichiers de données est strictement identique de façon à ce qu'une même requête écrite dans le fichier de calcul puisse aller chercher les données indifféremment dans l'un ou l'autre fichier juste en changeant le datasource du RecordSet.

    Seulement, selon le fichier, les données contenues dans les 8 premières lignes peuvent varier ce qui peut poser des problèmes puisque par défaut ADODB utilise les 8 premières lignes pour déterminer le type des données.

    Voici un exemple.
    Supposons que le DataFile1 soit organisé comme suit (8 premières lignes uniquement) :
    Var1 Var2
    20040512 #N/A N/A
    20040810 #N/A N/A
    20041109 #N/A N/A
    20050428 1,8133
    20050510 1,9733
    20050819 2,1233
    20051109 0
    20060406 2,4667
    Et que le fichier DataFile2 soit organisé comme suit (8 premières lignes uniquement) :
    Var1 Var2
    #N/A N/A 0,206
    #N/A N/A 0,1993
    #N/A N/A 0,1793
    #N/A N/A 0,1583
    #N/A N/A 0,1449
    0 0,1392
    #N/A N/A 0,1445
    #N/A N/A 0,1506

    Si je fais un :

    SELECT * FROM Base
    (NB : chaque fichier a une plage nommée Base qui contient les 8 premières lignes ci-dessus)
    avec un RecordSet dont le DataSource est le DataFile1, alors la Var1 sera numérique (car c'est le type majoritaire sur les 8 premières lignes).

    Si j'exécute la même requête avec un RecordSet dont le DataSource est le DataFile2, alors la Var1 sera alphanumérique.

    Problème : dans ma requête, je souhaite mettre un WHERE et selon la nature des données (numérique/alphanumérique), la façon d'écrire la condition n'est pas la même.

    Ma question est : Peut-on forcer le type (numérique/alphanumérique) d'une variable lorsqu'on fait une requête SQL en ADODB ?

    Je vous remercie

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 153
    Points : 215
    Points
    215
    Par défaut
    Bonjour,

    Normalement, il y a une fonctionnalité pour forcer le pilote ADODB à forcer le scan de l'ensemble des données, et pas juste les 8 premières lignes. Malheureusement, cette fonctionnalité est buggée sur excel.

    Pour forcer l'import en alpha numérique, tu peux utiliser l'option IMEX = 1 dans ta chaîne de connection.
    dans ta connection string (tu devrais avoir un truc qui ressemble à ça, sauf que là c'est OLEDB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";

    NB: Ca s'applique à l'ensemble des champs. Si tu as des champs numérique, je te conseille de les convertir après extraction.

    CF aussi
    http://support.microsoft.com/kb/257819/fr

    Cordialement,

    Poulpe

  3. #3
    Invité
    Invité(e)
    Par défaut bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT IIf(IsDate([Champ1]) And InStr([Champ1],'/')<>0,Format([Champ1],'yyyy-mm-dd'),IIf(IsNumeric([Champ1]),Format([Champ1],'0.000000'),[Champ1])) AS Expr1
    FROM
    Citation Envoyé par Mr Poulpe
    NB: Ca s'applique à l'ensemble des champs. Si tu as des champs numérique, je te conseille de les convertir après extraction.
    pourquoi veux tu reformater les données après importation?

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2013
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 153
    Points : 215
    Points
    215
    Par défaut
    Parce que dans ma solution, l'ensemble des champs est converti en texte. S'il y a des calculs à faire ensuite, il faut donc reconvertir les données en numérique.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ok mais si tu regarde ma solution la conversion se fait dans la requête à la volé! c'est toujours gainant de parcourir le tableau Excel pour caler le format alors qu'il est possible de le faire dans la requête!
    Dernière modification par AlainTech ; 27/07/2014 à 00h59. Motif: Suppression de la citation inutile

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 173
    Points : 127
    Points
    127
    Par défaut
    Merci à tous les deux, je progresse dans ce que je souhaite faire.

    J'avais bien pensé à la conversion après l'extraction, mais je me disais bien qu'il y avait quelque chose de plus propre (et certainement meilleur d'un point de vue temps de calcul, or ça peut être un paramètre qui a son importance pour ce que je cherche à faire).

    Je suis parti sur la solution proposée par RDurupt. Tout fonctionne très bien dès lors que je n'utilise pas de WHERE. En revanche, j'ai encore quelques questions sur la rédaction du WHERE (car c'est bien pour pouvoir écrire une telle condition que je fais tout ça). J'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        'Requête
        monRecordSet.Open "SELECT Cstr([Var1]) AS Expr1, Cstr(Var2) AS Expr2 FROM [Base] WHERE NOT(Var1 IS NULL) AND NOT(Cstr(Var1)='#N/A N/A') AND NOT(Var2='#N/A N/A')", , adOpenStatic, adLockOptimistic
     
        Dim tableau() As Variant
        tableau = monRecordSet.GetRows()
    Qui est une adaptation de ce que tu as proposé RDurupt (j'utiliserai certainement le format date au final, mais en attendant de résoudre le problème du WHERE, je reste sur du String pour éviter une éventuelle interférence des problèmes).

    Problème : lorsque j'essaye de mettre le contenu dans un tableau avec l'instruction GetRows, j'ai une erreur Utilisation incorrecte de Null.

    Si je rajoute :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        While monRecordSet.EOF = False
            monRecordSet.MoveNext
        Wend
    juste après la requête SQL, je peux voir (dans la fenêtre variables locales monRecordSet/Fields/Item/Value) que mon RecordSet a bien les 32 enregistrements que je souhaite (la propriété Fields.Count = 32 dans la fenêtre variables locales), seulement quand j'arrive au dernier enregistrement, le code rentre dans le while et mets à nouveau Utilisation incorrecte de Null à la ligne suivante.

    Autre question annexe : est-ce qu'on peut utiliser Expr1 et Expr2 dans le WHERE, ça semblerait logique, mais j'ai pas l'impression que ça fonctionne.

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

Discussions similaires

  1. [MySQL] Erreur dans une requête sql
    Par Goundy dans le forum PHP & Base de données
    Réponses: 37
    Dernier message: 30/01/2006, 16h08
  2. [SQL] Récupérer des variables de formulaire dans une requête SQL
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/11/2005, 18h44
  3. Plusieurs jointures dans une requête sql
    Par Pero dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/09/2005, 20h59
  4. Nom de champ variable dans une requête SQL
    Par stip dans le forum ASP
    Réponses: 2
    Dernier message: 30/09/2004, 18h02
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38

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