应用引擎人员代码绑定变量

时间:2018-10-09 20:11:04

标签: peoplesoft peoplesoft-app-engine peoplecode

我在Application Engine程序中具有下面的PeopleCode步骤,该步骤使用文件布局读取CSV文件,然后将数据插入表中,而我只是想更好地理解代码行(生成以下脚本中的&SQL1 = CreateSQL("%Insert(:1)");)。看起来CreateSQL在Insert语句中使用了绑定变量(:1),但是我很难在程序中的哪里找到该变量的定义。

Function EditRecord(&REC As Record) Returns boolean;
   Local integer &E;

   &REC.ExecuteEdits(%Edit_Required + %Edit_DateRange + %Edit_YesNo + %Edit_OneZero);
   If &REC.IsEditError Then
      For &E = 1 To &REC.FieldCount
         &MYFIELD = &REC.GetField(&E);
         If &MYFIELD.EditError Then
            &MSGNUM = &MYFIELD.MessageNumber;
            &MSGSET = &MYFIELD.MessageSetNumber;
            &LOGFILE.WriteLine("****Record:" | &REC.Name | ", Field:" | &MYFIELD.Name);
            &LOGFILE.WriteLine("****" | MsgGet(&MSGSET, &MSGNUM, ""));
         End-If;
      End-For;
      Return False;
   Else
      Return True;
   End-If;
End-Function;

Function ImportSegment(&RS2 As Rowset, &RSParent As Rowset)
   Local Rowset &RS1, &RSP;
   Local string &RecordName;
   Local Record &REC2, &RECP;
   Local SQL &SQL1;
   Local integer &I, &L;
   &SQL1 = CreateSQL("%Insert(:1)");
   rem &SQL1 = CreateSQL("%Insert(:1) Order by COUNT_ORDER");
   &RecordName = "RECORD." | &RS2.DBRecordName;
   &REC2 = CreateRecord(@(&RecordName));
   &RECP = &RSParent(1).GetRecord(@(&RecordName));
   For &I = 1 To &RS2.ActiveRowCount
      &RS2(&I).GetRecord(1).CopyFieldsTo(&REC2);
      If (EditRecord(&REC2)) Then
         &SQL1.Execute(&REC2);
         &RS2(&I).GetRecord(1).CopyFieldsTo(&RECP);
         For &L = 1 To &RS2.GetRow(&I).ChildCount
            &RS1 = &RS2.GetRow(&I).GetRowset(&L);
            If (&RS1 <> Null) Then
               &RSP = &RSParent.GetRow(1).GetRowset(&L);
               ImportSegment(&RS1, &RSP);
            End-If;
         End-For;
         If &RSParent.ActiveRowCount > 0 Then
            &RSParent.DeleteRow(1);
         End-If;
      Else
         &LOGFILE.WriteRowset(&RS);
         &LOGFILE.WriteLine("****Correct error in this record and delete all error messages");
         &LOGFILE.WriteRecord(&REC2);
         For &L = 1 To &RS2.GetRow(&I).ChildCount
            &RS1 = &RS2.GetRow(&I).GetRowset(&L);
            If (&RS1 <> Null) Then
               &LOGFILE.WriteRowset(&RS1);
            End-If;
         End-For;
      End-If;
   End-For;
End-Function;

rem *****************************************************************;
rem * PeopleCode to Import Data                                     *;
rem *****************************************************************;
Local File &FILE1, &FILE3;
Local Record &REC1;
Local SQL &SQL1;
Local Rowset &RS1, &RS2;
Local integer &M;

&FILE1 = GetFile("\\nt115\apps\interface_prod\interface_in\Item_Loader\ItemPriceFile.csv", "r", "a", %FilePath_Absolute);
&LOGFILE = GetFile("\\nt115\apps\interface_prod\interface_in\Item_Loader\ItemPriceFile.txt", "r", "a", %FilePath_Absolute);

&FILE1.SetFileLayout(FileLayout.GH_ITM_PR_UPDT);
&LOGFILE.SetFileLayout(FileLayout.GH_ITM_PR_UPDT); 
&RS1 = &FILE1.CreateRowset();
&RS = CreateRowset(Record.GH_ITM_PR_UPDT);
REM &SQL1 = CreateSQL("%Insert(:1)");
&SQL1 = CreateSQL("%Insert(:1)");
/*Skip Header Row:  The following line of code reads the first line in the file layout (the header) 
and does nothing.  Then the pointer goes to the next line in the file and starts using the 
file.readrowset*/
&some_boolean = &FILE1.ReadLine(&string);
&RS1 = &FILE1.ReadRowset();

While &RS1 <> Null
   ImportSegment(&RS1, &RS);
   &RS1 = &FILE1.ReadRowset();
End-While;

&FILE1.Close();
&LOGFILE.Close();

2 个答案:

答案 0 :(得分:1)

:1来自&SQL1.Execute(&REC2);

&REC2被分配了一个记录对象,因此行&SQL1.Execute(&REC2);的值为%Insert(your_record_object)

Here is a simple example that's doing basically the same thing

Here is a description of %Insert

答案 1 :(得分:1)

回答太久了,请回答:

表名称很可能是(PS_)GH_ITM_PR_UPDT。普遍的共识是将FileLayout与其基于的记录命名为相同的名称。

如果不是,则在FileLayout.GH_ITM_PR_UPDT中定义。打开FileLayout,右键单击该段,然后在“ Selected Node Properties”下找到“ File Record Name”。

在您的代码中,此记录将结转到&RS1。

&FILE1.SetFileLayout(FileLayout.GH_ITM_PR_UPDT);
&RS1 = &FILE1.CreateRowset();

行集是行的集合。行由记录组成,记录是数据库表中的数据行。 (Peoplesoft对象数据类型很有趣...) 该行集在以下语句中填充了数据:

&RS1 = &FILE1.ReadRowset();

这使用您的文件作为输入并输出行集集合,根据您定义FileLayout的方式将数据映射到记录。 结果输入到ImportSegment函数中:

ImportSegment(&RS1, &RS); 
Function ImportSegment(&RS2 As Rowset, &RSParent As Rowset)
函数中的

&RS2是对其余代码中&RS1的引用。 表名也隐藏在这里:

&RecordName = "RECORD." | &RS2.DBRecordName;

因此,如果您不想/不想检查FileLayout,则可以输出&RS2.DBRecordName和一个消息框,而答案将是过程监视器的消息日志。

最后,为此数据库表创建一个记录对象,并用行集中的一行填充它。将该记录插入数据库表:

&REC2 = CreateRecord(@(&RecordName));
&RS2(&I).GetRecord(1).CopyFieldsTo(&REC2);
&SQL1 = CreateSQL("%Insert(:1)");
&SQL1.Execute(&REC2); 

TLDR:

表名可以在FileLayout中找到,也可以在ImportSegment函数中以&RS2.DBRecordName的形式输出