Sie sind auf Seite 1von 4

You can use application engine to import files into tables in your PeopleSoft Database.

Prior to version 8, the only way to programmatically do this was by using SQR. However, you now have the ability to create a File Layout Definition object and using Peoplecode, you can load a file directly into your database. Application Engine is extremely powerful when utilized correctly. For example, you can utilize functionality such as peoplecode, SQL, Do While, Do Until, and Do Select. Therefore, you have the ability to manipulate the data just as you were capable of doing using SQR. I'm going to walk through loading data from a flat file into a table using Application Engine. This example is a very simple one and is easy to follow. So lets get started! First and foremost, you will need to create a File Layout Definition. For this example we are using a table that we have defined in Application Designer named "N_SDN_TBL". This table is constructed as follows: ---------------------- -------------N_SDN_ID decimal 9,10 N_SDN_NAME char 50 N_SDN_TYPE char 12 N_SDN_SNCTION_PGM char 20 N_SDN_TITLE char 180 N_SDN_VSSL_CALLSGN char 8 N_SDN_VESSEL_TYPE char 25 N_SDN_VSSLTONNAGE char 14 N_SDN_GRT_REG_TON char 8 N_SDN_VESSEL_FLAG char 40 N_SDN_VSSL_OWNER char 150 N_SDN_REMARKS char 254 When you define a File Layout, you can define it with a format of FIXED, CSV, or XML. In this Example we are using Fixed. From Application Designer, simply create a new File Layout object. Right click on the File Layout and Insert a Record. For this example we choose N_SDN_TBL. Once you choose the record App Designer will add the record and its fields to the layout. The Next step is to adjust the start and ending positions for each field. Simply double click on a field and enter the start and ending position for this field the way it is in your flat file. Once you go through and complete this process for each field you can save your file layout and start building your application engine program. All we need for this program are two simple steps. The first step will be a simple SQL step to truncate the table N_SDN_TBL. Second, we add another step for PeopleCode. The PeopleCode for loading this data into the table is written below.

/********************************************************** FUNCTION TO IMPORT DATA **********************************************************/

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)"); &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 * Define our Objects *; rem *****************************************************************; Local File &FILE1 Local Record &REC1 Local SQL &SQL1 Local Rowset &RS1 Local integer &M /******************************************************************/ /* LOAD A FILE CALLED SDN.FF */ /******************************************************************/ /* CREATE A HANDLE TO THE FILE AND THE LOGFILE SETTING THE ATTRIBUTES */

&FILE1 = GetFile("D:\FS800\N_INTERFACES\SDN\SDN.FF", "r", "a", %FilePath_Absolute); &LOGFILE = GetFile("D:\FS800\N_INTERFACES\SDN\SDN.FF.err", "W", %FilePath_Absolute); /* LOAD OUR FILELAYOUT TO THE FILE HANDLE */ &FILE1.SetFileLayout(FileLayout.N_SDN_TBL); &LOGFILE.SetFileLayout(FileLayout.N_SDN_TBL); /************************************************************* CREATE A ROWSET FOR THE FILE AND ONE FOR THE RECORD THAT WE WILL BE LOADING THEN READ EACH ROW OF THE FILE AND INSERT IT INTO OUR TABLE **************************************************************/ &RS1 = &FILE1.CreateRowset(); &RS = CreateRowset(Record.N_SDN_TBL); &SQL1 = CreateSQL("%Insert(:1)"); &RS1 = &FILE1.ReadRowset(); While &RS1 <> Null; ImportSegment(&RS1, &RS); &RS1 = &FILE1.ReadRowset(); End-While; &FILE1.Close(); &LOGFILE.Close();
That's all there really is to it. I hope that this example was helpful in providing you a simple, quick, and easy way to load data from a fixed field length flat file into a table. There really is no need to continue to do these types of applications using SQR. You should start programming using Application engine for any type of process that does not require a fancy report. Remember, Application Engine programs are objects that you can upgrade. SQR's are not.

Another Example

If the destination is the Record, you don't need to browse through the FL structure, You can read the file, assign values readed from the file to the fields and insert:
Function EditRecord(&REC As Record); 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(&sLine); &LOGFILE.WriteLine("****" | MsgGet(&MSGSET, &MSGNUM, "")); MessageBox(0, "", 0, 1, "****Record:" | &REC.Name | ", Field:" | &MYFIELD.Name); MessageBox(0, "", 0, 1, "Line #: " | &N); MessageBox(0, "", 0, 1, &sLine); MessageBox(0, "", 0, 1, "****" | MsgGet(&MSGSET, &MSGNUM, "")); End-If; End-For; Else &SQL1 = CreateSQL("%Insert(:1)"); &SQL1.Execute(&REC); End-If; End-Function; Local File &FILE1; Local Record &REC1; Local Rowset &RS1, &RS2; Local integer &M; /* Initialize and set the layouts... */ &sSeparator = REC_AET.SEPARATOR.Value; While &FILE1.ReadLine(&sLine) &asFields = Split(&sLine, &sSeparator); &REC1 = CreateRecord(Record.REC_TBL); &REC1.FIELD1.Value = &asFields [1]; &REC1.FIELD2.Value = &asFields [2]; /* Assign the fields and make the correct data type... */ &REC1.FIELDN.Value = &asFields [M]; EditRecord(&REC1); End-While; &FILE1.Close(); &LOGFILE.Close();

Das könnte Ihnen auch gefallen