如何将绑定变量传递给消息目录中的Message Explain文本?

时间:2016-06-24 20:23:31

标签: peoplesoft

我知道当我使用消息目录中的消息时,我可以在消息文本中使用绑定变量。例如,

消息文字:

  

员工(%1)本月已经工作了%2%。

描述:

  

员工在任何特定月份都无法超过%3%的工作。将行%5的百分比降低到%4%。

我注意到当我使用MessageBox时,我可以将值传递给第三,第四和第四个绑定,但是当我使用任何其他函数(MsgGetMsgGetExplainText时,或CreateException),解释文本中的绑定不会被替换。我这样做是因为我需要停止使用Error处理,从消息目录中传入文本(即Error(MsgGet())。

例如:

使用MessageBox() Binds replaced properly

使用Error(MsgGet()) Binds not replaced

这些分别来自以下内容:

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。

2 个答案:

答案 0 :(得分:1)

MsgGetExplainText的8.54 PeopleBooks中,它提到了以下内容:

  

注意:当使用MsgGetExplainText函数时,此替换仅发生在消息说明文本中。如果使用消息框,则说明文本中不会出现参数替换。

这是一种不明确的方式,说你不能这样做。这也适用于MsgGetCreateException,即使未在其文档中指定。

但是,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, "");是必要的,否则消息的最后一行会重复,但没有参数替换:
Repeated explain-text

这会清除从MsgGetMsgGetExplainText返回的未绑定解释文字。

如果您想要抛出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);