密级
公开()普通(√)秘密()机密()绝密()
PB编程规范
文档编号:<文档编号(按照文档编码规范)> 文档归类:项目规范文档 作 者:李程扬
创建时间:2002-07-02 修改时间:2005-09-29
版 本 号:v3.0(2002-07-31)、v4.0(2005-09-29) 文档传阅:ZHIS4项目组成员
为提高程序开发效率,降低软件开发过程中出现错误的几率,使系统模块保持一致的风格,在开发过程中应该遵循一定的编程标准。
规范提供的是定义一个源码级应用程序的开发规范,它是借助PowerScript语言,在PowerBuilder开发环境下提供的标准化服务。它可供应开发人员及系统设计人员使用。
本规范描述开发人员关心的外部特性及设施,而不是描述为达到这些功能采用的内部结构技术。
1、 命名规范:
1.1 命名总则:
1.1.1 除了特殊说明外,所有命名均须使用规定的前缀标识,即“标识_功能说明”; 1.1.2 所有命名的功能说明部分均为用下划线(_)分隔单词;
1.1.3 “功能说明”部分的单词先后顺序以尽量使同一类别的对象排列在一起为
原则,以便于查找定位;
1.1.4 绝对禁止用单纯的数字或汉语拼音简码来命名,如ls_1、ls_brxm(病人
姓名),必须使用与具体功能相关的单词或单词缩写,且尽可能使用行业常用术语或约定词汇,即词能达意、沟通方便;
1.1.5 命名的原则是尽量能从名称上看出更多的隐含基本信息,如变量的作用域、
变量类型等;
1.2 对象命名规范:
C:\\iknow\\docshare\\data\\cur_work\\348693431.doc 第1页 共15页
厦门智业软件工程有限公司.研发部 ZHIS4项目组文档
对象名称 命名规则 subsystem_name w_name m_name m_pop_name d_name d_ext_name dwc_name u_name uo_name n_name f_name st_name 示例 doctor w_sheet_manager m_report m_pop_register d_sick_info dwc_base_dict u_cb_help uo_login n_pres_save f_get_sys_parm st_print 备注 1 应用对象 2 工程对象 3 窗口对象 4 普通菜单对象 5 弹出式菜单 6 普通数据窗口 7 外部数据窗口 8 下拉子数据窗口 9 标准可视用户对象 p_subsystem_name p_doctor 主窗口(w_main) 主菜单(m_main) d_ext_dept_select 外部数据源External 注① 继承自Visual Custom 10 可视用户对象 11 不可视用户对象 12 全局函数 13 全局结构
注意事项
注①:继承普通按钮commandbutton(u_cb_)、继承数据窗口datawindow(u_dw_) .对象命名:对象类型标识_功能说明,当然应用对象命名无须前缀标识;
.对于窗口与数据窗口的命名,推荐采用“标识_子类别_名词_动词_备注”命名方式,这样可以把同类对象排在一起,编程时便于查找,应用框架也较为明晰; 例如:w_employee_edit_grid w_employee_edit_free d_dept_preview d_dept_config d_query_apply_sheet d_query_lay_physic d_rpt_staff_print_free d_rpt_staff_print_grid
由上,对于数据窗口子类别命名可遵循:打印(print)、查询(query)、报表(rpt) .对于有继承关系对象的命名(窗口、菜单、用户对象),推荐用“父类_子类说明”; 例如:w_spell w_spell_apply w_spell_apply_sick u_dwbutton u_dwbutton_add
1.3 变量命名规范:
C:\\iknow\\docshare\\data\\cur_work\\348693431.doc
第2页 共15页
厦门智业软件工程有限公司.研发部 ZHIS4项目组文档
1.3.1 变量作用域前缀: 变量范围 缩写 G S I l a r 示例 GS_SUBSYSTEM_NAME SL_ITEM_COUNT IS_TEMPLATE_FLAG ls_prescribe_number as_apply_no rdc_sum_cost 说明 1 全局变量(Global) 2 共享变量(Shared) 3 实例变量(Instance) 4 局部变量(Local) 5 传值参数变量(Value/ReadOnly) 6 引用参数变量(Reference) 注意事项
.编程时对于全局变量、共享变量与实例变量能不使用时尽量不用,如可以用参数传值时就不要定义实例变量;
1.3.2 变量类型前缀: 2 日期(Date) 3 时间(Time) 4 日期时间(DateTime) 5 短整型(Integer、Int) 6 长整型(Long) 7 数值类型(Decimal、Dec) 8 布尔类型(Boolean) 9 二进制对象(Blob) 10 Any类型(Any) 11 数据存储(DataStore) 12 数据窗口(DataWindow) 13 子数据窗口(DataWindowChild) 14 PowerObject对象(PowerObject) 15 DragObject对象(DragObject) 16 应用对象(Application) 17 OLE对象(OLEObject) 19 异常处理对象(Exception) 20 按键(KeyCode) 21 不可视用户对象(Custom Class) 22 可视用户对象(Custom Visual) 注意事项
.字符串类型统一用String,而不准使用Char类型;
.日期类型推荐以“_date”作为后缀,时间类型以“_time”作后缀,
.整型定义推荐都使用Long,因为Integer短整型最大值为32767,某些情况下可能会溢出;另外无符号长整型(UnsignedLong)与短整型(UnsignedInteger)的
C:\\iknow\\docshare\\data\\cur_work\\348693431.doc
第3页 共15页
变量类型 缩写 s d t dt i l dc b any ds dw dwc po do app ole e k nv uo 示例 ls_item_code ld_register_date lt_dose_time ldt_sys li_count ll_handle ldc_lay_quantity lb_physic_flag lany_data lds_physic_storage ldw_cost ldwc_dept lpo_parent ldo_set lapp_doctor lole_word ltvi_class le_sql GK_HOT_KEY lnv_check luo_report 说明 1 字符串(String) blob lblob_test_pic 18 TreeViewItem对象(TreeViewItem) tvi 厦门智业软件工程有限公司.研发部 ZHIS4项目组文档
前缀与有符号类型一样;
.浮点类型统一使用Decimal,不用Double或Real类型;Decimal在定义变量时须指定精度,即使是无小数位的情况下;若是存数据库列值的变量一定要注意与列的小数精度一致,这一点切记;例如:
Dec{3} ldc_pres_cost Dec{0} ldc_nullah_number Dec{2} ldc_lay_physic_quantity Dec{2} ldc_physic_pack_spec
.对于存数据库数值类型列的变量一定要注意其是否有小数及其位数,另外,一定要使用Decimal类型变量,绝对不准使用Long类型,即使当前值它位数足够,但你不能保证将来变动时Long类型变量位数也足够存其值! .对于其它没列出的对象类型,取其单词首字母为前缀;
例如:TranceObject lto_connect
1.3.3 变量访问范围: 注意事项
.所有共享变量或实例变量都必须设置访问范围(Public、Protected、Private),不推荐使用Public类型,而用of_get_xxx与/或of_set_xxx向外提供封装接口; .在对象内使用全局变量时,尽可能在使用前把它赋值给同类型的实例变量,以使模块移植性更好(方便),例如,对象Constructor事件或窗口Open事件中: IS_LOGIN_DEPT_CODE = GS_LOGIN_DEPT_CODE
1.3.4 变量名称: 注意事项
.对于从数据库或数据窗口中取值的变量,其后部分尽量用数据库字段名; 例如:String ls_item_name Dec{3} ldc_total_dosage
1.4 控件命名规范:
控件名称 缩写 cb_ pb_ cbx_ rb_ st_ shl_ p_ phl_ gb_ ln_ ov_ r_ rr_
示例 cb_ok pb_thank_info cbx_age_show rb_typical_setup st_user_id shl_service_email p_user_photo phl_company_sign gb_detail_info ln_h_separator ov_used_flag r_photo_frame rr_company_flag 说明 第4页 共15页
1 CommandButton 2 PictureButton 3 CheckBox 4 RadioButton 5 StaticText 6 StaticHyperLink 7 Picture 8 PictureHyperLink 9 GroupBox 10 Line 11 Oval 12 Rectangle 13 RoundRectangle C:\\iknow\\docshare\\data\\cur_work\\348693431.doc
厦门智业软件工程有限公司.研发部 ZHIS4项目组文档
14 SingleLineEdit 15 EditMask 16 MultiLineEdit 17 RichTextEdit 18 HScrollBar 19 VScrollBar 20 HTrackBar 21 VTrackBar 22 HProgressBar 23 VProgressBar 24 DropDownListBox 25 DropDownPictureListBox 26 ListBox 27 PictureListBox 28 ListView 29 TreeView 30 DataWindow 31 Graph 32 OleControl 33 UserObject 34 Tab Control 35 TabPage
注意事项
sle_ em_ mle_ rte_ hsb_ vsb htb_ vtb_ hpb_ vpb_ ddlb_ ddplb_ lb_ plb_ lv_ tv_ dw_ gr_ ole_ uo_ tab_ sle_user_name em_telephone_no mle_book_comments rte_student_answer hsb_time_set vsb_money_set htb_people_set vtb_quantity_set hpb_work_info vpb_cost_info ddlb_your_favourite ddplb_photo_preview lb_department_name lv_all_user tv_customers dw_user_info_detail gr_month_report ole_word_doc uo_sick_info tab_pres_query plb_user_identification tabpage_ tabpage_ordinary_super .控件命名:“控件类型前缀_功能说明”,界面设计时其[作用范围]不用标示,如树形控件tv_physic;但在脚本中定义时必须遵循《变量命名规范》,如数据窗口控件:idw_send;
.界面设计时不能使用控件的缺省名称(如cb_1,dw_2),须用与控件功能相关的单词,单词间用下划线(_)相隔;当然一些图示控件(如GroupBox,Line)可以除外;一般界面有多个相同类型控件或控件名要在代码中引用时就要改变其缺省定义。
1.5 常量命名规范:
注意事项
.因为到PB8还不支持枚举类型,对于一些有固定取值范围的变量值可用常量定义,这样程序员在使用时可见其词知其义,特别是对于一些状态值推荐使用常量,这样可读性更好,例如:
Public:
Constant String APPLY_STATUS_NEW = 'NEW' //单据新开态 Constant String APPLY_STATUS_EXEC = 'EXEC' //单据执行态 .常量命名无须有前缀或后缀,一般取大家均知其含义的单词组合,如数据库状态列就取“列名+状态名”,同样其单词间也用“_”分隔;
1.6 内部函数命名规范:
C:\\iknow\\docshare\\data\\cur_work\\348693431.doc
第5页 共15页
厦门智业软件工程有限公司.研发部 ZHIS4项目组文档
函数类型 缩写 pf_ vf_ of_ 示例 vf_retrieve of_get_sick_id 说明 1 私有函数(Private)、 2 保护函数(Protected) 3 公有函数(Public)
注意事项
pf_insert_apply .函数命名单词间以“_”相隔,公用函数命名应采用“of_get_xxx”、“of_set_xxx”、“of_is_xxx”、“of_found_xxx”等类似的形式;
.命名能使相同功能的函数尽量排列在一起,以便于查找,可采用“功能描述+动词+名词”,例如:
of_dw_set_row() //数据窗设置当前行状态 of_dw_retrieve() //数据窗刷新 of_dw_save() //数据窗保存
of_dw_save_check() //数据窗保存时检查数据有效性
.有以下情况可能会因前缀相同而易产生混淆,当可视用户对象及其窗体容器的函数名相同,而此时又在用户对象的事件中调用此函数,如of_set_status,就不易区分到底是调用对象的函数(√)还是调用窗体的函数,因此特规定:
在用户对象的事件中调用函数时必须加上“This.”,如:This.of_set_status()
1.7 事件命名规范:
注意事项
.对象事件以“ue_”作前缀,单词间用“_”相隔,如:
ue_open_after //Open事件之后触发 ue_retrieve_tv //刷新树形控件
.同样命名的原则也是尽量使同一类的事件放在一起,只要不引起误解,对于“动词”与“名词”哪个排前并无太大关系,以便于查找定位某一事件及相关事件为原则;
.自定义事件一般用于两种场合:a.封装控件处理; b.动态界面消息传递。
1.8 结构命名规范:
注意事项
.不论全局结构还是对象内部结构均使用“st_”作前缀,命名时单词间也用“_”分隔;但“全局结构对象”不推荐使用,因其自身无法包含足够的注释,这样会造成理解不便,所以,除了要与已开发系统兼容外不准使用结构对象,而用不可视对象代替,如下
.对于要使用全局结构对象的场合,可用不可视对象来代替,并以“_var”作后缀以示与普通不可视对象相别,如:n_tv_dept_var
Public: //n_tv_dept_var的实例变量定义 String DEPT_CODE //科室代码 String DEPT_NAME //科室名称 ……
在使用定义时同结构对象,如: n_tv_dept_var lst_dept
C:\\iknow\\docshare\\data\\cur_work\\348693431.doc
第6页 共15页
厦门智业软件工程有限公司.研发部 ZHIS4项目组文档
lst_dept.dept_code = ls_dept_code
.结构对象内部变量(属性)的命名无须用任何前后缀,如st_clinic.item_code .结构对象一般用于参数传递
1.9 SQL语法对象命名: 数据库对象类型 缩写 示例 sp_set_pres_status f_get_residence_no 说明 1 数据库游标(Cursor) 3 数据库后台函数(Fuction) 注意事项
.在PB脚本中定义时其[作用范围]不用标示;
.数据库的存储过程与函数类型的具体书写格式详见[3.2.8]与[3.2.0];
1.10 PBL库命名规范: PBL库存放对象 后缀 _n _uo _d 示例 cost_n.pbl cost_uo.pbl cost_d.pbl 备注 cur_ cur_pres_price f_ 2 数据库存储过程(Stored Procedure) sp_ 1 应用对象、工程对象、菜单对象、结构对象 2 不可视用户对象Custom UserObject 3 可视用户对象Visual UserObject 4 普通数据窗口(含外部数据源)DataWindow 5 子数据窗口DataWindowChild 6 全局函数Fuction 7 窗口对象Window 8 所有作废对象缓存,类似垃圾箱,不包含入应用
注意事项
<无> cost.pbl _dwc cost_dwc.pbl _fun cost_fun.pbl _win cost_win.pbl _z cost_z.pbl .不可视用户对象较少时可归入cost_uo.pbl中;子数据窗口较少时亦可归入cost_d.pbl中;其它的同理可都归入cost.pbl之中,可以0.5M为库文件合并的下限;
.pbl库文件以2M为上限,若大于此就要考虑拆分库文件,可用相似功能分类,如:cost_dw.pbl(其它数据窗)、cost_dw_stat.pbl(统计数据窗);当然,若难以分类可用数字区分,如cost_dw.pbl、cost_dw1.pbl、cost_dw2.pbl等等; .cost_z.pbl是个较特殊的库,它不用包含在应用pbt文件中,里面可放一些已删除的库对象,为了防止误删,养成好的习惯把这些对象移到这个专门的垃圾对象存放库是有好处的;
.以上pbl库命名规范,还有按对象类别归划的方法是针对在本子系统内部使用对象,至于那些要与其它子系统公用的对象,应把它们按功能归到一个单独的pbl库中,以利于其它子系统及时同步更新,这类pbl库命名要突出其功能,如login.pbl(登录模块),当然还可以加上子系统名称作前缀,如nurse_pres.pbl(住院医嘱管理),pbl库名称单词间同样要以“_”作分隔;
.另外有一点须要特别注意,以下几类对象在不同pbl库中有重名时编译时是不会报错的:不可视用户对象、全局函数、数据窗口对象,重名主要应是与公用库,这
C:\\iknow\\docshare\\data\\cur_work\\348693431.doc
第7页 共15页
厦门智业软件工程有限公司.研发部 ZHIS4项目组文档
要此起足够重视,包含新的公用库时要检查是否有与应用库冲突;
1.11 其它文件命名规范:
1.11.1 初始化配置文件:其命名与应用的名称一致,扩展名为.ini,如:nurse.ini 1.11.2 编译用资源文件:其命名与应用的名称一致,扩展名为.pbr,如:nurse.pbr 1.11.3 应用目标集文件:其命名与应用的名称一致,扩展名为.pbt,如:nurse.pbt 1.11.4 应用工作区文件:其命名与应用的名称一致,扩展名为.pbw,如:
nurse.pbw,一般都用统一的工作区文件zhis4.pbw
1.11.5 至于这些文件的放置目录及目录规范请参见《项目开发环境配置说明》;
2、 大小写规范:
2.1 大小写总则:单词间有下划线(_)分隔书写时全部小写,否则用首字母大写。
2.1.1 PB内部名称:均用首字母大写其余小写格式,使代码层次清晰:
2.1.1.1 PB保留字(关键字):This,Super,Parent,ParentWindow,True,
False,Return,Close,Halt,String,Decimal,Select,Update ……
2.1.1.2 PB内置函数:dw_detail.SetTransObject(Sqlca),SetFocus() 2.1.1.3 PB内置枚举变量:DataModified!,Question!,KeySpaceBar! 2.1.1.4 对象的属性:cb_save.Enabled = False,sle_user.Text = ls_user 2.1.1.5 数据库函数:Decode,SubStr //Oracle PL/SQL函数 2.1.1.6 其它未列出的属PB已定义命名的全部为单词首字母大写 2.1.2 程序员定义名称:全部小写;
2.1.2.1 局部变量:ls_physic_spec,ldw_master
2.1.2.2 控件名称:tv_return,cbx_show_msg,uo_dosage_date 2.1.2.3 函数及事件:f_menu_set,of_lay_cost,ue_reset_tree 2.1.2.4 数据窗列名:\"ic_card_id\",\"dept_code\"
2.1.2.5 系统参数名: ls_pool_day = f_get_sys_parm(\"lay_pool_day\") 2.1.2.6 数据库对象名、字段名等:base_dict(表),apply_no(字段) 2.1.2.7 其它未列出的程序员可自己命名的名称全部小写; 2.1.3 其它特例:
2.1.3.1 全局变量、共享变量、实例变量全部大写,对象定义除外,例如
idw_copy
2.1.3.2 本地参数名全部大写
ll_browse_day = f_get_ini(\"REGISTER_BROWSE_DAY\")
注意事项
.大小写规范仅是推存大家使用,并不要求一定要照上所述,若不按上述大小写风格,可采用本人较为熟悉的风格,如全部都小写,但整个子系统一定都要保持同一种风格,这是最基本的原则;
3、 脚本书写格式:
3.1 书写格式细则:
3.1.1 脚本书写以整洁美观为原则,注意代码的可读性第一、效率才是第二; 3.1.2 脚本不要写得太长,若超过200行,就应考虑拆分为多个子函数;
C:\\iknow\\docshare\\data\\cur_work\\348693431.doc
第8页 共15页
厦门智业软件工程有限公司.研发部 ZHIS4项目组文档
3.1.3 在条件语句中应多使用括号以避免二义性;
If ( Not Isnull(ls_status) ) And ll_row > 0 Then
…… End if
3.1.4 用分层缩进(缩排)的写法以显示嵌套结构的层次,缩排应以“Tab键”
来实现,绝对不能采用空格!缩进循环及其它复合语句中的代码,这样可以清楚显示代码间的包含关系,另外,要把单行注释与当前脚本程序的缩进位但对齐; //注释<1>
If ll_row > 0 Then //注释<2>
For i = 1 to ll_count
//注释<3> Next End IF
3.1.5 变量定义在程序段的开头,即尽量在用的地方才定义,但又不可太过分散,
相同类型变量放在一起,即按“代码功能段+变量类型”进行排序,且使用“Tab键”分隔变量类型和变量名,以保证上下两行的排列整齐;(非强制要求)
Long ll_row
String ls_physic_code String ls_physic_name
3.1.6 在大段注释与程序段,以及不同逻辑的程序段之间插入空行; 3.1.7 下列地方必须使用空格,以使程序看起来更清晰;(非强制要求)
3.1.7.1 所有操作运算符前后
ls_msg = ls_title + ls_error 3.1.7.2 函数参数之间
of_get_sick_name(ls_sick_id, ls_sick_name) 3.1.7.3 同一行声明的变量之间
Integer i, j ,k
3.1.8 当需要滚动显示时就应该分行书写,在续行时应把连接标记(如And,+)
放在行的末尾,续行处与前一行对齐;
ls_sql = \"Where apply_no = '\" + ls_apply_no + \"'\" + &
\" And apply_sub_no = '\" + ls_apply_sub_no + \"'\"
3.1.9 单行结构的语句推荐分解为多行,即每行只写一条语句如(非强制要求)
If ll_row > 0 Then dw_report.Retrieve() 应用如下写法,以示清晰 If ll_row > 0 Then
dw_report.Retrieve() End if
3.1.10 程序中应尽量避免出现“Goto”跳转语句; 3.1.11 SQL语句其关键字推荐应靠右对齐,参见[3.3]
3.2 常见PB控制语句格式约定:
C:\\iknow\\docshare\\data\\cur_work\\348693431.doc
第9页 共15页
厦门智业软件工程有限公司.研发部 ZHIS4项目组文档
3.2.1 If条件判断格式如下:
If ll_count = 1 Then //条件处理 Else
//注:当ll_count为空 3.2.2 Choose条件判断格式如下: Choose Case ll_percent Case Is > 80 Case 70 To 80 Case 60 Case Else End Choose 3.2.3 For循环语句格式如下: //仅当函数的返回值依赖于循环迭代的值(i)时才可在结构体中使用函数调用 ll_count = dw_query.RowCount() For i = 1 To ll_count Step 1 …… //循环体 Next 3.2.4 Do循环语句格式如下: Do …… Loop While True 或 Do While True …… Loop 3.3 常用SQL功能模块格式约定: 3.3.1 Select语句格式如下: Select name,sex,rate_type, Into :ls_name,:ls_sex,:ls_rate_type From sick_basic_info Where sick_id = :ls_sick_id For Update; If f_SqlErr()<0 Then Return –1 If Sqlca.SqlCode = 100 Then … 3.3.2 Update语句格式如下: Update dispensary_sick_cure_info Set doctor = :ls_doctor , register_status = :ls_register_status Where nullah_number = :ldc_nullah_number; If f_SqlErr ()<0 Then Return –1 If Sqlca.SqlnRows<>1 Then … //出错提示 3.3.3 Insert语句格式如下: C:\\iknow\\docshare\\data\\cur_work\\348693431.doc 第10页 共15页 厦门智业软件工程有限公司.研发部 ZHIS4项目组文档 Insert Into apply_sheet_detail_pool (apply_no, item_sequence, item_code, item_name ) Values(:ls_apply_no, :ldc_item_sequence, :ls_item_code, :ls_item_name ); If f_SqlErr ()<0 Then Return –1 If Sqlca.SqlnRows<>1 Then … //出错提示 3.3.4 Delete语句格式如下: Delete From prescribe_record Where prescribe_number = :ls_prescribe_number And prescribe_sub_number = :ldc_prescribe_sub_number; If f_SqlErr()<0 Then Return –1 If Sqlca.SqlnRows<>1 Then … //出错提示 3.3.5 游标操作过程如下: Declare cur_storage Cursor For Select Nvl(quantity,0),Nvl(retail_price,0) From physic_storage_table Where physic_code = :ls_physic_code For Update; Open cur_storage; If f_SqlErr ()<0 Then Return –1 Do Fetch cur_storage Into :ldc_quantity,:ldc_retail_price; If f_SqlErr()<0 Then Return –1 If Sqlca.SqlCode = 100 Then Exit … Loop While True Close cur_storage; If f_SqlErr()<0 Then Return –1 3.3.6 动态游标操作过程如下: Declare cur_data Dynamic Cursor For Sqlsa; C:\\iknow\\docshare\\data\\cur_work\\348693431.doc 第11页 共15页 厦门智业软件工程有限公司.研发部 ZHIS4项目组文档 ls_sql = \"Select Trim(physic_sorts_code), Trim(sorts_name) \" + & \" From physic_sort_dict \" + & \" Where super_code = ? \" Prepare Sqlsa From :ls_sql; If f_SqlErr()<0 Then Return -1 Open Dynamic cur_data Using :ls_super_code; If f_SqlErr()<0 Then Return -1 Do Fetch cur_data Into :ls_sorts_code,:ls_sorts_name; If f_SqlErr()<0 Then Return -1 If Sqlca.SqlCode = 100 Then Exit …… Loop While True Close cur_data; If f_SqlErr()<0 Then Return -1 3.3.7 动态SQL语句格式如下: ls_sql = \"Select * \" + & \" From lay_physic_pool \" + & \" Where physic_code = '\"+ls_physic_code+\"'\" + & \" And storage_code = '\"+ls_storage_code+\"'\" + & \" For Update \" Execute Immediate :ls_sql; //对多条数据行锁 If f_SqlErr()<0 Then Return -1 3.3.8 没有返回值(out)的存储过程操作过程如下: Procedure sp_set_pres_status(as_pres_no in char,as_pres_status in char) Declare sp_set_pres_status Procedure & For sp_set_pres_status(:ls_pres_no,:ls_pres_status); Execute sp_set_pres_status; If f_SqlErr()<0 Then Return –1 3.3.9 数据库函数与带有返回值(out)的存储过程操作过程如下: Fuction f_get_residence_no(as_sick_id in char) return long Declare f_get_residence_no Procedure & For f_get_residence_no(:ls_sick_id); Execute f_get_residence_no; If f_SqlErr()<0 Then Return –1 C:\\iknow\\docshare\\data\\cur_work\\348693431.doc 第12页 共15页 厦门智业软件工程有限公司.研发部 ZHIS4项目组文档 Fetch f_get_residence_no Into :ll_return,:ls_residence_no; If f_SqlErr()<0 Then Return –1 Close f_get_residence_no; If f_SqlErr()<0 Then Return -1 注意事项 .在数据库处理中一定要注意所有数据库操作都要进行容错处理、并发性控制; 4、 注释规范: 4.1 注释规范总则: 4.1.1 在会引起歧义、误会或不易理解、比较复杂的逻辑等类似地方一定要写注 释,但并不是注释越多越好,也应注意简洁明了,一目了然的语句或变量就不必加注释,注释能起到提纲挈领和引导解释的作用就可;所采用的语言首选“中文”; 4.1.2 PBL库文件、PB对象、全局变量、共享变量、实例变量、常量、函数、事 件一定都要写上完整清楚的注释; 4.1.3 程序段、局部变量等可依情况写明注释,不一定每处都要写; 4.2 注释规范实例: 4.2.1 PBL库文件注释: cost_win.pbl //窗口对象 login.pbl //登录模块 4.2.2 PB对象注释: d_sick_info //病人基本信息数据窗(姓名、费别等) f_get_sys_parm //获取系统表(sys_parm)参数 4.2.3 全局变量、共享变量、实例变量、常量注释:若知变量的取值范围也要一 并写明 Private: String IS_SICK_ID //当前病人ID号 String IS_APPLY_STATUS //单据状态:0.新开;1.扣费;2.执行 DataWindow idw_copy //数据窗拷贝存放对象 Constant String LAY_STATUS_NEW = 'NEW' //配药池新开态 4.2.4 函数、事件注释:有以下两种注释风格,若脚本较短,可采用简洁的,反 之亦然,即使是系统预定义的事件,若在其中写脚本也要加注释,即使是留着空注释,即“//”,以备后面添加,这样可以养成一种好的写书注释的习惯。 4.2.4.1 简单风格: // 在函数头部或事件开头写明功能概述 4.2.4.2 完整风格:参见[4.2.8] 4.2.5 程序段注释:功能代码代之间要分清写明注释,格式参见[4.2.8] 4.2.5.1 不易理解的分支条件、循环表达式加以注释; 4.2.5.2 冗长的函数、事件实现,应将其语句按功能分段加以概括性说明; C:\\iknow\\docshare\\data\\cur_work\\348693431.doc 第13页 共15页 厦门智业软件工程有限公司.研发部 ZHIS4项目组文档 4.2.6 局部变量注释:一般存放数据库字段的变量要写注释,其它依其名称所能 达意的程度而定,如i,j这类循环变量若也注释就有画足之感,总之要把握适度的原则,当程序段较为冗长时,这时变量也较多,易混淆之处就要多写注释; String ls_physic_spec //药品规范 Dec{3} ls_physic_min_dose //药品的最小剂量 Long i,j,ll_row 4.2.7 代码修改注释:若有多人或多次修改同一代码段,若是对修改没有把握时 就要把那段代码注释掉而不能删除,并在修改前后的地方加上修改人、日期;增加代码段用“Add”,修改代码段用“Modify”作注释; //========================================================== Add // 增加开始日期有效性检查.2002-08-01.Horse …… //========================================================== Add 4.2.8 脚本注释格式参考: //========================================================== // 这是主注释--介绍实现功能,实现方法等 //---------------------------------------------------------- // 参数列表 // 返回值 //---------------------------------------------------------- // 使用方法举例 //---------------------------------------------------------- // 备注 //========================================================== // 变量声明 ...... //----------------------------------------------------------1 // 这是段落注释1 ... //----------------------------------------------------------1 ...... ...... //----------------------------------------------------------2 // 这是段落注释2 ... //----------------------------------------------------------2 4.3 注释注意事项: 4.3.1 一定要保持注释与代码完全一致; 4.3.2 建议对于窗口、用户对象中建立统一的注释事件“ue_comment”,专门用来 介绍整个对象如何实现,怎样使用及相应的注意事项等; 4.3.3 注释可以写在与语句的同一行,也可以在上一行; C:\\iknow\\docshare\\data\\cur_work\\348693431.doc 第14页 共15页 厦门智业软件工程有限公司.研发部 ZHIS4项目组文档 5、 其它约定规范: 5.1 参数判断:对于公用接口的函数或事件一定要对参数的有效性进行检测; 5.2 函数返回值: ➢ 凡是出错时均返回<0的值,一般是-1; ➢ 对于返回值在调用处还要使用的,尽量采用“引用传参Reference”返回要使 用的值,以避免类似要返回Decimal类型时忘了改缺省的Integer类型而引起错误,此并不少见! ➢ 在从数据库取值的变量要记得进行空值容错判断,保证返回值不可为空,当然 需要返回空值的函数除外; 6、 总结: 6.1 一个具有良好编程习惯的程序员编写出的程序,基本上应有下列特点: 6.1.1 结构明晰,逻辑清楚,简单易懂; 6.1.2 变量、代码注释规范; 6.1.3 工程相关对象清楚、明确、分类合理; 6.1.4 最重要的一点是要保证一年后能够自己也看得懂(注释与文档); 6.2 规范的目的是杜绝所谓的“三无文档”(无文档、无注释、无控制),使得程序员 间交流更加方便; 6.3 除大小写规范可依程序员习惯而定外,其它规范都必须严格执行; 7、 参考资料: 7.1 董志强:PB编程经验汇编(第一版) 7.2 卢锦彬:PB编程规范(第二版) 7.3 李程扬:PB编程规范(第一版) 7.4 其它网上资料:见 \\\\Tank\\ZHIS4 Doc\\开发规范\\编程规范\\参考资料 C:\\iknow\\docshare\\data\\cur_work\\348693431.doc 第15页 共15页 因篇幅问题不能全部显示,请点此查看更多更全内容