Miklix

Cách lặp lại các phần tử của Enum từ mã X++ trong Dynamics AX 2012

Đã xuất bản: lúc 23:11:10 UTC 15 tháng 2, 2025
Cập nhật lần cuối: lúc 08:42:11 UTC 12 tháng 1, 2026

Bài viết này giải thích cách liệt kê và lặp qua các phần tử của một kiểu liệt kê cơ bản trong Dynamics AX 2012, bao gồm cả ví dụ mã X++.


Trang này được dịch máy từ tiếng Anh để có thể tiếp cận được với nhiều người nhất có thể. Thật không may, dịch máy vẫn chưa phải là công nghệ hoàn thiện, do đó có thể xảy ra lỗi. Nếu bạn thích, bạn có thể xem phiên bản tiếng Anh gốc tại đây:

How to Iterate Over the Elements of an Enum from X++ Code in Dynamics AX 2012

Thông tin trong bài viết này dựa trên Dynamics AX 2012 R3. Thông tin này có thể không còn đúng đối với các phiên bản khác.

Gần đây tôi đang tạo một biểu mẫu cần hiển thị giá trị cho mỗi phần tử trong một kiểu liệt kê (enum). Thay vì tạo thủ công các trường (và sau đó phải bảo trì biểu mẫu nếu kiểu liệt kê bị thay đổi), tôi quyết định triển khai nó một cách động để các trường sẽ tự động được thêm vào thiết kế khi chương trình chạy.

Tuy nhiên, tôi sớm nhận ra rằng việc lặp qua các giá trị trong một kiểu liệt kê, mặc dù khá dễ dàng một khi bạn đã biết cách làm, nhưng lại hơi khó hiểu.

Rõ ràng bạn cần bắt đầu với lớp DictEnum. Như bạn sẽ thấy, lớp này có một số phương thức để lấy thông tin như tên và nhãn từ cả chỉ mục và giá trị.

Sự khác biệt giữa chỉ mục (index) và giá trị (value) là chỉ mục là số thứ tự của một phần tử trong kiểu liệt kê (enum), nếu các phần tử của kiểu liệt kê được đánh số tuần tự bắt đầu từ 0, trong khi giá trị là thuộc tính "giá trị" thực tế của phần tử đó. Vì hầu hết các kiểu liệt kê đều có giá trị được đánh số tuần tự từ 0, nên chỉ mục và giá trị của một phần tử thường sẽ giống nhau, nhưng chắc chắn không phải lúc nào cũng vậy.

Nhưng làm sao bạn biết được một kiểu liệt kê (enum) có những giá trị nào? Đây là điểm gây nhầm lẫn. Lớp DictEnum có một phương thức gọi là values(). Bạn có thể mong đợi phương thức này trả về một danh sách các giá trị của kiểu liệt kê, nhưng rõ ràng điều đó quá đơn giản, vì vậy thay vào đó nó trả về số lượng giá trị mà kiểu liệt kê chứa. Tuy nhiên, số lượng giá trị không liên quan gì đến các giá trị thực tế, vì vậy bạn cần sử dụng con số này làm cơ sở để gọi các phương thức dựa trên chỉ mục, chứ không phải các phương thức dựa trên giá trị.

Giá mà họ đặt tên phương thức này là indexes() thì đỡ gây nhầm lẫn hơn ;-)

Cũng cần lưu ý rằng các giá trị enum (và dường như cả các "chỉ số" này) bắt đầu từ 0, không giống như chỉ số mảng và container trong X++, bắt đầu từ 1, vì vậy để lặp qua các phần tử trong một enum, bạn có thể làm như sau:

DictEnum dictEnum = new DictEnum(enumNum(SalesStatus));
Counter  c;
;

for (c = 0; c < dictEnum.values(); c++)
{
    info(strFmt('%1: %2', dictEnum.index2Symbol(c), dictEnum.index2Label(c)));
}

Thao tác này sẽ xuất ký hiệu và nhãn của từng phần tử trong kiểu liệt kê ra nhật ký thông tin.

Đọc thêm

Nếu bạn thích bài viết này, bạn cũng có thể thích những gợi ý sau:


Chia sẻ trên BlueskyChia sẻ trên FacebookChia sẻ trên LinkedInChia sẻ trên TumblrChia sẻ trên XChia sẻ trên LinkedInGhim trên Pinterest

Mikkel Christensen

Về tác giả

Mikkel Christensen
Mikkel là người sáng lập và chủ sở hữu của miklix.com. Ông có hơn 20 năm kinh nghiệm làm lập trình viên máy tính/nhà phát triển phần mềm chuyên nghiệp và hiện đang làm việc toàn thời gian cho một tập đoàn CNTT lớn của Châu Âu. Khi không viết blog, ông dành thời gian rảnh rỗi cho nhiều sở thích, thú vui và hoạt động, có thể được phản ánh ở một mức độ nào đó trong nhiều chủ đề được đề cập trên trang web này.