对于个SR的小结 (二)
之前总结到关于data download的一个SR的总结,这个SR分为两个部分,online page 用来提供给user 输入类似table值,outputfile,criteria,要download什么field 等。
等所有的online setup 完成以后,那肯定是要通过process 来实现 生成文件,实现data downlaod
我们用的是SQR。
其实SQR个人觉得写起来要简单一些。同时在生成report或者文件的时候有自己独特的优势,虽然在某些时候显得不是那么的灵活。
实现: 之前已经说过了需求,所以我们现在就是要考虑,通过online page里的table 和field 来download数据。所以,table 是哪个,我们是可以确定的,但是field有哪些,这是个问题。
首先可以肯定的是,我们需要这样写:
BEGIN-SELECT
[$all_fields] &myfields = char
let $test = &myfields
string $test by $tab into $CSVLine !the value of $tab is ‘||||’
Write 1 from $CSVLine
FROM [$recordname]
where [$criteria]
END-SELECT
这样可以实现在运行的时候把table,criteria,和 field的值传给 这个 Select SQL。
但是这样的写法,一般来说,只是用于实现一个field,当然如果你要是知道有多少个field你需要select,当然你可以根据你的需要多写几个 类似 [$all_fields_2],[$all_fields_3]。
但是我们现在的问题是不知道有多少field是需要download的,于是无法按照上面的想法来做。 该怎么来做? 哈哈,我们可以在$all_fields 上面来做手脚。
begin-select
sub1.fieldname
let #rows_fields = #rows_fields + 1
if $all_fields = ' '
let $all_fields = &sub1.fieldname
else
if $all_fields <> ' '
let $all_fields = $all_fields||'||''|||| ''||'||&sub1.fieldname
end-if
end-if
show '$all_fields:'$all_fields
if #rows_fields = #totalfields
DO DATA-EXTRACTION
end-if
from sysadm.ps_agd_extract_sub sub1
where sub1.seq_nbr_prefix = $seq_number
AND sub1.required_field = 'Y'
order by sub1.fieldnum
end-select
用绿色标识的部分,是主要的实现方式,我们把所有需要用到的field选出来,并用‘||||’join起来,在把它给传给 $all_fields
这样一来,就可以一次性的把所有要select的field值拿出来,只是结果是用‘||||’join起来的,之后,我们需要再做一些手脚。
为什么要用‘||||’ 因为我觉得在一般情况下,没有人会在field里面存这样一个值,除非真的是他头脑发热,眼睛发昏,哈哈。
当然如果你愿意,你可以用更复杂的一个字符串来代替。
现在重点来说说生成的文件的问题,最开始的时候,我们生成的文件是CSV格式,用CSV格式的好处是,它本身会把逗号当作分隔符,也就是说,但凡事用逗号隔开的两个字符串,用CSV显示的时候,它都会自动把它排在不同的两列里面,这本来是一个非常完美的事情,因为这正好解决了生成的文件的data download 的格式的问题。 于是在最开始的时候,其实我用comma来连接不同field之间的值而不是
‘||||’, 在那个时候,所以事情都显得是那么的无可挑剔。
可是后面在检查生成的文件的时候,我发现其实存在的问题很严重,因为在某些filed比如description里面,本身就会有comma的存在,这个时候,在生成CSV文件的时候,一个好好的description,会被很无辜的放在不同的column里面,同时,其他一些比较特殊的字符也会造成问题,比如回车键,在某些field里面会有回车键,于是这个时候,本来是一行的数据,会被分成两行。
我最开始的solution是先把所有的fiel的用”||||”连接起来,然后在把数据选出来,选出来以后用function translate或者 replace用把field里面自带的comma用空格替换掉,最后在用comma把“||||”替换掉,但是这样的做法并不正确,因为这样的话其实是改变了download出来的数据。虽然只是把comma去掉而已。
虽然我觉得肯定会有些格式控制的东西,可以在某种情况下让comma不成为分隔符,不过由于各方面原因,我并没有继续下去,也许我可以等下吃了中午饭继续,哈哈。
后来我尝试生成xls文件,xls并不会把comma当成分隔符,不过它会把所有的值都放在一个column里面,于是这就需要一些manual的操作。
先来解决特殊字符比如回车符的问题。
Let $valid_chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -.,/0123456789_@<>[]\():%*|;.?^$~`"'||$sign||$sign1||$sign2
Let $invalid_chars = translate($test, $valid_chars, '')
let #invalid_length = length($invalid_chars)
if #invalid_length <> 0
let $test = translate($test,$invalid_chars,'')
end-if
以上代码的中心思想是,先拿到你要处理的值,然后把普通的字符去掉,剩下的就是那些特殊的字符,这样一来就拿到了这些特殊的字符,于是在把这些特殊字符从要处理的值里面拿掉,问题就解决了。
哈哈,这个代码的效果还是不错的。
刚刚说到,我们现在的做法是把所有的值用‘||||’join起来,再生成xls的文件。
于是下面就是一个例子:
可见所有的值都在第一个column里面
这个时候,选择data->Text to Columns,选择delimited,click next
这个时候把 treat consecutive delimiters as one 选上,然后在 other 里面输入‘|’这样一来,xls就会把‘||||’当成一个分隔符来处理
再click next
这就是convert过后的效果
好吧,这个SR还没有implement,这样的做法貌似并不是很好,肯定有很多需要改进的地方,这个要做peoplesoft需要了解的东西也太多了嘛,哈哈,吃饭时间到,吃完饭再考虑考虑吧。
以上的内容,与想要通过自己努力来改变自己现状的朋友们分享。




浙公网安备 33010602011771号