关键词:
前言:本文用于PowerBuilder12.6程序员,PowerBuilder最初由Sybase发布,能很快捷开发C/S程序或者多层应用系统。SAP以58亿美元现金收购Sybase以抗衡甲骨文,PowerBuilder 12.6是SAP收购Sybase后与2014发布的版本。这是第二部分:数据类型。
数据类型
标准数据类型
数据类型
PowerBuilder 标准数据类型类似于其他编程语言,包括char, integer, decimal, long, 和string。PowerScript语言中,使用这些数据类型来声明变量或者数组。
下表是标准 PowerScript 数据类型清单:
Blob
二进制大对象。用于存储海量数据,例如,普通二进制数据、图像、文字处理文件之类的大文本。
Boolean
真true或者假false
Byte
8位无符号整数,从0到255.
可以作为常量,使用任意0~255内的完整正整数,而前面的加号+是可以不需要的,例如18和+18是完全一样的。
Char 或character
单个Unicode字符。
如果想要在应用程序中解析基于字符的数据,那么可能想要将其定义为Char类型的数组。相对字符串而言,解析一个Char数组是更容易和更快捷的。如果想要传递基于字符的数据给外部函数,那么可能想要使用Char二维数组,而不是字符串。
可以作为常量,需使用单引号或者双引号,例如:
char c
c = T
c = "T"
Date
一个日期Date值,包含年(1000到3000),月(01到12),日(01到31)。
可以作为常量,需使用连字符-来分隔年月日,例如:
2001-12-25 // 2001年12月25日
2003-02-06 // 2003年2月6日
DateTime
日期时间类型作为单一数据类型,仅仅用于从数据库中读写DateTime值。转换DateTime值到PowerBuilder中使用的数据类型的情况有:
Date(datetime) 函数:在读数据库后,转换DateTime 到 PowerBuilder日期Date值
Time(datetime) 函数:在读数据库后,转换DateTime 到PowerBuilder时间Time值
DateTime (date, time) 函数:在写数据库的DateTime列之前,转换date和time到DateTime,其中time是可选的.
PowerBuilder在数据库接口中支持毫秒,条件是采用支持毫秒的任何数据库管理系统DBMS.
Decimal 或Dec
有符号十进制数,正数或者负数,最大28位。可以放置小数点在28位里面任何位置,例如:123.456, 0.000000000000000000000001 或者12345678901234.5678901234。
为了赋值给一个常量,可以带小数点或者指数。加号是可选的。对于0和1之间的数,0在小数点的左边,但是0是可选的,例如,0.1和.1是一样的。对于整数,0在小数点右边,但是0也是可选的,例如32.00, 32.0, 和32.都是一样的。例如:
12.34
0.005
14.0
-6500
+3.5555
Double
有符号的浮点数,15位精度,范围从2.2250738585073E-308 到1.79769313486231E+308,还有–2.2250738585073E-308 to –1.79769313486231E+308。
Integer 或者Int
16位有符号整数,从-32768到+32767.16。
可以使用任意整数,整数、负数、0,作为常量。正号是可选的,例如:
1
123
1200
+55
-32
Long
32位有符号整数,从-2147483648 到+2147483647。
LongLong
64-bit signed integers, 64位有符号整数,从-9223372036854775808 到9223372036854775807。
Real
有符号浮点数,带6位精度,范围从3.402822E-38 到3.402822E+38, 还有-3.402822E-38 到-3.402822E+38。
可使用带E的十进制数值作为常量,E后面跟一个整数,注意中间没有空格。E之前的数值约定为一个小数。E后面+号是可选的,3E5 和3E+5是一样的。例如:
2E4
2.5E38
+6.02E3
-4.1E-2
-7.45E16
7.7E+8
3.2E-38
String
Unicode字符的任意字串,长度0 到1073741823。
应用程序多数基于字符的数据都会被定义为字符串,例如名称、地址等等。PowerScript 提供许多函数,可以用来操作字符串,例如转换英文字符为大写,移除前置后置空白。
常量字符串可以封装多至1024位字符到单引号或者双引号中,也可以封0长度字符串或者一个空字符串,例如:
string s1
s1 = This is a string
s1 = "This is a string"
可以嵌入一个引号到一个字符串常量中,例如:
string s1
s1 = "Heres a string."
也可以使用波浪号嵌入到引号到一个带有引号的字符串常量中,例如:
string s1 = He said, "It~s good!"
复杂嵌套:当嵌套一个字符串到嵌套了另外一个字符串的字符串中时,可以使用波浪号来告诉解析器怎么解释引号。两个波浪号看做一个波浪号,一个波浪号和引号对看做一个单独的引号。
实例1
这个字符串包含两层嵌套:
"He said ~"she said ~~~"Hi ~~~" ~" "
第一次处理结果为:
He said "she said ~"Hi ~" "
第二次处理结果为:
she said "Hi"
第三次处理结果为:
Hi
实例2
一个更可能发生的例子是用Modify函数来设置DataWindow属性的一个字符串。参数字符串经常需要复杂引号,因为必须指定一个或多个层次的嵌套字符串。为了更便于理解,思考PowerBuilder怎么解析字符串。下面的字符串是Modify函数的一个可能参数,它混合了单引号和双引号来减少波浪号的数量。
"bitmap_1.Invert=0~tIf(empstatus=~~A~~,0,1)"
双引号告诉PowerBuilder解析参数为字符串。它包含赋值给Invert属性的表达式,也是字符串,因此必须使用引号。表达式自身包含一个嵌套字符串:A。首先,PowerBuilder评估Modify参数,赋值单引号字符串给Invert属性。传递字符串后,转换两个波浪号为一个。赋值给Invert的字符串变为:
0[tab]If(empstatus=~A~,0,1)
最终,PowerBuilder评估属性表达式,转换波浪号引号对为引号,并设置相应的位图颜色。
实例3
对于嵌套字符串的特定集合,有许多方法来指定引号。下面用于Modify函数的表达式有相同的结果:
"emp.Color = ~"0~tIf(stat=~~~"a~~~",255,16711680)~""
"emp.Color = ~"0~tIf(stat=~~a~~,255,16711680)~""
"emp.Color = 0~tIf(stat=~~a~~,255,16711680)"
"emp.Color = ~"0~tIf(stat=a,255,16711680)~""
引号和波浪号规则:
波浪号告诉解析器:下一个字符应该被当做一个字,二狗不是字符串终结符。
两个单引号能用于存在引号双引号对的地方 (~")
波浪号波浪号单引号 (~~) 能用于存在三个波浪号一个双引号的地方 (~~~")
Time
Time采用24制,含时(00到23)、分(00-59)、秒(00-59)和秒的小数(最大六位数),范围 00:00:00 到23:59:59.999999。
支持微秒,用于支持微秒的数据库的访问接口。
可使用冒号来分隔时间,但是秒的小数部分使用小数点来分隔。例如:
21:09:15 // 晚上9点9分15秒
06:00:00 // 上午6点整
10:29:59 // 上午10点30分前1秒
10:29:59.9 // 上午10点30分前1/10秒
UnsignedInteger, UnsignedInt, 或者UInt
16位无符号整数,0 到65535
UnsignedLong 或者ULong
32位无符号整数, 0 到4294967295。
Any
PowerBuilder 也支持 Any 数据类型, 可以容纳任何类型的值,包括阿标准数据类型,对象,结构和数组。类型为Any的变量是一个可变数据类型——可以赋值任何值。
不要在EAServer组件定义中使用Any
Any数据类型是特殊的,EASever组件的IDL不支持。CORBA也有Any数据类型,能够在运行时呈现任何合法的IDL类型,但语义上不等效于PowerBuilder 的Any类型。必须从组件接口定义中排除Any数据类型,但是可以在组件内部使用它。
声明和赋值
可以声明Any变量为任何其他变量。也可以声明Any数组变量,每个元素能采用不同的数据类型。
赋值数据到Any变量,可采用标准赋值语句。能赋值任何数组到一个简单的Any变量。
赋值到Any变量后,能使用ClassName函数测试变量,找出实际的数据类型,例如:
any la_spreadsheetdata
la_spreadsheetdata = ole_1.Object.cells(1,1).value
CHOOSE CASE ClassName(la_spreadsheetdata)
CASE "integer"
...
CASE "string"
...
END CHOOSE
Any赋值的规则如下:
能赋值任何东西到Any变量,
必须知道Any变量的内容,才能赋值Any变量到兼容数据类型。
限制条件
如果一个简单Any变量的值是数组,不能访问数组的元素直到给合适数据类型的数组变量赋值。
如果Any变量值是结构,你不能用点符号来访问结构的元素,直到你赋值给结构一个合适的数据类型的数据。
在Any变量赋值后,不能转换到普通Any变量,因为不能指定其数据类型。即使你赋值为NULL,它仍然保留赋值类型,直到你赋值另外一个值。
操作和表达式
能在Any变量上指定操作,就像Any变量数据的数据类型对操作符很适合一样。如果数据类型不适合于操作符,一个执行错误将会产生。
例如,如果变量 ia_1 和ia_2 包含数字型数据,这个语句是有效的:
any la_3
la_3 = ia_1 - ia_2
如果ia_1 和ia_2 是字符串,可以使用串联操作符:
any la_3
la_3 = ia_1 + ia_2
但是,如果ia_1 是数字,而ia_2 是字符串,就会得到一个执行错误:
数据类型转换函数:
PowerScript 数据类型转换函数接收Any 变量作为参数。当调用函数时,Any 变量必容纳能转换为指定类型的数据。
例如,如果ia_any 容纳字符串,能赋值到一个字符串变量:
ls_string = ia_any
如果ia_any 是一个想转换为字符串的数字,你可以调用String 函数:
ls_string = String(ia_any)
其他函数:
如果函数的原型不允许Any作为参数的数据类型,不能不通过转换函数而直接使用Any变量,即使他容纳正确类型的值。当编译脚本时,你将得到编译器错误,就像:Unknown function 或者Function not found。
例如,Len函数的参数指向DataWindow的字符串列,而表达式自身含有Any类型:
IF Len(dw_notes.Object.Notes[1]) > 0 THEN // 无效
Any表达式的字符串值显式转换为字符串:
IF Len(String(dw_notes.Object.Notes[1])) > 0 THEN
类型为Any的表达式:
获取类型为未知(unknown)的表达式在编译时其类型为Any。在OLE对象或者DataWindow对象中,这些表达式内含表达式或者函数:
myoleobject.application.cells(1,1).value
dw_1.Object.Data[1,1]
dw_1.Object.Data.empid[99]
表达式指向的对象会改变,因此数据类型也会改变。
指向DataWindow数据的表达式能返回数组、结构或者结构的数组。为了更好的性能,赋予DataWindow 表达式到合适的数组或者结构,而不需要使用中间的Any变量。
Any数据类型的过度使用
不使用Any变量,而应该使用有效数据类型选择。有两个原因:
运行时采用Any变量会比较慢。
PowerBuilder必须做更多的处理,在赋值或者执行涉及Any变量的操作时决定数据类型。特别地,如果使用Any变量来替代适合的类型,循环中会执行许多时间的操作会遭受更多问题。
编译时,使用Any变量会移除程序的错误检查层。
PowerBuilder 编译器保证在代码执行以前数据类型是正确的。对于Any变量,一些编译器引起的错误在代码运行前不容易被发现。
系统对象
对象数据类型
对于PowerScript来说,系统对象是特殊的数据类型。在Browser的System标签中可以看到系统对象清单。
构建PowerBuilder 应用程序时,可操作诸如窗口window、菜单menu、按钮CommandButton、列表框ListBox和图形。PowerBuilder内部定义对象这些对象的每一个作为一种数据类型。通常不必关心这些对象数据类型自身,程序员可以在PowerBuilder 绘图区简单定义对象,并使用他们。
有时候程序员需要理解PowerBuilder 怎样在数据类型体系中维护系统对象。例如,当程序员需要定义窗口的实例时,程序员可定义数据类型为window的变量。当需要创建菜单实例在窗口中弹出时,可以定义数据类型为menu的变量。
PowerBuilder 在类体系中维护系统对象。每种对象类型都是类(class)。类形成祖先和后代的继承体系。
示例
所有类均展示在Browser中,这些类都是数据类型,都能用到应用程序中,能定义任意类的变量。
例如,下面的代码定义了window和menu变量:
window mywin
menu mymenu
如果程序员在window中有几个按钮,需要跟踪其中一个,例如点击最后一个,可以声明CommandButton 变量,并赋值:
// 窗口中的实例变量
commandbutton LastClicked
// 窗口按钮的Clicked事件
// 指示按钮是最后一个
// 被用户点击的按钮
LastClicked = This
LastClicked 变量有CommandButton的所有属性。最后赋值之后,LastClicked属性有和window中最近被点击的按钮同样的值。
枚举
和系统对象(system object)一样,枚举类型也是PowerScript特殊类型。有如下两种枚举类型:
- 函数参数
- 对象或者控件的属性
通过Browser中Enumerated 标签,可以列出所有枚举类型。
不能创建自己的枚举类型,作为替代,可以声明常量变量集合并赋一个初始值。
枚举类型变量能赋值为固定集合。枚举值总是以感叹号结尾。例如:枚举类型Alignment,指定为文本对齐方式,有三个值Center!, Left!, and Right!
mle_edit.Alignment=Right!
不能使用引号来包含枚举值,否则会接收一个编译器错误:
Incorrect syntax 不正确语法
枚举类型的优势
枚举类型相比标准数据类型有优势。当枚举类型被使用时,编译器检查数据,并保证其实正确类型。例如,如果你设置枚举变量到其他任何类型,或者不正确值,编译器不允许这样做。
EAServer
先于EAServer 6.0, 所有EAServer 组件接口定义在标准 CORBA IDL中。下表列举了 EAServer Manager预定义的所有类型, CORBA IDL 类型和PowerBuilder 类型的映射。
EAServer Manager | CORBA IDL | PowerBuilder |
Integer (16-bit) | Short | Integer |
Integer (32-bit) | Long | Long |
Integer (64-bit) | Long long | LongLong |
Boolean | Boolean | Boolean |
Float | Float | Real |
Double | Double | Double |
String | String | String |
Binary | BCD::Binary | Blob |
Decimal | BCD::Decimal | Decimal |
Money | BCD::Money | Decimal |
Date | MJD::Date | Date |
Time | MJD::Time | Time |
Timestamp | MJD::Timestamp | DateTime |
ResultSet | TabularResults::ResultSet | ResultSet |
ResultSets查看详情 postgres数据库之兼容dm数据库top语法学习汇总(代码片段)目录Postgres数据库之兼容dm数据库TOP语法学习汇总背景TOP语法分析TOP语法和LIMIT语法执行结果对比分析新增支持部分TOP语法PostgreSQL的窗口函数cume_distPostgreSQL窗口函数的语法解析过程学习参考书籍、网站或博文:参考书籍:《DM8SQL... 查看详情 四级目录:基础语法第一部分:必知必会Python语法手册(零)----“绪论”与“注释”Python语法手册(一)----“数据类型”与“变量&常量”Python语法手册(二)----运算及其优先级Python语法手册(三)----IOPython语法手册(四)----控制流与注意事项... 查看详情 javascript学习笔记——javascript语法之数据类型JavaScript拥有动态类型。这意味着相同的变量可用作不同的类型:varx//x为undefinedvarx=6;//x为数字varx="Bill";//x为字符串 1.字符串:字符串可以是引号中的任意文本。可以使用单引号或双引号。2.数字:JavaScript只有一种数字类型。... 查看详情 javascript核心语法之基本数据类型(绝对详细,满满干货)(代码片段)数据类型 1.JavaScript中有五种简单的数据类型,被称为基本数据类型,分别是:undefined---未初始化的变量以及未声明的变量null---空类型boolean---true或falsenumber---整数或浮点数string---用双引号来进行声明的字符串 ... 查看详情 flutter之dart语法数据类型(代码片段)变量与常量Dart中用var声明一个变量,如果想设置一个变量不可变,那么可以使用final或者const修饰。varnumber;number=12;print("thenumberis$number");number="20";print(number);finalsum=10;constcount=2; 查看详情 flutter之dart语法-数据类型(代码片段)变量与常量Dart中用var声明一个变量,如果想设置一个变量不可变,那么可以使用final或者const修饰。varnumber;number=12;print("thenumberis$number");number="20";print(number);finalsum=10;constcount=2; 查看详情 数据库之数据类型约束条件(代码片段)...y主键uniquekey唯一键notnull不为空foreignkey外键创建表的完整语法[]内为可选参数#语法:createtable表名( 字段名1类型[(宽度)约束条件],字段名2类型[(宽度)约束条件],字段名3类型[(宽度)约束 查看详情 02-c#基础之01-基础语法...几种类型变量:用来在计算机当中存储数据。存储变量的语法:变量类型变量名;变量名=值;intnumber=100;2.赋值"=""="号:在这并不表示等于的意思。而是赋值的意思,表示把等于右边的值赋值给等于左边的变量。声明并且给变... 查看详情 从零开始学go之基本语法:基本数据类型与变量(代码片段)基本数据类型:Go中数据类型并不是特别多,但是有一部分用法却比较多,这一部分放到后面再细学。 Go中的基本数据类型有:①整型:int,uint②浮点型:float32,float64③布尔型:bool④字符型:byte,rune⑤字符串型:string 整... 查看详情 redis之string数据类型常用方法总结(代码片段)目录redis字符串(string)【需要掌握】特点语法redis字符串(string)【需要掌握】特点一个键能存储512MB数据string类型是二进制安全的,可以存储任何数据,比如jpg图片或序列化对象redis字符串数据类型的相关命令用于管理redis字... 查看详情 visual.basic语法基础之二1、显示声明:OptionExplicit2、常量:Const常量名As数据类型=值3、变量:Dim|Private|Public变量名As数据类型Dim变量名AsString*n4、数组:------------------------------------------------------------------------------------------------------Dim 查看详情 markdown语法参考Typora参考手册Markdown参考博客Markdown语法手册(完整整理版) 查看详情 mime参考手册MIME参考MIME类型MIME(MultipurposeInternetMailExtensions)是描述消息内容类型的因特网标准。MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。官方的MIME信息是由InternetEngineeringTaskForce(IETF)在下面的文档中提供的:RFC-82... 查看详情 elk学习笔记之logstash基本语法Logstash基本语法: 处理输入的input处理过滤的filter处理输出的output 区域数据类型条件判断字段引用 区域:Logstash中,是用{}来定义区域区域内,可以定义插件一个区域内可以定义多个插件 数据类型:条件判断:字... 查看详情 建议收藏|超值干货:sql语法速成手册,12800字超长总结!(代码片段)本文针对关系型数据库的一般语法。限于篇幅,本文侧重说明用法,不会展开讲解特性、原理。一、基本概念数据库术语数据库(database)?-保存有组织的数据的容器(通常是一个文件或一组文件)。数据表(table)?-某种特定类... 查看详情 大数据之scala高级语法学习协变案例一:classAnimal{}classBirdextendsAnimal{}classAnimal{}classBirdextendsAnimal{}//协变classCovariant[T](t:T){}valcov=newCovariant[Bird](newBird)valcov2:Covariant[Animal]=covc不能赋值给c2,因为Covariant定义成不变类型。稍 查看详情 flutterdart数据类型之num(代码片段)1.写在前面在上篇文章中介绍了Dart的var、final和const的语法和使用,那么现在就继续来学习Dart的基础语法吧!【Flutter】苹果Mac电脑配置flutter开发环境【Flutter】AndroidStudio安装第三方模拟器—网易MuMu【Flutter】项目运行报错... 查看详情 |