Impossible d'écrire dans une table (dbf)

Résolu
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007 - 13 oct. 2004 à 11:21
cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007 - 13 oct. 2004 à 17:16
Bonjour,

Je dois écrire dans une table DBF format FoxPro 3.0. L'ouverture de la table et la lecture se passent bien mais dès que je dois écrire dans la table (.Edit sur le recorset), j'ai un message d'erreur qui m'indique une table en lecture seule alors que mon ReadOnly est bien à False.

Suit une partie de mon code avec l'ouverture, la lecture et l'écriture des données.

Merci pour vos réponses.

' Ouverture de la base = OK

data_fichier.Connect = "FoxPro 3.0"
data_fichier.DatabaseName = CheminCourt
data_fichier.RecordSource = NomCourt
data_fichier.Refresh

'Lecture d'un enreg = OK

data_fichier.Recordset.MoveFirst
fic(nb_fic_imprime).seq_deb = Format(data_fichier.Recordset!dataseq)

' Ecriture d'un enreg = Erreur 3027 : Impossible de mettre à jour. La base de données ou l'objet est en lecture seule sur la ligne du Recrodset.Edit

data_fichier.Recordset.MoveFirst
data_fichier.ReadOnly = False
data_fichier.Recordset.Edit
data_fichier.Recordset.Fields!n_fic = Format(Str(dernier_fic + nb_fic_imprime), "000000")
data_fichier.Recordset.Fields!seq_imp = "0"
data_fichier.Recordset.Update

3 réponses

cs_pledoux Messages postés 147 Date d'inscription mardi 12 octobre 2004 Statut Membre Dernière intervention 6 mars 2007
13 oct. 2004 à 17:16
Merci à tous mais j'ai trouvé plus simple (en 3 lignes).

Dim cnx As New ADODB.Connection
Dim rst As New ADODB.Recordset

cnx.ConnectionString = "DRIVER={Microsoft Visual FoxPro Driver}; SourceType=DBF; SourceDB=" + nom_du_dbf_avec_son_chemin + "; Exclusive=No;"
cnx.Open
rst.Open "UPDATE " + nom_du_dbf_avec_son_chemin + " SET "+nom_champ+" = '123456'", cnx
cnx.Close

A bientôt
3
JPC8 Messages postés 17 Date d'inscription lundi 27 septembre 2004 Statut Membre Dernière intervention 13 octobre 2004
13 oct. 2004 à 13:04
bonjour,

j'utilise souvent des DBF en lecture et écriture , et je link ma table dans ma database.

Essaie

'attache d'un fichier dbf

docmd.transferdatabase aclink, "dbase IV", "C:\temp", actable, "toto.dbf, " toto"

dim bd as database
set bd=dbengine.workspace(0).database(0)
set matable_toto=bd.openrecordset("toto")

matable_toto.movefirst

'et par exemple utilise
do until matable_toto.eof

matable_toto.edit

.......code

matable_toto.update

loop

'supprimer l'attache

docmd.deleteobject actable, "toto"

Bon courage

J.P.
0
cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
13 oct. 2004 à 13:39
il te faut utilise SourceTableName avec Connect

Regarde cet exemple :

Cet exemple utilise les propriétés Connect et SourceTableName pour lier différentes tables externes à une base de données Microsoft Jet. La procédure ConnectOutput est requise.


Sub ConnectX()

   Dim dbsTemp As Database
   Dim strMenu As String
   Dim strInput As String

   ' Ouvre une base de données Microsoft Jet à 
   ' laquelle vous pourrez lier une table.
   Set dbsTemp = OpenDatabase("DB1.mdb")

   ' Crée un texte de menu.
   strMenu = _
      "Entrer un numéro pour la source de données:" & vbCr
   strMenu = strMenu & _
      " 1. Base de données Microsoft Jet" & vbCr
   strMenu = strMenu & _
      " 2. Table Microsoft FoxPro 3.0" & vbCr
   strMenu = strMenu & _
      " 3. Table dBASE" & vbCr
   strMenu = strMenu & _
      " 4. Table Paradox" & vbCr
   strMenu = strMenu & _
      " M. (voir choix 5 à 9)"

   ' Extrait le choix de l'utilisateur.
   strInput = InputBox(strMenu)

   If UCase(strInput) = "M" Then

      ' Crée un texte de menu.
      strMenu = _
         "Entrer un numéro pour la source de données:" & vbCr
      strMenu = strMenu & _
         " 5. Feuille de calcul Microsoft Excel" & vbCr
      strMenu = strMenu & _
         " 6. Feuille de calcul Lotus" & vbCr
      strMenu = strMenu & _
         " 7. Texte délimité par des virgules (CSV)" & vbCr
      strMenu = strMenu & _
         " 8. Table HTML" & vbCr
      strMenu = strMenu & _
         " 9. Dossier Microsoft Exchange"

      ' Extrait le choix de l'utilisateur.
      strInput = InputBox(strMenu)

   End If

   ' Appelle la procédure ConnectOutput. Le troisième
   ' argument sera utilisé comme chaîne Connect,
   ' et le quatrième comme SourceTableName.
   Select Case Val(strInput)
      Case 1
         ConnectOutput dbsTemp, _
            "JetTable", _
            ";DATABASE=C:\My Documents\Comptoir.mdb", _
            "Employés"
      Case 2
         ConnectOutput dbsTemp, _
            "FoxProTable", _
            "FoxPro 3.0;DATABASE=C:\FoxPro30\Samples",
_
            "Q1Sales"
      Case 3
         ConnectOutput dbsTemp, _
            "dBASETable", _
            "dBase IV;DATABASE=C:\dBASE\Samples", _
            "Comptes"
      Case 4
         ConnectOutput dbsTemp, _
            "ParadoxTable", _
            "Paradox 3.X;DATABASE=C:\Paradox\Samples", _
            "Comptes"
      Case 5
         ConnectOutput dbsTemp, _
            "ExcelTable", _
            "Excel 5.0;" & _
               "DATABASE=C:\Excel\Samples\Q1Sales.xls", _
            "Ventes janvier"
      Case 6
         ConnectOutput dbsTemp, _
            "LotusTable", _
            "Lotus WK3;" & _
               "DATABASE=C:\Lotus\Samples\Sales.xls", _
            "THIRDQTR"
      Case 7
         ConnectOutput dbsTemp, _
            "CSVTable", _
            "Text;DATABASE=C:\Samples", _
            "Sample.txt"
      Case 8
         ConnectOutput dbsTemp, _
            "HTMLTable", _
            "HTML Import;DATABASE=http://" & _
               "www.server1.com/samples/page1.html", _
            "Q1SalesData"
      Case 9
         ConnectOutput dbsTemp, _
            "ExchangeTable", _
            "Exchange 4.0;MAPILEVEL=" & _
               "Mailbox - Michelle Wortman (Exchange)" & _
               "|People\Important;", _
            "Jerry Wheeler"
   End Select

   dbsTemp.Close

End Sub

Sub ConnectOutput(dbsTemp As Database, _
   strTable As String, strConnect As String, _
   strSourceTable As String)

   Dim tdfLinked As TableDef
   Dim rstLinked As Recordset
   Dim intTemp As Integer

   ' Crée un objet TableDef, définit ses propriétés 
   ' Connect et SourceTableName en fonction des
   ' arguments passéset ajoute l'objet à la 
   ' collection TableDefs.
   Set tdfLinked = dbsTemp.CreateTableDef(strTable)

   tdfLinked.Connect = strConnect
   tdfLinked.SourceTableName = strSourceTable
   dbsTemp.TableDefs.Append tdfLinked

   Set rstLinked = dbsTemp.OpenRecordset(strTable)

   Debug.Print "Données de la table liée:"

   ' Affiche les trois premiers enregistrements de la
   ' table liée.
   intTemp = 1
   With rstLinked
      Do While Not .EOF And intTemp <= 3
         Debug.Print , .Fields(0), .Fields(1)
         intTemp = intTemp + 1
         .MoveNext
      Loop
      If Not .EOF Then Debug.Print , "[enregistrements supplémentaires]"
      .Close
   End With

   ' Supprime la table liée puisqu'il s'agit d'un 
   ' exemple.
   dbsTemp.TableDefs.Delete strTable

End Sub



:-p [mailto:cyberscorp2004@msn.com MSN] :big) [mailto:frop01@yahoo.fr YAHOO] >:)

Membre du club CodeS-SourceS
0
Rejoignez-nous