• [Demo p1] Import/Export Excel + Hàm Liệt tên ALL Access
  • RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access

    mrsiro > 19-11-18, 09:13 AM

    Chào bạn ongke, mình dùng vòng lặp thêm recordset theo kiểu
    Mã:
    DAOrecordset!field(1) = ADOrecordset!field(1)
    thì thấy có vẻ nhanh hơn sử dụng
    Mã:
    docmd.runsql "insert into Localtable(field1) values(field1 = ADOrecordset!field1)"
  • RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access

    ongke0711 > 19-11-18, 12:17 PM

    (19-11-18, 09:13 AM)mrsiro Đã viết: Chào bạn ongke, mình dùng vòng lặp thêm recordset theo kiểu
    Mã:
    DAOrecordset!field(1) = ADOrecordset!field(1)
    thì thấy có vẻ nhanh hơn sử dụng
    Mã:
    docmd.runsql "insert into Localtable(field1) values(field1 = ADOrecordset!field1)"

    Bạn nên dùng hàm API GetTickCount của Windows để test thì rõ hơn.
    Riêng đối với RunSQL thì tốc độ nó theo thứ tự như thế này:
    Docmd.RunSQL --> CurrentDb.Execute --> DBEngine.Execute
    Trong đó DBEngine(0)(0).Execute là nhanh nhất.
    RunSQL nó chậm hơn vì nó phải xử lý thông qua một lớp Query nữa để lấy các tham số trên Form v.v.. rồi mới đưa lệnh vô cho JET engin xử lý nên sẽ chậm hơn .Execute
  • RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access

    mrsiro > 19-11-18, 03:46 PM

    Cám ơn bạn ongke, mình lại có thêm 1 kinh nghiệm bổ ích rồi. Trước giờ toàn dùng docmd.runsql.
    Vậy với trường hợp trên thì dùng :
    Mã:
    DAOrecordset!field(1) = ADOrecordset!field(1)
    Hay dùng:
    Mã:
    CurrentDb.Execute "insert into Localtable(field1) values(field1 = ADOrecordset!field1)"
    Cái nào tối ưu hơn.
  • RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access

    ongke0711 > 19-11-18, 09:21 PM

    - Đối với  "Insert Into...",  thì mỗi lần chạy Insert nó sẽ mở / đóng table. Do đó nếu dùng dạng vòng lặp để thêm từng record thì kiểu này không hiệu quả (nhanh) bằng AddNew của Recordset.
    - Insert into...: dùng tốt nhất khi thêm hàng loạt records vào table. Nó sẽ nhanh hơn AddNew.
    Đối với ADO Recordset thì chỉ có cách loop từng record và Addnew vào table chứ không có cách Insert hàng loạt record.
  • RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access

    hoabattu3387 > 20-11-18, 04:42 PM

    (19-11-18, 09:21 PM)ongke0711 Đã viết: - Đối với  "Insert Into...",  thì mỗi lần chạy Insert nó sẽ mở / đóng table. Do đó nếu dùng dạng vòng lặp để thêm từng record thì kiểu này không hiệu quả (nhanh) bằng AddNew của Recordset.
    - Insert into...: dùng tốt nhất khi thêm hàng loạt records vào table. Nó sẽ nhanh hơn AddNew.
    Đối với ADO Recordset thì chỉ có cách loop từng record và Addnew vào table chứ không có cách Insert hàng loạt record.
     cho mình hỏi chút: 
    1. trong câu lệnh db.Execute "DELETE * FROM " & sTableImportTemp, dbFailOnError khi nào cần thêm dbfailonerror? 
    2. các giá trị của cursortype, locktype, option sử dụng như nào khi open recordset ạ? locktype trường hợp này bạn Dân chọn là adLockBatchOptimistic để có thể update batch đúng không ạ? còn các trường hợp khác thì sao ạ? mong các bạn chỉ giáo.
  • RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access

    ongke0711 > 21-11-18, 11:22 AM

    (20-11-18, 04:42 PM)hoabattu3387 Đã viết:  cho mình hỏi chút: 
    1. trong câu lệnh db.Execute "DELETE * FROM " & sTableImportTemp, dbFailOnError khi nào cần thêm dbfailonerror? 
    2. các giá trị của cursortype, locktype, option sử dụng như nào khi open recordset ạ? locktype trường hợp này bạn Dân chọn là adLockBatchOptimistic để có thể update batch đúng không ạ? còn các trường hợp khác thì sao ạ? mong các bạn chỉ giáo.

    1. Tham số dbFailOnError: khi có tham số này thì khi code chạy, nếu có phát sinh lỗi thì nó sẽ trả dữ liệu xử lý về hiện trạng ban đầu (khi chưa chạy code) , tránh dữ liệu bị cập nhật nữa vời.

    2. Khi dùng UpdateBatch thì buộc phải mở Table dữ liệu ở trạng thái "adLockBatchOptimistic" để có thể update hàng loạt.
    Còn về Cursor và Lock bạn ngâm cứu lý thuyết của thư viện ADODB nhé. Làm biếng dịch vì nó nhiều quá. 007
    - Bài này của bạn Dân có giới thiệu về ADO đây: http://thuthuataccess.com/forum/thread-9259.html
    - Link của MS: https://docs.microsoft.com/en-us/sql/ado...erver-2017
  • RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access

    mrsiro > 21-11-18, 03:47 PM

    Đối với trường hợp lấy recordset trên sqlserver về rồi add vô bảng access thì làm sao sử dụng cái rollback về hiện trạng ban đầu khi bị lỗi vậy bạn.

    Ví dụ đang chạy vòng lặp thêm 1000 record vào table access, chạy được 500 record thì mất kết nối mạng. Vậy rollback lại tình trạng ban đầu của table access thì làm thế nào.
  • RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access

    ongke0711 > 21-11-18, 04:43 PM

    (21-11-18, 03:47 PM)mrsiro Đã viết: Đối với trường hợp lấy recordset trên sqlserver về rồi add vô bảng access thì làm sao sử dụng cái rollback về hiện trạng ban đầu khi bị lỗi vậy bạn.

    Ví dụ đang chạy vòng lặp thêm 1000 record vào table access, chạy được 500 record thì mất kết nối mạng. Vậy rollback lại tình trạng ban đầu của table access thì làm thế nào.

    ADO recordset nó nằm trên memory rồi thì không bị ảnh hưởng bởi kết nối mạng nhé. Nếu bị lỗi bộ nhớ thì có khả năng xảy ra. Bạn ngâm cứu cái DBEngin.CommitTran nhé.
  • RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access

    hoabattu3387 > 22-11-18, 12:54 PM

    (21-11-18, 11:22 AM)ongke0711 Đã viết: [quote="hoabattu3387" pid='40870' dateline='1542703341']
    - Link của MS: https://docs.microsoft.com/en-us/sql/ado...erver-2017

    Nhờ bạn giải thích giúp đoạn này: 
    The typical default cursor type, called a forward-only (or non-scrollable) cursor, can move only forward through the result set. A forward-only cursor does not support scrolling (the ability to move forward and backward in the result set); it only supports fetching rows from the start to the end of the result set. With some forward-only cursors (such as with the SQL Server cursor library), all insert, update, and delete statements made by the current user (or committed by other users) that affect rows in the result set are visible as the rows are fetched. Because the cursor cannot be scrolled backward, however, changes made to rows in the database after the row was fetched are not visible through the cursor. 
    “Result set” ơ đây là nói về việc thiết lập kết quả của open recordset? Con trỏ này chỉ có thể đi chuyển về phía trc là sao bạn?
  • RE: Demo Import/Export Excel + Hàm Liệt tên ALL Access

    maidinhdan > 22-11-18, 05:24 PM

    Câu số 1
    (21-11-18, 03:47 PM)mrsiro Đã viết: Đối với trường hợp lấy recordset trên sqlserver về rồi add vô bảng access thì làm sao sử dụng cái rollback về hiện trạng ban đầu khi bị lỗi vậy bạn.
    Ví dụ đang chạy vòng lặp thêm 1000 record vào table access, chạy được 500 record thì mất kết nối mạng. Vậy rollback lại tình trạng ban đầu của table access thì làm thế nào.

    Trả lời : Cách dùng Rollback, có 2 hướng: 1 là dùng DAO, 2 là dùng ADO

    * Với DAO thì dùng như sau:
    Mã PHP:
    Function BeginTransDAO()
    On Error GoTo Loi

            Dim wrk 
    As DAO.Workspace
            Dim dbX 
    As DAO.Database
            Set dbX 
    wrk.OpenDatabase("e:\File Access.mdb")

           
           
    'Bắt đầu tạo điểm khôi phục transaction
            wrk.BeginTrans
            
            '
    Chèn các câu lệnh ThêmSửaXóa....
            dbx.Execute "INSERT INTO ............................."
            
            
    'Commit the transaction
            wrk.CommitTrans dbForceOSFlush
            
    ThoatLoi:
            '
    Clean up
            wrk
    .Close

            Set dbX 
    Nothing
            Set wrk 
    Nothing
            
    Exit Function
    Loi:
            'Khôi phục trạng thái ban đầu
            wrk.Rollback
            Resume ThoatLoi
    End Function 

    * Với ADOthì dùng như sau:
    Mã PHP:
    Function BeginTransADO()
        On Error GoTo Loi

        
    'Dat ten bien
        Dim Cnn As ADODB.Connection
        Dim rst As ADODB.Recordset
        ' 
    Mo ket noi ADO den file Access
        Set Cnn 
    = New ADODB.Connection
        Set rst 
    = New ADODB.Recordset
        SQL
    "SELECT * FROM tblTest"

        rst.Open SQLcnnadOpenDynamicadLockPessimisticadCmdTable

        
    'Bắt đầu tạo điểm khôi phục transaction         
        Cnn.BeginTrans

        '
    Chèn các câu lệnh ThêmSửaXóa....
        ' Ví dụ duyệt qua các mẫu tin và set cột đầu tiên lại bằng 1 hết
        rst.MoveFirst

        Do Until rst.EOF
                rst.Fields(0) = 1
                rst.Update
            rst.MoveNext
        Loop

        ' 
    Xac nhan co muon Luu khong
        
    If MsgBox("Save all changes?"vbYesNo) = vbYes Then
            Cnn
    .CommitTrans    'Hoan thanh lenh
        Else
            Cnn.RollbackTrans  '
    Khoi phuc
        End 
    If
    ThoatLoi:
            'Clean up
        rst.Close
        Cnn.Close
        Set rst = Nothing
        Set Cnn = Nothing
            Exit Function
            
    Loi:
            '
    Khôi phục lại điểm transaction
            Cnn
    .RollbackTrans
            Resume ThoatLoi
    End 
    Function 

    Câu số 2:
    (22-11-18, 12:54 PM)hoabattu3387 Đã viết: Nhờ bạn giải thích giúp đoạn này: 
    The typical default cursor type, called a forward-only (or non-scrollable) cursor, can move only forward through the result set. A forward-only cursor does not support scrolling (the ability to move forward and backward in the result set); it only supports fetching rows from the start to the end of the result set. With some forward-only cursors (such as with the SQL Server cursor library), all insert, update, and delete statements made by the current user (or committed by other users) that affect rows in the result set are visible as the rows are fetched. Because the cursor cannot be scrolled backward, however, changes made to rows in the database after the row was fetched are not visible through the cursor. 
    “Result set” ơ đây là nói về việc thiết lập kết quả của open recordset? Con trỏ này chỉ có thể đi chuyển về phía trc là sao bạn?
    Đoạn này muốn nói về kiểu truy xuất dữ liệu qua ADO không dùng con trỏ.
    Mặc định là kiểu: Forward-Only với tham số của nó là adOpenForwardOnly : Không dùng con trỏ - ta chỉ có thể chuyển về phía trước trong Recordset, sử dụng phương thức MovePrevious và MoveFirst sẽ sinh lỗi.


    Sơ lược về Truy xuất dữ liệu sử dụng công nghệ ADO : Làm việc với con trỏ
    * ADO hỗ trợ một số kiểu con trỏ. Ngoài việc cung cấp hỗ trợ duyệt qua từng mẩu tin tại một thời điểm, các kiểu con trỏ khác nhau cho phép ta điều khiển cách quản lý của một Recordset
    - Các kiểu con trỏ của đối tượng connection: 2 kiểu
       + Tạo con trỏ phía Client;
       + Tạo con trỏ phía Server
    Mục đích: Chọn con trỏ Client nghĩa là ADO và OLEDB xử lý các hoạt động của con trỏ. Con trỏ kiểu Client không có sẵn trên Server. Trong ADO ta có thể tạo một Recordset không kết nối, cho phép ta thao tác với các mẩu tin mà không có kết nối thường xuyên đến Server. Khả năng này là một chức năng của thư viện con trỏ phía Client

    - Các kiểu con trỏ của đối tượng Recordset: gồm 4 kiểu
    1. Forward-Only (adOpenForwardOnly):  Không dùng con trỏ - ta chỉ có thể chuyển về phía trước trong Recordset, sử dụng phương thức MovePrevious và MoveFirst sẽ sinh lỗi
    2. Keyset(trong DAO được gọi là Dynaset) (adOpenKeyset): Ta không thể thấy các mẩu tin mới do người sử dụng khác thêm và, nhưng khi họ sửa đổi, hay xoá mẩu tin sẽ ảnh hưởng đến Recordset ta đang làm việc; đây là kiểu con trỏ hiệu quả nhất, đặc biệt là khi Recordset khá lớn
    3. Dynamic(adOpenDynamic): Ta có thể thấy toàn bộ thay đổi trên dữ liệu do người sử dụng khác thực hiện trong khi ta đang mở Recordset; đây là kiểu con trỏ ít hiệu quả nhất, nhưng mạnh mẽ
    4. Static (trong DAO gọi là snap-short) (adOpenStatic): Bản sao của toàn bộ dữ liệu của một Recordset; kiểu này đặc biệt hữu dụng khi ta đang tìm kiếm dữ liệu hay ta đang thi hành báo cáo; kiểu con trỏ này rất hữu dụng cho những Recordset nhỏ.

    Mục đích: Mỗi kiểu con trỏ điều có những ưu điểm riêng của nó tùy vào ngữ cảnh mà bạn muốn xử lý. Ví như lý do nếu ta chỉ hiển thị dữ liệu thì chọn con trỏ Forward-Only thay vì các kiểu con trỏ khác vì  sẽ nhanh hơn.

    Đính kèm chi tiết tài liệu để bạn tham khảo: Chú ý xem trang 17-18

    Có gì thiếu sót các Anh/Chị khác bổ sung thêm.