1

Konu: access e data yazmak

Arkadaşlar,
Kafam tarumar vaziyette.. formda baktım ama nedense anlamadım.
Bir Access veri tabanindaki 2 farklı table a data eklemek istiyorum.

VFP örneği rica etsem sizden...

şimdiden teşekkürler..

2 Son düzenleyen, foxman (28.02.2014 10:42:13)

Re: access e data yazmak

Aydın Merhaba,
Bir zamanlar aşağıdaki kodları yazmışım, düzenlemeye vakit bulamadığım için olduğu gibi kopyalıyorum. Umarım işine yarar.

Visual Fox Pro
*********************************************************************************************************************

*********************************************************************************************************************
SET SAFETY OFF
Close Database ALL
CREATE TABLE slodbf  codepage = 1250 (f1 c(11),f2 c(15),f3 c(36),f4 n(11,3),f5 n(15,5),f6 c(6),f7 c(35),f8 c(25),f9 c(35),f10 c(5))
 
SELECT slodbf
APPEND FROM izhodna4.txt TYPE DELIMITED WITH CHARACTER "|"
 
GO top
*BROWSE
*********************************************************************************************************************
*********************************************************************************************************************
Local cmdb_dir,cmdb_file,cmdb_table
 
cmdb_dir   = "C:\zzzzzz\"
cmdb_file  = "
slo.mdb"
cmdb_table = "
slo"
DELETE FILE C:\zzzzzz\slo.mdb
If !File(cmdb_dir+cmdb_file)
    oado=Createobject("
ADOX.Catalog")
    *oado.create("
Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+cmdb_dir+cmdb_file+";Jet OLEDB:Engine Type=4") && Access database in 3.5 format
    oado.Create("
Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+cmdb_dir+cmdb_file+";Jet OLEDB:Engine Type=5") && Access database in 4.0 format
    Release oado
Endif
 
con_driver        = "
{Microsoft Access Driver (*.mdb)}"
con_dbq           = cmdb_dir+cmdb_file
con_driverid      = "
281"
con_fil           = "
MS Access"
con_maxbuffersize = "
2048"
con_pagetimeout   = "
5"
con_uid           = "
admin"
con_pwd           = "
"
 
con_str = "
Driver="  + con_driver        +";"+;
    "
dbq="           + con_dbq           +";"+;
    "
driverid="      + con_driverid      +";"+;
    "
fil="           + con_fil           +";"+;
    "
maxbuffersize=" + con_maxbuffersize +";"+;
    "
pagetimeout="   + con_pagetimeout   +";"+;
    "
uid="           + con_uid           +";"+;
    "
pwd="           + con_pwd
 
sql_con=Sqlstringconnect(con_str)
 
= sqlexec(sql_con, "
CREATE TABLE slo")
= sqlexec(sql_con, "
ALTER TABLE slo ADD COLUMN [F1]  TEXT (11)")
= sqlexec(sql_con, "
ALTER TABLE slo ADD COLUMN [F2]  TEXT (15)")
= sqlexec(sql_con, "
ALTER TABLE slo ADD COLUMN [F3]  TEXT (36)")
= sqlexec(sql_con, "
ALTER TABLE slo ADD COLUMN [F4]  NUMERIC ")
= sqlexec(sql_con, "
ALTER TABLE slo ADD COLUMN [F5]  NUMERIC ")
= sqlexec(sql_con, "
ALTER TABLE slo ADD COLUMN [F6]  TEXT (6)")
= sqlexec(sql_con, "
ALTER TABLE slo ADD COLUMN [F7]  TEXT (35)")
= sqlexec(sql_con, "
ALTER TABLE slo ADD COLUMN [F8]  TEXT (25)")
= sqlexec(sql_con, "
ALTER TABLE slo ADD COLUMN [F9]  TEXT (35)")
= sqlexec(sql_con, "
ALTER TABLE slo ADD COLUMN [F10]  TEXT (5)")
*= sqldisconnect(sql_con)
*return
komut="
"
komut=komut+"
insert into "+cmdb_table
komut=komut+"
(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10)"
komut=komut+"
values (?slodbf.f1,?slodbf.f2,?slodbf.f3,?slodbf.f4,?slodbf.f5,?slodbf.f6,?slodbf.f7,?slodbf.f8,?slodbf.f9,?slodbf.f10)"
 
*USE slodbf IN 0 ALIAS slodbf AGAIN SHARED
SELECT slodbf
GO top
DO WHILE NOT EOF()
    =sqlexec(sql_con, komut)
    SELECT slodbf
    SKIP
ENDDO
 
= sqlexec(sql_con, "
SELECT * FROM "+cmdb_table,"xxx")
= sqldisconnect(sql_con)
 
Select xxx
*USE
brow
 
*DRID,NAME,SURNAME,OLDSURNAME,SPEC_CODE,SPECIALITY,UNIT_CODE,UNIT_NAME,UNIT_ADDR1,UNIT_ADDR2,SUBCITY,CITY,TEL,TCODE1001
*?dl.DRID,?dl.NAME,?dl.SURNAME,?dl.OLDSURNAME,?dl.SPEC_CODE,?dl.SPECIALITY,?dl.UNIT_CODE,?dl.UNIT_NAME,?dl.UNIT_ADDR1,?dl.UNIT_ADDR2,?dl.SUBCITY,?dl.CITY,?dl.TEL,?dl.TCODE1001
*********************************************************************************************************************
*********************************************************************************************************************

3

Re: access e data yazmak

Saol foxman. İşime yarayacak sanırım...  Sonucu söylerim..

4

Re: access e data yazmak

Merhaba Aydin,

Bu Cursoradapter kullaniyor. Class hazir. Sadece ust kismini kendine gore ayarla, ondan sonra VFP tablosu kullaniyor gibi kullanabilirsin.

Visual Fox Pro
Local loCursor, lcConStr

 
*D:\data\Northwind.accdb
*D:\data\Northwind.mdb
 
lcConStr = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:\Data\NorthWind.accdb;Persist Security Info=False'
 
loCursor = Createobject('CaGeneric',m.lcConStr)
loCursor.BatchUpdateCount = 1
 
With loCursor
  .Alias          = 'myTable'
  TEXT TO .SelectCmd  noshow
SELECT * FROM Customers cus WHERE country = ?m.Country
  ENDTEXT
Endwith
 
Country = 'USA'
If loCursor.QueryFill()
  Select (loCursor.Alias)
 
  loCursor.MakeUpdatable('Customers','customerId') && TableName, Primary Key field name
  Browse Last
  Tableupdate(2,.T.,loCursor.Alias)
Endif
 
 
Country = 'UK'
If loCursor.QueryFill()
  Select (loCursor.Alias)
 
  loCursor.MakeUpdatable('Customers','customerId')
  Browse Last
  Tableupdate(2,.T.,loCursor.Alias)
Endif
 
Define Class CaGeneric As CursorAdapter
  CompareMemo = .F.
  FetchAsNeeded = .T.
  FetchSize = 100
  FetchMemo = .T.
  BatchUpdateCount = 1
  WhereType = 1
  AllowSimultaneousFetch = .T.
  MapVarchar = .T.
  MapBinary = .T.
  BufferModeOverride = 5
 
  DataSourceType = 'ADO'
  InsertCmdDataSourceType = 'ADO'
  UpdateCmdDataSourceType = 'ADO'
  DeleteCmdDataSourceType = 'ADO'
 
  Procedure Init(tcConnectionString)
    Set Multilocks On
    Local loConnDataSource
    loConnDataSource = Createobject('ADODB.Connection')
    loConnDataSource.ConnectionString = m.tcConnectionString
    loConnDataSource.Open()
    This.Datasource = Createobject('ADODB.RecordSet')
    This.Datasource.CursorLocation   = 3  && adUseClient
    This.Datasource.LockType         = 3  && adLockOptimistic
    This.Datasource.ActiveConnection = m.loConnDataSource
    loCommand = Createobject('ADODB.Command')
    loCommand.ActiveConnection = loConnDataSource
    This.AddProperty('oCommand',loCommand)
    Store loCommand To ;
      This.UpdateCmdDataSource,;
      This.InsertCmdDataSource,;
      This.DeleteCmdDataSource
  Endproc
 
  Procedure MakeUpdatable(tcTableName,tckeyField,tlDoNotIncludeKey)
    This.Tables = m.tcTableName
    This.KeyFieldList = m.tckeyField
    Local ix, lnUpdateableFCount
    lnUpdateableFCount = Fcount(This.Alias)-Iif(This.DataSourceType='ADO',1,0) && last one is ADOBOOKMARK
    For ix = 1 To m.lnUpdateableFCount
      If !m.tlDoNotIncludeKey Or !(Upper(Field(m.ix,This.Alias,0)) == Upper(m.tckeyField))
        This.UpdatableFieldList = This.UpdatableFieldList + ;
          IIF(Empty(This.UpdatableFieldList),'',',') + ;
          FIELD(m.ix,This.Alias,0)
      Endif
      This.UpdateNameList = This.UpdateNameList + ;
        IIF(Empty(This.UpdateNameList),'',',') + ;
        TEXTMERGE('<<FIELD(m.ix,this.Alias,0)>> <<m.tcTableName>>.<<FIELD(m.ix,this.Alias,0)>>')
    Endfor
  Endproc
 
  Procedure QueryFill()
    Local llSuccess
    If This.DataSourceType ="ADO"
      llSuccess = This.CursorFill(.F.,.F.,0,This.oCommand)
    Else
      llSuccess = This.CursorFill(.F.)
    Endif
    If !m.llSuccess
      If This.DataSourceType ="ADO"
        lcMessage = This.oCommand.CommandText + Chr(13) + This.GetErrorExplanation()
      Else
        lcMessage = This.GetErrorExplanation()
      Endif
      Messagebox(m.lcMessage)
    Endif
    Return m.llSuccess
  Endproc
 
  Procedure GetErrorExplanation
    Local lcError,ix
    Local Array aWhy[1]
    Aerror(aWhy)
    lcError = ""
    For ix = 1 To 7
      lcError = m.lcError + Transform(aWhy[m.ix]) + Chr(13)
    Endfor
    Return m.lcError
  Endproc
Enddefine

5 Son düzenleyen, aydinufuk (28.02.2014 16:03:23)

Re: access e data yazmak

saol çetin ...  ..inceliyorum şimdi..

6 Son düzenleyen, aydinufuk (06.03.2014 18:30:54)

Re: access e data yazmak

Çetinin  verdiğin örnekte , her table için bir cursor mu yaratmam gerek..
2 adet table a bilgi ekleyeceğim de aynı  anda..

Visual Fox Pro
loCursor1= Createobject('CaGeneric',m.lcConStr)

loCursor2 = Createobject('CaGeneric',m.lcConStr)


gibi iki referans mı kullanmam gerek?


bir diğer koun , kuracağım bilgisayarda bu  OLEDB için hangi dll lerin kurulu olması gerek?

teşekkürler..

7 Son düzenleyen, cetinbasoz (07.03.2014 13:26:01)

Re: access e data yazmak

Evet her tablo icin bir tane gerekiyor. Onu "use" gibi dusun. loCursor degiskeni var oldugu surece acik. Degisken gittigi anda dosyayi kapatmissin gibi dusun.

ACE OleDb gerekiyor. Hemen hemen her zaman access olan makinede zaten kurulu oluyor (daha eski versiyonlar Jet Oledb kullaniyor). Eger kurulu degil ise:

http://www.microsoft.com/en-us/download … x?id=13255

32 ve 64 bit var. VFP ile ancak 32 bit kullanabilirsin. Eger Office 64 bit kurulu ise korkarim sansin yok.

Not: Bu isi surekli yapacaksan haberim olsun. Isini kolaylastiracak baska seyler de buluruz:)

8

Re: access e data yazmak

SAOL ÇETİN.

Yerli bir cnc programına data göndermek için gerekti.  Aynı  marka bir cnc çıkarsa karşıma yine gerekebilir.
Eğer Office 64 kurulu ise, kaldırıp 32 bit Office kurmak gerekecek anladığım . doğru mudur?

9

Re: access e data yazmak

64 bit office kurulu ise 32 bit driver olabilir mi bilmiyorum.

10 Son düzenleyen, aydinufuk (28.04.2014 17:30:01)

Re: access e data yazmak

cetin'nin verdiği kodlarla çalışırken bir veritabanında

tableupdate(2,.t.,"xdbf")
komutu delete all da işe yarıyor ama
ama satır ekleyip data değiştirdikten sonra işe yaramıyor. sonuç .f. olarak dönüyor ..
kod şöyle. bir fikri olan var mı? şimdiden teşekkürler..
tabloda Primary Key yok..

Visual Fox Pro
loCPARAM = Newobject('CaGeneric',xclass,"",lcConStr )

loCPARAM.BatchUpdateCount = 1
* DETAY DOSYA
With loCPARAM
    .Alias = 'PARAMETER'
    If !loCPARAM.QueryFill()
        Wait Window "PARAMETER VERITABANINA ULAŞILAMIYOR"
        Return .F.
    Endif
    xup=loCPARAM.MakeUpdatable('PARAMETER','index') && TableName, Primary Key field name
    Select  (loCPARAM.Alias)
    Delete All
    Debug
    Suspend
    xup    =Tableupdate(2,.T.,loCPARAM.Alias)   && xup = .t.
 
    * ENİ BOYU KAYDET
    Append Blank
    xup    =Tableupdate(2,.T.,loCPARAM.Alias)  && xup= .f.
    Replace Index With  "0" , name With  "L" , VALUE WITH "0" IN (loCPARAM.Alias)
    xup    =Tableupdate(2,.T.,loCPARAM.Alias) && xup= .f.
    Replace PARAMETER.Index With  "0" , PARAMETER.name With  "W" , PARAMETER.VALUE WITH "0"
 
    xup    =Tableupdate(2,.T.,loCPARAM.Alias) && xup= .f.
 
ENDWITH
loCPARAM =null

11

Re: access e data yazmak

sanırım sorun index,value gibi reserv kelimelerin fieldname olarak kullanılmasından kaynaklanıyor. Bu engeli nasıl aşabilirim?

12

Re: access e data yazmak

O jenerik bir class. Sanirim bu durumda UpdateCommand'i elle degistirip index yerine [index] yazman gerekiyor.

13

Re: access e data yazmak

cetinbasoz yazdı:

O jenerik bir class. Sanirim bu durumda UpdateCommand'i elle degistirip index yerine [index] yazman gerekiyor.

Çetin,
SQL 'e hakim değilim. O yüzden ne önerdiğini tam anlamadım.  Nerede yapılacak bu düzeltme ?

14

Re: access e data yazmak

Visual Fox Pro
Replace [Index] With  "0" , name With  "L" , VALUE WITH "0" IN (loCPARAM.Alias)

15

Re: access e data yazmak

bu kodlar da elinin altinda bulunsun 2side yine Cetin hocanin kodlari

MDB_browser

Visual Fox Pro
Public oForm

oForm = Createobject('myForm')
oForm.Show()
 
Define Class myForm As Form
  Height = 450
  Width = 850
  DataSession=2
  Caption='Show Access Data'
 
  Add Object lblAccess As Label With ;
    Caption = "Access Database", ;
    Left = 10, Top = 15, Width = 100
 
  Add Object txtMDBlocation As TextBox With ;
    Left = 112, Top = 12, Width = 520
 
  Add Object cmdBrowse As CommandButton With ;
    Top = 10, Left = 640, Caption = "Browse", Autosize=.t.
 
  Add Object lblTables As Label With ;
    Caption = "Tables", Left = 20, Top = 40, Width = 40
 
  Add Object lstTables As ListBox With ;
    Height = 400, Left = 65, Top = 40, Width = 265
 
  Add Object grdShow As Grid With ;
    Height = 400, Left = 340, Top = 40, Width = 500
 
  Procedure listtables
    Local lnConnHandle,lcMDB
    With This.txtMDBlocation
      If Empty(.Value) Or !File(.Value)
        Return
      Endif
      lcMDB = Trim(.Value)
    Endwith
 
    lnConnHandle = ;
     Sqlstringconnect("Driver={Microsoft Access Driver (*.mdb)};"+;
                     "Uid=Admin;DBQ="+m.lcMDB)
    SQLTABLES(m.lnConnHandle, ['TABLE'], 'crsTables')
    SQLDISCONNECT(m.lnConnHandle)
    Select crsTables
    This.lstTables.Clear()
    Scan
      This.lstTables.AddItem(crsTables.table_name)
    Endscan
  Endproc
 
 
  Procedure txtMDBlocation.LostFocus
    Thisform.listtables()
  Endproc
 
 
  Procedure cmdBrowse.Click
    This.Parent.txtMDBlocation.Value = Getfile('MDB','','',0,'Select Access Database')
    Thisform.listtables()
  Endproc
 
 
  Procedure lstTables.InteractiveChange
    Local lnConnHandle,lcMDB,lcSQL
    With This.Parent.txtMDBlocation
      If Empty(.Value) Or !File(.Value)
        Return
      Endif
      lcMDB = Trim(.Value)
    Endwith
 
    lcSQL = 'select * from "'+Trim(This.Value)+'"'
    lnConnHandle = ;
     Sqlstringconnect("Driver={Microsoft Access Driver (*.mdb)};"+;
                     "Uid=Admin;DBQ="+m.lcMDB)
    SQLEXEC(m.lnConnHandle,m.lcSQL,'crsLocal')
    SQLDISCONNECT(m.lnConnHandle)
    With This.Parent.grdShow
      .ColumnCount = -1
      .RecordSource = 'crsLocal'
    Endwith
  Endproc
Enddefine

MDB_Table_Browse_Update

Visual Fox Pro
Local loCursor, lcConStr

 
 
*-lcConStr = 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:\Data\NorthWind.accdb;Persist Security Info=False'
 
 
 
loCursor = Createobject('CaGeneric',m.lcConStr)
loCursor.BatchUpdateCount = 1
 
LOCAL lcTableName,lcPKey
lcTableName = "TblForm"   && suite your tablename
lcPkey = "iID" && suite your Pkey
 
With loCursor
  .Alias          =  m.lcTableName
  TEXT TO .SelectCmd  NOSHOW TEXTMERGE 
SELECT * FROM  <<m.lcTableName>>
  ENDTEXT
Endwith
 
 
If loCursor.QueryFill()
  Select (loCursor.Alias)
*- loCursor.MakeUpdatable('TblForm','iID') && TableName, Primary Key field name
  loCursor.MakeUpdatable(m.lcTableName,m.lcPKey) && TableName, Primary Key field name
  Browse Last
  Tableupdate(2,.T.,loCursor.Alias)
Endif
 
 
Define Class CaGeneric As CursorAdapter
  CompareMemo = .F.
  FetchAsNeeded = .T.
  FetchSize = 100
  FetchMemo = .T.
  BatchUpdateCount = 1
  WhereType = 1
  AllowSimultaneousFetch = .T.
  MapVarchar = .T.
  MapBinary = .T.
  BufferModeOverride = 5
 
  DataSourceType = 'ADO'
  InsertCmdDataSourceType = 'ADO'
  UpdateCmdDataSourceType = 'ADO'
  DeleteCmdDataSourceType = 'ADO'
 
  Procedure Init(tcConnectionString)
    Set Multilocks On
    Local loConnDataSource
    loConnDataSource = Createobject('ADODB.Connection')
    loConnDataSource.ConnectionString = m.tcConnectionString
    loConnDataSource.Open()
    This.Datasource = Createobject('ADODB.RecordSet')
    This.Datasource.CursorLocation   = 3  && adUseClient
    This.Datasource.LockType         = 3  && adLockOptimistic
    This.Datasource.ActiveConnection = m.loConnDataSource
    loCommand = Createobject('ADODB.Command')
    loCommand.ActiveConnection = loConnDataSource
    This.AddProperty('oCommand',loCommand)
    Store loCommand To ;
      This.UpdateCmdDataSource,;
      This.InsertCmdDataSource,;
      This.DeleteCmdDataSource
  Endproc
 
  Procedure MakeUpdatable(tcTableName,tckeyField,tlDoNotIncludeKey)
    This.Tables = m.tcTableName
    This.KeyFieldList = m.tckeyField
    Local ix, lnUpdateableFCount
    lnUpdateableFCount = Fcount(This.Alias)-Iif(This.DataSourceType='ADO',1,0) && last one is ADOBOOKMARK
    For ix = 1 To m.lnUpdateableFCount
      If !m.tlDoNotIncludeKey Or !(Upper(Field(m.ix,This.Alias,0)) == Upper(m.tckeyField))
        This.UpdatableFieldList = This.UpdatableFieldList + ;
          IIF(Empty(This.UpdatableFieldList),'',',') + ;
          FIELD(m.ix,This.Alias,0)
      Endif
      This.UpdateNameList = This.UpdateNameList + ;
        IIF(Empty(This.UpdateNameList),'',',') + ;
        TEXTMERGE('<<FIELD(m.ix,this.Alias,0)>> <<m.tcTableName>>.<<FIELD(m.ix,this.Alias,0)>>')
    Endfor
  Endproc
 
  Procedure QueryFill()
    Local llSuccess
    If This.DataSourceType ="ADO"
      llSuccess = This.CursorFill(.F.,.F.,0,This.oCommand)
    Else
      llSuccess = This.CursorFill(.F.)
    Endif
    If !m.llSuccess
      If This.DataSourceType ="ADO"
        lcMessage = This.oCommand.CommandText + Chr(13) + This.GetErrorExplanation()
      Else
        lcMessage = This.GetErrorExplanation()
      Endif
      Messagebox(m.lcMessage)
    Endif
    Return m.llSuccess
  Endproc
 
  Procedure GetErrorExplanation
    Local lcError,ix
    Local Array aWhy[1]
    Aerror(aWhy)
    lcError = ""
    For ix = 1 To 7
      lcError = m.lcError + Transform(aWhy[m.ix]) + Chr(13)
    Endfor
    Return m.lcError
  Endproc
Enddefine

16

Re: access e data yazmak

CaGeneric UpdateCmd (ve gerekiyorsa InsertCmd).

Visual Fox Pro
loCPARAM = Newobject('CaGeneric',xclass,"",lcConStr )

loCPARAM.UpdateCmd = "update ... set [index] ..."
...

17

Re: access e data yazmak

Teşekkürler sonucu söylerim..

18

Re: access e data yazmak

arkadaşlar..

Access 2007 de çetini verdiği kodları çalıştırıyordum.    2010 da çalışmıyor .

önerisi olan var mi?

1435 nolu hatayı veriyor ..

19 Son düzenleyen, cetinbasoz (10.06.2014 10:55:01)

Re: access e data yazmak

Aydin,
2013'te de calisiyor. 2010 64 bit versiyon olmasin (gerci onda da 32 bit driver ile calisiyor)?

20

Re: access e data yazmak

cetinbasoz yazdı:

Aydin,
2013'te de calisiyor. 2010 64 bit versiyon olmasin (gerci onda da 32 bit driver ile calisiyor)?

64 bit versiyon olabilir ofis..

bilgisayar win 7 , 64 bit.. ofisden emin değilim..
hangi driver gerekiyor?

21

Re: access e data yazmak

Access database engine.exe 2007 diye bir şey bulup yükledim..sorun çözüldü..