0512 编程规范及常见问题.docx
《0512 编程规范及常见问题.docx》由会员分享,可在线阅读,更多相关《0512 编程规范及常见问题.docx(19页珍藏版)》请在冰豆网上搜索。
0512编程规范及常见问题
一、开发标准与命名约定
l 在代码开发中,所有的运算符(+ 、-、 *、 / 、〈、〉等)及赋值动词(=)的前后者应加上一个空格,最好在函数的参数表中的每个变量前面也要加入一个空格。
如:
wf_Dfjs_Dldb( Ad_zdl, As_lb ) 。
l 应使用TAB而不是空格来缩排循环或复合语句中的代码,显示其包含关系。
l 函数名,事件名或变量名的定义一律用英文书写(不便定义的用拼音首字母),要求能从字面上表示清楚;变量尽量不要出现嵌套,函数不要用敏感字符(如ItemChanged);首字母用大写,单词之间不用连字符(_)如:
wf_RightTrim() 。
l SQL语句首字母大写,同时要考虑SQL的通用性(Oracle 、SQLServer 、 SQLanywhere),使用标准SQL语句。
l 单行结构的语句尽量分解多行:
If n_Rows > 6 then
dw_report.Retrieve()
EndIf
而非 If n_Rows >6 then dw_report.Retrieve() 。
l 在函数或事件代码中,应加入相应的注释内容与函数头(事件头)如下所示:
///////////////////////////////////////////////////////////////////////////////////
/* Function:
()
Access:
Public
Arguments:
Returns:
Description:
*/
////////////////////////////////////////////////////////////////////////////////////
//以下开始为代码
代码中功能块之间要有明显标记,至少隔行区分;各功能块前有明确功能注释。
l 函数的功能要分明,尽量不要出现一个函数完成多个任务的情况。
l 循环变量:
对于循环变量,允许定义单字母:
I、J、K;以及M、N、L,但这些变量的定义仅限在Local中。
不同的循环使用不同的循环变量。
l PBL的命名规则应为PPP_OOOO , PPP为项目缩写,OOOO为能体现此库的内容的缩写。
l 窗口、数据窗口对象命名:
A_B_C_D_E_F_G
Eg:
d_ys_ qtbz_ ds_10KV_free_arg
A:
类型,如D为数据窗口、W为窗口、DD为子数据窗口
B:
模块,如PW指配网图形、YS指预算
C:
对象,如DEFL指定额分类
D:
用途,如LR为“录入”、CX为“查询”、DS为数据存储
E:
扩展,如对于取费标准可能分为10KV、35KV等
F:
格式,如Freeform、Grid
G:
补充,如arg表示带参数
二、开发界面规范
1、 总则
l 系统整体界面采用MDI多文档界面。
系统使用一个主窗口,每个细分功能使用一个MDI子窗口。
l 要求界面在完成功能的前题下,能做到清晰、大方、整齐。
l 窗口及窗口控件一律继承。
**模板核心代码集中在W_MOD_BASE中,其他模板窗口只是为了方便开发,可另存模板窗口;
**祖先代码不允许屏蔽;
**窗口名称、窗口类型在开发方案中确定。
2、 窗口区域分隔
l 菜单:
位于MDI主窗口上,各MDI子窗口不再设菜单,子窗口内功能实现由命令按钮来完成。
l 操作选择区:
POPUP或RESPONSE窗口命令按钮放置在数据显示区的下方或右边。
3、 窗口及窗口控件
l MDI子窗口依其功能可以分为录入/修改,查询/统计,打印,条件录入等。
l 窗口及窗口控件所用字体一律为宋体,9号,普通。
l 作为信息提示用的文本域一律靠左对齐,无边框。
字符前景色为TEXT(黑),背景色为ButtonFace。
l 作为信息显示操作用的文本(输入)域一律靠左对齐。
边框类型为3D LOWER BORDER。
字符前景色为TEXT(黑色);若只显示,则字符背景色为ButtonFace,
l 各输入域或带边框的文本域的高为64 (PB单位)。
命令按钮的高为84,宽为274(302)。
l 命令按钮的快捷方式为:
“(S)保存”,“(X)退出”,“(I)插入”,“(A)添加、应用”,“(D)删除”,“(C)取消、关闭”,“(R)提取”,“(P)打印”,“(F)查找”,“(O)确定、是”,“(N)否”。
遗漏项在实际工作中进行补充。
l POPUP或RESPONSE窗口大小由需要决定,显示时位置居中。
4、 DATAWINDOW 对象
l 主要使用FREEFORM或GRID两种风格的DW来表达数据。
其中FREEFORM对应于主表结构的一条数据,GRID对应于从表结构的多行数据。
l 日期域使用 YYYY/MM/DD格式来显示日期。
若编辑风格为DROPDOWN ,则不选中ALWAYS SHOW ARROW项。
补充:
应用基本设置中,同类的小窗口尽量用TABPAGE实现。
(附加)
一、数据库表:
(1) 表的命名:
gds_df_nn
(2) 列的命名:
绝对不能用关键字做列名。
且一定要写好注释。
二、Pbl:
(1) 系统名_app.pbl组成:
application、project、mainmenu、mainframe;
(2) 整理程序时,如果不能确认对象是否可用的,可重建一个pbl
三、菜单:
1. 主菜单必须从模板中m_mod_main_menu菜单继承,继承后的菜单不需在系统功能菜单项中添加任何菜单项。
2. 新加的菜单项要设置快捷方式,且必须放到系统功能与窗口之间。
3. 菜单项的text文本必需同打开窗口的title保持一致;
4. 如果有toolbar,必须设置toolbar text的值;
5. menuitem name的取值要有意义的命名,不允许出现m_1、m_2等名字;
6. 菜单tag中添加要打开窗口的windowname。
四、窗口:
1. 打开方式:
(1) 所有以ORIGINAL打开的窗口都必须设置居中。
(2) 窗口的类型如果是response!
,则必须用open()函数打开而不能用opensheet()打开;用opensheet()打开的只能是main!
类型的窗口。
(3) 窗口必须用平铺与原始状态打开,绝对不能以最大化与最小化形式打开。
2. 绝对不能在窗口的open事件中写提取大量数据的retrieve()语句,如果非要在此实现类似的功能,则可以通过异步调用的方法实现。
3. 所有窗口的title必须写明白且与菜单的text文本保持一致。
4. 所有的窗口运用宋体9号字,所有的控件全部继承,如有问题,应随时向领导汇报。
5. 用closewithreturn()时,窗口必须是response类型的。
6. 窗口中应用颜色时注意:
不能应用使用户特别敏感或者刺眼的颜色,如红、黄等等。
7. 主窗口(w_XX_mainframe)的Icon属性统一成:
.\icons\UCTAB.ICO。
8. 窗口中最常用的事件:
Open、Resize、CloseQuery、Close。
(1) Open事件:
在窗口显示之前系统触发Open(打开)事件。
此时系统已将构造好了窗口的所有属性以及其上的所有控件,下述函数触发窗口的Open事件:
Open、OpenWithParm、OpenSheet、OpenSheetWithParm。
(2) Resize事件:
当窗口大小发生变化时发生,窗口被打开时也发生此事件,参数SizeType指明改变窗口大小的类型(最大化、最小化、恢复等);newwidth指明窗口的新宽度;newheight指明窗口的新高度,当出现“除”运算时,除数不能为0。
(3) CloseQuery事件:
在开始关闭窗口时,发生该事件,该事件返回一个0或1的返回值,如果返回1,窗口不被关闭,通常情况下紧随其后发生的Close事件不被发生;如果返回0,则窗口被关闭。
利用该事件的这种特性,程序能够根据当前状态提醒用户是否保存改变的数据、检验用户输入的数据的有效性、询问用户是否真的要关闭窗口。
窗口被关闭时,同时关闭所有与之相关的子窗口和弹出窗口。
(4) Close事件:
窗口被关闭时发生。
触发该事件后,没有办法阻止窗口关闭的操作。
五、数据窗口:
(一)数据窗口控件:
1. 横滚条应该根据实际需要进行自动设置。
2. 如果不需要点击标签自动排序,则将数据窗口中的ib_sortonclickheader的默认设置去掉。
3. 根据录入的值提取数值、保存数据等情况,一定要写上Accepttext()函数来接收数据。
(二)数据窗口对象:
1. 数据源决定了数据窗口对象获取数据的方式。
PowerBuild支持五种数据源:
(1)快速选择(Quik Select)能够创建简单的SQL Select语句,主要用于从一个表或由外键连接的多个表中选择数据列,不能生成Sql计算列;
(2)SQL选择(SQL Selcet)以可视化的方式建立SQL Select语句,SQL Select语句的所有细节均能通过该界面定义,从一个或多个表中建立复杂的SQL Select语句,能生成各种的sql 计算列。
(3)查询(Qurey) 数据源将以前创建的Qurey对象作为数据窗口的数据来源。
(4)外部(External)数据源用于让数据窗口访问数据库以外的数据,直接定义Sql计算列,一般用于接收用户输入(可能使用子数据窗口,选择来自数据库的数据)或显示计算结果。
(5)存储过程(Stored Procedure)则直接利用保存在数据库中的存储过程作为数据源,此数据源只有当前连接的数据库支持存储过程时才有效,否则系统将自动隐藏此选项。
数据窗口对象有十一种显示风格为:
列表(Tabular)、表格(Grid)、自由格式(FreeForm)、标签(Lable)、分栏(N-Up)、分组(Group)、交叉列表(Crosstab)、统计图(Graph)、OLE2.0超文本(RichText)、复合(Composite)。
2. 列的类型是日期型的,则必须设置其Style属性EditMask,格式为:
YYYY/MM/DD。
3. 列宽要根据实际数据量来确定其大小,不要出现要么都宽,要么都窄的现象。
4. 数据窗口header区与detail区的位置调整平衡。
5. Header区的border属性如果是raised(6)时,绝对不能产生凹凸不平的效果。
4. 列的Edit/Style Name如果是Edit,编辑时使保存按纽生效,代码写在EditChanged中;其他的都该写在Itemchanged事件中。
5. 列的类型是NUMBER:
则
(1) 根据实际需要赋初始值,如果无,则为0.00或者是0,如不设置的话,删除后光标无法移动。
(2) 一定要设置右对齐格式。
(3) 根据实际业务情况,必须设置Editmask的值。
6. 列的类型是char(varchar2):
则
(1) 改变列的长度时,一定要重新设置Edit中的limit的值。
(2) 必须设置Edit中的empty string is null属性,否则会出现row changed between retrieve and update 的错误信息。
(3) 如果输入的是密码类型的,则设置Edit中的password属性。
(4) 设置左对齐格式。
7. 所有可排序的列必须显示中文。
即要求:
添加的列必须保证header中的标签名称是列名_t,例如列名为:
ysbh,其标签名必须保证为:
ysbh_t。
8. 以GRID形式显示数据:
(1) 列特别多时,移动横滚条到右端,点击要编辑的列时,要注意定位。
(2) 在预览状态下调整列的顺序,此时则不需要重新调整TabOrder的值;反之必须调整TabOrder的值。
(3) 数据窗口上的对象有三种层次:
背景(BackGround)、数据区(Band)、前景(Foreground)。
除了列以外所有的对象都可以通过改变对象属性的Position的Layer的Band为Foreground 或Background来移动对象的位置,然后根据情况可将对象的Layer的属性再改为Band。
9. 在没有应用新模板之前,提示数据为空时,必须进行定位。
10. 排序时注意:
如果按照编号(类型是char),必须用函数number(bh)来实现。
11. 如果要设置列自动折行时,则Detail(细节区)与该列的position中的Autosize Height属性必须同时设置。
12. 如果以Freeform形式显示数据时,一屏完全显示出全部内容的前提下不要用竖滚条,同时显示多条数据时也不要用竖滚条。
13. 提示列为空时,必须按照TabOrder的顺序进行。
14. 报表:
(1) 白底、黑字,字体大小不做具体要求,以用户的具体要求为准(由于涉及到点击标签自动排序的问题,需要将数据窗口中的ib_sortonclickheader的默认设置去掉。
(2) 需要设置数据窗口对象的属性Print Specifications Paper Orientation(Portrait:
纵向;landscape:
横向)和Size的属性。
(3) 如果数据窗口对象需要进行分组显示,则必须根据分组列进行排序。
分组的两个属性:
①选中“New Page On Group break”复选框,分组的数据都从新的一页开始显示或打印。
②选中“Reset Page Number On Group Break”复选框,分组中的页号都从头开始计数。
该项功能必需在选中New Page On Group break”复选框后才起作用。
15. 列的背景要求:
(1)可编辑列:
背景色为白色
不可编辑列:
设为透明
自由风格的标签:
背景色设为透明
(2)如果以Grid形式显示数据时,如果为白色,则标题背景颜色为灰色,凸起(3D Raised).
16. 如果要录入长文本,如果设置的列比较宽,则选中自动竖滚条即Auto Vert Scroll;如果设置的列只存一行字,则应选中自动横滚条即Auto Horz Scroll。
17. 通过数据窗口提取的数据保存为文本、dbf等文件时,注意以下几条:
(1) 保存文件的列次序与选择数据源的列的前后顺序一致。
(2) 虽然数据窗口能够显示子数据窗口的显示值,但在保存时只能保存数据值。
(3) 保存文件的列与选择数据源的列完全一致,即使在数据源中选择了此列,在数据窗口对象中隐藏(或删除)此列,仍然会将此列存于文本、dbf等文件中。
18. 更改数据源或改变数据窗口所对应的表后(如新添加列),检查数据窗口的Update Properties,TabOrder的值。
19. 改变数据窗口更新特性的方法:
(1)打开一数据窗口,从Rows菜单中选择的“Update Properties…”系统显示“Specify Update Prorerties”对话框如上图所示:
A、 如果不允许数据窗口更新数据库,那么就不要选中复选框“Allow Updates”,单击“OK”按钮关闭对话框。
如果要禁止用户修改数据窗口的某列,那么在数据窗口画笔中将此列的TabOrder值设为0。
B、 如果允许数据窗口更新数据库,选中复选框“Allow Updates”。
C、 在“Table To Update”下拉列表框中选择要更新的表
D、 在“Where Clause For Update/Delete”中选则更新方式。
E、 在“Updatesble Cloumns”通过单击选择可更新的列,被选中的列将加亮显示。
F、 选择了要更新的列后,在“Unique Key Column(s)”列表框中定义唯一键,这个唯一键必须能够在表中唯一的标识一条记录。
G、 在“Key Modification”组框中选择当唯一键列更新时数据行的更新方式。
H、 如果当前表中包括了自动增长序号的列(称做标识列,并非所有的数据库都具备此特性),那么在“Indentity Column”下拉列表框中指定该列。
I、 单击“OK”关闭对话框。
注意事项:
如果在“Indentity Column”下拉列表框中指定某列为标识列,那么就不要把该列选择为可更新列。
否则,如果把该列选择为可更新列,那么数据窗口产生的任何更新数据库的Update语句都将失败。
(2)关于“Specify Update Prorerties”对话框中的“Key Modification”组框的详细意义。
“Key Modification”组框中两个选项指定当唯一键列被更新时的数据行的更新方式。
A、 选中“Use Delete Then Insert”单选钮,在唯一键列被更新的情况下,PoweBuild将首先删除原来的行,然后使用新的键值插入新行。
(这种方法减少了数据库重新组织数据的次数,但也存在一些潜在的问题,当某个表的主键是另一个表的外键并在定义外部键时将删除方式定义同时删除(级联删除)时,应用程序可能并不想使用“Use Delete Then Insert”选项。
)
B、 选中“Use Update”单选钮,在唯一键列被更新的情况下,PoweBuild修改行的键值(并非所有的数据库都支持主键更新,也就是说,如果您使用的数据库管理系统不支持主键更新,在这里您就不能选择“Use Update”选项)。
这种方法避免了与外部键相关的级联删除问题。
(3)关于“Specify Update Prorerties”对话框中的“Where Clause For Update/Delete”的三个选项的具体含义:
A、 Key Columns
当选中“Key Columns”单选钮时,数据窗口只使用“Unique Key Columns”列表框中选择主键来构造Where子句,该选项经常在单用户应用程序环境中使用,当PowerBuild生成Update或 Delete语句时,它比较某行键值列的原始值与数据库相应行键值列的值,如果两者相等,则更新操作或删除操作被成功的执行。
B、 Key and Updateable Columns
当选中“Key and Updateable Columns”单选钮时,PowerBuild在创建的Update或Delete语句中将键值列的原始值与可更改列的原始值与数据库的相应值进行比较。
当这些值相等时,修改或删除相应的行(即Update或Delete语句成功执行)。
C、 Key and Modified Columns
当选中“Key and Modified Columns”单选钮时,PowerBuild在创建的Update或Delete语句中将键值列的原始值和已修改可更改列的原始值与数据库的相应值进行比较。
当这些值相等时,修改或删除相应的行,该选项是对数据完整性的保护和操作并发性的折中。
20. 数据窗口中最常用的事件:
ButtonClicked、Clicked、Constructor、Dberror、DoubleClicked、DragDrop、Editchanged、ItemError、Itemchanged、Rowfocuschanged、Rowfocuschanging。
(1)BottonClicked事件:
当数据窗口对象上的按钮对象的SuppressEventProcessing属性设置为no (缺省为no)后,用户单击该按钮时触发。
该事件在系统处理完按钮的缺省动作后触发。
参数:
◆Row--Long类型,用户单击的时第几行。
(与按钮所放的位置有关)
◆Actionreturncode--返回命令按钮的操作码,Long类型。
◆Dwo--DWObject类型,单击命令按钮时,数据窗口的当前对象。
(2)Clicked事件:
当用户点击数据窗口控件的任何位置时触发。
返回值:
1(缺省返回值)继续处理;0停止处理,不改变输入焦点。
此事件将会触发Rowfocuschanged、ItemFocuschanged。
参数:
◆xpos、ypos--用户在数据窗口中单击的具体位置。
◆Row--用户单击的记录号,如果没有单击在行上,则该值为0。
◆Dwo--DWObject类型的值,存放单击的数据窗口内部对象名称。
注意:
A:
如果在此事件中用到了取数的函数例如:
getitemstring(row,column);selectrow的
函数等只要用到的函数与行有关,必需设置 if row=0 then return 。
B:
不能使用scrolltorow()函数,要用setrow()函数。
(3)Constructor事件:
在窗口的Open事件发生之前触。
(4)Dberror事件:
在数据窗口控件访问数据库过程中发生数据库错误时触发。
返回值:
0-缺省值,系统显示出错信息;1-系统不显示出错信息。
(5) DoubleClicked事件:
当用户双击数据窗口控件时触发。
在触发双击事件前,首先触发Clicked单击事件。
我们可以在双击中打开一窗口。
(6)DragDrop事件:
当某个被拖曳控件放置到数据窗