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

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,233
Được thích
9,743
Điểm
860
Nơi ở
Hà Nội
em cũng hổng biết sao dán cái anh đưa ở trên vào cửa sổ VBA thấy đỏ lòm à. hic
Chắc VBA đến ngày... :p . Vậy có thể do ghép chuỗi SQL thiếu ". Em dò lại đầu và cuối một chuỗi phải bao bởi ". Em kiểm tra lại code này:

Mã:
Set lrs = Cnn.Execute("SELECT Maso,Tenchitiet,soluong," & _
                        "IIF(soluong >360, 'A', IIF(soluong =360,  'B', 'C' )) " & _
                      "FROM [DATA$]")
 

AutoReply

Thành viên tiêu biểu
Tham gia ngày
18 Tháng hai 2016
Bài viết
512
Được thích
651
Điểm
360
Chắc VBA đến ngày... :p . Vậy có thể do ghép chuỗi SQL thiếu ". Em dò lại đầu và cuối một chuỗi phải bao bởi ". Em kiểm tra lại code này:

Mã:
Set lrs = Cnn.Execute("SELECT Maso,Tenchitiet,soluong," & _
                        "IIF(soluong >360, 'A', IIF(soluong =360,  'B', 'C' )) " & _
                      "FROM [DATA$]")
À vâng, cám ơn anh. Thì ra đầu và cuối chuỗi phải có dấu nháy kép. Giờ hết đỏ rồi ạ. %#^#$
 

VetMini

Gian hùng bàn phiếm (thành viên trôi nước)
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
7,856
Được thích
9,205
Điểm
560
Cái câu hỏi ở bài #415 vừa sai, vừa mập mờ. Quý vị giải được cũng đáng phục nghề kiên nhẫn.
Từ lúc hỏi ở thớt bên kia, tôi đã bảo chủ thớt ghi lại câu cú cho rõ ràng rồi hãy xét tiếp - trước mắt là câu đó bị thiếu dấu cách. Đó là cách debug lỗi thuật ngữ code (xét lỗi chính tả).
Sau khi biết đúng câu rồi thì mới thảy thẳng câu ấy vào hệ thống CSDL mà thử. Đó là cách debug code nếu đã đúng thuật ngữ (xét xem có đúng dữ liệu truy vấn)

Chỉ có cái kỹ thuật debug mà chủ thớt cũng còn chập choạng thì còn đòi thử Access với SQL Server làm chi cho mất thì giờ.
 

nyripley

Thành viên mới
Tham gia ngày
14 Tháng mười 2014
Bài viết
2
Được thích
0
Điểm
0
Tuổi
30
em cũng hổng biết sao dán cái anh đưa ở trên vào cửa sổ VBA thấy đỏ lòm à. hic
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,233
Được thích
9,743
Điểm
860
Nơi ở
Hà Nội
em cũng hổng biết sao dán cái anh đưa ở trên vào cửa sổ VBA thấy đỏ lòm à. hic
Đỏ là do đến ngày ;). Ở những đoạn ngắt dòng, em chỉnh lại bằng cách, xóa dấu _ hiện nay đi và làm lại: Nhấn phím SPACE sau đó SHIFT + _ rôi ENTER nhé.
 

honline

Thành viên mới
Tham gia ngày
15 Tháng một 2011
Bài viết
3
Được thích
0
Điểm
363
Dạ em chào cả nhà,
Hiện tại em đang muốn làm cái insert VBA excel vào sqlserver 2008r2. em thử chạy trực tiếp trên máy cài sql thì ok. Nhưng sang máy khác thì lỗi
dbnetlib connectionopen (connect()). sql server does not exist or access denied
em thử nhiều cách mà vẫn chưa được mong các bác giúp đỡ.
 

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia ngày
18 Tháng ba 2008
Bài viết
7,364
Được thích
14,253
Điểm
1,910
Nơi ở
Tp.HCM
Dạ em chào cả nhà,
Hiện tại em đang muốn làm cái insert VBA excel vào sqlserver 2008r2. em thử chạy trực tiếp trên máy cài sql thì ok. Nhưng sang máy khác thì lỗi
dbnetlib connectionopen (connect()). sql server does not exist or access denied
em thử nhiều cách mà vẫn chưa được mong các bác giúp đỡ.
Bạn đã cấu hình SQL Server cho phép kết nối hay chưa?
 

honline

Thành viên mới
Tham gia ngày
15 Tháng một 2011
Bài viết
3
Được thích
0
Điểm
363

Nguyen Ham Man

Thành viên mới
Tham gia ngày
3 Tháng bảy 2015
Bài viết
2
Được thích
0
Điểm
163
Bài 1:
Nhằm mục đích luyện tập và nâng cao kiến thức về ADO tôi xin mở topic này. Topic này chỉ dành cho những người mới học, bắt đầu học ADO như tôi tham gia.

Tôi có 2 Workbooks (A.xls và B.xls chung 1 folder): Wb A.xls có 1 sheet là sheet data dùng để chứa dữ liệu, wb B.xls là wb rỗng, trong đó có sheet1.

Xin hỏi là dùng ADO từ WB A.xls để copy toàn bộ dữ liệu của sheet data sang WB B.xls với sheet chứa dữ liệu là data
Anh ơi cho em hỏi. Sao bài 1 Em làm bị lỗi nó báo thế này vậy anh.
upload_2017-12-2_13-21-44.png
 

File đính kèm

  • 33.5 KB Đọc: 2

Nguyen Ham Man

Thành viên mới
Tham gia ngày
3 Tháng bảy 2015
Bài viết
2
Được thích
0
Điểm
163
Kiểm tra lại file B.xls coi có cột STT không nhé
Cám ơn anh. Đọc qua giúp đỡ của anh và Microft em đã cơ bản hiểu được chỗ này. Đây là câu lệnh thêm vào bảng. Vì vậy trong Sheet1 của File B.xls phải có columns heading giống bảng bên này. Sau khi thêm tên cột em đã INSERT thành công. Cám ơn anh HLMT nhiều. Ai bị lỗi giống em có thể tham khảo thêm tại https://support.microsoft.com/EN-US/help/295646
 

appl

Thành viên chính thức
Tham gia ngày
22 Tháng sáu 2011
Bài viết
57
Được thích
22
Điểm
370
Tuổi
22
Xin giúp đỡ về cách truy vấn SQL để ra kết quả như sheet báo cáo? tôi đã làm được nhưng phần đếm số phiếu nó không đếm loại trùng. Xin chân thành cảm ơn
 

File đính kèm

appl

Thành viên chính thức
Tham gia ngày
22 Tháng sáu 2011
Bài viết
57
Được thích
22
Điểm
370
Tuổi
22
ở bài trên tôi code như vậy

Mã:
Sub TEST() ' KHONG CO TIEU DE
Dim Cn As Object
Dim Rst As Object
Dim i As Long
Set Cn = CreateObject("ADODB.connection")
Set Rst = CreateObject("ADODB.recordset")
    Sheet4.Range("a2:Z10000").Clear
    Cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    Cn.Properties("Data Source") = ThisWorkbook.FullName
    Cn.Properties("Extended Properties") = "Excel 12.0;HDR=yes;IMEX=1"
    Cn.Open
    Rst.Open ("select MaKho, TenKho, count(SoPhieu), Sum(SoLuong) as So_Luong,Sum(SoLuong*gia) as SoTien from [data$] where Makho<>'' group by MaKho, TenKho"), Cn
    Sheet4.Range("a2").CopyFromRecordset Rst
    Rst.Close
    Cn.Close
End Sub
kết quả ra tất cả đều đúng nhưng tổng số phiếu không hợp lý
Tôi muốn tổng số phiếu là đếm những phiếu riêng biệt chứ không phải trùng
ví dụ như mã TL0010 số phiếu lá 23 chứ không phải là 156 . Xin được giúp đỡ xin cảm ơn
 

File đính kèm

phihndhsp

Thành viên gạo cội
Tham gia ngày
26 Tháng mười hai 2009
Bài viết
3,305
Được thích
2,392
Điểm
860
ở bài trên tôi code như vậy

Mã:
Sub TEST() ' KHONG CO TIEU DE
Dim Cn As Object
Dim Rst As Object
Dim i As Long
Set Cn = CreateObject("ADODB.connection")
Set Rst = CreateObject("ADODB.recordset")
    Sheet4.Range("a2:Z10000").Clear
    Cn.Provider = "Microsoft.ACE.OLEDB.12.0"
    Cn.Properties("Data Source") = ThisWorkbook.FullName
    Cn.Properties("Extended Properties") = "Excel 12.0;HDR=yes;IMEX=1"
    Cn.Open
    Rst.Open ("select MaKho, TenKho, count(SoPhieu), Sum(SoLuong) as So_Luong,Sum(SoLuong*gia) as SoTien from [data$] where Makho<>'' group by MaKho, TenKho"), Cn
    Sheet4.Range("a2").CopyFromRecordset Rst
    Rst.Close
    Cn.Close
End Sub
kết quả ra tất cả đều đúng nhưng tổng số phiếu không hợp lý
Tôi muốn tổng số phiếu là đếm những phiếu riêng biệt chứ không phải trùng
ví dụ như mã TL0010 số phiếu lá 23 chứ không phải là 156 . Xin được giúp đỡ xin cảm ơn
Bạn thử đổi câu lệnh truy vấn này xem sao
Rst.Open ("select Makho, TenKho, count(sophieu), sum(so_Luong),sum(So_Tien) from(select DISTINCT maKho, TenKho , SoPhieu, Sum(SoLuong) as So_Luong,Sum(SoLuong*gia) as So_Tien from [data$] where Makho<>'' group by MaKho, TenKho, sophieu) group by makho, tenkho"), Cn
 

File đính kèm

VetMini

Gian hùng bàn phiếm (thành viên trôi nước)
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
7,856
Được thích
9,205
Điểm
560
Nếu là SQL Server thì có thể Count(Distinct SoPhieu)
Nhưng hình như Access không hổ trợ dạng này.
Theo tôi nghĩ có lẽ bạn phải group 2 lần.
select MaKho, TenKho, count(*), Sum(SL) as So_Luong, Sum(ST) as SoTien from
(select MaKho, TenKho, Sum(SoLuong) as SL, Sum(SoLuong*gia) as ST from [data$] where Makho<>'' group by MaKho, TenKho, SoPhieu) As A group by MaKho, TenKho
 

HUYNHTIEN0202

Thành viên chính thức
Tham gia ngày
22 Tháng tám 2014
Bài viết
87
Được thích
1
Điểm
370
Tuổi
20
Chào Các Anh
Mình muốn sữa đổi điều kiện trong đoạn code sau:
Thay thế điều kiện
[" & ThisWorkbook.FullName & "].[DK$A1:A4]
Thành điều kiện sau để khi cần bổ sung thêm điều kiện không cần sữa code.
With Sheet2
.Range("A1", .[A1].End(xlDown)).Value
End With

Mã:
Private Sub CommandButton1_Click()
Dim v As String, Cnn As Object, lrs As Object
Application.ScreenUpdating = False
    Set Cnn = CreateObject("ADODB.Connection")
    v = Application.Version
    With Sheet3
     .Range("A2:D5000").ClearContents
    Cnn.Open ("Provider=Microsoft." & IIf(v <> "8.0", "ACE.OLEDB.12.0", "Jet.OLEDB.4.0") & _
    ";Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel " & IIf(v <> "8.0", "12.0", "8.0"))
'---------------------------------------------------------------------------------------------------------------
    Set lrs = Cnn.Execute("SELECT STT, TEN, sum(SoLuong), GhiChu " & _
                      "FROM [Data$] " & _
                          " WHERE STT IN (SELECT STT FROM [" & ThisWorkbook.FullName & "].[DK$A1:A4]) " & _
                          "GROUP BY STT,TEN,GhiChu ")
'---------------------------------------------------------------------------------------------------------------
    .Range("A2").CopyFromRecordset lrs
    End With
'---------------------------------------------------------------------------------------------------------------
lrs.Close: Set lrs = Nothing
Cnn.Close: Set Cnn = Nothing
Application.ScreenUpdating = True
End Sub
 

File đính kèm

khanhhero

Thành viên hoạt động
Tham gia ngày
28 Tháng bảy 2011
Bài viết
132
Được thích
31
Điểm
370
Em chào cả nhà.
Em nhờ cả nhà hướng dẫn giúp em đoạn code ADO để ghi dữ liệu vào file đóng với cấu trúc file như em đã đính kèm. Em cũng thử sử dụng INNER JOIN và UPDATE như bác Hai Lúa Miền Tây đã viết trước đây nhưng lại bị vướng chỗ SUM và cột update dữ liệu. Em muốn sum dữ liệu từ SHEET MAIN sang SHEET DATA ạ. Làm theo hướng workbook.open thì em làm được rồi nhưng em muốn tìm hiểu xem code Ado thì viết ntn.
Em cám ơn mọi người.
 

File đính kèm

dhn46

Hướng tới tương lai
Tham gia ngày
1 Tháng ba 2011
Bài viết
3,246
Được thích
3,829
Điểm
560
Nơi ở
Hải Phòng
Các anh chị cho dhn46 hỏi về lấy dữ liệu file csv:
dhn46 có file 1.csv tại D:\, có file để chứa kết quả Result.Xlsm cùng thư mục D:\
Tại sheet1 file Result, [A1:A10] chứa điều kiện cần lọc tương ứng với cột thứ 1 file 1.csv
Vậy xin hỏi code sử dụng SQL để lấy dữ liệu từ file D:\1.csv tới file D:\Result.xlsm với điều kiện tại D:\Result.xlsm_Sheet1.[A1:A10]
Xin cảm ơn GPE
 
Top Bottom