Số chứng từ tự động tăng khi mỗi người dùng một máy trong mạng LAN (1 người xem)

  • Thread starter Thread starter bachluy
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

bachluy

Thành viên mới
Tham gia
24/1/13
Bài viết
6
Được thích
2
Tôi có nhu cầu viết 01 file tự động tăng số chứng từ khi mỗi người dùng một máy trong mạng LAN. Ý tưởng nhưng chưa thực hiện được như sau:

- Tôi sẽ tạo một file đặt ở máy chủ (ví dụ file CT.xls). File này sẽ chia sẽ toàn bộ cho mọi người (cho phép chỉnh sửa).
- Mỗi máy sẽ có một file riêng (Ví dụ file May1.xls cho máy 1).

Khi tạo chứng từ từ file May1.xls thì nó sẽ tự động mở file CT.xls và chép tông tin vào file CT.xls (lưu ở máy chủ). Sau đó lấy [Max(Số chứng từ ở file CT.xls)+1] chép vào ô Số chứng từ của file May1.xls. Sau khi lấy xong sẽ tự động đóng và save file CT.xls lại.

Ý tưởng là vậy nhưng chưa thực hiện được. Mong các bạn hỗ trợ tiếp.

Có cách nào để tạm hoãn việc lấy số chứng từ (bẫy lỗi) khi có một người khác cũng đang thực hiện cùng lúc với mình? Vì như vậy thì người mở file CT.xls lên trước mới có quyền lưu nó, còn người kia chỉ xem chứ không được lưu.
 

File đính kèm

Tôi có nhu cầu viết 01 file tự động tăng số chứng từ khi mỗi người dùng một máy trong mạng LAN. Ý tưởng nhưng chưa thực hiện được như sau:

- Tôi sẽ tạo một file đặt ở máy chủ (ví dụ file CT.xls). File này sẽ chia sẽ toàn bộ cho mọi người (cho phép chỉnh sửa).
- Mỗi máy sẽ có một file riêng (Ví dụ file May1.xls cho máy 1).

1./Khi tạo chứng từ từ file May1.xls thì nó sẽ tự động mở file CT.xls và chép tông tin vào file CT.xls (lưu ở máy chủ). Sau đó lấy [Max(Số chứng từ ở file CT.xls)+1] chép vào ô Số chứng từ của file May1.xls. Sau khi lấy xong sẽ tự động đóng và save file CT.xls lại.

Ý tưởng là vậy nhưng chưa thực hiện được. Mong các bạn hỗ trợ tiếp.

2./Có cách nào để tạm hoãn việc lấy số chứng từ (bẫy lỗi) khi có một người khác cũng đang thực hiện cùng lúc với mình? Vì như vậy thì người mở file CT.xls lên trước mới có quyền lưu nó, còn người kia chỉ xem chứ không được lưu.

1./ Bạn chạy code sau nhé:

[GPECODE=sql]Sub Them()
Dim strSQL As String, cnn As Object, rst As Object, LastRow As Integer, strFileName As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
strFileName = ThisWorkbook.Path & "\CT.xls" ' Chinh duong dan den file CT.xls cua ban
With cnn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & strFileName & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With
strSQL = "select max(f1) as sct from [sheet1$]"
With rst
.Open strSQL, cnn, 1, 3
LastRow = Range("B65000").End(xlUp).Row
Range("A3:A" & LastRow) = !sct + 1
.Close
strSQL = " INSERT INTO [Sheet1$] SELECT * FROM [EXCEL 8.0;Database=" & ThisWorkbook.FullName & _
";HDR=No].[Sheet1$a3:d" & LastRow & "];"
.Open strSQL, cnn, 1, 3
End With
Set rst = Nothing
cnn.Close: Set cnn = Nothing

End Sub
[/GPECODE]
2./ Khi dùng ADO trên thì không cần lo vấn đề mở file nhe bạn.

Lưu ý: Tải file và giải nén xong rồi vào folder chứa nó chạy file May1 nha.
 

File đính kèm

Upvote 0
Sao em thử chép file CT.xls vào máy khác, cho máy đó mở file này lên sẵn. Em vào máy em để thử thì không được. Nó mở file CT.xls lên dưới dạng ReadOnly và không cập nhật số CT.
 
Upvote 0
Sao em thử chép file CT.xls vào máy khác, cho máy đó mở file này lên sẵn. Em vào máy em để thử thì không được. Nó mở file CT.xls lên dưới dạng ReadOnly và không cập nhật số CT.

Không cần mở file CT.xls, lưu ý đoạn code trên nếu bạn chép file sang máy khác thì phải điều chỉnh đường dẫn thích hợp + phải share nó trên mạng lan hoặc map ổ đĩa nó.

strFileName = ThisWorkbook.Path & "\CT.xls" ' Chinh duong dan den file CT.xls cua ban
 
Upvote 0
Em đã sửa rồi, share rồi. Nhưng ý em là sợ khi có ai đó mở file đó lên ấy mà. Vì họ mở lên thì máy khác sẽ không cập nhật được. Em muốn phải "bẫy lỗi" cho trường hợp đó. Cám ơn anh Hai Lúa rất nhiều.
 
Upvote 0
Em đã sửa rồi, share rồi. Nhưng ý em là sợ khi có ai đó mở file đó lên ấy mà. Vì họ mở lên thì máy khác sẽ không cập nhật được. Em muốn phải "bẫy lỗi" cho trường hợp đó. Cám ơn anh Hai Lúa rất nhiều.

Như mình nói ở trên, ado sẽ tự động cập nhật dù file đó đang mở hay đóng. Bạn yên tâm nhé.
 
Upvote 0
Như mình nói ở trên, ado sẽ tự động cập nhật dù file đó đang mở hay đóng. Bạn yên tâm nhé.
Anh xem lại giúp em đi. Khi máy khác mở file CT.xls trước thì các máy còn lại không cập nhật được. Nó chỉ mở file CT.xls lên rồi ... im re. Anh test lại giúp em nhé.
 
Upvote 0
Anh xem lại giúp em đi. Khi máy khác mở file CT.xls trước thì các máy còn lại không cập nhật được. Nó chỉ mở file CT.xls lên rồi ... im re. Anh test lại giúp em nhé.

Mở file CT.xls làm gì vậy bạn? Code tự cập nhật vào đó mà.
 
Upvote 0
Mở file CT.xls làm gì vậy bạn? Code tự cập nhật vào đó mà.
Mình nghĩ nếu dùng ADO thì file CT.xls vẫn được mở ngầm khi chạy code. Do đó, nếu hai hay nhiều người cùng thao tác 1 thời điểm thì việc ghi dữ liệu vào file CT.xls bị trục trặc. Vì vậy, chúng ta phải xác định xem tại thời điểm mở file CT.xls thì nó có phải là ReadOnly hay không. Nếu nó là ReadOnly thì chứng tỏ file đó đang được mở bởi một máy khác. Khi đó mình sẽ cho dừng thao tác lại và hiện hộp thoại thông báo yêu cầu thử lại.
Theo mình nghĩ là vậy, nhờ anh Hai Lúa test lại và viết giúp code hoàn thiện luôn. Mình còn lờ mờ về ADO lắm.
Mình nghĩ đây có thể là cách để làm một chương trình dùng chung cho các máy trong mạng LAN.
 
Upvote 0
Mình nghĩ nếu dùng ADO thì file CT.xls vẫn được mở ngầm khi chạy code. Do đó, nếu hai hay nhiều người cùng thao tác 1 thời điểm thì việc ghi dữ liệu vào file CT.xls bị trục trặc. Vì vậy, chúng ta phải xác định xem tại thời điểm mở file CT.xls thì nó có phải là ReadOnly hay không. Nếu nó là ReadOnly thì chứng tỏ file đó đang được mở bởi một máy khác. Khi đó mình sẽ cho dừng thao tác lại và hiện hộp thoại thông báo yêu cầu thử lại.
Theo mình nghĩ là vậy, nhờ anh Hai Lúa test lại và viết giúp code hoàn thiện luôn. Mình còn lờ mờ về ADO lắm.
Mình nghĩ đây có thể là cách để làm một chương trình dùng chung cho các máy trong mạng LAN.

Nói nhiều bạn cũng đâu thèm test những gì mình nói ở trên.

NẾU DÙNG ADO THÌ KHÔNG CÓ CHUYỆN MỞ FILE NHƯ BẠN NÓI, DÙ FILE ĐANG MỞ, NÓ VẪN GHI DỮ LIỆU BÌNH THƯỜNG.
 
Upvote 0
Nói nhiều bạn cũng đâu thèm test những gì mình nói ở trên.

NẾU DÙNG ADO THÌ KHÔNG CÓ CHUYỆN MỞ FILE NHƯ BẠN NÓI, DÙ FILE ĐANG MỞ, NÓ VẪN GHI DỮ LIỆU BÌNH THƯỜNG.
Mình đã Test rất kỹ rồi. Mình có mượn tạm file bài này để làm thử. Mình chép file CT.xls vào một máy (tạm gọi là máy chủ). Các máy khác mình tạo file cập nhật (chẳng hạn máy 1 là file May1.xls). Mình chép code vào file May1 và có sửa lại chút xíu như sau:

----------------------
Sub Them()
If Sheet1.Range("B3") <> "" And Sheet1.Range("C3") <> "" Then


Dim strSQL As String, cnn As Object, rst As Object, LastRow As Integer, strFileName As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
strFileName = "\\Dichvucomputer\shareddocs\CT.xls" ' Chinh duong dan den file CT.xls cua ban
With cnn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & strFileName & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With
strSQL = "select max(f1) as sct from [sheet1$]"
Anser = MsgBox("Ban co muon them thong tin nay vao may chu khong ?", vbDefaultButton1 + vbQuestion + vbYesNo, "SerSoft")


If Anser = vbYes Then
With rst
.Open strSQL, cnn, 1, 3
LastRow = Range("B65000").End(xlUp).Row
Range("A3:A" & LastRow) = !sct + 1
.Close
strSQL = " INSERT INTO [Sheet1$] SELECT * FROM [EXCEL 8.0;Database=" & ThisWorkbook.FullName & _
";HDR=No].[Sheet1$a3:d" & LastRow & "];"
.Open strSQL, cnn, 1, 3
End With
Set rst = Nothing
cnn.Close: Set cnn = Nothing
End If
Else
MsgBox "Ban chua nhap du du lieu !"
End If


End Sub
---------------------------------

Khi hộp thoại hiện lên mình không Yes hay No gì hết, cứ để vậy. Kết quả là máy khác không ghi được dữ liệu vào file CT.xls.
NHỜ ANH HAI LÚA GÓP Ý.
 
Upvote 0
Mình đã Test rất kỹ rồi. Mình có mượn tạm file bài này để làm thử. Mình chép file CT.xls vào một máy (tạm gọi là máy chủ). Các máy khác mình tạo file cập nhật (chẳng hạn máy 1 là file May1.xls). Mình chép code vào file May1 và có sửa lại chút xíu như sau:

----------------------
Sub Them()
If Sheet1.Range("B3") <> "" And Sheet1.Range("C3") <> "" Then


Dim strSQL As String, cnn As Object, rst As Object, LastRow As Integer, strFileName As String
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
strFileName = "\\Dichvucomputer\shareddocs\CT.xls" ' Chinh duong dan den file CT.xls cua ban
With cnn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & strFileName & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With
strSQL = "select max(f1) as sct from [sheet1$]"
Anser = MsgBox("Ban co muon them thong tin nay vao may chu khong ?", vbDefaultButton1 + vbQuestion + vbYesNo, "SerSoft")


If Anser = vbYes Then
With rst
.Open strSQL, cnn, 1, 3
LastRow = Range("B65000").End(xlUp).Row
Range("A3:A" & LastRow) = !sct + 1
.Close
strSQL = " INSERT INTO [Sheet1$] SELECT * FROM [EXCEL 8.0;Database=" & ThisWorkbook.FullName & _
";HDR=No].[Sheet1$a3:d" & LastRow & "];"
.Open strSQL, cnn, 1, 3
End With
Set rst = Nothing
cnn.Close: Set cnn = Nothing
End If
Else
MsgBox "Ban chua nhap du du lieu !"
End If


End Sub
---------------------------------

Khi hộp thoại hiện lên mình không Yes hay No gì hết, cứ để vậy. Kết quả là máy khác không ghi được dữ liệu vào file CT.xls.
NHỜ ANH HAI LÚA GÓP Ý.

Chuyển cái thông báo đó lên đầu, khi người dùng bấm Yes thì sẽ chạy code, ngược lại sẽ thôi, khi chưa bấm, để vậy nó không đá động gì đến file chứa dữ liệu.
Sao bạn không dùng file access làm file chứa dữ liệu nhỉ?
 
Upvote 0
Chuyển cái thông báo đó lên đầu, khi người dùng bấm Yes thì sẽ chạy code, ngược lại sẽ thôi, khi chưa bấm, để vậy nó không đá động gì đến file chứa dữ liệu.
Sao bạn không dùng file access làm file chứa dữ liệu nhỉ?
Mình chỉ ví dụ về trường hợp file CT.xls bị mở nên mới dùng cái thông báo đó thôi. Quan trọng là làm cách nào để biết là người khác đang thao tác giống mình (tức là cũng mở file CT.xls lên rồi ghi dữ liệu vào đó, sau đó đóng file CT.xls lại - mình nghĩ bản chất của ADO là vậy ?!?). Bởi vì mình dùng file này cho nhiều người cùng làm (có thể là hàng trăm) nên chắc chắn sẽ có trường hợp hai người cùng làm một thời điểm. Hay có cách nào khác để giải quyết trường hợp này không (bằng VBA excel thôi nhé).
Mình chưa rành access lắm. Anh có thể hướng dẫn bài này nếu dùng access luôn không? Khi ghi dữ liệu vào access thì nó có lợi gì so với excel? Nó có mở ngầm file access không?
 
Upvote 0
Mình chỉ ví dụ về trường hợp file CT.xls bị mở nên mới dùng cái thông báo đó thôi. Quan trọng là làm cách nào để biết là người khác đang thao tác giống mình (tức là cũng mở file CT.xls lên rồi ghi dữ liệu vào đó, sau đó đóng file CT.xls lại - mình nghĩ bản chất của ADO là vậy ?!?). Bởi vì mình dùng file này cho nhiều người cùng làm (có thể là hàng trăm) nên chắc chắn sẽ có trường hợp hai người cùng làm một thời điểm. Hay có cách nào khác để giải quyết trường hợp này không (bằng VBA excel thôi nhé).
Mình chưa rành access lắm. Anh có thể hướng dẫn bài này nếu dùng access luôn không? Khi ghi dữ liệu vào access thì nó có lợi gì so với excel? Nó có mở ngầm file access không?

Nếu hàng trăm user cùng lúc thì giải pháp file excel và access làm csdl coi như là phá sản rồi bạn.
 
Upvote 0
Mình chỉ ví dụ về trường hợp file CT.xls bị mở nên mới dùng cái thông báo đó thôi. Quan trọng là làm cách nào để biết là người khác đang thao tác giống mình (tức là cũng mở file CT.xls lên rồi ghi dữ liệu vào đó, sau đó đóng file CT.xls lại - mình nghĩ bản chất của ADO là vậy ?!?). Bởi vì mình dùng file này cho nhiều người cùng làm (có thể là hàng trăm) nên chắc chắn sẽ có trường hợp hai người cùng làm một thời điểm. Hay có cách nào khác để giải quyết trường hợp này không (bằng VBA excel thôi nhé).
Mình chưa rành access lắm. Anh có thể hướng dẫn bài này nếu dùng access luôn không? Khi ghi dữ liệu vào access thì nó có lợi gì so với excel? Nó có mở ngầm file access không?

Tôi có thể trả lời bạn vấn đề này. Hiện nay để chia sẻ file Excel cho nhiều người cùng một lúc soạn thảo qua mạn LAN, Internet (hàng trăm user) thì chỉ có Google.Docs, Microsoft Live, và Add-in A-Tools mà thôi! Nếu file Excel chứa mã VBA và có thể chạy được khi chia sẻ qua mạng thì chỉ có Add-in A-Tools mới làm được việc này!
 
Upvote 0

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

Back
Top Bottom