Sử dụng hàm SELECT.... INNER JOIN thay cho hàm INSERT

Liên hệ QC

hanbaoquan1x

Thành viên mới
Tham gia
26/8/12
Bài viết
19
Được thích
0
Do mình phải sử dụng hàm LEFT JOIN nên mình phải sử dụng hàm SELECT thay thế cho hàm INSERT... VALUES như ví dụ dưới đây. Mọi người có thể giúp mình sửa hàm INSERT...VALUES của ví dụ trên thành hàm SELECT có sử dụng INNER JOIN không? Do mình cũng muốn mặt hàng đó đã được insert lần đầu thì tạo mới với field No có định dạng Number thì No = 1 thì khi viết bằng hàm SELECT thì làm sao mà mình viết được?

Mã:
Private Sub cmdExcute_Click()
CommonDialog1.Filter = "(Microsoft Excel Workbook)|*.xls*"
CommonDialog1.ShowOpen
tb_upload.Text = CommonDialog1.FileName
End Sub

Private Sub cmdUpload_Click()
'On Error Resume Next
Dim ex As New Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim i As Long: i = 1
Dim con As New ADODB.Connection
Dim con1 As New ADODB.Connection

con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\TEST2.mdb;Persist Security Info=False"
con1.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\TEST2.mdb;Persist Security Info=False"
Set wb = ex.Workbooks.Open(tb_upload.Text, , True)
Set ws = wb.Worksheets(1)
Call dbConnection
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = cnn

Do: i = i + 1
cmd.CommandText = "SELECT MAX([No]) as MaxField FROM SV Where MSSV = '" & ws.Range("C" & i) & "'"""
Set rs = cmd.Execute()
If rs.RecordCount > 0 And rs("MaxField") <> Empty Then
Dim sql, sql1 As String
sql1 = "UPDATE SV SET Status = 0 WHERE MSSV = '" & ws.Range("C" & i)
con.Open sql1
sql = "INSERT INTO SV([No],MSSV,MaLop,Ho,Ten,HanhKiem,[User],Status,[Date]) VALUES ('" & rs("MaxField") + 1 & "','" & ws.Range("C" & i).Value & "','" & ws.Range("A" & i).Value & "','" & ws.Range("D" & i).Value & "','" & ws.Range("E" & i).Value & "','" & ws.Range("F" & i).Value & "','" & tenUser & "','" & "-1" & "','" & NgayGioDangNhap & "')"
MsgBox con
con.Open sql

Else
con.Execute "INSERT INTO SV(No,MSSV,MaLop,Ho,Ten,HanhKiem,[User],Status,[Date]) VALUES (1,'" & ws.Range("C" & i).Value & "','" & ws.Range("A" & i).Value & "','" & ws.Range("D" & i).Value & "','" & ws.Range("E" & i).Value & "','" & ws.Range("F" & i).Value & "','" & tenUser & "','" & "-1" & "','" & NgayGioDangNhap & "')"
con1.Execute "INSERT INTO Lop(MaLop,TenLop) VALUES ('" & ws.Range("A" & i).Value & "', '" & ws.Range("B" & i).Value & "')"
End If
Loop Until ws.Range("A" & (i + 1)) = Empty
ex.Quit
Set ex = Nothing
con.Close
con1.Close
End Sub
 

File đính kèm

  • Homework.zip
    22.2 KB · Đọc: 22
Do mình phải sử dụng hàm LEFT JOIN nên mình phải sử dụng hàm SELECT thay thế cho hàm INSERT... VALUES như ví dụ dưới đây. Mọi người có thể giúp mình sửa hàm INSERT...VALUES của ví dụ trên thành hàm SELECT có sử dụng INNER JOIN không? Do mình cũng muốn mặt hàng đó đã được insert lần đầu thì tạo mới với field No có định dạng Number thì No = 1 thì khi viết bằng hàm SELECT thì làm sao mà mình viết được?

Mã:
Private Sub cmdExcute_Click()
CommonDialog1.Filter = "(Microsoft Excel Workbook)|*.xls*"
CommonDialog1.ShowOpen
tb_upload.Text = CommonDialog1.FileName
End Sub

Private Sub cmdUpload_Click()
'On Error Resume Next
Dim ex As New Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim i As Long: i = 1
Dim con As New ADODB.Connection
Dim con1 As New ADODB.Connection

con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\TEST2.mdb;Persist Security Info=False"
con1.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\TEST2.mdb;Persist Security Info=False"
Set wb = ex.Workbooks.Open(tb_upload.Text, , True)
Set ws = wb.Worksheets(1)
Call dbConnection
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = cnn

Do: i = i + 1
cmd.CommandText = "SELECT MAX([No]) as MaxField FROM SV Where MSSV = '" & ws.Range("C" & i) & "'"""
Set rs = cmd.Execute()
If rs.RecordCount > 0 And rs("MaxField") <> Empty Then
Dim sql, sql1 As String
sql1 = "UPDATE SV SET Status = 0 WHERE MSSV = '" & ws.Range("C" & i)
con.Open sql1
sql = "INSERT INTO SV([No],MSSV,MaLop,Ho,Ten,HanhKiem,[User],Status,[Date]) VALUES ('" & rs("MaxField") + 1 & "','" & ws.Range("C" & i).Value & "','" & ws.Range("A" & i).Value & "','" & ws.Range("D" & i).Value & "','" & ws.Range("E" & i).Value & "','" & ws.Range("F" & i).Value & "','" & tenUser & "','" & "-1" & "','" & NgayGioDangNhap & "')"
MsgBox con
con.Open sql

Else
con.Execute "INSERT INTO SV(No,MSSV,MaLop,Ho,Ten,HanhKiem,[User],Status,[Date]) VALUES (1,'" & ws.Range("C" & i).Value & "','" & ws.Range("A" & i).Value & "','" & ws.Range("D" & i).Value & "','" & ws.Range("E" & i).Value & "','" & ws.Range("F" & i).Value & "','" & tenUser & "','" & "-1" & "','" & NgayGioDangNhap & "')"
con1.Execute "INSERT INTO Lop(MaLop,TenLop) VALUES ('" & ws.Range("A" & i).Value & "', '" & ws.Range("B" & i).Value & "')"
End If
Loop Until ws.Range("A" & (i + 1)) = Empty
ex.Quit
Set ex = Nothing
con.Close
con1.Close
End Sub

File bạn gửi không giải nén được.
 
Mình giải nén được bình thường mà.
 
Mình đã upload lại database. Mong mọi người giúp đỡ.
 

File đính kèm

  • Homework.zip
    25 KB · Đọc: 9
Mình gửi lại database nha.
 

File đính kèm

  • Homework.zip
    26.3 KB · Đọc: 18
Mình gửi lại database nha.

Bạn đã chèn rồi còn gì, bạn nói join mình cũng chẳng biết join giữa cái gì với cái gì?
Thôi thì tôi chỉnh code của bạn lại cho nó chạy thôi.

[GPECODE=sql]Private Sub cmdUpload_Click()
'On Error Resume Next
Dim ex As New Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim i As Long: i = 1
Dim con As New ADODB.Connection
Dim con1 As New ADODB.Connection

con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\TEST2.mdb;Persist Security Info=False"
con1.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\TEST2.mdb;Persist Security Info=False"
Set wb = ex.Workbooks.Open(tb_upload.Text, , True)
Set ws = wb.Worksheets(1)
Call dbConnection
Set cmd = New ADODB.Command
Set cmd.ActiveConnection = cnn

Do: i = i + 1
cmd.CommandText = "SELECT MAX([No]) as MaxField FROM SV Where MSSV = '" & ws.Range("C" & i) & "'"
Set rs = cmd.Execute()
If rs.RecordCount > 0 And rs("MaxField") <> Empty Then
Dim sql, sql1 As String
sql1 = "UPDATE SV SET Status = 0 WHERE MSSV = '" & ws.Range("C" & i) & "'"
con.Execute sql1
sql = "INSERT INTO SV([No],MSSV,MaLop,Ho,Ten,HanhKiem,[User],Status,[Date]) VALUES ('" & rs("MaxField") + 1 & "','" & ws.Range("C" & i).Value & "','" & ws.Range("A" & i).Value & "','" & ws.Range("D" & i).Value & "','" & ws.Range("E" & i).Value & "','" & ws.Range("F" & i).Value & "','" & tenUser & "','" & "-1" & "','" & NgayGioDangNhap & "')"
MsgBox con
con.Execute sql

Else
con.Execute "INSERT INTO SV(No,MSSV,MaLop,Ho,Ten,HanhKiem,[User],Status,[Date]) VALUES (1,'" & ws.Range("C" & i).Value & "','" & ws.Range("A" & i).Value & "','" & ws.Range("D" & i).Value & "','" & ws.Range("E" & i).Value & "','" & ws.Range("F" & i).Value & "','" & tenUser & "','" & "-1" & "','" & NgayGioDangNhap & "')"
con1.Execute "INSERT INTO Lop(MaLop,TenLop) VALUES ('" & ws.Range("A" & i).Value & "', '" & ws.Range("B" & i).Value & "')"
End If
Loop Until ws.Range("A" & (i + 1)) = Empty
ex.Quit
Set ex = Nothing
con.Close
con1.Close
End Sub

[/GPECODE]
 
Do mình đang update dữ liệu ở khoá chính như là MaLop = 0 thì chương trình không update được dữ liệu nên mình phải sử dụng hàm SELECT để update tất cả dữ liệu bất kể dữ liệu có bằng 0 hay không. Mọi người có thể sửa lại dùm mình từ hàm INSERT sang hàm SELECT với cấu trúc như trên được không?
 
Do mình đang update dữ liệu ở khoá chính như là MaLop = 0 thì chương trình không update được dữ liệu nên mình phải sử dụng hàm SELECT để update tất cả dữ liệu bất kể dữ liệu có bằng 0 hay không. Mọi người có thể sửa lại dùm mình từ hàm INSERT sang hàm SELECT với cấu trúc như trên được không?

Có phải ý bạn muốn chèn toàn bộ dữ liệu của sheet1 ở Excel vào table SV bên Access?
 
Đúng vậy mình muốn chèn toàn bộ dữ liệu nhưng dùng hàm INSERT thì dữ liệu = 0 thì nó không update được nên phải dùng hàm SELECT .... INNER JOIN.
 
Đúng vậy mình muốn chèn toàn bộ dữ liệu nhưng dùng hàm INSERT thì dữ liệu = 0 thì nó không update được nên phải dùng hàm SELECT .... INNER JOIN.
Gợi ý cho bạn:
- Select những cột trong file Excel cần import vào table SV chừa những field mà trong table SV không có đưa vào bảng SV.
- Cập nhật lại cột Status vừa cập nhật là True, ngược lại những record có rồi thì cho là False.
- Cập nhật lại cột số [No] vừa import vào table SV = Max([No])+1

Như vậy dùng cách này hoàn toàn không có Join và không có vòng lặp nào và điều quan trọng là không cần mở file Excel làm giảm tốc độ khi truy vấn dữ liệu.
 
Lần chỉnh sửa cuối:
Select những cột trong file Excel cần import vào table SV chừa những field mà trong table SV không có đưa vào bảng SV. => Do mình viết sang hàm SELECT thì làm sao chương trình hiểu SELECT ws.Range("A" & i).Select ???
Cập nhật lại cột Status vừa cập nhật là True, ngược lại những record có rồi thì cho là False. => Vậy khi viết bằng SELECT chương trình có hiểu như khi viết bằng hàm INSERT ????
Cập nhật lại cột số [No] vừa import vào table SV = Max([No])+1 => Vậy khi viết bằng SELECT Max([No]) +1 như thế nào ?????
 
Select những cột trong file Excel cần import vào table SV chừa những field mà trong table SV không có đưa vào bảng SV. => Do mình viết sang hàm SELECT thì làm sao chương trình hiểu SELECT ws.Range("A" & i).Select ???
Cập nhật lại cột Status vừa cập nhật là True, ngược lại những record có rồi thì cho là False. => Vậy khi viết bằng SELECT chương trình có hiểu như khi viết bằng hàm INSERT ????
Cập nhật lại cột số [No] vừa import vào table SV = Max([No])+1 => Vậy khi viết bằng SELECT Max([No]) +1 như thế nào ?????
Thôi tôi làm cho bạn luôn, lưu ý là tôi làm trên file Excel 2003, bạn nên chuyển đổi file SV1.xlsx sang SV1.xls nhé.

[GPECODE=sql]Private Sub Command1_Click()
Dim con As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim maxNumber As Long
With con
.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\TEST2.mdb;Persist Security Info=False"
.Execute "INSERT INTO [SV] " & _
"SELECT MaLop,MSSV,Ho,Ten,HanhKiem,'" & tenUser & "' as [User],'" & NgayGioDangNhap & "' as [Date], -1 as Status " & _
"FROM `EXCEL 8.0;Database=" & App.Path & "\SV1.xls`.[Sheet1$A1:F9]"
.Execute "UPDATE SV SET Status =0 WHERE [No]<>0"
rs.Open "SELECT MAX([No]) as MaxField FROM SV ", con
maxNumber = rs!MaxField + 1
.Execute "UPDATE SV SET [No]=" & maxNumber & " WHERE [No]=0"
rs.Close
.Close
End With

End Sub[/GPECODE]

P/s: Bạn hỏi người ta mà y như ra lệnh cho người ta làm vậy.
 
Lần chỉnh sửa cuối:
Có cách nào nhập liệu ở excel rồi lưu dữ liệu ở SQL server 2005 không?
 
Excel kết hợp với SQL server thì rất hay, dữ liệu ngày một nhiều nếu excel lên tầm 20.000 dòng thì việc truy vấn và lưu file có thể rất chậm, nhờ mấy cao thủ viết để tương tác SQL Server + excel thì quá tốt, như excel + access vậy. mong nhận được tin sớm
 
Web KT

Bài viết mới nhất

Back
Top Bottom