Application Engine Peoplecode связывают переменные - PullRequest
0 голосов
/ 09 октября 2018

У меня есть приведенный ниже шаг PeopleCode в программе Application Engine, которая читает файл CSV с помощью File Layout, а затем вставляет данные в таблицу, и я просто пытаюсь лучше понять, как строка кода (&SQL1 = CreateSQL("%Insert(:1)");) в приведенном ниже сценарии генерируется.Похоже, что CreateSQL использует переменную связывания (: 1) внутри оператора Insert, но я пытаюсь выяснить, где найти эту переменную в программе.

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 голосов
/ 10 октября 2018

Ответ, потому что слишком длинный комментарий:

Имя таблицы наиболее вероятно (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 с окном сообщений, и ваш ответ будет Message Log of ofВаш Process Monitor.

Наконец, для этой таблицы базы данных создается объект записи, и он заполняется строкой из набора строк.Эта запись вставляется в таблицу базы данных:

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

TLDR:

Имя таблицы можно найти в FileLayout или вывести в функции ImportSegment как & RS2.DBRecordName

0 голосов
/ 10 октября 2018

:1 идет от линии дальше вниз &SQL1.Execute(&REC2);

&REC2 получает присвоенный объект записи, поэтому строка &SQL1.Execute(&REC2); оценивается как %Insert(your_record_object)

Вот простой пример, который делает в основном то же самое

Вот описание% Insert

...