hỏi cách ghi dữ liệu vào file đóng

Liên hệ QC

Tường_Vi

Thành viên tiêu biểu
Tham gia
19/4/10
Bài viết
482
Được thích
121
Nghề nghiệp
Luôn tìm kiếm một vị trí tốt hơn
Em gửi file này. Các anh giúp em cách làm nhé
 

File đính kèm

  • Test ADO.zip
    18 KB · Đọc: 86
Em gửi file này. Các anh giúp em cách làm nhé

Mình xem bài này từ hôm qua mà chưa thấy có bạn nào trả lời --> đánh liều 1 đoạn code xem như thế nào :

[GPECODE=vb]
Sub Update_Data_ADO()
Dim lsSQL As String, cnn As Object, lrs As Object
Dim Tmparr(), Item, iR As Long, Val1, val2
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\DATA.xls" & _
";Extended Properties=""Excel 8.0;HDR=Yes;"";"
.Open
End With
Tmparr = Range("A2", [A65536].End(3)).Value
iR = 1
For Each Item In Tmparr
iR = iR + 1
If Len(Item) Then
Val1 = CDbl(Range("C" & iR & "")): val2 = CStr(Trim(Range("D" & iR & "")))
Debug.Print Val1; val2
lsSQL = "UPDATE [DATA$] " & _
"SET [Thanhtoan]= " & Val1 & ", [Phuong Thuc] = '" & val2 & "'" & _
"WHERE [Bill] Like '" & Item & "'"
lrs.Open lsSQL, cnn, 3, 1
End If
Next
Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub[/GPECODE]

Vừa test lại thấy cũng lạ với câu lệnh UPDATE thì nên để :
[GPECODE=vb]lrs.Open lsSQL, cnn, 2, 3, 1[/GPECODE]

Mà với CSDL là excel mình để adLockreadonly vẫn ok ? <-----+-+-+-+ <---- Đau đầu vì khó hiểu quá ^^

Bạn có thể tham khảo thêm tại http://www.giaiphapexcel.com/forum/showthread.php?75143-Bài-tập-về-ADO-căn-bản/page11
 
Lần chỉnh sửa cuối:
Em gửi file này. Các anh giúp em cách làm nhé

Mình không rõ mục đích của bạn khi tách ra làm 2 File
Thói quen của mình
sẽ gộp 2 File thành 1 File nằm trên 2 Sheet
Lấy dữ liệu từ Data vào Form sẽ nhanh hơn
Mình có sửa File ngược lại theo ý của bài đưa ra
 

File đính kèm

  • DATA va Form.xls
    38.5 KB · Đọc: 53
Mình bận làm giờ mới mò lên
Cám ơn bạn hieuxd nhé

Mình không rõ mục đích của bạn khi tách ra làm 2 File
Thói quen của mình
sẽ gộp 2 File thành 1 File nằm trên 2 Sheet
Lấy dữ liệu từ Data vào Form sẽ nhanh hơn
Mình có sửa File ngược lại theo ý của bài đưa ra

Mình chỉ làm test để học thôi, mình lấy ví dụ nhé
- File Danh mục khách hàng để ở server: dùng chung
- Tại máy 1, 2, 3... dùng form nhập liệu

Cám ơn bạn, mình sẽ xem file, có gì không hiểu bạn giúp mình
 
Lần chỉnh sửa cuối:
Mình bận làm giờ mới mò lên
Cám ơn bạn hieuxd nhé
Mình không rõ mục đích của bạn khi tách ra làm 2 File
Thói quen của mình
sẽ gộp 2 File thành 1 File nằm trên 2 Sheet
Lấy dữ liệu từ Data vào Form sẽ nhanh hơn
Mình có sửa File ngược lại theo ý của bài đưa ra


Mình chỉ làm test để học thôi, mình lấy ví dụ nhé
- File Danh mục khách hàng để ở server: dùng chung
- Tại máy 1, 2, 3... dùng form nhập liệu

Cám ơn bạn, mình sẽ xem file, có gì không hiểu bạn giúp mình

Nếu đã tách ra thì bạn nên xây dựng file DATA thành file .mdb <---- nếu để file excel làm CSDL thì sẽ có những hạn chế nhất định bạn ah
 
PHP:
 lsSQL = "UPDATE [DATA$] " & _                        "SET [Thanhtoan]= " & Val1 & ", [Phuong Thuc] = '" & val2 & "'" & _
                        "WHERE [Bill] Like '" & Item & "'"

Bạn thân mến
Cho mình hỏi một chút về nguyên tắc viết dấu phẩy ' ở trên với, ví dụ
1. sau [Thanhtoan]= không có dấu '
2.sau [Phuong Thuc] = có dấu '
3. sau Val2 , Like, & Item có dấu '

Mình thử bỏ đi, code chạy lỗi
Bạn có thể chỉ cho mình cách viết dấu phẩy này không?
 
PHP:
 lsSQL = "UPDATE [DATA$] " & _   
"SET [Thanhtoan]= " & Val1 & ", [Phuong Thuc] = '" & val2 & "'" & _   
"WHERE [Bill] Like '" & Item & "'"

Bạn thân mến
Cho mình hỏi một chút về nguyên tắc viết dấu phẩy ' ở trên với, ví dụ
1. sau [Thanhtoan]= không có dấu '
2.sau [Phuong Thuc] = có dấu '
3. sau Val2 , Like, & Item có dấu '

Mình thử bỏ đi, code chạy lỗi
Bạn có thể chỉ cho mình cách viết dấu phẩy này không?

Theo mình :
Cập nhập dữ liệu vào một mẫu tin bạn có thể dùng câu lện SQL như sau :
[GPECODE=vb]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ềuu_Kiện_Update][/GPECODE]

---> các giá trị nếu là string thì phải được đạt trong dấu ' '
ví dụ [Thanhtoan] = USD ----> phải viết là [Thanhtoan]= 'USD'
--> còn các dấu " " để đảm bảo câu lệnh SQL là một chuỗi string
http://www.giaiphapexcel.com/forum/showthread.php?75143-Bài-tập-về-ADO-căn-bản
 
Mình xem bài này từ hôm qua mà chưa thấy có bạn nào trả lời --> đánh liều 1 đoạn code xem như thế nào :

[GPECODE=vb]
Sub Update_Data_ADO()
Dim lsSQL As String, cnn As Object, lrs As Object
Dim Tmparr(), Item, iR As Long, Val1, val2
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\DATA.xls" & _
";Extended Properties=""Excel 8.0;HDR=Yes;"";"
.Open
End With
Tmparr = Range("A2", [A65536].End(3)).Value
iR = 1
For Each Item In Tmparr
iR = iR + 1
If Len(Item) Then
Val1 = CDbl(Range("C" & iR & "")): val2 = CStr(Trim(Range("D" & iR & "")))
Debug.Print Val1; val2
lsSQL = "UPDATE [DATA$] " & _
"SET [Thanhtoan]= " & Val1 & ", [Phuong Thuc] = '" & val2 & "'" & _
"WHERE [Bill] Like '" & Item & "'"
lrs.Open lsSQL, cnn, 3, 1
End If
Next
Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub[/GPECODE]

Vừa test lại thấy cũng lạ với câu lệnh UPDATE thì nên để :
[GPECODE=vb]lrs.Open lsSQL, cnn, 2, 3, 1[/GPECODE]

Mà với CSDL là excel mình để adLockreadonly vẫn ok ? <-----+-+-+-+ <---- Đau đầu vì khó hiểu quá ^^

Bạn có thể tham khảo thêm tại http://www.giaiphapexcel.com/forum/showthread.php?75143-B%C3%A0i-t%E1%BA%ADp-v%E1%BB%81-ADO-c%C4%83n-b%E1%BA%A3n/page11

Có thể không dùng vòng lặp trong trường hợp này để cập nhật dữ liệu, mình nhớ là đã có lần mình nói rồi.
 
Có thể không dùng vòng lặp trong trường hợp này để cập nhật dữ liệu, mình nhớ là đã có lần mình nói rồi.

Buồn buồn làm lại luôn theo yêu cầu:

[GPECODE=sql]Sub Update_HLMT()
On Error GoTo Handle
Set Cn = CreateObject("ADODB.Connection")
Dim mySQL As String, strFile As Variant
strFile = Application.GetOpenFilename()
If strFile <> False Then
With Cn
mySQL = "UPDATE [Data$A2:F11] a " _
& "INNER JOIN " _
& "[Excel 8.0;HDR=No;IMEX=2;DATABASE=" _
& ThisWorkbook.FullName & "].[FORM$A2:E3] b " _
& "ON a.F1=b.F1 " _
& "SET a.F4=b.F3,a.F5=b.F4"
.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strFile & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Execute mySQL
.Close
End With
End If
Set Cn = Nothing
Exit Sub
Handle:
MsgBox Err.Description

End Sub
[/GPECODE]
 
Lần chỉnh sửa cuối:
Cám ơn Anh Hai Lúa Miền Tây
Em chưa quen nên tạm thời nhìn chưa hiểu code của Anh, nhưng e sẽ cố nghiên cứu và hỏi sau
Có dịp ra Hải Phòng lại alo em nhé

Cám ơn bạn Hungpecc
 
Lần chỉnh sửa cuối:
To: Anh Hải Lúa, bạn Hungpec
Em hỏi thêm một trường hợp nữa, khi ghi dữ liệu nếu không tìm thấy số hoá đơn thì nó tự thêm một dòng mới ở dưới dùng của bảng DATA thì code SQL sẽ như nào ạ?
 
To: Anh Hải Lúa, bạn Hungpec
Em hỏi thêm một trường hợp nữa, khi ghi dữ liệu nếu không tìm thấy số hoá đơn thì nó tự thêm một dòng mới ở dưới dùng của bảng DATA thì code SQL sẽ như nào ạ?

Ở trên là câu lênh cập nhật, muốn thêm mới ở dòng cuối cùng của dữ liệu bạn phải thêm 1 câu lệnh thêm mới nữa.
 
To: Anh Hải Lúa, bạn Hungpec
Em hỏi thêm một trường hợp nữa, khi ghi dữ liệu nếu không tìm thấy số hoá đơn thì nó tự thêm một dòng mới ở dưới dùng của bảng DATA thì code SQL sẽ như nào ạ?

Em định làm như thế này : <------ a Hai... đánh giá và cho ý kiến thêm nhé ^^
- Duỵệt qua từng mẫu tin recordset ---> nếu trùng thì update ----> nếu không trùng thì .Add new
* Ah trong recordset có phương thức nào kiểm tra mẫu tin bị trùng mà không cần dùng vòng lặp không anh -> kiểu như Dic.exists() ý
 
Em định làm như thế này : <------ a Hai... đánh giá và cho ý kiến thêm nhé ^^
- Duỵệt qua từng mẫu tin recordset ---> nếu trùng thì update ----> nếu không trùng thì .Add new
* Ah trong recordset có phương thức nào kiểm tra mẫu tin bị trùng mà không cần dùng vòng lặp không anh -> kiểu như Dic.exists() ý

Không cần thiết phải thế, thôi thì cũng đang buồn làm luôn cho bạn tham khảo.

[GPECODE=sql]Sub Update_HLMT()
On Error GoTo Handle
Set Cn = CreateObject("ADODB.Connection")
Dim mySQL As String, strFile As Variant
strFile = Application.GetOpenFilename()
If strFile <> False Then
With Cn
mySQL = "UPDATE [Data$] a " _
& "RIGHT JOIN " _
& "[Excel 8.0;HDR=No;IMEX=2;DATABASE=" _
& ThisWorkbook.FullName & "].[FORM$] b " _
& "ON a.F1=b.F1 " _
& "SET a.F4=b.F3,a.F5=b.F4,a.f1=b.f1"
.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strFile & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Execute mySQL
.Close
End With
End If
Set Cn = Nothing
Exit Sub
Handle:
MsgBox Err.Description

End Sub

[/GPECODE]
 
Thôi, phải chịu vọc hơn. hỏi Anh nhiều lại làm Anh buồn nhiều. hì hì

PHP:
 & "ON a.F1=b.F1 " _
& "SET a.F4=b.F3,a.F5=b.F4,a.f1=b.f1"

Anh giảng giúp em đoạn code này nhé. Tại sao lại có ký tự a và b?
Và F1, F3, F4 , F5 đại diện cho cái gì?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Thôi, phải chịu vọc hơn. hỏi Anh nhiều lại làm Anh buồn nhiều. hì hì

PHP:
 & "ON a.F1=b.F1 " _
& "SET a.F4=b.F3,a.F5=b.F4,a.f1=b.f1"

Anh giảng giúp em đoạn code này nhé. Tại sao lại có ký tự a và b?
Và F1, F3, F4 , F5 đại diện cho cái gì?

mySQL = "UPDATE [Data$] a " _
& "RIGHT JOIN " _
& "[Excel 8.0;HDR=No;IMEX=2;DATABASE=" _
& ThisWorkbook.FullName & "].[FORM$] b " _
& "ON a.F1=b.F1 " _
& "SET a.F4=b.F3,a.F5=b.F4,a.f1=b.f1"
1./ A và B là do mình tự gán vào, a là màu xanh, b là màu đỏ.
2./ F1, F2,... Fn Thì nó là tên cột của csdl F1 tương ứng cột 1, F2 tương ứng cột 2... Vì mình khai báo HDR=No nên nó qui ước thế. Ngược lại nếu HDR=Yes thì mình lấy tên cột thay cho F1,F2...

P/S: Buồn thì do tâm trạng, đâu phải viết bài mới buồn đâu bạn.
 
1./ A và B là do mình tự gán vào, a là màu xanh, b là màu đỏ.
2./ F1, F2,... Fn Thì nó là tên cột của csdl F1 tương ứng cột 1, F2 tương ứng cột 2... Vì mình khai báo HDR=No nên nó qui ước thế. Ngược lại nếu HDR=Yes thì mình lấy tên cột thay cho F1,F2...

P/S: Buồn thì do tâm trạng, đâu phải viết bài mới buồn đâu bạn.

Em hiểu rồi.
Nhưng Tại sheet Form: em thử nhập số hóa đơn mới là INVOICE000011 (trước chỉ có đến INVOICE000010)
Khi nhấn nhập không thấy số 11 được nhập vào DATA dòng cuối cùng
 
Lần chỉnh sửa cuối:
Em hiểu rồi.
Nhưng Tại sheet Form: em thử nhập số hóa đơn mới là INVOICE000011 (trước chỉ có đến INVOICE000010)
Khi nhấn nhập không thấy số 11 được nhập vào DATA dòng cuối cùng
Mình test thấy ok mà bạn, thôi thì bạn gửi file lên mình test lại thử nhé.
 
Em hiểu rồi.
Nhưng Tại sheet Form: em thử nhập số hóa đơn mới là INVOICE000011 (trước chỉ có đến INVOICE000010)
Khi nhấn nhập không thấy số 11 được nhập vào DATA dòng cuối cùng

Code của a Hai Ok rồi mà bạn --> hay là bạn test mà chưa xóa hết các ghi chú yêu cầu trong 2 file form và Data nhj ?:unknw:


:harp:
" Nhân ngày 8-3 chúc riêng bạn và toàn thể chị em trong diễn đàn GPE --> ngày càng trẻ trung ,nhiều $ và luôn luôn vui tươi ^^ "

:serenade:
 
Code của a Hai Ok rồi mà bạn --> hay là bạn test mà chưa xóa hết các ghi chú yêu cầu trong 2 file form và Data nhj ?:unknw:

:harp:
" Nhân ngày 8-3 chúc riêng bạn và toàn thể chị em trong diễn đàn GPE --> ngày càng trẻ trung ,nhiều $ và luôn luôn vui tươi ^^ "

:serenade:


Mình test lại, đã ok rồi

P.s: Đang ngồi mày mò quển SQL , hy vọng sẽ hiểu thêm code của Anh Hai Lúa và bạn Hungpec
 
Web KT
Back
Top Bottom