Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Requête SQL ODBC

  • Initiateur de la discussion Initiateur de la discussion Orodreth
  • Date de début Date de début

Orodreth

XLDnaute Impliqué
Bonjour à tous.

Depuis Excel, et via un code VBA, je lance une requête SQL à une externe (Sybase - Inférence) via un ODBC.

Voila mon code de lancement de requête
Code:
Private Sub RecupDonneesAchat()
Dim ReqSQL As Variant
Dim VerifCommand As String
ReqSQL = TexteRequeteAchat
    With Sheets("RecupDonnees").QueryTables.Add(Connection:=Array(Array( _
        "ODBC;DSN=Inference;UID=EDI;PWD=EDI;DatabaseName=Inference;EngineName=sInference;AutoStop=NO;Integrated=No;Debug=NO;DisableMultiRowFe" _
        ), Array("tch=NO;CommLinks=SharedMemory,TCPIP{ServerPort=3333};Compress=NO")), _
        Destination:=Sheets("RecupDonnees").Range("A6"))
        .CommandText = ReqSQL
        VerifCommand = CStr(.CommandText)
        .Name = "Lancer la requête à partir de Inference"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = True
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .Refresh BackgroundQuery:=False
    End With

Et voila ma fonction qui retourne la dite requête:
Code:
Private Function TexteRequeteAchat()
Dim laRequete As String
laRequete = "select Sum (qte_recu), Sum(prix_net_HT)"
laRequete = laRequete & "from ligne_recep_fourn_disp"
laRequete = laRequete & "where date_recep like '" & CStr(cboChoixAnnee.Value) & "-" & CStr(Left(cboChoixMois.Value, 2)) & "'"
laRequete = laRequete & "and EAN13 IN (Select EAN13 from prod where code_rayon LIKE '" & ReqCodeRayon & "%')"
TexteRequeteAchat = laRequete
End Function

En fait, j'ai 2 requêtes dans ce style, la première récupère des données de vente (elle passe parfaitement) et renvoie les données sur ma feuille "RecupDonnees" dans la cellule A1 (jusqu'à A4)

La deuxième requête est censée me retourner les valeurs sur la même feuille, mais en cellule A6 (je n'obtiens que 2 valeurs).

Si les requêtes en elle-même sont très simple, il en va autrement sur le lancement de la requête.

Comme je l'ai dit, la première des requêtes passe, mais pas la deuxième.
L'erreur viendrait (selon ce que dit excel) de la ligne:

Code:
With Sheets("RecupDonnees") ...
        [B][COLOR="Red"].Refresh BackgroundQuery:=False[/COLOR][/B]
end with

Je précise que je n'efface pas la première requête à ce moment là, je le fais plus tard, quand mes traitements sont bouclés.

Est-ce que peut m'aider à résoudre ce problème ?

Merci d'avance,
Thomas
 

michel_m

XLDnaute Accro
Re : Requête SQL ODBC

Bonjour,

Tu as utilisé MS QUERY qui nepeut être utilisé que pour une seule requete: il faut doncque tu fasses un 2° MS QUERY pour ton autre requete.

La solution la + élégante serait d'utiliser ADO. Regarde dans le WIKI page6.

Pour l'ODBC avec sybase, tu as un site qui lesdonne. Je ne suis pas à mon poste mais essaies avec "connectionstrings" sur un moteur de recherche.
 

Orodreth

XLDnaute Impliqué
Re : Requête SQL ODBC

Bonjour michel_m et merci de ta réponse.

Mon problème vient entre autre du fait que je suis obligé de passer par un connecteur ODBC pour me connecter à Sybase ET que la base en question est sur un serveur spécifique.

J'ai récupéré la macro d'excel qui a été créée lors d'un enregistrement de "Données, données externes, créer une requête"

J'ai été voir le wiki que tu m'as indiqué, et même si je trouve ça très intéressant (et donc, que je vais probablement avoir droit à ma dose de maux de tête ce soir ), je ne vois pas trop comment je peux m'en servir.

Les méthodes ADO ne me semblaient pas convenir dès le départ, et j'ai toujours cette impression, du moins pour mon problème

Thomas
 
C

Compte Supprimé 979

Guest
Re : Requête SQL ODBC

Salut Orodreth,

Est-tu certain que ta première requête ne vas pas jusqu'à la ligne 6, même si les lignes sont vides !?

Sinon je ne vois pas trop, à première vue il n'y a pas de raison
 

Orodreth

XLDnaute Impliqué
Re : Requête SQL ODBC

Rebonjour michel_m, bonjour bruno

Bon ben merci à vous deux, je vais regarder ton lien.

Et oui, je suis sûr que ma première requête ne va pas jusqu'à la ligne 6, ce sont des sommes, donc la ligne d'en-tête ET le résultat.

Merci encore
Thomas
 

Orodreth

XLDnaute Impliqué
Re : Requête SQL ODBC

Rebonjour le fil, le forum.

Il n'y a vraiment pas moyen de régler ça avec le MS Query ?
J'ai une autre appli sur le même pc qui tourne aussi avec des requêtes SQL, bien que je n'envoie pas les résultats sur la même feuille sur l'autre appli, mais ça marche très bien

Pourtant, sur ce classeur là, rien ne m'empêche de ne garder que les résultats, et de virer les requêtes.

merci d'avance,
Thomas
 
C

Compte Supprimé 979

Guest
Re : Requête SQL ODBC

Donc tu as un problème dans la syntaxe de ta requête !


Code:
 [LEFT]Private Function TexteRequeteAchat()
[LEFT]Dim laRequete As String
laRequete = "select Sum (qte_recu), Sum(prix_net_HT)"
laRequete = laRequete & "from ligne_recep_fourn_disp"
laRequete = laRequete & "where date_recep like '" & CStr(cboChoixAnnee.Value) & "-" & CStr(Left(cboChoixMois.Value, 2)) & "'"
laRequete = laRequete & "and EAN13 IN (Select EAN13 from prod where code_rayon LIKE '" & ReqCodeRayon & "%')"
TexteRequeteAchat = laRequete
' Vérifie ICI la syntaxe de ta requête
[COLOR=red][B]msgbox LaRequete[/B][/COLOR]
End Function[/LEFT]

A vérifier
[/LEFT]
 

Orodreth

XLDnaute Impliqué
Re : Requête SQL ODBC

J'ai vérifié.

Exact, j'avais zappé de mettre des espaces entre mes éléments de la requête (à la fin de chaque ligne "laRequete = ..."

Merci bruno

Comment se fait-il qu'il ne la détecte que là ?

Thomas
 

michel_m

XLDnaute Accro
Re : Requête SQL ODBC

Re,

bizarre bizarre

1° piste:
Lorsque ta 1° requete est terminée, mettons en A1, MS QUERY nomme cette cellule et je me souviens de problèmes à ce sujet...
Quand tu demandes une mise à jour, ta cellule active doit être dans la plage de tes données rapatriées et c'est cette cellule A1 qui déclenche la repetition de ta 1° requete (avec le texte SQL d'origine).

Donc, au cas où, essaies de placer le curseur hors de cette zone

2° piste:
Si tu n'as pas besoin de mise à jour de ta 1° requete, enlève le nom de A1 à la fin de ta macro

puis à la fin de la 2° requete, m^me punition avec A6

tu ne pourras plus utiliser le bouton de mise à jour et tu devras installer des boutons 1° requete-2° requete.

Tout çà c'est des élucubrations devant mon écran, donc...

Tiens moi au courant
 
C

Compte Supprimé 979

Guest
Re : Requête SQL ODBC

Orodreth à dit:
J'ai vérifié.
Exact, j'avais zappé de mettre des espaces entre mes éléments de la requête (à la fin de chaque ligne "laRequete = ..."

Merci bruno

Comment se fait-il qu'il ne la détecte que là ?
Thomas

Salut Thomas,

En fait ta requête est créé sur ta feuille, mais pas exécutée.

Lorsque tu fais : .Refresh BackgroundQuery:=False

C'est à ce momnet là que ta requête est exécutée et donc si elle contient des erreurs, c'est à cet endroit qu'elle apparaît

Voilà
 

Orodreth

XLDnaute Impliqué
Re : Requête SQL ODBC

Bonjour michel, bruno, le fil, le forum.

@Bruno
J'aurais cru qu'il ferait ce genre de vérification quand le commandtext se remplit, autant pour moi

@michel
Le nom de A1 ? tu veux le .name "Lancer la requete ....." ?

ouais peut-être, je sais pas.

En tout cas, ça marche, merci beaucoup à tous les deux

Thomas
 

Discussions similaires

Réponses
33
Affichages
4 K
  • Question Question
Power Query power query
Réponses
22
Affichages
4 K
Réponses
4
Affichages
2 K
Réponses
15
Affichages
3 K
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…