我知道当我使用消息目录中的消息时,我可以在消息文本中使用绑定变量。例如,
消息文字:
员工(%1)本月已经工作了%2%。
描述:
员工在任何特定月份都无法超过%3%的工作。将行%5的百分比降低到%4%。
我注意到当我使用MessageBox
时,我可以将值传递给第三,第四和第四个绑定,但是当我使用任何其他函数(MsgGet
,MsgGetExplainText
时,或CreateException
),解释文本中的绑定不会被替换。我这样做是因为我需要停止使用Error
处理,从消息目录中传入文本(即Error(MsgGet()
)。
例如:
这些分别来自以下内容:
MessageBox(0, "", 20007, 6, "MESSAGE NOT FOUND: Too many hours. Decrease percentage.", &emplid, Round(&percentInMonth * 100, 0), Round(&workPercentCap * 100, 0), &neededPercent, &rowNumber);
和
Error (MsgGet(20007, 6, "MESSAGE NOT FOUND: Too many hours. Decrease percentage.", &emplid, Round(&percentInMonth * 100, 0), Round(&workPercentCap * 100, 0), &neededPercent, &rowNumber));
如何解决这个问题?我正在运行PeopleTools 8.54。
答案 0 :(得分:1)
在MsgGetExplainText的8.54 PeopleBooks中,它提到了以下内容:
注意:当使用MsgGetExplainText函数时,此替换仅发生在消息说明文本中。如果使用消息框,则说明文本中不会出现参数替换。
这是一种不明确的方式,说你不能这样做。这也适用于MsgGet
和CreateException
,即使未在其文档中指定。
但是,是在IT Toolbox找到的解决方法。
该线程中的用户发布了一些与以下代码相近的内容作为解决方法(此处根据您的问题进行了调整):
Local string &errorMessage = MsgGet(20007, 6, "MESSAGE NOT FOUND: Too many hours. Decrease percentage.", &emplid, Round(&percentInMonth * 100, 0), Round(&workPercentCap * 100, 0), &neededPercent, 1);
&errorMessage = &errorMessage | Char(10) | Char(10);
&errorMessage = &errorMessage | MsgGetExplainText(20007, 6, "MESSAGE NOT FOUND: Too many hours. Decrease percentage.", &emplid, Round(&percentInMonth * 100, 0), Round(&workPercentCap * 100, 0), &neededPercent, 1);
Local string &temp = MsgGet(0, 0, "");
Error &errorMessage;
无论出于何种原因,变量的绑定发生在事实之后,这意味着,如果您在Error
的返回值上调用MsgGet
,则结果是未绑定的错误消息参数。
您需要将MsgGet
和 MsgGetExplainText
的结果相互追加,以模仿MessageBox
的功能,如上所述。
请注意,看似无用的语句Local string &temp = MsgGet(0, 0, "");
是必要的,否则消息的最后一行会重复,但没有参数替换:
这会清除从MsgGet
和MsgGetExplainText
返回的未绑定解释文字。
如果您想要抛出Exception
,则适用相同的原则。您需要使用变通方法。如果您不希望向最终用户显示,也可以从邮件中删除堆栈跟踪:
Local string &errorMessage = MsgGet(20007, 6, "MESSAGE NOT FOUND: Too many hours. Decrease percentage.", &emplid, Round(&percentInMonth * 100, 0), Round(&workPercentCap * 100, 0), &neededPercent, 1);
&errorMessage = &errorMessage | Char(10) | Char(10);
&errorMessage = &errorMessage | MsgGetExplainText(20007, 6, "MESSAGE NOT FOUND: Too many hours. Decrease percentage.", &emplid, Round(&percentInMonth * 100, 0), Round(&workPercentCap * 100, 0), &neededPercent, 1);
Local string &temp = MsgGet(0, 0, "");
rem "Remove" the Stack-Trace;
try
throw CreateException(0, 0, &errorMessage);
catch Exception &e
Error &e.ToString( False); rem False means no stack trace;
end-try;
此外,可以extend
Exception
类,并以这种方式替换绑定值。然而,它有点复杂。这是一个例子:
class CustomException extends Exception
method CustomException(&messageSet As integer, &messageNum As integer, &message As string, &substitutions As array of string);
end-class;
method CustomException
/+ &messageSet as Integer, +/
/+ &messageNum as Integer, +/
/+ &message as String, +/
/+ &substitutions as Array of String +/
%Super = CreateException(&messageSet, &messageNum, &message);
Local integer &i;
For &i = 1 To &substitutions.Len
%Super.SetSubstitution(&i, &substitutions.Get(&i));
End-For;
rem Setting Context to something else replaces the stack trace with whatever text set it to;
%Super.Context = "";
%Super.DefaultText = &message;
end-method;
要使其工作,您可以传入要替换到消息中的绑定变量数组,然后遍历数组并为每个变量调用SetSubstitution()
。
另外,如上所述,如果你想要例外"抛出"如错误消息(即显示错误消息而不堆栈跟踪),您可以删除Context
的{{1}}:
CustomException
答案 1 :(得分:0)
这对我有用 -
&string = MsgGetExplainText(25070, 144, "Error Message", &BINDVARIABLE);
&string1 = MsgGetExplainText(99999, 1, """");
Error (&string);