peoplecode 对象和类

peoplecode 对象和类

类与对象

PeopleSoft提供了可以通过Peoplecode操作的类和对象。此外,你可以扩展存在的类或者创建自己的类。peoplesoft提供的类可能或者可能不对应一个用户界面;一些类代表只在运行时才存在的数据结构。通过peoplecode,你可以容易的操作数据缓冲区中的数据。这些类使你能够编写更可读、更容易维护,更有用的代码。

类是对象的形式定义,充当一个模板,通过这个模板在运行时实例化一个对象。类定义了对象的属性和用于控制对象行为的方法。

peoplesoft提供了预定义的类,如Array,File,File,Field,SQL等等。你可以使用应用类创建自己的类以及扩展已经存在的类的功能。

对象

对象代表一个唯一的数据结构的示例,该数据结构通过类模板定义。对于类中定义的变量,每一个对象都有其自己的值,且能够响应类中定义的方法。peoplesoft提供的类和你自己创建的类都具有这种特性。

依据类模板创建(实例化)一个对象之后,你可以更改其属性(property)。property是指对对象的属性。属性定义了:

  • 对象的特征,如名字或者价格
  • 对象的特征,如删除了或改变了

一些属性是只读的且不能对其进行设置,如名称或者作者。其他属性能够设置,如价格或者标签。

对象不同于其他数据结构,他们包含代码(以方法的形式)而不只是静态数据。方法是一个过程或者函数,与一个或者更多类相关联,对一个对象进行操作。

可以通过一个类比将对象和类的区别进行说明:类和对象的区别就像一辆小汽车和一辆拍照位TS5800B的蓝色雪铁龙汽车之间的区别。类是一个大的分类,而对象是类的一个具体的实例。每辆小汽车都具有标准的特征,如四个轮子、一个引擎或者刹车,这些特征定义了这个类,以后生产一辆单个的小汽车就依据这个类模板。小汽车的模型和生产日期类似于只读的属性,因为你不能狗更改。对每辆小汽车发动机的调整以及改变其性能就像方法(method)作用于一个对象之上。

对象实例化

类就是一些东西如自行车、小汽车或者数据结构的蓝图。一个对象就是使用这个类(或者蓝图)构建的实际的东西。从一辆自行车的蓝图,你可以构建一辆具体的拥有23个齿轮和一个牢固的悬架的山地自行车。从一个数据结构类的蓝图,你可以构建该类的一个具体的实例。实例化就是一个术语,指代构建一个类的实例。

创建和使用对象

实例化对象

通常使用内置函数或其他对象的方法实例化对象(从对象所属类创建对象)。某些对象通过存在于数据缓冲区中的数据实例化。想象一下这种类型的对象实例化,即从缓冲区中获取一块数据,将其包装在代码之中(方法或者属性),操作该数据,然后释放对数据的引用。某些对象可以通过先创建的定义来实例化,例如页面(page)或者文件格式(file layout),而不是通过数据实例化。

下面的例子创建了一个字段(field)对象

local field &MyField;
&MyField = GetField();

Get类型的函数包含诸如GetField、GetRecord等函数,他们提供了一种访问已存在数据的方法,不论数据是在数据缓冲区还是自己定义的对象。

Creat类型的函数包含诸如CreateObject、CreateArray、CreateRecord等函数,他们通常创建数据缓冲区中还不存在的对象。Create类型的函数只创建一个缓冲区结构。他们不会用数据填充该缓冲区。例如,下面的函数返回一个已存在于组件缓冲区中的record对象。

&rec = GetRecord();

下面的例子创建一个单独的record对象。然而,在&REC2中不存在数据。在指定的record定义必须首先创建好,但并不代表该record必须存在于组件或者数据缓冲区中。

&REC2 = CreateRecord(EMP_CHKLST_ITM);

没有内置函数的对象只能够通过session对象(如Tree类、CI等等)实例化。对于大多数这些类,当你使用Get类型的函数时,你获得的是对象的一个标识。要完全实例化一个对象,你必须使用open方法。

更改对象属性

为了设置或者获得一个对象的特征,或者判断对象的状态,你必须通过点标记(dotnotation)语法访问该对象的属性。在对象的引用后面加上一个点号,然后跟上对象的属性,就可以给该对象的属性赋值。格式通常如下:

object.Property = Value

下面的例子隐藏字段&MYFIELD

&MYFIELD.Visible = False

你可以通过返回对象的某个属性值来获取对象的信息。下面例子中。&X的值为字段&MYFIELD的值

&X = &MYFIELD.Value

下面例子中,属性作为一个测试条件:

 if &ROWSET.ActiveROWCount <> &I then

调用方法

和调用属性一样,执行方法也是通过使用点标记的方式。在对象的引用之后加上一个点,然后跟上方法名和参数。格式如下:

object.method();

你可以将方法和属性连串成一个语句。下面的例子将GetField方法和Name属性连串到一起:

if &REC_BASE.GetField(&R).Name = &REC_RELLANG.GetField(&J).Name then

一些方法会返回一个布尔值(boolean):如果方法成功执行返回真(True);如果执行失败返回假(False)。下面的方法将当前record对象的所有具有相同名字的字段和指定的record对象进行比较。如果所有具有相同名字的字段拥有相同的值,就返回True:

if &MYRECORD.CompareFields(&OTHERRECORD) then

其他方法返回对象的引用。GetCurrEffRow方法返回一个行(row)对象:

&MYROW = &MYROWSET.GetCurrEffRow();

有些方法不会返回任何东西。每个方法的文档说明中指示了该方法返回什么。

许多对象具有默认的方法。你可以使用方法的参数,而不用显式的输入方法的名字,具有默认方法的对象称作复合对象(composite objects)。也就是说,这些对象之中包含了其他对象。默认方法通常用于获得更低级别的对象。

复合对象的一个很好的例子就是record对象。Recoed定义由字段(field)定义构成,因此record对象的默认方法就是GetField。

下面的两行代码是等效的:

&FIELD = &RECORD.GetField(FIELD.EMPLID);
&FIELD = &RECORD.EMPLID;

注意:如果你当前访问的字段的名字和record属性(如name)相同,你就不能使用这种简洁方式引用字段,而必须使用GetField方法。

另外一个默认方法的例子涉及行集合(Rowset)和行(Row)。行集合由行组成,因此,行集合对象的默认方法是GetRow。下面两行指定的代码等效:他们都获取Rowset的第5行:

&ROWSET = GetRowSet();

/*the next two lines of code are equivalent */

&ROW = &ROWSET.GetRow(5);
&ROW = &ROWSET(5);

下面的例子演示了通过长字符串方式启用位于第二滚动级别上的Name字段的写法(该代码在第一滚动级别上执行):

GetRowset(SCROLL.EMPLOYEE_CHECKLIST).GetRow(1).GetRecord(EMPL_CHKLST_ITM).GetField(FIELD.NAME).Enabled = True;

使用默认方法可以使你将先前的代码简化如下:

GetRowset(SCROLL.EMPLOYEE_CHECKLIST)(1).EMPL_CHKLST_ITM.NAME.
Enabled = True;

class.name.property或class.name.method(…)格式的表达式会被转换成相应的对象。例如,代码:&temp = RECORD.JOB.IsChanged;会被当做&temp = GetRecord(RECORD.JOB).Ischanged;解析执行。

此外,JOB.EMPLID.Visible = False;会被当作GetField(JOB.EMPLID).Visible = False; 解析执行。

复制对象

PeopleTools提供的许多类都有一些复制方法,如RowSet类中的CopyTo方法,Tree类的Copy方法等等。除非特别指定(例如消息类的CopyRowSetDelta方法),所有复制方法使用对象的当前数据。如果对象是从数据库检索出来的,而且对象中的值被用户或者PeopleCode程序更改,那么当前数据可能不同于原始数据值。

当将一个对象指定给另一个对象时,并不是创建对象的一个拷贝,而是复制对象的引用。在下面的例子中,&A1和&A2引用同一个对象。将&A1指定给&A2不会分配任何数据库内存或者复制原始对象的任何部分。这种情况只是让&A1和&A2引用同一个对象。

Local Array of Number &A1, &A2;

&A1 = CreateArray(2, 4, 6, 8, 10);
&A2 = &A1;

下图说明了两个引用指向同一个对象

在这里插入图片描述

如果下一个语句是&A2[5] = 12;那么&A1[5]也等于12,如下图所示:

在这里插入图片描述

下面的两个例子不属于对象的指定:

Local number &NUM;
Local Array of Number &A1;

&A1 = CreateArray(2, 4, 6, 8, 10);
&NUM = &A1[3];

&NUM的数据类型是Number,并不会属于对象类型。如果改变了&NUM的值,并不会改变数组中元素的值。

所有PeopleCode对象可以作为函数参数传递。可以在PeopleCode函数之间传递复杂的数据结构(与传递一长串字段列表相反)。如果传递对象给函数,该函数直接作用于对象,而不是对象的的拷贝。

下面的例子中。传递的是Visible属性的引用,而不是Visible的值。这种方式使得MyPeopleCodeFunction既能够获取又能够设置Visisble属性的值。

在如下的例子中,函数Process_Rowset对传递给它的行集合(Rowset)中的每一行(row)的每一个记录(record)进行循环,然后对每个记录进行更新操作。该函数可以从任何Peoplecode程序中调用,可以处理任何传递给他的行集合。

Local Rowset &RS;
Local Record &REC;

Function Process_RowSet(&ROWSET as Rowset);
   For &I = 1 To &ROWSET.Rowcount
       For &J = 1 To &ROWSET.Recordcount
         &REC = &ROWSET.GetRow(&I).GetRecord(&J);
         &REC.Update();
      End-For;
   End-For;  
End-Function;

&RS = GetLevel0();

Process_RowSet(&RS);

如下函数获得一个从另一个程序传递进来的rowset和record对象。GetRecord方法不能够直接接受record变量,然而,可以使用@符号解引用record的名字。

Function Get_My_Row(&PASSED_ROWSET, &PASSED_RECORD)

   For &ROWSET_ROW = 1 To &PASSED_ROWSET.RowCount
      &UNDERLYINGREC = "RECORD." | &PASSED_ROWSET.DBRecordName;
      &ROW_RECORD = &PASSED_ROWSET.GetRow(&ROWSET_ROW).GetRecord(@&UNDERLYINGREC);
    
      /* Do other processing */
     
   End-For;

End-Function; 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值