Làm sao để đồng bộ dữ liệu giữa các bảng?

  • Thread starter cangcan
  • Ngày gửi
C

cangcan

Guest
10/8/06
3
0
0
Ninh Thuận
Tôi dùng access 2003 để quản lý một số khách hàng theo dia phuong gồm hai table là hosoKh và chitietKH và hai form hosoKH và subhosoKH vi vậy phải tạo mã khách hàng theo địa phương để dể quản lý. Ví dụ :A001TX là một mã quản lý trong đó hai ký tự cuối cùng TX lả chữ viết tằc theo địa phương. Khi khách hàng thay đổi chổ ở thì tôi lại phải điều chỉnh mã khách hàng theo nơi mới để dể quản lý nhưng khi thay đổi mã khách hàng ví dụ thành A001DG thì các chứng từ có mã khách hàng A001TX trong table chitietKH không thể hiện được. Nay nhờ các anh hướng dẩn dùm làm cách nào để khi thay đổi mã khách hàng A001TX trên form hosoKH thì các chứng từ liên quan trên form subhosoKH cũng thay đổi theo vì số lượng record rất nhiều nên không thể làm thủ công mải được. Xin cản ơn
 
Khóa học Quản trị dòng tiền
S

Song Huong

Cao cấp
cangcan nói:
Tôi dùng access 2003 để quản lý một số khách hàng theo dia phuong gồm hai table là hosoKh và chitietKH và hai form hosoKH và subhosoKH vi vậy phải tạo mã khách hàng theo địa phương để dể quản lý. Ví dụ :A001TX là một mã quản lý trong đó hai ký tự cuối cùng TX lả chữ viết tằc theo địa phương. Khi khách hàng thay đổi chổ ở thì tôi lại phải điều chỉnh mã khách hàng theo nơi mới để dể quản lý nhưng khi thay đổi mã khách hàng ví dụ thành A001DG thì các chứng từ có mã khách hàng A001TX trong table chitietKH không thể hiện được. Nay nhờ các anh hướng dẩn dùm làm cách nào để khi thay đổi mã khách hàng A001TX trên form hosoKH thì các chứng từ liên quan trên form subhosoKH cũng thay đổi theo vì số lượng record rất nhiều nên không thể làm thủ công mải được. Xin cản ơn
Bạn nên thêm 01 bảng DiaPhuong. Sửa lại cấu trúc HoSoKh thêm field madp.
HoSoKh(makh, madp, tenkh,...)
DiaPhuong(madp, TenDp,...)
ChiTietKH(makh,...)
Thân.
 
Sửa lần cuối:
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
4
18
Khánh Hòa
cangcan nói:
làm cách nào để khi thay đổi mã khách hàng A001TX trên form hosoKH thì các chứng từ liên quan trên form subhosoKH cũng thay đổi theo
Dear all,
--------
Điều này được giải quyết đơn giản bởi Relationship. Hiểu một cách đơn giản là bạn phải tạo ra một "sợi dây quan hệ" giữa hai bảng hosoKH và chitietKH. Quan hệ này được thiết lập bởi các điều kiện ràng buộc toàn vẹn:
- Cascade Update Related Fields
- Cascade Delete Related Record.
Đây là kiến thức hết sức cơ bản của lập trình với MS Access. Bạn nên dừng lại một chút để tìm hiểu một vài thuật ngữ như "Relationship", "Primary Key", "Foreign Key"... trước khi xây dựng một chương trình quản lý thực thụ!
:friend:
 
Sửa lần cuối:
thanhvunt

thanhvunt

http://thanhvunt.com
22/1/06
2,076
10
0
Nha Trang
thanhvunt.com
Nếu số lượng KH lớn và nằm rải rác nhiều nơi thì bạn nên thêm 1 bảng địa phương rùi đặt quan hệ sang.

Nếu ít thì cũng không cần lắm nhưng khi bạn nối cái quan hệ nhớ đánh dấu vào ô đầu tiên để 2 ô bên dưới sáng lên (có hiệu lực).

Sau đó nếu bạn đánh dấu vào "Cascade Update Related Fields" thì nó sẽ tự động cập nhật toàn bộ những trường liên kết trên các bảng liên quan khi trường đó được sửa trên bảng gốc (mặc định nó sẽ không sửa trên các bảng khác khi trường đó trên bảng gốc bị thay đổi).

Nếu bạn đánh dấu vào "Cascade Delete Related Records" thì nó sẽ tự động xóa toàn bộ những bản ghi liên kết trên các bảng liên quan khi bản ghi đó bị xóa trên bảng gốc (ví dụ một ngày nào đó bạn chán 1 khách hàng nào đó lâu rùi không còn mua bán nữa, bạn xóa ông ta đi cho đỡ chật đất thì tai họa sẽ xảy ra, mọi dữ liệu về mua bán - nhập xuất - thu chi có liên quan đến ông ta cũng sẽ theo gió mà đi. Do đó cần hết sức cẩn thận khi dùng cái này vì chỉ cần lỡ tay xóa 1 bản ghi gốc nào đó thì mọi dữ liệu liên quan đến bản ghi này sẽ biến sạch).

Đó chính là cái được gọi là điều kiện ràng buộc toàn vẹn

Hic, đã 7 năm rùi không rờ đến, không bít mình nói đúng không.:bigok:
 
Sửa lần cuối:
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
4
18
Khánh Hòa
OldNTV nói:
Hic, đã 7 năm rùi không rờ đến, không bít mình nói đúng không.
Dear OldNTV,
-------------
Dạ không đúng mấy ạ:
OldNTV nói:
bạn xóa ông ta đi cho đỡ chật đất thì tai họa sẽ xảy ra, mọi dữ liệu về mua bán - nhập xuất - thu chi có liên quan đến ông ta cũng sẽ theo gió mà đi. Do đó cần hết sức cẩn thận khi dùng cái này vì chỉ cần lỡ tay xóa 1 bản ghi gốc nào đó thì mọi dữ liệu liên quan đến người này sẽ biến sạch).
Chúng ta không thể xoá một Primary Key trong khi nó đang là một Foreign Key của một bảng khác. Chúng ta chỉ có thể xoá hết tất cả các Foreign Key thì mới xoá được Primary Key.
Như vậy phải nói ngược lại rằng Cascade Delete Related Fields có ích, nó đảm bảo cho cở sở dữ liệu các kết nối rất toàn vẹn!
:dzo:
 
S

Song Huong

Cao cấp
Đào Việt Cường nói:
Dear all,
--------
Điều này được giải quyết đơn giản bởi Relationship. Hiểu một cách đơn giản là bạn phải tạo ra một "sợi dây quan hệ" giữa hai bảng hosoKH và chitietKH. Quan hệ này được thiết lập bởi các điều kiện ràng buộc toàn vẹn:
- Cascade Update Related Fields
- Cascade Delete Related Record.
Đây là kiến thức hết sức cơ bản của lập trình với MS Access. Bạn nên dừng lại một chút để tìm hiểu một vài thuật ngữ như "Relationship", "Primary Key", "Foreign Key"... trước khi xây dựng một chương trình quản lý thực thụ!
:friend:

Trường hợp bất khả kháng, người ta mới update Primary Key. Nếu dữ liệu nhiều dùng Update Related Fields dễ hy sinh lắm.
 
C

cangcan

Guest
10/8/06
3
0
0
Ninh Thuận
Xin cảm ơn mọi người vì đã hướng dẩn và giúp đở. Vì vừa viết chương trình vừa sử dụng nên quên mất các Relationship của Access, nhờ các anh mà mình còn tìm ra vô số record mồ côi để dọn dẹp và dung lượng chương trình bây giờ chỉ còn có một nửa so với lâu nay.Xin cảm ơn.
 
hai2hai

hai2hai

VNUNI Makes a difference
29/4/04
2,030
125
63
52
Hà nội
vnuni.net
Đào Việt Cường nói:
Chúng ta không thể xoá một Primary Key trong khi nó đang là một Foreign Key của một bảng khác. Chúng ta chỉ có thể xoá hết tất cả các Foreign Key thì mới xoá được Primary Key.

Định gửi theo 1 cái hình ví dụ nhưng ko đủ quota :)

Thực ra có thể Cascade delete ở mọi trường hợp và có rất nhiều trường hợp xảy ra:

Ví dụ:
Bảng tb_Employee Có thông tin sau:

ID (PK)
FirstName
....
DivisionID (FK)
....

Bảng tb_Division có các trường sau:
ID (PK)
Name
....

Giả sử giữ liệu đã được nhập:
Division
1
Phòng kế toán

Employee:
001,
Nguyễn Văn A
...
1 (là DivisionID)
....

Bây giờ ta có các cách để thiết lập quan hệ XÓA (Child Delete) với loại quan hệ là Non-Identifying như sau:
- Không cho phép xóa (RESTRICT)
- Xóa luôn dữ liệu liên quan (CASCADE) -> Xóa luôn tất cả các Emps thuộc division = 1 (Kiểu này thì ko chấp nhận rồi :))
- Đặt giá trị Default (SET DEFAULT): (Xóa division 1 đi thì những bản ghi trong Employee có DivisionID = 1 sẽ được DivisionID gán giá trị là 1 giá trị default nào đó (ví dụ là 0 chẳng hạn - giả sử 0 có trong Division)
- NO ACTION: ko làm các thao tác dữ liệu.
- NONE: Không làm gì cả, trường DivisionID vẫn để nguyên giá trị.

Trong khi thiết lập quan hệ cho DB thì có thể làm được hết các trường hợp ... tưởng như ko thể. Tuy nhiên, trong yêu cầu nghiệp vụ có quy định như thế nào thì làm như thế thôi. Vì thế, trong yêu cầu phần mềm có yêu cầu relation được thiết lập kiểu nào thì ta đặt thiết lập kiểu đó cho DB.

Vì thế: Không có gì là "không thể xóa" cả
 
Sửa lần cuối:

Xem nhiều