powerscript语法参考手册之数据类型

author author     2022-12-13     405

关键词:

前言:本文用于PowerBuilder12.6程序员,PowerBuilder最初由Sybase发布,能很快捷开发C/S程序或者多层应用系统。SAP以58亿美元现金收购Sybase以抗衡甲骨文,PowerBuilder 12.6是SAP收购Sybase后与2014发布的版本。这是第部分:数据类型


数据类型


标准数据类型


数据类型

PowerBuilder 标准数据类型类似于其他编程语言,包括char, integer, decimal, long, stringPowerScript语言中,使用这些数据类型来声明变量或者数组。

下表是标准 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列之前,转换datetimeDateTime其中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的变量是一个可变数据类型——可以赋值任何值。

PowerScript语法参考手册之数据类型_PowerBuilder12.6_02不要在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特殊类型。有如下两种枚举类型:

  • 函数参数
  • 对象或者控件的属性

通过BrowserEnumerated 标签,可以列出所有枚举类型。

不能创建自己的枚举类型,作为替代,可以声明常量变量集合并赋一个初始值。

枚举类型变量能赋值为固定集合。枚举值总是以感叹号结尾。例如:枚举类型Alignment指定为文本对齐方式,有三个值Center!, Left!, and Right!

mle_edit.Alignment=Right!

不能使用引号来包含枚举值,否则会接收一个编译器错误:

PowerScript语法参考手册之数据类型_PowerBuilder12.6_03Incorrect 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】项目运行报错... 查看详情