PLSQL加密和解密

加密:使用oracle提供的wrap工具:
举例:
D:\mytest> c:\devsuitehome_1\bin\wrap iname=mypackage.pck

输出:在当前目录下生成一个同名的.plb文件 mypackage.plb

编译加密文件:
登录plsqldeveloper ,打开commond窗口 ,编译加密文件:
SQL>@d:\mytest\mypackage.plb;
编译成功;

解密:使用“好事者”提供的解密工具:
base   (来源:http://www.itpub.net/thread-1175718-8-1.html)

用法:base <加密文件名>  <解密文件名>

可把加密的plsql 进行解密:
举例:把dbms_output的加密的部分另存为dbms_output.plb文件
d:\mytest>base dbms_output.plb dbms_output.txt

即可成功解密;

FOLDER FORM 问题

Folder查询结果不对的问题:

问题:在一次项目UAT时,一个用户测试时发现她总是查询不出结果,这个FORM是我们客户化一个标准的FORM。

解决过程:因为是标准FORM,而且我们之前自己测试时也没有遇到这个问题,所以以为系统对用户权限有什么控制,我们查看FORM源代码,但是找了很久还是没有找到问题的所在,打印DEFAULT_WHERE发现每一次查询后,DEFAULT_WHERE会增加一段相同的我们很费解的条件,就是这个条件导致查询不出结果。

问题原因:最后多亏吴前进提醒,最终我们找到问题所在。原来该用户在操作时,保存了FOLDER,在保存时勾选了”包括查询”,结果就把当时的查询条件给保存了下来,所以该用户在每一次查询是都会带上该条件,导致查询不出结果。对于保存的FOLDER,点击 文件夹-》查看查询,查看保存的查询。

总结:在用户培训时,对于FOLDER的FORM,要提醒用户此类问题,如果保存FORM时,要慎重勾选“包括查询”,除非确实需要保存的条件。对于FOLDER FORM,如果碰到某种情况加查询结果不准确,要首先考虑是不是FOLDER保存查询的原因。

FOLDER修改多堆叠画布问题

问题:在做一个Tab FOLDER FORM时,由于需要变化每一个Tab页上的ITEM,重新分配,将原来在第一个画布上的ITEM放到第三个画布上面,我直接修改的画布属性。结果导致第一个画布的ITEM布局乱了,出现了一部分ITEM堆到了另一部分ITEM上面。

解决过程:因为修改ITEM比较多,我以为是ITEM没有对应上或者Promt与内容字段顺序没有对应上的问题,结果比对了好久,发现没有问题。

问题原因:多谢徐晓晓同学提醒,原来是我直接修改ITEM属性,而没有去调整ITEM的顺序。对于这种多堆叠画布的FOLDER,需要把属于同一个画布的ITEM都放在一起,如果交叉放的话会导致一个画布上的ITEM堆起来。

思考:FOLDER将ITEM放到画布上时,应该是按照ITEM的顺序去填到画布上去的,而从一个画布到另一个画布上时,都会把ITEM从画布的最左边开始摆放,所以导致了ITEM堆起来的结果。

FORM 中LOV使用别名问题

问题:在一个LOV的记录组中SELECT nvl(p.full_name, fu.user_name) FULL_NAME
,fu.user_name
,fu.user_id
FROM fnd_user fu
,per_all_people_f p
WHERE fu.employee_id = p.person_id(+)
ORDER BY 1

LOV选择在显示之前过滤

发现查询的结果中,总是没有取到user_name的情况。

解决&总结:通过做TRACE发现,在显示之前过滤时,会自动在后面拼上一段条件FULL_NAME like :1 …..实际上执行的时候,FULL_NAME指向的是per_all_people_f里面的 FULL_NAME,所以没有出现user_name的值(其实这样使用别名是会报错,这是一个巧合);而当把别名修改成为其他(非数据库字段名)NAME时,会报NAME标识符无效错误。这是肯定的,应为SQL就是不能用别名来作为查询条件的。解决方法有两个:1,将显示之前过滤设为否,这样就会把所有记录先查出来,然后在查询出来的记录组里再筛选。不会在之前拼SQL了。

2,如果一定要在显示之前过滤的话,使用嵌套查询。

帮助》历史记录灰掉问题

问题:在一个FORM中发现历史记录菜单灰掉

解决:这个跟块查询灰掉一样,块查询是把块级触发器WHEN-NEW-RECORD-INSTANCE触发器层级修改为BEFORE,

这个问题需要将WHEN-NEW-BLOCK-INSTANCE触发器层级修改为BEFORE,因为这两个的可用与否,是FORM级触发器判断的,如果覆盖,就不可用了。

PS:使用历史记录时 报“历史记录不可用”,是由于在该块中没有5个数据库WHO字段的原因,添加上就行了。

Office2010开发BI Publisher RTF模版的若干疑难问题

1、图表刷新问题:

     现象:使用BI publisher在Word中插入图表以后,右键单击图表没有“BI Publisher 图表…”菜单项,且预览时,不会因为xml数据变化而使得图表跟着变化,感觉是一幅静态图片。

     分析:在把文档另存为97-2003的兼容格式后,再另存为RTF格式文档后,发现在图片上右键菜单有“BI Publisher 图表…”菜单项了,预览时图形也确实会跟着xml数据变化而变化。

     解决方法:按照分析中的方法创建RTF文档 ,这可能是一个兼容性问题。

 

2、模板文档属性问题:

     现象:在RTF模版的Advanced例子中有一个需要通过设置文档属性来控制的例子 Properties, 但很难找到自定义文档属性的地方。

     分析与解决:word2010设置自定义属性的地方确实够隐蔽,但也很容易找到,看下图:

     在文件->信息->属性->高级属性

image

    

    image

FROM批量处理界面效果

FROM批量处理界面效果

当遇到对FORM上记录进行批量处理时,一般情况下都会选择在记录前面加上复选框,然后勾选上需要处理的数据,最后获取勾选的记录数据进行业务处理:

clip_image002

如果只是添加复选框,显得界面效果太单调,勾选结果显示也不够明显,将勾选的行进行特殊显示,会使得勾选效果更好。

通过在标准界面查找类似业务,找到对应API:

app_record.highlight(‘SELECTED_DATA’);高亮显示当前行所有ITEM

app_record.highlight(”);取消高亮显示当前行所有ITEM

效果如下图:

clip_image004

这样看起来用户会更明确的看到选择的行。

效果已经做出来,但是在操作上,用户会有一些不便,选择几行或者全选还好。但是如果一次连续选择50条,100条用户需要点击100次?用户会疯掉。

解决方法:

在我们用电脑选择多个对象时,习惯性使用CTRL或者SHIFT键来多选记录,可以考虑使用这个方法来处理。

通过查找标准FORM的库代码,找到了解决方法。

核心在一个SYSTEM属性

name_in(‘SYSTEM.MOUSE_BUTTON_MODIFIERS’);

返回varchar2。

在WHEN-MOUSE-CLICK触发器时,这个属性会返回在你点击鼠标时,同时按住的那些按键名称用’+’拼接起来,如:同时按住Ctrl和Shift时返回Shift+Control+。有了这个后面问题就好解决了,只需要判断返回值是否包含Control或者Shift即可。

处理逻辑:

1. 按住Ctrl点击左键,如果原来勾选高亮显示,则变成取消勾选高亮显示,反之,则变成勾选高亮。

2. 按住Shift时需要增加一个变量记录上一次点击行Last_record

然后再根据当前点击行,循环中间所有行,勾选高亮显示,按住Shift的优先级应该高于Ctrl。

注意:因为勾选复选框时会触发WHEN-CHECKBOX-CHANGED,然后也触发WHEN-MOUSE-CLICK事件,这样按住CTRL会导致做两次事件,此时需要判断去跳过其中一个事件。

这样,就有多种操作方式选择记录了,使用户操作更加个性化,同时节省操作时间。

附:批量处理界面数据获取的心得:

对于这种勾选批量处理界面数据获取,首先想到的就是去循环界面所有记录去检查是否勾选,从而获取数据。这种方法简单,代码也很好写。但是当在界面操作时,问题就会出现:只勾选一条记录,却要去循环整个界面所有数据,还包含没有fetch到界面的数据。使得处理速度大大增加。“想尽办法去避免循环界面“这是我在做这个功能一个的体会(全选是不可避免的要循环界面了)。所以这种勾选模式要提前去获取数据。首先定义一个全局Table类型的变量,当勾选某一条记录时,将值存在Table(:SYSTEM.CURSOR_RECORD)里,取消勾选时Table.delete(:SYSTEM.CURSOR_RECORD)。这样在最后处理逻辑是只需要循环Table就行了。避免去Fetch不需要的数据(处理过程中,Table中间delete掉的记录在获取时会报No_data_found异常,只需要抛出异常跳过就行了)。即使勾选第一条和最后一条,虽然循环Table和循环界面次数一样,但是速度却有很大差别。

oracle EBS User Profile使用举例

Oracle EBS 用户配置文件使用举例:

用户配置文件相当于系统参数,可以在不同层级(Site层、应用模块层、责任层、用户层)设置不同的值; 作用范围小的覆盖范围大的层,系统已经预设了很多user profile; 开发人员也可以定义User profile;

对开发人员如果要新定义user profile 并使用之,步骤一般包括三步

第一步:定义user profile (Nav:应用开发员责任->配置文件)

user_profile_define

上例中定义了一个User profile : ORG_ID, SQL验证用于提供用户在设置该Profile值的时候提供LOV数据来源; 开发者只需要依葫芦画瓢即可。

如果LOV来源不是系统原有表中的数据,而是需要自己定义的,那么可使用值集定义好数据源,然后在这里的SQL中使用,下面的例子就是这样的:

user_profile_define2

上述例子中,lov数据来源于fnd_flex_values_vl视图,该视图中的内容是用户可以在界面上定义增加的,一般步骤是:

a) 先定义一个值集(Nav: 系统管理员责任->应用产品->验证->请求集:

值集名将用在上面的sql中,验证类型为独立。

user_profile_define3

b) 为新定义的值集添加值(NAV: 系统管理员责任->应用产品->验证->值)

在名称处输入刚才定义的值集名作为查询条件,然后点查找

user_profile_define4

在该界面可以为上面定义的值集添加值。

user_profile_define5

第二步:设置User Profile的值(Nav:系统管理员责任-> 配置文件-> 系统)

user_profile_setup_1

如果需要同时设置责任层和用户层的值,则把两者都勾选上。

user_profile_setup_2

上例中,责任 order Management user,… 和 用户Operations 层都设置了值; 且值是不一样的。 由于用户层的值可以覆盖责任层的值,当operations 用户以 order Management user,..责任登录系统是,Form中取到的值是: Vision ADB;

三、 程序中获取User profile 值:

在程序中可以使用fnd_profile.value(‘ORG_ID’) 来获取 ORG_ID这个user profile的值; 有关用户配置文件的详细概念和API,请参考120devg.pdf 第249页。