Bài tập về ADO căn bản.

Liên hệ QC
Mình thấy mỗi lần viết code dùng đến ADO thì cứ viết mấy dòng code giống nhau nên mình nghĩ có thể viết 1 hàm này để mở kết nối

Khi hàm này nằm trong file thì hoạt động tốt, nhưng khi lưu hàm này thành 1 addin riêng biệt thì hàm không hoạt động.
Các anh chị vui lòng giải thích giúp tại sao và làm sao khắc phục điều này.

Vụ này tôi không biết giải thích, nhưng Hải thử viết module và chọn lựa viết Macro trong "Personal Macro workbook" xem sao.

Ghi chú:
Personal macro workbook là 1 workbook mở đồng thời với Excel tương tự Add-in và template.

Ngoài ra tôi nghĩ rằng nếu gọi hàm từ workbook khác có lẽ phải gọi cả tên workbook chứa hàm? (Chưa thử)
 
Lần chỉnh sửa cuối:
Mình thấy mỗi lần viết code dùng đến ADO thì cứ viết mấy dòng code giống nhau nên mình nghĩ có thể viết 1 hàm này để mở kết nối
PHP:
Public Function MoketNoi(path As String, Optional ByVal Headers As Boolean = True) As Object
    Dim strConn As String, objConn As Object
    Set objConn = CreateObject("ADODB.Connection")
    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
              "Data Source=" & path & ";" & _
              "Extended Properties=""Excel 8.0;HDR=" & _
              IIf(Headers, "Yes", "No") & """"
    objConn.Open strConn
    Set MoketNoi = objConn
End Function
Khi hàm này nằm trong file thì hoạt động tốt, nhưng khi lưu hàm này thành 1 addin riêng biệt thì hàm không hoạt động.
Các anh chị vui lòng giải thích giúp tại sao và làm sao khắc phục điều này.

Hàm này chưa tổng quát để thực hiện được với những câu lệnh khác.
 
Hàm này chưa tổng quát để thực hiện được với những câu lệnh khác.
Ui da, HLMT trả lời vậy thì mình pó tay rồi. Trước mắt mình cần biết tại sao hàm nằm trong file thì chạy, nhưng lưu thành addin không xài được. Còn chuyện tổng quát từ từ tính sau.
Mục tiêu của mình là khi dùng ADO không phải viết lại những câu lệnh này nữa, file nào cũng có thể mở kết nối thông qua hàm này.
 
Ui da, HLMT trả lời vậy thì mình pó tay rồi. Trước mắt mình cần biết tại sao hàm nằm trong file thì chạy, nhưng lưu thành addin không xài được. Còn chuyện tổng quát từ từ tính sau.
Mục tiêu của mình là khi dùng ADO không phải viết lại những câu lệnh này nữa, file nào cũng có thể mở kết nối thông qua hàm này.

Ngay cả hàm bình thường như hàm đọc số, hàm tính bình phương, ... trong add-in cũng không gọi được từ file khác.

Ở trên tôi có viết là hãy thử trong Personal macro workbook, nhưng xin lỗi, khi tôi thử cũng không gọi được.
 
Ui da, HLMT trả lời vậy thì mình pó tay rồi. Trước mắt mình cần biết tại sao hàm nằm trong file thì chạy, nhưng lưu thành addin không xài được. Còn chuyện tổng quát từ từ tính sau.
Mục tiêu của mình là khi dùng ADO không phải viết lại những câu lệnh này nữa, file nào cũng có thể mở kết nối thông qua hàm này.
Thì có những câu lệnh nằm "trong file" cũng có chạy được đâu.
 
Ngay cả hàm bình thường như hàm đọc số, hàm tính bình phương, ... trong add-in cũng không gọi được từ file khác.

Ở trên tôi có viết là hãy thử trong Personal macro workbook, nhưng xin lỗi, khi tôi thử cũng không gọi được.

Vậy là ý tưởng đơn giản hóa cho việc viết code dùng Ado của em bị phá sản rồi. Nhưng em cũng là có ý tưởng tích cực.
Thì có những câu lệnh nằm "trong file" cũng có chạy được đâu.
Đây là file mình test thì hàm chạy được
 

File đính kèm

  • MoKetNoi_Test.rar
    15.7 KB · Đọc: 29
Lần chỉnh sửa cuối:
Vậy là ý tưởng đơn giản hóa cho việc viết code dùng Ado của em bị phá sản rồi. Nhưng em cũng là có ý tưởng tích cực.

Đây là file mình test thì hàm chạy được
Với câu lệnh này thì không cần khởi tạo (Set REC = CreateObject("ADODB.Recordset")) ==> Nếu dùng cách không khởi tạo sẽ phát sinh lỗi.
 
Với câu lệnh này thì không cần khởi tạo (Set REC = CreateObject("ADODB.Recordset")) ==> Nếu dùng cách không khởi tạo sẽ phát sinh lỗi.

Đọc tới đọc lui vẫn không suy ra được ý nghĩa của lời giải thích này. Kỳ quá hà.
Không cần khởi tạo vậy khởi tạo là thừa, nhưng nếu không khởi tạo thì có lỗi >>> Vậy là sao?
 
ADO có ngầm chứa từ "ActiveX". Nó là một công cụ nguy hiểm. Khi nói "nguy hiểm", không phải tôi bàn không nên dùng, chỉ nhấn mạnh không nên dùng bừa bãi.

Những công cụ nguy hiểm không ai cho vào Personal hay Add-ín cả. Bình thường người ta cô lập chúng vào một vài modules đặc biệt và export ra một file .bas để dành đó. Khi cần thì import vào.

Mẹo nhỏ:

Sau khi export ra một file .bas rồi, dùng NotePad mở ra và thay dòng đầu tiên:

Attribute VB_Name = "TienIch_ADO"
...
Option Explicit
'

Dòng Attribute này bảo Project import tạo Module tên như vậy. Thay vì Module1, Module2, vv...
 
Hi All

Các bạn nào có kinh nghệm về SQL server cho mình hỏi tí nhé!
Vấn đề là mình muốn tạo 1 cơ chế tự động cho 1 file SQL, khi mình insert 1 dòng vào file này thì file tự động đếm số hàng đã có, nếu số hàng >100 thì tự động Delete 1 dòng cũ nhất.
Nếu SQL mình dùng lâu ngày dữ liệu tăng cao, số record cho mỗi lần truy xuất lớn thì tốc độ có chậm như khi mình dùng với access không các bạn?

Thanks
Thân
 
Hi All

Các bạn nào có kinh nghệm về SQL server cho mình hỏi tí nhé!
Vấn đề là mình muốn tạo 1 cơ chế tự động cho 1 file SQL, khi mình insert 1 dòng vào file này thì file tự động đếm số hàng đã có, nếu số hàng >100 thì tự động Delete 1 dòng cũ nhất.
Nếu SQL mình dùng lâu ngày dữ liệu tăng cao, số record cho mỗi lần truy xuất lớn thì tốc độ có chậm như khi mình dùng với access không các bạn?

Thanks
Thân

Vấn đề của SQL Server thì kiếm mấy diễn đàn chuyên về MSSQL mà hỏi. Đề bài này chuyên về ADO, chỉ là một công cụ lấy dữ liệu.

Dân làm việc với CSDL không ai xoá dòng tự động như thế. Người ta dời nó sang một cái archive table. Đối với CSDL lớn thì có nhiều partitions, người ta dời nó snag partition khác.

Theo tôi hiểu thì cái bạn muốn là sẽ dùng trigger để tự động sửa đổi dữ liệu. Nếu bạn vào mấy trang CSDL chuyên nghiệp sẽ thấy dân làm việc với số dữ liệu lớn rất hiếm khi dùng trigger. Hầu hết những liên hệ khoá đều được hiểu ngầm. Nếu bạn có một CSDL lớn mà phải dùng đến những công việc tự động như thế thì tốt hơn hết nên thiết kế lại.
 
Vấn đề của SQL Server thì kiếm mấy diễn đàn chuyên về MSSQL mà hỏi. Đề bài này chuyên về ADO, chỉ là một công cụ lấy dữ liệu.

Dân làm việc với CSDL không ai xoá dòng tự động như thế. Người ta dời nó sang một cái archive table. Đối với CSDL lớn thì có nhiều partitions, người ta dời nó snag partition khác.

Theo tôi hiểu thì cái bạn muốn là sẽ dùng trigger để tự động sửa đổi dữ liệu. Nếu bạn vào mấy trang CSDL chuyên nghiệp sẽ thấy dân làm việc với số dữ liệu lớn rất hiếm khi dùng trigger. Hầu hết những liên hệ khoá đều được hiểu ngầm. Nếu bạn có một CSDL lớn mà phải dùng đến những công việc tự động như thế thì tốt hơn hết nên thiết kế lại.

Hi Bạn

Cảm ơn thông tin của bạn, CSDL của mình 1 ngày có thể lên đến 2000 record, nếu quản lý truy xuất và Insert bình thường thì mình không có vấn đề gì. Tuy nhiên mỗi lần đo dữ liệu mình phải lấy lên tất cả dữ liệu liên quan từ trước(áp dụng cho SPC), để nhìn được tổng quan quá trình.
Ví dụ ở xưởng mình có 100 máy, mỗi máy chạy nhiều part number khác nhau. Mỗi lần đo SPC trên 1 máy ứng với partnumber đó thì phải có dữ liệu cũ.
Mình có ý định sẽ lưu 1 CSDL riêng và 1 CSDL tạm thời (mỗi máy mỗi part chỉ tối đa 1000 record). Lúc lưu dữ liệu mình sẽ lưu vào cả 2 CSDL trên. Một CSDL sẽ tự động xoá đi khi đầy lên để tránh tình trạng chậm tốc độ (dùng trong đo SPC). Còn truy xuất sẽ lấy ở CSDL đầy đủ.
Vì mình chưa thực hiện trên SQL nên mong bạn thông cảm.
Còn về tốc độ truy xuất không biết trên SQL có chậm đi khi dữ liệu tăng lên nhiều không bạn?

Thân
 
Thiết kế dở bẹt.
Sợ đầy thì đặt một chương trình dọn rác. Cuối ngày (nếu không làm việc ban đêm) chương trình đọc bảng và dọn đi những dữ liệu cũ quá. Thế nào là cũ và xử lý những trường hợp ra sao thì thiết kế xong sẽ thấy.

Sợ chậm mà dùng trigger/auto delete là nhìn lạc đường rồi; những cái này chỉ tổ làm chậm thêm.

Sử dụng SQL Server thì tối thiểu bạn phải có một kiến thức về index và key của nó thì mới truy vấn được. Đi gu gô từ khoá "SQL Việt" rồi vào đó mà hỏi (mình quảng cáo không công cho thằng Vũ Huy Tâm rồi!)
 
Thiết kế dở bẹt.
Sợ đầy thì đặt một chương trình dọn rác. Cuối ngày (nếu không làm việc ban đêm) chương trình đọc bảng và dọn đi những dữ liệu cũ quá. Thế nào là cũ và xử lý những trường hợp ra sao thì thiết kế xong sẽ thấy.

Sợ chậm mà dùng trigger/auto delete là nhìn lạc đường rồi; những cái này chỉ tổ làm chậm thêm.

Sử dụng SQL Server thì tối thiểu bạn phải có một kiến thức về index và key của nó thì mới truy vấn được. Đi gu gô từ khoá "SQL Việt" rồi vào đó mà hỏi (mình quảng cáo không công cho thằng Vũ Huy Tâm rồi!)

Hi

Qua đó thấy ngợp quá à, chắc tìm lớp online học thôi. hic. Ngày tháng còn dài

Cảm ơn VietMini
 
Hi All,

Các bạn cho mình hỏi vấn đề này với, có cách nào chỉ viết 1 câu lệnh SQL cho mục đích sau được không:
"Nếu A đã tồn tại trong CSDL thì Select thông tin của A, nếu không thì InSert 1 hàng mới cho A"
A là tên của khách hàng!

Thanks
 
Hi All,

Các bạn cho mình hỏi vấn đề này với, có cách nào chỉ viết 1 câu lệnh SQL cho mục đích sau được không:
"Nếu A đã tồn tại trong CSDL thì Select thông tin của A, nếu không thì InSert 1 hàng mới cho A"
A là tên của khách hàng!

Thanks

Chả có một câu lệnh nào làm được chuyện này cả.
Một bên trả về một dãy dữ liệu. Một bên trả về số dãy dữ liệu. Làm sao mà dùng lẫn lộn được?

Bắt buộc dùng một nhóm lệnh. Nhưng tốt hơn hết là dùng hai đoạn code riêng nhau.

*** Tôi dị ứng với các câu chào hỏi bằng tiếng tây tiếng u lắm! Du cặp với ai gió.
 
[TIP]Bài tập 5: Chèn 1 mẫu tin vào cơ sở dữ liệu[/TIP]

1./ Cú pháp:

[GPECODE=sql]INSERT INTO [Tên Bảng] ([Cột 1], [Cột 2], ...,[Cột n])
VALUES (GiaTri_1, GiaTri_2, ...,GiaTri_n)[/GPECODE]

Lưu ý phần GiaTri:

  • Nhập ngày thì phải thêm # bao quanh ngày (VD:#15/06/1977#)
  • Nhập số thì chỉ ghi số, không cần thêm gì cả
  • Nhập dạng chuổi thì phải thêm dấu nháy bao quanh chuổi đó(VD: 'HLMT')

2./ Bài Tập:

[INFO1]Anh, chị hãy nhập liệu 1 mẫu tin sau vào cơ sở dữ liệu
  • ID=415
  • W_HDATE=10/01/2013
  • PONO=DW12WQ009
  • MATERIAL NAME=POLY ZIPPER #5
  • COLOR NAME=BEIGE
  • UNIT=M
  • SUPPLIER=HHH VIETNAM
[/INFO1]
Mã:
Sub GHI_DL2()
Dim cn As Object
Dim rs As Object
Dim mysql As String
Set cn = CreateObject("ADODB.connection")
Set rs = CreateObject("ADODB.recordset")
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=Yes"";"
    .Open
End With
    mysql = "INSERT INTO [data$] (SELECT Stt,Ten,Ma,SL)" & _
            "VALUES ('123','HH','12H','1214')"
    rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
code này luôn báo lỗi
Mã:
Sub ghidl3()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mysql As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=No;"";"
    .Open
End With
mysql = "INSERT INTO [data$] SELECT f1,f2,f3,f4 FROM [excel 12.0;database=" & _
                ThisWorkbook.FullName & ";HDR=No].[sheet1$A2:D17]"
rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
code này chạy vẫn bình thường
Mã:
Sub ghidl3()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mysql As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=yes;"";"
    .Open
End With
mysql = "INSERT INTO [data$] SELECT stt,ten,ma,sl FROM [excel 12.0;database=" & _
                ThisWorkbook.FullName & ";HDR=yes].[sheet1$A1:D17]"
rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
cũng chạy bình thường
>>>>Anh giải thích giúp em với được không ạ!
(code ở file "chạy" ghi dữ liệu ở sheet :"sheet1" vào sheet: "data" của file "data"
 

File đính kèm

  • GPE-INSERT.rar
    20.6 KB · Đọc: 36
Lần chỉnh sửa cuối:
Mã:
Sub GHI_DL2()
Dim cn As Object
Dim rs As Object
Dim mysql As String
Set cn = CreateObject("ADODB.connection")
Set rs = CreateObject("ADODB.recordset")
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=Yes"";"
    .Open
End With
    mysql = "INSERT INTO [data$] ([B][COLOR=#ff0000]SELECT [/COLOR][/B]Stt,Ten,Ma,SL)" & _
            "VALUES ([COLOR=#ff0000][B]'[/B][/COLOR]123[B][COLOR=#ff0000]'[/COLOR][/B],'HH','12H',[B][COLOR=#ff0000]'[/COLOR][/B]1214[B][COLOR=#ff0000]'[/COLOR][/B])"
    rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
code này luôn báo lỗi
Mã:
Sub ghidl3()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mysql As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=No;"";"
    .Open
End With
mysql = "INSERT INTO [data$] SELECT f1,f2,f3,f4 FROM [excel 12.0;database=" & _
                ThisWorkbook.FullName & ";HDR=No].[sheet1$A2:D17]"
rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
code này chạy vẫn bình thường
Mã:
Sub ghidl3()
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mysql As String
Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=yes;"";"
    .Open
End With
mysql = "INSERT INTO [data$] SELECT stt,ten,ma,sl FROM [excel 12.0;database=" & _
                ThisWorkbook.FullName & ";HDR=yes].[sheet1$A1:D17]"
rs.Open mysql, cn, 3, 3
cn.Close: Set cn = Nothing
End Sub
cũng chạy bình thường
>>>>Anh giải thích giúp em với được không ạ!
(code ở file "chạy" ghi dữ liệu ở sheet :"sheet1" vào sheet: "data" của file "data"

Lỗi sai cú pháp, bạn nên đọc lại chổ tôi tô đỏ ở trên và cú pháp Insert tôi đã viết như sau:
INSERT INTO [Tên Bảng] ([Cột 1], [Cột 2], ...,[Cột n])
VALUES (GiaTri_1, GiaTri_2, ...,GiaTri_n)

Code chỉnh lại như sau:

[GPECODE=sql]Sub GHI_DL2()
Dim cn As Object
Set cn = CreateObject("ADODB.connection")
With cn
.ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
"data source=" & ThisWorkbook.Path & _
"\data.xlsm;extended properties=""excel 12.0;HDR=Yes"";"
.Open
.Execute "INSERT INTO [data$] (Stt,Ten,Ma,SL)" & _
"VALUES (123,'HH','12H',1214)"
End With
cn.Close: Set cn = Nothing
End Sub[/GPECODE]
 
[TIP]Bài tập 6: Cập nhật 1 mẫu tin vào cơ sở dữ liệu[/TIP]

1./ Cú pháp:

[GPECODE=sql]UPDATE [Tên Bảng] SET [Cột 1]=GiaTri_1, [Cột 2]=GiaTri_2, ...,[Cột n]=GiaTri_n
WHERE [Tên_Cột_Và_Điều_Kiện_Update][/GPECODE]
Mã:
Sub ghidl3()
Dim cn As Object
Dim rs As Object
Dim mysql As String
Set cn = CreateObject("ADODB.connection")
Set rs = CreateObject("ADODB.recordset")
With cn
    .ConnectionString = "provider=microsoft.ACE.OLEDB.12.0;" & _
                        "data source=" & ThisWorkbook.Path & _
                        "\data.xlsm;extended properties=""excel 12.0;HDR=yes;"";"
    .Open
End With
mysql = "UPDATE [data$] " & _
         "SET sl=12345" & _
         "WHERE stt =3"
rs.Open mysql, cn, 3, 1
cn.Close: Set cn = Nothing
End Sub
Cảm ơn anh! anh lại giúp kiểm tra cho em code tren vơi ạ! loay hoay mãi vẫn lối ạ.
 

File đính kèm

  • GPE-INSERT.rar
    21.3 KB · Đọc: 27
Web KT
Back
Top Bottom