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 :

Formulaire en continu - recordset ADOBD - Actions via l'enête de colonne - Erreur Instruction SQL non valide


Sujet :

VBA Access

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut Formulaire en continu - recordset ADOBD - Actions via l'enête de colonne - Erreur Instruction SQL non valide
    Bonjour à tous,

    J'ai un formulaire qui est alimenté par un recordset ADODB sur SQL Server

    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
    Private Sub cmdODBCStoreProc_Click()
     
        Dim sFirstName As String
        Dim iRows As Integer
     
        Call mfADODBCnxOpen
     
        Set goADODBRset = New ADODB.Recordset
     
        sFirstName = ""
        'sFirstName = """Le Nom"""
     
        With goADODBRset
            Set .ActiveConnection = goADODBCnx
            .Source = "EXEC [SalesLT].[spOrder]  " & sFirstName
            .LockType = adLockOptimistic
            .CursorType = adOpenKeyset
            .CursorLocation = adUseClient
            .Open
        End With
     
        Set Forms("frmMain").Form![ctnrFrm2].Form.Recordset = goADODBRset
     
        'goADODBRset.Close
        'Set goADODBRset = Nothing
        'Call mfADODBCnxClose
     
    End Sub
    Quand je clique sur une des actions proposées en entête de colonne, j'ai alors le message suivant
    Instruction SQL non valide : DELETE, INSERT, PROCEDURE, SELECT ou UPDATE attendus
    Nom : formColAction.png
Affichages : 199
Taille : 110,0 Ko

    Quelqu'un aurait une explication ?
    .

  2. #2
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 047
    Points : 24 632
    Points
    24 632
    Par défaut
    Bonjour,

    Tu fais un Exec (procédure stockée) que tu affecte à un recordset puis tu souhaites faire les manipulations d'un Select (Order by).

    C'est couillu comme approche.

    Je ne sais pas ce qu'il y a derrière cette procédure mais pour avoir un fonctionnement standard ta source Ado devrait être un Select ou un objet "SQL Direct" éventuellement qu'Access pourra manipuler.

    Cordialement,

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    Bonjour loufab,

    La proc. stock est une requête SELECT. Le truc serait de comprendre ce que font les actions associées à l'entête de colone.

    Penses-tu que ces événements peuvent être interceptés ?

  4. #4
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 047
    Points : 24 632
    Points
    24 632
    Par défaut
    Le composant Feuille de données est une boite noire, on y maitrise que peu d'éléments et quelques événements comme "Sur entrée" ou "Sur Sortie".

    Il faudrait utiliser un formulaire en mode continu pour pouvoir maitriser plus d'évènement mais cela impliquerait de créer un menu contextuel avec les options Tri/Filtre et toutes la mécanique associée.

    L'autre solution plus simple et d'utiliser une requête "PassThrough", le comportement est similaire, elle s'exécute côté serveur, son SQL doit être celui du moteur de base de données utilisé (Sql Server dans ton cas) mais son contenu est en lecture seule.

    Que fait le composant quand on utilise le tri/filtre sur colonne ?
    Comme c'est une boite noire et qu'il y a peu/pas de communication dessus, on peut penser qu'il reprend le texte sql de la source et le soumet au clause Order by et Where.

    A noter qu'en Ado un procédure stockée est un objet Command.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim cmd As New ADODB.Command
    ...
    cmd.CommandType = adCmdStoredProc
    cmd.CommandText = "maproc"
    ...
    Set rs = cmd.Execute
    https://social.msdn.microsoft.com/Fo...orum=accessdev

    En espérant t'avoir éclairer. J'avoue éviter les composants trop fermés.

    Cordialement,

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    Merci encore loufab pour ton aide et tes conseils

    Je vais donc implémenter des requêtes PassThrough

    J'ai une question sur l'objet ADODB.Command

    J'ai essayé de lancer une proc.stock SQLSERVER avec l'objetADODB. Command mais cela gênerait une erreur qui a disparu avec juste l'instanciation de l'objet Records et voir ici solution a mon post chargement sous-formulaire-recordset adodb appel pro. -stock-sqlServer-erreur 430 & 7965/

    Aurais tu une idée pourquoi avec l'objet ADODB.Command ça plantait alors que si je passe directement par l'objetADODB.Recordset ça fonctionnait ?

  6. #6
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 047
    Points : 24 632
    Points
    24 632
    Par défaut
    Bonjour,

    N'ayant qu'une vision parcellaire de ton projet je dirais que l'objet était peut être mal instancié (mal typé).

    Cordialement,

  7. #7
    Membre émérite Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 484
    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 484
    Points : 2 265
    Points
    2 265
    Par défaut
    Bonjour,
    tu peux directement créer une requête dans Access que tu fournis comme data source à ton formulaire!
    Code MyRequête : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from ( [ODBC;Driver={SQL Server};SERVER=MyServeur;DATABASE=MyDATABASE;UID=MyUID;Pwd=MyPwd].EXEC MyProc)

    Nom : Sans titre.png
Affichages : 169
Taille : 98,4 Ko

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    Bonjour Thumb down

    Je te remercie pour ton aide mais ne vois pas comment ça résout le problème d'erreur quand je clique sur les opérations proposés sur les colonnes
    • Tri A-Z
    • Tri Z-A
    • Filtre Texte

  9. #9
    Membre émérite Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 484
    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 484
    Points : 2 265
    Points
    2 265
    Par défaut
    Bonjour,
    Je ne sais pas comment ça résout ton problème non plus.

    Et pourtant un formulaire Access qui ce respecte fonction avec un requête en natif et. Ça fonctionne !

    Moi je te propose de fournir une requête Access à ton formulaire et pas un recordset !

    Vous avez dit bizarre ?

    Dans la source de données de ton formulaire tu tapes la requête qu je t'ai fourni en donnant les informations de connexion que tu utilises dans adodb serveur, base de données,user, password !

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    [QUOTE=Thumb down;11904445]Bonjour,
    tu peux directement créer une requête dans Access que tu fournis comme data source à ton formulaire!
    Code MyRequête : Sélectionner tout - Visualiser dans une fenêtre à part
    Select * from ( [ODBC;Driver={SQL Server};SERVER=MyServeur;DATABASE=MyDATABASE;UID=MyUID;Pwd=MyPwd].EXEC MyProc)


    Bonjour Thumb down

    J'ai affecté une requête au format que tu me proposais mais à l'exécution j'ai maintenant l'erreur 3135 Erreur Join

    Nom : Error3135Join.png
Affichages : 137
Taille : 97,8 Ko

    Une idée de la cause de cette erreur ?

  11. #11
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 047
    Points : 24 632
    Points
    24 632
    Par défaut
    On peut voir ce qu'il y a dans cette procédure ?

  12. #12
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    Citation Envoyé par loufab Voir le message
    On peut voir ce qu'il y a dans cette procédure ?

    Bonjour loufab

    Le code de la procédure affecte la requête sSQL au Recordsource de la forme du conteneur ctnrOrder

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    sSQL  = "Select * from " & _
               " ([ODBC;Driver={SQL Server};SERVER=LAPTOP-VT8IOB4\PLPSQLEXPRESS;DATABASE=AdventureWorksLT2019;Trusted_connection=Yes].EXEC "  & _
               " [SalesLT].[spOrder] )"
     
    Forms("frmMain").Form.Controls ("ctnrOrder").Form.Recordsource = sSQL

  13. #13
    Membre émérite Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 484
    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 484
    Points : 2 265
    Points
    2 265
    Par défaut
    Bonjour,
    En fait je pense que loufab parlait de la procédure stockée !

    J'ai désinstallé SQL serveur par ce qu'il consommait trop d'espace disque, je n'ai pas encore pris le temps de me faire une config pour faire des tests. Mais il est vrai que si tu as la possibilité de fournir même une synthèse de ta procédures stockées ce serait cool?

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    Bonjour Thumb down

    Voici le script de création de la proc. stock et le résultat à son appel dans SQL Server Management Studio sans et avec paramètre.

    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
    USE [AdventureWorksLT2019]
    GO
    /****** Object:  StoredProcedure [SalesLT].[spOrder]    Script Date: 03/01/2023 19:05:32 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    -- =============================================
    CREATE PROCEDURE [SalesLT].[spOrder]
    	-- Add the parameters for the stored procedure here
    	@pFirstName NVARCHAR(MAX) = NULL
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
        -- Insert statements for procedure here
    	--SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
     
    	IF OBJECT_ID('tempdb.dbo.##tCustomerTop', 'U') IS NOT NULL 
    	DROP TABLE ##tCustomerTop
     
     
    	SELECT TOP (100) *
    	INTO ##tCustomerTop
    	FROM SalesLT.Customer
    	WHERE ( @pFirstName  is null or FirstName = @pFirstName)
     
    	CREATE CLUSTERED INDEX idx_t ON ##tCustomerTop ([CustomerID])		
     
    	SELECT * FROM ##tCustomerTop
     
    	DROP TABLE ##tCustomerTop
     
    	/*SELECT SalesLT.Customer.CustomerID
    		, SalesLT.Customer.FirstName 
    		, SalesLT.Customer.MiddleName 
    		, SalesLT.Customer.LastName 
    		, SalesLT.CustomerAddress.*
    		, SalesLT.SalesOrderHeader.*
    		, SalesLT.SalesOrderDetail.*
    		, SalesLT.Product.*
    	FROM SalesLT.Customer 
    		INNER JOIN SalesLT.CustomerAddress ON SalesLT.Customer.CustomerID = SalesLT.CustomerAddress.CustomerID
    		INNER JOIN SalesLT.SalesOrderHeader ON SalesLT.Customer.CustomerID = SalesLT.SalesOrderHeader.CustomerID
    		INNER JOIN SalesLT.SalesOrderDetail ON SalesLT.SalesOrderDetail.SalesOrderID  = SalesLT.SalesOrderHeader.SalesOrderID
    		INNER JOIN  SalesLT.Product ON SalesLT.Product.ProductID = SalesLT.SalesOrderDetail.ProductID*/
     
    END
    Nom : ProcStock.png
Affichages : 99
Taille : 373,8 Ko

  15. #15
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 047
    Points : 24 632
    Points
    24 632
    Par défaut
    Bonjour,

    Personnellement je ne suis pas étonné du message quand je vois ce bricolage.

    Tu fais un select sur un objet que tu supprimes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM ##tCustomerTop
    *
    DROP TABLE ##tCustomerTop
    Ensuite tu voudrais qu'un produit tiers, Access en l’occurrence, accède à cet objet et le manipule. D'un point de vu logique trouves-tu cela normal ?

    Cordialement,

  16. #16
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    983
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 983
    Points : 1 030
    Points
    1 030
    Billets dans le blog
    36
    Par défaut
    Citation Envoyé par loufab Voir le message
    Bonjour,

    Personnellement je ne suis pas étonné du message quand je vois ce bricolage.Tu fais un select sur un objet que tu supprimes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM ##tCustomerTop
    *
    DROP TABLE ##tCustomerTop
    Merci Loufab pour ta piste mais avec ou sans drop le problème subsiste donc le problème est ailleurs

    Cordialement

  17. #17
    Rédacteur/Modérateur
    Avatar de loufab
    Homme Profil pro
    Entrepreneur en solutions informatiques viables et fonctionnelles.
    Inscrit en
    Avril 2005
    Messages
    12 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Entrepreneur en solutions informatiques viables et fonctionnelles.
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 12 047
    Points : 24 632
    Points
    24 632
    Par défaut
    Si tu y accède directement sans faire référence à la procédure stockée ?

Discussions similaires

  1. Formulaire continu : alimentation champ indépendant
    Par lerico dans le forum Modélisation
    Réponses: 2
    Dernier message: 12/05/2013, 23h23
  2. Réponses: 0
    Dernier message: 16/12/2011, 16h08
  3. Formulaire alimenté par une base de données
    Par claire13 dans le forum Langage
    Réponses: 5
    Dernier message: 25/10/2007, 10h31
  4. [VBA]Remplissage d'un formulaire par recordset
    Par titof90 dans le forum IHM
    Réponses: 10
    Dernier message: 24/04/2007, 11h18
  5. [SQL] Comment automatiser une requête SQL alimentée par un formulaire HTML?
    Par tse_tilky_moje_imja dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/06/2006, 23h46

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