【转载】PB编程规范及常见问题

一、开发标准与命名约定
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事件:当某个被拖曳控件放置到数据窗口控件上时触发。如在一数据窗口中拖曳排序;从一个数据窗口拖曳数据放到另一个数据窗口中,此时则用到DragDrop事件,拖曳结束需要写this.Drag(end!),取消拖曳写this.Drag(Cancel!)。

   (7) Editchanged事件:当用户在数据窗口控件的编辑控件中按任何按键时触发。

   (8)ItemError事件:当用户修改了字段、然后移走焦点、但数据未能通过该列的有效性检查时触发。该事件返回值得意义为:

          0--(缺省值),拒绝输入值并显示有效性检查出错信息,同时不允许移走焦点。

          1--拒绝输入值,但不显示出错信息,同时不允许移走焦点。

          2--接收输入值。

          3--拒绝输入值,但允许移走焦点。

        参数:◆Row--用户单击的记录行号,如果没有单击在行上,则该值为0。

              ◆Dwo--DWObject类型的值,存放单击的数据窗口内部对象的名称。

              ◆Data--string类型,用户输入的数据。

   (9) Itemchanged事件:当数据窗口控件中某个域被修改并且该域失去输入焦点(比如,用户按下了Enter键、Tab键或箭头键,或用户单击了数据窗口中其它域)时触发。该事件返回的意义为:

           0--(缺省返回值),接收新修改的值;

           1--不接收新修改的值且不允许改变输入焦点;

           2--不接收新修改的值但允许改变输入焦点。

          参数:◆Row--用户单击的记录行号,如果没有单击在行上,则该值为0。

                ◆Dwo--DWObject类型的值,存放单击的数据窗口内部对象的名称。

                ◆Data--string类型,用户输入的数据。

    注意:

数据窗口控件的对象函数AcceptText()、SetColumn()、SetRow()都会触发ItemChanged事件,因此,如果未做特殊处理,在ItemChanged事件的事件处理程序中不要使用这些函数,因为他们将可能导致死循环。

如果在ItemChanged事件中用到了Return 1则不能在LoseFocus事件中用函数AcceptText()。如果用了函数AcceptText()后则虽然用到了Return 1但仍然会接收修改的值并改变焦点。

   (10) Rowfocuschanged事件:当数据窗口控件的当前行被改变时触发。

          参数:◆currntrow--long类型,改变后的行号。

      注意:

        此事件主要用于对行的加亮,或一个(多个)数据窗口跟随一个窗口行的改变而过滤、提取数据。在编写此事件写上:if currentrow=0 then Return。

   (11)、Rowfocuschanging事件:当数据窗口的行将要改变时触发。在Rowfocuschanged之前触发。

         返回值:0--继续处理;1--阻止当前行的改变。

参数:◆currntrow--long类型,改变前(当前行)的行号。

newrow--long类型,将要变为当前行的行号。

即此事件触发完毕后的newrow即为Rowfocuschanged的CurrentRow。

       注意:

       SetRow、Retrieve、RowsCopy、 RowsMove、DeleteRow将会触发此事件。

编写代码:if currentrow=0 or newrow=0 then return

 

六、子数据窗口:

(1)             如果用到了子数据窗口,且设置了dddw的属性后,DropDownDataWindow将变为无效,需要用getchild函数重新得到子数据窗口。

(2)             必须设置Lines in DropDown 的值。

(3)             必须设置Width of DropDrow(%) 的值。

(4)             被选择的数据的字体必须与数据窗口中的字体一致。

(5)             必须设置empty string is null属性,否则会出现row changed between retrieve and update 的错误信息。

(6)             不允许选中Always Show Arrow项

(7)             被选择的数据要按照一定的规律进行排序。

(8)             子数据窗口的大小与其父对象的大小要合适。

(9)             display column 不能有重复的值,否则不能取得正确的data column。

七、标签(Tab):

21.              在没有应用新模板之前,当提示为空的列时,要提示出哪个tabpage的相应信息。

22.              窗口平铺时,各个tabpage页必须也平铺。

23.              当TabPage比较多时:

A:不选中Fixed Width复选框(标签的宽度可以随其标题的长短而自动变化);

B:不选中Regged Right 属性(不选中,则按控件的总宽度平均分配给每个标签相同的宽度,其结果是不管有多少标签页,它们都从控件的左边界一直延伸到右边界;反之选中,则系统按每个标签页标题的长度和Fixed Width设置的情况为每个标签页分配合适的宽度)。

八、程序所用的dll要整理,不能有多余的:

九、给用户的提示信息一般用text来进行提示,但是致命的错误或者需要长时间保存时必须用(messagebox)提示。

十、提取大批量数据时,一定要避免row are pendding意外数据库错误等问题出现。

十一、       设置的基础数据,如果在后续的程序中用到,修改(只有名称而无编号)、删除时应该做相应的判断。

十二、       窗口中的按纽或其他控件:

1.  据具体实际,必须控制其状态。比如对于tabpage中的某些内容不允许用户进行添、删则将这些按纽设置其disenabled。

2.  taborder的顺序必须以显示顺序为准;

3.  “保存”:

A: 窗口打开时,状态为Disenabled;修改数据后,状态为Enabled;保存后,状态为Disenabled;

B: 数据量比较小时,保存成功决不能出现messagebox(‘提示’,’保存成功!’)。

C: 保存时,提示某项为空,确定后绝对不能再出现:保存失败的提示。

4.  取消”与“关闭”按纽必须设置其 Cancel属性。

5.  窗口中的按纽应该居中,最好随同窗口动态调节按纽的位置与大小。

十三、       做程序时没用的窗口、数据窗口等各种对象一定要及时的去掉或移到一个没用的pbl中,以免程序中的垃圾越积越多、越来越庞大,致使谁都不敢动任何对象。

十四、       程序代码中注意:

1.删除一窗口中的所有的行,不能用此循环来删除所有的行:

            for I=1 to dw_1.rowcount()

                dw_1.deleterow(0)

            next

因为每一次循环都要重新计算rowcount,而I的值却在增长。我们可以反过来用下面的方法来解决。

For I=dw_1.rowcount() to 1 step -1

                Dw_1.deleterow(I)

            Next

           最好用下述两种方法:

(1)             删除多行:用rowsmove()函数。

(2)             删除所有行:用uf_deleteall()函数。

2. 关于触发自定义事件与pb自身事件的区别,以及其弊端。

           例如自定义事件ue_save不能用语句

错误:dw_x.triggerevent(ue_save!),而pb中原有的事件就可以如此用,例:pb_save.triggerevent(clicked!)。

            我们可以用以下几种来解决此问题:

                ①、dw_x.trigger event ue_save()

                ②、dw_x.event rowfocuschanged(dw_x.getrow())

                    ③、dw_x.dynamic event rowfocuschanged(dw_1.getrow())

弊端:将无法通过触发事件来捕获返回值,可以用窗口函数来得到返回值。

        3.关于setfilter函数。

如果setfilter中的变量 is null,那么系统将弹出一默认的过滤框请求用户输入过滤条件。

用setfilter(“”)来去掉过滤。

4.不要用date(oracle中的date实际上是datetime,它没有单独的date), 我们可以用:

date ldt_date

ldt_date=date(gnvo_wzgl.uf_get_sysdate())

dw_x.setitem(row,column,ldt_date)

但是绝对不能用:

ldt_date=dw_x.getitemdate(row,column)

dw_x.setitem(row,column,ldt_date)

也就是setitem和retrieve时可以用date或datetime类型的变量,但是如果取数必需用getitemdatetime。

6.  如果带两个(多个)数据窗口的窗口,在UPDATE时最好是先UPDATE最名细的,例如:dw_1和dw_2,dw_2根据dw_1的数据retrieve,则在保存时应该: if dw_2.update()+dw_1.update()=2 then,在dw_1的rowfocschanging 中一定的写上if currentrow=0 or newrow=0 then return。

7.  上下窗口(dw_1和dw_2两个数据窗口,dw_2根据dw_1的行的改变进行retrieve,)删除不同步:

(1)             其中一个原因是没有去掉按标题排序的属性造成的:例如:如果点击标题任意一项,此时getrow()得到的是1,而给用户显示的当前行可能不是1(蓝条显示)。删除dw_2的记录时会出现不对应的情况。

(2)             删除dw_1中的数据时,要注意dw_2中的rowfocuschanged事件与rowfocuschanging事件有时会出现rowcount() = 0而currentrow = 1 的情况。最好加判断:

         If currentrow < 1 then

                     return

End if

If This.RowCount() < 1 Then

                     Return

End If

(3)             

8.  用GetItemXX(row,column)时,column必须用列名。

9.  用Modify()函数处理数据时,如果处理关键性的必须判断返回值。

十五、       运行程序连不上数据库,与PB中当前所连的数据库没有关系,请查看ini文件与程序初始化文件中的参数是否对应以及本机上Oracle的客户端的所设的数据库别名与ini文件中的Servername中的值是否一致。

十六、       做程序要养成一个好的习惯,条例清晰,不保留没用的代码,不能给以后的开发人员、维护人员造成影响。调试用的一些messagebox等在提交前应全部去掉。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值