PeoplesoftHCM项目AE程序技术总结Word文档格式.docx
《PeoplesoftHCM项目AE程序技术总结Word文档格式.docx》由会员分享,可在线阅读,更多相关《PeoplesoftHCM项目AE程序技术总结Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
如下图:
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属性更改之后重新进行注册,这个时候再次打开相应的权限列表:
可以看到操作里面的全部项都成了可选的了。
我们在开发页面的时候,有可能会经常查看给某个组件赋予了什么权限,那么怎么样能够快速的知道该组件都赋给了哪些权限列表呢?
那么我们就需要寻找系统里面组件和权限列表之间的关系,以及在系统里面是通过哪些表来存储这些信息的,我们用如下的SQL语句就可以快速查到某个组件的的权限列表:
SELECTDISTINCTauth.classid,
a.menuname,
d.pnlgrpname,
b.itemlabel,
rtrim((casewhenbitand(authorizedactions,1)>
0then'
A,'
END||
casewhenbitand(authorizedactions,2)>
U,'
casewhenbitand(authorizedactions,4)>
U+,'
casewhenbitand(authorizedactions,8)>
C,'
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,
)AuthAction,
g.classdefndesc
pspnlgrpdefnd,
psroleclasse,
psroledefnf,
psclassdefng
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里的两个字段分别充当两个链接按钮,并且将它们放在子页面上,如下:
建立子页面的时候,点击新建,选择的是Page,那么这个子页面体现在哪里呢?
事实上这是通过页面的属性来设置的,如下:
对于链接按钮的实现,是在field的属性里设置的,如下:
我们会发现在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)里我们编写下面的代码:
Page.HE_LABOR_TEST_PG.Visible=True;
TransferPanel(Panel.HE_LABOR_TEST_PG);
在上面我们已经看到编写的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
PostBuildPreBuildSavePostChg
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
当然不同的操作会触发不同的事件顺序。
像其它程序一样,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