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..
Giriş yapmadınız. Lütfen giriş yapın yada kayıt olun.
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..
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.
*********************************************************************************************************************
*********************************************************************************************************************
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
*********************************************************************************************************************
*********************************************************************************************************************
Saol foxman. İşime yarayacak sanırım... Sonucu söylerim..
Merhaba Aydin,
Bu Cursoradapter kullaniyor. Class hazir. Sadece ust kismini kendine gore ayarla, ondan sonra VFP tablosu kullaniyor gibi kullanabilirsin.
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
saol çetin ... ..inceliyorum şimdi..
Çetinin verdiğin örnekte , her table için bir cursor mu yaratmam gerek..
2 adet table a bilgi ekleyeceğim de aynı anda..
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..
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:)
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?
64 bit office kurulu ise 32 bit driver olabilir mi bilmiyorum.
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..
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
sanırım sorun index,value gibi reserv kelimelerin fieldname olarak kullanılmasından kaynaklanıyor. Bu engeli nasıl aşabilirim?
O jenerik bir class. Sanirim bu durumda UpdateCommand'i elle degistirip index yerine [index] yazman gerekiyor.
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 ?
Replace [Index] With "0" , name With "L" , VALUE WITH "0" IN (loCPARAM.Alias)
bu kodlar da elinin altinda bulunsun 2side yine Cetin hocanin kodlari
MDB_browser
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
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
CaGeneric UpdateCmd (ve gerekiyorsa InsertCmd).
loCPARAM = Newobject('CaGeneric',xclass,"",lcConStr )
loCPARAM.UpdateCmd = "update ... set [index] ..."
...
Teşekkürler sonucu söylerim..
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 ..
Aydin,
2013'te de calisiyor. 2010 64 bit versiyon olmasin (gerci onda da 32 bit driver ile calisiyor)?
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?
Access database engine.exe 2007 diye bir şey bulup yükledim..sorun çözüldü..