-
Tự động Append Field vào ADO Recordset với Fields lấy từ một Table có sẳn
ongke0711 > 29-04-17, 01:56 AM
Chào các bạn,
Tôi đang thiết kế 1 form và muốn tạo In-memory ADO Recordset. Việc tạo ADO recordset và thêm từng Field vào rst này bằng câu lệnh như: ".Fields.Append "MSNV", adInteger, , adFldKeyColumn" thì làm được rồi Bây giờ tôi cần tự động lấy tên Field và DataType của Table nguồn nào đó sau đó tự động Append hàng loạt tên Field này vô ADO Rst luôn (khỏi phải ngồi viết từng dòng “.Fields.Append…” cho từng Field. (Hình minh họa bên dưới)
Trong file .mdb mẫu tôi đã có đoạn code lấy tên Field và Data Type của toàn bộ Fields trong tblHDLD_Luu nhưng code để Append tự động thì chưa làm được.
Các bạn có giải pháp nào thì hướng dẫn giùm nhé. Cảm ơn nhiều.
[/url][url=https://flic.kr/p/U4bANA]
Link file demo: http://www.mediafire.com/file/yl6ane2u9k...ADORst.mdb -
RE: Tự động Append Field vào ADO Recordset với Fields lấy từ một Table có sẳn
maidinhdan > 29-04-17, 02:42 AM
Chỉnh lại dòng này như sau
Mã PHP:.Fields.Append "SoHD", adVarChar, 10, adFldMayBeNull '->Bi loi kieu du lieu
Giải thích: 10 là tổng số ký tự, anh có thể quy ra không quá 255 Byte là ok. ( 1 bytes = 2^31 ký tự )
Như vậy:
Fileds SoHH: anh dự định điền HD2017-001 ( Có 10 ký tự) vậy hàm cmdLayTenField_Click ở dòng lỗi anh phải điền 10 ký tự.
Nhắc lại cú pháp
Fields.Append : là cú phápMã PHP:Fields.Append Name, Type, DefinedSize, Attrib, FieldValue
Name: Kiểu String, là tên cột cần tạo, khi tạo không cho tên giống nhau.
Type: chỉ định kiểu dữ liệu của trường mới, có giá trị mặc định là adEmpty,. Giá trị DataTypeEnum (Nhiều tham số quá, Xem Link này ), Các loại dữ liệu sau không được hỗ trợ bởi ADO và không nên được sử dụng khi nối các trường mới vào một đối tượng Recordset (ADO): adIDispatch, adIUnknown, adVariant.
DefinedSize: Không bắt buộc. Điền bằng số đại diện cho kích thước được xác định, bằng các ký tự hoặc byte của trường mới. Giá trị mặc định cho tham số này được lấy từ kiểu Type. Các trường có DefinedSize lớn hơn 255 byte được coi là các cột độ dài biến. Mặc định cho DefinedSize là không xác định, (Lưu ý riêng trên Access: Nếu Type là String ta phải định nghĩa số lượng ký tự có thể nhập vào và không lớn hơn 255Byte)
Attrib:Không bắt buộc. Giá trị FieldAttributeEnum, có giá trị mặc định là adFldDefault, xác định các thuộc tính cho trường mới. Nếu giá trị này không được chỉ định, trường sẽ chứa các thuộc tính bắt nguồn từ Kiểu Type.
FieldValue: Không bắt buộc. Một biến thể đại diện cho giá trị cho trường mới. Nếu không được chỉ định, trường được nối với một giá trị null.
Hy vọng giúp ít được anh. -
RE: Tự động Append Field vào ADO Recordset với Fields lấy từ một Table có sẳn
MTNQ > 29-04-17, 11:48 AM
(29-04-17, 01:56 AM)ongke0711 Đã viết: Chào các bạn,
Tôi đang thiết kế 1 form và muốn tạo In-memory ADO Recordset. Việc tạo ADO recordset và thêm từng Field vào rst này bằng câu lệnh như: ".Fields.Append "MSNV", adInteger, , adFldKeyColumn" thì làm được rồi Bây giờ tôi cần tự động lấy tên Field và DataType của Table nguồn nào đó sau đó tự động Append hàng loạt tên Field này vô ADO Rst luôn (khỏi phải ngồi viết từng dòng “.Fields.Append…” cho từng Field. (Hình minh họa bên dưới)
Của bác đây:
http://www.mediafire.com/file/keh0s7vb1g...DORst1.rar
Mã:Private Sub cmdTaoADORst_Click()
Dim objRecordset As Object
Dim rstHDLD_Luu As Object
Dim strSQL As String
Set objRecordset = CreateObject("ADODB.Recordset")
strSQL = "SELECT * FROM tblHDLD_Luu"
Set rstHDLD_Luu = OpenADORecordset(strSQL)
Set objRecordset = CreateRstADO(rstHDLD_Luu)
With objRecordset
.AddNew
.Fields(0) = 0
.Fields(1) = 99
.Fields(2) = Date
.Fields(3) = Date + 5
.Fields(4) = Date + 365
.Fields(5) = 1
.Fields(6) = 1
'.Fields(7) = "HD2017-001"
.Update
End With
Set Me.Recordset = objRecordset
rstHDLD_Luu.Close
Set rstHDLD_Luu = Nothing
End Sub
Các hàm liên quan:
Mã:Public Function OpenADORecordset(strSQL As String) As Object
Dim cnn As Object
Dim rst As Object
On Error GoTo ErrorHandler
Set cnn = CreateObject("ADODB.Connection")
Set cnn = CurrentProject.Connection
Set rst = CreateObject("ADODB.Recordset")
With rst
.Source = strSQL
.ActiveConnection = cnn
.CursorType = adOpenStatic
.LockType = adLockOptimistic
.CursorLocation = adUseClient
.Open
End With
Set OpenADORecordset = rst
Exit_ErrorHandler:
Set rst = Nothing
Set cnn = Nothing
Exit Function
ErrorHandler:
MsgBox "Error: " & Err.Number & Chr(13) & Err.Description, , "Error: OpenADORecordset"
Resume Exit_ErrorHandler
End Function
Function CreateRstADO(rstADO_Source As Object) As Object
Dim rstADO As Object
Dim fld As Object
On Error GoTo ErrorHandler
Set rstADO = CreateObject("ADODB.Recordset")
With rstADO
For Each fld In rstADO_Source.Fields
.Fields.Append fld.Name, fld.Type, fld.DefinedSize, fld.Attributes
Next
.CursorType = adOpenKeyset
.CursorLocation = adUseClient
.LockType = adLockOptimistic
.Open
End With
Set CreateRstADO = rstADO
Exit_ErrorHandler:
Set rstADO = Nothing
Exit Function
ErrorHandler:
MsgBox "Error: " & Err.Number & Chr(13) & Err.Description, , "Error: CreateRstADO"
Resume Exit_ErrorHandler
End Function
Module này MTNQ sưu tầm dùng cho Late binding : (Click to View) -
RE: Tự động Append Field vào ADO Recordset với Fields lấy từ một Table có sẳn
ongke0711 > 29-04-17, 08:26 PM
Thiệt là hay quá bạn MTNQ. Tôi mới lò dò ngâm cứu vụ ADO này nên chưa biết hết các lệnh của nó, cứ lay hoay hoài làm không ra
. Thật là nhẹ cả người.