2013-07-29 26 views
5

Có thể thay đổi cách chỉ mục được sử dụng trong TClientDataSet để sắp xếp các bản ghi không? Sau khi đọc this question, tôi nghĩ sẽ tốt hơn nếu có thể sắp xếp các trường chuỗi một cách hợp lý trong tập dữ liệu khách hàng. Nhưng tôi không có ý tưởng làm thế nào để ghi đè lên hành vi mặc định của tập dữ liệu khách hàng khi nói đến chỉ mục. Ý tưởng nào?Cách ghi đè cơ chế sắp xếp của TClientDataSet

PS: CDS của tôi không được liên kết với bất kỳ nhà cung cấp nào. Tôi đang tìm cách sửa đổi cơ chế sắp xếp của số TClientDataSet (hoặc chính bố mẹ đã thực thi cơ chế đó).

+0

Bạn có đang hiển thị dữ liệu từ CDS cho người dùng không? Nếu vậy, bạn đang sử dụng thành phần nào? Hầu hết các thành phần kiểu Grid và ListView cho phép bạn thực hiện sắp xếp tùy chỉnh, nếu CDS không có những gì bạn cần, bạn có thể thử sử dụng nó thay thế. – LightBulb

+0

@LightBulb Tôi đang sử dụng JvDBGrid. –

Trả lời

5

Bạn không thể ghi đè cơ chế sắp xếp của ClientDataSet - trừ khi bạn viết lại phần theo Midas.

Để đạt được sắp xếp chính xác (bất kỳ hợp lý có nghĩa là) bạn có thể giới thiệu một trường mới và đặt giá trị của nó theo cách sao cho được sắp xếp theo cơ chế tiêu chuẩn.

+0

Nguồn midas.obj có sẵn không? Tôi nhiều hơn sẵn sàng để thay đổi bộ phận theo của nó nếu nguồn có sẵn và các thỏa thuận cấp phép cho phép chỉnh sửa nó. –

+0

c: \ Program Files (x86) \ Embarcadero \ RAD Studio \ 9.0 \ nguồn \ data \ dsnap \ midas \ –

+0

tôi không có thư mục đề cập trong thư mục cài đặt XE2 tôi. :-( –

1

Tôi sẽ cố gắng đạt được sắp xếp mong muốn với câu lệnh SQL cung cấp cho ClientDataSet.

Ví dụ nếu tôi đã làm việc với các chuỗi sau đây trong FieldN

a_1 
a_20 
a_10 
a_2 

và tôi muốn họ được sắp xếp như thế này (tôi giả định này cũng tương tự như những gì bạn có ý nghĩa bởi logic

a_1 
a_2 
a_10 
a_20 

thì tôi sẽ viết câu SQL thành

SELECT  FieldA, 
      FieldB, 
      ... , 
      FieldN, 
      CAST(SUBSTRING(FieldN, 3, 2) TO INTEGER) As FieldM '<== pseudocode 
FROM  TableA 
ORDER BY FieldM 

Cú pháp chính xác của các hoạt động SubString và Cast to Integer sẽ phụ thuộc vào DBMS bạn đang sử dụng.

+0

CDS của tôi là một bộ nhớ _in memory_. –

+0

Tất cả dữ liệu trên máy tính đều có trong bộ nhớ, điều gì đặc biệt về CDS của bạn? :-) – Sam

+0

Một ClientDataSet không thể thực thi SQL. –

1

Đọc bài viết trực tuyến tuyệt vời Understanding ClientDataSet Chỉ mục theo Cary Jensen.

Nó giải thích cách sử dụng các cách sắp xếp và lập chỉ mục khác nhau bằng cách sử dụng IndexDefs, IndexFieldNamesIndexName.

Chỉnh sửa: trả lời nhận xét của bạn.

Bạn có thể không ghi đè lên một phương pháp sắp xếp trong TClientDataSet, nhưng bạn có thể thêm làm điều này:

Nếu bạn muốn làm sắp xếp vào bất cứ điều gì khác hơn là lĩnh vực hiện có tùy chỉnh, sau đó bạn phải thêm một Calculated Field, thực hiện một loại tính toán đơn hàng trong sự kiện OnCalcFields, sau đó thêm trường đó vào IndexDefs.

+0

Tôi đã đọc bài viết. Tôi đang tìm cách ghi đè lên phương thức thực tế so sánh và định vị các bản ghi theo chỉ mục hiện tại. Một cái gì đó như http://docwiki.embarcadero.com/Libraries/XE4/en/System.Classes.TStringList.CustomSort –

+0

Xem chỉnh sửa của tôi: bạn có thể sử dụng 'trường được tính toán' cho điều này. –

+0

Tôi có một câu hỏi khác liên quan đến việc sử dụng các trường và chỉ mục được tính toán. Tôi đã không thể sử dụng các trường được tính toán bên trong trong chỉ mục cho đến thời điểm này: http://stackoverflow.com/questions/17896329/how-to-sort-a-clientdataset-on-a-calculated-field?rq=1 –

Các vấn đề liên quan