delphi7教程
软件程序编制规范
3.2、软件程序编制规范
3.2.1、编制程序:根据系统分析要求编制程序,要求实现代码的复用、算法的优化、程序代码的优化、发现数据库设计不合理的及时反馈,减少循环嵌套,基础数据避免重复更新,保证进入的数据就是齐全的、正确的。
3.2.2、程序自测:负责按测试方案进行自测,交付测试的程序不能出现不能正常运行、未按公式计算的简单错误。
3.2.3、程序测试:将完成的程序转系统分析人员按测试方案测试。
3.2.4、开发工具的程序编制规范:详见详细规范。
3.2.5、.net编程规范
一.安装方法:
1、安装IIS与frontpage扩展:点击控制面板,点击添加删除程序,选择添加删除WINDOWS组件,选
择应用程序服务器。点击详细信息,选择internet信息服务IIS,点击详细信息,选择frontpage 2002 server extensions与internet信息服务管理器,按向导提示点击下一步,然后放入系统盘。
2、要在防火墙退出的环境下进行安装,把网线拔掉。
3、放入第一张光盘,他会提示安装.net必备,放入第三张光盘,根据向导提示安装。安装完第一张、
第二张就可以运行.net了.第四、五、六张为MSDN帮助文件。(07.02.06添加)
3.2.6、Delphi7.0编程规范
第一部分:软件安装与控件安装方法
一、软件安装:光盘或网络安装后,将光盘CRACK目录下dent.slip拷贝到安装路径下。未注册信息将不再显示。
二、基本安装:
1、对于单个控件,Componet-->install component..-->PAS或DCU文件-->install;
2、对于带*.dpk文件的控件包,File-->Open(下拉列表框中选*.dpk)-->install即可;
3、对于带*.bpl文件的控件包,Install Packages-->Add-->bpl文件名即可;
4、如果以上Install按钮为失效的话,试试Compile按钮;
5、是run time lib则在option下的packages下的runtimepackes加之。如果编译时提示文件找不到的话,一般是控件的安装目录不在Delphi的Lib目录中,有两种方法可以解决:
1、反安装的源文件拷入到Delphi的Lib目录下;
2、或者Tools-->Environment Options中把控件源代码路径加入到Delphi的Lib目录中即可。
注意:所安装的控件是否与你所用的Delphi版本相适应。
三、控件删除:
在Component/Install Packages中删除。
选Component/configure Palette…
有pages和components两个区域
双击components区域,选中要删除得控件,下面有得Delete按钮
但系统提供的控件只能Hide,不能delete。
打开控件所在的包文件(*.dpk),从中删除控件那个文件,再重新编译该包即可
如果是整个控件包都要删除的话,project->Option->Packages,删掉那个packages
四、详细控件安装
1、 Ehlib控件
运行Ehlib.v3.4.for.Delphi5678\Ehlib v3.4\Delphi7\DclEhLib70.dpk文件,在弹出窗口中点击Conpile,再点击install,提示安装成功后在Delphi—Tools—Environment Options—Library—Library Path中添加路径Ehlib.v3.4.for.Delphi5678\Ehlib v3.4\Delphi7\
2、 Fastreport 控件
分别运行fastreport 2.53\source\fr7.dpk,
fastreport 2.53\source\ado\ FRADO7.dpk,
fastreport 2.53\source\BDE\FRBDE7.dpk,
fastreport 2.53\source\DBX\FRDBX7.dpk
fastreport 2.53\QueryBuilder\Source\dclOQB70.dpk
fastreport 2.53\QueryBuilder\Source\ADO\dclOQBADO70.dpk
fastreport 2.53\QueryBuilder\Source\BDE\dclOQBBDE70.dpk
fastreport 2.53\QueryBuilder\Source\DBX\dclOQBDBX70.dpk,
fastreport 2.53\QueryBuilder\Source\IBX\dclOQBIBX70.dpk文件,
在弹出窗口中点击Conpile,再点击install;
安装完毕后,在Delphi—Tools—Environment Options—Library—Library Path中添加路径:fastreport 2.53\source
fastreport 2.53\source\ado
fastreport 2.53\source\bde
fastreport 2.53\source\dbx
fastreport 2.53\source\ibx
fastreport 2.53\QueryBuilder\Source
fastreport 2.53\QueryBuilder\Source\ado
fastreport 2.53\QueryBuilder\Source\bde
fastreport 2.53\QueryBuilder\Source\dbx
fastreport 2.53\QueryBuilder\Source\ibx
3、Raize控件
分别运行Raize\RC3\Source\Rz30Ctls_Dsgn70.dpk,Raize\RC3\Source\ Rz30DBCtls_Dsgn70.dpk,在弹出窗口中点击Compile,再点击install;安装完毕后,在Delphi—Tools—Environment Options—Library —Library Path中添加路径:Raize\RC3\Source
4、VirtualTreeview控件
VirtualTreeview4.0.12\VirtualTreeview\Packages\VirtualTreesD7D.dpk文件,在弹出窗口中点击Compile,再点击install;安装完毕后,在Delphi—Tools—Environment Options—Library—Library Path 中添加路径:VirtualTreeview4.0.12\VirtualTreeview\Packages
5、xlreport控件
分别运行xlreport\xlr4pro123.exe和xlreport\xlr4dfull123.exe,注意安装过程中只保留delphi7和demo两个选项即可,安装完毕后将安装路径下的AfalinaSoft\XL Report 4\Source文件夹的所有文件拷到AfalinaSoft\XL Report 4\d7units中,运行d7XLR4_D.dpk文件;同样将
AfalinaSoft\ProOptionPack\Source内的所有文件拷到AfalinaSoft\ProOptionPack\d7units中,运行
d7OPack.dpk文件
五、第三方控件的下载与安装:用到的第三方控件在了解其用途后,经主任审批后,方可进行安装。
六、控件功能的学习方法:凡第三方提供的控件均有DEMO的演示示例,可根据所学知识查看其属性设置及事件,运行演示结果,便可学习控件的功能,领会其功能,做到灵活运用。
七、将经常用到的控件直接拖动放在前面,使用起来比较方便。
第二部分:程序设计要求:
一、所有代码必须有注释。所有代码单行的注释用(//),多行的注释用{},注释用中文。每段程序的注释说明要简洁明确,说明程序编制的目的及主要功能,按照系统分析文件的功能节点进行分段注释。每段开头与结尾分别用一行’/’包括。在每个功能段内部根据具体情况进行分段注释,每段开头与结尾分别用一行’/’包括。
1、程序(unit)头的注释:标明对应的系统分析文件名和最早开始编制时间。
2、函数(过程)(function, procedure)头的注释内容包括:
(1)函数(过程)的目的(purpose)。
(2)函数(过程)返回值(结果集)(return value)的类型及含义(程序标准事件不用标明)。
(3)函数(过程)参数(parameters)的类型及含义列表(程序标准事件不用标明)。
(4)函数(过程)中使用的临时变量(var)的类型及含义列表。
二、所有项目、窗口、单元、控件、菜单等按照命名规范命名。
1、项目命名:“P”+项目描述的第一个声码。
2、Form命名:使用系统分析文件的程序名拼音头字母命名窗口。如结存查询,窗口命名为jccx.再往下一级延伸的,在上级窗口名后加能区分要求的拼音头字母来命名。
3、Unit命名:Unit的名称(name)用字母U后跟相应的Form名称。
4、自定义过程、函数(procedure, function)命名:使用函数目的的拼音头字母命名。
5、简单变量、参数命名:使用变量含义的拼音头字母命名。
6、控件命名:一般情况下延用默认名。Query控件命名:query有复用的情况,命名时用qy1,qy2…标准命名,特定的query,命名时用“qy”+对应表名。
7、菜单命名:延用默认名,含右键菜单。
三、所有直接调用DBGridEh的录入类程序必须添加标准右键菜单。
四、所有查询类程序必须有序号、合计,合计用页脚方式,动态形成序号,必须添加标准右键菜单,窗口必须有caption,必须标明系统分析人员、程序编制人员,所有录入类、循环计算类不得出现MESSAGE框为SQL语句代码,所有编译后的程序设置的断点要清除。
五、所有窗口均按照1024X768设置,窗口显示位置为桌面居中位置(设置position属性为poDesktopCenter),大小为占桌面屏幕的1/4为适,所有窗口必须设置为置前属性(设置Formstyle属性为fsStayOnTop),保证调用子窗口时显示在最前。
六、Dbgrideh的菜单使用右键标准菜单,包含筛选、升序、降序、多行合计、导出excel,基础库维护时还要有多行替换功能。
七、所有月份数据要形成月份表,如qcsjb、mksyjlb,并同时修改查询程序,利用通用的月份查询函数,每个月底要进行结转。
八、所有连接非SQL数据库的表(接口程序除外),必须建立SQL表,维护后导出,不允许直接读写。
九、编制程序要充分考虑输入时的出错情况:判断是否输入了空格,是否输入了不合规则的内容,判断大小写,在程序中做出判断和限制。如包装入库数据,导出VFP时必须为大写,可以直接将录入的内容转换在大写,再如进入结存数据,先判断录入的产品是否是存在的产品,否则造成结存表中的数据不正确。十、所有单位引用统一、维护一致、显示顺序按照包装、加工、库……显示,考核汇报除外。
十一、对基础库维护信息都要记录,除记录字段更换信息外,还要求录入员和更新时间。
十二、实时计划、外贸业务、成本管理各类程序增加一级界面(点击主窗口按钮即显示的界面)时,均增加记录使用人、使用机器IP、使用计数信息,具体方法:在新增form的
onshow事件中增加程序类型(ssjh、unit1、cbgl)+‘.jrmk(self.Caption)’;
onclose事件中增加程序类型(ssjh、unit1、cbgl)+‘.lkmk(self.Caption)’;
语句,用于记录模块使用信息。
十三、用程序实现的数据更改,在程序试运行前必须经主任审批,主任不在时由代理人员审批。
十四、所有录入类、查询类中的必须录入项,如没有录入必须提示,否则不能执行。
十五、所有计算类程序实现,先查看数据类型,用QY连接实现公式计算的,参照SQL函数使用方法,用DELPHI连接字段或变量计算的,参照DELPHI函数使用方法。
十六、代码必须采用缩进格式表示嵌套,多层嵌套的也遵循此规则。标准格式,如下:
缩进快捷键:CTRL+SHIFT+I为向后,CTRL+SHIFT+U为向前,选中部分块后可以直接按快捷键操作。输写各层嵌套时可先将BEGIN……END对应,然后再进行嵌套。
while do
begin
if then
begin
if then
begin
end
else
begin
end;
end
else
begin
end;
end;
十七、跳转语句语法:
1、if 语句:会计算一个表达式,并根据计算结果决定程序流程。If保留字后跟随一个生成boolean值True或False的表达式。一般用“=”作为关系运算符,比较产生一个布尔型值。当表达式为True时,执行Then后的语句。否则执行else后的代码,if语句也可以不含else部分,表达式为False时自动跳到下一行程序。If语句可以嵌套,当使用复合语句表达时,复合语句前后需加上begin……end。Else保留字前不能加“;”,而且,编译器会将ELSE语句视为属于最靠近的IF语句。必要时,须使用begin……end 保留字来强迫else部分属于某一级的if 语句。
(1)、单个条件:
if 条件 then
A、待执行语句单行时:
执行语句;
B、待执行语句多行时:
begin
语句1…
语句2…
……
end;
(2)、选择条件:
If (条件1) and (条件2) OR(条件3)…… then
(3)、ELSE使用语法:
If 条件 then
语句1
Else
语句;
(4)、以上可以多层嵌套,每个嵌套里面均遵循以上语法。
2、case语句:
Case语句适用于被判断的变量或属性是整形、字符型、枚举型或子界型时用case语句进行逻辑跳转比编写复杂的if 语句容易阅读,而且程序代码整形较快。例:
Procedure Tform1.button1click(sender:Tobject);
Var
Number:integer;
Begin
Number:=strtoint(edit1.text);
case number of
1,3,5,7,9:label2.caption:=’奇数’;
0,2,4,6,8:label2.caption:=’偶数’;
10..100:
Begin
Label2.caption:=’在10到100之间’;
Form1.color:=clblue;
End;
Else
Label2.caption:=’大于100或为负数’;
END;
END;
END.
十八、循环语句语法:
1、repeat语句
i:=0;
repeat
i:=i+1;
writen(i);
until i=10;
2、 while 条件 do
begin
end;
3、升序:for i:=0 to a do/降序: for i:=a downto 0 do
begin
end;
十九、在应用程序中所有QY的connection设置为主FORM中的Adoconnection,所有的连接数据库设置均在INI文件中实现。
二十、多条语句不能写在一行,一条语句过长应分行写,分行尽量做到平均、层次性与语句的完整性。例:qy2.SQL.Add('update '+bm+' set jhdh=jhdh*'+qy1.FieldByName('lb').AsString+' '+
'where rq='''+zxrq+''' and gx='+''''+ListBox1.Items[ListBox1.ItemIndex]+''' '+ 'and charindex(xm,'+''''+qy1.FieldByName('sm').AsString+''')>0');
二十一、程序流程要清晰,一条sql语句实现的功能要单一。Sql查询结果使用虚拟表保存的,使用前后清除虚拟表。
二十二、使用else语句时要避免语句过长,造成if else混乱。
二十三、多个系统调用的模块,要形成DLL文件,要有模块使用记录,更新时同步更新。
二十四、遇到需要与VFP接口的程序,要将VFP表维护好以后形成SQL表,不能直接连VFP表,导出VFP 表后在原程序中使用。
二十五、sql与delphi常用函数对照、使用方法及注意事项:
1、在delphi程序中用变量取数据库表中字段值时,用DELPHI的类型对应SQL表字段中的类型来声明变量的类型。
2、在程序中执行SQL语句时,用SQL语句的语法。
3、经常用到的函数列表:
delphi sql
字段类型字符型string varchar,nvarchar,char,text 整型integer int
小数型double float,numeric
日期时间型tdatetime datetime
函数截取Copy(maskedit1.text,1,2) substring(rq,1,2)
字符位置
Pos(‘101’,qy1.fieldbyname(
‘bhxs’).asstring)
Charindex(‘101’,bhxs)
取小数位数
Round(4.5)=5;round(3.5)=3;函
数取值规则为四舍六入,五取偶,
Formatfolat(’0.00’,1.1234)
=’1.12’
Round(1.1234,2)=1.12
取整Trunc(4.9)=4 Round(1.1234,0)=1
类型转换
Inttostr(qy1.fieldbyname(‘d
dqs’).asinteger),floattostr
,strtoint,strtofloat,datetim
etostr
Cast(ddqs as varchar(10))
convert(int,a.LcLastDate+10-a.
sndate)
取长度Length() Len()
大写Uppercase()Upper()
小写Lowercase()Lower()
去空格Trim
去左边的空格Ltrim()
去右边的空格Rtrim()
举例如下:
je:=strtofloat(formatfloat(‘0.00’, qy1.fieldbyname(‘dj’).asfloat*
qy1.fieldbyname(‘ddqs’).asinteger));
qy1.sql.add(‘select round(cast(hgjs as float)/cast(jhjs as float),2)…’)
4、所有Format+类型的函数,返回的类型均为字符型,在使用时注意,类型要对应。
5、整形的字段进行数值计算时必须先转换成float型后再计算。
二十六、函数、过程的使用:
1、函数的声明:
函数头:
Function<函数名>(<形式参数表>):<类型>;
函数体:
Begin
<语句>;
<语句>;
……
<语句>;
END;
2、在函数体中必须有一个赋值语句,将函数的返回值赋给函数名。
例:
Function Total(x,y:integer):integer;
Begin
Total:=x+y;
End;
3、函数的调用:例:
Procedure Tform1.Button1Click(Sender:Tobject);
Var
X,y,z:integer;
Begin
X:=2;
Y:=3;
Z:=total(x,y);//调用函数
Label1.Caption:=inttostr(z);
End;
End.
4、函数在主FORM中声明,其它模块调用时,在USES窗口位置处,加引用的单元文件名,调用方法为FORM 名+“.”+函数名。按函数设置的参数赋值。
5、函数与过程的差异:过程的关键字为Proceduce,在函数声明中,必须指明函数的返回类型,而过程不需要返回任何类型的值,无需声明返回类型,在函数体中,必须将函数的返回类型赋给函数名,而在过程中则不存在此语句。
6、函数及过程其它要求:
A、函数体或过程内容的编制在FORM的begin……END范围之内进行编制,是单独的,不要含在其它的控件或事件之内。
B、函数或过程内容查看方法:按CTRL+SHIFT+鼠标点击,然后按向下箭头,便可达到函数体或过程内容。
C、函数体内容的编制方法:先进行函数或过程声明,函数/过程命令+FORM名+函数/过程名+(参数1:类型;参数2:类型;)注:返回的参数值与定义的类型一致,form名要与当前的FORM名一致,在BEGIN……end 之间编制实现功能。例:Procedure Tcbgl.sx1(component:string;form:string);
D、函数或过程引用:函数或过程所在的FORM名+“.”+函数或过程名+(参数1值,参数2值……),非参数定义的变量,要先赋值,再引用。例:cbgl.sx1(https://www.360docs.net/doc/75590003.html,,'ZZCLMX');
E、对不同的数据或通过参数赋值,执行同样的程序语句,多次复用的要抽出来做成函数或过程,以实现代码优化与复用。
F、跨月查询函数语句调用方法:当月表名不带月份时,调用fycx函数,带月份时调用fycx1函数。具体方法:函数名(起始日期,截止日期,'表名',1);
a:='';
a:=a+' select 字段 from '+zzbm[0]+' 条件';
for i:=1 to zzbm.Count-1 do
begin
a:=a+' union all select 字段 from '+zzbm[i]+' 条件';
end;。
二十七、公共属性部分:
1、虚拟表命名方法:#+表名;
2、判断虚拟表是否存在,如果存在则删除:
qy1.Close;
qy1.SQL.Clear;
qy1.SQL.Add(‘if object_id(‘’tempdb..#1’’) is not null’);
qy1.SQL.Add(‘drop table #1’);
qy1.execsql;
3、创建虚拟表方法:
a.qy1.Close;
qy1.SQL.Clear;
qy1.SQL.Add(‘if object_id(‘’tempdb..#1’’) is null’);
qy1.SQL.Add(‘create table #1(字段名字段类型)’);
qy1.execsql;
b.qy2.Close;
qy2.SQL.Clear;
qy2.SQL.Add(‘select * into #1 from jcb’);
qy2.execsql;
4、对虚拟表进行更新和追加时,要使用update和insert语句,不能使用edit和append,避免出现忽
略数据库名称的错误。
5、对虚拟表使用后要进行清除,避免再次调用时系统报错。
三十、调试程序:当程序出现错误不好查明原因,或运算结果不是想要的结果时,可以进入调试程序,跟踪运行阶段的各个状态,以便更好地分析错误的原因。
1、单步执行:run-step over/f8,单步执行将把整个过程或函数当做一行,调试器每执行一行,当前执
行点就自动移到下个要执行的行。
2、跟踪执行:run-Trace into,一次只执行一行,当执行到有过程或函数调用的行以后,当前执行点将
进入过程或函数的内部。
3、跳过一段代码:RUN-Run To cursor,以非调试方式执行到光标所在的行,然后调试器接管对程序运行
的控制,还可以再选择单步或跟踪执行。
4、返回到执行点:RUN-Show Execution Point,如果已执行完,调试器将重新打开此窗口。
5、暂停运行:Run-Program Pause:使程序运行暂时停止。
6、重新开始运行:Run-Program Reset,终止程序的运行并释放所有占用的内存和资源,并闭所有打开
的文件,清除所有的变量设置,然后重新运行程序,但不删除先前设置的断点和观察窗口。
三十一、如果在表中设置字段的默认值,录入时经常出现“键列信息不足”,所在在编制程序时,所有字符型字段取值=isnull(字段名,’’)。---08.07.08增
第三部分控件的详细使用方法
一、模块设置方法:
1、将单元文件拷到相应的工程文件夹下,打开工程文件后再打开单元文件。
2、点击Project->Addtoproject,选择相应的单元文件加入工程。
3、点击Project->options,进入工程属性设置界面,在forms界面可以选择主界面main form;在application可以设置exe文件图标icon。
4、单元文件的声明:在单元文件程序代码窗口中,implementation 和{$R *.dfm}两部分中间添加uses 加main form的单元文件名,如果当前单元文件需要调用其他单元文件、或者其他单元文件的控件、虚拟表或者其他公共变量时,还需要在uses后添加其他单元文件名,例如:
implementation
uses ucbgl(main form,主要利用它的ADOConnection、各类函数、过程),usjcx(公共窗口),uyhdl (登录窗口,主要利用它保存的登录人相关信息);
{$R *.dfm}
5、将单元文件中的数据连接控件query的Connection属性设置为工程main form中的ADOConnection控件名。
6、在总菜单中添加新增的按钮的caption属性,及onclick事件程序,例如
If Application.findcomponent(‘cgjhtb’)=nil Then
Application.CreateForm(Tcgjhtb,cgjhtb);
cgjhtb.show;
并记录下此按钮的名称(name)。
7、在本单元用到系统自带函数或类时,在interface 下uses 中进行定义。例:inifiles
二、权限设置方法:控件:standard--ActionList1
1、双击main form的actionlist1,双击后点击new action,添加新的actions,命名为”q”+form名。
定义actions的caption属性为新增按钮的caption属性,actions的onexecute事件定义为按钮名称。
2、设置新添加按钮的action事件,选择对应的actions(“q“+FORM名)。
3、删除自动创建项,减少程序运行时占用内存,点击Project->Viewsource打开工程文件将相应Application.CreateForm(Tform, form);语句删除,只保留主FORM与用户登录的创建语句。
4、菜单权限设置方法(以实时计划8.0设置为例):
A、执行实时计划8.0中的权限管理菜单下的权限管理按钮,查看新添加的按钮的上级模块的模块数及命
名,填写在上级模块对应的2文本框中,根据显示当模块总数,并在新增模块中对应的2个文本框中填写新增按钮的模块数(模块总数+1),及新增按钮的caption属性,点击确定。
B、选择需添加权限的角色,在左边的系统资源中添加、更改选择角色的权限。如果还没有该角色,则首先在上、下角色框中分别输入上级角色、角色后点击添加按钮。
三、事务处理使用方法:
当更改性操作数据均要求使用事务处理,输入类、计算类均要求使用事物处理,可以重复计算且计算量大的、数据感知控件直接更新数据库数据的,为减少服务器负载,可以不用事务处理,示例如下:
cbgl.ADOConnection1.BeginTrans;(把要执行的语句放入内存)
TRY(开始试执行)
更新或计算语句
https://www.360docs.net/doc/75590003.html,mitTrans;(把已经更新的数据更新到数据库中,释放内存)提示执行完毕,在运行过程中使用时不用提示。
Except
如果执行不成功
cbgl.ADOConnection1.RollbackTrans;(执行数据回滚,把已更新的恢复到未执行状态)提示未能执行,计算类的关闭窗口,录入类的,清空已输入的内容。
end;
四、ADOConnection控件使用规范,控件:ADO--ADOConnection1
1、commandtimeout:连接自动跳出时间,设置为200;
2、connectionstring:设置数据库的连接属性;
3、loginprompt:是否输入用户名和密码;
4、ADOConnection连接数据库设置方法
(1)静态连接:
点击ADO,点击ADOConnection,设置其属性connectionstring为数据库的连接属性。Loginprompt设置为FALSE,在运行程序时不提示数据库的密码录入界面。点击ADOQUERY设置connection属性为相应的ADOConnection名。
(2)ini文件连接方法:
ini:=Tinifile.Create(ExtractFilePath(Application.ExeName)+'cbgl.ini');
ADOConnection1.ConnectionString:='Provider=SQLOLEDB.1;password='+pw+';Persist Security
Info=False;User ID=SA;Initial Catalog='+ini.ReadString('SERVER','DATANAME','')+';
Data Source='+ini.ReadString('SERVER','servername','');
(3)注意事项:使用INI文件连接时,connectionstring为空。
五、日期设置标准方法:使用MaskEdit控件,控件:additional--MaskEdit1
1、设置MaskEdit属性为!99/99/00;1;,并将character for blanks设置为‘‘
2、设置MaskEdit的autoselect属性为false
3、在form的oncreate或onshow事件中增加
DateSeparator:=’.’;
ShortDateFormat:=’yy/mm/dd’;实现日期格式为‘ . . ’。
4、在控件onchange事件增加
IF MaskEdit1.SelStart=8 THEN selectNext(ActiveControl, True, True);
使输入完毕自动移到下一焦点。
六、query控件的使用方法,控件:ADO-ADOQuery1
1、查询类数据:
qy1.close;
qy1.SQL.Clear;
qy1.SQL.Add(‘select……’);
qy1.Open;
2、更改类数据:
qy1.close;
qy1.SQL.Clear;
qy1.SQL.Add(‘update……/insert……’);
qy1.execsql;
3、对数据进行更改的方法:
a.qy1.edit ……qy1.post;
b.SQL语句‘update 表名 set 字段=’+’’’’+变量值(非字符型要转换成字符型)+’’’’
C.注意引号的用法。
4、追加、插入数据的方法:
a.qy1.append……qy1.post;
b.SQl语句‘insert into 表名(字段名,……) values(‘+’’’’++’’’,……)’
5、SQL语句中常量、变量调用标准:
a.常量前后要添加两个半角单引号,即’’常量’’,例select * from mlb where dw=’’包装一车间’’,特别注意字符用双引号;
b.变量必须转换为字符型再引用,引用方法’+’’’’+变量+’’’,’+inttostr(变量)+’,例
select * from mlb where dw=’+’’’’+dlid.dw+’’’;
6、动态建立索引方法:SQL语句’create index 表名 on 索引名 (索引字段)’
7、设置QUERY控件commandTimeout属性值为200,单位为秒,特殊情况可适当延长。
8、设置query的connection属性为相应的ADOconnection控件名,一般引用程序主窗口的ADOconnection。
七、Dbgrideh使用规范,控件:Ehlib-DBGridEh1
1、Datasource属性。选择数据来源,点击下拉框显示本单元或其他在本单元声明使用单元的datasource 控件。
2、AllowedOperations属性:设置每条记录的属性,alopInsertEh 允许插入,alopUpdateEh 允许更
新,alopDeleteEh 允许删除,alopAppendEh允许追加。
3、Align属性。设置Dbgrideh显示方法。Alleft为靠左显示;alright为靠右显示;Altop为靠上显示;albottom为靠下显示;alclient为充满窗口;alnone为保持编译程序时位置。
4、colunms属性。点击按钮显示列名列表。点击某行按F11显示此行属性。
(1)fieldname。输入对应结果集字段。
(2)title属性的caption属性为列标题。
(3)footers。点击按钮显示foot列表。点击某行按F11显示此行属性。
A.fieldname。输入对应结果集字段
B.Valuetype。选择对字段的操作。Fvtavg求平均值;fvtsum求和;fvtcount计数;fvtfieldvalue 显示结果集最后一条记录值;fvtnone无操作;fvtstatictext为静态值;
(4)Readonly设置字段为只读。
(5)width为列宽度。
(6)wordwrap为是否自动折行。
(7)visible设置列是否可见。
(8)displayformat:设置显示格式,例如日期型字段可设置为“yy.mm.dd”,双精度型字段可以定义小数位数,3位“0.000”。
5、EditActions:对整个DBGRIDEH的属性设置,geaCutEh 允许剪切,geaCopyEh 允许复制,geaPasteEh 允许粘贴,geaDeleteEh 允许删除,geaSelectAllEh允许全部选择。
6、options的dgmultiselect属性设置多行选择。
7、optionseh的dghenterastab设置响应回车键换列,会自动跳过只读列,到一列焦点。
8、footerrowcount设置页脚行数。
9、sumlist的active属性设置页脚计算是否生效。
10、visible设置控件是否可见。
11、Rowsizingallowed属性设置是否自动折行。
12、popupmemu选择弹出菜单。
13、Readonly设置控件是否为只读。
14、Borderstyle设置是否有网格线。
15、Drowmemotext设置textx型和image型字段是否显示原内容。
16、Font属性设置显示字体。
17、Titlefont设置标题字体。
18、Usemultitile设置是否使用父子标题。具体设置方法:
(1)将Usemultitile设置为true;
(2)将各列的标题caption属性设置为“父标题|子标题”的形式
19、enabled设置焦点是否可控。
20、其他属性保持默认值。
21、建立页脚合计的方法:
(1)设置Dbgrideh的footercolor为clYellow;
(2)设置Dbgrideh的footerrowcount为1;
(3)设置Dbgrideh的sumlist-active为true;
(4)双击Dbgrideh,点击相应的字段属性中的footers按钮,在弹出框中点击添加按钮,新增一个合计字段后,设置其属性fieldname为相应字段名,并选择valuetype;
(5)动态设置页脚合计方法:
DBGridEh1.SumList.Active:=true;
DBGridEh1.footerrowcount:=1;
DBGrideh1.FooterColor:=clYellow;
DBGrideh1.Columns[0].Footer.ValueType :=fvtcount;
DBGrideh1.Columns[1].Footer.ValueType :=fvtSum;
注:valuetype类型介绍:fvtAvg 平均值,fvtCount 记录条数,fvtfieldname 字段名,fvtnone 无,fvtStaticText 文本内容,fvtSum 合计值
(6)自动调整宽度设置方法实例:在窗口的onshow事件中增加以下语句
for i:=0 to dbgrideh1.columns.count-1 do
dbgrideh1.Columns[i].OptimizeWidth;
https://www.360docs.net/doc/75590003.html,st;
22、颜色设置:
在ondrawcolumncell事件中进行设置:
if qy1.FieldByName('tjsp').AsBoolean=true THEN//条件
DBGridEH1.Canvas.Brush.Color :=cllime;//浅绿色,$00BAFFB0为绿色,clred为红色,clyellow 为黄色。
DBGridEH1.DefaultDrawColumnCell(Rect,DataCol,Column,State);
23、主从DBGRIDEH的设置:
从表的Query的Datasource是主表的datasource,从表的对应字段=:主表的对应字段,字段为主从关系的关联字段。
八、ComboBox控件的使用,控件:Standard-ComboBox1
1.静态设置items属性:点击items属性后的edit按钮,在编辑框中直接输入选项内容。
2.动态设置items属性:通过query将选项搜出后进行循环,追加到items属性中,例如,往ComboBox1
中追加单位名称,
ComboBox1.Clear;
qydw.close;
qydw.SQL.Clear;
qydw.SQL.Add('select dw from mlb order by sxh');
qydw.Open;
while not qydw.eof do
begin
ComboBox1.Items.Add(qydw.FieldByName('dw').asstring);
qydw.Next;
end;
九、Fastreport使用规范,控件:Fastreport-frReport1,双击后进入报表设计界面。连接FORM的QY时用frDBDataSet1,连接Fastreport里QY时用frADOComponents1。
1、Band的使用。
(1)报表标题。在报表第一页显示,点击“插入矩形框/Memo”,双击后可以编辑标题显示内容。
(2)报表合计。在报表最后一页显示,可以放入Memo框显示数值合计、报表注释。
(3)页头。在每页开头显示,如果第一页有报表标题,则在报表标题后显示。当明细数据标题需要在每页显示用于显示明细数据标题。
(4)页脚。在每页最后显示。一般用于显示页号。
(5)主项头。只在数据集开头显示,当明细数据标题不需要在每页显示时可以用于明细数据标题。(6)主项数据。显示数据集。设置datasource确定数据来源。放入Memo框显示数据集字段,例如[dialogform.qy1.”sono”]。
(7)主项脚。紧跟主项数据显示,用于显示数据集合计值。放入Memo框显示数据集字段合计值,例如[sum([dialogform.qy1.”pkgnum”])]。
(8)细项头。当需要显示主从表时,显示从表明细数据标题。
(9)细项数据。显示从表数据集。设置datasource确定数据来源。放入Memo框显示数据集字段,例如[dialogform.qy1.”sono”]。同时设置细项数据数据来源的主从关系。
例如主项数据数据源为dialogform.qy1, 细项数据数据源为dialogform.qy2, dialogform.qy2的datasource需要设置为dialogform.qy1。
(10)细项脚。紧跟细项数据显示,用于显示数据集合计值。放入Memo框显示数据集字段合计值,例如[sum([dialogform.qy2.”pkgnum”])]。
(11)子。其他Band类型有childband属性,设置后子紧跟此Band显示。
2、对话框。
(1)添加对话框。在设计界面页头点击右键添加对话框。在对话框添加各种控件。
(2)ADO Query控件。Database设置connection.Datasource设置主从表关系。Name为Query名。(3)其他控件与delphi标准控件方法相同。
3、变量引用方法:
(1)报表变量:在frReport控件的ongetvalue事件中给变量赋值后(if ParName='dw' then ParValue:=dlid.dw;),直接在报表中用[dw]的形式进行引用。
(2)query字段的引用:a.利用对话框中的query时,用[dialogform.qy1. "mjbh"]的形式引用;b.利用form中的query时,首先增加frDBDataSet控件的dataset属性,设置相应数据源,再利用[qy1. "mjbh"]的形式引用。
4、常用报表函数:a.[LINE#] 自动增长序号;b.[PAGE#]当前页码, [TOTALPAGES]总页码(设置总页码时要将通过报表-文件-报表设置中的两遍报表打上勾)
5、报表建立基本步骤:
(1)增加报表需要的band和矩形框及其具体内容。
(2)连接数据源,并根据变量引用方法设置好报表数据。
(3)通过报表-文件的报表设置和页面设置完善报表。
6、报表调用方法:
frReport1.LoadFromFile(extractfilepath(paramstr(0))+'报表\报表名.frf');
frReport1.PrepareReport;
frreport1.ShowPreparedReport;
十、Xlreport,控件:xlReport--xlReport1
https://www.360docs.net/doc/75590003.html,为控件名称,例如XLREPORT1。
2.XLSTemplate为模板存放路径,一般设置为打包软件默认路径。
3.模板设计
(1)进入模板文件,显示数据集单条数据可以在单元格中输入’=’+query名+’_’+字段名,例如
=qy1_sono。设置XLREPORT控件的Datasource属性,点击后,点击ADDNEW,选中当前行,设置Alias、Dataset属性为qy1。
(2)进入模板文件,显示数据集多条数据,例如在D12输入=qy2_itemno后,将A12至D13之间的区域选中,点击插入->名称->定义,输入区域名称’range1’, range1左第一列必须是空,定义时range必须包含空列,点击添加,在excel模板中添加区域range1。设置控件的Datasource属性,点击后,点击ADDNEW,选中当前行,设置Alias、Dataset属性为qy2, mastersource设为qy2,Range设为在EXCEL表中定义的RANGE的名称,此例为:range1。
(3) 生成报表时调用:控件名(XLREPORT1).Report;
(4)excel设置:点击工具-->宏-->选择安全性,在第二页可靠发行商,在信任对于“visual Basic项目”的访问,有此类相关程序,在使用前通知用户进行设置。
十一、Raize控件使用规范,控件-RaizePanels
1、Raize Panel
1)Align属性。设置Raize Panel在窗口上的显示属性。alleft为靠左显示;alright为靠右显示;altop 为靠上显示; albottom为靠下显示;alclient为充满窗口;alnone为保持当前位置。
2)Caption属性设置控件标题内容。
3)Font属性设置显示字体。
4)Height为列宽度。
5)width为列宽度。
6)Taborder为当前控件的焦点序号。
7)visible设置控件是否可见。
8)其他属性一般保持默认值。
2、Raize Edit
1) Align属性。设置Raize Edit在窗口上的显示属性。alleft为靠左显示;alright为靠右显示;altop
为靠上显示; albottom为靠下显示;alclient为充满窗口;alnone为保持当前位置。
2)Charcase属性:设置输入字母大小写属性。ecNormal为以输入为准;ecLowerCase为始终小写;
ecUpperCase为始终大写。
3)Readonly设置字段为只读。
4)Height为列宽度。
5)width为列宽度。
6)Taborder为当前控件的焦点序号。
7)Tabonenter为回车键到下一焦点是否生效。
8)visible设置列是否可见。
9)其他属性保持默认值。
3、Raize DBEdit
1、除包含Raize Edit所有属性外,还有
1)Fieldname属性:输入对应结果集字段。
2)Datasource属性。设置数据来源,直接输入或点击下拉框显示的本单元和其他在本单元声明使用单元的datasource控件。
4、Raize RzComboBox
1)Align属性。设置Raize Edit在窗口上的显示属性。alleft为靠左显示;alright为靠右显示;altop 为靠上显示; albottom为靠下显示;alclient为充满窗口;alnone为保持当前位置。
2)Charcase属性:设置输入字母大小写属性。ecNormal为以输入为准;ecLowerCase为始终小写;ecUpperCase为始终大写。
3)Items属性:设置RzComboBox的下拉菜单内容。
4)Readonly设置字段为只读。
5)Height为列宽度。
6)width为列宽度。
7)Taborder为当前控件的焦点序号。
8)Tabonenter为回车键到下一焦点是否生效。
9)visible设置列是否可见。
10)其他属性保持默认值。
5、Raize RzDBComboBox
除包含Raize Edit所有属性外,还有
1)Fieldname属性:输入对应结果集字段。
2)Datasource属性。设置数据来源,直接输入或点击下拉框显示的本单元和其他在本单元声明使用单元的datasource控件。
6、RzSizePanel:实现用户随意调整高度和宽度,使用方法:
(1)将RzSizePanel控件的align属性(Raize Edit在窗口上的显示属性。alleft为靠左显示;alright 为靠右显示;altop为靠上显示; albottom为靠下显示;alclient为充满窗口;alnone为保持当前位置)设置好,建议不要用alclient,否则该控件不起作用;
(2)将用户可以调整的控件,如DBGridEh控件放置到RzSizePanel上,并设置DBGridEh的align属性为alclient。
十二、存储过程,控件:ADO-ADOStoredProc1
1、存储过程格式
创建存储过程
Create Proc dbo.存储过程名
存储过程参数
AS
执行语句
Return
执行存储过程
GO
2、变量
(1)、变量的声明:变量时必须在变量前加@符号
DECLARE @A INT
(2)、变量的赋值,变量赋值时变量前必须加set
SET @A = 30
(3)、声明多个变量
DECLARE @s varchar(10),@a INT
例如:
CREATE Procedure SoCtrl_SCGL(@Sono Varchar(30))
As
Declare @FPkgNo Varchar(30),@FOrderNo varchar(50), -- 形式
@Type2 Varchar(30),@Type3 Varchar(30),@ShipMent DateTime,
@ItemLNo Varchar(100),@TTRATE FLOAT,@TTAMT FLOAT
--获取可户包装号,定单号
Select @FPkgNo=FPkgNo,@FOrderNo=Case When CharIndex('-',isNull(HisNo,0))=0 Then ''
Else Left(HisNo,isnull(CharIndex('-',HisNo),0)-1)
End,@ShipMent=Shipment,@TTRATE=TTRATE,@TTAMT=TTAMT,
@ItemLNo=ItemLNo From Soctrl Where Sono=@Sono
Delete From SoDtl5 Where Sono=@Sono
--刷新商品编号
Update SoDtl Set ItemNo=Cphh.FItemName
From SoDtl S ,MD_CPHH CpHH
Where S.HIsNo=CpHH.FCphh And S.Sono=@Sono And ((S.ItemNo='') or (S.itemno is null))
GO
3、存储过程调用方法:通过ADOStoredProc控件调用
(1)、设置ADOStoredProc的connection属性为mainform的ADOconnection名;
(2)、设置ADOStoredProc的Procedurename为在数据库中创建的存储过程名;
(3)、执行ADOStoredProc1.ExecProc;语句执行存储过程。
(4)、在调用存储过程之前,先给定义的参数进行赋值。
十三、导入导出数据:
1、导入vfp数据到SQL的应用
(1)、在form的implementation之前位置声明函数
function SQLDisconnect(hdbc:double):integer;
stdcall;
external 'ODBC32.DLL';
function SQLConfigDataSource(hwndParent: Integer; fRequest: Integer;lpszDriverString: String; lpszAttributes: String): Integer;
stdcall;
external 'ODBCCP32.DLL';
(2)、在执行导入数据程序的事件名称后声明const ODBC_ADD_SYS_DSN=1;
(3)、在执行导入的程序中首先带入参数,执行SQLConfigDataSource函数,例如:SQLConfigDataSource(0, ODBC_ADD_SYS_DSN, 'Microsoft Visual FoxPro Driver'+ CHR(0), 'dsn=dz' + CHR(0) +
'BackgroundFetch=Yes' + CHR(0)+ 'Description=descripcion de la conexion' + CHR(0)+
'Exclusive=Yes' + CHR(0) +'sourceDB=C:\'+ CHR(0) +'Sourcetype=DBF');
定义了接口程序所有ODBC的名称为dz,连接属性为Microsoft Visual FoxPro Driver,连接路径为C:\,连接文件类型为DBF文件。
(4)、新建ADOconnection控件ADOconnection2连接ODBC名称dz:首先点击ADOconnection2的connectionstring属性,选择提供程序为ODBC Drivers,并设置数据源名称为dz后,测试连接。(5)、新建query控件qydz,设置其connection属性为ADOconnection2,再通过query的标准用法就可以查询出对应dbf文件名的内容。
2、将SQL数据导出为vfp表的应用
(1)、删除对应路径下、文件名为导出的dbf类型的文件,例如:DeleteFile('c:\'+bm1);
(2)、新建ADOConnection控件ADOConnection2,并动态设置其连接属性,将要导出的内容导出到固定的vfp表,例如:ADOConnection2.ConnectionString:= 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\;'+'Extended Properties=dBase 5.0';
ADOConnection2.Execute('select * into kq from kqhz IN [ODBC] [ODBC;Driver=SQL
Server;UID=aa;PWD=aaa;Server=jnmd;DataBase=ckyw] ');
ADOConnection2.Close;
十四、Treeview 控件使用方法
1、设置items属性:
(1)、new item:增加新的节点;
(2)、new subitem 为当前节点增加新的子节点;
(3)、delete 删除当前节点;
(4)、load 导入节点;
(5)、TEXT:显示文字;
(6)、Image Index:显示图形序号;
(7)、Selected Index:选中时的序号;
(8)、State Index:状态序号;
2、新增RZPageControl控件,并添加多个TabSheet页面,使treeview控件的每个节点都有对应一个TabSheet页面。
3、在TreeView1Click事件中写入点击每个节点时的响应事件,例如
with Treeview1.Selected do
begin
jcwh:=Treeview1.selected;
with RZPageControl1 do
begin
case jcwh.SelectedIndex of
1:begin
ActivePage:=TabSheet1;
……
end;
2:begin
ActivePage:=TabSheet2;
……
end;
……
end;
4、根据界面设计需要,多页显示的控件可设置可视不可视,以达到美化界面的效果。
十五、chart控件使用方法:控件--Additional
1、双击chart控件,在chart页title页,录入显示内容,以湿压强度为例:可以录入湿压强度曲线图。
2、在chart页series页,点击ADD,会显示各种图,根据需要进行设置,在下面的框3D前打勾,为3D模式,否则为普通模式。
3、设置SERIES页中datasource属性,设置为randomValue。
4、用query控件搜出相应的记录,通过循环和DBChart1.Series[0].add()函数,将每一条记录加载series中,例如:
qy1.Close;
qy1.SQL.Clear;
qy1.sql.Add('select rq,avg(syqd) as syqd from xssjb '+
'where sydw=''铸造一车间'' and rq>=''06.12.01'' and rq<=''06.12.31'' '+ 'group by rq');
qy1.Open;
qy1.First;
DBChart1.Series[0].Clear;
while not qy1.Eof do
begin
BChart1.Series[0].add(qy1.fieldbyname('syqd').AsFloat,qy1.fieldbyname('rq').AsStr
ing,200);
qy1.Next;
end;
add有三个参数:第一个参数为图表y轴的数值;第二个参数为图表x轴的数值;第三个参数为图表中该点的颜色(clteecolor为默认颜色红色)。
5. add函数标准形式:function addxy(const axvalue,ayvalue:double;const axlabel:string;acolor:tcolor)):longint;其中,参数axvalue,zyvalue表示点的横坐标和值,axlabel 为横坐标签,acolor为点的颜色。
6、常用的series类型:
1)line:用折线将各点连接起来的形式绘制图表;
2)area:用这项将序列各点连接起来,还要将折线与x轴之间进行填充。
3)point:用一组点的形式显示series中各个点。
4)bar:用垂直的直方图绘制图形,每一个直方条代表一个series点。
5)Horizontal bar:与bar相似,只不过是用水平方向的直方图绘制图形。
6)pie:用圆饼图绘制图形,每一个series点是圆饼中的一个扇形。
7、常用属性:
1)active:设置序列是否在图表上显示。
2)datasource:设置为序列提供的数据的数据源。
3)xvalues:序列的横坐标数据。
4)yvalues:序列的纵坐标数据。
5)xlablessource:序列的横坐标标签的数据来源。
6)seriescolor:绘制序列是所用的颜色。
8、常用事件:
1)afterdrawvalues:序列中的点被绘制后触发。
2)onbeforedrawvalues:序列中的点被绘制前触发。
3)onafteradd:序列中插入一个点后触发。
4)onbeforeadd:序列中插入一个点前触发。
5)onclearvalues:当调用clear方法或delete方法删除序列中的点时触发。
第四部分:常出错现象及原因分析
一、内存地址错误提示如下:
原因分析:在创建FORM时,在PROJECT的VIEWSOURCE里创建了FORM,在整理时以减少内存已清除,调用下级FORM,赋初始值时,需在创建后执行语句,然后显示。修改内容如下:
If Application.findcomponent('jjhzcx')=nil Then
Application.CreateForm(Tjjhzcx,jjhzcx);
jjhzcx.qy1.Close;
jjhzcx.qy1.sql.clear;
jjhzcx.qy1.sql.add('select * from #gz');
jjhzcx.qy1.open;
jjhzcx.qy2.Close;
jjhzcx.qy2.sql.clear;
jjhzcx.qy2.sql.add('select * from #gzmx where xm=:xm');
jjhzcx.qy2.open;
jjhzcx.show;
二、is not a valid floating point value
是无效的浮点值。
原因分析:可能试图将一个值转换为一个浮点数,但编译器无法将其识别为浮点值。
快速纠正:在给变量赋值前,验证该值是一个有效的浮点值。
三、Assignment to FOR-Loop Variable
给FOR-Loop变量<>赋值。
原因分析:在32位Delphi中,你可能试图给For循环(换言之,Do之后)中的循环控制变量赋值。
快速纠正:删除Do保留字后面为For循环控制变量的赋值。
四、Cannot initialize locall variables
无法初始化局部变量。
原因分析:可能在声明一个局部变量时试图为其赋值。
快速纠正:不要在一个过程或函数的Var段给变量赋值。不要在一个过程或函数的Const段给常量分配数据类型。
五、Cannot perform this operation on a closed database
无法对一个关闭的数据库执行这种操作。
原因分析:可能试图调用一个TDataBase组件的StartTransaction方法,而没有将其Connected属性设置为True,或者没有调用其Open方法。
快速纠正:调用StartTransaction前,在设计时或在代码中将Connected属性设置为True,或者调用TDatabase组件的Open方法。
六、Cannot perform this operation on a closed dataset
无法在一个关闭的数据集上执行这种操作。
原因分析:1、可能试图刷新、编辑、清空、删除或搜索一个没有打开或激活的TDataset组件。
2、可能一个数据集需要的辅助数据集没有激活或者关闭。
3、可能调用了一个用于多级应用的TClientDataSet的Open方法或者将其Active属性设置为True,并且没有将TClientDataSet的Provider属性设置为一个有效的TDataSetProvider组件。
4、可能调用了一个用于单级应用的TClientDataSet的Open方法或者将其Active属性设置为True,但没有打开包含数据的文件。
快速纠正:1,2、执行上述操作前,打开所有需要的数据集。
3、将一个TDataSetProvider赋给TClientDataSet组件。
4、在对数据工作前,或者设置TClientDataSet的FileName属性,或者调用LoadFromFile。在Delphi 6及以上版本中,可以以一种或两种格式保存数据(“传统”或“典型”的ClientDataSet二进制格式,带有.CDS扩展名;或者以XML格式,带有一个.XML扩展名)。
Cannot perform this operation on an open database
无法在一个打开的数据库上执行此操作。
原因分析:1、可能在一个TTable的Active属性为True时,试图将其Exclusive属性设置为True。
2、可能在一个TTable的Active属性为True时,试图给其TableName属性赋一个值。
3、可能在数据库的Connected属性设置为True时,试图给TDatabase的Alias或DatabaseName属性赋值。
4、可以在TDatabase组件的Connected属性设置为True时,试图将TSession组件的Active或AutoSessionName属性设置为True。
快速纠正:1-4、在试图进行这种操作前,确保TTable或TDatabase没有激活。
七、Cannot perform this operation on an open dataset
无法对一个打开的数据集执行此操作。
原因分析:1、可能当表打开时,试图修改一个TTable的Exclusive、ReadOnly、DatabaseName、TableName、TableType或SessionName属性。
2、可能在进行查询时,调用了一个TQuery的Unprepare方法。
3、可能在一个SQLQuery组件的Active属性设置为True时,修改了其SQL属性。
快速纠正:1、修改上述提到的任何属性前要关闭TTable。
2、调用Unprepare前关闭TQuery。
3、在再次打开/激活数据集前,先将它的Active属性设置为False,或者调用其Close方法,然后进行修改。
八、Division by zero:被零除。
原因分析:可能试图用零除一个数。
快速纠正:在除法操作前确保除数不为零,或者将除法操作封入一个Try…Except块中。
九、Field index out of range:字段索引越界。
原因分析:1、可能试图通过一个索引元素访问一个表的索引,但该索引元素大于表定义的最大索引元素数。