PeoplesoftHCM项目AE程序技术总结.docx

上传人:b****5 文档编号:8298226 上传时间:2023-01-30 格式:DOCX 页数:28 大小:35.91KB
下载 相关 举报
PeoplesoftHCM项目AE程序技术总结.docx_第1页
第1页 / 共28页
PeoplesoftHCM项目AE程序技术总结.docx_第2页
第2页 / 共28页
PeoplesoftHCM项目AE程序技术总结.docx_第3页
第3页 / 共28页
PeoplesoftHCM项目AE程序技术总结.docx_第4页
第4页 / 共28页
PeoplesoftHCM项目AE程序技术总结.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

PeoplesoftHCM项目AE程序技术总结.docx

《PeoplesoftHCM项目AE程序技术总结.docx》由会员分享,可在线阅读,更多相关《PeoplesoftHCM项目AE程序技术总结.docx(28页珍藏版)》请在冰豆网上搜索。

PeoplesoftHCM项目AE程序技术总结.docx

PeoplesoftHCM项目AE程序技术总结

上海日立PeoplesoftHCM项目AE程序技术总结

概述

在Peoplesoft系统里AE(ApplicationEngine)程序是比较核心的技术,本文将结合我在上海日立上项目的情况,对AE程序进行总结。

首先从AE程序概要说起,包含它的概念以及组成部分,peoplecode是编写AE程序必须要熟练掌握的语言,本文将会结合一个页面开发的实例来做一介绍。

然后会来讲述AE程序的运行方式以及如何来调试和管理AE程序,最后会对一个具体AE开发实例进行介绍并且对遇到问题进行总结。

一、概要

1.对AE程序的理解

AE程序是PeopleTools的组成部分之一,用于开发、测试和运行对PeopleSoft数据库进行的后台SQL处理程序,主要负责与数据库进行的大量复杂的SQL交互任务,如币种换算、更新员工工龄工资等。

事实上AE程序并不能产生,解析和理解SQL语句,它只是去执行我们提供的SQL语句。

它的开发是在后台开发工具ApplicationDesigner里进行的。

在应用程序升级时也会用到AE程序。

AE程序存储在PeopleSoft数据库内,它不像Crystal报表定义、SQR程序等储存在文件系统内。

一个AE程序可以同时运行多个实例。

AE程序实际上是一组SQL语句,peoplecode代码和处理逻辑的集合。

它的特点便是可以在后台进行批处理,适合于大量数据的操作,具有着严格的程序结构,并且使用Meta-SQL和标准SQL结合的方式进行编程。

当有数据必须被处理而又不需要通过用户时,这时我们就可以用AE程序进行批处理。

它包含了两个组件,一个是设计工具,用来定义我们的AE程序,另外一个则是运行环境,来运行和检测我们的AE程序。

2.AE程序的组成部分

下面我们来在开发工具里看看一个AE程序的结构:

通过上图,我们可以很形象的看到,一个AE程序是由一个或者多个Section组成的,一个Section又是由一个或者多个Step组成的,而一个Step又是由一个或多个Action组成的。

下面我们将对每一个部分进行简要说明:

a.Section

它包含一个或者多个steps,它就相当于SQR报表程序里面的procedure,任何AE程序都应该至少包含一个名字为“MAIN”的Section,程序总是从它开始执行的。

从上图可以看到。

Section是可以被本程序的其它Section或者被其它程序来调用的。

下面来对它的主要属性予以说明:

Market:

地区,例如Global或其他如AUS、BEL、BRA。

可以将鼠标点击在其上,然后就会在该项上出现下拉列表供选择,其它属性的选择方法类似。

如下图:

Platform:

数据库平台,如Default、Oracle、DB2等。

EffectiveStatus:

生效状态。

用于临时性停用某个Section。

SectionType:

普通的数据库操作,或是对数据库的关键性升级。

AutoCommit:

控制下属各Step的默认Commit方式。

Access:

只有设为Public的Section才能被其他Program调用。

需要注意:

点击上图中的文件夹图标,当它处于打开状态时,才可以看到Section的属性,当然Step和Action也是一样的方法来看属性的。

在每一个Definition前面都有一个小加号或者减号,这是用来展开或者隐藏该项内容的。

b.Step

它是提交给AE程序的一个最小的工作单位。

可以用Step来执行peoplecode,SQL语句,或者来调用其它的Section等。

这些SQL、peoplecode是被包含在一个Step里来作为一个Action进行执行的。

Step的属性说明:

CommitAfter:

本Step的Commit方式(Default,AfterStep,Later)。

Frequency:

下属Action循环多少次后进行Commit。

OnError:

下属Action运行出错后的反应方式(Abort、Ingore、Supress)。

Active:

用于临时性停用某个Step。

需要注意:

如果要给本Section添加新的Step,并且要把它放在该Section里的第一项时,那么鼠标应该点击在MAIN处进行操作,如下:

如果想把它放在某个Step的后面,那么鼠标就放在该Step上进行操作即可。

另外Step的名字是不能够超过8个字符的。

当不想要自己建立的Step的时候,鼠标点击在上面,然后右键删除即可,如下:

c.Action

一共有八种不同的Action,分别执行不同类型的任务。

这八种Action又可以分为两大类。

流程控制型Action:

DOWHEN:

如果有返回行,就执行一次。

DOWHILE:

只要有返回行,就一直执行下去。

DOSELECT:

遍历返回的各行,每行执行一次。

DOUNTIL:

一直执行到有返回行。

操作型Action:

PeopleCode:

执行一段PeopleCode。

SQL:

执行一段SQL代码,如删除某些行、插入某些行。

CallSection:

调用另一个Section

LogMessage:

向MessageLog写信息(如错误信息、程序运行状态信息等)

需要注意1:

SQLAction和CallSectionAction不能共存于同一Step中,故同一个Step最多有7个Action。

假如在一个Step里已经包含了一个SQLAction,那么当新添加一个Action时,在下拉列表里是找不到CallSectionAction的。

如下:

需要注意2:

Action有着严格的执行顺序和嵌套关系,可以从下图看到。

另外,可以用DOUNTIL来终止对应的DOWHILE。

二、开发AE程序的前提准备-----熟练运用peoplecode

开发AE程序,内部逻辑由peoplecode来控制,因此我们需要对peoplecode熟练的运用。

下面将结合一个页面开发的实例,来说明在页面开发中如何使用peoplecode的,在本项目里虽然涉及到的页面开发不多,但是它也是一项很重要的技术,需要掌握,因此在本节里除了会说明如何用peoplecode来实现开发实例的要求,还会对一些页面开发方面的问题进行说明。

1.开发实例说明

该页面开发实例的说明:

开发三个页面,当点击其component进入页面之后,只显示两个页面,但是在页面上有链接按钮,点击相应链接,则可以跳转到第三个页面,同时还可以从第三个页面跳转到前两个页面,并且这些页面还具有包含历史记录和更正历史记录的功能。

2.对开发实例之分析

在分析之前,我们假定已经掌握如何在开发工具里定义field,record,page等,并且掌握将页面挂在某个菜单下,具体挂在菜单下的方法可以参考我写的“SQR报表技术总结”一文。

下面我们就针对上面的实例进行具体分析:

a.首先我们来分析包含历史记录和更正历史记录的问题

在peoplesoft系统里我们会看到有些页面的底部会显示包含历史记录和更正历史记录,如下:

在刚开始一点击compnent进入页面的时候,用户就可以勾选是以什么方式进入页面,如下图。

更正历史记录则可以更新页面里的数据,而包含历史记录则可以将页面里的其它历史记录也显示出来。

而有的页面却没有,如下:

实际上是否有这两项内容是由具体的业务逻辑来规定的,那么我们就从技术的角度来看看这是怎么设定的。

首先我们打开具有访问该页面权利的权限列表,查看是否是权限列表里面限定了不能包含这两项内容:

可以看到在“操作”栏里,的确有对包含历史记录和更正历史记录的限定,对应到操作里就是后两项“更新/全部显示”以及“更正”,但是也可以看到这两项是灰色的,没办法勾选。

看来问题不是出在权限列表里,而是有更底层的原因。

事实上这个更底层的原因就出在了component里,打开该页面所属的component,我们来看看它的属性:

可以看到这个属性里面在Actions里的确是有对包含历史记录和更正历史记录的限定,可以看到后两项是没有勾选的,而这里是否勾选就是直接来决定权限列表里面相应的操作是否是可选的。

正因为这里的后两项是没有选中的,所以才会在相应的权限列表里看到对应的项是灰色的。

那么我们就将其勾选上,看看会有什么样的效果:

这样设置了以后,再次打开权限列表,后两项依然是灰色的,那么问题到底是出在哪里了呢?

问题就出在了虽然我们已经将component的属性已经更改了,但是这个更改是在上次注册该component之后进行的。

也就是说对component的属性所做的这种改动只有经过注册后才是起效果的。

在component属性的Action里哪些项选中了,直接影响注册的时候哪些操作是可以被选中的,如果我们将component属性的Action里后两项没有选中,那么注册的时候就会看到如下图所示的界面,相应的操作的后两项也是灰色的:

那么我们就component属性更改之后重新进行注册,这个时候再次打开相应的权限列表:

可以看到操作里面的全部项都成了可选的了。

需要注意1:

我们在开发页面的时候,有可能会经常查看给某个组件赋予了什么权限,那么怎么样能够快速的知道该组件都赋给了哪些权限列表呢?

那么我们就需要寻找系统里面组件和权限列表之间的关系,以及在系统里面是通过哪些表来存储这些信息的,我们用如下的SQL语句就可以快速查到某个组件的的权限列表:

SELECTDISTINCTauth.classid,

a.menuname,

d.pnlgrpname,

b.itemlabel,

rtrim((casewhenbitand(authorizedactions,1)>0then'A,'END||

casewhenbitand(authorizedactions,2)>0then'U,'END||

casewhenbitand(authorizedactions,4)>0then'U+,'END||

casewhenbitand(authorizedactions,8)>0then'C,'END||

casewhendisplayonly=1then'V,'END),',')AuthAction

FROMpsauthitemauth,

psmenudefna,

psmenuitemb,

pspnlgroupc,

pspnlgrpdefnd

WHEREa.menuname=b.menuname

ANDb.pnlgrpname=c.pnlgrpname

ANDd.pnlgrpname=c.pnlgrpname

ANDauth.menuname=a.menuname

ANDauth.barname=b.barname

ANDauth.baritemname=b.itemname

ANDauth.pnlitemname=c.itemname

ANDb.itemnameLIKE'HE_JOB_PAGE_CPT'

ORDERBYd.pnlgrpname

黑斜体字样部分是我们根据自己的具体需要,来进行替换的,它表示的是我们将组件注册在菜单下的该菜单项的名字,像上面我们就可以在开发工具里找到这个菜单项的名字,如下:

有时候我们不仅仅需要查看某个组件和权限列表之间的关系,甚至还会查找权限列表和角色之间的关系,那么它们的关系可以通过下面的SQL来实现的:

SELECTDISTINCTd.pnlgrpname,

e.rolename,

f.descr,

auth.classid,

rtrim((casewhenbitand(authorizedactions,1)>0then'A,'END||

casewhenbitand(authorizedactions,2)>0then'U,'END||

casewhenbitand(authorizedactions,4)>0then'U+,'END||

casewhenbitand(authorizedactions,8)>0then'C,'END||

casewhendisplayonly=1then'V,'END),',')AuthAction,

g.classdefndesc

FROMpsauthitemauth,

psmenudefna,

psmenuitemb,

pspnlgroupc,

pspnlgrpdefnd,

psroleclasse,

psroledefnf,

psclassdefng

WHEREa.menuname=b.menuname

ANDb.pnlgrpname=c.pnlgrpname

ANDd.pnlgrpname=c.pnlgrpname

ANDauth.menuname=a.menuname

ANDauth.barname=b.barname

ANDauth.baritemname=b.itemname

ANDauth.pnlitemname=c.itemname

ANDauth.classid=e.classid

ANDe.rolename=f.rolename

ANDauth.classid=g.classid

ANDauth.classid='SHEC_COMPENSATION_MANAGEMENT'

ORDERBYd.pnlgrpname,e.rolename,auth.classid

黑斜体字样部分是我们需要查找的权限列表的名字,可以进行替换。

需要注意2:

通过上面对包含历史记录和更正历史记录的研究,那么会看到对于某些页面具有什么样的操作的权限,例如是否可更改等,我们可以在一开始注册component的时候进行限定,这里的限定直接就决定了我们在权限列表里面可以对哪些操作进行权限控制。

也就是说component是最低层原因,在此基础上我们再来通过权限列表进行控制。

那么我们来看看用权限列表进行控制的操作:

进入下面的页面后,点到“页面”这个页面:

然后在相应的菜单下,点击编辑组件:

然后点击相应组件下面的编辑页面:

此时就可以对相应的组件的操作进行权限控制了。

如果我们把后两项不进行勾选,那么点击相应的组件的时候,一开始就不会出现对“包含历史记录”和“更正历史记录”的选择字样,可以将它跟在权限列表里对操作的后两项勾选了的页面进行比较,如下:

 

需要注意3:

从上图我们可以看到打开页面时有一个搜索依据,那么这个搜索依据是怎么来设置的呢?

我们可以在组件的属性里面查找得到下面红圈里面的属性,是对搜索记录的指定。

限定完上面的记录之后,我们还需要在记录的字段属性里面进行设置:

这样设置之后就会在打开该component的时候出现搜索依据里面需要显示的字段。

需要注意4:

在开发页面的过程中,可能会在WEB上遇到下面的错误:

提示数据完整性错误。

分析这个错误的原因:

是因为我在后台的开发工具里面修改了此页面上的一些东西,但是我之前在这个WEB页面进行了一系列操作之后,依然停留在此,当在后台修改完了之后再次继续在刚才停留的这个页面上操作,就会提示这样的错误。

解决办法是:

重新打开该页面。

b.下面我们再次回到开发实例说明,对其进行分析。

我们可以知道前两个页面是可以注册在一个组件下的,那么第三个页面是否也要注册在这个组件下呢。

回答是肯定的。

按照常规将三个页面注册在同一个组件下面,点击进入之后,三个页面会同时显示出来。

但是我们需要的是点击进入该组件之后一开始只能显示前两个页面,通过点击链接按钮才能够跳转到第三个页面,这又是怎么来控制的呢?

这就是peoplecode的功能所在了。

通过编写一系列的peoplecode代码,并且确保其写在合适的位置,那么就可以实现我们想要的功能。

那么接下来我们就将包含这三个页面的组件注册在某个菜单下。

c.现在我们再来讨论子页面的问题。

为什么要建一个子页面呢?

因为在页面上需要有链接按钮来实现页面之间的相互跳转,如果给三个页面分别建立跳转按钮,那么会发现这样做很麻烦,并且还牵扯到peoplecode的编写问题,那么如果我们把链接按钮做在一个子页面上,在这三个页面上分别插入这个子页面即可,peoplecode编写起来也很方便。

现在我们就来建立一个record,目的是让该record里的两个字段分别充当两个链接按钮,并且将它们放在子页面上,如下:

需要注意1:

建立子页面的时候,点击新建,选择的是Page,那么这个子页面体现在哪里呢?

事实上这是通过页面的属性来设置的,如下:

对于链接按钮的实现,是在field的属性里设置的,如下:

需要注意2:

我们会发现在record里面,有些field的名字是以黑体显示的,而有些字段却没有,这是为什么呢?

原因是有些field里编写了peoplecode代码,那么就会显示黑体。

d.对着上图来说明这个子页面上两个链接按钮的用意,点击“职务数据”按钮另其可以跳转到前两个页面:

HE_JOB_TEST_PG和HE_POSITION_PG,并且该按钮当即失效,不能点击;点击“员工数据”按钮则可以跳转到HE_LABOR_TEST_PG页面,并且“员工数据”按钮当即失效,“职务数据”按钮又生效。

根据这样的需求我们来在两个field里编写peoplecode。

在“职务数据”(JOB_DATA_BTN1)里我们编写下面的代码:

If%Component=Component.HE_JOB_PAGE_CPTThen

Page.HE_JOB_TEST_PG.Visible=True;

Page.HE_POSITION_PG.Visible=True;

TransferPanel(Panel.HE_JOB_TEST_PG);

End-If;

在“员工数据”(JOB_DATA_BTN2)里我们编写下面的代码:

If%Component=Component.HE_JOB_PAGE_CPTThen

Page.HE_LABOR_TEST_PG.Visible=True;

TransferPanel(Panel.HE_LABOR_TEST_PG);

End-If;

需要注意1:

在上面我们已经看到编写的peoplecode了,事实上在上例中除了需要考虑在哪个field里面编写代码之外,我们还需要考虑另外一个方面,即这个代码应该写在什么样的事件里呢?

像上面的例子,实际上我们是把它写在FieldChange事件里的。

由此我们引开了一个话题,peoplecode都可以编写在哪些Defidition里面?

每种Defidition里都可以有什么样的事件?

那么在页面上做了某些操作之后,在后台会引发哪些事件,他们之间触发顺序是什么?

针对上面的问题我们来进行分析:

在RecordField、ComponentRcordField、ComponentRecord、Component、page、Menu等对象里都可以来编写peoplecode的。

Fields是独立定义的,是其他对象的基础,它的属性在使用它的所有Record中被共享。

独立的Field是没有事件的;Recordfields是包含在Record中被定义的,只在被定义的Record中有效;Componentrecordfields是被某个component使用的Recordfields,有自己独特的事件和PeopleCode程序。

我们通过一个表格来说明各个对象里的都包含了什么样的事件:

RecordField

ComponentRcordField

ComponentRecord

Component

page

Menu

FieldChangeFieldDefaultFieldEditField

Formula

PrePopup

RowDelete

RowInit

RowInsert

RowSelect

SaveEdit

SavePostChg

SavePreChg

SearchInit

SearchSave

Workflow

FieldChangeFieldDefaultFieldEditPrePopup

RowDeleteRowInit

RowInsert

RowSelect

SaveEdit

SavePostChg

SavePreChg

SearchInit

SearchSave

PostBuildPreBuildSavePostChg

SavePreChg

Workflow

Activate

ItemSelected

现在我们来举一个例子说明事件之间的触发顺序,当用户改变了一个Field之后,都会触发哪些事件呢?

顺序是什么?

如下:

Record.recordA.fielda.FieldEdit->Component.recordA.fielda.FieldEdit->

Record.recordB.fieldb.FieldEdit->Component.recordB.fieldb.FieldEdit->

Record.recordA.fielda.FieldChange->Component.recordA.fielda.FieldChange->

Record.recordB.fieldb.FieldChange->Component.recordB.fieldb.FieldChange

当然不同的操作会触发不同的事件顺序。

需要注意2:

像其它程序一样,peoplecode也可以写注释的,那么一共有三种加注释的方式:

第一种:

使用/**/

第二种:

使用REM,以分号作为注释的结尾。

第三种:

使用<**>

e.我们再来分析应该在页面上编写的peoplecode代码,当我们点击了组件进入页面之后,希望页面上有哪些设置呢?

根据实例要求已经很明了了,当是前两个页面时,我们希望第二个链接按钮可点击,第三个页面隐藏,当是第三个页面时,我们希望前两个页面隐藏,第一个链接按钮可点击进入前两个页面。

而三个页面都需要这样的代码,那么我们是否可以把它编写为一个通用的代码,从而在三个页面里面调用即可,回答是可以的。

在peoplecode里这是怎么实现的呢?

事实上我们可以再建一个Record,在该Record的Field的FieldFormula

事件里面存放这个通用的函数,令这个函数的参数为页面。

建立的Record如下:

在其Field的FieldFormula事件里编写如下的函数:

Functionshec_JobNavigation(&Page);

If(%Component=Component.HE_JOB_PAGE_CPT)Then

Evaluate&Page

When=Page.HE_JOB_TEST_PG

When=Page.HE_POSITION_PG

Gray(SHEC_DERIVED_HR.JOB_DATA_BTN1);

UnGray(SHEC_DERIVED_HR.JOB_DATA_BTN2);

Page.HE_LABOR_TEST_PG.Visible=False;

Break;

When=Page.HE_LABOR_TEST_PG

UnGray(SHEC_DERIVE

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1