• Tự động Append Field vào ADO Recordset với Fields lấy từ một Table có sẳn
  • 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)

    [Hình: 34193831661_60a28d3981_z.jpg]

    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][Hình: 34166569622_60cdf991fc_o.png]

    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"adVarChar10adFldMayBeNull '->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
    Mã PHP:
    Fields.Append NameTypeDefinedSizeAttribFieldValue 
    Fields.Append : là cú pháp
    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  Thumbs_up Thumbs_up  . 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 007 . Thật là nhẹ cả người.