maximo工作笔记

maximo工作笔记

xml学习:
多选框: <hdcheckboxgroup id="1339230676937" label="作业类型" dataattribute="JOBTYPE" hdwhere="domainid='UDZYLX' AND VALUE NOT IN ('zylx99','zylx98')" hdvalattr="description" hdtbname="ALNDOMAIN" hdkeyattr="value" hdorderby="iseq"/>  hdpadlleft="1"
		(hdvalattr)表现值:
		(hdkeyattr)实际值:
下拉框:<combobox id="1407219359053" dataattribute="DYZYLEVEL" width="80"/>
		<combobox id="1407285027053" label="受限等级" dataattribute="SXKJZYLEVEL" width="80"/>
		combobox自动加载描述,存值时存域的值
		(displayattribute)展示值:displayattribute="valuelist"
文本框: (dateattribute)属性:填入主对象字段名(数据库配置表中的属性名) 或者 关联名.字段名(CREATEBY.DISPLAYNAME)
		 (lookup)查找 放大镜效果:字段为date,datetime 填入datelookup
		 	   			 *字段从域选择值,valuelist
		 	   			 从其他表选择值,填入lookups.xml的控件值,比如table ID值,再通过library.xml 查找对应的databean或子类。
			lookups.xml中有许多文本框属性可以直接用。 library.xml,lookups.xml,和menus.xml控件
		 (menutype)菜单类 型 双箭头效果: menutype="SINGLEDEPTCBSTREE" 在menu.xml中定义部门树 ,也能在应用程序xml中单独定义
		  (inputmode) 输入模式: inputmode="readonly" inputmode="required"
		 (sigoption) 标签选项:在xml和签名选项中定义,并且赋予相关权限和条件表达式来控制隐藏显示。
		 (applink) 转到查找: <textbox applink="person" dataattribute="person.supervisor" id="main_personal_r1c1_6" lookup="person" menutype="normal" /> 
		 				menutype="normal" 代表双箭头,lookup="person" 放大镜效果,applink="person",转到应用程序
多部分文本框:
		<multiparttextbox dataattribute="cbshmdnum" descdataattribute="description" descinputmode="readonly" id="changestatus_grid1_1_1_grid3_1" inputmode="readonly" />
创建多选框(通过建立同名签名选项来实现隐藏显示功能   ):
	建立签名选项后,赋予安全组权限,设置条件表达式,重启服务
	<section id="1340176435572" inputmode="required" label="作业风险类型" sigoption="riskgrade01">
		<hdcheckboxgroup dataattribute="RISKGRADELINE" hdkeyattr="value" hdorderby="iseq" hdtbname="ALNDOMAIN" hdvalattr="description" hdwhere="domainid='RISKGRADELINE' and  VALUE like 'riskgrade01%'" id="1339645777012" label="工作类型判定"/>
	</section>
是否复选框:<checkbox dataattribute="ISCHILDCBS" id="1518145190514" label="是否分公司" />
创建下拉框:<combobox dataattribute="RISKGRADE" id="1363949125219" width="100" inputmode="required" label="作业风险等级"/>
单选按钮组:<hdradiobuttonnumgroup dataattribute="ISQTJC" hdkeyattr="value" hdpadlleft="1" hdtbname="ALNDOMAIN" hdvalattr="description" hdwhere="DOMAINID='YESORNO'" id="1341822715947" inputmode="required" label="是否气体检测"/>
创建tab页单页面应用程 序:
						<tab id="13111111133" label="不安全行为和状态">
							<table beanclass="hd.webclient.beans.gcgt.co.appgcjl.GclrmxAppBean" id="13111111134" label="不安全行为和状态" relationship="BAQXW" rowdetailsexpanded="true">//apprestrictions="DR=0" table的逻辑删除,选择显示
								<buttongroup align="left" id="131111121166" labelalign="left">
									<pushbutton default="true" id="131121111167" label="新建行" mxevent="addrow"/>
								</buttongroup>
								<tablebody displayrowsperpage="20" id="13111111137">
									<tablecol filterable="false" id="1234561111233" mxevent="toggledetailstate" sortable="false" type="event"/>
									<tablecol dataattribute="LRMX_QY_DESC" id="13111111138" inputmode="readonly" label="区域"/>
									<tablecol dataattribute="LRMX_MS" id="13111111139" label="描述"/>
									<tablecol dataattribute="LRMX_LX.DESCRIPTION" id="13111111141" inputmode="readonly" label="类型"/>
									<tablecol id="1311111117522" mxevent="toggledeleterow" mxevent_desc="标记要删除的行" mxevent_icon="btn_garbage.gif" type="event"/>
								</tablebody>
								<tabledetails id="13111111145">
									<section id="13111111146" label="不安全行为录入">
										<sectionrow id="13111111147">
											<sectioncol id="13111111148">
												<textbox dataattribute="LRMX_QY_DESC" id="13111122112" inputmode="readonly" label="区域" size="23"/>
												<combobox dataattribute="LRMX_LX" id="131111122662" label="类型" width="120"/>
												<combobox dataattribute="INJURY" id="1363948125219" width="120" inputmode="required" label="可能造成的伤害"/>
												<combobox dataattribute="ACCIDENT" id="1347948125219" width="100" inputmode="required" label="是否可能造成其他事故"/>
												<multilinetextbox columns="26" dataattribute="LRMX_MS" id="13111111149" inputmode="required" rows="3"/>
											</sectioncol>
										</sectionrow>
									</section>
								</tabledetails>
							</table>
						</tab>
			直接加有详细的 子表:
						<table id="1339984359747" label="明细表" orderby="linenum" relationship="UD_EXCEL_LINE">
						<buttongroup align="left" id="1339987064234">
							<pushbutton default="true" id="1339987064243" label="新建行" mxevent="addrow"/>
						</buttongroup>
						<tablebody id="1339984359773">
							<tablecol filterable="false" id="UD_CBSGL_CBSZZSJX_TABEL_BODY_1" mxevent="toggledetailstate" mxevent_desc="显示详细信息" sortable="false" type="event"/>
							<tablecol dataattribute="SAMEASATTRIBUTE" id="1339984396459" width="100"/>
							<tablecol dataattribute="TITLE" id="1339984398316" width="100"/>
							<tablecol dataattribute="MAXTYPE" id="1339984394377" inputmode="readonly" width="100"/>
							<tablecol dataattribute="DOMAINID" id="1339984359781" inputmode="readonly" width="100"/>
							<tablecol dataattribute="linenum" id="1340022761972"/>
							<tablecol dataattribute="isinsert" id="1341649656092"/>
							<tablecol dataattribute="mustbe" id="1342081078309"/>
							<tablecol filterable="false" id="udtxshshz_line_table_tablebody_13" mxevent="toggledeleterow" mxevent_desc="标记要删除的行" mxevent_icon="btn_garbage.gif" sortable="false" type="event"/>
						</tablebody>
						<tabledetails id="1339984359798">
							<section id="1339984369801">
								<sectionrow id="1339984376595">
									<sectioncol id="1339984381725">
										<section id="1339984384066">
											<textbox dataattribute="SAMEASATTRIBUTE" id="1339985097967" lookup="ExcelAttributeSelect" size="20"/>
											<textbox dataattribute="MAXTYPE" id="1339985105920" inputmode="readonly" size="20"/>
											<textbox dataattribute="UPPERLIMIT" id="1339985104136" size="20"/>
											<checkbox dataattribute="isinsert" id="1341645042364"/>
										</section>
									</sectioncol>
									<sectioncol id="1339984379362">
										<section id="1339984387929">
											<textbox dataattribute="TITLE" id="1339985102382" size="20"/>
											<textbox dataattribute="DEFAULTVAL" id="1339985100791" size="20"/>
											<textbox dataattribute="LOWERLIMIT" id="1339985189196" size="20"/>
											<checkbox dataattribute="mustbe" id="1342083163101"/>
										</section>
									</sectioncol>
									<sectioncol id="1339985342341">
										<section id="1339985366726">
											<textbox dataattribute="SAMEASOBJECT" id="1339985379206" inputmode="readonly" size="20"/>
											<textbox dataattribute="DOMAINID" id="1339985096137" inputmode="readonly" size="20"/>
											<textbox dataattribute="linenum" id="1340022800393" inputmode="required"/>
											<checkbox dataattribute="iskey" id="1342488961420"/>
										</section>
									</sectioncol>
								</sectionrow>
								<blankline id="1339985239457"/>
							</section>
						</tabledetails>
					</table>

时间选项文本框:
调出时间选择器:

lookup="DATELOOKUP" 	
	<textbox dataattribute="JLSH_YHXXDATE" id="1336467458429" inputmode="required" lookup="DATELOOKUP" size="20"/> 

必填属性:inputmode="required"
通过表域选择查 找:

<table id="ZYBM" inputmode="readonly" selectmode="single">
		<tablebody id="fueltb030_lookup_tablebody" filterexpanded="true" filterable="true" displayrowsperpage="20"> <tablecol id="fueltb030_lookup_tablebody_col_1" dataattribute="ZYBM" mxevent_desc="Go To %1" mxevent="selectrecord" sortable="true" type="link"></tablecol>
			<tablecol id="fueltb030_lookup_tablebody_col_2" dataattribute="description" mxevent_desc="Go To %1" mxevent="selectrecord" sortable="true" type="link"></tablecol>
		</tablebody>
	</table>

高级搜索,更多字段:

<dialog beanclass="psdi.webclient.system.beans.QbeBean" id="searchmore" inputmode="query" label="More Search Fields">
	<section id="searchmore_1">
		<textbox dataattribute="UD_XFGL_AJEQID" id="searchmore_attr1"/>
		<textbox dataattribute="DESCRIPTION" id="searchmore_attr2"/>
		<textbox dataattribute="CREAT_USER" id="searchmore_attr3"/>
		<textbox dataattribute="CREAT_ORG" id="searchmore_attr4"/>
		<textbox dataattribute="CREAT_TIME" id="searchmore_attr5" lookup="datelookup"/>
		<textbox dataattribute="MODIFY_TIME" id="searchmore_attr6" lookup="datelookup"/>
		<textbox dataattribute="MODIFY_USER" id="searchmore_attr7"/>
		<textbox dataattribute="SDDEPT_DESC" id="searchmore_attr8"/>
		<textbox dataattribute="ZYAREA" id="searchmore_attr9"/>
		<textbox dataattribute="BZ" id="searchmore_attr10"/>
		<textbox dataattribute="ZYAREA_DESC" id="searchmore_attr11"/>
		<textbox dataattribute="AJTYPE" id="searchmore_attr12"/>
		<textbox dataattribute="AJNAME" id="searchmore_attr13"/>
		<textbox dataattribute="TYPE" id="searchmore_attr14"/>
		<textbox dataattribute="NUM" id="searchmore_attr15"/>
		<textbox dataattribute="CFSITE" id="searchmore_attr16"/>
		<textbox dataattribute="CFDATE" id="searchmore_attr17"/>
		<textbox dataattribute="SYYEAR" id="searchmore_attr18"/>
		<textbox dataattribute="JCDATE" id="searchmore_attr19"/>
		<textbox dataattribute="WBQK" id="searchmore_attr20"/>
		<checkbox dataattribute="HASLD" id="searchmore_attr21"/>
		<textbox dataattribute="DESCRIPTION_LONGDESCRIPTION" id="searchmore_attr22"/>
		<textbox dataattribute="SDDEPT" id="searchmore_attr23"/>
	</section>
	<buttongroup id="searchmore_buttongroup">
		<pushbutton default="true" id="searchmore_buttongroup_1" label="Find" mxevent="dialogok"/>
		<pushbutton id="qbe_restoreappdefault_button" label="恢复应用程序缺省值" mxevent="qbeclear"/>
		<pushbutton id="qbe_revisebutton" label="修订" menutype="SEARCHMOREREVISE" targetid="searchmore"/>
		<pushbutton id="searchmore_buttongroup_3" label="Cancel" mxevent="qbecancel"/>
	</buttongroup>
</dialog>

在section里加小标题:

<helpgrid id="1358368643999" innerhtml="<font color=red size=2>红色为Ⅰ类风险,</font><font color=blue size=2>蓝色为Ⅱ类风险,</font><font color=green size=2>绿色为Ⅲ类风险;</font><font color=black size=2>作业涉及多个风险等级,勾选相应最高风险等级。</font>" /> 

报表section:

导入xsl对话框: id对应签名选项中的名字

<dialog id="importry" label="导入人员信息excel">
		<section id="importry_1">
			<helpgrid id="138375642014" innerhtml="提示:导入模板必须是 .xls 类型的文件"/>
		</section>
		<section id="importry_1_3" label="导入人员信息excel">
			<uploadfile cancellabel="取消" event="importexcel" id="importry_3_1" label="选择" maxfilesize="300" oklabel="确定"/>
		</section>
	</dialog>

添加工具栏按 钮: 选择操作-添加签名选项-添加工具栏菜单-元素类型 option -职位为分组,下级职位为分组后顺序 - 选项卡表示在卡片还是列表显示 -配置后通过安全组配置后才能用,需要重启

	图像:nav_icon_import.gif 可见:
	PREVIOUS: 图标nav_icon_previous.gif NEXT:图标nav_icon_next.gif

附件上传:

<attachments id="1510108655842" label="初评报告"/>

可以勾选的table 列:

<tablecol filterable="false" hidden="false" id="signleselattribute_table_tablebody_Q2101" mxevent="toggleselectrow" sortable="false" type="event"/>

显示手签的审批记 录:

<tablecol id="1359326027668" mxevent="getPhotos" mxevent_desc="查看照片" mxevent_icon="menu_icon_viewImage.gif" type="event"/>

进入程序时列表不为 空:

<table id="results_showlist" inputmode="readonly" label="列表" mboname="UD_ZYXK_JSA" orderby="CREATEDATE DESC" selectmode="multiple" startempty="false">

是否展示:

display="false"

eclipse技巧: Eclipse中移除未使用的类引用的三种办法 : 第一种:移除某个类中的
在Java类中按键Ctrl+Shift+O
第二种:移除整个包中的 在Package Explorer下右键点击包名,依次选择Source——Organize imports即可
第三种:保存时自动移除 也是最方便的
Windows——Preferences——Java——Editor——Save Actions 然后选择Perform the selected action on
save,再勾选Organize imports即可 查看类或接口的实现类和继承层次 : F4 查找类: C+S+H 全局查找: CTRL + H; 查找类的继承: CTRL + T
返回上一次修改: CTRL + Q 去某行: CTRL + L PL/SQL:
连接远程数据库,数据库192.168.13.150:1521/orcl 这样填写 添加注释: alt + shift + j 快速定位行: Ctrl + L 当前行和下面一行交互位置 : Alt+↓
快速修复: Ctrl+1 参照选中的Word快速定位到下一个: Ctrl+K 把当前选中的文本全部变为大 /小写:
Ctrl+Shift+X/Y 把Class中的local变量变为field变量: Alt+Shift+F 重构的后悔药(Undo):
Alt+Shift+Z 查找哪些地方调用了某个方 法: CTRL + ALT + H 快速转到接口的实现 : sublime: Ctrl + J 合并多行 Ctrl + alt + J 多行编辑 Ctrl +
Shift + k 删除一行 CTRL + K 删除光标后的一行 ALT + Shift + 2 1 分屏
CTRL + Tab 回到上次浏览窗口 Ctrl + up/dn 上下切换窗口 debug设置匹配源码:
通过debug configuration 配置新建的项目,就能够debug了。


相关知识:
presentation.xml 文件都存储在 MAXPRESENTATION 表中
maximo 中是通过中间表实现的 MAXRELATIONSHIP。
rqreport模块在moximoserver中引用
作业申请:属地单位和人员卡员工部门一样,否则在移动端无法下载作业票
默认时间与默认自动编 号: &SYSDATE& &AUTOKEY&

当前登陆人: &USERNAME&

关联关系的语 法:where子句 orgid=:locationorg and active = :yes 。就是子对象的属性orgid = 主对象的属性locationorg
?&DOMAINFILTER&_:在mbo.getString(attr)中起作用 domainid=‘PERSONSTATUS’ and value=:status and :&DOMAINFILTER&_STATUS 获取状态的描述 STATUSDESC.DESCRIPTION

查看常量:

MboConstants:	
				mbo设置值的时候通过访问修饰符来设值,否则会报错
				READONLY	7L
				mbo类的setXXX方法所用的3个修饰 符:
				NOACCESSCHECK 	2L 不进行只读检查
				NOVALIDATION_AND_NOACTION 	9L 不进行validate方法校验和字段类的检验
				REQUIRED = 128L
				READONLY = 7L
				DELAYVALIDATION 	3L.
				NODELETE = 4L
				NOSAVE = 8L
				NO_RELATEDMBOS_OF_OWNERSCHILDREN_FETCH = 16L
				currentMbo.setValueNull("DHLEVEL", 11L);
  • 应用程序中的签名选项 : = APPBEAN中方法名 只要和签名选项中的名一样,就可以实现自己新的功能
    ELEMENTTYPE:元素类型,表示这个菜单是干嘛的,=MODULE(模型菜单),=App(应用程序),=Header(头描述,即下级菜单,下级菜单的名称要靠HEADERDESCRIPTION列显示),=
    APPTOOL(工具条,名称要靠HEADERDESCRIPTION显示
    类型:您可以链接表列事件和链接。如果您选择的事件,它映射到一个列事件类型,描述和图示。书签和TOGGLEDETAILSTATE是事件例子能够显示详细信息

  • MboValueAdapter:时间前后/数值大小判断
    在maximo中,通常要做2个时间值前后或是2个数据值大小的判断,要把需要判断的绑定的类继承MboValueAdapter类。
    针对于某个字段有时候不能用MAXTableDomain,否则会报错,通过action来执行属性业务

  • MAXTableDomain:选择值类 重要 与lookup属性关 联:

    弹出的表双箭头的那种,lookup属性,在初始化的时候就能过滤页面显示的table。在lookups.xml里面找

    ,对应属性的字段类,继承了MAXTableDomain 通过getlist来过滤相关字段

  • 表域: 表域的作用与字段类相似,这个表域实现的是选择采样机时,弹出来的值是从FUELTB030表里面取值的,相当于
    对象:FUELTB030 列出where子句:1=1 验证where子句:SAMPLEMACHID = :SAMPLEMACHID
    select distinct( FUELTB030.SAMPLEMACHID) from FUELTB030 ,入厂发卡表 where
    入厂发卡表. SAMPLEMACHID = FUELTB030.SAMPLEMACHID
    主要用来在界面查找值然后复制到界面中。像带值返回。

  • Aln域描述的使用(关系配置): 子对象是ALNDOMAIN(aln表名) where子句:VALUE=:RLLX and
    DOMAINID =‘RLLX’ 子属性=:主属性 and 域名=’名称

  • MAXLOOKUPMAP: insert into MAXLOOKUPMAP ( TARGET, LOOKUPATTR,
    TARGETATTR, SOURCEKEY, SEQNUM, ALLOWNULL, MAXLOOKUPMAPID, SOURCE)
    values ( ‘FUELA005’, ‘SYBM’, ‘SYBM’, ‘SYBM’, 1, 1,
    MAXLOOKUPMAPSEQ.nextval, ‘FUELA004’);COMMIT; 这一步很重要,返回弹出哪个字段
    target:目标表(当前应用程序对应的表) FUELA005 source:源表(就是你要从哪个表取出值来) FUELA004
    lookupattr: lookup绑的字段 SYBM targetattr: 目标字段 SYBM sourcekey: 源表单字段
    SYBM

  • mbo和mboset的获得: 一般都是由Mbo调用MboSet,是用getThisMboSet()来得到。
    有MboSet得到Mbo是用getMbo()或getMbo(i)得到。
    或者通过数据库配置关联关系,通过当前mbo的getmboset(“关联名”);获得相应的mbo 通过查询临时关联关系获
    得:mbo.getMboSet("$t"+table, table, whereclase); 如果没有配置关联关系则可使 用:
    MboSetRemote msr =
    MXserver.getMXserver().getMboSet(“对象名”,MXserver.getMXserver().getSystemUserInfo());
    msr.setWhere(“where子句”);
    msr.reset();//通过reset能重新从数据库查询,并且断开其他引用该mboset,mbo的地方,所以在reset之前要把希望保存的内容保存好。

  • MboSetBean: 这个类是用于存放JSP上输入的数据的类,例如页面上的mbosetid="rec"就是指的是这个类。
    显示的值能加html标 签显示富文本: 比如域值的颜色,字体的大小

  • 自定义应用程序按钮配 置:按钮配置比如一键打印报表
    首先在签名选项里配置-在对应APPBEAN中建立同名方法(RQREPORT)- 通过
    WebClientEvent zyfxfxEvent = new WebClientEvent(“JLSHYJDY”,this.app.getId(), newMbo, null, null,
    additionalEventValue,id, clientSession);
    this.clientSession.queueEvent(zyfxfxEvent);
    方法,调用在library.xml中定义的对话框,
    该对话框将调用定义的bean,<table beanclass=“hd.webclient.beans.zyxk.co.appzysq.ReportListDailog”
    表列的mxevent属性对应bean中的方法,执行对应的按钮的方法

  • 移动端页面配置: PDA接口对象配置 :能配置移动端要下载的字段 作业许可-基础配置-作业票PDA基础信息配置(
    需要教实施人员自己配置 ):配置移动端界面
    作业类型及功能点 :
    tab页类型:是由CONTYPE数字域实现的,所以要增加域。
    功能编码:即审批环节点,决定了哪些人员和人员组能够进行审批
    作业票类型:决定在那种票下
    所属作业类型:?是域,几种作业票
    界面配置信 息:
    作业审批权限

  • PDA接口功能类: PadFunction.getList 能够取得下载的值 BussinessAction 能获得
    接口配置-PDA接口对象配置 的字段 通过 MaximoPlatForm
    将UD_SY_PDACOLUMN的值put到BussinessAction的downloadAttrMap中,移动端传递过来json对象。并且会在D:\zyxkapp_logs生成相关的数据文件。

  • 作业审批权限: 作业许可 - 基础配置 - 作业审批权限: ud_zyxk_zyspryjl.dycode =
    ud_zyxk_zyspqx.zylocation
    配置审批环节点信息,在移动端现场审批(作业票审核)等菜单中控制显示审批流程具体如下
    作业类型(作业级别 ):代表要配置的作业票。
    应用界面:在什么界面显示,比如在移动端现场审批功能中显示,或者作业票取消、关闭界面。对应ud_zyxk_zyspryjl.dycode字段
    审批环节:主要用来记录标识环节点。对应ud_zyxk_zyspryjl.spnode
    通过作业审批记录的dycode,spnode,zysqid便能获得审批记录的相关数据。
    人员组:通过配置人员组来实现审批人的权限配置。比如,班长能看见并且审批作业批准。
    是否最终确认人:每一个应用界面必须配置一个最终确认人,否则无法上传作业票。
    是否必须:表示是否必须审核。不配置则可以不填数据不审核。
    审批顺序:就是在移动端审批顺序的排序,比如措施在审批1,那么其他的审批必须在它审批后才能审批。
    显示顺序:就是功能卡片显示的顺序。
    多人刷卡:移动端刷后不只读,可以多次刷。

ORACLE: *1.树形查询,逐层查询 (用来遍历含有父子关系的表结构 ): select distinct deptnum from
UD_SY_DEPT start with DEPTNUM=‘ZZJG’ connect by prior DEPTNUM=PARENT
PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id;就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录
2.外表大,用IN;内表大,用EXISTS :
通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。not
in 不如 not exists 注意not in:not in (’’)空值取不出,不允许有null
3.Oracle中row_number()、rank()、dense_rank() 的区别: --row_number() 顺序排序
1 2 3 4 5 --rank() 跳跃排序,如果有两个第一级别时,接下来是第三级别 1 2 2 4 5
–dense_rank() 连续排序,如果有两个第一级别时,接下来是第二级别 1 2 2 3 4 关于Parttion by:
Parttion by关键字是Oracle中分析性函数的一部分,用于给结果集进行分区。它和聚合函数Group by不同的地方在于它只是将原始数据进行名次排列,能够返回一个分组中的多条记录(记录数不变),而Group
by是对原始数据进行聚合统计,一般只有一条反映统计值的结果(每组返回一条)。 总结:
在使用排名函数的时候需要注意以下三点:
1、排名函数必须有 OVER 子句。
2、排名函数必须有包含 ORDER BY 的 OVER 子句。
3、分组内从1开始排序。 TIPS:
使用rank over()的时候,空值是最大的,如果排序字段为null, 可能造成null字段排在最前面,影响排序结果。
(使用rank()/dense_rank() 时,必须要带order by否则非法) 可以这样: rank over(partition by course order by score desc nulls last)
4.wmsys.wm_concat(column)字符串拼接: select id,wmsys.wm_concat(name) name from idtable group by id;
5.为空替换: nvl(sjstarttime,zystarttime)
6.取上一个值:
–通过partition by关键字进行分组,否则只会有一个null, Lag()就是取当前顺序的上一行记录。 LAG(sp.sptime, 1, NULL) over(PARTITION by sp.ud_zyxk_zysqid order
by sp.ud_zyxk_zysqid, sp.sptime) presptime
7.触发器: CREATE OR REPLACE TRIGGER UD_HSEBZ_PDSQLINE_T BEFORE INSERT OR UPDATE ON UD_HSEBZ_PDSQLINE FOR EACH ROW DECLARE NEXTVAL
INTEGER; BEGIN SELECT MAXSEQ.NEXTVAL INTO NEXTVAL FROM DUAL;
:NEW.ROWSTAMP := NEXTVAL; END;
8.ROUND(数,精度):数的截取 四舍五入函数,精度为正则取小数点后几位,精度为负,则取精度前几位
9.TRUNC (数,精度):TRUNC()函数处理日期 数字截取函数,精度为正则取小数点后几位,精度为负,则取精度前几位,整数部分补0 select trunc(sysdate)
from dual;–2017/2/13,返回当前时间
10.RPAD(‘test’,8,’
’):字符串填充 使用字符串在右边补齐8位
14.TRIM(LEADING|TRAILING|BOTH ‘t’ from ‘test’): 删除首尾指定字符串从目标字符串中
15.ADD_MOUNTHS(DATE,Integer):日期操作 返回在指定日期上加上指定月份的日期
16.LAST_DAY(date): 返回指定日期月份的最后一天的日期 *17.EXTRACT(YEAR from SYSDATE)year,EXTRACT(MONTH from SYSDATE)month,EXTRACT(DAY from
SYSDATE)day:EXTRACT(datetime) 提取指定日期特定的函数
18.SELECT ROUND(SYSDATE,‘dd’) FROM dual;: 四舍五入日期 *19.SELECT TRUNC(SYSDATE,‘mi’) FROM dual;: 将指定时间置为0
20.SELECT CONVERT (‘测试’,‘US7ASCII’,‘ZHS16GBK’) FROM dual;:CONVERT(‘str’,‘目标字符集’,‘原字符集’) 字符集转换函数 *21.SELECT
COALESCE(NULL,9-9,NULL) FROM dual;: 返回列表中第一个不为null的表达式
22.LNNVL(condition): 用于where子句中,取条件的补集包含null;
23.decode(expresstion,case,result【,case,result】): 表达式匹配函数,和单一条件匹配 decode(sign(?-100),1,‘符号为正’,0,‘为0’,-1,‘符号位负’)
24.单行注释 –
25.自定义参数类型: 复合参数-记录类型 DECLARE TYPE customtypename IS RECORD --parameters person%ROWTYPE --引用整行数据类型 (
v_id person.id%TYPE --引用id的类型
v_name varchar2(10) ) ; parameters customtypename; BEGIN
select id,name into parameters from perosn where id=1;–只能设一行记录
26.预定义异常: 查看异常 SELECT * from Dba_Source WHERE NAME=‘STANDARD’ AND TEXT LIKE ‘%EXCEPTION_INIT%’;–USER_SOURCE
27.case语句: case i when i1 then DBMS_OUTPUT.put_line(‘i = 1’); when i2 then DBMS_OUTPUT.put_line(‘i = 2’); else
DBMS_OUTPUT.put_line(‘i != 1,2’); end case; case when i1 then
DBMS_OUTPUT.put_line(‘i = 1’); when i
2 then
DBMS_OUTPUT.put_line(‘i = 2’); else DBMS_OUTPUT.put_line(‘i !=
1,2’); end case;
28. LOOP语句: LOOP:
DECLARE v_i NUMBER() := 1;
BEGIN
DBMS_OUTPUT.put_line('now v_i = ’ || v_i);
LOOP
v_i := v_i + 1;
DBMS_OUTPUT.put_line('now v_i = ’ || v_i);
IF v_i > 4 THEN
EXIT
END IF
END LOOP;
END; WHILE LOOP:
DECLARE v_i NUMBER() := 1;
BEGIN
DBMS_OUTPUT.put_line('now v_i = ’ || v_i);
WHILE v_i > 4
LOOP
v_i := v_i + 1;
DBMS_OUTPUT.put_line(‘now v_i = ’ || v_i);
END LOOP;
END; FOR LOOP:
DECLARE v_i NUMBER() := 1;
BEGIN
DBMS_OUTPUT.put_line(‘now v_i = ’ || v_i);
FOR inx 1…20 [REVERSE] LOOP
v_i := v_i + 1;
DBMS_OUTPUT.put_line(‘now v_i = ’ || v_i);
END LOOP;
END;
29.自定义异常: 查看预定义异常:SELECT * from Dba_Source WHERE NAME=‘STANDARD’ AND TEXT LIKE ‘%EXCEPTION_INIT%’; --数据字典视图 DECLARE my_2291_exp
EXCEPTION; PRAGMA EXCEPTION_INIT(my_2291_exp,-2291);–将异常名和数据库错误号绑定
自定义数据库错误号 在-20999~-20000之间 自定义抛出 IF THEN my_exp; END IF;
EXCEPTION
WHEN my_exp THEN
DBMS_OUTPUT.put_line(’’);
RAISE
30.创建函数: 查看源脚本: SELECT * from User_Source; CREATE OR REPLACE FUNCTION my_func (param_1 IN NUMBER ,param_2 IN NUMBER) RETURN NUMBER
AS BEGIN DECLARE v_mod NUMBER := 10; return (param_1 *
param_2)/v_mod; END IN OUT: CREATE OR REPLACE FUNCTION my_func
(param_1 IN NUMBER ,param_2 IN OUT NUMBER) RETURN NUMBER IS
return_value NUMBER BEGIN param_1 := param_2+param_1; --返回和
select param_1 - param_2 into return_value from dual; return
return_value; END 只有在PL/SQL语句块中才能获得out输出的参数。否则只能获得return的值。
31.显示游标: 单行数据: DECLARE
my_cursor CURSOR
IS SELECT table.id,table.name FROM table;
v_id table.id%TYPE;
v_name table.name%TYPE; BEGIN
open my_cursor;
LOOP
FETCH my_cursor INTO v_id,v_name;
EXIT WHEN my_cursor%NOTFOUND;–遍历结果集
END LOOP END 批量取回: select my_cursor BULK COLLECTION into V_ROWTYPE limit 2;–限制每次取回两条,V_ROWTYPE是%ROWTYPE类型 游标的FOR LOOP:
FOR i_cursor IN my_cursor --i_cursor默认为%ROWTYPE类型
LOOP
DBMS_OUTPUT.put_line(i_cursor.id || i_cursor.name);
END LOOP 游标的属性: %ISOPEN 游标是否打开,打开才能使用 %FOUND/NOTFOUND 是否查询到数据 %ROWCOUNT 取回数据数量 带参数的游标: DECLARE
CURSOR my_cursor (id NUMBER,name varchar2)
IS select * from table where table.id = id and table.name = name; BEGIN
OPEN my_cursor(123,‘name’); 隐式游标: 默认名为SQL
32.创建临时表: create table table_temp as select * from table_source where 1==0 表示创建表结构相同的表,where为true时,复制表类数据,false时只创建相同的表结构
33.创建视图: create or replace force view my_view (
id constraint my_view_prk primarykey rely disable validate,–表示约束对前后的数据都不进行检查
name,
constraint my_view_unq unique (name) rely disable validate–外联方式声明约束 ) as select my_id, my_name from my_table
where id > 0 with check option;–如果创建的视图中带有where等条件,则with check
option 子句可以保证让你只能在视图的条件之内对视图进行DML
34.查看触发器: SELECT * from User_Objects WHERE object_type=‘TRIGGER’; 在行级触发器里使用 :new :old 来访问变更前和变更后的数据 应在before中 修改new的引用数据,after 后修改没有意义
在when限制条件中不需要使用’:'来引用new old
35.在where中使用别名,需要在外套一层select语句,因为别名必选在select后才有效。

xls模板导入处理:
	日常管理 - 模板导入 中选择模板 模板中有插入前处理类,主要在插入前校验用
					继承AbstractInBeforeClassInf:
							导入时执行execute(HashMap attrMap, HashMap dataMap) attrMap 属性的相关信息 dataMap excel行数据,可做过滤验证处理
					xsl模板导入时的模 板:
								public HashMap execute(HashMap attrMap, HashMap dataMap)
										throws RemoteException, MXException {
									MboRemote mainmbo=webClientSession.getCurrentApp().getAppBean().getMbo();//获取主表mbo
									Map<String,String> excelLineAttrsMap = new HashMap<String, String>();//代码中创建模板明细字段,添加模板明细中的字段的属性
									excelLineAttrsMap.put("MAXTYPE", "LONG");//设置UD_HSEBZ_PDSQLINE.ud_hsebz_pdsqid的属性
									excelLineAttrsMap.put("ISINSERT", "1");
									Map<String,String> createbyAttrsMap = new HashMap<String, String>();//添加创建人字段
									createbyAttrsMap.put("MAXTYPE", "STRING");//设置UD_HSEBZ_PDSQLINE.ud_hsebz_pdsqid的属性
									createbyAttrsMap.put("ISINSERT", "1");
									Map<String,String> createdateAttrsMap = new HashMap<String, String>();//添加创建时间
									createdateAttrsMap.put("MAXTYPE", "DATE");//设置UD_HSEBZ_PDSQLINE.ud_hsebz_pdsqid的属性
									createdateAttrsMap.put("ISINSERT", "1");
									attrMap.put("ud_hsebz_pdsqid", excelLineAttrsMap);//在模板明细中添加字段
									attrMap.put("createby", createbyAttrsMap);
									attrMap.put("createdate", createdateAttrsMap);
									Iterator dataIt = dataMap.entrySet().iterator();
									long ud_hsebz_pdsqid = mainmbo.getUniqueIDValue();
									while (dataIt.hasNext()) {
										Entry dataEntry = (Entry) dataIt.next();
										int row = (Integer) dataEntry.getKey();//xls中的行数
										Map valueMap = (Map) dataEntry.getValue();//属性与值的映射
										valueMap.put("ud_hsebz_pdsqid",ud_hsebz_pdsqid);	//为模板明细中的字段添加值
										valueMap.put("createby", webClientSession.getUserInfo().getUserName());//创建人
										valueMap.put("createdate", MXServer.getMXServer().getDate());//创建时间
									}		
									return super.execute(attrMap, dataMap);
								}

上传报告验证:

if (appname.equalsIgnoreCase("APPPDSQ")) {
			MboSetRemote docSet = MXServer.getMXServer().getMboSet("DOCLINKS", MXServer.getMXServer().getSystemUserInfo());
			docSet.setWhere("ownertable='UD_HSEBZ_PDSQ' and ownerid='" + String.valueOf(mainMbo.getInt("UD_HSEBZ_PDSQID"))+ "'");
			if (docSet.getMbo(0) == null) {
				throw new MXApplicationException("commoninfo", "commoninfo", new String[] { "请上传自评报告!" });
			}
		}

tab页是否显示的条件表达 式:

(select count(ud_zyxk_zysqid) from ud_zyxk_zysq where parent_id =:ud_zyxk_zysqid and zypclass='zylx89')>0
		and :zypclass='zylx99'

通过appbean获得界面勾选的数 据:

MboSetRemote pdsqSet=app.getAppBean().getParent().getMboSet();
pdsqSet.getMbo(0).isSelected();//遍历mboset,是否被选中,获得被勾选的数据

  • 常见错误:
    1. ORA-01400: 无法将 NULL 插入 (“MAXIMO”.“ASSET”.“ROWSTAMP”) java.sql.SQLIntegrityConstraintViolationException: ORA-01400: 无法将
      NULL 插入 (“MAXIMO”.“ASSET”.“ROWSTAMP”)
      触发器原因,重新编译后,执行一下(启用) rowstamp 是通过触发器生成 的: TRIGGER “LIAOYANGSH20180621”.BOOKMARK_T BEFORE INSERT OR UPDATE ON
      BOOKMARK FOR EACH ROW DECLARE NEXTVAL INTEGER; BEGIN
      SELECT
      MAXSEQ.NEXTVAL
      INTO
      NEXTVAL
      FROM
      DUAL; :NEW.ROWSTAMP := NEXTVAL; END;

    2. 域只读异常:“Field is read only” 一般是由于与设置了只读,但是其他方法修改域该的时候,没有添加访问修饰符 无效数据类型异 常: “Invalid Data Type” 一般是由于设置的数据类型不匹配,比如设置字符串到YORN类型

    3. 作业类型和作业等级的问题 : * 没有勾选动火作业,那么动火等级下拉框为空,非必填,且只读,勾选后动火作业为必填,且可读
      * 同理适用于高处作业和受限作业
      * 当域为只读时必须通过访问修饰符改变只读检查才能设值为null,否则将会报域只读的异常 访问修饰符为11L

    4. ORA-00001: 违反唯一约束条件 (LIAOYANGSH20180621.UD_CBSGL_KHBZ_NDX1): 是测试环境倒库的时候主键序列和数据库不同。 创建序列:CREATE SEQUENCE
      “LIAOYANGSH20180621”.“UD_CBSGL_KHBZIDSEQ” MINVALUE 1 MAXVALUE
      999999999999999999999999999 INCREMENT BY 1 START WITH 561 CACHE 20
      NOORDER NOCYCLE maximo表的主键由序列生成
      ORA-12899:说明超过了数据库定义的字段长度,检查字符编码,中英文 : select
      userenv(‘language’) from dual;
      设置nls_length_semantics参数为char,避免多字节或Unicode字符集造成的问题。比如汉字占用3个字节,数据库字符长度设置为100,设置为byte最多可以输入33个汉字或者100个英文字符,而设置为char最多可以输入100个汉字或100个英文字符:
      show parameter nls_length; show parameter nls_length_semantics;
      alter session set nls_length_semantics=‘CHAR’; 修改会话,临时 alter
      system set nls_length_semantics=‘CHAR’ scope=spfile; 修改系统,永久
      修改表结构来满足数据库长度不够的问题 : alter table UD_XFGL_AJEQ modify ajname
      VARCHAR2(50 CHAR); 主键冲突: 可能是对应的主键ID触发器,失效或过小,查找后调大。

    5. 单位,属地,作业区域有级联关系 :locations.SSDW = ud_zyxk_zysq.sddept

    6. 书签插入报 错:因为UD_ZYXK_JSA表中的主键UD_ZYXK_JSAID未选择主列,无法查找到primarykey,导致treeset取不到值。
      solution: 通过修改数据库 MAXATTRIBUTE和MAXATTRIBUTECFG 语句:INSERT INTO
      table_name (列1, 列2,…) VALUES (值1, 值2,…)
      UPDATE MAXATTRIBUTECFG t set t.PRIMARYKEYCOLSEQ = 1 WHERE t.OBJECTNAME = ‘UD_ZYXK_JSA’ and t.ATTRIBUTENAME = ‘UD_ZYXK_JSAID’;

    7. 字段类不生 效: 将数据库配置中,该字段的域删除,否则会取数据库的值 setRelationship:数据库属性 根据已有的值来判断

    8. BMXAA4190E,XXX不在值列表中: 造成域的多选框不能多选 在xml中配置了域,就不能在数据库配置中配置域,因为数据库中配置的域只能单选。

    9. 安全组不生效: 配置安全组以后要重启服务器,因为安全组要常常被查询,所以放在了缓存中。

    10. jndi查找不到数据源: 通常是由于weblogic数据源配错,或者数据源失效了,尝试换一个数据源

    11. 连接以前的数据库时,出现无效的用户名和密 码:可能是因为测试正在改库

    12. 润乾的报表路 径:SELECT * FROM synonymdomain t WHERE t.domainid=‘RQURL’

    13. 修改xml时:一定要从现场拿xml,因为现场xml和公司测试xml可能出入很大

    14. 润乾报表卡死问 题:可能因为报表中有未知连接导致,断网即可

    15. ORA-00942: 表或视图不存 在: 检查下是否是由于sql语句在表名前加了用户名导致的。不同环境用户名可能不同。

    16. 没有日志的不得已解决方 法:禁用日志文件,SELECT * FROM maxpropvalue t WHERE t.propname=‘mxe.logging.disableLoggingPropFile’ 设置值为1.重启服务。 update
      maxpropvalue set propvalue = 1 where
      propname=‘mxe.logging.disableLoggingPropFile’

    17. BMXAA6454E:如果数据处于配置状态,则中间件将无法连接数据库,不能启动系统。通过下面的语句 : select * from MAXVARS where varname=‘CONFIGURING’ for update
      修改VARVALUE字段的值为0。

    18. 润乾报表打印: XXX.raq打印调用XXX_PRINT.raq 报表打印与显示不同,可能是报表数据类型没有正确设置,拥有标签的可能需要设置为富文本。

    19. 吊装作业排序的问 题: 改一下xml, orderby=“PRECAUTIONID” 改成 orderby=“UD_ZYXK_ZYSQ2PRECAUTIONID”

    20. 逻辑删除标识:

    21. 同义词域描述: 列表:<tablecol dataattribute="SYNONYMDOMAIN.DESCRIPTION" id="1338515361125" inputmode="readonly" label="状态" width="40" />
      卡片:<textbox dataattribute="SYNONYMDOMAIN.DESCRIPTION" hddisplayattribute="UDZYSQSTATUS.DESCRIPTION" id="maintab_attrw6666" inputmode="readonly" label="状态" size="16" width="50" />

    22. 兰州石化隐患等级调用短信接口阻 塞: 因为远程方法调用阻塞 SendSmsWSClient.send

    23. 庆阳石化JSA在作业申请中查找不 到: JSA 查找语句: 提交过的并且属地部门相同,过滤掉作业预约中使用过的JSA和作业申请中除本作业使用过的JSA编号

      SELECT * from ud_zyxk_jsa WHERE status=‘APPR’ and (JOBDEPT=‘QYBM’ or JOBDEPT is null) and not exists (select fxnum from ud_zyxk_zyyy
      where jsanum=fxnum and zyyynum!=’ ') and not exists (select jsaname
      from ud_zyxk_zysq where jsanum=jsaname and zypclass=‘zylx99’ and
      ud_zyxk_zysqid!=24407) AND JSANUM = ‘JSA2790’; 验证JSA编码是否被使用过的语句 :
      select jsaname,ud_zyxk_zysq.* from ud_zyxk_zysq,ud_zyxk_jsa where
      jsanum=jsaname and zypclass=‘zylx99’ and ud_zyxk_zysqid!=24407 AND
      JSANUM = ‘JSA2884’; 通过修改 系统配置-字段编码规则定义 增大JSA编码,防止JSA编码被使用
      23.mbo或者mboset只读,请检查业务规则 : 说明设值的访问修饰符,可能没有进行NOACCESSCHECK 2L 忽略只读检查,所以需要在设值字段加上11L
      24.如果是因为复制赋值时,没有触发字段类进行校验业务规则导致的问题 : 可以尝试改变setValue时的访问修饰符,将11L改为2L 因为9L不会触发字段类的动作和mbo的检查方法

----------------------------------------------------------------------------------------------------------------------------------------------------------7.18
关键表:
应用程序菜单 (高级搜索等) MAXMENU
应用程序签名选项 SIGOPTION
系统属性 MAXPROP
部门 UD_SY_DEPT
数据库配置中的对象卡片 MAXOBJECTCFG
数据库配置中的属性卡片 MAXATTRIBUTECFG
记录表属性包括虚拟表 MAXATTRIBUTE
位置定义表 LOCATIONS
用于查询的多键外键属性映射 MAXLOOKUPMAP
PDA接口配置表 UD_SY_PDACOLUMN 配置移动端端需要下载的列,进行业务处理
字段编码规则定义 UD_SYS_CODERULE UD_SYS_CODERULELINE 自动编码到表的某些字段
关系表配置 sys_relation_info 给移动端使用,方便移动端进行业务处理。
---------------------------------------------------------------------------------------------------------------7.19
weblogic的环境设置:在server/common/bin 中。
user_project/domains/base_domain/bin中也有。
在setDomainEnv.cmd中修改内存设置
测试环境设置DEBUG_PORT=17001,搜索if “%debugFlag%”=="true"前加一行,set debugFlag=true
maximo加载:
MAXIMOStartupServlet的主要功能是读取MAXIMO的配置文件maximo.properties,并将其以Properties对象的形式传递给MXServer的start方法。MAXIMOStartupServlet调用MXServer.start(properties)主要是建立MXServer的实例,并初始化与其相关的信息。
设置eclipse的jvm大小:
在安装目录的eclipse.ini中将Mms和Mmx改大
工作流开发:
1、需要工作流的对象必须继承StatefulMbo,实现StatefulMboRemote接口,重写getStatusHandler、getStatusHistory、getStatusListName
2、主表增加STATUS(关联增加的同义词域)和STATUSDATE字段
3、增加状态句柄类 ***StatusHandler,重写changeStatus()方法
4、涉及到工作流,必须要有 表:
主表名+STATUS,***StatusMboSet,***StatusMbo,正常继承Mbo和MboSet
主表名+CSTATUS(可选)
5、新建工作流,之后在选择操作中依次点击验证、启用、激活、添加至应用程序、添加启动工作流按钮,重启之后就能正常显示工作流按钮了
---------------------------------------------------------------------------------------------------------------7.20

DBvisualizer取消用户名补全: 打开数据库连接属性,选择properties,点击qualifiers,取消auto completion/query builder
查看项目数据库和地址配 置:在weblogic的domains中看项目中的config文件夹和jdbc文件夹。
source key

  • Fld类
    :action()和vaildate()方法在查找带值返回后根据业务逻辑的需要进行后续动作。其中validate方法在点击带值返回时执行而action方法在记录保存时执行。
    action 记录保存时执行 validate 带值返回时执行;数据校验,一般在光标离开此字段的输入框时校验。
    init 初始化字段时触发 获得应用名 String appName =
    getMboValue().getMbo().getThisMboSet().getApp(); 设置关系
    setRelationship(“ALNDOMAIN”," value=:dhdj"); 设置赋值关系
    setLookupKeyMapInOrder(new String[]{“dhdj”},new String[]{“value”});
    当前mbo MboRemote currentMbo = getMboValue().getMbo();
    来实现选择值的时候,弹出的数据过滤功能 getList() 通过过滤条件返回mboset
    getMboValue().getMbo().getMboSet("$QHREmployee",
    “QHREmployee”,“DeletedFlag=0”); 通过关联名获得mbo
    currentMbo.getMboSet(“RISKGRADEMAPPING”);//参数为变量名
    两种通过关联mbo获得属性的方法 String riskGrade =
    mappingMbo.getString(“DESCRIPTION”);//直接获得
    MboData riskGradeMD = mappingMbo.getMboData(new String[] { “DESCRIPTION” });//通过MboData获得
    riskGrade = riskGradeMD.getMboValueData(“DESCRIPTION”).getData();

  • AppBean:AppBean用于实现MAXIMO中应用程序的界面操作控制,如界面的新建、保存、发送工作流等。
    initializeApp 应用程序初始化 SAVE 界面的保存事件 getMboSet 得到当前的MboSet
    getMbo 得到当前的Mbo save
    APPBEAN的save方法将会调用mbo的save方法,并且如果mbo没有修改过那么将不会进行校验,可以通过主mbo拿到关联的子mbo。
    获得子表的mbo app.getDataBean().getMbo()

  • DateBean:DataBean用于实现MAXIMO中特定数据源的界面操作控制,如弹出窗口中按钮的事件等 initializeApp
    数据源的初始化 getMboSet 得到当前的MboSet getMbo 得到当前的Mbo XXX
    对应按钮的事件 通过appbean获得mbo的某个属性值DLYS1717(该属性在数据库配置中定义,如果是关联属性则加.)
    app.getDataBean().getMbo().getString(“SDDEPT”)
    通过datebean的app获得应用名appzysq String appName = app.getId()
    获取主表的标示ID String ID = this.parent.getString(“CONTRACTNUM”);
    获取所需的子表数据源 DataBean databean =
    this.app.getDataBean(“new_table”); 获得关联字段的属性 名: String[]
    sRelation = attribute.split("\."); if (sRelation.length == 2) {
    MboValueInfo valueInfo = getMbo(0)
    .getMboSet(sRelation[0]).getMboSetInfo()
    .getMboValueInfo(sRelation[1]);
    if (valueInfo != null)
    sbErr.append(valueInfo.getTitle()).append(","); } 对话框中的应用: getMboSetRemote() 该方法取得指定的mboset数据 selectrecord()
    该方法在对话框中选择了某个值后调用,可以用来实现界面赋值功能
    app.getAppBean().getMbo();//获得主表mbo
    //获得当前子表mbo
    int currentRow = this.getCurrentRow();
    MboRemote currentMbo = this.getMbo(currentRow);
    //获得其他子表的databean
    DataBean resultDataBean = this.app.getDataBean(“beanID”)
    //刷新APP下其他部分的databean
    resultDataBean.refreshTable();
    // 刷新整个界面
    app.getAppBean().fireDataChangedEvent();
    app.getAppBean().fireStructureChangedEvent();

  • Mbo类: 获得主表字段 getOwner.getString(“XXX”) 获得关联mbo
    MboSetRemote gclrmxMsr = this.getMboSet(“BAQXW”);
    获得主表mbo实现关联 getOwner 新建触发add方法 在add中,实现主子表关联

  • MXServer: 获得指定MboSetRemote,返回给调用者
    MXServer.getMXServer().getMboSet(“UD_SY_DEPT”,
    MXServer.getMXServer().getSystemUserInfo()) 获得数据库时间
    MXServer.getMXServer().getDate()

  • MboSet: 设置where子句,reset或取回一个数据后生效 deptMsr.setWhere(“DEPTNUM=’” +
    ssdw + “’”) 获取第一个记录的某个属性
    deptMsr.getMbo(0).getString(“LOCATIONS”)

  • MAXTableDomain: public class FldLeaderNo extends MAXTableDomain
    {
    public FldLeaderNo(MboValue mbovalue)throws MXException, RemoteException
    {
    super(mbovalue);//这里写关系,要选择的表的名字,前面的字段选择的表中的字段,后面为当前表中的字段。
    setRelationship(“QHREmployee”, “EMPLOYEEID=:LeaderNo”);//查询子表
    setLookupKeyMapInOrder(new String[] {//这里实现子表对主表的赋值功能,
    “LeaderNo”,“LEADERNAME”//当前表中的字段
    }, new String[] {
    “EMPLOYEEID”,“EMPLOYEENAME”//要选择的表中的字段
    });//该方法在点击弹出的table数据时自动将子表的值赋值到主表
    }
    // getList()方法用来实现选择值的时候,弹出的数据过滤功能
    public MboSetRemote getList() throws MXException, RemoteException
    {
    //表名,过滤条件的关系 临时表名 数据库表名 条件
    return getMboValue().getMbo().getMboSet("$QHREmployee", “QHREmployee”,“DeletedFlag=0”);
    }
    //action()方法用来实现选择值得时候的其他操作
    public void action() throws MXException, RemoteException
    {
    super.action();
    }
    //validate()用来实现带值返回的时候数据检查操作
    public void validate() throws MXException, RemoteException
    {
    super.validate(); }}

  • MboValueAdapter:
    在maximo中,通常要做2个时间值前后或是2个数据值大小的判断,要把需要判断的绑定的类继承MboValueAdapter类。
    public class FldTimeEndDate extends MboValueAdapter { public
    FldTimeEndDate(MboValue arg0)throws MXException { super(arg0);
    } 在validate()方法中实现数据的判断功能 : public void validate()throws
    MXException, RemoteException { MboValue EndDate =
    getMboValue(“ENDTIME”); MboValue StartDate =
    getMboValue(“BEGINTIME”); if(EndDate.isNull() ||
    StartDate.isNull()) return; Date ENDDATE = EndDate.getDate();
    Date STARTDATE = StartDate.getDate();
    if(STARTDATE.after(ENDDATE)) throw new
    MXApplicationException(“contract”, “endDateBeforeToday”); else
    return; } }

  • TreeControlBean: #initialize方法初始化时调用
    selectrecord()点击树形子节点时触发,可以调用updateOriginatingRecord()方法(该方法为自定义方法)来更新右表的值
    selectnode() 选择拥有子节点的节点时触发,通常会调用getChildren()方法 getChildren()
    该方法主要用来控制树形显示哪些部门 getTop() 该方法在弹出树形对话框初始化时调用,能控制根节点,比如只显示承包商下的部门。

  • 项目编码:
    UdContainers.XMBM_DGSH.equalsIgnoreCase(UdVersionControl.CheckVC())
    通过项目编码来区别个性化的业务

  • 应用程序编码: appname的获取: 在mbo中: String appname =
    this.getThisMboSet().getApp(); 在databean中:app.getId()
    在mboset中:getApp() zylx01,zylx02,zylx03,zylx04,zylx05,zylx06,zylx07
    MAXTableDomain:String appName =
    getMboValue().getMbo().getThisMboSet().getApp();

  • 输出日志: FixedLoggers.MAXIMOLOGGER.info(info);

----------------------------------------------------------------------------------------------------------------

出更改数据库字段的包时需要注  意:
	更改字段类型时,如果原来数据库有数据则有可能会更改数据库失败(比如数据类型转化失败),这时数据库里的物理表没有改变,maximo的maxattributecfg和maxattribute已经改变。	
		导致配置数据库失败,但是在应用层面却看不出来。
		处理方法:该脚本中失败的sql语句都必须要重新执行,并且处理出错的数据,假如新加了字段maximo中有显示,物理表中却没有,这时可以在maximo中删除该字段,然后重新执行脚本,让物理表字段重新生成。
易犯错误:
	1.xml导入null标识重复
		检查下是否是自己写的标签没有加上id属性
兰州石化APP统计分析配置 : 
	首先需要在关系表中设置为启用,然后再在app统计分析中设置相关条件

  • 工作经历:
    1.部门维护表的对应表是ud_sy_dept,其中执行删除操作时调用 DeptMbo.delete() 其中需要逻辑删除DR和是否使用ISUSEFUL setValue(“ISUSEFUL”, 0);其实显示问题由databean引起。
    2.maxtabledomain过滤弹出的对话框dialog table。
    3.润乾报表易错 点:select(值,排序,过滤条件)select1(值,过滤条件)使用str将select查的值变为字符串。
    3.作业类型,作业等级,需要和原来保持一致,如果有,用原来的不能自定义添加,否则会影响到许多其他的相关业务。
    4.报表审批人员记录取不到值,可能是由于环节点没有配置,或者更改过。
    5.不知道某个域的域名可以通过域的值反查域。比如 select * from alndomain where value = ‘PGTYPE009’ 查到审批权限的应用界面是LSZYRYFQYL域
    6.吉林石化部门中以JH开头的部门一般是内部单位。以数字编码的一般为承包商。
    7.导入导出功能可以看看 :hd.webclient.beans.zyxk.co.appjsa.InBeforeManager。和Excel模板功能
    开发HSE标准 主子表关联和导入导出功能 :
    1.首先通过数据库配置建表,一般的数据库属性不需要建立必填选项,选择好合适的查询方式,创建好的表会自动加入某些字段,最好不要删除。配置好索引和关联。
    2.出数据库升级包的时候,注意出包工具的bug,首次创建时maxsequence中会有update语句,删除该语句,因为它使用了还未创建的表(项目上升级时没有),有该表后不用删除。
    3.配置Excel模板,明细表表示Excel模板中列,选择好相关属性,至少一个必填,选择插入,同时支持字典的转换。 该模板配置好后,导入模板时将会自动插入到数据库,可以通过插入前处理类进行业务处理。其中execute方法中,attrData表示明细表的属性,可以通过在代码中注入的方式,注入主子表关联字段
    然后在dateMap中为新加入的属性赋值。参考hd.webclient.beans.zyxk.co.appjsa.InBeforeManager。
    webClientSession.getCurrentApp().getAppBean().getMbo();//获取主表mbo
    4.出Excel模板表时,注意数据库脚本主子表中主键XXXidseq会被补丁工具改为XXXseq,应该手动加上。公司自己家的表都有这个问题,请注意。
    5.在xml中加上的模板导入的dialog的id名对应触发执行的databean方法名。可以通过该方法来判断是否主表保存了,什么状态才能导入。添加的按钮mxeven值对应模板导入的dialog的id。
    因为如果主表没有保存,那么直接导入的话,数据库中子表有主表的id,而主表却没有。
    6.导入的流程其实就是,主表保存后,确保子表有正确的主表id,然后导入就没有问题,主表在导入后自动刷新,通过xml,和主表的关联,找到子表显示出来
    8.进行更改数据库操作时考虑历史数据问题,比如数据类型能不能正常转换 *9.关于save方法不校验子类必填的问题 : 在主表的appbean中,调用save方法,如果主表mbo没有修改,那么便不会进入主表mbo的save方法,所以要将主表mbo通过代码强制设置为modified,然后才会进入主表的mbo的save方法,
    然后在主表的mbo中,通过关联关系getMboSet获得子表的mbo,然后根据业务实际情况将子表mbo设置为modified,那么maximo便会自动去验证子表mbo的填写情况。
    10.创建虚拟的状态表时,级别为SYSTEM,固定和添加Rowstamp不用√
    11.兰州石化隐患等级调用短信接口阻塞 SendSmsWSClient.send

报表问题:

		person.department_desc
		UD_TZZY_PERSON.DESCRIPTION
		ud_zyxk_zyspryjl.person
		UD_ZYXK_ZYSQ.PZRSHTIME
	二级动火:
		ORA-00918列未明确定义: UD_TZZY_PERSON.ZSNUM person.ZSNUM 
		UD_ZYXK_DHZY.ZYPE
	高处作业:
		UD_ZYXK_GCZY.isfjyfa
	管线装备:
		UD_ZYXK_GXASSET.JZ
		UD_ZYXK_GXASSET.ZYBW
		UD_ZYXK_GXASSET.ISFSYT
		UD_ZYXK_GXASSET.ISFGXAQGZFA
		UD_ZYXK_GXASSET.TASKPE
	临时用电:
		ORA-00918列未明确定义: ud_zyxk_zyspryjl.CHANGEDATE
		UD_ZYXK_ZYSQ.GBTYPE
		UD_ZYXK_ZYSPRYJL.DYCODE
		UD_ZYXK_ZYSPRYJL.CHANGEDATE
		UD_ZYXK_ZYSPRYJL.dycode
		UD_ZYXK_YDASSET.fh
		UD_ZYXK_LSYDZY.GZDY
		UD_ZYXK_LSYDZY.DYJRD
		UD_ZYXK_LSYDZY.LSYDYT
	受限空间:
		UD_ZYXK_SXKJ.SCGYBCCS
		UD_ZYXK_SXKJ.SGZYFXBCCS
		UD_ZYXK_SXKJ.ZYTYPE
		UD_ZYXK_SXKJ.JYPLAN
	特殊动火:
		ORA-00918列未明确定义: UD_TZZY_PERSON.ZSNUM person.ZSNUM 
		UD_ZYXK_ZYSQ.cx
		UD_TZZY_PERSON.DESCRIPTION
	挖掘作业:
		UD_ZYXK_WJZY.DXPBCS
		UD_ZYXK_WJZY.qtcs,
		UD_ZYXK_WJZY.bqdys
	一级动火:
		ORA-00918列未明确定义: UD_TZZY_PERSON.ZSNUM person.ZSNUM 
		ud_zyxk_zyspryjl.type
		UD_ZYXK_DHZY.ZYPE
	作业许可:
	临时用电许可证:移动端
		ORA-00918列未明确定义: ud_zyxk_zyspryjl.CHANGEDATE
		ud_zyxk_zyspryjl.dycode
		ud_zyxk_zyspryjl.type
		UD_ZYXK_YDASSET.fh
		UD_ZYXK_LSYDZY.GZDY
		UD_ZYXK_LSYDZY.DYJRD
抚顺报表:
	动火作业:
		ORA-00918列未明确定义: UD_ZYXK_ZYSQ.ZYAREA    UD_ZYXK_RYK.ZYAREA	
庆阳报表:
	QYSH_ZYXKZ 将 ZDYX2 JCQGYJZ    ZDYX3  JCQWD 	ZDYX4  JCQYL
				  ZDYX9 JCHGYJZ	   ZDYX10 JCHWD 	ZDYX11 JCHYL 替换
交接班:
		动火,受限,高处,管线,堵漏 作业人:会签 PGTYPE009 ZYPERSON
		PGTYPE502 交接班功能的监护人变更 ZYDWJHPERSON 作业单位监护人#变更后作业单位监护人
		PGTYPE502 交接班功能的监护人变更 SDDWJHPERSON 属地单位监护人#变更后属地单位监护人
		PGTYPE501 交接班功能的作业人变更 ZYPERSON 动火作业作业人#变更后作业人
		动火:
		更改了数据集,增加了审批记录dycode字段
		ud_zyxk_zyspryjl.dycode
		="用火所在单位人员(签字):"+ds1.select1(PERSON_DESC,SPNODE=="SDDWJHPERSON")
		="用火所在单位人员(签字):"+ds1.select1(PERSON_DESC,SPNODE=="SDDWJHPERSON" and dycode=="PGTYPE009") + if(ds1.select1(PERSON_DESC,SPNODE=="SDDWJHPERSON" and dycode=="PGTYPE502") != null,"、"+ds1.select1(PERSON_DESC,SPNODE=="SDDWJHPERSON" and dycode=="PGTYPE502"))
		="用火作业单位人员(签字):"+ds1.select1(PERSON_DESC,SPNODE=="ZYDWJHPERSON" and dycode=="PGTYPE009") + if(ds1.select1(PERSON_DESC,SPNODE=="ZYDWJHPERSON" and dycode=="PGTYPE502") != null,"、"+ds1.select1(PERSON_DESC,SPNODE=="ZYDWJHPERSON" and dycode=="PGTYPE502"))
		="签字:"+ds1.select1(PERSON_DESC,SPNODE=="ZYPERSON" and dycode=="PGTYPE009") + if(ds1.select1(PERSON_DESC,SPNODE=="ZYPERSON" and dycode=="PGTYPE501") != null,"、"+ds1.select1(PERSON_DESC,SPNODE=="ZYPERSON" and dycode=="PGTYPE501"))
作业中断:
	动火和受限
	数据集 动火ds8,受限ds5修改为 
		SELECT dense_rank()  over ( order by to_char(jl.createdate,'yyyy-MM-dd HH24:mi')) as seqnum, 
		PERSON_DESC,sptime,spnode
		from UD_ZYXK_ZYSQ sq
		left join ud_zyxk_zyspryjl jl
		    on jl.ud_zyxk_zysqid = sq.ud_zyxk_zysqid
		where spnode in ('PAUSEZYDWJHR','PAUSESDDWJHR') and sq.ud_zyxk_zysqid = ?
  • 表关系: ud_cbsgl_ryhm.rynum =
    ud_cbsgl_ryline.ud_cbsgl_rylineid//人员明细,人员黑名单 person.personid =
    ud_cbsgl_ryline.cbsryid//人员,人员明细 ud_cbsgl_cbsdj.cbsdjnum =
    ud_sy_dept.deptnum//部门,承包商登记 ud_cbsgl_cbsdj.cbsdjnum =
    person.department//人员,承包商登记 ud_zyxk_zysq.ud_zyxk_zysqid =
    ud_zyxk_zyspryjl.ud_zyxk_zysqid ud_zyxk_zysq.parent_id =
    ud_zyxk_zysq.ud_zyxk_zysqid //实现小票和大票的关联
    ud_zyxk_zyspryjl.ud_zyxk_zysqid = ud_zyxk_zysq.ud_zyxk_zysqid *
    ud_zyxk_zyspryjl.dycode //内容为作业审批界面的编号 ud_cbsgl_ry.cbsdjnum =
    ud_cbsgl_cbsdj.cbsdjnum 气体检测分组:(通过ud_zyxk_qtjcid分组) SELECT
    dense_rank() over ( order by jc.ud_zyxk_qtjcid) as seqnum,jctime,
    JCLOCATION_DESC, jcperson_desc, li.qtvalue, jl.spnode,
    jl.person_desc, substr(li.qttype,1,10) as qttype,
    al.DESCRIPTION,jc.ud_zyxk_qtjcid FROM ud_zyxk_qtjc jc left join
    UD_ZYXK_QTJCLINE li on jc.ud_zyxk_qtjcid=li.ud_zyxk_qtjcid left
    join ALNDOMAIN al on li.qttype=al.valueid left join
    ud_zyxk_zyspryjl jl on jl.tableid=jc.padprimarykey where
    (li.qttype like ‘UDQTTYPE01%’ or li.qttype like ‘UDQTTYPE02%’
    or li.qttype like ‘UDQTTYPE03%’) and jc.ud_zyxk_zysqid=1315054
    两种气体检测配置: select * from SYS_RELATION_INFO where SYS_ID =‘1043’
    =if(ds8.isqy1,ds3.select1(qtsvalue,seqnum6 &&
    qttype==“UDQTTYPE03”),ds3.select1(qtvalue,seqnum6 &&
    qttype
    "UDQTTYPE03"))

方框的√ ×:

  • if(ds5.select1(ISSELECT,GRFHZBNUM==“zyp01”)>0,atrue,ds5.select1(ISSELECT,GRFHZBNUM==“zyp01”)0,afalse,anull)+"安全眼镜
    " 常用报表表达式:
    =if(ds1.select1(zylevel,zylevel
    ’MBCD01’)“MBCD01”,“√”,“×”)
    =if(pos(ds1.select1(MBCDDZ),“install”)>=0,“√”,“×”)
    =if(ds1.select1(ISAQFA)1,"需要 "+“√” + " 不需要 "+“×”,"需要 "+“×” + " 不需要
    "+“√”) =if(ds1.select1(sptime,spnode
    "ZYPERSON")null," 年 月 日
    时 ",str(ds1.select1(sptime,spnode
    "ZYPERSON"),“yyyy年MM月dd日HH时”))
    =“检测数据:”+if(ds2.select1(qtvalue,seqnum
    1 &&
    qttype==“UDQTTYPE01”)!=null,“氧气 “+ds2.select1(qtvalue,seqnum1 &&
    qttype
    "UDQTTYPE01”)+” “)+if(ds2.select1(qtvalue,seqnum1 &&
    qttype
    "UDQTTYPE02”)!=null,“可燃气 “+ds2.select1(qtvalue,seqnum1 &&
    qttype
    "UDQTTYPE02”)+” “)+if(ds2.select1(qtvalue,seqnum1 &&
    qttype
    "UDQTTYPE03”)!=null,“有毒气 “+ds2.select1(qtvalue,seqnum1 &&
    qttype
    "UDQTTYPE03”))
    =“确认人:”+ds2.select1(PERSON_DESC,SPNODE==“QRPERSON”&&seqnum1)
    =“第一次:延期有效期:从”+if(ds3.select1(YQSTARTTIME,SEQNUM
    1)null," 年 月
    日 时
    分",str(ds3.select1(YQSTARTTIME,SEQNUM
    1),“yyyy年MM月dd日HH时mm分”))+” 到
    “+if(ds3.select1(YQENDTIME,SEQNUM1)null," 年 月 日 时 分
    ",str(ds3.select1(YQENDTIME,SEQNUM
    1),“yyyy年MM月dd日HH时mm分”))
    =“作业批准人:”+ds3.select1(PERSON_DESC,SPNODE
    "YQPZPERSON”&&seqnum2)+if(ds3.select1(sptime,spnode"YQPZPERSON"&&seqnum2)null,"
    年 月 日 时
    ",str(ds3.select1(sptime,spnode
    "YQPZPERSON"&&seqnum
    2),“yyyy年MM月dd日HH时”))
    报表的pic函数: maximo\rqReport\WEB-INF\classes

SELECT * from MAXRELATIONSHIP WHERE MAXRELATIONSHIP.PARENT = ‘MAXDOMAIN’ ;//关系表
SELECT * from MAXDOMAIN WHERE domainid in (‘RISKGRADE’,‘RISKGRADELINE’);//主表
SELECT * from ALNDOMAIN WHERE domainid in (‘RISKGRADE’,‘RISKGRADELINE’);//子表
SELECT * from MAXLOOKUPMAP WHERE source = ‘ALNDOMAIN’ ;//对象属性关系映射表
---------------------------------------------------------------------------------------------------------------系统性能的最佳实践阅读笔 记:

  • JVM调优: Initial: 4096m / Maximum: 4096m 最大最小堆大小 开启verbose GC
    分析堆内存的使用,最小化GC时间 native_stderr.log 能用来分析堆内存的使用 虚拟机参数:
    1:sun.rmi.dgc.ackTimeout: - Dsun.rmi.dgc.ackTimeout=10000
    设置rmi对象的引用时间 JVM堆内存大小影响GC的时间,太大垃圾回收找对象的时间会变长 2:-Xdisableexplicitgc
    关闭显示GC调用 System.gc() 3:-Xgcpolicy:gencon 垃圾回收规则 通过常常对新生代进行收集,无需回收整个堆
    25% of maximum heap size: -Xmn1024m 新生代推荐为最大堆的25% 线程池调优: 在服务器控制台调整
    开启重用线程,避免为新请求创建新线程的开销。当请求通过HTTP进入时使用WebContainer线程池。 HTTP服务器调优:
    TimeOut Value: 900 等待某事件的请求失败时间 KeepAliveTimeOut High Network
    Bandwidth: 10 Low Network Bandwidth: 60 设置服务器等待持久连接上的后续请求的时间
    MaxKeepAliveRequests指令设置持久连接上允许的请求数。 将此值设置为零可以允许无限制的请求。
    MaxRequestsPerChild指令设置单个子服务器在其生命周期内处理的请求数的限制。 达到此限制后,子进程将终止。
    将此值设置为零可确保进程永不过期。 ThreadLimit指令设置每个子进程的可配置线程数的上限。Value for Windows
    environments: 2400 ThreadsPerChild指令设置每个子进程创建的线程数。
    在只有一个子进程的Windows环境中,必须将此值设置为足够高的值以处理服务器的整个负载。 在UNIX /
    Linux环境中,线程和进程的分配方式与Windows不同。 通常不会将ThreadLimit设置为如此高的值。
    可以将ThreadsPerChild和ThreadLimit指令设置为相同的值。 ORACLE:
    当数据库字符集是双字节或Unicode字符集时,将NLS_LENGTH_SEMANTICS参数设置为CHAR。 索引 表空间
    对所有序列使用高速缓存大小50,maxseq序列除外,该序列用于行标记。 此序列的大小为500。 查询: 列表面板查询
    最好不要使用orderby子句 可以通过检查慢速运行的SELECT语句的报告,识别常用的列。然后可以索引这些列以提高系统性能。
    定期查看这些已保存的查询在QUERY的表中,优化语句以及未编制索引的列的使用情况,并删除order by子句 为用户定义默认查询
    同义词查询,多个join查询影响数据库性能,减少join 为列表中要查询的列编制索引
    重置DATETIME数据类型,数据类型为DATETIME的字段时,生成的数据库查询将使用WHERE子句中的TO_TIMESTAMP。更改常规查询的DATETIME的数据类型字段为数据类型DATE。
    数据类型为DATE的字段在WHERE中使用TO_DATE 条款。 搜索类型为WILDCARD的ALN类型字段在查询中使用UPPER函数;
    因此不使用索引。适当使用upper型的域
    在WILDCARD搜索中,数据库引擎无法使用索引。可以将WILDCARD的默认搜索类型更改为TEXT或EXACT,
    TEXT和EXACT搜索可以使用索引。 当不需要单词搜索时,可以指定搜索类型为EXACT
    在需要进行单词搜索的描述字段上指定TEXT的搜索类型。在具有大量行(例如,数万行)的表的描述字段上使用TEXT。
    无论索引如何,通常都会完全扫描少于2000或3000条记录的表。 读取整个表的I / O开销小于索引查找的平均I /
    O开销加上表查找的开销。
    执行此类扫描时,SEARCHTYPE值对数据库行为没有影响。可以在行数相对较少(例如2,000或更少)的表的描述字段中使用WILDCARD的默认搜索类型。
    通配符搜索为最终用户提供了更大的灵活性。 行数相对较少的表没有明显的性能下降。 数据库管理: 重新组织和优化表空间和索 引:
    在表上进行大量更新时,空间可能会碎片化。 如果表没有进一步增长,那么可以回收空间。 但是进行插入,那么DB2会重用表中的空间。
    因此将对表进行额外的插入,所以在重新组织表后之后不能很快完成重组, 收缩和增长表的行为不利于性能。 统计:
    必须定期生成和更新所有表和索引的统计信息,包括文本搜索索引。 在“数据库配置”应用程序中,使用“选择操作”菜单操作执行此操作。
    还可以从数据库更新索引统计信息。通过运行MAXIMO_GATHER_TABLE_STATS过程 索引: RUNSTATS ON
    TABLE . WITH DISTRIBUTION AND DETAILED INDEXES
    ALL ALLOW WRITE ACCESS
    使用DETAILED子句为索引执行RUNSTATS命令会收集有关索引的统计信息,这些索引允许优化程序根据各种缓冲池大小估计需要多少数据页提取。
    此附加信息有助于优化器更好地估计通过索引访问表的成本。
    如果数据值彼此非常不同,或者数据值在某些位置聚集在一起,或者遇到许多重复数据值,则使用WITH
    DISTRIBUTION子句允许优化器选择最佳访问路径。 使用压缩提高性 能: HTTP Compression Hardware
    Compression Gzip Compression 3种压缩技术互斥 HTTP压缩会影响群集中的所有服务器。
    HTTP数据在从服务器发送之前被压缩。 请注意,绕过HTTP Server的硬件负载平衡器无法使用此方法。
    网络设备(如Juniper和Riverbed)提供压缩和缓存功能。
    网络设备可以帮助压缩数据和优化带宽。网络设备可以证明对系统性能有益,特别是在高延迟或低带宽环境中。硬件压缩会影响配置中的所有服务器。
    gzip减少了带宽使用,但也增加了CPU和内存消耗。 HTTP服务器压缩是一种更有效的方法。 MAXAGE:
    默认情况下,应用程序服务器上启用了MaxAge浏览器文件缓存筛选器。
    浏览器图像,CSS文件和JavaScript文件存储在本地。如果需要,请修改web.xml文件并将max-age =
    值设置为2764800或更高。 2764800秒是32天。 系统属性设置: 要提高性能,可以禁用doclink处 理:
    webclient.properties文件中设置enabledoclinkonload = false
    设置属性后,必须保存,重建和重新部署maximo.ear文件才能使更改生效 设置连接池参数 :
    初始连接:mxe.db.initialConnections 默认值:6
    最大空闲连接数:mxe.db.maxFreeConnections 默认值:8 释放连接时检查 最小空闲连接数:
    mxe.db.minFreeConnections 默认值: 4 获取连接时检查
    新连接:mxe.db.newConnectionCount 默认值:3
    当连接数低于最小空闲连接的阈值时,将在此设置的批处理中创建新连接以填充池
    要减少与分配和释放数据库连接相关的开销,可以增大属性mxe.db.initialConnections和mxe.db.maxFreeConnections的值
    限制查询时间: 查询超时:mxe.db.QueryTimeout 值:300
    此属性确定允许SQL查询运行多长时间而不生成结果集。如果在超时间隔内未完成SQL查询,则SQL查询将停止。
    结果集超时:webclient.ResultSetQueryTimeout 值:300 此属性确定Query by
    Example(QBE)查询可以运行多长时间而不生成结果集。这些查询是根据在用户界面中的表单和字段上指定的用户输入构造的。您没有指定运行查询所需的SQL命令或谓词。相反,QBE查询由处理表单输入的QBE程序转换为SQL查询。
    此属性还控制过滤查询的运行时间,例如过滤表行或用户时,或者要求查看对象类型的所有记录(如所有资产)。如果未单击该控件以取消查询,则查询将在此计时器到期时停止。
    最大查找总数:mxe.db.lookupmaxrow 值:2000
    此属性控制查找返回的记录数。由于未过滤的查找可能需要很长时间才能执行,因此可以通过限制查找处理的记录数来防止数据库降级。
    数据取回数量限制 : mxe.db.fetchStopLimitEnabled
    值:0表示禁用,1表示启用。默认值为1.此属性启用或禁用提取数量限制的检查。 mxe.db.fetchResultStopLimit
    值:5000 取回数据数量。该限制适用于未指定特定提取停止限制属性的所有对象。
    mxe.db.fetchResultStopLimit.OBJECTNAME 值:任何整数值。
    -1表示此对象没有提取停止限制。指定对象的提取数量限制 mxe.db.fetchStopExclusion 值:以逗号分隔的对象名称列表,在MAXOBJECT表中的对象名。
    不进行数量限制的表,优先级大于mxe.db.fetchResultStopLimit.OBJECTNAME 后台任务的集群支 持:
    异常处理队列: 队列中的错误数据有两种形 式:数据需要手动干预才能纠正。“坏”数据可以调整时间或顺序变为“好”数据。
    实现错误队列时,必须在文件ejb-jar.xml中以及模块mboejb的文件ibm-
    ejb-jar-bnd.xmi中取消注释错误队列的MDB部分。 为连续队列创建名为A的异常目标。
    对于异常目标A,将A设置为其自己的异常目标,然后指定A是连续队列的异常队列。此队列配置导致错误消息循环回错误队列的末尾(A)。将错误消息重新插入到消息后面的队列中,该消息允许坏消息成为好消息。此设置允许解决大多数基于错误时序的错误
    mxe.int.mdbdelay属性设置为大于N的值(其中N> 0)意味着每个错误消息在处理之前被延迟N毫秒 与外部系统集成时 :
    与SOAP相比,XML / HTTP具有更少的开销并且在负载条件下表现更好 多记录消息处 理:
    在导入包含多个记录的XML文档时,最好使用文件导入。 使用HTTP
    POST或WebService机制时,整个XML消息都放在队列中(如果使用异步路径)。
    该消息最终仅由一个MDB处理(假设使用了连续队列),这意味着对此大消息进行单线程处理。
    通过文件导入机制加载文件,则多记录消息将拆分为较小的XML消息,允许多个MDB拾取单个记录并并行处理它们 操作系统级别的调优 :
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:
    TcpTimedWaitDelay dword:0000001e (30) StrictTimeWaitSeqCheck
    dword:00000001 (1) MaxFreeTcbs dword:00011940 (72000)
    MaxHashTableSize dword:0000ffff (65535) TcpWindowSize
    dword:0000ffff (65535) EnableDynamicBacklog dword:00000001 (1)
    MinimumDynamicBacklog dword:00000032 (20) MaximumDynamicBacklog
    dword:000003eb (1000) DynamicBacklogGrowthDelta dword:0000000a
    (10) Interfaces\TcpAckFrequency dword:00000001 (1) MaxUserPort
    dword:0000ffff (65535) (For Windows Server 2003. See below for
    Windows Server 2008).
    对于Windows Server 2008,默认动态端口范围已更改。 新的默认启动端口为49152,默认结束端口为65535. 因此,默认情况下,16384端口可用(不是5000)。 要查看动态端口范围,请启动命令提示符并使用netsh命令,如下所示:netsh
    int ipv4 show dynamicport tcp要更改允许的最大端口数的动态端口范围,请发出以下命令 :netsh int
    ipv4 set dynamicport tcp start = 1025 num =
    64510请注意,最小起始端口为1025,最大结束端口不能超过65535。 问题诊断工具 weblogic设置:
    要在WebLogic中启用详细垃圾回收,在启动命令文件中设置 : JAVA_OPTIONS = -verbose:gc

RPCServiceClient-调用webservice客户端:
public void callRemoteFun(){

	  RPCServiceClient client = null;

	  try {
	    client = new RPCServiceClient();
	    Options options = client.getOptions(); 
	    // 创建一个远程的访问地址  
	    EndpointReference target = new EndpointReference("http://...");
	    options.setTo(target);
			Object[] objargs = new Object[] { "001" , "1.00" , "3" , "123456" , "5" };
		  Class[] getobj = new Class[] { String.class };
			// 在创建QName对象时,QName类的构造方法的第一个参数表示WSDL,文件的命名空间名,也就是<wsdl:definitions>元素的targetNamespace属性值
			// 第二个参数是要调用的方法名
		  Object[] response = client.invokeBlocking(new QName("{SERVICE_NAMESPACE}", "{serviceName}"), objargs,getobj);  //同步方法调用会一直阻塞
		  String result = (String) response[0];
			/* //异步方法成功时调用onMessage
			serviceClient.invokeNonBlocking(opAddEntry, opAddEntryArgs,new AxisCallback() {
			public void onComplete() {}

			public void onError(Exception arg0) {}

			public void onFault(MessageContext arg0) {}

			public void onMessage(MessageContext mc) {
				// 输出返回值
				System.out.println(mc.getEnvelope().getFirstElement()
						.getFirstElement().getFirstElement().getText());
			}
			});
			 */
	  } catch (AxisFault e) {
	    e.printStackTrace();
	  } finally {
			if(serviceClient != null){
				try {
					serviceClient.cleanupTransport();
				} catch (AxisFault e) {
					e.printStackTrace();
				}
			}
		}	
	  
	}


  • 工作流: filename.substring(filename.lastIndexOf(".")得到最后点结束的字符串
    MXServer.getMXServer().lookup(“WORKFLOW”)).initiateWorkflow(“TXSH_WTZG”,
    this);//开启工作流,TXSH_WTZG为过程名
    新建一个InitiateWorkflowMbo子表数据,主表为指定的mbo。其中需要获得WFprocessMbo验证是否已经存在工作流实例{active
    = 1 and objectname = ‘UD_TXSH_SHWT’ and not exists (select 1 from wfinstance where wfinstance.processname = wfprocess.processname and
    wfinstance.ownertable = ‘UD_TXSH_SHWT’ and wfinstance.ownerid =
    5318 and wfinstance.active = 1)}
    通过WFprocess初始化工作流,其中通过WFINSTANCE创建新的mbo,将主表的值赋值给新的WFINSTANCE。然后WFinstance初始化工作流,通过WFCALLSTACK初始化工作流,查找WFinstance的wfid,新建
    WFcallstack,并设置WFnode的id。WFAction是Node的子表,node关联instance,instance创建事务。通过Node应用action,通过action,node(开始,任务,条件,输入,子过程,交互),callstack创建事务。通过action推送通知。遍历各个节点,子过程压入WFcallstack。初始化任务节点,检查当前定义的工作流分配WFAssignment,进行工作流分配,通过roleid分配给指定人员(或者mbo的relationship)。角色类型解析到peson,MaxRole.resolveRole更加类型字段的不同进行不同的解析,与用户相关的数据集则是取执行工作流mbo的字段值,为指定人员生成通知

猜你喜欢

转载自blog.csdn.net/q634047223/article/details/83621922