0

我在 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();
4

2 回答 2

1

来自:1更下方的线路&SQL1.Execute(&REC2);

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

这是一个基本相同的简单示例

这是 %Insert 的描述

于 2018-10-10T02:04:24.137 回答
1

回答因为太长无法评论:

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

如果不是,则在 FileLayout.GH_ITM_PR_UPDT 中定义。打开 FileLayout,右键单击该段并在“选定节点属性”下找到“文件记录名称”。

在您的代码中,此记录被转移到 &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

于 2018-10-10T12:38:56.890 回答