domfootwear > 14-04-20, 10:41 AM
Xuân Thanh > 14-04-20, 11:04 AM
(14-04-20, 10:41 AM)domfootwear Đã viết:(14-04-20, 10:05 AM)Xuân Thanh Đã viết: Lâu rồi không thấy chú domfootwear xuất hiện. Chắc mải mê với mấy em Gái QuÊ nhỉCũng khá lâu mới ghé qua anh à, do sức khỏe lúc này không còn được như xưa nên phải đành chịu thôi...
Xuân Thanh > 14-04-20, 11:08 AM
(14-04-20, 10:38 AM)domfootwear Đã viết:(14-04-20, 10:28 AM)tranthanhan1962 Đã viết:Bạn hãy xem lại câu hỏi trên nhé. Còn việc thiết kế 2 khóa không phải tào lao đâu bạn. Nếu bạn chưa rành thì cần phải tìm hiểu thêm để khỏi phát biểu linh tinh nữa.(14-04-20, 09:05 AM)domfootwear Đã viết: Không ai thiết kế dữ liệu chứa số hóa đơn như thế.OK! Đồng ý với bạn. Một điều nữa hoá đơn là duy nhất, cho dù bao nhiêu quầy đi nữa thì vẫn không có chuyện trùng. Chỉ cần kiểm tra hoá đơn trùng mà thôi. Đưa số quầy vô đây là một chuyện tào lao. Rất ấn tượng với chữ ký của bạn
Nên tách ra mỗi dòng chứa thông tin 1 số hóa đơn và 1 số quầy. Set 2 field sohd và soquay là khóa.
Trên form khi nhập liệu ta bắt lỗi 3022 để thông báo việc nhập trùng.
tranthanhan1962 > 14-04-20, 01:13 PM
(14-04-20, 11:08 AM)Xuân Thanh Đã viết: Xin lỗi tranthanhan1962 nhé. Cái này thì domfootwear nói đúng. Có table dùng đến 3 trường làm khóa chính đó. Tùy thuộc cách thiết kế CSDL mà dùng thôiBác Xuân Thanh và domfootwear hiểu nhầm ý của mình rồi. Mình không phải là newbie nên không lạ gì vấn đề 1 table có nhiều trường khoá chính, và không ít lần thực hiện trong CSDL của mình, cái mình nói ở đây là nguyên tắc lập hoá đơn (hoá đơn giấy và kể cả hoá đơn số/hoá đơn điện tử). Không có chuyện quầy 1 sử dụng hoá đơn 1,2,3...Rồi quầy 2 sử dụng hoá đơn 1,2,3... vì nguyên tắc báo cáo hoá đơn là phải phát hành hoá đơn trước khi sử dụng và phải chắc chắn không được trùng. Thậm chí phát hành xong mà không sử dụng còn phải báo cáo huỷ, Không bao giờ có chuyện Hoá đơn 1 & quầy 1, Hoá đơn 1 & quầy 2, Hoá đơn 2 & quầy 1, Hoá đơn 2 & quầy 2..., mà phải là Hoá đơn 1 & quầy 1,Hoá đơn 2 & quầy 2,Hoá đơn 3 & quầy 1,Hoá đơn 4 & quầy 2... Có nghĩa là cho dù có bao nhiêu quầy thì số hoá đơn trong tất cả các quầy đều không được trùng nhau (vì các quầy đều là của chung 1 doanh nghiệp), nên mình mới nói là tào lao. Nếu ở đây sử dụng từ [số phiếu] thì mình chấp nhận, nhưng sử dụng từ [hoá hơn] thì đúng là tào lao vì rõ ràng là không hiểu hoá đơn là gì. Làm rắc rối thêm cơ sở dữ liệu một cách không cần thiết. Còn cho dù 100 primary thì chỉ cần nối các field đó lại thành 1 field khi nhập dữ liệu, gán indexed = Yes (No Duplicates) rồi sử dụng bẩy lỗi error 3022 như domfootwear nói phía trên là xong. Sorry
Xuân Thanh > 14-04-20, 01:50 PM
(14-04-20, 01:13 PM)tranthanhan1962 Đã viết:(14-04-20, 11:08 AM)Xuân Thanh Đã viết: Xin lỗi tranthanhan1962 nhé. Cái này thì domfootwear nói đúng. Có table dùng đến 3 trường làm khóa chính đó. Tùy thuộc cách thiết kế CSDL mà dùng thôiBác Xuân Thanh và domfootwear hiểu nhầm ý của mình rồi. Mình không phải là newbie nên không lạ gì vấn đề 1 table có nhiều trường khoá chính, và không ít lần thực hiện trong CSDL của mình, cái mình nói ở đây là nguyên tắc lập hoá đơn (hoá đơn giấy và kể cả hoá đơn số/hoá đơn điện tử). Không có chuyện quầy 1 sử dụng hoá đơn 1,2,3...Rồi quầy 2 sử dụng hoá đơn 1,2,3... vì nguyên tắc báo cáo hoá đơn là phải phát hành hoá đơn trước khi sử dụng và phải chắc chắn không được trùng. Thậm chí phát hành xong mà không sử dụng còn phải báo cáo huỷ, Không bao giờ có chuyện Hoá đơn 1 & quầy 1, Hoá đơn 1 & quầy 2, Hoá đơn 2 & quầy 1, Hoá đơn 2 & quầy 2..., mà phải là Hoá đơn 1 & quầy 1,Hoá đơn 2 & quầy 2,Hoá đơn 3 & quầy 1,Hoá đơn 4 & quầy 2... Có nghĩa là cho dù có bao nhiêu quầy thì số hoá đơn trong tất cả các quầy đều không được trùng nhau (vì các quầy đều là của chung 1 doanh nghiệp), nên mình mới nói là tào lao. Nếu ở đây sử dụng từ [số phiếu] thì mình chấp nhận, nhưng sử dụng từ [hoá hơn] thì đúng là tào lao vì rõ ràng là không hiểu hoá đơn là gì. Làm rắc rối thêm cơ sở dữ liệu một cách không cần thiết. Còn cho dù 100 primary thì chỉ cần nối các field đó lại thành 1 field khi nhập dữ liệu, gán indexed = Yes (No Duplicates) rồi sử dụng bẩy lỗi error 3022 như domfootwear nói phía trên là xong. Sorry
yamakashi2003 > 15-04-20, 12:36 PM
tranthanhan1962 > 15-04-20, 01:54 PM
(15-04-20, 12:36 PM)yamakashi2003 Đã viết: Em cám ơn các bác góp ý, em đã đăng file demo rồi ạ,Ở đây! lúc đầu minh không định tham gia vì sai nguyên tắc hoá đơn. Nhưng nếu là số phiếu, thì chấp nhận được vì ví dụ một cửa hàng ăn uống có quyền sử dụng mỗi một quầy có quyển phiếu thu liên tục nên có thể sử dụng số phiếu trùng nhau. Như vậy quầy 1 có số phiếu thu 01,, 02, 03 thì quầy 2, quầy 3 cũng có thể cùng số phiếu thu như vậy.
trường hợp set 2 khóa em nghĩ không được ạ, giả sử: cùng là quầy 1 nhưng mà hóa đơn là 111 và 555 thì vẫn được chứ ạ, ý em là nó báo trùng trong trường hợp cả số hóa đơn và số quầy y hệt nha ạ.
thuyyeu99 > 15-04-20, 04:18 PM
yamakashi2003 > 17-04-20, 09:31 PM
(15-04-20, 01:54 PM)tranthanhan1962 Đã viết:Em đã test thử và thay đổi 1 chút cho code phù hợp với tên đối tượng của em(15-04-20, 12:36 PM)yamakashi2003 Đã viết: Em cám ơn các bác góp ý, em đã đăng file demo rồi ạ,Ở đây! lúc đầu minh không định tham gia vì sai nguyên tắc hoá đơn. Nhưng nếu là số phiếu, thì chấp nhận được vì ví dụ một cửa hàng ăn uống có quyền sử dụng mỗi một quầy có quyển phiếu thu liên tục nên có thể sử dụng số phiếu trùng nhau. Như vậy quầy 1 có số phiếu thu 01,, 02, 03 thì quầy 2, quầy 3 cũng có thể cùng số phiếu thu như vậy.
trường hợp set 2 khóa em nghĩ không được ạ, giả sử: cùng là quầy 1 nhưng mà hóa đơn là 111 và 555 thì vẫn được chứ ạ, ý em là nó báo trùng trong trường hợp cả số hóa đơn và số quầy y hệt nha ạ.
Bắt đầu phân tích: field QUAY [QUẦY] không thể set primary key được vì sẽ có quyền trùng (1 quầy có thể có nhiều phiếu), field SOPHIEU [SỐ PHIẾU] cũng không thể set primary key được vì sẽ có quyền trùng (Nhiều quầy có quyền giống số phiếu). Chính vì cố ép primary vào số phiếu nên bài toán của bạn không giải quyết được là phải rồi. Bởi vì chẳng phải bài toán giải quyết 1 table có nhiều khoá mà table này chẳng có cái khoá nào, chính vì phân tích sai điều kiện nên nghĩ mãi không ra. Tất nhiên, nếu không có khoá thì làm cách nào để xử lý việc trùng khoá. Chính tôi cũng bị luồng suy nghĩ của bạn làm mờ mắt như bác Xuân Thanh mới đưa ra cái công thức nối hàng đống khoá vì chỉ cần 1 khoá là nó không cho trùng rồi. Cuối cùng đây là bài toán không thể đặt khoá cho field nào cả.
Xác định rõ yêu cầu thì nó rất dễ dàng.
Trên table tạo thêm một field có thể đặt tên QUAYSOPHIEU (quầy và số phiếu) hoặc ngược lại hoặc tên gì cũng được. Bản chất của nó là nối 2 text của số quầy và số phiếu. Vì nó cũng không phải xử lý khoá chính cho ai nên cũng chẳng cần set primary key mà chỉ cần gán indexed = Yes (No Duplicates) để nó không được trùng là đủ.
Trên form nhập liệu xử lý code như sao:
Event AfterUpdate của 2 textbox QUAY và SOPHIEU giống nhau có mã VBA:
Private Sub QUAY _AfterUpdate()
On Error GoTo BiLoi
QUAYSOPHIEU.Value = QUAY.Value & SOPHIEU .Value
BiLoi:
MsgBox "Đã thực hiện số phiếu: " & SOPHIEU .Value & " ở quầy " & QUAY.Value & " nên không thể nhập dữ liệu được"
Form.Undo
End Sub
Nó sẽ tự động xoá dữ liệu để nhập lại. Một công việc đơn giản nhưng do phân tích sai dữ liệu khiến nó trở nên phức tạp
tranthanhan1962 > 18-04-20, 08:54 PM
(17-04-20, 09:31 PM)yamakashi2003 Đã viết: Em đã test thử và thay đổi 1 chút cho code phù hợp với tên đối tượng của emKhi bạn phân tích đến đây thì tôi hết hiểu được cái công việc của bạn rồi, cái mã soquayhd= 1+2+3;111+222+333. Bạn gom nó lại để làm gì và thể hiện cái gì, Số quầy 1+2+3 có nghĩa là quầy có tên [1+2+3] hay là tổng hợp 3 quầy và cái ý nghĩa của nó là gì. Tôi còn không hiểu làm sao máy hiểu
Private Sub sohd_AfterUpdate()
On Error GoTo BiLoi
quayhd.Value = soquay.Value & ";" & sohd.Value
Exit Sub
BiLoi:
MsgBox "da luu hoa don: " & sohd.Value & " quay " & soquay.Value & " roi nhe"
Form.Undo
End Sub
Nhưng kết quà là nó chỉ báo trùng khi mà dữ liệu ở cột soquay và cot sohd y như dòng trước đó (giả sử em nhập soquay: 1+2+3; sohd: 111+222+333, thì cột soquayhd: 1+2+3;111+222+333, giống với dữ liệu y hệt ở 1 dòng đầu tiên trong table)
nhưng nó hiện ra thông báo trùng dữ liệu của access, không cho lưu, chứ nó k hiện thông báo msgbox và tự động xóa dữ liệu để nhập lại,
Và cái em mong muốn nhất là giả sử em nhập soquay: 1+9, sohd: 111+999 thì nó sẽ báo là phiếu 1/111 đã được nhập rồi thì lại không được bác ạ
tức là em nhập như vậy ở cột soquayhd: 1+9;111+999 =>nó vẫn lưu bình thường