对于一个SR的小结(-)

这才意识到自己很久很久没有做过总结回顾,嗯,不好不好。

虽然今天是星期6,可无缘无故起得很早,好吧,那就让我来对最近做的一个SR来个小结。

嗯,有图有真相。

1.需求部分:

我们的user,Accounting General Department, 简称AGD, 他们会时常要求对一些模块(比如AP,PO,GL 等)的主要transaction 的表进行一些data download,一段时间以来我们的做法是准备script 然后让我们的Operator team 帮我们跑这些sql script,现在他们不想这样做了。

虽然PeopleSoft 本身自带了功能很强大的query,其实我个人觉得已经完全符合他们的要求了 ,结果因为query一次性能够download的数据量有限,不想用。

于是他们想要我们提供一个common 的 东西,使得他们能够实现以上功能,同时,不知道从什么时候开始,他们开始很抠,又不愿意付很多钱,虽然他们钱都是是government 的。

于是,简单有简单的做法,反正就当是学习学习。

2. 实现部分:

于是以下这个page就出现了:

 

image

 

首先,要把它做成一个common的东西,那就要提供一个地方给user 输入他们的条件比如要download那个表的数据,download过后的文件叫什么名字,生成在那个路径,datadown load 的 criteria 是什么。

从这个page看来,貌似基本条件满足,以下是较为详细的内容。

对record这个 text box, 我们提供了一个prompt table, 让user可以click那个放大镜,来选择他们想要的table, 这样做的一个好处是第一,不让他们手动输入,以免造成一些错误的或者是没用的data,第二,可以对他们所能选择的table做一些条件限制。

对prompt table,基本做法就是在record filed properties 里面 设置一个 prompt table,一般情况下用一个view,可以根据需求来写不同的sql以实现control。

output file, 我们可以生成比如dat,csv ,xls 的文件,这里,我们生成 xls。

对于这个page的criteria,我不得不说这真的是一个糟糕的地方,really awful,因为要让一些不懂sql的users来写这个条件是有点过份的,不过鉴于他们给的那点钱,而且在IA(Impact Analysis)里面又是写清楚了这样的情况的,只能暂时讲究这样了。当然我们会给他们做一个简单的briefing。

 

在user选择了table以后,他们会根据自身的需求来决定哪些field是需要download,在最开始的设计里面,我们只是用一个grid, 让user一个field一个field的手动输入和添加,或者删除。

这又是一个很糟糕的地方,于是我想还是绅士一点,免费多提供一些东西,同时也让我自己多锻炼锻炼。

于是在选择了一个record之后,以下这个page出现了。

record info:

image

 

当选择了的一个table之后, 在下面这个field info 这个grid里面,会把这个表相对应的 所有的field都显示出来,然后user可以根据自己的需要,选择一些field,或者不选择一些field,又或者可以 通过点button:”Check All“ 或者”UnCheck All“来实现对所有field的选择或者不选择。

那么我们是怎么实现这样的效果的?

一般实现这样的做法是用dynamic view,一般步骤是创建一个dynamic view,然后在事件rowinit ,filedchange 中把选择的table的值传给他的sqltext,然后再把filed 的prompt table 设为 这个dynamic view。

基本做法是这样,但是我做的时候貌似总是有这样那样的问题出现,于是乎,在senior 人的指导下,有了以下代码。

 

在那个record 的fieldchange的事件中:

image

 

是的,我们用到了ScrollSelect 这个function,这个function,很好很强大。

在用这个function之前,先说一下准备工作,我们create了一个view,这个view包含了一些我们想要在grid里面显示的field,比如字段的名字,比如field的 column number(为后面排序用)。

很显然,这个gride在这个page里面的level是 level1.

scrollselect 它基本实现的功能是从一个基本表里面把数据传给另外一个表。

于是,这个scrollselect 参数来了, 第一个”1“ 指的你的被传的那个table的level,刚才提到,是1,第二个指的是你的被传值的表,第三个参数说的是你传参数的表,最后的一个sql是对你传值的criteria。

真的很好很强大,我们在传值的时候动态的把选中的record 给它,加上这个criteria,我们就可以轻松实现在grid里面动态显示表所相对应所有field。

有一点必须要提到的是,在create view:agd_recfld_vw 的时候,我们需要得到record所对应的filed,当然peoplesoft会有这样的一些table, 比如 说 psrecfield,但是这个表里面放的field,是peoplesoft level的,和application designer里面一致,但是正是因为这样,我们会遇到一个问题,因为我们在application designer里面define一个表的时候,时常会用到subrecord,比如 XXX_SBR,这是个问题,因为这样我们所选出来的field会是这个SBR这个field名字,然而在实际的select sql中,我们会去找这个SBR这个subrecord里面的字段,于是乎,当你选择在这个page里面选择了这个subrecord,然后run process开始data download 的时候,会遇到找不到field这样的error。于是我们用的表 all_tab_columns,这是个database level 表,也就是说,它包括了应该在数据库里面显示的field,而刚才那个table:psrecfield,它会现实在application designer里面显示的field。

 

于是在选完了一个table以后,我们开始选择field,刚才有提到是可以用check all 和 uncheck all这两个button来实现全选和反选

Field info

image

 

 

那么这个又是怎么实现的?

首先,在grid里面我们有一个checkbox,当然这个checkbox所对应的field 是存在表agd_extract_sub 这个表中,这个表,就是刚才在scrollselect中被传值的那个表。当我们选中某一个field,这个checkbox的值会被设为”Y“,在save的时候,这个y值会被保存早表agd_extract_sub这个表中,当然没有选中,这个值就是N。

这是很简单的基本concept。

我们现在所需要做的就是当click check all这个button的时候,把现在这个grid所显示的所有filed的checkbox的值设为’Y’.

check box和uncheck这两个button,其实就是push butttons and  hyperlinks 这个peoplesoft的基本的feature。

首先我们为这两个button create一个 derived work table,有两个字段,然后把这两个字段分别和这两个button 关联起来(只需要在这两个button的property里面做setup)。

然后在这两个字段的event: fieldchange里面有了一下代码(因为click这两个button,触发的时间就是 fieldchange)

 

image

 

是拿到现在在buffer里面的这个table:agd_etract_sub 的值,loop它,把这个checkbox这个字段的值设为Y,就实现全选了

在click check all 这个button之后,peoplesoft会自动refresh这个field的buffer里面的值,于是在page上急看到所有的field都被选中了。

这个时候再保存,所有的值都会相应的被存到database中。

 

再来说保存, peoplesoft很强大的自带了保存的功能,但是我们在做的时候没有用这个,在grid属性里面把 自动保存这个功能去掉,我们有了以下的代码

 

image

 

在这个page里面,field info的table: agd_extract_sub 有个parent table,就是用来存在reocrd name,criteria,output file这个table。在这个code里面,我们就只是赋值,然后利用peoplecode insert()这个function。

值得注意的是,最开始我们把这个code 写在了table agd_extract——sub的一个field里面,但是因为page上是一个grid,当我们选择表是类似vouher这样的表,它的field的有210多个,也就是说在这个page的这个grid中,会有210多行,在保存的时候,这210行都会execute 以上保存的代码,这样效率就很低,于是我们把这个code写在 component 的saveprechange中,它只会执行一次,所以快很多。

 

好吧,肚子饿了,下次我在总结一下对于这个datadown 的process 的内容,我们用的是SQR来实现的。

 

 

TJ

posted @ 2012-10-06 11:42  宝钢的宝  阅读(358)  评论(0)    收藏  举报