Kết nối SQL server với Access

Thảo luận trong 'Access và VBA' bắt đầu bởi phatnq2002, 29/2/08.

  1. behattieu

    behattieu Member Hội viên mới

    Ðề: Kết nối SQL server với Access

    Bác ơi, nó xuất thẳng được ra Excel đấy. Trước em có thấy rồi nhưng lâu không sờ vào nên quên mất. Nó kết nối bằng DAO rồi dùng phưong thức Copyobject thì phải.
    Em nghĩ kết nối DAO và ADO thì không ảnh hưởng đến việc xuất dữ liệu vì ta đều gán rs vào recordset hết
    -----------------------------------------------------------------------------------------
    Xuất được ra excell mà không cần tạo ra table hoặc query mà bác. Nó dùng câu lệnh: rs.copyfromrecordset.
    Tuy nhiên em chưa gắn được nó vào:

    Private Sub Form_Load()
    set me.form.recordset = MyRecordset("select * from table1")
    End Sub

    Private Sub ExportExcel_Click()
    ==> 'Xuất ra excell và lấy recordset giống cái phần load của form
    End Sub
     
    Chỉnh sửa cuối: 29/8/08
  2. phatnq2002

    phatnq2002 Tích cực giảm cân... Hội viên mới

    Ðề: Kết nối SQL server với Access

    Thú thật với bạn là tôi tìm cái phương thức CopyFromRecordset này đỏ con mắt luôn, dù tôi khai báo rs theo DAO và theo ADODB. Không lẽ bạn dùng phiên bản cao hơn tôi chăng, tôi đang sử dụng 2003 à. Nên thư viện ADO ở đây chỉ cỡ 2.7 là maximum.

    Bạn cho biết cái phương thức CopyFromRecordset này ở phiên bảnna2o để tôi học hỏi thêm. Cảm ơn.
     
  3. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

    Ðề: Kết nối SQL server với Access

    Chắc phải mở Excel lên rồi đọc từng dòng trong rs mà ghi vào rồi cho save lại.
     
  4. behattieu

    behattieu Member Hội viên mới

    Ðề: Kết nối SQL server với Access

    Đây là đoạn code em đang dùng, chạy ngon lành (kể cả việc đính function vào câu lệnh SQL)
    Function tonghoptoexcel()
    Dim xlApp As Excel.Application
    Dim xlSheet As Excel.Worksheet
    Dim xlWorkbook As Excel.Workbook

    Dim acQuery As QueryDef
    Dim rs As Recordset
    Dim strQueryName As String
    Dim strSearch As String
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = True
    'Set xlWorkbook = xlApp.Workbooks.Add
    Set xlWorkbook = xlApp.Workbooks.Open(CurrentProject.Path & "\book1.xls")



    sql = "SELECT tbl_quatrinhcongtac.MLD,[Hotendem] & ' ' & [ten] AS Hovaten , sum(fncsothang([tunam],[dennam],# " & Format(Me.txttungay, "mm/dd/yyyy") & " #,# " & Format(Me.txtdenngay, "mm/dd/yyyy") & "#)) AS sothang FROM tbl_quatrinhcongtac INNER JOIN tbl_hosocanhan ON tbl_quatrinhcongtac.MLD = tbl_hosocanhan.MLD group by tbl_quatrinhcongtac.MLD, [Hotendem] & ' ' & [ten] ORDER BY tbl_quatrinhcongtac.MLD ;"

    ketnoi (sql)

    Set xlSheet = xlWorkbook.Sheets(1)


    With xlSheet

    .Range("A1").CopyFromRecordset ketnoi(sql)

    End With



    Set xlSheet = Nothing
    Set xlWorkbook = Nothing
    Set xlApp = Nothing

    Cái này tiện lắm, có lẽ là 1 trong những cái hay nhất em thấy
    PS: Máy của em còn có cả 2.8 cơ mà cũng chỉ là access 2003 thôi. Nhưng em test thử thấy 2.1 cũng chạy mà
     
    Chỉnh sửa cuối: 1/9/08
  5. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

    Ðề: Kết nối SQL server với Access

    Ặc.
    Cái Copy From Recorset là của Excel mà.
     
  6. behattieu

    behattieu Member Hội viên mới

    Ðề: Kết nối SQL server với Access

    Ặc ặc, nó đâu phải của excel. Nó chỉ thao tác đối với đối tượng excel thôi
    Bác có thấy nó đâu cần tạo ra 1 table hoặc query nào đâu.
     
  7. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

    Ðề: Kết nối SQL server với Access

    Không phải thì chặt đầu tui đi.

    Cãi với chú phát mệt.

    Đại khái là trong Word, Excel hay Access,Foxpro có thể gọi 1 application ở 1 kênh (chanel) riêng và truyền tham số vào cho application đó.
    Thường thì tham số truyền xuống là các lệnh (method) mà ứng dụng đó hiểu và thực hiện được.
    Điều đó nghĩa là phải truyền lệnh giống như ta mở ứng dụng đó lên và gõ trực tiếp vậy.

    Vậy nếu application là Excel thì phải truyền lệnh Excel, đúng cú pháp, object mà Excel hiểu.
    Ví dụ CopyFromRecordset là method của đối tượng Range trong Excel.

    CopyFromRecordset Method
    Copies the contents of an ADO or DAO Recordset object onto a worksheet, beginning at the upper-left corner of the specified range. If the Recordset object contains fields with OLE objects in them, this method fails.

    expression.CopyFromRecordset(Data, MaxRows, MaxColumns)
    expression Required. An expression that returns a Range object.
    Data Required Variant. The Recordset object to copy into the range.
    MaxRows Optional Variant. The maximum number of records to copy onto the worksheet. If this argument is omitted, all the records in the Recordset object are copied.
    MaxColumns Optional Variant. The maximum number of fields to copy onto the worksheet. If this argument is omitted, all the fields in the Recordset object are copied.

    Remarks
    Copying begins at the current row of the Recordset object. After copying is completed, the EOF property of the Recordset object is True.
    Example
    This example copies the field names from a DAO Recordset object into the first row of a worksheet and formats the names as bold. The example then copies the recordset onto the worksheet, beginning at cell A2.
    For iCols = 0 to rs.Fields.Count - 1
    ws.Cells(1, iCols + 1).Value = rs.Fields(iCols).Name
    Next
    ws.Range(ws.Cells(1, 1), _
    ws.Cells(1, rs.Fields.Count)).Font.Bold = True
    ws.Range("A2").CopyFromRecordset rs

    --------
    Vấn đề là nếu vẫn nắm giữ recordset của DAO thì connection vẫn phải mở.
    Vẫn phải lấy từ đó chứ không phải lấy từ form.

    Câu hỏi ban đầu của bạn là:

    Lúc này MyRecordset("select * from table1") đã đóng lại hay chưa?


    Thì đây nè:
    ...
    Set xlWorkbook = xlApp.Workbooks.Open(CurrentProject.Path & "\book1.xls")

    ....
    Set xlSheet = xlWorkbook.Sheets(1)

    ....
    .Range("A1").CopyFromRecordset ketnoi(sql)
    ....

    Có phải là mở book1.xls có sẵn trên dĩa, vào sheet đầu tiên rồi vào Range("A1") không?
    Gọi CopyFromRecordset mà không gắn nó vào Range thì làm sao Excel hiểu?
    Gọi application nào thì phải am hiểu về application đó thì mới thực hiện được.

    Cũng như gọi: MyRecordset("select * from table1") thì cái trong ngoặc kép phải đúng cú pháp SQL thì SQL mới hiểu. Bỏ vài hàm của Access vào trong ngoặc kép đó thì làm sao mà SQL hiểu được.
     
  8. behattieu

    behattieu Member Hội viên mới

    Ðề: Kết nối SQL server với Access

    Bác nói đúng, nó là của excel.
    Còn cái của em thì khi nào xuất sang excel thì em mới cho kết nối lại chứ.
     
  9. phatnq2002

    phatnq2002 Tích cực giảm cân... Hội viên mới

    Ðề: Kết nối SQL server với Access

    Quả là "cao thủ", đang ở VBA của Access bỗng dưng bay thẳng qua VBA của Excel thế nên Phờ tui trở nên "phờ phạc" để tìm method.

    Bạn behattieu ơi, bạn lưu ý giúp là bạn đang ở thread nào nhé.

    Mỗi data object trong các VBA của mỗi application nó khác nhau, không giống nhau lắm đâu bạn.
     
  10. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

    Nếu cần thì connect lại, nếu không thì lấy luôn cái recordset mà trên form đã có.
    Dùng RecordsetClone.


    Lưu ý là Excel không mạnh trong xử lý data.
    Cho nên dùng CopyFromRecordset chưa chắc đã nhanh bằng cho Access xử lý đọc dọc theo Recordset và gán giá trị vào Cell của Excel.
    Phải thử trên data lớn để rút ra nhận xét.


    Bó tay!
    Như thế nào gọi là đính function vào nhỉ???? :confuse1:
    Cái ở trên rõ ràng là phải xử lý ở Access sao cho chuỗi SQL là 1 dạng mà SQL đọc hiểu được trước khi truyền chuỗi đó vào cho DAO thực hiện.
     
  11. behattieu

    behattieu Member Hội viên mới

    Ðề: Kết nối SQL server với Access

    To bac Phat: Xin lỗi bác vì đã làm bác mất công. Thực ra từ trước em vẫn nghĩ nó là của access. Sau khi bác muontennguoi viet em mới kiểm tra lại bằng cách cho nó thực thi với word thì không được nên dùng phương pháp loại trừ ==> của excel :));
    To bac muontennguoi: Đoạn SQL này có gắn function mà, bác chưa xem kỹ thôi:
    sum(fncsothang([tunam],[dennam],# " & Format(Me.txttungay, "mm/dd/yyyy") & " #,# " & Format(Me.txtdenngay, "mm/dd/yyyy") & "#)) AS sothang
    em có 1 function dùng để xử lý ngày tháng tính thâm niên riêng (tuy nhiên chưa ổn lắm), nó chính là fncsothang đấy bác
    Public fncsothang(a, b, c, d ) as string
    ........
    .....
    End function
    PS: Các bác rành về Grid mở một mục mới đi. Em đang nghiên cứu nhưng tài liệu hơi ít. Các bác ủng hộ nhé
     
  12. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

    Ðề: Kết nối SQL server với Access

    Ờ đúng là tôi đọc không kỹ.

    Còn cái Function đó chắc là phải nằm trong *.mdb và khi connect thì phải gọi driver của Access thì nó mới hiểu.

    Nếu như tổ chức CSDL tốt thì luôn có thể truy vấn bằng ngôn ngữ SQL chuẩn.
    Khi đó không ngại gì cả khi phải thay đổi hệ quản trị CSDL.

    Nếu muốn dùng SQL server thì cũng phải khai báo Function y như Access vậy thôi.
    SQL Server cũng chỉ là 1 phần mềm quản trị CSDL y như Access hay Foxpro vậy thôi.
    Access đã nhúng ngôn ngữ SQL vào bên trong nó.
    SQL Server đã nhúng ngôn ngữ SQL vào bên trong nó.
    Foxpro đã nhúng ngôn ngữ SQL vào bên trong nó.
    Như vậy 1 lệnh SQL chuẩn sẽ luôn dùng được trong mọi hệ quản trị CSDL.


    Còn cái grid vốn dĩ không phải là thế mạnh của 1 phần mềm CSDL.
     
  13. behattieu

    behattieu Member Hội viên mới

    Ðề: Kết nối SQL server với Access

    Với cơ sở dữ liệu thế này bác thử xem nên làm thế nào để chương trình hoạt động hiệu quả:
    -tbl_quatrinhcongtac:MLD,Tunam,Dennam,QTCT,HSL (Dennam co thể Null vì chưa xác định thời điểm cuối cùng để chốt, với giá trị Dennam là Null ta có thể gán bằng tháng/năm của hệ thống hoặc bằng 1 textbox trên form).
    -Đặt điều kiện lọc cho dữ liệu trong khoảng txttungayloc đến txtdenngayloc
    KQ: Tính tổng thâm niên theo các điều kiện trên.
    Yêu câù: Kết nối ADO.
    PS: Em thấy mói cái VSFlex8 rất mạnh, bác đã dùng nó bao giờ chưa?
     
  14. muontennguoi

    muontennguoi Member Thành viên BQT Super Moderators

    Ðề: Kết nối SQL server với Access

    Sao mà lộn xộn năm hay tháng hay ngày vậy?
    CHốt lại cái cụp giùm xem: tunam, dennam là kiểu gì? Năm, tháng hay ngày?
    Dữ liệu lưu là năm mà biểu lọc theo ngày thì làm sao mà lọc.
     
  15. behattieu

    behattieu Member Hội viên mới

    Last edited by a moderator: 14/9/08
  16. thuydhpy

    thuydhpy Member Hội viên mới

    Ðề: Kết nối SQL server với Access

    Anh Phatnq2002 "rảnh" chưa? anh viết tiếp loạt bài về vấn đề này đi. Nếu có tài liệu tiếng Anh hoặc Việt anh gửi link cho tụi em ngâm cứu với! Chúc anh khỏe để mãi là tổng đài 108 của các mem Access.
     
  17. phatnq2002

    phatnq2002 Tích cực giảm cân... Hội viên mới

    Ðề: Kết nối SQL server với Access

    Sorry các bạn, vì ở bài trước tôi có nói là sẽ tiếp tục các bài viết hướng dẫn. Tuy nhiên "mưu sự tại nhân, thành sự tại thiên", hiện tại tôi được điều động sang bộ phận dự án nên rất bận rộn, ít có thời gian để chú tâm viết bài tiếp tục.

    Thỉnh thoảng, vừa làm vừa ghé vào DKT để xem chừng nhà được giao giữ mà thôi, hoặc chỉ có thể trả lời nhanh cho các bạn.

    Do vậy, mong các cao thủ hỗ trợ cho Phật tôi đôi chút bằng việc tiếp nối loạt bài dang dở mà tôi đang thực hiện. Xin các cao thủ đừng nghĩ sai về ý định của tôi, các vị có toàn quyền biến hóa, xuất chiêu theo ý của mình. Điều cốt yếu là anh em thành viên của DKT có được những tài nguyên quý giá mà các bạn chia sẻ.

    Bác mượn, bác lehongduc, và các bác khác hỗ trợ tôi nhé.

    Cảm ơn các bạn.
     
  18. haocaocu

    haocaocu Member Hội viên mới

    Ðề: Kết nối SQL server với Access

    Tôi có 01 file database là access nhưng chỉ dùng có 01 người.Các cao thủ cho biết làm thế nào để đẩy nó vào database SQL (càng cụ thể càng tốt). Xin cảm ơn!
     
  19. trieule

    trieule New Member Hội viên mới

    Ðề: Kết nối SQL server với Access

    Cty tôi đang sd thằng ac2003 để kết nối data từ server share full. các máy con connect vào sd data share để xử lý dữ liệu. Hiện đang chạy tốt. Nhung8 do nhu cầu sd data lớn. nên chuyển qua sql server 2000. Nhưng các form dạng main/sub không load được dữ liệu.Mong chj jup
     
  20. phatnq2002

    phatnq2002 Tích cực giảm cân... Hội viên mới

    Ðề: Kết nối SQL server với Access

    Mục đích của các làm này là giữ nguyên cái file mdb cũ để lưu trữ, để có gì thì xài lại cái cũ: :D

    Tạo một database mới trong SQL Server.
    Dùng EM của SQL Server làm thao tác import data từ Access và database mới này.
    Sau đó vào Access, tạo một file adp mới: File - New - Project using existing data.
    Tiến hành cho connect với file database đã tạo -> trang Tables của file adp sẽ hiển thị các table của database là OK.
    Tiếp theo là import các form, report, module của file mdb cũ vào file adp để sử dụng.

    Lưu ý:
    Trong code chỗ nào dùng CurrentDB thì phải đổi lại là CurrentProject.
    Khi dùng Recordset thì phải ghi rõ là DAO.Recordset hay ADO.Recordset, vì mặc định sẽ dùng thư viện ADO. Mà thuộc tính và phương thức của 2 thư viện này có khác biệt.
    Query tạo trong mdb có thể không import được vào database SQL server do cú pháp không tương thích. Do vậy nếu cần phải tạo view lại.

    Ngoài ra, có thể sử dụng công cụ Upsizing Wizard của Access để "nâng" data lên SQL Server database: menu Tools - Database Utilities - Upsizing Wizard. Vào đó làm theo hướng dẫn.
     

Chia sẻ trang này

XenForo Add-ons by Brivium ™ © 2012-2013 Brivium LLC.