PB详细学习笔记

  • 格式:docx
  • 大小:68.21 KB
  • 文档页数:20

1. 当我们在程序中用修改数据库的时候,只要不用commit切程序在运行,我们此时是查看不到数据库中当前操作的数据的,只有commit后,或退出该程序时,才能在数据库中查看到修改后的数据。

a) 这是因为修改数据的时候是先有一个缓冲区,此时还没有修改到实际的数据,多以此时没用commit,而用rollback的时候,对缓冲区的修改代码将不被执行;此时就是起到出错数据回滚的操作

b) 但是,当我们修改了数据没用到commit的时候,而是直接退出程序,此时数据库缓冲区中的修改代码也会被执行,也就是说,只要不用rollback,推车程序时数据也会被更改。

c) 所以,当我们某个地方会出错需要数据回滚时,就要在那里进行rollback操作。

2. 在数据窗口对象里设置显示值和实际值时,要注意:当输出文档时任然使用的是实际值,显示值值是看的,没有实际意义。

1. 在我们第一次装PDM时,装数据库的时候数据库是没有程序的内部用户的,所以一般是建一个空数据库,然后进行初始化,这样数据库就有了2个用户了,然后再将有数据的数据库还原上去,但此时该数据库也是没有用户的,就要给它授权,即映射,此时执行Grant的代码就是映射授权。

a) 所以,当没有系统用户时,执行Grant是没有用的。

1. 我们在pb中,事件是可以继承的,方法是不能继承的:

a) 如果子对象中的该方法写了新代码,则调用时是执行新写的代码,如果子对象该方法中什么也没写,则会调用父对象的该方法

b) 所以,可见继承是可以先执行父的再执行子的,方法是不行的

c) 这个就叫做多态

1.因为标题名字是字段名字加_t,所以,在自定义字段时,设置字段名时不要有“_”.

1. 一定要注意补丁包升级和数据库升级,补丁包升级是将我们的程序进行升级,而数据库升级是对数据库进行修改操作的升级。

a) 二者不是一回事,都要进行操作。

b) 我们要区分数据库版本和程序版本,两者要对应才能正常运行。

2. 我们调试时用的动态库为PB 文件夹下的动态库,程序运行时用的是Bin目录下的动态库,程序安装时用的也是Bin目录下的动态库,所以要清楚不同环境下的运行要求。

3. 修改数据窗口对象的查询语句时,先剪切再添加,这样更能反映到当前PB中来。

4. 在我们触发事件打开窗口的时候,一定要注意打开窗口和当前窗口的关系,如果他们是继承关系,则会报错的~!

5. 在写SQL语句时注意where 1=1 的用法,我们开始就把这个写在一个变量中,当要增加条件时就直接加在后面。从而不用担心where出现的位置问题。

在PB写代码时,不同的目标可以引用对方的库,所以我们编译时,先编译功能小的库,再编译功能齐全的库。

为什么呢?

比如:我们目标1调用目标2的库1,在库1中调用了许多目标1中的其他库的对象,在编译时就会将这些联系都写在库1.pbd文件中,当编译目标2时也会重新生成库1.pbd,由于在目标2中没有库1中调用其他库的对象,因为目标2只是用到了库1中很小的一部分对象,这时编译并不会报错,所以重新生成的.pbd文件是不全的(一般发生在多个程序集成在一起的情况)。所以,我们只能先编译功能小的目标,再编译功能大的目标。防止相同库先后编译发生覆盖的错误。 1. 记住,在分析代码的时候,要分功能模块来看,不要整体的来分析,那样会很复杂而且不容易想清楚,很容易乱。

a) 分析每一小块的代码,知道他的作用和关联;最后将每个块联系起来串一边,就能晓得当前脚本的功能了。

b) 有时候不一定要分析某个函数它内部是怎么操作的,只需要晓得它的返回结果,这样的函数就不用费劲的去分析代码了。

2. 在我们的程序中是有版本的,当定义好了程序中的版本后,就要进行数据库升级,这个升级就会将版本信息存放到数据库中,只有程序的版本和数据库的版本一致时,才可以登录系统。

3. PB写的代码调试是要依赖与环境的,所以,当调试出问题时,就要把一些支持调试的.DLL文件拷贝到PB的安装目录下面去。

a) 注意考入的.dll文件要和当前版本的程序相匹配,因为不同版本的程序里的.DLL文件是不一样的。

4. 要注意区分程序运行的代码和程序安装的代码,两者是有区别的。

5. 我们要注意本地数据源的连接,不是创建了数据源就可以能连的上去,同时也要为数据源指定数据库文件。否则找不到数据。

6. 我们在使用对象的各种类型变量时,一定要注意值的滞留问题,如有这种情况,则要在开头或结尾将其进行清空。

a) Eg:当有一个数组il_partid[] 时,开始我们循环找到了2个值,放在il_partid[1],

il_partid[2]里面,完成了满足条件的查询。

b) 但是当我们下一次检索时,只找到一个满足条件的值,放在了il_partid[1]里,此时我们查询时,则会出错,出现2个满足条件的值,因为我们值改变了il_partid[1],但是il_partid[2]上次查询结果的值仍然保留在,故会出错。

c) 所以,我们在每次执行代码前就要清空:il_partid[] = ll_empt[]

d) 这样就避免了出错。

7. 我们要清楚事件的触发和函数的调用,当我们不好用某个动作来触发某个自定义的事件代码时,我们可以将该事件放在另一个事件的结尾用trigger 或post 来触发自定义事件。

a) 事件其实就是代码~!

8. 注意:在我们用if 判断的时候,如果用= 是表示判断,不是赋值,而用函数返回值判断时,是要执行该函数再判断的,所以,不要搞混了,要清楚什么时候执行,什么时候表示判断。

9. Modify基本可以修改数据窗口中所有的属性项。

10. 我们要修改某对象的源时,可以将其Export 导出源码,然后我们就杂源码的定义部分修改对象的属性。要知道,我们对源直接修改就是修改对象的 本身属性。

11. any 要想知道Any类型变量中保存数据的类型,可以使用函数ClassName()

12. 我们要连接多个数据库时,第一个数据库算是默认的,所以在我们用游标或select语句时都不用using sqlca; 不用就算是默认的。

a) 所以,当用多个数据库时,检索数据的时候就要在查询的地方放用using语句,不然它算是连接到了默认的数据库,则会出错。

b) 不管用哪个数据库都是要定义好数据源的,同时在代码中声明连接,这样才能得到数据。(声明:sqlca.odbc=;sqlca.code;„„)

c) 在应用对象中声明的是数据源参数的链接,因为数据源和数据库之间的关系在创建数据源的时候一般会定义好的。 d) 所以链接数据库,可看做2个部分,一个是创建数据源,再个是链接数据源。

13. 我们用自定义的数据窗口对象时,选择的是外部数据源,此时在画板界面上,是先定义字段的属性,再增加字段的。

1. 要分清PB中对象和类的区别:

a) 一般我们将window menu treeviewitem 等就是“类”,专门作为一种数据类型来定义该类型的实例。

b) 而我们继承是在原类的基础上创建一个新类。

c) New是创建新对象,不同与继承。

14. 我们的PDM的代码包CODE一般包含2个文件夹:

a) Inte_pbr文件夹:里面存放的是程序运行时需要的所有图片,但是加载图片进去还不够,它里面还有一个配置文件(INTEMAN.PBR;INTEPDM.PBR等),将每个图片的路径信息都写在了里面,只有这样程序才能完全找到使用。

b) 这个文件夹要安装到C盘下面,这是程序指定的路径。

c) 因为在代码中的编译对象中包含了这2个文件夹的路径,所以当编译完成后生成的.pbd文件就包含了2部分的内容。

d) 当没编译只是运行代码时,这个包就要放在指定路径下了,不然运行时图片都不会显示出来。

15. 另外一个就是我们代码的安装包了。

1. 当你创建一个工作目标(.pbt)后,它会自动创建一个应用库(.pbl),我们创建和操作的对象就放在这个应用库下面。

2. 层次结构:—工作空间

—目标

—应用库(多个)

—对象(多个)

—目标(多个)

3. 一般一个工作目标就是一个应用程序,就是说同一个目标下不同应用库中的对象是可以互相访问的。

4. 同一目标下的不同库中的对象可以相同。

5. 不管是同一目标还是不同目标或是不同的库中,我们都可以将有用的对象拷贝到指定的库中。

6. 且一个工作目标里面只有一个应用库中有且只能有一个(应用对象)。

7. 我们创建的全局变量,它是在整个目标(程序)中是有效的。

8. 应用对象的属性一般具有全局性,所以要慎重设置。

9. 我们在PB系统树中创建的对象可以看做是一个实例对象,直接拿出去用,也可以看做一个类,用它来创建新的对象,新的对象将有原对象的所有属性和事件、方法。

10. 不同对象中的控件名可以相同,不同库中的对象名字可以相同,不同目标的库名也是可以相同的。

11. 但是,在一个目标中,不要将库名中的对象名取一样的,这样会出错,因为同一目标下的对象是可以相互访问的。

1. 在应用对象中设置事务对象的连接属性,与在DBprifile中添加DB是没有关联的。

2. 当Return属于某个脚本时,就退出该脚本的运行,当它是某个脚本函数的代码时,则返回到调用该函数的位置。

3. 我们要清楚每个函数在各种情况下的用法。它是与控件连一起用的还是单独可以用的,最好根据函数的功能和意思来分辨。

4. 我们要把形参当作实际的值来看待。

5. 一定要注意每个函数的功能,以及他们之间的内在联系:

a) 例如:getfilesavename()

i. 它是打开一个准备要保存的文件路径对话框,它返回路径名和文件名,除此之外不做其他的操作。

b) 又如oleobject的saveas():

i. 它是将文件保存到一个指定路径,当这个路径和getfilename()的路径不相符时或没有传递时,它就会报错而不能保存。

c) 又如PB中的saveas()

i. 它不关前面的getfilesavename(),它的功能就是打开保存对话框,保存到指定位置进行保存。

1. 我们所用的对象其实就是一堆视图化的代码,当我们想要改变某个对象的属性或内容时,可以直接编辑他们的源代码:Edit source.

2. 当我们在定义函数时,规定了返回类型,则它会要求你返回一种类型。

所以,如果不想返回值,则在定义的时候在返回值上填(none)

1. 我们用户定义事件其实分2种情况:

a) 通过事件ID 调用windows已经存在的事件。此时各项参数都是设置好的,只需要设置名字。

b) 将事件ID设置为(none),此时我们就可以自己设置事件的各项参数了,此时可以说才是真正的用户事件。

2. 在pb中触发事件有2种方法:

a) 通过我们手动的操作,来触发相应的事件。

b) 通过TriggerEvent()或者Postevent()来触发。

i. Object.TriggerEvent(clicked!)是立即触发用户指定的事件,在继续调用下面的事件,属于同步调用。

ii. Object.Postevent(clicked!)是将用户指定的事件放置到指定控件事件队伍中的末尾,等所有的事件都完毕后再执行该指定事件,属于异步调用事件。