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

Bài viết này mô tả một số hành vi kỳ lạ 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 giải quyết vấn đề 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 đăng này dựa trên Dynamics AX 2012 R3. Thông tin này có thể đúng hoặc không đúng với các phiên bản khác.

Gần đây tôi gặp phải một vấn đề với hàm strFmt khiến tôi bối rối một chút. Phần bối rối nhất là tôi chưa từng gặp phải nó trong nhiều năm làm nhà phát triển Axapta/Dynamics AX.

Vấn đề là tôi đã thử sử dụng 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 bản thân macro có thể được sử dụng để định dạng chuỗi, đây cũng là điều tôi không biết. Ồ, học được điều gì đó mới mẻ thì luôn tốt, nhưng tôi vẫn rất ngạc nhiên khi trước đây tôi chưa từng tình cờ gặp phải điều này.

Về cơ bản, nó giống như thế này

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

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

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

Giống như thế này:

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

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ệnh gọi phương thức. Đó là vì macro thực sự cũng sẽ sử dụng các khoảng trắng như vậy, 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 làm chuỗi định dạng với strFmt, bạn cần thoát khỏi 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));

Trên thực tế, cách này sẽ có hiệu quả tương tự như khi bạn cung cấp trực tiếp chuỗi định dạng.

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

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));
}
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 Bang Christensen

Về tác giả

Mikkel Bang 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.