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 :

Exécuter une requête SQL à partir d'une feuille Excel [XL-2016]


Sujet :

Macros et VBA Excel

  1. #21
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    je suis en train de parcourir des forum sur la création de vue en sql server et honnêtement je ne vois pas de difference entre une requête sql et une vue au niveau de l'architecture

  2. #22
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    je m'aperçois en parcouru les forums sur les vues que j'ai oublié de préciser une chose qui me semble importante sur mes requêtes sql.
    Elles sont toutes deux paramètres de temps (datetime) debut et fin avec le format jj/mm/aaaa hh:mm
    Est ce que dans ce cas précis, cela change quelque chose dans la création de vue?

  3. #23
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Voilà une requête parramtré
    Select * from table WHERE debut=@debut And fin=@fin

  4. #24
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour Thumb
    je sais créer une requêe sql paramétrée
    Ma question est : peut on créer "une vue" dont la requête est paramétré

  5. #25
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    bonjour,
    c'est juste de la dialectique!
    une vue ou un requête c'est la même chose sauf que dans Sql Serveur on parle de vue.
    tu peut écrire ta vue comme la requête que j'ai donné au poste précédent.

  6. #26
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    ok merci pour l'info Thumb
    je vais tester tout de suite

  7. #27
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    me revoila
    j'ai essayé de cr&er ma vue mais cela ne fonctionne .
    J'ai un message d'erreur qui me dis que
    'CREATE VIEW' doit être la première instruction d'un traitement de requêtes.
    Voici ma requete

    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
    --Declarer les variables
    DECLARE @Type1       Int = 1  
    DECLARE @Type2        Int = 2
     
     
    DECLARE @StartDateTime DateTime = '20200916 05:00:00'
    DECLARE @EndDateTime DateTime =   '20200917 05:00:00'
     
    CREATE VIEW  teste as 
     
    SELECT
    P.Num as rang
    FROM P
    inner JOIN PE
    ON P.Id=PE.P.Id AND 
    PE.EventTypeNum IN (@TYPE1,@TYPE2) AND
    PE.[DateTime] BETWEEN @StartDateTime AND @EndDateTime

  8. #28
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    J'ai réecrit ma vue en supprimant mes variables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE VIEW  teste as 
    SELECT
    P.PhysicalChuteNum as Sortie
    FROM 
    [base donnee].dbo.P
    JOIN [base donnee].dbo.PE
    ON P.Id=PE.P.Id AND 
    PE.EventTypeNum IN (2,34) AND
    PE.[DateTime] BETWEEN 'debut' AND 'fin'
    la création de la vue s'est faite..
    c'est déjà un bon debut

    mais lorsque j'essaie d'appeler cette vue à partir d'une feuille Excel, j'ai toujours le message
    nom d'objet dbo.teste non valide

  9. #29
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Apres des recherches, j'ai résolu problème du message d'erreur
    nom d'objet dbo.teste non valide
    . C'etait un problème de connexion au serveur.
    Maintenant on me demande de déclarer les variables @debut et @fin....

  10. #30
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    bonjour,
    dans le requêteur exécute
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE FUNCTION TestTM(@Debut datetime,@Fin datetime)
    RETURNS TABLE
    AS
    RETURN 
    (SELECT
    P.PhysicalChuteNum as Sortie
    FROM 
    dbo.P
    JOIN dbo.PE
    ON P.Id=PE.P.Id AND 
    PE.EventTypeNum IN (2,34) AND
    PE.[DateTime] BETWEEN @Debut AND @Fin
    )
    ensuite exécute
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from [dbo].[TestTM]('2020-01-01','2020-01-02')

  11. #31
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour Thumb
    Effectivement, dans des forum, il parlait de la fonction CREATE FUNCTION pour la création de vue parametrée.
    Donc si j'ai bien compris :

    Etape 1
    dans le dossier VUE de sql server, j'insère le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE FUNCTION TestTM(@Debut datetime,@Fin datetime)
    Etape 2
    Sur la feuille Excel où je souhaite voir apparaitre le résultat de la vue j'insere le code
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from [dbo].[TestTM]('2020-01-01','2020-01-02')
    dans la code vba du départ ( ligne 17 cf ci-dessous)

    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
    Sub test()
     
    Dim sql As String
    Dim GenereCSTRING As String
    Dim Debut As Object
     
    Dim Fin As Object
    Dim Cm As Object 'Pour utiliser une requête parametrés il faut utiliser l'oblet Command!
    Dim cn As Object 'Pour ce connecter à un base de données Access il faut utiliser l'objet Connection!
    Dim rs As Object
     
    Dim i As Integer
     
    Sheets("feuil1").Select
     
     
    sql ="select * from [dbo].[TestTM]('2020-01-01','2020-01-02')"
     
    Set cn = CreateObject("ADODB.Connection")
    Set Cm = CreateObject("Adodb.Command")
      'MsgBox ThisWorkbook.Path
     
     GenereCSTRING = "Provider=SQLOLEDB.1;Password=TON_PASSWORD;Persist Security Info=True;User ID=tintin;Initial Catalog=NOM_DE_TA_DB;Data Source=10.20.30.40.50
     
     
     
     cn.Open GenereCSTRING 'J'ouvre ma connection.
     
     
    Cm.CommandText = sql 'je passe ma requête à mon objet command
    Cm.ActiveConnection = cn 'j'affecte ma connection à ma commande
     
    Const adDate = 7 'defini le type de parametre
     
     
    Set Debut = CreateObject("ADODB.Parameter")
    Debut.Name = "debut": Debut.Type = adDate: Debut.Value = CDate(Format(ThisWorkbook.Sheets("feuil2").Range("B97").Value, "yyyy-mm-dd hh:mm")): Cm.Parameters.Append Debut
     
    Set Fin = CreateObject("ADODB.Parameter") 'c'est avec l'objet Parameter que je vais reseigner les parmetres de ma requête Access.
    Fin.Name = "Fin": Fin.Type = adDate: Fin.Value = CDate(Format(ThisWorkbook.Sheets("Feuil2").Range("G97").Value, "yyyy-mm-dd hh:mm")): Cm.Parameters.Append Fin
     
     
     
    Set rs = Cm.Execute 'on recupere le résultat de la requête.
     
     
    With ThisWorkbook.Sheets("Feuil1")
     
     
         For i = 0 To rs.Fields.Count - 1 'On place le nom des champs sur la ligne 4 de ma feuille Excel
                   .Range("A1").Offset(0, i) = rs(i).Name
         Next
     
            .Range("A2").CopyFromRecordset rs 'la on copie le résultat de la requête!

  12. #32
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut.

    Mon grain de sel...

    J'ai écrit quatre billets, amorcés à partir de celui-ci. ils modélisent l'accès à un serveur de données, dont il suffit de renseigner la chaine de connexion.

    • Vue = Requête... de sélection non paramétrable;
    • Procédure stockée (éventuellement paramétrée) = "Vue" paramétrable et Requête Action (Insert Into, Update, Delete)...


    PS: Pour moi, ça n'a pas trop de sens de créer des fonctions, des vues ou des procédures stockées par code si on accès au serveur Source. Ces outils devraient préexister à leur utilisation par des outils tels que le vba (et on peut espérer que les DBA ont bloqué ces possibilités sur les serveurs SQL)... . Bien sûr, dans le cadre d'un fichier Access externe ou d'un sql sur lequel on n'a pas la main (chez le(s) client(s)), on pourra avoir une utilité à ces modifs, pour autant que les DBA aient permis ces modifs.


    Bon amusement
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  13. #33
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Salut.

    Mon grain de sel...
    ---
    PS: Pour moi, ça n'a pas trop de sens de créer des fonctions, des vues ou des procédures stockées par code si on accès au serveur Source. Ces outils devraient préexister à leur utilisation par des outils tels que le vba (et on peut espérer que les DBA ont bloqué ces possibilités sur les serveurs SQL)... . Bien sûr, dans le cadre d'un fichier Access externe ou d'un sql sur lequel on n'a pas la main (chez le(s) client(s)), on pourra avoir une utilité à ces modifs, pour autant que les DBA aient permis ces modifs.


    Bon amusement
    bonjour Pierre,
    tu es le bien venu!

    je ne comprends pas ce que tu veux dire! il est question de créer un fonction paramétrable dans Sql Serveur!

    le script que j'ai fourni est un exemple de fonction sql serveur et l'autre un example d’utilisation dans sql manger!

  14. #34
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Salut Thumb.

    Citation Envoyé par Thumb down Voir le message
    [...]
    tu es le bien venu![...]
    Merci



    Au départ, la demande ne concerne pas une fonction para (je suppose que tu veux dire paramétrée) mais une requête Access qui migre vers du sql server. Je pense donc que, dans ce cas de figure, il est intéressant de créer d'abord une procédure stockée paramétrée sur le serveur SQL puis de l'utiliser au travers d'une dal (Data Access Layer) qui appelle cette procédure stockée paramétrée. L'utilisation de ADODB permet de basculer assez aisément d'Access vers Sql, puisque l'objet de la passerelle ADODB est justement de s'affranchir du type de serveur (dans une certaine mesure).


    Je rappelle qu'au départ, il est question de créer une vue sql sur base d'une requête Access.

    Dans ton exemple, je ne comprends pas l'utilité de créer une fonction qui retourne une table. Un procédure stockée paramétrée retourne un jeu d'enregistrements qui correspond à "la requête" initiale existant en Access, paramètres en plus...

    Je peux imaginer qu'il peut être utile de créer, à la volée, des procédures ou fonctions stockées sur un serveur SQL, mais je pense que cet usage doit être limité, dans les utilisations courantes d'un sql server.

    Il en va bien évidemment autrement si l'on imagine la mise à jour d'un sql server distant pour une application distribuée et fonctionnant en connexion sur plusieurs SQL Server, mais je pense que ce cas de figure dépasse le cadre de VBA et de la présente discussion.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  15. #35
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    pour ce que j'ai compris, mais c'est à notre amis qu'il appartient de le confirmer, c'est lui qui à migré vers Sql Serveur.

    il voudrait , je mets le conditionnel, il voudrait une Requête paramétré, bien que ça n'existe pas, dans Sql Serveur!
    j'ai compris, à tor ou à raisons qu'il voulais ce passer d'Access!

    d'une certaine manière c'est lui le DBA, DBA en herbe je te le concède!

    il est possible à ma connaissance possible de répondre soit par un procédure stock, soit par un fonction et c'est la deuxième que j'ai choisi!

  16. #36
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    [...]
    il voudrait , je mets le conditionnel, il voudrait une Requête paramétré, bien que ça n'existe pas, dans Sql Serveur![...]
    Ben si ça existe, c'est une procédure stockée, que l'on crée côté serveur (idéalement avec le Sql Managment) et que l'on utilise comme je l'illustre dans mes billets.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  17. #37
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Ben si ça existe, c'est une procédure stockée, que l'on crée côté serveur (idéalement avec le Sql Managment) et que l'on utilise comme je l'illustre dans mes billets.
    Une procédure stockée ce n'est pas une requête parrametrée.

    Comme dit dans le poste précédent on peut créer une fonction parrametrée avec SQL Manager comme je l'ai préconisé !

    Édite:
    Code SQL MANGER : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE FUNCTION TestTM(@Debut datetime,@Fin datetime)
    RETURNS TABLE
    AS
    RETURN 
    (SELECT
    P.PhysicalChuteNum as Sortie
    FROM 
    dbo.P
    JOIN dbo.PE
    ON P.Id=PE.P.Id AND 
    PE.EventTypeNum IN (2,34) AND
    PE.[DateTime] BETWEEN @Debut AND @Fin
    )

  18. #38
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour les amis
    Je viens de prendre connaissance de la discussion de Pierre

    Pour faire simple:
    Sur un fichier Excel, j'ai deux cellules ou il y a deux dates : date Debut et date Fin (format jj/mm/aaaa hh:mm)
    Et à partir de ce fichier Excel, je souhaite exécuter une requête sql server parametrée avec une date Debut et date Fin ( ces 2 variables prennent les valeurs des deux dates du fichier Excel).
    Thumb m'aide à construire le code VBA.
    Une vue ne permet pas cela car cette dernière ne pas pas être paramétrée . C'est pourquoi on passe par une fonction paramétrée .

    Pierre, effectivement, je me suis posé la question sur la mise en place d'une procédure stockée pour réaliser ce que je souhaite faire.

    j'éspère avoir été explicite et claire

  19. #39
    Responsable
    Office & Excel


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 122
    Points : 55 921
    Points
    55 921
    Billets dans le blog
    131
    Par défaut Procédure stockée de sélection
    Je maintiens qu'une procédure stockée correspond bien à une requête paramétrée

    Voici donc un exemple d'extraction de données bornées par deux dates et récupération dans un tableau structuré Excel

    Une table SQL gérant des contacts et reprenant leur date de naissance

    Nom : 2020-09-21_094842.png
Affichages : 553
Taille : 16,3 Ko

    Nom : 2020-09-21_094904.png
Affichages : 547
Taille : 13,3 Ko

    Une procédure stockée appelée GetContacts avec deux paramètres pour borner la plage des dates de naissance
    Code sql : 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
    USE [Folders]
    GO
    /****** Object:  StoredProcedure [dbo].[GetContacts]    Script Date: 21-09-20 09:49:17 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:	<Description,,>
    -- =============================================
    CREATE PROCEDURE [dbo].[GetContacts]
    	@Date1 date,
    	@Date2 date
    AS
    BEGIN
    	SET NOCOUNT ON;
    	Select
    		FirstName,
    		LastName,
    		BirthDate
    	FROM
    		Contact with(NOLOCK) 
    	 WHERE
    		BirthDate between @Date1 and @Date2
    END

    Voici un exemple d'utilisation de la procédure stockée côté SQL

    Nom : 2020-09-21_095158.png
Affichages : 580
Taille : 29,4 Ko


    Côté Excel, on dispose d'un tableau structuré T_Contacts et de deux plages nommées DateDébut et DateFin

    Nom : 2020-09-21_095347.png
Affichages : 542
Taille : 5,9 Ko


    Le code suivant
    • vide le tableau s'il ne l'est pas;
    • se connecte au serveur SQL;
    • appelle la procédure stockée en lui passant les dates souhaitées en paramètres;
    • pousse les données dans le tableau structuré.



    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
    Function getConnectionString() As String
      getConnectionString = Range("ConnectionString").Value
    End Function
     
    Sub getContacts()
      Dim cn As ADODB.Connection
      Dim cm As ADODB.Command
      Dim rs As ADODB.Recordset
     
      Set cn = New ADODB.Connection
      If Not Range("t_Contacts").ListObject.DataBodyRange Is Nothing Then Range("t_Contacts").ListObject.DataBodyRange.Delete
      cn.Open getConnectionString
      Set cm = New ADODB.Command
      With cm
        .ActiveConnection = cn
        .CommandText = "GetContacts"
        .CommandType = adCmdStoredProc
        .Parameters.Append .CreateParameter("p1", adDate, adParamInput, 4, Range("DateDébut"))
        .Parameters.Append .CreateParameter("p2", adDate, adParamInput, 4, Range("DateFin"))
      End With
      Set rs = cm.Execute()
      Range("t_Contacts").CopyFromRecordset rs
    End Sub

    Voici le résultat dans le tableau structuré avec les dates allant du 01/01/1960 au 31/12/1970

    Nom : 2020-09-21_095909.png
Affichages : 560
Taille : 5,3 Ko


    En modifiant les dates et en relançant le code, on obtient bien les nouvelles données.

    Nom : 2020-09-21_095944.png
Affichages : 553
Taille : 5,3 Ko


    L'avantage de la procédure stockée est qu'il limite le langage SQL à la sphère du serveur et permet à un programmeur non averti en SQL d'utiliser une procédure stockée "un peu comme une fonction" sans devoir connaître le langage SQL. Il lui suffit de connaître le nom de la procédure stockée et la façon de lui passer les paramètres éventuels. Normalement, la documentation qui accompagne la procédure stockée précise cela.



    On pourrait passer le code sql en clair à la commande sql sans créer de procédure stockée, et on fonctionnerait avec +/- le même code, en modifiant le type de commande.

    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
    Sub getContacts()
      Dim cn As ADODB.Connection
      Dim cm As ADODB.Command
      Dim rs As ADODB.Recordset
     
      Set cn = New ADODB.Connection
      If Not Range("t_Contacts").ListObject.DataBodyRange Is Nothing Then Range("t_Contacts").ListObject.DataBodyRange.Delete
      cn.Open getConnectionString
      Set cm = New ADODB.Command
      With cm
        .ActiveConnection = cn
        .CommandText = "select firstname, lastname, birthdate from contact with(NOLOCK)  where birthdate between ? and ?" 
        .CommandType = adCmdText
        .Parameters.Append .CreateParameter("p1", adDate, adParamInput, 4, Range("DateDébut"))
        .Parameters.Append .CreateParameter("p2", adDate, adParamInput, 4, Range("DateFin"))
      End With
      Set rs = cm.Execute()
      Range("t_Contacts").CopyFromRecordset rs
    End Sub

    Dans les billets que j'ai cité plus tôt dans la discussion, j'illustre comment on peut rendre le code générique pour la gestion de la connexion et des interactions avec le sql serveur. Je stocke ce code dans un module nommé DAL (Data Access Layer) et je l'invoque en passant les chaines de commande et les paramètres. De cette façon, dès que j'ai un projet Excel qui doit être connecté à un SQL Server, j'importe mon module DAL et je suis prêt
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  20. #40
    Membre chevronné Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 420
    Points : 2 179
    Points
    2 179
    Par défaut
    bonjour,
    je ne me bâterais sur la définition d'une procédure stocké!

    il est possible de répondre à la problématique de Facteur soit par une procedure stocké ou par une fonction.

    la méthode choisie ne m'importe peut!

    je ne viens pas pour un combat de coq!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/12/2010, 12h42
  2. Construire une requête SQL à partir d'un fichier properties
    Par GabriHell dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 07/04/2010, 13h15
  3. Réponses: 1
    Dernier message: 07/12/2009, 09h25
  4. Récupérer une requête sql à partir d'un Form
    Par Yaponchik dans le forum VBA Access
    Réponses: 2
    Dernier message: 06/03/2008, 10h55
  5. exécuter deux requêtes SQL à partir d'un bouton de commande
    Par Platon93 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/12/2006, 17h57

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