2013-04-19 12:05:10
ok 165.FormUtl.visibleWholeShell在弹出时不能挡住原输入控件

2013-04-08 22:52:55
ok 164.调试模式:弹出提示框时,显示调用堆栈,便于程序员调试
2013-04-07 15:39:46
ok 163.调试模式:双击label标签,可以在Text View中查看CompositeInfo信息

2013-03-31 21:07:06
ok 162.<noEmptyLabel>Y</noEmptyLabel>
noEmptyLabel=Y当LabelText为空时不创建Label
eg.在CompositeSet中有时不用Label

2013-03-28 17:52:18
161.一般form时需要手动添加可批量修改列
public void addLinks() {
super.addLinks();
AbstractFormMediator m = getMediator();
m.addMenu4EditInBatch(dataTable);
m.add2EditInBatch(CompositeInfo.$("PARENT_FUNCTION_NO", "父编号", 16)
.crateText());
m.add2EditInBatch(CompositeInfo.$("FUNCTION_SYS", "属于系统", 16)
.crateText());
m.add2EditInBatch(CompositeInfo.$("ROWSTATE", "可用状态", 1).crateText());
}

2013-03-20 09:56:43
160.可编辑table中选择器可以手动清空(或在选择窗口中点击'清空按钮')
CompositeInfo info = new CompositeInfo();
info.setExtendsInfo("modifiableByUser", "Y");
teacherSelector = new TeacherSelector(info);

2013-03-04 13:06:28
ok 159.右键菜单批量修改选中行
@Override
public void addLinks() {
super.addLinks();
getMediator().addMenu4EditInBatch(getDataTable());
}
可批量编辑列可以使用getMediator().setComposites2EditInBatch(List<IComposite>),EditTblCellMediator中默认所有可编辑列

2013-02-02 16:10:56
ok 158.table导出Excel时带出颜色

2013-02-01 20:22:17
ok 157.tags中添加'$now'时间,右键菜单可插入时间,format可定义时间格式
<t sort="8" value='$now' format='yyyy-MM-dd HH:mm:ss'/>
desc='插入时间'可以定义显示的菜单项标题,无desc属性时标题默认为'当前时间'

2013-02-13 20:48:39
todo 158.1.输入框中tag值用户可自定义加入

2013-01-16 08:30:23
ok 157.1.上下区form中,下区为可编辑form,下区增删改后需要同步修改上区对象合计值
a.在man类中覆盖方法afterDeleteItems;afterSaveItems修改上区实体bean对应表数据
b.form中覆盖afterDelete,afterUpdate调用updateHeadQty();
注下区非可编辑table时,覆盖单个afterAdd,afterDelete,afterUpdate

2013-01-03 17:15:26
ok 156.文件上传
form:
public void initAfterAll() {
CompositeFile4All file2Upload = (CompositeFile4All) getComposite("teacherImgUrl");
addFile2Upload(file2Upload);//告知有文件上传
CompositeBrowser imgBrowser = (CompositeBrowser) getComposite("imgBrowser");
file2Upload.setImgBrowser(imgBrowser);//显示图像文件
super.initAfterAll();
}
@Override //可改变文件名称
protected boolean changeUploadFileName(UploadFile uf) {
Teacher teacher = (Teacher) getSelectedObj();
String teacherNo = teacher.getTeacherNo();
String suffix = FileFunction.getFileSuffix(uf.getFileName());
uf.setFileName(teacherNo + "." + suffix);
return true;
}

@Override //可改变文件保存路径
protected boolean changeUploadFilePath(UploadFile uf) {
String path = TimeFunction.getServerDate("yyyyMM");
uf.setFilePath(path);
return true;
}
form style:
<input name='agile.erp.editor.utl.file.CompositeFile4All' label='照片' beanField='teacherImgUrl'>
<showOrder>70</showOrder>
<maxLength>256</maxLength>
<editable>2</editable>
<maxFileSize>1024000</maxFileSize>
<fileType>teacher</fileType>
<filePath>teacher</filePath>
<noteNoField>teacherNo</noteNoField>
<beanFieldOfUploadFile>uf</beanFieldOfUploadFile>
<hideFileName>Y</hideFileName>
</input>
fileType文件上传的类别,保存在db table中;
filePath服务器端保存文件路径;
noteNoField关联当前selectObj的单据编号
beanFieldOfUploadFile当前控件对应selectObj的FieldOfUpload属性字段名
默认显示原上传文件名,如果要隐藏需要在form style中添加属性<hideFileName>Y</hideFileName>

2012-12-29 22:34:56
ok 155.简化table中直接编辑单元格日期,选择器的写法,直接在init()方法中添加EditColumn
EditColumn colCreateTime = EditColumn.new4Date(tbl, "CREATE_TIME");
colCreateTime.setDateFormat4Cell("yyMMd");
colCreateTime.setReturnValueType(Types.TYPE_TIME);
addEditableCol(colCreateTime);

CompositeInfo info = new CompositeInfo();
info.setBeanFieldName("classroomNo");
ClassroomSelector classroomSelector = new ClassroomSelector(info);
EditColumn col = EditColumn.new4Selector(tbl, "STAFF_NO",
classroomSelector);
addEditableCol(col);

2012-12-25 12:51:09
ok 154.table中直接编辑单元格--选择器写法: ******注155改进写法*******
CompositeInfo info = new CompositeInfo("teacherNo");
TeacherSelector selector = new TeacherSelector(info);
teacherSelector = setCellEditor4Selector(ti, col, selector);
注意选择后如需要更新其他列的显示值,需要覆盖方法updateOtherCompositeWhenModify
protected void updateOtherCompositeWhenModify(TableItem ti, int col,
Object obj) {
if (col == colTeacherNo) {
Teacher dataObj = (Teacher) teacherSelector.getDataObj();
if (dataObj == null) {
ti.setText(colTeacherName, "");
} else {
ti.setText(colTeacherName, dataObj.getTeacherName());
}
}
}

2012-11-28 22:15:14
ok 153.选择器选择后需要显示在输入框中的值:
默认显示弹出窗口选择对象.选择器控件beanField属性值;
当选择对象没有对应beanField时(不在覆盖afterSelect()),需要在具体选择器类中覆盖方法getValue2Show(Object selectBean)

2012-11-23 14:29:13
ok 151.公用form style,但一些控件不需要时,可以使用removeComposite来移除控件
与hide不同,hide是隐藏,这里是移除
ok 152.radio控件组,form style中使用'Radio'控件,在form style showOrder必须连续,否则不认为是一个Group
group属性表示一个组;value属性表示选择时的值;
beanField第一个radio控件需要填写,后续的可以不填写

2012-11-13 09:58:22
ok 150.如果查询form需要作为选择form,第一列加入check box后列宽不够显示数据,需要增加列宽
注:暂时不考虑FixTable

2012-09-05 09:48:53
ok 149.set组,可将多个控件显示在一个控件的占位空间
<input name='Set' label='总重量' beanField='wightOption'>
<showOrder>23</showOrder>
<hSpan>1</hSpan>
<input name='Text' label='理论' beanField='theoryWeight'>
<maxLength>24</maxLength>
<viewType>TYPE_double</viewType>
<showOrder>24</showOrder>
<dataType>double</dataType>
<editable>4</editable>
</input>
<input name='Text' label='净重' beanField='netWeight'>
<maxLength>22</maxLength>
<viewType>TYPE_double</viewType>
<showOrder>25</showOrder>
<dataType>double</dataType>
<editable>2</editable>
</input>
</input>

2012-08-20 19:30:04
ok 148.控件需要有hide属性
<hide>Y</hide>

2012-08-20 19:27:44
ok 147.添加控件的链接功能
使用扩展属性link,link中值为打开form的class name,必须有静态show(String no)的方法
eg.<link>agile.erp.editor.eng.DesignNoticeForm</link>

2012-08-17 19:19:36
146.affirm form优化流程
当前affirm_user field:F_AFFIRM_FILED放到当前bean.map中
ia.affirm
必须先确认的字段beforeAffirmNotNulls:affirmTime,输入人员未确认,设计课长不能确认。
注:字段与提示间使用逗号分隔;多个字段与提示间使用双分号分隔";;"
ib.unaffirm
beforeUnAffirmBeNulls:affirmTimeZg,设计课长已经确认,不能取消确认。
注:字段与提示(提示为字段不为null时的错误提示信息)间使用逗号分隔;多个字段与提示间使用双分号分隔";;"

2012-08-01 21:46:17
ok 145.table添加行号
在table style中添加rowNum标志:<fs rowNum='Y'>

2012-07-08 13:39:05
ok 144. Transfer.bean2Xml重构:减小xml文档大小
eg:Function
<b t='mancs.sys.fun.Function'>
<functionEname t='java.lang.String' v='planning'/>
<functionNo t='java.lang.String' v='MM_SEP01'/>
<functionName t='java.lang.String' v='planning'/>
<parentFunctionNo t='java.lang.String' v='MM'/>
<code t='java.lang.String' v='1'/>
<rowstate t='java.lang.String' v='0'/>
<companyno t='java.lang.String' v='02'/>
<showOrder t='java.lang.String' v='012'/>
<flagOnlyEditMyself t='java.lang.String' v='Y'/>
<SUFFIX_ALIAS t='java.lang.String' v='__'/>
<id t='java.lang.String' v='MM_SEP01'/>
<createUser t='java.lang.String' v='test'/>
<createTime t='java.util.Date' v='2009-06-23 18:10:14.0'/>
<updateUser t='java.lang.String' v='000491'/>
<updateTime t='java.util.Date' v='2010-09-23 17:05:41.0'/>
<selfDifineFields t='java.util.List' v='[]'/>
<map t='java.util.Map' v='{}'/>
<clobFields t='java.util.Map' v='{}'/>
</b>
ok a.t的属性值大多数是'java.lang.String',省略此属性,在xml2Bean时将t默认为该值
ok b.final static的属性可以省略,如SUFFIX_ALIAS
ok c.空的集合可以省略List,Map等

2012-03-28 10:18:06
ok 143. ColorTransferTest第一个参数'B'/'F'后加入'T'表示在testExpression为true时当前列加上tip图标(默认warn.gif),可指定图片(加最后一个参数)

2012-03-14 07:04:03
2012-03-14 09:42:30 OK 140.form属性显示数据库表名称
2012-03-14 09:42:22 OK 141.双击属性标签在eclipse中直接显示对应文件
2012-03-14 07:42:04 ok 142.table添加右键菜单(extends TblLinkAction)可以在构造函数中设置快捷键setShortcutKey('q');(当按ctr+q时刻触发事件)

2012-02-26 20:26:25
ok 139.查询form中查询条件使用gridlayout排列,form style中定义<editorGridNum>12</editorGridNum>即可,
如不想使用使用grid排列,去掉editorGridNum配置即可

2012-02-26 13:34:13
ok 137.可编辑表格的form,保存后刷新并定位原选定行时新增的行key找不到,直接使用原来table选中的rowindex来定位(AbstractFormMediator)
ok 138.可编辑表格的form,从弹出查询窗口选择添加多行后,定位到第一个新增行的第一个可编辑列(AbstractEcEditTbl)

2012-02-24 19:39:26
ok 136.双击控件时可以改变当前的状态为修改或新增
如要屏蔽此功能,在form style中配置<data><doubleclick2Edit>Y</doubleclick2Edit></data>

2012-02-24 18:00:49
ok 135.查询窗口当作为选择器时不需要添加其他功能按钮
public void createButtonArea(Composite parent) {
super.createButtonArea(parent);
if (is4Selector()) {// 当作为选择器时不需要添加其他功能按钮
return;
}
...
2012-02-22 15:33:50
ok 134.明细查询双击显示上下区建档时,下区选中对应明细项
public static HbContainerEditorForm show(String noteNo) {
String editorId = "pur.iq.InquireQuoteHbForm";
String colNameOfItem = "INQUIRE_ITEMNO";
HbContainerEditorForm form = showAndSelectItem(editorId, noteNo, colNameOfItem);//***
form.loopShellNotRcp();
return form;
}

2012-02-18 20:35:39
ok 133.table中直接编辑单元格:EditTblCellMediator
protected void disposeOldEditorWhenLoseFocus(final Control c) {
c.addFocusListener(new FocusAdapter() {
public void focusLost(FocusEvent e) {
super.focusLost(e);
if (c.getData("childForm") == null) {//***可能有子窗体打开(日期,选择框)
disposeOldEditor();
}
}
});
}

2012-02-16 12:43:10
ok 132.下区table直接编辑区域保存失败时,数据的修改时间会被改动,而导致再次修改后无法保存
需要备份版本信息,eg.
public MessageBean saveItems(List lst) {
MessageBean mb = new MessageBean(true);
Dbo session = null;
try {
session = getSession();
for (Iterator iterator = lst.iterator(); iterator.hasNext();) {
ReceiveItem sni = (ReceiveItem) iterator.next();
sni.backupVersion();//******
if (sni.isNew()) {
mb = add(sni);
} else {
mb = update(sni);
}
if (mb.isFalse()) {
session.rollback();
return mb;
}
}
} catch (SQLException e) {
e.printStackTrace();
mb.append(e.getMessage());
mb.setTrue(false);
session.rollback2();
return mb;
} finally {
DboSession.close();
if (mb.isFalse()) {//******
recoverVersion(lst);
}
}
return mb;
}

2012-01-16 11:57:54
129.AbstractEditorComposite.addDblLinstener4Edit鼠标双击控件时,直接跳到当前区,且viewEdit或viewAdd
在initComposites()中设置:addDblLinstener4Edit(getComposite("payMoney"));

2011-11-11 11:50:36
ok 128.分页指令在table style中设定
a.onePageCount='500'设定每页行数
*****注意******
a.man中dbo应使用getSession()取得
b.java.lang.NullPointerException at agile.erp.editor.utl.page.FetchDataByPage.getPageMsg(Unknown Source)
解决方法:
1.如果有覆盖doSearch(),且使用return getManager().search(bean, getRsHandler());返回的改为return super.doSearch();
2.将form中getManager的方法删除
3.查询时,不要再使用()ManFactory.getManByCs(),直接用()getManager()
4.doSearch()中不要再调用gatherData()

ok 129.设定table是否需要状态栏
a.showStatus='Y'设定需要状态栏;N为不需要

130.自定义是否需要状态栏
131.自定义分页行数

2011-11-01 09:15:32
ok 2011-11-02 09:19:45 126.用户建档
a.在表格区域右方显示当前用户所属角色组
b.添加按钮'设置角色',将选中用户全部设置为哪些角色(从角色查询选择窗口多选)
ok 2011-11-02 09:19:49 127.角色建档
a.在表格区域右方显示当前角色组的所有用户,有按钮可以添加用户(从用户查询窗口多选)

2011-10-31 22:05:13
ok 2011-11-02 09:19:56 125.取得Man的方法改进:注意两边都是接口类
IAssociatorMan man = ManFactory.getMan(IAssociatorMan.class);

2011-09-30 14:52:05
124.combox下拉框按'空格'键调出filterForm上有'新增'按钮
form style中定义editUrl=action=OpenEditorAction&act=viewSearch&editorId=id&-field=value

AbstractEditorComposite请求添加,需要先查询数据,再添加时,使用特殊参数act=seeDataBeforeAdd<br>
*** 注意:beanField参数使用'-'传递 ***,但如果忘记加'-'时也可以通过,但不警告是否有对应控件
code可以不定义,已默认action=OpenEditorAction&act=seeDataBeforeAdd&editorId=code."+ code
'$$beanField'可以将'beanField'控件值传递给'新增'editorForm
可以在initAfterAll()后其它监听器中传递其它参数:
String editUrl = cmbRole.getInfo().getExtendsInfo("editUrl");
editUrl = editUrl + getFixRoleType();

2011-09-28 15:21:40
123.hbForm带'审核按钮'审核确认重构 (注意:假设确认时间,确认人员字段为'AFFIRM_TIMR','AFFIRM_USER',如为其它字段名称需要参考改写相应方法)
a.hbForm extends HbContainerEditorAffirm
b.实体bean extends BeanAffirm
c.IMan添加方法update4Affirm(bean)
public MessageBean update4Affirm(ItemQuote itemQuote) {
return ManUtl.update4Affirm(itemQuote);
}

统计图:http://www.java2s.com/CN/Code/Java/Chart/CatalogChart.htm

2011-09-27 15:23:49
ok 122.table style中以'_USER'结尾的字段有时不需要转换为人员姓名使用td='-'禁止自动转换

2011-09-25 12:34:05
120.CodeForm编码为系统内部需要使用的,需要加入一个标志'系统编码FLAG_SYSCODE',管理员或用户没有权限编辑这些编码
121.当一类code不允许添加和编辑时,需要在Function管理中form class中配置'syscode',只有程序员才能编辑这类编码.eg.
agile.erp.editor.pub.code.CodeForm minlength4No=1 syscode=Y

2011-09-22 21:27:36
119.选择器弹出queryForm:
private void openForm() {
String title = "选择会员卡号";
String configFile = "base/ass/AssCardQuery.xml";
form = Form.openForm4Selector(AssCardQueryForm.class, title,
configFile, this);
}
/**
* 当选择器的fieldName与要显示bean的对应field相同,底层会直接设置text值,<br>
* 否则需要在选择器中覆盖CompositeSelector.afterSelect() *****已改进不用此方法,参考153
*/
public void afterSelect(Object selectBean) {
ItemInfo ac = (ItemInfo) selectBean;
setText(ac.getId());
}

2011-09-20 10:15:04
118.单editForm审核确认重构 (注意:假设确认时间,确认人员字段为'AFFIRM_TIMR','AFFIRM_USER',如为其它字段名称需要参考改写相应方法)
a.editForm extends AbstractEditorAffirm
b.实体bean extends BeanAffirm
c.Man添加方法update4Affirm(bean)
public MessageBean update4Affirm(ItemQuote itemQuote) {
return ManUtl.update4Affirm(itemQuote);
}

2011-09-12 16:56:18
ok 117.改进61点,'是否标志'字段的查询,只需要在'spu.equal("t.FLAG_SET", itemInfo.getFlagSet());'加入条件判断是否为输入form.
eg.
if (!itemInfo.isEditFormQuery()) {
spu.equal("t.FLAG_SET", itemInfo.getFlagSet());
}

2011-09-12 13:49:23
ok 115.编辑form,添加,修改等按钮添加快捷键
添加'F2'; 修改'F3';确认保存'F4','F1'查询
ok 116.查询form中查询按钮添加快捷键'ctrl+s'

2011-08-29 21:58:19
ok 114.下拉框一般数据提供者comboDPClass,注意与全局数据提供者'comboGDPClass'区别,全局数据提供者提供数据缓存在本地,一般数据提供者不缓存
目前combox下拉框存在缺陷:1,当数据内容变更后,需要重新打开后才能看到新增或修改变化(全局提供者可双击重新获取);2.不同form需要重复写man取数据的代码
以后写一个一般数据提供类继承 CmbDataAbstract,可解决以上2个问题,且便于其它扩展
注意非全局数据提供者不适用static:
protected boolean hadFetchData;
private List data;

2011-08-26 09:35:59
ok 113.在editor区域可以根据登陆用户,隐藏composite(如供应商查询收料单,可以将'供应商'隐藏)
在使用方法:hideCompositeInitBefore(String bfn)
2011-08-21 12:55:57
ok 112.记录一段代码执行时间,使用内存情况日志
LogRequest logRequest = LogRequest.startLog();
//execute code.....
logRequest.log(getEditorForm(), methodName);

2011-08-20 19:27:05
todo 111.eclipse plug-in快速跳转至相关文件
todo 110.eclipse plug-in快捷键复制当前文件名

2011-08-19 11:10:33
ok 109.当相同列名,自定后显示的标题会是最后一个,解决办法是使用cid属性区分
<f w='69' n='USER_NO' fix='1' cid='1'>用户账号</f>
<f w='69' n='USER_NO' dt='agile.erp.dt.Td4UserName' fix='1' cid='2'>用户姓名</f>
2011-08-17 16:16:03
ok 108.ct显示图片
说明:类似DECODE的语法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else)
agile.erp.dt.img.ImgTransfer(0/列名/-, 1, icons/bo/a.jpg, var2, img2,imgElse),
1.第一个参数决定在哪些列显示图片;一般为0,在第一列显示;-标示在当前列显示
2.根据当前列值与(值/其它列的值)来比较显示不同图片
var2为$$开头时($$COL_NAME),要与table中colName列的值比较<br>
设置图片,图片位置'icons/bo/a.jpg'<br>

2011-07-12 22:46:37
ok 107.直接编辑表格AbstractEcEditTbl,当光标在tableEditor中时,要支持快捷键(ctrl+s,ctrl+u,ctrl+d等)

2011-07-07 12:04:23
TODO 105.改进ct,能够设置列显示图标,以及一般提示信息

ok 106.ColorTransferTest(B, *,testExpression, color4true,color4false)
改进testExpression,可以使用'&'和'|'连接多个表达式,暂不支持'('和')'
***目前仅支持要么只有'&',要么只有'|'的多表达式连接***
***另'&'要写为'&amp;'***

2011-07-01 13:45:21
104.改进确认状态,结案状态,有效状态等条件genCondition的写法(注意值为0/1和Y/N的不同写法)
String isNull = Constant.BOOLEAN_N;
String isNotNull = Constant.BOOLEAN_Y;
spu.isNullOrNot("t.AFFIRM_TIME", affirmStatus, isNull, isNotNull);

替换原来写法:
if (!StringUtil.isEmpty(affirmStatus)) {
String varNull = "0";// 未确认
String varNotNull = "1";// 已确认
if (varNull.equals(affirmStatus)) {
spu.append(" AND t.AFFIRM_TIME IS NULL ");
} else {
if (varNotNull.equals(affirmStatus)) {
spu.append(" AND t.AFFIRM_TIME IS NOT NULL ");
}
}
}

2011-6-18 10:59下午
ok 102.选择器:当选择器弹出窗口的form初始化需要使用选择器所在form中控件值时,直接在选择器中引用此依赖控件,最好不要使用监听器传送依赖控件的值
eg:选择公司别,依赖用户类型(仅传送值会导致text框快捷键(' '或alt+Q)取不到此值)
CompositeCmdByGDP cmbUserType = (CompositeCmdByGDP) getComposite("userType");//依赖控件
selCompany.setCmbUserType(cmbUserType);

2011-6-16 10:32上午

ok 102.系统用户档添加用户类别(用户类别使用编码建档code='SYS_USERTYPE':客户,供应商)
alter table T_SYS_USER add user_type VARCHAR2(2);
comment on column T_SYS_USER.user_type is '用户类别; code=SYS_USERTYPE';
alter table T_SYS_USER modify COMPANYNO VARCHAR2(64);
a.添加字段'用户类别'(可以为空,)
b.当'用户类别'为供应商或客户时,选择公司别要从供应商或客户档选择

TODO 103.编码需要区分哪些是系统级别的,哪些是应用级别的(系统级别的在分项目中可以直接复制引用)
a.添加档案,系统编码档
b.可以从当前模块管理中读取出所有编码,自动添加到新档案中

2011-6-13 02:31下午
TODO 100.自定义列时,某些列必须存在需使用se='Y'(should exist),不允许隐藏
eg.确认人员,确认时间字段; 用于ct判断显示颜色列
ok 101.使用模板导出Excel时,写入列为数字

2011-5-30 03:25下午
99.导出Excel规范化:
ok 有模板; 请参考 BomOptionItem2ExcelByTemplate
TODO 无模板

98.如何解决多个数据库间dbmap快速同步?
--严重错误:没有配置对应类mancs.hk.sale.order.HkOrder的数据库表,不能对数据库表操作!
a.如果使用同一数据库
insert into t_sys_dbmap select t.* from erp4mhsj.t_sys_dbmap t where t.bean_name like 'mancs.hk.sale.order.HkOrder%'

2011-5-18 04:01下午
ok 96. 所有label,按鼠标左键可以复制内容;双击鼠标左键可以复制所有label标题(listenerCopyLabelText)
2011-09-12 14:41:02 用户反馈,变更为右键
ok 97. table标题列,按鼠标左键排序同时可以复制table所有标题

2011-4-29 09:52上午
ok 95.单form中已确认不能修改,删除'重构
a.需要在实体bean中添加方法isAffirmed(),没有此方法时报错
b.Form覆盖checkLockEditWhenAffirmed(){return true;},设定检测审核不能改动

2011-4-28 08:50下午
TODO 94.多下区的添加快捷键可以左右来回切换
a.ctrl+H/ctrl+shift+H
b.alt+数字键

2011-4-28 09:58上午
ok 93.QueryForm与EditorForm添加方法: initComposites(),原先写在initAffterAll()中对控件的初始化改为在此方法中实现
参考代码:
public void initAffterAll() {
if (isNeedEditArea()) {
initComposites();
}
}

2011-4-27 11:39下午
ok 92.HbContainerEditorForm支持queryForm作为下区

2011-4-25 10:49上午
ok 90.beanKeyField在主档定义与上下区中headForm定义方式统一
在form style中使用<data><beanKeyField>dueNo</beanKeyField></data>定义
原headQueryForm:(不在需要)
public String getBeanKeyField() {
return "dueNo";
}
原headForm: (不在需要)
public void initAffterAll() {
beanKeyField = "dueNo";
}
下区主键不一致时:ecnNoteDocForm.setData("beanKeyField", "responseNo=ecnNo");

TODO 91.EditTblCellMediator中,可编辑列信息使用类封装
a.EditColumn:columnName,columnIndex,viewType
b.添加 editColumns 属性,存放所有可编辑列
c.添加getEditColumn("DB_FIELD_NAME")取得对应的 EditColumn

2011-4-19 03:17下午
89.CompositeText无form style时如何设置tags信息:
form xml写法:
<tags>
<t value=' editMyself=N' desc='插入标签内容' keycode='Q'/>
<t value='常用短语' desc='插入选中内容'/>
</tags>CompositeText框中加入右键菜单,插入常用短语,keycode为快捷键,eg: Function.xml
代码直接设置:
BeanValue bv = new BeanValue();
bv.setStr1("value");
bv.setStr2("desc");
getComposite("beanFieldName").getInfo().addTag(bv);

***TODO 衍生想法:记录客户端用户输入框输入内容,记住最频繁内容或上次内容,添加为tag,供输入时选择,
(可在用户输入1个字符后,自动搜索以改字符开头的输入内容,供选择),输入框添加需要此动作的标志assistByHistory=Y

2011-4-17 11:20上午
88.editForm添加方法:(VO为ValueObject缩写)
public BaseValueObject getSelectedVO() {
return (BaseValueObject) selectedObj;
}

2011-4-16 09:45下午
86.'上下区hbForm中已确认不能修改,删除'重构
a.不再需要覆盖viewUpdate(),viewDelete().直接写到超类中了
b.不再需要主档topForm中boolean isAffirmed()方法
c.需要在主档实体bean中添加方法isAffirmed(),没有此方法时报错
d.hbForm覆盖checkLockEditWhenAffirmed(){return true;},设定检测审核不能改动

注:hbForm重构实现方法(仅参考帮助理解)
protected boolean checkLockEditWhenAffirmed() {
return false;
}
protected MessageBean isTopAffirmed() {
MessageBean mb = new MessageBean(false);
InquireQuoteForm form = (InquireQuoteForm) top;
boolean isAffirmed = form.isAffirmed();
mb.setTrue(isAffirmed);
return mb;
}
public boolean viewUpdate() {
if (checkLockEditWhenAffirmed() && isTopAffirmed().isTrue()) {
MessageUtil.warn("已经确认,不能改动!");
return false;
}
return currform.viewUpdate();
}
87.'上下区中下区已确认不能添加明细项viewAdd'重构
a.简单editor区域输入添加时,不用覆盖viewAdd方法
b.如使用其它选择器多选添加(下区直接table编辑)时,只需要写打开哪个选择器,不用检测是否已确认
注:'使用其它选择器多选'原写法与新写法对比
public boolean viewAdd() {
InquireQuoteForm topForm = (InquireQuoteForm) getTopForm();
if (topForm.isAffirmed()) {
MessageUtil.warn("已经确认,不能新增!");
return false;
}
if (StringUtil.isEmpty(getTopObj())) {
MessageUtil.Error("上区对象不能为空!");
return false;
}
inquireQuote = (InquireQuote) getTopObj();
ItemQueryForm form = ItemQueryForm.show4Item(inquireQuote);
form.loopShell();
addSelectItems(form.getLstSelected());
setState(State.STATE_EDIT);
return true;
}
-->>
public boolean viewAdd() {
InquireQuoteForm topForm = (InquireQuoteForm) getTopForm();
inquireQuote = (InquireQuote) getTopObj();
ItemQueryForm form = ItemQueryForm.show4Item(inquireQuote);
form.loopShell();
addSelectItems(form.getLstSelected());
setState(State.STATE_EDIT);
return true;
}

2011-4-14 10:27上午
85.直接table编辑form中AbstractEcEditTbl
a.public List getModified()已由原抽象方法改为超类自己实现了,不用再覆盖此方法
b.MessageBean doSaveItems(List modified)已由原抽象方法改为超类自己实现了,不用再覆盖此方法

2011-4-12 11:27上午
83.粘贴对象时,控件不可用不设置对应值
84.db connection记录最后使用时间ConnectionProvider.getLastUseTime(),如超过5分钟未使用自动关闭(TODO此值可以设置TaskListener.time)

2011-4-9 04:42下午
80.form中增加了getComposite(String bfn)方法,取代getEditorComposite(String bfn)
81.Composite控件中增加方法getStringValue().原getText()方法只返回Object对象,对大多数返回String控件操作不方便
82.form中setCompositeValue(String beanFieldName, Object value)取代原setValue(String beanFieldName, Object value)
取值时使用getCompositeValue(String beanFieldName)

2011-3-31 06:05下午
79.MessageUtil中confirm方法,可以直接使用变量参数,不需要先MessageUtil.format()
MessageUtil.confirm("文件\"{0}\"已存在,是否要覆盖此文件!{1}", toFile, value); ******注意{0}不能用单引号'{0}'
*****如需使用"'",则需要用"''"来显示单引号****
Info,warn,Error等一样用法

2011-3-29 02:26下午
78.CompositeTable同CompositeList,使用checkbox选择,用法与原combox相似

2011-3-24 07:34下午
77.CompositeSeparator 横线hr改进CompositeSeparator2
ok a.可设置显示text:CompositeSeparator2.setText(strValue) 或form中setValue(beanField,strValue)
ok b.可设置text所在位置:左边,右边,中间,两边 txtAlign='L';'R';'C';'B'(both side)
ok c.可添加选择事件addMouseListener()
<input name='mwt.widgets.editor.CompositeSeparator2' label='-' beanField='extends'>
<showOrder>15</showOrder>
<hSpan>4</hSpan>
<vSpan>4</vSpan>
<txtAlign>B</txtAlign>
</input>

2011-3-22 01:11下午
76.table style添加属性'k','t',分别指key,type
type:int,double,String...
k:Y/N/y/n
ColorTransferTest默认使用列中double值比较,当需要字符比较时,使用t='String';需要整数比较时使用t='int';
排序时也需要根据type;
直接编辑table的form,保存成功后需要根据key找到当前选择行;

2011-3-21 01:19下午
74.单个运行Form时,在table中右键菜单可以显示form属性
TODO 75.table style自定义改进:
a.用户勾选直接定义是否显示列
b.可使用按钮'向上','向下'移动显示顺序
c.可直接拖动行来改变列的显示顺序
d.用户可以自定义增加列,增加的列可以使用计算公式决定显示类容,如公式:COL_A+COL_B等简单数学运算公式
e.可以直接在table中编辑显示名称,宽度,公式,对齐方式
f.当未保存列表样式时,直接显示默认样式

2011-3-17 05:09下午
72.横线或竖线: beanFiled为'-'是横线,'|'是竖线;GridData.horizontalSpan,GridData.verticalSpan由hSpan和vSpan决定
<input name='mwt.widgets.editor.CompositeSeparator' label='-' beanField='-'>
<showOrder>15</showOrder>
<hSpan>4</hSpan>
<vSpan>4</vSpan>
<txtAlign>B</txtAlign>
</input>
注: editor form不指定hSpan时,默认设置为editorGridNum值
73.CompositeLabel
label='b'时有边框,否则没有边框
<input name='mwt.widgets.editor.CompositeLabel' label='-' beanField='-'>
<showOrder>66</showOrder>
<hSpan>2</hSpan>
<vSpan>2</vSpan>
</input>


2011-3-17 10:54上午
70.日期控件支持上下左右键选择;空格/回车键选定;page down/up上下月;ctrl+page down/up上下年
71.TableSearchForm到行后,自动发出notifyListeners(SWT.Selection, event)

2011-3-16 02:34下午
68.table添加方法:
public TableItem findItemByColValue(String[] columnName, String[] value)根据列名及值查找记录行
public int[] colIndices(String... colName)根据列名取得对应列显示序号
public String[] getTexts(TableItem ti, String... colNames)
public String getText(TableItem ti, String colName) 根据列名取得对应列值
69. AbstractFormMediator添加方法:displayOriginalAfterSearch(Table tbl, String... colKeyNames)
当保存某行数据后需要重新查询,此时需要定位到原来选择的记录行(参考MrpCalcForm)

2011-3-15 04:27下午
67.主档查询可以添加N个下区(参考:ReceiveQueryForm) (注改进90)
public String getBeanKeyField() {//注意此处上下区关联字段一定需要设定,上下区关联字段不同时参考"常见问题42条":form.setData("beanKeyField", "responseNo=ecnNo");
return "poriNo";
}
protected void createBottomArea() {
super.createBottomArea();
addTab("收料单明细", ReceiveItemQueryForm.class, "inv/receive/ReceiveItemQuery.xml");
}
当下区Form需要参数时:
protected void createBottomArea() {
super.createBottomArea();
ReceiveItemQueryForm riForm = new ReceiveItemQueryForm();
riForm.setData("arg", false);
addTab("收料单明细", riForm, "inv/receive/ReceiveItemQuery.xml");
}
2011-3-15 09:40上午
66.table单元格内容查找支持过滤

2011-3-9 01:19下午
65.table添加右键菜单统一使用Action 继承 TblLinkAction (参考MrpCalcForm.java)
public void addMenu4ShowBomByReq(Table table) {
String title = "查看&BOM结构";
new LinkAction(title, table) {
public boolean enable() {//菜单项是否可用
return true;
}

public void run() {//选中菜单项时执行动作
Link2Bom.showForm(nowRequisition.getStrValue("PRODUCT_NO"),
nowRequisition.getStrValue("VERSION"));
}
};
}

2011-3-3 03:02下午
64.打印改进
a.原方法setHeadInfo(Document xmlDoc)改为addHeadData(Element headNode)
b.可以用方法PrintUtl.addObject(headNode, headObj)将对象属性值全部加入,不用一个一个加入Element
c.设置打印上区数据与表格同宽:xsl文件指定columnCount<xsl:param name="columnCount"><xsl:value-of select="root/head/columnCount"/></xsl:param>

2011-2-27 05:00下午
63.下拉框combox按空格键可弹出过滤选择form
a.编码,不用改动
b.非编码(客户,供应商等),需要设置filterStyle下拉框弹出过滤form的table style(如不指定,默认为编码form的table style:T_PUB_CODE_C)
指定方法<filterStyle>T_PUB_PROVIDER_C</filterStyle>
c.spell属性指定检测汉字首字母拼音的列,多个列使用','分隔,列名称为大写db格式(注意编码默认CODE_NAME为spell列,非编码下拉框的cmbFieldName也默认为spell列,不用再指定)
<spell>REMARK</spell>(注:<cmbFieldName>itemtypeRemark</cmbFieldName>已默认为spell列,不要再重复指定)
62.
IEditor form = Form.createForm(DailyReportItemQueryForm.class,"pp/dr/DailyReportItemQuery.xml");
return (DailyReportItemQueryForm)form;
替代:
Shell shell = Form.genShell();
DailyReportItemQueryForm form = new DailyReportItemQueryForm(shell,
ParseEditorConfigure.getConfigurePrefix() + "pp/dr/DailyReportItemQuery.xml");
form.create();
shell.open();
return form;

61.需要使用rowstate作为查询条件时,在实体bean中加入,***共享template: agileMethodSetBeanFlagOnly ********见改进117******
final static String flagOnly${Valid} = "only${Valid}";
public boolean isOnly${Valid}() {
return "Y".equals(getValue(flagOnly${Valid}));
}
public void setOnly${Valid}() {
setValue(flagOnly${Valid}, "Y");
}
man中查询条件:
if (!shipmentFee.isOnlyValid()) {
sb.append(" AND rowstate = ?");
params.add(shipmentFee.getRowstate());
}
2011-2-9 07:28下午
58.man中able2Save建议不再重写,直接重写able2Save2
覆盖able2Save时需要判断super.able2Save,able2Save2不用
58.1.man中able2Delete2同58
59.man的add方法,单据编号或项次是自动生成时覆盖genNote4Add方法,不用覆盖add方法
60.table style中简化元素及属性名称,减小文件大小
元素:fields->fs; field->f
属性:name->n; align->a; width->w; format->f

56.2011-2-7 09:24添加时自动生成单号时,覆盖方法genNote4Add,使用templates:agileMethodGenNote4Add
protected void genNote4Add(Object obj) {
QBomHead qbh = (QBomHead) obj;
String no = genNoteNo(Constant4Prefix.FC_QBOM, 4);
qbh.setQuoteNo(no);
}
不用再覆盖add(Object)方法,直接覆盖genNote4Add方法

57.2011-2-7 09:48判断是否能够保存,要覆盖able2Save2(),使用templates:agileMethodAble2Save2
不用覆盖able2Save(),直接使用able2Save2()

2011-1-23 08:27下午
55.系统权限部分整理:
a.模块操作档:模块操作表,每个模块的操作唯一;模块必存在于
alter table T_SYS_FUN_OPERATOR add constraint U_T_SYS_FUN_OPERATOR unique (FUN_ID, OPERATE_SEQ);
b.角色授权档:角色,模块,操作必唯一;模块,操作必存在于模块操作档
select t.*, t.rowid from t_sys_functionright t
JOIN (select count(t.id),t.groupno,t.fun_id,t.operate_seq from t_sys_functionright t group by t.groupno,t.fun_id,t.operate_seq having count(t.id)>1) D
ON T.GROUPNO=D.GROUPNO AND T.FUN_ID=D.FUN_ID AND T.OPERATE_SEQ=D.OPERATE_SEQ
ORDER BY t.groupno,t.fun_id,t.operate_seq;
select fo.id, t.*, t.rowid from t_sys_functionright t left join t_sys_fun_operator fo on fo.fun_id=t.fun_id and fo.operate_seq=t.operate_seq where fo.id is null
alter table T_SYS_FUNCTIONRIGHT add constraint u_T_SYS_FUNCTIONRIGHT unique (GROUPNO, FUN_ID, OPERATE_SEQ);
alter table T_SYS_FUNCTIONRIGHT add constraint f_T_SYS_FUNCTIONRIGHT foreign key (FUN_ID, OPERATE_SEQ) references t_sys_fun_operator (FUN_ID, OPERATE_SEQ);
2011-1-18 10:00下午
//添加方法:设置控件值并使其不可编辑,bfn为form style中beanFieldName
public void setValueAndLock(String bfn, Object value) {
IComposite ic = getEditorComposite(bfn);
if (ic != null) {
ic.setText(value);
ic.setEditable(false);
}
}

2010-12-16 09:11下午
ok 54.table中使用td转换后,原值隐藏在tableItem中
ti.setData(BaseMan.KEY4DATA + col, value);
使用ti.getData(BaseMan.KEY4DATA + col)可以取得
Table.getKey4TblColValue(col) = BaseMan.KEY4DATA + col
2011-4-11 12:06下午
table中editor的保存值与显示值不同时,保存值隐藏在ti中,也是使用ti.getData(BaseMan.KEY4DATA + col)取得(例下拉框,选择框LinkToPurchaseOrder)
Table.getHideColValue(ti,col)取代ti.getData(BaseMan.KEY4DATA + col);
Table.getHideColValueBySel(String colName)当前选择行对应列隐藏值

2010-12-11 10:16上午
52.在editForm和queryForm (getManager方法)中使用
man = (IOptionDocMan) getMediator().getMan(getManName());
替换:
man = (IOptionDocMan) ManFactory.getManByCs(OptionDocMan.class);或
man = (IOptionDocMan)ManFactory.getMan(getParseConfig().getManClassName());
53.在editForm和queryForm (doSearch方法)中使用
return getManager().search(getSelectedObj(), getRsHandler());
替换:
ResultSetHandler h = new MapListHandler(new MapRowProcessor());
List<Object> result = getManager().search(getSelectedObj(), h);
return result;
ok 51.添加连接时,简化创建editor代码:
使用:
String myEditorId = "inv.item.query.ItemQueryForm";
ItemQueryForm ec = (ItemQueryForm) Form.getEditor(myEditorId);
ec.getEditorComposite("itemNo").setText(itemNo);
ec.getEditorComposite("workOrderNo").setText(workOrderNo);
ec.viewSearch();
return ec;
替代:
IWorkbenchWindow win = Form.getSite().getWorkbenchWindow();
EditorInput ei = new EditorInput("inv.item.query.ItemQueryForm");
try {
IEditorPart editor = win.getActivePage().openEditor(ei,
Editor.ID);
ItemQueryForm ec = (ItemQueryForm) ((Editor) editor)
.getEditorComposite();
ec.getEditorComposite("itemNo").setText(itemNo);
ec.getEditorComposite("workOrderNo").setText(workOrderNo);
ec.viewSearch();
return ec;
} catch (PartInitException e) {
e.printStackTrace();
}
2010-12-7 11:13上午
ok 47.标准编码数据转换统一使用Td4AllCode,取代原来的方法(新建dt类,再使用dt='agile.erp.dt.bom.Td4ContainerType'>)
eg: dt='Td4AllCode(code)' code为编码
*注意标准编码对应数据库表是t_pub_code,不在这个表内的,不起作用

ok 48.编码数据容器,系统所有编码数据缓存都通过此处统一处理agile.globeData.DataCodes,便于管理
a.方法String getNameByNo(String no, String code)可以将编码别为code的编号no转为名称
b.方法List<Code> getData(String code)可以取得编码别的所有编码数据

ok 49.table style中设置fix='1',横向滚动table时可以锁定列;但fix列的field必须在最上面
49.1 TODO fix='N'禁止用户自定义为fix列
50.用户自定义可以设置锁定、设置解除所有锁定列

2010-12-3 02:09下午
new数据转换:
1.FunCalc(-,$$COL_QTY1+$$COL_QTY2)当前列的值为其它两列的和(支持+-*/)
dt='sys.xao.td.FunCalc(-,$$COL_QTY1+$$COL_QTY2)'
2.FunJoin(-,$$COL1+$$COL2+$$COL3)连接各列值为当前列值

2010-11-26 10:36上午
ok 46.简化sql条件
a.新建类SqlParamUtl取代List params
a.1方法:直接append();add();
b.pu.equal("pc.CPO_PRODUCT_NO",workOrder.getValue("CPO_PRODUCT_NO"))替代:=
if (!StringUtil.isEmpty(workOrder.getValue("CPO_PRODUCT_NO"))) {
sb.append(" AND pc.CPO_PRODUCT_NO=?");
params.add(workOrder.getValue("CPO_PRODUCT_NO"));
}
c.pu.alike(workOrder.getValue("PRODUCT_NAME"),"pc.PRODUCT_NAME")替代:
if (!StringUtil.isEmpty(workOrder.getValue("PRODUCT_NAME"))) {
sb.append(" AND pc.PRODUCT_NAME=?");
params.add("%"
+ workOrder.getValue("PRODUCT_NAME").toString()
.toUpperCase() + "%");
}
d.pu.like()替代: value + "%"
e.pu.rlike()替代: "%" + value,一般rlike的效率比较差,建议少使用;使用like替代,告知用户如果需要这样查询,在要查询的内容前手动加入'%'
相应的还有:alikeIgnoreCase; likeIgnoreCase
f.时间和数字
pu.moreOrEqual()替代: >=
pu.more()替代: >
pu.less()替代: <
pu.lessOrEqual()替代: <=
if (!StringUtil.isEmpty(workOrder.getAffirmTime())) {
sb.append(" AND t.AFFIRM_TIME>=?");
params.add(new java.sql.Timestamp(workOrder.getAffirmTime()
.getTime()));
}
if (!StringUtil.isEmpty(workOrder.getValue("AFFIRM_TIME_END"))) {
sb.append(" AND AFFIRM_TIME-1<=?");
java.util.Date value = (java.util.Date) workOrder
.getValue("AFFIRM_TIME_END");
params.add(new java.sql.Timestamp(value.getTime()));
}
g.特殊 见改进104
// 0 Not Affirm,1 Affirmed,2 All,
Object affirm = requisition.getValue(ViewConstant.AFFIRM_STATUS);
if (!StringUtil.isEmpty(affirm)) {
if ("0".equals(affirm)) {
pu.append(" AND t.AFFIRM_TIME IS NULL ");
}
if ("1".equals(affirm)) {
pu.append(" AND t.AFFIRM_TIME IS NOT NULL ");
}
}
2010-11-19 04:44下午
ok 45.两个table比较差异
a.给定主键,可以是多个字段列
b.给定排序顺序,默认升序
c.给定需要比较的列,默认所有,'*'为全部
ok 44.将form style中mwt.widgets.editor.CompositeText使用Text替换,节约文件大小;
mwt.widgets.editor.CompositeCmb使用Combox替代;
agile.erp.editor.utl.cmb.Composite.CompositeCmdByGDP使用ComboxGDP替代
if ("Text".equals(compositeName)) {
compositeName = "mwt.widgets.editor.CompositeText";
} else if ("Textarea".equals(compositeName)) {
compositeName = "mwt.widgets.editor.CompositeTextarea";
} else if ("Combox".equals(compositeName)) {
compositeName = "mwt.widgets.editor.CompositeCmb";
} else if ("ComboxGDP".equals(compositeName)) {
compositeName = "agile.erp.editor.utl.cmb.Composite.CompositeCmdByGDP";
} else if ("Combox4AffirmStatus".equals(compositeName)) {
compositeName = "agile.erp.editor.utl.cmb.Composite.CompositeCmb4AffirmStatus";
} else if ("Combox4CaseStatus".equals(compositeName)) {
compositeName = "agile.erp.editor.utl.cmb.Composite.CompositeCmb4CaseStatus";
} else if ("Box".equals(compositeName)) {
compositeName = "mwt.widgets.editor.CompositeBox";
}//ParseConfigure->CompositeFactory.getCompositeFullName(String compositeName)
2010-11-3 09:57下午
ok 43.CompositeText框中加入右键菜单,插入常用短语value值,keycode为快捷键,eg: Function.xml
<tags>
<t value=' editMyself=N' desc='插入标签内容' keycode='Q'/>
<t value='常用短语' desc='插入选中内容'/>
</tags>
ParseConfigure解析时Map<String, BeanValue> map = (Map<String, BeanValue>)info.getExtendsInfo4Obj("tags");
如在initAffterAll中使用程序添加可用text.info.setExtendsInfo4Obj("tags", Map<String, BeanValue>)

2010-10-10 10:54上午
* 注意同时有颜色转化和数据转换时,颜色转换在数据转换前发生
ok 42.agile.erp.dt.color.ColorTransfer(B, *, var1, g, 2, r,b),设置背景色,
当src=var1时为Green,=2时为Red,其他时为Blue.
var1为$$开头时($$COL_NAME),使用table中colName列的值比较
2011-07-09 09:56:15
如要与转换后的值比较,'$$'改为'$$#',注意转换列'$$#'必须在ct所在列前(这样才能保证已经转换了)

2010-9-29 02:39下午
查询form table需要使用checkbox多行选择时,覆盖方法:
protected boolean needSelectButtons() {
return select4BomSet || super.needSelectButtons();
}

2010-9-29 10:15上午
41.form不用显示editor area,无编辑区域,一般用于表格输入
ok <data><noeditors>Y</noeditors></data>
代码:setNeedEditArea(boolean need)
enableState4Edit 修改按钮是否一直可用/一直不可用(Y/N)
enableState4Delete
enableState4Affirm
enableState4Add
enableState4Search
disableAllButton form不可编辑(添加修改删除等)

2010-9-3 01:52下午
ok 37.<key>Y</key>
控件定义为主键,刷新按照主键获取数据并刷新,联合主键时,多个控件同时设置为key=Y

ok 38.<data><newThread4Search>Y</newThread4Search></data>大查询或耗时大的sql开启新线程、不影响界面其它操作响应

ok 39.tblCheck: table添加check选择框;
ok 40.tblMulti:可以多行选
<data>
<tblCheck>Y</tblCheck>
<tblMulti>Y</tblMulti>
注:查询form已默认多选,如不允许多选,则使用<tblSingle>Y</tblSingle>
</data>

2010-8-5 08:23下午
ok 36. alt+Q or alt+P快速操作
a.选择器:打开选择器窗口
b.日期控件:默认当前日期

2010-7-29 08:43下午
32. 确认审核模块添加快捷键:F8/ctrl+shift+c
33. 可以多行确认审核,不用每行提示确认成功信息
34. 可以多行删除,不用每行提示是否删除及删除成功标志
35. 角色授权flat中可以使用多选下拉框,一次性授权多个操作

2010-7-27 10:54下午
31. 快捷键:shift+t切换当前区输入控件和table,如当前区无table或无输入控件则不反应
切换到控件区后,将光标停留在最后编辑过的控件上,如没有编辑过则停留在第一个可以编辑的控件上面
2010-7-27 11:11上午
29.ok 快捷键:enter跳入下一个可编辑的控件;shift+enter跳入上一个可编辑的控件
getComposite().addTraverseListener(traverseListener);
30.ok 日期输入框添加快捷键:ctrl+t,显示当前日期 KeyUtil.genKeyListener4Time
2010-7-24 10:48下午
24. 模块建档添加连接:模块操作管理
25. 模块建档添加连接:角色授权(flat)
26. 角色授权(tree)直接添加按钮:添加常用模块操作,选中叶子模块时,设置为可用;父模块时不可用
27. 角色授权(tree)可以双击一行来更新自己及子模块
28. form property可以连接到角色授权(flat)

2010-7-18 02:45下午
16. 使用formMediator添加table的右键菜单--显示form property
17. form property可以连接到function建档
如果function已存在则查询出来,如果不存在则添加
18. 角色组建档,用户可以设置为一个角色组来获得多个角色权限
19. function连接到已有操作
20. 选中某个操作时,可以显示多少角色拥有权限,及添加和删除角色
21. ok 编辑form查询按钮快捷键改为(ctrl+shift+s) AbstractFormMediator.addAccelerateKey
22. ok 使用(ctrl+num)可以将焦点定位到form中相对应控件,超过10的,暂不处理
23. ok 使用(ctrl+t 或 ctrl+shift+t)可以定位上中下区 AbstractFormMediator.addAccelerateKey

2010-7-17 04:12下午
15. ok 使用快捷键(ctrl+shift+c)清空控件内的值

2010-7-10 10:18下午
14. 下载图片可以设置不用到服务器下载,以便调试:Debug.setMock4DownFile();

20107-3 11:30下午
12. 用户可以自定义table行高
新建类包含Function属性,并增加对应table model行高属性,每个table model应只需要取一次行高,本机修改时需要更新缓存数据

13. ok 常用代码写法定义为template,定义好后可以自动重复利用;可以在prefrences/java/editor/template中import/export所用团队成员公用
2010-7-1 08:54上午
11. ok form class可以配置form style中label显示名称
-t+fieldName=labelTitle
2010-6-30 05:34下午
10. 编辑、确认完成后,焦点需要回到table上

2010-6-30 08:22上午
7.ok ant添加上传命令
8.ok config_formal.xml为正式库;config_test.xml为测试库,编写程式自动替换为config.xml
9.ok ant编译前先替换config.xml为正式库的命令

2010-6-26 03:33下午
6.ok 类似decode的语法:dt=sys.xao.td.FunDecode(cols,if1,var1,if2,var2,[else])<br>
cols:-当前列值;可以为常量值;可以为多列,使用|或/隔开;可以为多列与常量混合连接
eg. dt='sys.xao.td.FunDecode(-,0, )' 可以将值为0的转为空值,注意第2个逗号后面应有一个空格

2010-6-24 03:46下午
3.ok editor属性中显示table style名称

4.ok editor属性中显示table style内容
5.ok editor属性中显示form style内容

2010-6-2 02:06下午
1.根据Expression值使当前列('-')显示不同颜色
2.根据Expression值使其他列(单个'列名/列名';整行'*')显示不同颜色
agile.erp.dt.color.ColorTransferTest(B, *,testExpression, color4true,color4false),设置背景色,color4false为可选项
当Expression=true时为color4true,=false时为color4false
注:expression中可以使用常量或列值,列值需要使用$$+'列名称'
支持符号+,-,>,<,=
ok $$A=$$B 数字或字符 ->写法: equal($$A, $$B)
ok $$A=0 数字 ->如ColorTransferTest(equal($$A, 0), B, *,g,b)等效于在A列使用: agile.erp.dt.color.ColorTransfer(B, *, 0, g, b)
ok $$A>$$B 数字->more($$A, $$B)
ok $$A<$$B 数字->less($$A, $$B)
ok ">=", "<=", "!=", ">", "<", "="
$$A<1 数字->less($$A, 1)
$$A-$$B>0 数字->more(minus($$A,$$B), 0)
$$A+$$B>$$C 数字->more(add($$A,$$B), 1)

2010-4-24 11:48上午
控件c1值改变时,设置相关控件c2的显示值;多个控制使用';'隔开
<data><relateValueListening>-s=c1,-o=c2,-fn=fieldName,-t=formStateType,-f=Y/N</relateValueListening></data>
eg:<relateValueListening>-s=inWoNo,-o=inProductNo,-fn=productNo,-t=B,-f=Y</relateValueListening>
-s为监听的source控件c1的beanFieldName;
-o为设置显示值的object控件c2的beanFieldName;
-fn为监听控件改变后dataObj对象的属性名称,此属性值将设置到c2控件
-t为是否设置c2控件值类别:A仅添加时改变;U仅修改状态可以改变;B为所有状态都要改变
-f为Y/N是否force强制更新,不管c2是否不为空.-f=N时如c2不为空不要设置其值
一般c2控件需要设置:editable=6永远不可编辑,且在setEditor时不需要设置此控件值(一般适用于由其他控件设置或输入后显示相关值,且不保存到数据库中的字段)

source控件的object值设定参考<常见问题>:46 选择器手动输入或选择后填写相关控件值

2010-4-21 02:45下午
控件c1的可用状态由控件c2来决定,直接在form style配置:多个控制使用';'隔开
<data><editableListening>c1,c2,-,value,N/Y;c1,c3,-,value,N/Y</editableListening></data>
-表示当前值;如不是当前值,而是对象属性时直接设置为属性名称,
value表示当-=value时,c1的可用状态为N/Y
a.form.setState()时设置
if (state == State.STATE_EDIT || state == State.STATE_NEW) { ****改进->AbstractFrontEditor.isState4Edit(getState())
helper4Editable.set4Update(this, lstEditableListening);
}
b.ModifyText
protected void initMediator() ->initEditableListening() ->HelperEditableListening.init() -> addModifyListener

2010-4-5 21:54
用户是否可以自定义table样式开关:
able2UseSelfTblStyle = true;默认为true,如不允许需要在initBeforeAll()中设定为false

2010-4-2 21:28
单独测试用户是否有权限:
String userNo = "hyq";
Function fun = BaseMan .initConfig4Test(userNo, "T_ENG_RESPONSE_NOTE_END"); //****
Shell shell = new Shell();
shell.setLayout(new FillLayout());
ResponseNoteEndForm form = new ResponseNoteEndForm(shell,
ParseEditorConfigure.getConfigurePrefix() + "eng/response/ResponseNoteQuery.xml");
form.create();
form.setData("function", fun); //****此处设置
shell.open();
form.loopShell(shell);
2010-4-1 10:12
ok 添加时不清空按钮
form style配置:<data><btn4NoClear>Y</btn4NoClear></data>

2010-3-31 21:42 关于比较值可以使用列名称已经改进过见2010-10-10 10:54上午
类似decode的语法:decode(value,if1,then1,if2,then2,if3,then3,...,else)
参数1: 'B'背景色,'F'前景色<br>
参数2: 1.根据当前列值使当前列('-')显示不同颜色<br>
2.根据当前列值使其他列(单个'列名/列名';整行'*')显示不同颜色<br>
ct='agile.erp.dt.color.ColorTransfer(B, *, 1, g, 2, r, b)',设置背景色,当src=1时为Green,=2时为Red,其他时为Blue
颜色对应:
"g", Constant.COLOR_GREEN
"gd", Constant.COLOR_GREEN_DARK
"b", Constant.COLOR_BLUE
"r", Constant.COLOR_RED
"l", Constant.COLOR_LIGHT
"rl", Constant.COLOR_RED_LIGHT
"w", Constant.COLOR_WARNING
"wh", 白色
"y", Constant.COLOR_YELLOW
"gr", Constant.COLOR_INVALID
2010-3-26 9:09
a.快捷键整理AbstractFormMediator.addAccelerateKey
KEY/=search
KEYb=add
KEYg=edit
KEYd=delete
KEYs=affirm
KEYu=cancel
b.查询form
F5或ctrl+?查询
2010-3-4 13:42
a.树形授权双击行时,展开当前行全部
b.添加全部展开;全部收缩

2010-2-14 21:35
t1 系统改动日志form style中可配置(<data><needLog>Y</needLog></data>)
添加、删除日志只需要在bean类中覆盖方法:genLog4Add,genLog4Delete
修改日志也需要在bean类中覆盖方法:genLog4Update;(注:超类已实现在doUpdateTemplate.genDetailLog4Update将新对象与原始对象比较,并将属性转换为中文)

2010-2-14 20:59
ok 用户能否通过外网访问使用角色控制(系统预留角色'WWW'),将需要使用外网访问的用户在'角色管理'中授予角色'WWW'即可
2010-2-14 20:59
ok 建檔程式设定为只有自己才能修改刪除a.一般添加修改删除;b.上下区;c.上中下区
对a只需要关注修改、删除;b的下区及c的中下区还要关注添加;
在模块管理class中配置参数:editMyself=Y当前建档模块设置为只有自己可以添加/修改;默认值为Y
如不需要'创建人自己修改、删除'控制,必须在class后配置editMyself=N(在模块管理里面form class name: 添加' editMyself=N')

ok 建檔程式设定为只有自己才能確認(超类hadAuthority2Affirm中已做检测)
如非创建人确认模块需要覆盖该方法;或在模块管理里面form class name: 添加' editMyself=N'

2010-2-8 10:11
ok 对通用模块授权只需要对角色编号为'*'的角色授权(系统预留角色'*')
如要把反应单设置为所有人员都有权限,只需要把反应单的权限授权给角色编号为'*'的角色,就可以了
2009-11-26 9:39
ok 日期类型修改时丢失小时分钟问题,所有Date类型数据均使用Timestamp
ok 删除一记录行后,默认选中下行数据,如不再有下行数据,显示最后一行2009-12-1 15:00
ok table单元格可以换行
public void initAffterAll() {
mediator.setWrapText4Cell(dataTable);
super.initAffterAll();
}
ok 选择器弹出窗口可通过扩展属性传递参数
选择样品单时默认确认状态并不可编辑,使用扩展属性defaultAffirmStatus:(0 Not Affirm,1 Affirmed,2 All),扩展3(待确认)
<input type='text' name='agile.erp.editor.utl.sel.SampleNoteItem' label='样品单号' beanField='sampleItemno'>
<maxLength>8</maxLength>
<showOrder>7</showOrder>
<editable>2</editable>
<nullable>N</nullable>
<clearable>Y</clearable>
<modifiableByUser>Y</modifiableByUser><!--表示选择框是否可以手动输入-->
<defaultAffirmStatus>1</defaultAffirmStatus>
</input>
代码参考agile.erp.editor.utl.sel.SampleNoteItem.java 36行
form = new NoteItemQueryForm(shell, ParseEditorConfigure
.getConfigurePrefix()
+ "casep/sample/query/NoteItemQuery.xml");
form.create();
// 默认确认状态(并不可编辑)
String extendsInfo = info.getExtendsInfo("defaultAffirmStatus");
if (!StringUtil.isEmpty(extendsInfo)) {
IComposite ec = form.getEditorComposit("affirmStatusUser");
ec.setText(extendsInfo);
ec.setEditable(false);
}

ok 2009-12-8 19:51 Excel模板值的填充:
1.$$key 简单对应,直接获取对应‘key’的值替换
1.1如Excel中为$$createUserName,
代码中设置值为:map.put("createUserName",createUserName);
代码中获取取值:Object=map.get("createUserName");setCellValue(currCell, dear(Object));
2.$$bean.beanField,先获取key为'bean'的对象,再从对象中获取值
2.1如Excel中为$$noteItem.noteItemNo,
代码中设置值为:map.put("noteItem",noteItem);
代码中获取取值:Object=map.get("noteItem");setCellValue(currCell, getValue(Object,"noteItemNo"));
2.2如Excel中为$$noteItem.noteHead.noteNo,
代码中设置值为:map.put("noteItem",noteItem);
代码中获取取值:Object=map.get("noteItem");setCellValue(currCell, getValue(Object,"noteHead.noteNo"));
3.$*lstKey.beanField,代表为list循环,先获取key为'lstKey'的对象,再从对象中获取值
目前只考虑同一个$*lstKey只占用同一行;
beanField为当前单元格显示对象的属性,可以为简单属性名称,也可以为属性.属性,如对象为NoteItem,属性为noteHead.noteNo
4.需要连接多个变量或常量值,使用'+'连接

ok table排序后的重新定位