Différents formats de dbf [Résolu]

cs_pledoux 147 Messages postés mardi 12 octobre 2004Date d'inscription 6 mars 2007 Dernière intervention - 9 nov. 2004 à 13:47 - Dernière réponse : ThierryPerretier 103 Messages postés mardi 5 octobre 2004Date d'inscription 6 juillet 2006 Dernière intervention
- 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+
Afficher la suite 

8 réponses

Répondre au sujet
ThierryPerretier 103 Messages postés mardi 5 octobre 2004Date d'inscription 6 juillet 2006 Dernière intervention - 10 nov. 2004 à 13:57
+3
Utile
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

Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ThierryPerretier
ThierryPerretier 103 Messages postés mardi 5 octobre 2004Date d'inscription 6 juillet 2006 Dernière intervention - 9 nov. 2004 à 18:39
0
Utile
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
Commenter la réponse de ThierryPerretier
cs_pledoux 147 Messages postés mardi 12 octobre 2004Date d'inscription 6 mars 2007 Dernière intervention - 10 nov. 2004 à 12:34
0
Utile
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.
Commenter la réponse de cs_pledoux
ThierryPerretier 103 Messages postés mardi 5 octobre 2004Date d'inscription 6 juillet 2006 Dernière intervention - 10 nov. 2004 à 12:51
0
Utile
As tu utilisé Addnew() ?

Si oui, il faut renseigner tous les champs dont le DBF n'acceptera pas la valeur NULL.
Commenter la réponse de ThierryPerretier
ThierryPerretier 103 Messages postés mardi 5 octobre 2004Date d'inscription 6 juillet 2006 Dernière intervention - 10 nov. 2004 à 13:08
0
Utile
Tu peux aussi ajouter après l'ouverture de la connexion :

oConn.Execute "SET NULL OFF"
Commenter la réponse de ThierryPerretier
cs_pledoux 147 Messages postés mardi 12 octobre 2004Date d'inscription 6 mars 2007 Dernière intervention - 10 nov. 2004 à 13:25
0
Utile
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.
Commenter la réponse de cs_pledoux
cs_pledoux 147 Messages postés mardi 12 octobre 2004Date d'inscription 6 mars 2007 Dernière intervention - 10 nov. 2004 à 14:37
0
Utile
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+
Commenter la réponse de cs_pledoux
ThierryPerretier 103 Messages postés mardi 5 octobre 2004Date d'inscription 6 juillet 2006 Dernière intervention - 10 nov. 2004 à 15:03
0
Utile
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]
Commenter la réponse de ThierryPerretier

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.