Différents formats de dbf

Résolu
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007 - 9 nov. 2004 à 13:47
ThierryPerretier Messages postés 103 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 6 juillet 2006 - 10 nov. 2004 à 15:03
Bonjour,

J'ai une table (dont je ne maitrise pas le format) dans laquelle je dois mettre à jour des champs. Sous VB ma propiété CONNECT vaut "FoxPro 3.0;". J'arrive bien à lire les enregistrements mais lorsque je veux mettre à jour avec la fonction UPDATE, j'ai un message d'erreur de lecture seule alors que le READONLY vaut FALSE.

Lorsqu'avec VFP je copie ma table en TYPE FOXPLUS, je passe alors ma propriété CONNECT a "dBASE 5.0;" et là aucun problème, je peux faire ce que je veux sur ma table.

Mon problème est de pouvoir travailler avec la table d'origine sans changer de format avec VFP.

Merci pour votre aide

A+

8 réponses

ThierryPerretier Messages postés 103 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 6 juillet 2006 1
10 nov. 2004 à 13:57
J'ai cru comprendre dans tes précédent messages, que tu voulait mettre à jour des enregistrements grâce au recno().

Utilises donc un curseur coté serveur (donc directement la table DBF)

oRs.CursorLocation = adUseServer

oRs.Open "use table1" ,oConn,adOpenKeyset,adLockOptimistic

oRs.AbsolutePosition=10

oRs.Fields("valeur").Value = oRs.Fields("valeur").Value+1

oRs.update

3
ThierryPerretier Messages postés 103 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 6 juillet 2006 1
9 nov. 2004 à 18:39
Bonjour,
Voici un exemple de code VB utilisant ADO et le driver OLEDB de VFP.
Le driver VFPOLEDB.DLL est téléchargeable sur le site www Microsoft.


dim oConn as new adodb.connection
dim oRs as new adodb.recordset

oConn.Open "Provider=vfpoledb;Data Source=d:\data"    
 
oRs.CursorLocation = adUseClient

oRs.Open "select * from table1 ", _
           oConn, adOpenKeyset, adLockOptimistic

oRs("valeur") = oRs("valeur") + 1
oRs.update
0
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
10 nov. 2004 à 12:34
Merci pour ton code. J'ai installé le VFPOLEDB, j'accède bien à la table mais j'ai ce message d'erreur sur la ligne oRs.update

Erreur d'exécution '-2147217887 (80040e21)':

Une opération en plusieurs étapes a généré des erreurs. Vérifiez chaque valeur d'état.

Je ne vois pas où est le problème.
0
ThierryPerretier Messages postés 103 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 6 juillet 2006 1
10 nov. 2004 à 12:51
As tu utilisé Addnew() ?

Si oui, il faut renseigner tous les champs dont le DBF n'acceptera pas la valeur NULL.
0

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

Posez votre question
ThierryPerretier Messages postés 103 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 6 juillet 2006 1
10 nov. 2004 à 13:08
Tu peux aussi ajouter après l'ouverture de la connexion :

oConn.Execute "SET NULL OFF"
0
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
10 nov. 2004 à 13:25
Le champ numérique que je veux modifier contient déjà un 0. En revanche certains autres champs sont vides.

J'utilise un oRs.move (valeur) pour me déplacer dans la table et je dois incrémenter de 1 un champ numérique. C'est vrai qu'en regardant le code, je n'ai pas vu de ligne oRs.Edit mais cette fonction n'existe pas.

Alors comment je peux faire pour modifier un enregistrement existant.
0
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
10 nov. 2004 à 14:37
Ok, merci c'est parfait ça marche.
Mais j'aimerais avoir des explications sur ton code. En particulier sur le CursorLocation. Apparemment c'est lui qui me permet d'accèder à ma table.
Enfin, je suppose que pour tous les codes qui sont ici, il faut le VFPOLEDB.

Et pour finir, je suis étonné d'avoir la réponse à mon problème sur le forum de VFP alors que personne n'a su me répondre sur celui de VB.

A+
0
ThierryPerretier Messages postés 103 Date d'inscription mardi 5 octobre 2004 Statut Membre Dernière intervention 6 juillet 2006 1
10 nov. 2004 à 15:03
Curseur coté client : Un recordset est un curseur rempli par ADO. Lors d'une mise à jour, ADO déclenche des instructions UPDATE-SQL.

Donc : select * from table -> toute la table est chargée en mémoire par ADO !
oRs.update -> une instruction UPDATE table SET.. WHERE ...
est déclenchée.

Curseur coté serveur : on travaille directement sur une table/curseur gérée par le moteur de base de données.
C'est comme si tu écrivais en Foxpro :

USE table
GO 10
REPLACE valeur WITH valeur+1

Pour installer VFPOLEDB.DLL sur les postes clients, il suffit de copier la DLL dans SYSTEM32, puis lancer : REGSVR32 VFPOLEDB.DLL.

Concernant ta dernière remarque, pas de commentaires.

Quelques liens :

AtoutFox

[news://news.microsoft.com/microsoft.public.fr.fox Forum microsoft.public.fr.fox]
0
Rejoignez-nous