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 :

[Astuce] Chargement très rapide d'une ListBox de type "Liste de valeurs" basée sur une requête SQL Server


Sujet :

VBA Access

  1. #1
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    octobre 2003
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : octobre 2003
    Messages : 393
    Points : 347
    Points
    347
    Par défaut [Astuce] Chargement très rapide d'une ListBox de type "Liste de valeurs" basée sur une requête SQL Server
    Bonjour,

    Alors déjà pour peupler la ListBox, il y a deux approches :

    > Soit via son Rowsource par itération pour rentrer toute les valeurs
    [CODE]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set Cn1 = New ADODB.Connection
    Cn1.Open *** chaîne de connexion SQL Server ***
    Set Rs = New ADODB.Recordset
    chSQL = "SELECT  Col1, Col2, ...., Colx FROM TABLE1"
    Rs.Open chSQL, Cn1, adOpenForwardOnly, adLockReadOnly
    If Not Rs.EOF Then
     RS.Rowsource=RS.Rowsource & ";" & RS.Fields(0) & ";" & RS.Fields(1) &  .....& ";" & RS.Fields(x) & ";"
    End If
    Rs.Close
    Ne pas oublier de retirer le dernier ";" dans le Rowsource !

    > Soit via la commande .additem

    Dans les deux cas, ce traitement peut être particulièrement long s'il y a pas mal de lignes et de colonnes à traiter.

    Une astuce qui permet de booster drastiquement ce traitement consiste à déporter la pseudo itération de la première approche (celle avec Rowsource) sur le SQL Server en utilisant la clause FOR XML PATH (). Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Set Cn1 = New ADODB.Connection
    Cn1.Open *** chaîne de connexion SQL Server ***
    Set Rs = New ADODB.Recordset
    chSQL = "SELECT  STUFF((SELECT ';' + Col1 + ';' + ';' + Col2 + ';' + ....  + ';' + Colx FROM TABLE1 FOR XML PATH ('')), 1, 1, '')"
    Rs.Open chSQL, Cn1, adOpenForwardOnly, adLockReadOnly
    If Not Rs.EOF Then
        ListeBox.Rowsource= Rq1.Fields(0)
    End If
    Rs.Close
    Attention : Le Rowsource est limité à seulement 32 750 caractères (2048 dans les anciennes versions) !!!!

  2. #2
    Membre expérimenté
    Homme Profil pro
    Retraité
    Inscrit en
    juin 2019
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : juin 2019
    Messages : 879
    Points : 1 344
    Points
    1 344
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Modifiable5.RowSource = "Select * from [ODBC;Driver={SQL Server};SERVER=" & MyServeur & ";DATABASE=" & MyDATABASE & ";UID=" & MyUID & ";Pwd=" & MyPwd & "].[TableSqlServer]"
    Nom : image_2021-08-02_161925.png
Affichages : 47
Taille : 28,4 Ko

  3. #3
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    octobre 2003
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : octobre 2003
    Messages : 393
    Points : 347
    Points
    347
    Par défaut
    Effectivement, il y a cette solution .... mais elle ne convient pas dans mon cas car mon accès aux données se fait exclusivement par procédure stockée. En outre les credentials de la connexion au serveur sont codés en dur via une dll. Je crains qu'il ne soit pas possible de l'intégrer dans la chaîne de requêtage du Rowsource. Pour finir je ne suis pas sûr que cette méthode qui doit être itérative aussi bien côté réseau que du moteur de données Jet soit aussi performance que le requêe SQL Server que j'ai proposée ci-dessus.
    Mais cette solution est plus simple. Merci de l'avoir proposée.

Discussions similaires

  1. Récupérer les valeures d'une requête SQL server
    Par leratx dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/02/2011, 00h11
  2. Aide sur une requête SQL Server
    Par Morad ISSOULGHANE dans le forum Développement
    Réponses: 4
    Dernier message: 30/09/2009, 11h58
  3. probléme dans une requête sql server
    Par red_one dans le forum Langage SQL
    Réponses: 1
    Dernier message: 02/06/2009, 09h15
  4. Réponses: 1
    Dernier message: 05/11/2008, 12h04
  5. Aidez moi pour une requête SQL server
    Par pop10 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 19/06/2007, 22h15

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