Requete select sur une table foxpro

Résolu
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011 - 1 juil. 2010 à 11:27
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011 - 6 sept. 2010 à 15:31
Bonjour à tous ! et peut être à toutes^^

Mon problème se décompose en deux parties : dans un premier temps, j'aimerais savoir qu'elle est la syntaxe pour récupérer des données d'une table foxpro via une requete select avec ADO !

Ensuite, et c'est ce qui me posera le plus problème, j'aimerais insérer les résultats de ma requète dans excel : les données sont insérées dans une feuille du classeur dans un tableau déjà construit !

Voila, toute aide est la bienvenue, j'ai déjà essayé de trouvé des infos la-dessus, donc j'ai compris certaines choses, mais je me mélange un peu quand même entre les différentes méthodes: moi je veux le faire avec ADO.

Je tient à préciser que je commence tout juste avec foxpro donc j'ai quelque soucis, et puis ça fesait un moment que je n'avais pas fait de vba^^ En tout cas j'ai fait ma connexion à la table, et j'ai prévu la déconnexion, mais pour le reste je patine encore ^^

Merci d'avance !

Peace ;)

 

25 réponses

michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
24 août 2010 à 17:21
Bonjour,

bon, d'accord, c'est tout sauf intuitif, les dates en FoxPro comme dans tous les langages de données, d'ailleurs

ton 1er décembre 1996, tu dois le passer sous la forme {^1996-12-01}
ou alors, si tu préfères,
tu peux utiliser la fonction DATE(année, mois, jour) donc pour ton exemple DATE(1996,12,01)
3
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
1 juil. 2010 à 14:09
Bonjour,

je ne suis pas sur de bien comprendre ta demande:

[*] si tu as fait ta connexion, il ne te reste qu'à faire un SELECT etc...
[*] tu dis que tu commences tout juste avec FoxPro, mais est-ce que tu as FoxPro installé sur ta machine, ou bien tu as seulement des tables?
si tu as foxpro sur ta machine, pourquoi passer par ADO pour requèter des tables?
[*] et enfin, comment veux-tu qu'on puisse t'aider si tu ne montre pas le code que tu as écrit jusqu'à maintenant et les messages d'erreurs éventuels?

Merci de préciser également la version de FoxPro que tu utilises
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
1 juil. 2010 à 15:06
Bonjour !

Merci pour ta réponse ! Je vais donc essayer de m'expliquer un peu plus clairement : tout d'abord je n'ai pas foxpro d'installé sur ma machine, en fait je souhaite effectuer des traitements sur des tables foxpro(je code en vba sous visual basic, sous excel 2007).

Pour mieux cernés la chose : je souhaite créer une petite appli qui me permettrait d'automatiser des requetes(select,insert,update,delete) sur différentes tables.

Il me semble que la version des tables foxpro est la version 7.

Sinon, il ne me reste peut-être plus qu'à faire mon select, mais je ne sais pas comment le placer dans mon code, ni par qu'elle instruction : faut-il que j'utilise un recordset ou quelque chose du genre.. J'aurais bien aimé trouver un tuto sur tout ça mais je n'ai pas trouvé :/

Sinon voici le code que j'ai pour la connexion et la déconnexion aux tables :

Option Explicit

Dim connect_foxpro As New ADODB.Connection 'Connexion sur base Fox Pro
Dim cmd_fox As New ADODB.Command 'Commande
Dim rqt_fox As New ADODB.Recordset 'Recordset
Dim connecter_base As Boolean 'Variable permettant de savoir si la personne s'est connecté à la base Fox Pro


'FONCTION PERMETTANT DE SE CONNECTER SUR UNE BASE FOX PRO
Function Connexion(chemin_rep As String)
Dim CHEMIN As String
CHEMIN = chemin_rep

'Si renvoie Vrai , connexion réussie
'Sinon renvoie le numéro de l'erreur de connexion
On Error GoTo error_connexion:

'chemin est une constante indiquant tout simplement le répertoire de la table
connect_foxpro.ConnectionString = "DRIVER={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" & CHEMIN
connect_foxpro.Open
connecter_base = True
Connexion = True

Exit Function

error_connexion:
Connexion = Err.Number

End Function

'FONCTION PERMETTANT DE SE DECONNECTER D'UNE BASE FOX PRO
Function Deconnexion()

'Si renvoie 1 , deconnexion réussie
'Sinon renvoie le numéro de l'erreur de deconnexion
On Error GoTo error_deconnexion:

connect_foxpro.Close
Set connect_foxpro = Nothing
connecter_base = False
Deconnexion = True
Exit Function

error_deconnexion:
Deconnexion = Err.Number

End Function


Pour le moment je n'ai que ça ! Et je ne sais pas par où commencer pour faire mes traitements. Par contre pour le sql ça pause aucun problème...

J'espère avoir été clair sinon je peux essayer de repréciser au besoin !

Peace ;)
 
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
1 juil. 2010 à 15:09
Petite précision : j'ai déclaré un recordset car j'ai commencé à essayer quelques truc mais à vrai dire je ne sais pas trop comment l'utiliser !

Peace
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
1 juil. 2010 à 16:03
tu as essayé quelques trucs, lesquels???

pour le recordset, oui, évidemment, il te faut bien un objet pour recevoir les données que tu reçois par ADO.
Par contre, il vaut mieux utiliser VFPOLEDB comme provider, à la place de l'ODBC que tu utilises.

pour tout savoir (enfin presque ), je te conseille de télécharger le VFPOLEDB provider sur le site de Microsoft, en principe le fichier d'aide doit s'installer avec.

voici un exemple tiré de l'aide de VFPOLEDB:

CLEAR
LOCAL oConn as "adodb.connection"
LOCAL oRS as "adodb.recordset"
oConn = CREATEOBJECT('adodb.connection')
oRS = CREATEOBJECT('adodb.recordset')
cConnStrng = ;
   "Provider=vfpoledb;Data Source="+HOME(2)+"northwind\northwind.dbc"
oConn.CursorLocation= 3            && adUseClient
oConn.Open(cConnStrng)

*!* Open RecordSet using keyset cursor and optimistic locking.
oRS.Open(;
   "SELECT * FROM customers WHERE customerid = 'CACTU'",oConn,1,3,1)
? 'Current value:',oRS.Fields("contactname").Value
oRS.Fields("contactname").Value = "Patricio X. Simpson"
oRS.Update()
oRS.Requery()
? 'New value:',oRS.Fields("contactname").Value
oRS.Close()
oConn.Close()
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
1 juil. 2010 à 16:09
Merci beaucoup de m'avoir aiguiller !

Je vais regarder tout ça et je ferais un post de ce que j'ai trouvé !!

Comme ça si ça fonctionne, vous pourrez me dire si c'est bien codé, ou si j'ai des erreurs vous pourrez peut-etre m'aider à les résoudre !

Merci bien en tout cas , je m'y met !!

Peace ;)
 
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
18 août 2010 à 14:47
Bonjour !

Donc depuis le temps, j'ai pas bien avancé !

Voici mon code pour le select que je souhaitais effectuer :

Option Explicit

Dim targetRange As Range
Dim intColIndex As Integer
Dim nbRecords As Integer
Dim che_fic As String

Dim cnx As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset

Sub Afficher(nomTab As String)

    nbRecords = 0
    
    'Connexion à la base
    Set cnx = New Connection
    'chemin est une constante indiquant tout simplement le répertoire de la table
    With cnx
        .ConnectionString "Provider vfpoledb; Data Source =" + CHEMIN + nomTab
        .Open
    End With
    
    'Préparation de l'objet command
    Set cmd = New ADODB.Command
    Set cmd.ActiveConnection = cnx
    
    cmd.CommandText = REQ_SELECT
    
    'On déclare le recordset
    Set rs = New ADODB.Recordset
    
    'Exécute la requête
    rs.Open cmd, CursorType:=adOpenStatic
    
    'On sélectionne la feuille de destination
    ActiveWorkbook.Sheets(NOM_FEUILLE_SELECT).Activate
    
    'On efface l'ensemble du contenu précédent
    ActiveSheet.Cells.Clear
    
    'On vérifie que l'on a bien récupéré des enregistrements
    If Not rs.EOF Then
    
        rs.MoveFirst
        Set targetRange = ActiveWorkbook.Sheets(NOM_FEUILLE_SELECT).Cells(1, 1)
        
        ' Mise en place des noms de champs comme entêtes de colonne
        For intColIndex = 0 To rs.Fields.Count - 1
            targetRange.Offset(0, intColIndex).Value = rs.Fields(intColIndex).Name
        Next
    
        Application.StatusBar = "Extraction des enregistrements ..."
        ' Vide le contenu du jeu d'enregistrements dans la feuille de calcul Excel
        targetRange.Offset(1, 0).CopyFromRecordset rs
        Sheets(NOM_FEUILLE_SELECT).Columns("A:Z").AutoFit
       
        nbRecords = rs.RecordCount
        MsgBox "Import de " & nbRecords & " enregistrement(s) !"
        
     Else
        MsgBox "Il n'y a aucun enregistrement correspondant.", vbInformation, "Enregistrement impossible"
        
    End If
    
    Application.StatusBar = ""
    ' Ferme le jeu d'enregistrements s'il est toujours ouvert
    If CBool(rs.State And adStateOpen) Then rs.Close
    
    'Enregistrement des modifications des feuilles excel
    Application.DisplayAlerts = False
    che_fic = REP_FIC + NOM_FIC
    ActiveWorkbook.SaveAs che_fic
    Application.DisplayAlerts = True
        
    ActiveWorkbook.Sheets(NOM_FEUILLE_PRINCIPAL).Activate
    
    cnx.Close
    
    Set cnx = Nothing
    Set rs = Nothing
    Set targetRange = Nothing
    Set cmd = Nothing

End Sub


Cela fonctionne très bien !

 
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
18 août 2010 à 14:58
Mais j'ai besoin d'une petite aide : j'ai commencé a tenter quelques petites choses pour faire un insert dans ma table.

Voici le bout de code qu j'ai :


Sub Insert(nomTab As String)
    
    Dim cnx As ADODB.Connection
    Dim cmd As ADODB.Command
    
    'Connexion à la base
    Set cnx = New Connection
    'chemin est une constante indiquant tout simplement le répertoire de la table
    With cnx
        .ConnectionString "Provider vfpoledb; Data Source =" + CHEMIN + nomTab
        .Open
    End With
    
    'Préparation de l'objet command
    'Set cmd = New ADODB.Command
    'Set cmd.ActiveConnection = cnx
    
    'On exécute l'insert
    cnx.Execute REQ_INSERT, adCmdText
    
    cnx.Close
    
    Set cnx = Nothing
    Set cmd = Nothing
End Sub


Je vous donne ma requète : de toute façon, toutes les données sont inventés..

Public Const REQ_INSERT As String = "Insert Into client Values (000001,'','FLORIAN GARNIER','FR454545454','DEVELOPPEUR EN INFORMATIQUE','65 KINGSTON ROAD','KINGSTON BOULEVARD STATION','44120','VERTOU','FRA','0044 0645 445 455',00443222323232,'FRA',201200,'',11111111,'','AS24 FR','EUR','VIRT DEVISE CLIENT','BPBA','P/O BOX 44','POOLE','','Test - TEST ajout','28/08/2010','12/12/2010',0,'TEST ADR','TEST ADR2',0,0,'00/01/1900',0,'00/01/1900','00/01/1900','00/01/1900',0,'FRBARGO44',0,1,0,0,0,1,'TACTAC','',0,0,0,'00/01/1900','','cif','66 ROAD STREET','ROAD STREET','GG44 5BT','NANTES','00/01/1900',0,'F5','ffffff','ffffff','FG','00/01/1900','','FR45454545454545454ACM',0,'00/01/1900','00/01/1900','FRA',0,'',1,0007,'FRA',0,0,0007,'00/01/1900')"


Et donc, j'ai une erreur, le message étant :

[i]Erreur d'exécution '-2147467259(80004005)':

Must specify additional parameters/i

Si quelqu'un voit de quoi ça peut venir je suis à l'écoute^^

Merci d'avance :)

Peace ;)



 
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
23 août 2010 à 13:53
Bonjour,

Bon j'ai avancé, pour mon erreur d'avant c'est juste qu'il me manquait quelques champs à renseignés pour exécuter ma requête : j'en remplissais 78 sur 86, donc evidemment..

Mais par contre la je suis sûr de moi, et pourtant j'ai une erreur :

"Data type Mismatch"

Je voudrais savoir si ça signifit que certaines infos que j'ai renseigné ne correspondent pas au type de la colonne, ou alors si c'est tout autre chose ??


Merci d'avance, Peace !


 
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
23 août 2010 à 14:14
Bonjour,

tu as vu juste: ce message signifie que tu as une erreur de correspondance entre les données proposées et le type de colonne.
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
23 août 2010 à 15:52
Merci beaucoup !

Je viens de m'en rendre compte.. J'utilise visuDBF pour voir les données présentes dans une des tables, et en fait, cette petite appli marche pas si bien que ça.. Au début ça va et après il y a un décalage dans l'affichage des colonnes..

J'ai pu comprendre en faisant un select * et en affichant toutes les colonnes dans mon fichier excel.. et c'est également là que je me suis aperçu des 86 colonnes au lieu des 78..

Bon ba j'avance petit à petit et je reviendrais si jamais j'ai encore un autre soucis^^

Peace

 
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
24 août 2010 à 10:11
Bonjour bonjour !

Bon et bien je reviens vers où pour un problème simple dans ma requête : j'ai un soucis dans ma requete insert, impossible d'ajouter des dates..

J'ai essayé avec format, avec CDate, comme un string, en utilisant des quotes, des guillements, et des dièses..

Et j'ai toujours syntax error..

Merci de votre aide,

Cordialement,

Peace


 
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
24 août 2010 à 10:14
Dans le doute, voici ma requète :

Public Const REQ_INSERT As String = "Insert Into client(NUMCTR,CTRRAT,NOMCTR,DATSAI) Values ('999999','123456','GARNIER Florian','01/12/1996')"


Cordialement,

Peace

 
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
25 août 2010 à 08:37
Bonjour !!

Et bien ça je n'y avais pas pensé ^^

Je te remerci beaucoup, et également de m'aider depuis le début

Bonne journée, et peut-être à bientot pour un nouveau problème ^^

Cordialement,

Peace


 
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
25 août 2010 à 09:07
Bon et bien je viens de tester, la syntaxe a l'air de lui plaire mais il me dit qu'il me manque un argument :

Too few arguments


Je ne vois pas ce qu'il entend par là !!

Je ne pensais pas revenir si vite quand même^^

Merci d'avance,

Peace

 
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
25 août 2010 à 11:08
Too few arguments? sur ta requète insert? quel argument peut donc manquer? c'est un message de retour de VFPOLEDB, ou bien de VB?

tu peux nous donner ta requete complète?
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
25 août 2010 à 11:28
C'est un message de vb, qui vient à la ligne suivante :

 'On exécute l'insert
      cnx.Execute REQ_INSERT, adCmdText + adExecuteNoRecords


Du coup, c'est pour ça que je pense qu'il y a un souci au niveau de ma requete.

Ma requete se trouve dans ma constante REQ_INSERT, que voici :

Public Const REQ_INSERT As String = "Insert Into client(NUMCTR,CTRRAT,NOMCTR,NUMTVA,TYPACT,ADRPLG,ADRDRG,CODPOS,VILCLI,CODPAY,NUMTEL,NUMFAX,CODLAN,CODBAN,CODGUI,CPTBAN,CLEBAN,NOMCOM,CODMON,MOYPAI,NOMORG,ADRORG,ADRORG1,VILBAN,NOMTIT,DATSAI) Values ('999999','123456','GARNIER Florian','FR454545454','TRANSPORT INTERNATIONAL DE MARCHANDISES','65 KINGSTON ROAD','KINGSTON Bld Station','44120','Vertou','FRA','0044.0645.545.445','0468284612','FRA','010101','00044','11111111','55','AS24 FR','EUR','Virement','BPBA','P/O BOX44','POOLE','KINGSTON','Test - Test Ajout',DATE(1996/12/01))"



Merci,

Cordialement,

GARNIER Florian
 
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
25 août 2010 à 12:35
je ne comprends pas ta syntaxe...

est-ce que un simple cnx.Execute(REQ_INSERT) fonctionne?
0
GarnierFlorian Messages postés 129 Date d'inscription mardi 27 mai 2008 Statut Membre Dernière intervention 26 juillet 2011
25 août 2010 à 13:58
Juste pour info, voici l'explication des paramètres qui suivent le execute :

Notez que deux paramètres sont spécifiés dans l'instruction utilisée pour exécuter la requête :adCmdText et adExecuteNoRecords. Le paramètre facultatif adCmdText spécifie le type de commande, indiquant que le fournisseur doit exécuter l'instruction de requête (dans le cas présent, une requête SQL) comme une définition textuelle d'une commande. Le paramètre adExecuteNoRecords demande à ADO de ne pas créer d'ensemble d'enregistrements de données si aucun résultat n'est renvoyé à l'application. Ce paramètre ne fonctionne qu'avec les types de commandes définies comme définition de texte, telles que les requêtes SQL, ou comme procédures de base de données stockées. Bien que les paramètres adCmdText et adExecuteNoRecords soient facultatifs, il est conseillé de les spécifier lorsque vous utilisez la méthode Execute, afin d'améliorer les performances de votre application de données.


J'ai trouvé cette info sur ce lien : Explication paramètre.

Et j'ai donc tester d'exécuter la requete seule, mais j'obtiens le meme message d'erreur !! 
0
michelatoutfox Messages postés 828 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 7 mai 2013 1
25 août 2010 à 17:42
je viens de regatrder le lien que tu donnes sur les paramètres: ils sont bien facultatifs. mais si tu veux les utiliser, alors il me semble que tu oublies une virgule. regarde bien l'exemple:
cnn.Execute strSQL,,adCmdText + adExecuteNoRecords

il y a 2 virgules
0
Rejoignez-nous