觀(guān)點(diǎn):PowerScript語(yǔ)法參考手冊(cè)之?dāng)?shù)據(jù)類(lèi)型

2022-12-07 16:12:00 來(lái)源:51CTO博客

前言:本文用于PowerBuilder12.6程序員,PowerBuilder最初由Sybase發(fā)布,能很快捷開(kāi)發(fā)C/S程序或者多層應(yīng)用系統(tǒng)。SAP以58億美元現(xiàn)金收購(gòu)Sybase以抗衡甲骨文,PowerBuilder 12.6是SAP收購(gòu)Sybase后與2014發(fā)布的版本。這是第二部分:數(shù)據(jù)類(lèi)型。?


數(shù)據(jù)類(lèi)型?


標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型?


數(shù)據(jù)類(lèi)型?

PowerBuilder 標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型類(lèi)似于其他編程語(yǔ)言,包括char, integer, decimal, long, 和string。PowerScript語(yǔ)言中,使用這些數(shù)據(jù)類(lèi)型來(lái)聲明變量或者數(shù)組。?

下表是標(biāo)準(zhǔn) PowerScript 數(shù)據(jù)類(lèi)型清單:?


(相關(guān)資料圖)


Blob ?

二進(jìn)制大對(duì)象。用于存儲(chǔ)海量數(shù)據(jù),例如,普通二進(jìn)制數(shù)據(jù)、圖像、文字處理文件之類(lèi)的大文本。?


Boolean ?

真true或者假false?


Byte ?

8位無(wú)符號(hào)整數(shù),從0到255.?

可以作為常量,使用任意0~255內(nèi)的完整正整數(shù),而前面的加號(hào)+是可以不需要的,例如18和+18是完全一樣的。?


Char character ?

單個(gè)Unicode字符。?

如果想要在應(yīng)用程序中解析基于字符的數(shù)據(jù),那么可能想要將其定義為Char類(lèi)型的數(shù)組。相對(duì)字符串而言,解析一個(gè)Char數(shù)組是更容易和更快捷的。如果想要傳遞基于字符的數(shù)據(jù)給外部函數(shù),那么可能想要使用Char二維數(shù)組,而不是字符串。?

可以作為常量,需使用單引號(hào)或者雙引號(hào),例如:?

char c?c = "T"?c = "T"?

Date ?

一個(gè)日期Date值,包含年(1000到3000),月(01到12),日(01到31)。?

可以作為常量,需使用連字符-來(lái)分隔年月日,例如:?

2001-12-25 // 2001年12月25日 ?2003-02-06 // 2003年2月6日?

DateTime?

日期時(shí)間類(lèi)型作為單一數(shù)據(jù)類(lèi)型,僅僅用于從數(shù)據(jù)庫(kù)中讀寫(xiě)DateTime值。轉(zhuǎn)換DateTime值到PowerBuilder中使用的數(shù)據(jù)類(lèi)型的情況有:?

Date(datetime) 函數(shù):在讀數(shù)據(jù)庫(kù)后,轉(zhuǎn)換DateTime 到 PowerBuilder日期Date值?

Time(datetime) 函數(shù):在讀數(shù)據(jù)庫(kù)后,轉(zhuǎn)換DateTime 到PowerBuilder時(shí)間Time值?

DateTime(date, time) 函數(shù):在寫(xiě)數(shù)據(jù)庫(kù)的DateTime列之前,轉(zhuǎn)換date和time到DateTime,其中time是可選的. ?

PowerBuilder在數(shù)據(jù)庫(kù)接口中支持毫秒,條件是采用支持毫秒的任何數(shù)據(jù)庫(kù)管理系統(tǒng)DBMS. ?


Decimal Dec ?

有符號(hào)十進(jìn)制數(shù),正數(shù)或者負(fù)數(shù),最大28位。可以放置小數(shù)點(diǎn)在28位里面任何位置,例如:123.456, 0.000000000000000000000001 或者12345678901234.5678901234。?

為了賦值給一個(gè)常量,可以帶小數(shù)點(diǎn)或者指數(shù)。加號(hào)是可選的。對(duì)于0和1之間的數(shù),0在小數(shù)點(diǎn)的左邊,但是0是可選的,例如,0.1和.1是一樣的。對(duì)于整數(shù),0在小數(shù)點(diǎn)右邊,但是0也是可選的,例如32.00, 32.0, 和32.都是一樣的。例如: ?

12.34 0.005 14.0 -6500 +3.5555 ?

Double ?

有符號(hào)的浮點(diǎn)數(shù),15位精度,范圍從2.2250738585073E-308 到1.79769313486231E+308,還有–2.2250738585073E-308 to –1.79769313486231E+308。?


Integer 或者Int ?

16位有符號(hào)整數(shù),從-32768到+32767.16。?

可以使用任意整數(shù),整數(shù)、負(fù)數(shù)、0,作為常量。正號(hào)是可選的,例如: ?

1 123 1200 +55 -32?

Long ?

32位有符號(hào)整數(shù),從-2147483648 到+2147483647。?


LongLong ?

64-bit signed integers, 64位有符號(hào)整數(shù),從-9223372036854775808 到9223372036854775807。?


Real ?

有符號(hào)浮點(diǎn)數(shù),帶6位精度,范圍從3.402822E-38 到3.402822E+38, 還有-3.402822E-38 到-3.402822E+38。?

可使用帶E的十進(jìn)制數(shù)值作為常量,E后面跟一個(gè)整數(shù),注意中間沒(méi)有空格。E之前的數(shù)值約定為一個(gè)小數(shù)。E后面+號(hào)是可選的,3E5 和3E+5是一樣的。例如:?

2E4 2.5E38 +6.02E3 -4.1E-2?-7.45E16 7.7E+8 3.2E-38?

String ?

Unicode字符的任意字串,長(zhǎng)度0 到1073741823。?

應(yīng)用程序多數(shù)基于字符的數(shù)據(jù)都會(huì)被定義為字符串,例如名稱(chēng)、地址等等。PowerScript 提供許多函數(shù),可以用來(lái)操作字符串,例如轉(zhuǎn)換英文字符為大寫(xiě),移除前置后置空白。?

常量字符串可以封裝多至1024位字符到單引號(hào)或者雙引號(hào)中,也可以封0長(zhǎng)度字符串或者一個(gè)空字符串,例如:?

string s1?s1 = "This is a string"?s1 = "This is a string"?

可以嵌入一個(gè)引號(hào)到一個(gè)字符串常量中,例如:?

string s1?s1 = "Here"s a string."?

也可以使用波浪號(hào)嵌入到引號(hào)到一個(gè)帶有引號(hào)的字符串常量中,例如:?

string s1 = "He said, "It~"s good!""?

復(fù)雜嵌套:當(dāng)嵌套一個(gè)字符串到嵌套了另外一個(gè)字符串的字符串中時(shí),可以使用波浪號(hào)來(lái)告訴解析器怎么解釋引號(hào)。兩個(gè)波浪號(hào)看做一個(gè)波浪號(hào),一個(gè)波浪號(hào)和引號(hào)對(duì)看做一個(gè)單獨(dú)的引號(hào)。?

實(shí)例1?

這個(gè)字符串包含兩層嵌套:?

"He said ~"she said ~~~"Hi ~~~" ~" "?

第一次處理結(jié)果為:?

He said "she said ~"Hi ~" "?

第二次處理結(jié)果為:?

she said "Hi"?

第三次處理結(jié)果為:?

Hi?

實(shí)例2?

一個(gè)更可能發(fā)生的例子是用Modify函數(shù)來(lái)設(shè)置DataWindow屬性的一個(gè)字符串。參數(shù)字符串經(jīng)常需要復(fù)雜引號(hào),因?yàn)楸仨氈付ㄒ粋€(gè)或多個(gè)層次的嵌套字符串。為了更便于理解,思考PowerBuilder怎么解析字符串。下面的字符串是Modify函數(shù)的一個(gè)可能參數(shù),它混合了單引號(hào)和雙引號(hào)來(lái)減少波浪號(hào)的數(shù)量。?

"bitmap_1.Invert="0~tIf(empstatus=~~"A~~",0,1)""?

雙引號(hào)告訴PowerBuilder解析參數(shù)為字符串。它包含賦值給Invert屬性的表達(dá)式,也是字符串,因此必須使用引號(hào)。表達(dá)式自身包含一個(gè)嵌套字符串:A。首先,PowerBuilder評(píng)估Modify參數(shù),賦值單引號(hào)字符串給Invert屬性。傳遞字符串后,轉(zhuǎn)換兩個(gè)波浪號(hào)為一個(gè)。賦值給Invert的字符串變?yōu)椋?

"0[tab]If(empstatus=~"A~",0,1)"?

最終,PowerBuilder評(píng)估屬性表達(dá)式,轉(zhuǎn)換波浪號(hào)引號(hào)對(duì)為引號(hào),并設(shè)置相應(yīng)的位圖顏色。?

實(shí)例3?

對(duì)于嵌套字符串的特定集合,有許多方法來(lái)指定引號(hào)。下面用于Modify函數(shù)的表達(dá)式有相同的結(jié)果:?

"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)~""?

引號(hào)和波浪號(hào)規(guī)則: ?

波浪號(hào)告訴解析器:下一個(gè)字符應(yīng)該被當(dāng)做一個(gè)字,二狗不是字符串終結(jié)符。?

兩個(gè)單引號(hào)能用于存在引號(hào)雙引號(hào)對(duì)的地方 (~")?

波浪號(hào)波浪號(hào)單引號(hào) (~~") 能用于存在三個(gè)波浪號(hào)一個(gè)雙引號(hào)的地方 (~~~")?


Time ?

Time采用24制,含時(shí)(00到23)、分(00-59)、秒(00-59)和秒的小數(shù)(最大六位數(shù)),范圍 00:00:00 到23:59:59.999999。?

支持微秒,用于支持微秒的數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn)接口。?

可使用冒號(hào)來(lái)分隔時(shí)間,但是秒的小數(shù)部分使用小數(shù)點(diǎn)來(lái)分隔。例如:?

21:09:15 // 晚上9點(diǎn)9分15秒?06:00:00 // 上午6點(diǎn)整?10:29:59 // 上午10點(diǎn)30分前1秒?10:29:59.9 // 上午10點(diǎn)30分前1/10秒?

UnsignedInteger, UnsignedInt, 或者UInt ?

16位無(wú)符號(hào)整數(shù),0 到65535?


UnsignedLong 或者ULong ?

32位無(wú)符號(hào)整數(shù), 0 到4294967295。?


Any?


PowerBuilder 也支持 Any 數(shù)據(jù)類(lèi)型, 可以容納任何類(lèi)型的值,包括阿標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型,對(duì)象,結(jié)構(gòu)和數(shù)組。類(lèi)型為Any的變量是一個(gè)可變數(shù)據(jù)類(lèi)型——可以賦值任何值。 ?

不要在EAServer組件定義中使用Any ?

Any數(shù)據(jù)類(lèi)型是特殊的,EASever組件的IDL不支持。CORBA也有Any數(shù)據(jù)類(lèi)型,能夠在運(yùn)行時(shí)呈現(xiàn)任何合法的IDL類(lèi)型,但語(yǔ)義上不等效于PowerBuilder 的Any類(lèi)型。必須從組件接口定義中排除Any數(shù)據(jù)類(lèi)型,但是可以在組件內(nèi)部使用它。 ?


聲明和賦值?

可以聲明Any變量為任何其他變量。也可以聲明Any數(shù)組變量,每個(gè)元素能采用不同的數(shù)據(jù)類(lèi)型。?

賦值數(shù)據(jù)到Any變量,可采用標(biāo)準(zhǔn)賦值語(yǔ)句。能賦值任何數(shù)組到一個(gè)簡(jiǎn)單的Any變量。?

賦值到Any變量后,能使用ClassName函數(shù)測(cè)試變量,找出實(shí)際的數(shù)據(jù)類(lèi)型,例如:?

any la_spreadsheetdata?la_spreadsheetdata = ole_1.Object.cells(1,1).value?CHOOSE CASE ClassName(la_spreadsheetdata)? CASE "integer"? ...? CASE "string"? ...?END CHOOSE?

Any賦值的規(guī)則如下:?

能賦值任何東西到Any變量, ?

必須知道Any變量的內(nèi)容,才能賦值A(chǔ)ny變量到兼容數(shù)據(jù)類(lèi)型。?


限制條件?

如果一個(gè)簡(jiǎn)單Any變量的值是數(shù)組,不能訪(fǎng)問(wèn)數(shù)組的元素直到給合適數(shù)據(jù)類(lèi)型的數(shù)組變量賦值。?

如果Any變量值是結(jié)構(gòu),你不能用點(diǎn)符號(hào)來(lái)訪(fǎng)問(wèn)結(jié)構(gòu)的元素,直到你賦值給結(jié)構(gòu)一個(gè)合適的數(shù)據(jù)類(lèi)型的數(shù)據(jù)。?

在A(yíng)ny變量賦值后,不能轉(zhuǎn)換到普通Any變量,因?yàn)椴荒苤付ㄆ鋽?shù)據(jù)類(lèi)型。即使你賦值為NULL,它仍然保留賦值類(lèi)型,直到你賦值另外一個(gè)值。?


操作和表達(dá)式?

能在A(yíng)ny變量上指定操作,就像Any變量數(shù)據(jù)的數(shù)據(jù)類(lèi)型對(duì)操作符很適合一樣。如果數(shù)據(jù)類(lèi)型不適合于操作符,一個(gè)執(zhí)行錯(cuò)誤將會(huì)產(chǎn)生。?

例如,如果變量 ia_1ia_2包含數(shù)字型數(shù)據(jù),這個(gè)語(yǔ)句是有效的:?

any la_3?la_3 = ia_1 - ia_2?

如果ia_1ia_2是字符串,可以使用串聯(lián)操作符:?

any la_3?la_3 = ia_1 + ia_2?

但是,如果ia_1是數(shù)字,而ia_2是字符串,就會(huì)得到一個(gè)執(zhí)行錯(cuò)誤:?

數(shù)據(jù)類(lèi)型轉(zhuǎn)換函數(shù):?

PowerScript 數(shù)據(jù)類(lèi)型轉(zhuǎn)換函數(shù)接收Any變量作為參數(shù)。當(dāng)調(diào)用函數(shù)時(shí),Any變量必容納能轉(zhuǎn)換為指定類(lèi)型的數(shù)據(jù)。?

例如,如果ia_any容納字符串,能賦值到一個(gè)字符串變量:?

ls_string = ia_any?

如果ia_any是一個(gè)想轉(zhuǎn)換為字符串的數(shù)字,你可以調(diào)用String函數(shù):?

ls_string = String(ia_any)?

其他函數(shù):?

如果函數(shù)的原型不允許Any作為參數(shù)的數(shù)據(jù)類(lèi)型,不能不通過(guò)轉(zhuǎn)換函數(shù)而直接使用Any變量,即使他容納正確類(lèi)型的值。當(dāng)編譯腳本時(shí),你將得到編譯器錯(cuò)誤,就像:Unknown function 或者Function not found。?

例如,Len函數(shù)的參數(shù)指向DataWindow的字符串列,而表達(dá)式自身含有Any類(lèi)型:?

IF Len(dw_notes.Object.Notes[1]) > 0 THEN // 無(wú)效?

Any表達(dá)式的字符串值顯式轉(zhuǎn)換為字符串:?

IF Len(String(dw_notes.Object.Notes[1])) > 0 THEN?

類(lèi)型為Any的表達(dá)式:?

獲取類(lèi)型為未知(unknown)的表達(dá)式在編譯時(shí)其類(lèi)型為Any。在OLE對(duì)象或者DataWindow對(duì)象中,這些表達(dá)式內(nèi)含表達(dá)式或者函數(shù): ?

myoleobject.application.cells(1,1).value?dw_1.Object.Data[1,1]?dw_1.Object.Data.empid[99]?

表達(dá)式指向的對(duì)象會(huì)改變,因此數(shù)據(jù)類(lèi)型也會(huì)改變。?

指向DataWindow數(shù)據(jù)的表達(dá)式能返回?cái)?shù)組、結(jié)構(gòu)或者結(jié)構(gòu)的數(shù)組。為了更好的性能,賦予DataWindow 表達(dá)式到合適的數(shù)組或者結(jié)構(gòu),而不需要使用中間的Any變量。?


Any數(shù)據(jù)類(lèi)型的過(guò)度使用?

不使用Any變量,而應(yīng)該使用有效數(shù)據(jù)類(lèi)型選擇。有兩個(gè)原因:?

運(yùn)行時(shí)采用Any變量會(huì)比較慢。?

PowerBuilder必須做更多的處理,在賦值或者執(zhí)行涉及Any變量的操作時(shí)決定數(shù)據(jù)類(lèi)型。特別地,如果使用Any變量來(lái)替代適合的類(lèi)型,循環(huán)中會(huì)執(zhí)行許多時(shí)間的操作會(huì)遭受更多問(wèn)題。?

編譯時(shí),使用Any變量會(huì)移除程序的錯(cuò)誤檢查層。?

PowerBuilder 編譯器保證在代碼執(zhí)行以前數(shù)據(jù)類(lèi)型是正確的。對(duì)于A(yíng)ny變量,一些編譯器引起的錯(cuò)誤在代碼運(yùn)行前不容易被發(fā)現(xiàn)。?


系統(tǒng)對(duì)象?


對(duì)象數(shù)據(jù)類(lèi)型?

對(duì)于PowerScript來(lái)說(shuō),系統(tǒng)對(duì)象是特殊的數(shù)據(jù)類(lèi)型。在Browser的System標(biāo)簽中可以看到系統(tǒng)對(duì)象清單。?

構(gòu)建PowerBuilder 應(yīng)用程序時(shí),可操作諸如窗口window、菜單menu、按鈕CommandButton、列表框ListBox和圖形。PowerBuilder內(nèi)部定義對(duì)象這些對(duì)象的每一個(gè)作為一種數(shù)據(jù)類(lèi)型。通常不必關(guān)心這些對(duì)象數(shù)據(jù)類(lèi)型自身,程序員可以在PowerBuilder 繪圖區(qū)簡(jiǎn)單定義對(duì)象,并使用他們。?

有時(shí)候程序員需要理解PowerBuilder 怎樣在數(shù)據(jù)類(lèi)型體系中維護(hù)系統(tǒng)對(duì)象。例如,當(dāng)程序員需要定義窗口的實(shí)例時(shí),程序員可定義數(shù)據(jù)類(lèi)型為window的變量。當(dāng)需要?jiǎng)?chuàng)建菜單實(shí)例在窗口中彈出時(shí),可以定義數(shù)據(jù)類(lèi)型為menu的變量。?

PowerBuilder 在類(lèi)體系中維護(hù)系統(tǒng)對(duì)象。每種對(duì)象類(lèi)型都是類(lèi)(class)。類(lèi)形成祖先和后代的繼承體系。?


示例?

所有類(lèi)均展示在Browser中,這些類(lèi)都是數(shù)據(jù)類(lèi)型,都能用到應(yīng)用程序中,能定義任意類(lèi)的變量。?

例如,下面的代碼定義了window和menu變量:?

window mywin?menu mymenu?

如果程序員在window中有幾個(gè)按鈕,需要跟蹤其中一個(gè),例如點(diǎn)擊最后一個(gè),可以聲明CommandButton 變量,并賦值:?

// 窗口中的實(shí)例變量?commandbutton LastClicked?// 窗口按鈕的Clicked事件?// 指示按鈕是最后一個(gè)?// 被用戶(hù)點(diǎn)擊的按鈕?LastClicked = This?

LastClicked 變量有CommandButton的所有屬性。最后賦值之后,LastClicked屬性有和window中最近被點(diǎn)擊的按鈕同樣的值。?


枚舉?

和系統(tǒng)對(duì)象(system object)一樣,枚舉類(lèi)型也是PowerScript特殊類(lèi)型。有如下兩種枚舉類(lèi)型: ?

函數(shù)參數(shù) ?對(duì)象或者控件的屬性?

通過(guò)Browser中Enumerated 標(biāo)簽,可以列出所有枚舉類(lèi)型。?

不能創(chuàng)建自己的枚舉類(lèi)型,作為替代,可以聲明常量變量集合并賦一個(gè)初始值。?

枚舉類(lèi)型變量能賦值為固定集合。枚舉值總是以感嘆號(hào)結(jié)尾。例如:枚舉類(lèi)型Alignment,指定為文本對(duì)齊方式,有三個(gè)值Center!, Left!, and Right!?

mle_edit.Alignment=Right!

不能使用引號(hào)來(lái)包含枚舉值,否則會(huì)接收一個(gè)編譯器錯(cuò)誤: ?

Incorrect syntax 不正確語(yǔ)法


枚舉類(lèi)型的優(yōu)勢(shì)?

枚舉類(lèi)型相比標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型有優(yōu)勢(shì)。當(dāng)枚舉類(lèi)型被使用時(shí),編譯器檢查數(shù)據(jù),并保證其實(shí)正確類(lèi)型。例如,如果你設(shè)置枚舉變量到其他任何類(lèi)型,或者不正確值,編譯器不允許這樣做。


EAServer?

先于EAServer 6.0, 所有EAServer 組件接口定義在標(biāo)準(zhǔn) CORBA IDL中。下表列舉了 EAServer Manager預(yù)定義的所有類(lèi)型, CORBA IDL 類(lèi)型和PowerBuilder 類(lèi)型的映射。 ?

EAServerManager?

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?

TabularResults::ResultSets?

ResultSets?

Void?

Void?

None?

標(biāo)簽: 數(shù)據(jù)類(lèi)型 枚舉類(lèi)型 應(yīng)用程序

上一篇:位運(yùn)算異或^的奇技淫巧
下一篇:天天觀(guān)焦點(diǎn):A面編程高手 B面清雅女神:51CTO高級(jí)講師汪翠從入行開(kāi)發(fā)到實(shí)現(xiàn)在滬財(cái)務(wù)自由的一路經(jīng)歷!快來(lái)圍觀(guān)