Excel với MS Access

Liên hệ QC

handung107

Thành viên gắn bó
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,630
Được thích
17,436
Nghề nghiệp
Bác sĩ
Đào Việt Cường​

Em đã connect được vào database và hiển thị lên form, song không thể Edit được(!) Em đã cố gắng nghiên cứu nhưng chưa tìm ra, mong nhận được sự hỗ trợ của bác. Nếu có thể, các bác cho em một ví dụ cụ thể minh hoạ việc truy cập và update cơ sở dữ liệu MS Foxpro từ MS Access thì khoẻ cho nhà em quá.
Thôi thì tinh thần giúp đỡ nhau là chính, các bác đừng bảo em sử dụng Google nhé!
Cám ơn tất cả các bác!
Dưới đây là thủ tục kết nối và gán ControlSource cho các textbox trên form. Các bác kiểm tra giúp em xem vì sao trên màn hình nhập liệu em chỉ được Read-Only thôi ạ:

Trích nguyên văn:
Private Sub Form_Load()
Set cnn = New ADODB.Connection
cnn.ConnectionString = "provider =vfpoledb.1;; data source=C:\UBSSTK90\DATA\icitem.dbf"
cnn.Mode = adModeReadWrite
cnn.Open
Set rstICITEM = New ADODB.Recordset
rstICITEM.ActiveConnection = cnn
rstICITEM.Open "ICITEM", , adOpenStatic, adLockOptimistic
Set Me.Recordset = rstICITEM
Dim txb As Control
For Each txb In Me.Controls
If TypeName(txb) = "TextBox" Then txb.ControlSource = txb.name
Next
End Sub

__________________
 
CÁC VẤN ĐỀ ĐƯỢC THẢO LUẬN TRONG CHỦ ĐỀ NÀY
---o0o---

1. Hiểu về External data, Data source và Link tables
2. Phương pháp kết nối dữ liệu trong một bảng tính vào cơ sở dữ liệu MS Access và ngược lại.
3. Thảo luận góp ý

Trong mỗi phần, các bạn có thể đặt ra các nghi vấn, các khúc mắc hoặc có thể là câu đố, nhằm giúp vấn đề thảo luận nổi bật hơn. Các bạn không nên đặt các câu hỏi không liên quan đến chủ đề hoặc hướng chủ đề thảo luận sang vấn đề khác.
 
Lần chỉnh sửa cuối:
Upvote 0
handung107 đã viết:
Đào Việt Cường​

Em đã connect được vào database và hiển thị lên form, song không thể Edit được(!) Em đã cố gắng nghiên cứu nhưng chưa tìm ra, mong nhận được sự hỗ trợ của bác. Nếu có thể, các bác cho em một ví dụ cụ thể minh hoạ việc truy cập và update cơ sở dữ liệu MS Foxpro từ MS Access thì khoẻ cho nhà em quá.
Thôi thì tinh thần giúp đỡ nhau là chính, các bác đừng bảo em sử dụng Google nhé!
Cám ơn tất cả các bác!
Dưới đây là thủ tục kết nối và gán ControlSource cho các textbox trên form. Các bác kiểm tra giúp em xem vì sao trên màn hình nhập liệu em chỉ được Read-Only thôi ạ:



__________________


Chào bạn!
Trước đây tôi cũng hay liên kết chương trình với cơ sở dữ liệu thông qua DAO và ADO. Trong DAO thì đơn giản hơn, còn đối với ADO thì có vẻ chuyên nghiệp hơn.
Về câu lệnh Open của 1 Recordset, bạn thử thay từ khóa adOpenStatic thành adOpenKeyset xem, vì với từ kháo này tôi vãn thường Update được cơ sở dữ liệu.
Về việc cập nhật cơ sở dữ liệu thông qua các Control, thường thì tôi không dùng cách trực tiếp như của bạn mà tôi viết thành 1 hàm UpdateData riêng. Mục đích để kiểm soát việc nhập dữ liệu của người dùng.
Chúc bạn thành công
 
Upvote 0
Dear PMXD,
-----------
Cái này em làm cho em nên em kiểm soát được việc nhập liệu của... em!
Em vẫn chưa biết làm cách nào để có thể "Edit" được các thông tin trên Text box. Em đã thử tất cả các kiểu CursorTypeEnum và LockType nhưng đều không có kết quả...
Em gửi một ví dụ lên đây, các anh chị giúp em với nhé!
_____________________________
Lưu ý: tải file STK.zip và giải nén vào thư mục <Ổ đĩa>\Temp hoặc thư mục bất kỳ mà đường dẫn không có khoảng trắng (Ví dụ đường dẫn sau đây không hợp lệ: <Ổ đĩa>\Documents and Settings\STK hoặc Desktop\STK).
_________
 

File đính kèm

  • STK.zip
    18.1 KB · Đọc: 306
Lần chỉnh sửa cuối:
Upvote 0
Đào Việt Cường đã viết:
Dear PMXD,
-----------
Cái này em làm cho em nên em kiểm soát được việc nhập liệu của... em!
Em vẫn chưa biết làm cách nào để có thể "Edit" được các thông tin trên Text box. Em đã thử tất cả các kiểu CursorTypeEnum và LockType nhưng đều không có kết quả...
Em gửi một ví dụ lên đây, các anh chị giúp em với nhé!
Chào Cường,
File em đưa lên là file Access mà. Ý em hỏi anh không hiểu lắm. Để Edit được thì em phải kết hợp các kiểu Cursor Type. Anh sẽ có một bài viết về vấn đề này.
Thân,

Lê Văn Duyệt
 
Upvote 0
Kỹ thuật ADO

Các bạn có thể tham khảo thêm từ đây
Mã:
Public Sub PlainTextQuery()
Const ConnectionString As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;" + _
"Data Source=C:\Program Files\Microsoft " + _
"Office\OFFICE11\SAMPLES\Northwind.mdb;Persist Security Info=False"
Dim Recordset As ADODB.Recordset
' Define the SQL Statement
Const SQL As String = _
"SELECT CompanyName, ContactName " & _
"FROM Customers " & _
"WHERE Country = 'UK' " & _
"ORDER BY CompanyName"
' Initialize the Recordset object and run the query
Set Recordset = New ADODB.Recordset
Call Recordset.Open(SQL, ConnectionString, CursorTypeEnum.
adOpenForwardOnly, _
LockTypeEnum.adLockReadOnly, CommandTypeEnum.adCmdText)
' Make sure we got records back
If Not Recordset.EOF Then
' Dump the contents of the recordset onto the worksheet
Call Sheet1.Range("A2").CopyFromRecordset(Recordset)
' Add headers to the worksheet
With Sheet1.Range("A1:B1").Value = Array("Company Name", "Contact Name")
.Font.Bold = True
End With
' Fit the column widths to the data
Sheet1.UsedRange.EntireColumn.AutoFit
Else
Call MsgBox("Error: No records returned.", vbCritical)
End If
' Close the recordset if it is still open
If (Recordset.State And ObjectStateEnum.adStateOpen) Then Recordset.Close
Set Recordset = Nothing
End Sub
 

File đính kèm

  • DAta acsess with ADO.pdf
    381.6 KB · Đọc: 423
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Private Sub Form_Load()
Set cnn = New ADODB.Connection
cnn.ConnectionString = "provider =vfpoledb.1;; data source=C:\UBSSTK90\DATA\icitem.dbf"
cnn.Mode = adModeReadWrite
cnn.Open
Set rstICITEM = New ADODB.Recordset
rstICITEM.ActiveConnection = cnn
rstICITEM.Open "ICITEM", , adOpenStatic, adLockOptimistic
Set [COLOR="Red"][B]Me.Recordset = rstICITEM[/B][/COLOR]
Dim txb As Control
For Each txb In Me.Controls
If TypeName(txb) = "TextBox" Then txb.ControlSource = txb.name
Next
End Sub
Chị Dung ơi, hình như mục em tô đỏ chỉ áp dụng cho Visual Basic mà thôi. Chứ VBA làm không được???

Lê Văn Duyệt
 
Upvote 0
Tự nhiên lại đọc cái topic này nên đâm ra phải nói vài ý:

1. Me là object nào trong VB mà lại có property là recordset nhỉ? :)

2. Với lại viết code mà dùng bound controls là ko ổn rồi.

Để hiển thị lên Grid --> viết method RefreshList()
Để hiển thị lên Text box, combobox, v.v.. (gọi là edit controls) --> Viết GetData(PK_IDs)
Để save (update/insert) từ edit controls vào Database --> Viết SaveData(PK_IDs) (trong đó có Insert và update)
Để delete 1 row ra khỏi Grid --> Viết Delete(PK_IDs)

Không nên dùng bound! Không nên dùng bound! Không nên dùng bound! Không nên dùng bound!

3. Anh Duyệt mà còn dùng code như trên thì thật là .... ko được. Không thể gọi đấy là chương trình được nếu có đoạn code như trên. Bao nhiêu là coding conventions, bao nhiêu là kiến thức sách vở vứt hết đi đâu rồi? Cách viết bound controls là giờ đây ko còn ai dùng nữa trừ những người mới dụng đến khái niệm lập trình thôi anh Duyệt ạ.

4. Hơn nữa: Có 1000 cái forms mà cứ viết thế này thì có mà chết
Private Sub Form_Load()
Set cnn = New ADODB.Connection
cnn.ConnectionString = "provider =vfpoledb.1;; data source=C:\UBSSTK90\DATA\icitem.dbf"
cnn.Mode = adModeReadWrite
cnn.Open
...
 
Upvote 0
levanduyet đã viết:
Mã:
Private Sub Form_Load()
Set cnn = New ADODB.Connection
cnn.ConnectionString = "provider =vfpoledb.1;; data source=C:\UBSSTK90\DATA\icitem.dbf"
cnn.Mode = adModeReadWrite
cnn.Open
Set rstICITEM = New ADODB.Recordset
rstICITEM.ActiveConnection = cnn
rstICITEM.Open "ICITEM", , adOpenStatic, adLockOptimistic
Set [COLOR="Red"][B]Me.Recordset = rstICITEM[/B][/COLOR]
Dim txb As Control
For Each txb In Me.Controls
If TypeName(txb) = "TextBox" Then txb.ControlSource = txb.name
Next
End Sub
Chị Dung ơi, hình như mục em tô đỏ chỉ áp dụng cho Visual Basic mà thôi. Chứ VBA làm không được???

Lê Văn Duyệt

Bác chả để ý gì cả. Tác giả của bài đó là đây:

handung107 đã viết:
Đào Việt Cường
.....
 
Upvote 0
Dear all,
--------
Hic! vâng, đoạn code trên là của em đấy ạ!
Đoạn code được viết trên MS Access chứ không phải trong VB. Xin lỗi mọi người, do GPE chưa có chuyên mục về Access nên nhân tiện nói về Connect String em đưa tạm vấn đề của em ở đây hòng mong anh chị hỗ trợ gấp.
Thực ra đây chỉ là ý tưởng của em về kết hợp Access với cơ sở dữ liệu Foxpro. Các anh xem file đính kèm ở bài #5 (chú ý đọc ghi chú bên dưới) để hiểu rõ hơn vướng mắc của em: không thể Edit dữ liệu trên Form được.
Vì đây là ví dụ minh hoạ nên em không đưa ra thủ tục kết nối để tránh phiền phức. Em nghĩ rằng, ai đã từng đọc và hiểu về ADOConnect String thì chắc cũng hiểu được thế nào là ProviderData source trong chuỗi kết nối. Mong anh chị sửa giúp khi tải file minh hoạ về máy.
Và để ADODB.Connection kết nối được thì trên máy phải có Provider vfpoledb (download tại đây hoặc tải file đính kèm rồi đăng ký Regsvr32)
Từ bấy đến nay ý tưởng của em vẫn chưa thực hiện được, mong anh chị giúp đỡ thêm!
 

File đính kèm

  • vfpoledb.zip
    914.4 KB · Đọc: 426
Lần chỉnh sửa cuối:
Upvote 0
Nhân tiện xin được giúp đỡ về ADO và SQL
Tôi cần truy cập 1 file text nhưng các tên của trường lại vi phạm naming rule như sau:
Date-out , Time-out , S/N ,Truck ID , Net ,I/O ,Cust. ID , Cust. name ,Mat. ID , Mat. name ,Lot No. , Bag Qty ,From Loader , Tank ID ,Operator
========== ,=========== ,====== ,======== ,======== ,==== ,======== ,==================== ,======= ,====================
22/11/2006 ,6:45:50 AM , 1 ,16L2504 , 4040 ,Out ,008 ,a CTY HA PHUONG ,P3 ,50KG BAG PCB30 ,623 , 80 ,BCL2 , ,USER ,Auto , 6710 , 2670
22/11/2006 ,6:57:14 AM , 2 ,16K3958 , 15070 ,Out ,008 ,a CTY HA PHUONG ,P3 ,50KG BAG PCB30 ,623 , 300 ,BCL2 , ,USER ,Auto , 20990 , 5920
22/11/2006 ,7:07:09 AM , 3 ,16H9422 , 10060 ,Out ,008 ,a CTY HA PHUONG ,P3 ,50KG BAG PCB30 ,623 , 200 ,BCL2 , ,USER ,Auto , 14470 , 4410
22/11/2006 ,8:31:03 AM , 4 ,16L1274 , 10060 ,Out ,008 ,a CTY HA PHUONG ,P3 ,50KG BAG PCB30 ,623 , 200 ,BCL2 , ,USER ,Auto , 15060 , 5000
22/11/2006 ,9:33:17 AM , 5 ,16K4216 , 15090 ,Out ,008 ,a CTY HA PHUONG ,P3 ,50KG BAG PCB30 ,623 , 300 ,BCL2 , ,USER ,Auto , 20810 , 5720

Xin nói thêm là dũ liệu này xuất từ 1 chương trình quản lý cân (viết bằng Delphi) ra và không thay đổi được format (mỗi lần đổi nó đòi $500), ngoài ra hàng ngày thứ tự các field lại thay đổi lộn xộn. Không vấn đề gì nếu mình Import Text trong Access hay khi Query text file rồi sort theo chiều ngang. Tôi thấy cách này có vẻ nhà quê quá còn khi truy cập file bằng ADO thì nếu SQLstr =
Public Sub QueryTextFile()
Dim Recordset As ADODB.Recordset
Dim ConnectionString As String
ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & ";" & _
"Extended Properties=Text;"
Const SQL As String = _
"SELECT GROSS, NET FROM 20061204.txt;"
Set Recordset = New ADODB.Recordset
Call Recordset.Open(SQL, ConnectionString, _
CursorTypeEnum.adOpenForwardOnly, _
LockTypeEnum.adLockReadOnly, CommandTypeEnum.adCmdText)
Call Sheet1.Range("A1").CopyFromRecordset(Recordset)
Recordset.Close
Set Recordset = Nothing
End Sub

SQL As String = "SELECT * FROM 20061204.txt;" hay là
"SELECT GROSS, NET FROM 20061204.txt;"
thì hoàn toàn OK
nhưng nếu "SELECT CUST.ID FROM 20061204.txt;" thì luôn báo lỗi.

Ngay cả khi in các Field Name bằng Debug.print Field.Name , vd kết quả Cust. ID thì cho là Cust #ID ) ra rồi dán vào thì nó cũng báo lỗi.

Câu hỏi của tôi là làm cách nào xử lý với những tên FIELD (Bag Qty, Scale mode,...)này và làm việc với nó bình thường để có thể trích xuất như các tên khác như Net, Gross,...

Xin cảm ơn nhiều!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
May mắn là cuối cùng tôi đã tìm ra cách giải quyết
dùng Debug.Print Field.Name , vd kết quả Cust. ID thì cho là Cust #ID , sau đó SQL = "SELECT [CUST#ID] FROM 20061204.txt;"

Kết quả mỹ mãn!
 
Upvote 0
:)

LearnExcel đã viết:
May mắn là cuối cùng tôi đã tìm ra cách giải quyết
dùng Debug.Print Field.Name , vd kết quả Cust. ID thì cho là Cust #ID , sau đó SQL = "SELECT [CUST#ID] FROM 20061204.txt;"

Kết quả mỹ mãn!
Vậy thì xin chúc mừng.

Lê Văn Duyệt
 
Upvote 0
Em xin có ý kiến
Excel và access đều hỗ trợ ODBC provide vì vậy chúng ta có thể dùng thằng này để liên kết 2 ứng dụng(tuy ODBC đã cổ xưa lắm rồi)
Ví dụ ta sẽ viết mã từ excel để lấy dữ liệu của 1 bảng trong access(Điều này có về là hơi buồn cười vì ta có thể dùng thẳng VB6 để làm không cần dùng excel, nhưng một số trường hợp khá là hữu ích đấy)

Bạn đăng ký file access của mình trong Data source provide administrator
trong file excel bạn code đoạn mã sau
chuoikn = "DSN="tenDSN";UID=admin;PWD=;"
set ruadangyeu = ADODB.Connection
With ruadangyeu
.ConnectionString = chuoikn
.Mode = adModeReadWrite
.ConnectionTimeout = 200
.CursorLocation = adUseClient
.Open
End With
_____________________________________________
Bạn chú ý đùng đại từ trong bài viết cho thích hợp
Đào Việt Cường
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Chào A ĐVC không biết anh có wua webketoan ko? anh Lê Văn Duyệt đã post 1 1file warehouse rất tuyệt về liên kết excel và access. ? Nhân tiện không biết a LVD có thể cho xin các code để nhập liệu từ excel sẽ tự điền dữ liệu vào access đc kô vậy
 
Upvote 0
Web KT
Back
Top Bottom