Miklix

Định dạng chuỗi bằng Macro và strFmt trong Dynamics AX 2012

Đã xuất bản: lúc 00:49:10 UTC 16 tháng 2, 2025
Cập nhật lần cuối: lúc 08:44:37 UTC 12 tháng 1, 2026

Bài viết này mô tả một số hành vi bất thường trong Dynamics AX 2012 khi sử dụng macro làm chuỗi định dạng trong strFmt, cũng như các ví dụ về cách khắc phục sự cố này.


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:

String Formatting with Macro and strFmt 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 gặp phải một sự cố với hàm strFmt khiến tôi khá bối rối. Điều khó hiểu nhất là, thật trùng hợp, tôi chưa từng gặp phải vấn đề này trước đây trong nhiều năm làm lập trình viên Axapta/Dynamics AX.

Vấn đề là tôi đã cố gắng sử dụng một macro làm chuỗi định dạng cho hàm strFmt nhưng nó không hoạt động. Nó hoàn toàn bỏ qua các tham số % và chỉ trả về phần còn lại của chuỗi.

Sau khi tìm hiểu, tôi phát hiện ra rằng chính các macro cũng có thể được sử dụng để định dạng chuỗi ký tự, điều này cũng là một điều tôi chưa biết. Dù sao thì, học hỏi được điều mới mẻ luôn tốt, nhưng tôi vẫn rất ngạc nhiên vì mình chưa từng biết đến điều này trước đây.

Về cơ bản, đại loại như thế này

#define.FormatMacro('%1-%2-%3')
;

info(strFmt(#FormatMacro, salesId, itemId, lineNum));

Cách này sẽ không hoạt động vì các dấu % trong macro thực chất được sử dụng cho các tính năng định dạng chuỗi của chính macro đó. Trong trường hợp này, hàm strFmt sẽ coi chuỗi định dạng là "--" và do đó chỉ trả về chuỗi đó.

Đại loại như thế này:

#define.FormatMacro('%1-%2-%3');
info(#FormatMacro(salesId,itemId,lineNum));

Nó sẽ hoạt động, nhưng có lẽ không theo cách bạn muốn. Thay vì xuất ra giá trị của ba biến, nó sẽ xuất ra tên của các biến, trong trường hợp này là "salesId-itemId-lineNum". (Lưu ý rằng tôi không đặt khoảng trắng sau dấu phẩy khi truyền tham số cho macro, như tôi thường làm trong các lời gọi phương thức. Đó là vì macro thực tế cũng sẽ sử dụng các khoảng trắng đó, vì vậy đầu ra sẽ là "salesId-itemId-lineNum" nếu tôi làm vậy).

Để thực sự sử dụng macro như một chuỗi định dạng với strFmt, bạn cần phải thoát các dấu phần trăm bằng dấu gạch chéo ngược, như thế này:

#define.FormatMacro('\\%1-\\%2-\\%3')
;

info(strFmt(#FormatMacro, salesId, itemId, lineNum));

Điều này thực chất sẽ hoạt động như thể bạn đã cung cấp chuỗi định dạng trực tiếp.

Công việc nhỏ này minh họa cho các ví dụ sau:

static void StrFmtMacroTest(Args _args)
{
    #define.FormatMacro('%1-%2-%3')
    #define.FormatMacroEscaped('\\%1-\\%2-\\%3')
    SalesId salesId = '1';
    ItemId  itemId  = '2';
    LineNum lineNum = 3.00;
    ;

    info(#FormatMacro(salesId,itemId,lineNum));
    info(strFmt(#FormatMacro, salesId, itemId, lineNum));
    info(strFmt(#FormatMacroEscaped, salesId, itemId, lineNum));
}

Đọ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.