Hỏi về việc quản lỷ dữ liệu của chương trình theo các giá trị đại diện 1, 2, 4, 8, 16 (3 người xem)

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

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

bivily

Thành viên hoạt động
Tham gia
11/10/07
Bài viết
110
Được thích
26
Mình đã viết một tiện ích nhỏ quản lý trong lĩnh vực thi công xây dựng.

Mô tả:
- Cơ quan của mình có khoảng 50 người.
- Các đầu công việc sẽ được giao cho một số người trong số 50 người trên thực hiện.

Ý tưởng:
Mình tổ chức lưu tất cả các công việc vào 1 table của Accsess. Trong đó có cột Nguoithuchien ghi các giá trị như sau (mình không biết thuật toán này tên gì?)
Công việc 1: Nếu người số 1, 3, 4, 6 và 11 thực hiện thì giá trị trong cột Nguoithuchien là: 1069 (tức bằng 2^(1-1) + 2^(3-1) + 2^(4-1) + 2^(6-1) + 2^(11-1))
Công việc 2: Nếu người số 5, 8 và 14 thực hiện thì giá trị trong cột Nguoithuchien là: 8336 (tức bằng 2^(5-1) + 2^(8-1) + 2^(14-1))
....
Công việc n:...Bảng tbNhansu thì mình có 2 cột: ID và HotenTrước đây nếu dùng thuần Access từ giá trị Nguoithuchien lấy được cho mỗi công việc mình sẽ tìm được những người nào thực hiện qua giá trị đại diện thì mình dùng Query như sau



Trước đây nếu dùng thuần Access từ giá trị Nguoithuchien lấy được cho mỗi công việc mình sẽ tìm được những người nào thực hiện qua giá trị đại diện thì mình dùng Query như sau

Mã:
SELECT tbNhansu.* FROM tbNhansu WHERE (((NewXOR([Nhập giá trị đại diện cho nhóm người thực hiện:],[ID]))=True));

Vài viết thêm Function trong VBA (Access)

Mã:
Function NewXOR(AssCode As Long, AssSelect As Byte) As Boolean
    NewXOR = (AssCode Xor (2 ^ (AssSelect - 1))) < AssCode 
End Function

Bây giờ mình muốn viết 1 chương trình bằng C#, nhưng không thể thực hiện được truy vấn nói trên. Xin mọi người chỉ giúp cách khắc phục và cho mình hỏi thuật toán mà mình nói trên tên là gì không? Mình thấy chương trình AutoCAD quản lý các biến theo cách này nên mò mẫm chứ không biết tên thuật toán. Có thuật toán nào khác để biết 1069 -> 1 + 3 + 4 + 6 + 11; 1045 -> 1 + 3 + 5 + 11 ... không?

Cách tổ chức CSDL theo cách này liệu có ổn không hay còn cách nào khác hay hơn? Mình đang có ý tưởng viết chương trình quản lý thi công công trình dựa trên ý tưởng thuật toán này?

Mình đính kèm thêm file cho mọi người dễ hiểu ý tưởng của mình hơn.

Rất mong nhận được sự giúp đỡ kịp thời từ cộng đồng!
 

File đính kèm

(mình không biết thuật toán này tên gì?)


kỹ thuật này gọi là bit map. Dùng 1 biến long (nếu nhiều hơn thì dùng 1 chuỗi) để làm căn bản. Mỗi số tương đương vơi 1 bit trong biến kia.

mình muốn viết 1 chương trình bằng C#

Trị boolean trong C# là trị true-false thực sự, không phải là 0-khác 0 như một số ngôn ngữ khác. Vì vậy thuật toán bit map của nó cũng khác.

Nếu bạn biết viết C# thì nên dùng Linq để truy vấn.

Chú thêm:
Trong các ngôn ngữ dòng họ C, người ta không dùng 2^n, mà dùng con toán dời bit (bit shift), nhanh hơn nhiều. Tuy nhiên có thể trình dịch C# tự động tối ưu hoá bằng cách tự chuyển cách tính.
 
Lần chỉnh sửa cuối:
Cám ơn anh đã giúp đỡ. Em đã xử lý được vấn đề truy vấn theo giải pháp em nêu ở trên. Tuy nhiên hạn chế duy nhất là nếu dùng Uint64 thì chỉ có thể giao nhiệm vụ tối đa cho 64 người. Ở trên anh có đề cập đến

Dùng 1 biến long (nếu nhiều hơn thì dùng 1 chuỗi) để làm căn bản. Mỗi số tương đương vơi 1 bit trong biến kia.

Anh có thể nói giúp em chi tiết hơn được không? Với 64 người em thấy cũng đủ lớn nhưng nếu áp dụng cho các hạng mục thi công của một công trình thì e là không đủ.
 
Xin lỗi, lâu ngày không đụng tới cái này cho nên tôi nhầm từ 1 chút. Kỹ thuật dùng set bit để tượng trung cho công việc gọi là bitmask. Kỹ thuật bitmap dùng cho graphics, pixel.

Nếu bạn dùng C# thì .NET 4 trở lên có một class tên là BitArray để làm chuyện này.
 
Tiếc là hổng đao loát file của bạn được nên đành tạm làm “Thầy bói mù xem voi” vậy. --=0

Trước tiên là nói về ý tưởng cách dùng của bạn. Nó dựa trên 1 nguyên lý thế này
Mã:
1|2|3|4|5|6….
X|X|X|X|X|X…

X ở đây có thể là 0 hay 1. Nếu đánh là 1 thì tương đương vị trị 1 hoặc 2 hoặc… xem như là có, còn đánh 0 nghĩa là hổng có. Cách này chắc lấy ý tưởng từ số nhị phân và người thiết kế không muốn sinh ra quá nhiều biến hoặc quá nhiều cột trong CSDL ( thường là các cột kiểu bool). Và người ta sẽ tận dụng các kiểu dữ liệu số như long, int cũng như những phép toán logic XOR, OR… có thể dùng cho con số như cách bạn dùng.

Cách thiết kế này gọn về dữ liệu nhưng giới hạn về số lượng quản lý vì với 80 mục thì tốn 80 bit tương đương 10 byte. Hiện tại chả có kiểu dữ liệu số nào kích cỡ 10 byte (làm liều thì vẫn được --=0) chưa kể thao tác cũng phức tạp.

Theo như cách tôi thường làm thì để thực hiện được mục tiêu quản lý những người thực hiện chung 1 dự án bạn có thể lập ra bảng NguoiThucHien (Duan, Nhanvien,…) với Duan là ID của dự án, Nhanvien là ID của nhân viên.

Còn nếu bạn vẫn hứng thú với cách dùng dữ liệu cũ thì đơn giản là bạn viết 1 cái hàm tương tự với hàm chuyển số thập phân sang số nhị phân trong C#. Chỉ khác là thay vì xuất ra chuỗi nhị phân thì nó sẽ xuất ra chuỗi những vị trí trong dãy nhị phân có giá trị là 1 ví dụ 1001101 ->1, 4,5,7. Rồi dùng trong query kiểu
Mã:
"SELECT tbNhansu.* FROM tbNhansu WHERE [ID] IN (" + ChuoiViTri + ")"
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom