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++.
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:
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:
- Xóa một thực thể pháp lý (Tài khoản công ty) trong Dynamics AX 2012
- Xác định lớp tài liệu và truy vấn cho dịch vụ AIF trong Dynamics AX 2012
- Sự khác biệt giữa data() và buf2Buf() trong Dynamics AX 2012
