2017年2月15日 星期三

VD20 Q&A

VISUAL DBTOOLS 2.0 Q&A

clip_image001

環境

Q1:請問如何開新的專案?

A:只要你在WINDOWS中增加一個ICON,將捷徑內容設為C:\VD20\VD20.EXE Myproject即可

,其中VD20.EXE的PATH是按照你的安裝目錄所設定,而Myproject即為你的專案名稱,

專案名稱可自由定義。

Q2:請問 VD2.0 網路版或C/S版如何設定編譯成單機版使用?

A:可把重要的Table設成<獨佔模式>即可變成單機版。

Q3:VD的單機版與網路版有何差別?

A:VD的單機版只能使用實體磁碟的資料集(DataBase),不能使用網路磁碟機的資料集,也 就是說單機版不能將DBF資料庫存至於網路上,甚至另外一台電腦上只能存放於本機中,而網路版卻是可以的。

Q4:請問VD2.0可以讀取64k以上的文字檔嗎?

A:VD2.0的MemoRead()與MemoWrite()是不能讀取64k以上的文字檔,你必須使用FOPEN()及FREAD()自行處理之。

Q5:請問 LAYER1 應如何刪除 ?

A:在Form右上的小圖示是簡化的功能,主要是為了方面切換Layer,若要刪除,您要使

用Layer Manager(桌面管理員),在主功能表:<查看>-<桌面管理員>中可以叫出。

Q6:如何傳參數至一個專案,也就是說在 MAIN.INIT() 可以接收到參數 ?

A:在VD 專案圖示的捷徑內輸入VD20.EXE X.vds -pMYVAR,並在VD2.0中,用_DOS_PARA取出 -p的值即可! 其中 X.VDS 為專案名稱, -pMYVAR 為傳入參數指令, MYVAR為傳入之參數值,以本例而言,你將利用 _DOS_PARA取出 MYVAR 的值!

Q7:在普及版中Setlevel(0)不動作

A: Setlevel()在普及版不能執行是規格,在普及版中和VD版權有關的(例如切換前後台的那三個Button),都是不能被取消的。

Q8:執行VD2.0時 , 如何直接進入設計模式 , 而不進入執行式?

A:在桌面[內容]的[目標]加入-g,如vd20.exe xxx.vds -g 即可。

Q9:1. 請問 vd2.0 的字典檔是放在哪一個檔案中 ?

2. 不同專案用到相同的資料集時, 其中一個專案會看不到資料字典

3. 是否有資料字典轉入轉出的功能

A:1.字典檔放在 [專案*.vds] 中,隨專案來儲存資料字典

2.不同專案有不同的資料字典,所以看不到資料字典

3.資料字典沒有轉入轉出的功能,但專案拷貝有資料字典拷貝功能

Q10:LOGINDB() 與 LOGINVD() 有何不同?

A:LOGINDB():用來登錄至指定的DATABASE-C中,如此即可不必另外輸入User

密碼。

LOGINVD():用來登錄至VD的用戶安全系統,如此VD可以為你自動控管資

料的權限及部門關係。

表單

Q11:VD2.0按下 [F10] 都會回到 MAIN FORM 請問如何關閉此設定?

A:可貼一MainMenu0,增加一個menuitem選項,將<顯示>屬性設成false,<熱鍵>屬性設成F10即可。

Q12:如何動態得知目前FOCUS元件與如何設定FOCUS?

A:1.如果是要得知自定函數是誰呼叫的,可使用THIS指標

例如:edit3的結束程序test()

if empty(this.text)

message('沒有輸入')

else

message(this.name)

endif

return .t.

另外也可使用Form.Activecontrol得知目前的Focused元件是誰。

2.下edit0.focused() 指令,即可Focus 到edit0 物件。

Q13:請問如何得知FORM是否開啟?

A:If !empty(getobj(form))

Message("FORM尚未開啟!!")

Endif

Q14:如何由程式中得知,我目前位於那一個form或元件?

A:可由THIS得知,請在 OnDblclick 寫一程式TEST(),內容如下

IF !EMPTY(THIS.NAME)

MESSAGE(THIS.NAME)

ENDIF

RETURN

Q15:如何檢查 FORM A 是否存在但不必開啟 FORM A ,且FORM A 設為複合視窗 ?

A:可用X=GETOBJ('FORMA')

IF EMPTY(X)

.....

ELSE

.....

ENDIF

Q16:在一個 Form 中如何動態取得作用中之欄位名稱 ?

A:在FORM有一個ACTIVECONTROL的屬性,代表目前正FOCUSED的CONTROL,為一個P型態(POINTER),你可以使用P.ClassName()來得知他的元件型別,並用P.Property來存取屬性。

Q17:請問當該欄位編輯時,如何按FORM中的某一BUTTON將其內容送入該欄位游標所在之位置?

A:a=atom(memo0.lines)

x=memo0.SelStart &&可得游標位置

x1=len(a)

a=substr(a,1,x)+'A'+substr(a,x+1,x1-x) &&游標位置加入'A'

mtoa(a,memo0.lines)

Q18:有沒有可能在form.main之前先打開一個form, 但必須focused在這個form上, 等

這個FORM完成後再進入MAIN FORM?

A:1.在main.init 寫newform('abc')

2.在abc.init 寫abc.showmodal() 即可

Q19:VD2.0如何取得form底下元件名稱與內容 ?

A:Y=main.ControlCount

T=0 &&此為從0開始

Do While T<Y

X=main.Controls(T)

message(x.name) &&取得名稱

T=T+1

EndDo

Q20:我在MAIN FROM 下貼一EDIT0及一BOTTON,在BOTTON的運算式中寫一程式內容

為EDIT0.CAPCOLOR="紅色",執行時出現 "屬性寫入時發生型別錯誤,EDIT0.CAPCOLOR"

之錯誤訊息,是否方法錯誤,應如何處理?

A:不能直接用EDIT0.CAPCOLOR="紅色" ,請改成EDIT0.CAPCOLOR=255或EDIT0.CAPCOLOR=STRTOCOLOR('clRed'), 另外VD的[命令管理員]中如果有定義紅色的號碼,則可以用語法 EDIT0.CAPCOLOR=紅色

Q21:請問Form Name 最長可以用幾個字元??

A:Form Name最多為23個字元,請勿超過!

Q22: NEWFORM一個名為TEST_AB的FORM, 上面貼有物件後存檔, 再NEWREP一個名為TEST_AB

的REPORT FORM時會有error ?

A: NEWFORM及NEWREP名稱不可相同,如果相同就會有錯誤訊息,所以請修改其他的名稱

Q23:我用OnMouseMove事件來處理元件的顏色改變

Sender = GetEvent(0)

Sender.color = 紅色

很高興滑鼠指到該元件,真的變紅色!但是當滑鼠指標移出時,該如何變回灰白色?

A:如果此元件是貼在FORM上,就用FORM的OnMouseMove事件來恢復處理元件的顏色。

報表

Q24:VD2.0報表的框線, 如何動態決定是否列印?

A:可以,只要動態在該區域的init(起始程序)設定 detail.BorderStyle=5 &&無

其各值說明如下:

0:psSolid(實心) 1:psDash((----))

2:psDot((....)) 3:psDashDot((-.-.))

4:psDashDotDot((-..-..)) 5:psClear(無)

6:psInsideFrame(內框)

Q25:在報表執行時遇到"串列索引超出邊界" 的訊息,不知道哪裡出了問題?

A:一般有用到某物件的LIST屬性時,當該屬性的LIST內容超過範圍就會有此現象(在

VD2.0 中LIST是可以使用陣列型態來控制,如屬性標示為A者);另一種屬性為舉列

項目者,如ALIGNMENT為LEFT,RIGHT,CENTER,如你給他不正確的內容,也會有此訊息

(VD屬性型態為N),如果不是你有用程式控制的話,就是有某個物件亂掉了,這僅是用底

層來看這件事,如有實務發生的經驗者將對這個問題較有幫助,如果不能解決可以用COPY

另一個REPORT,再一個個刪掉來證明是那一個有問題。

Q26:因COPY REPORT 中的LABEL,誤選到DT表身,當CTL+V時即多了一個DT1,卻無法刪除。請問如何處理?

A:用物件編輯器,找出DT1,點選物件編輯器的左上角"-"號即可

Q27:我的需求如下:

甲廠商

上期結餘 100 (GH) * (A 檔)

本期進貨 88.04.01 100 (DT) (B 檔)

88.04.02 50

-----------------------------------------

本期應付 150 應付總額 250

-----------------------------------------

乙廠商

上期結餘 200 (GH)*

本期進貨 88.04.01 200 (DT)

88.04.02 50

-----------------------------------------

本期應付 250 應付總額 450

-----------------------------------------

問題:(GH) 中的甲廠商及乙廠商上期結餘 無法加總?請問該如何做,才可貼一個SUM 將上期結餘加起來?

A:你可以自行加總,方法如下:

1.在報表貼RH,RH貼一LABEL0,LABEL0的起始程序assign(label0.caption,'0')

2.在GH的結束程序assign(label0.caption,str(val(label0.caption)+上期結餘))

3.在RF貼一Label1 運算式設Label0.caption,(加總結果)

Q28:當報表設群組頁尾,那其小計如何印在其群組資料之尾筆右邊!如下:

001 WWWW WWWW 123

WWWW WWWW 456 579

002 XXXX XXXX 123 123

--------------------------------

A:把小計的sum元件貼在GF,sum上座標設成負數即可,GF高度設0

Q29:請問REPORT印表機與紙張的關係及VD20報表與Windows的印表機關係如何?

A:印表機部份:

VD20 REPORT 有存下印表機名稱,VD20 在打開 REPORT 時會先以REPORT存下的印表機為主,

如找不到再以WINDOWS的預設印表機為主,當然你也可以在INIT中設某印表機名稱即為那一台,如果你想換PRINTER,則可在[版面設定]中換掉PRINTER, PREVIEW及印表即會以你換掉的那台印表機為主。

紙張部份:

先有印表機,才有紙張,REPORT有存下紙張大小,當紙張大小為USER DEFINE(使用者自定大小)時,HeightInch及WidthInch才會有效,如果為其他,則此兩個屬性都無效(沒作用),當report 紙張大小可以被指定的PRINTER接受時,那就沒問題,但如果PRINTER不能接受此紙張大小

時,那會發生警告訊息(可以用<紙張不合警告>控制之), 此時會被改成A4 (沒辦法,印表機不接受)。

Q30: 已經設定好的報表高度(高度英吋),如果使用者在版面設定中異動印表機,會導致高 度改變且不正確 ?

A: Report在打開後,會先檢查設定的印表機在不在,若是不在(可能是換了一台電腦執行VD),則會自動選擇擇系統的預設印表機。然後再檢查紙張設定,若是該印表機沒有支援該紙張設定,會自動選擇A4。另外在執行模式設定印表機、紙張,也都可反應到設計模式的設定。

Q31: Memo field 在moveablepanel中會印不出來 ?

A: 這是對的,因為moveablepanel內不能放會長高的元件,他的用法是放在memo的下方,

他會根據memo的資料大小做下移。

Q32: report.init()

field0.caption='aaaaaaaaaaaa'

這在vd1.x是可以動態改變的,現在不行了?

A: 請使用『Captions』(有s),不是『Caption』,這個『Caption』屬性是內部使用的,這是VD20的新規定。

Q33: 在reportform中去調整 "高度英吋" 實際預覽時,依然沒有變 ?

A: 如果[預設紙張大小]選擇[自行定義],則調整"高度英吋"才有效,如果選一般的[A4]則需調整"高度"才可。

函數、命令

Q34:PARAMETER A1,A2,A3 如果呼叫TEST('AB','BB')時只傳了兩個參數,如何知道 A3 是無法存取?

A:下列兩種方式都可以

1.pcount() # 3

2.type('A3')='U'

Q35:陣列中可否有函數可自動重新資料排序功能?

A:陣列中沒有排序功能,但可自己寫,例如:有一 PUBLIC M1的陣列,執行以下 TEST()的內容就會排序:

EXTERNAL M1

i=1

DO WHILE i<=LEN(M1)-1

j=i+1

DO WHILE j<=LEN(M1)

IF M1[i]>M1[j]

TP=M1[i]

M1[i]=M1[j]

M1[j]=TP

ENDIF

j=j+1

ENDDO

i=i+1

ENDDO

Q36:請問於資料庫中地址列印時數字、郵遞區號半形如何轉成全形列印 ?

A:提供一個轉換程式STOS(string) (只能轉數字)

PARAMETER A

N=1

S=''

DO WHILE N<=LEN(A)

S=S+CHR(162)+CHR(ASC(SUBSTR(A,N,1))+127)

N=N+1

ENDDO

RETURN S

Q37: DTOC2()、DTOS()有何差別?

A:DTOC2()與DTOS()最大的不同為當_DATE_TYPE為7或8時,雖為YYYYMMDD或YYMMDD

前者為民國年,後者為西元年,也就是說當_DATE_TYPE=2,4,6時DTOC2()與DTOS()是一樣的,1,3,5,7,8是不一樣的。

Q38:請問如何測知軟碟機中的磁片是否處於防寫狀態?

A:您可在執行轉存動作前,先行拷貝一個小檔案到磁片上,或是以MEMOWRITE()函式將一

字串寫到磁片上:如: MEMOWRITE("A:\CHECKFD.TXT","CHECK FLOPPY DISK")

此時若是拷貝成功,則會傳回一個.T.值,可用此來測知!!若還是怕有萬一的情形發生,可建議您在拷貝完後,再以 FILE("A:\CHECKFD.TXT")來測知磁片上是否有此拷貝的檔案若有,則表示磁片並無防寫。

Q39:請問有無函數知道 BDE 的路徑名稱?

A:可用ALIASPATH(資料集名稱),傳回值為路徑名稱。

Q40:有無函數可以檢查 "*.TXT" 是否為合法檔名 ?

A:FILE(file-C)檢查檔案是否存在。

【參數說明】

file-C:

‧為一包括路徑的檔名。

【傳回值】

一邏輯值。

若所指定的檔案存在,則傳回 .T.,反之傳回 .F.。

Q41:以前之autono()引數內有指定資料表,新的取消了,要如何知道是要對何資料表處理?

A:先用sele table 再autono()即可,資料表屬性內已有定義<自動編號>功能,是一般的應用,如果你有特殊的需求,請自行用autono()處理。

Q42:有一個資料表A, 要將數筆搜尋出的紀錄複製到陣列中,我已建好一個陣列B, ARRAY('B',100),不知該如何複製,另如何將已運算好的陣列資料逐筆EDIT到資料表A中?

A:沒有特殊函數,只能用do while 逐筆複製

i=1

do while !eof()

B[i]=table->field

skip 1

i=i+1

enddo

回存反過來即可,但必須注意陣列B最多為8192個元素。

Q43:請問vd20可否存放指標值?

例:PObj[1]=getobj("xform","edit0")

Pobj[1].caption="test"

以上無效!若將Pobj[1]改為變數 x 則可

A:陣列不能如此用,請改用

x=PObj[1]

x.caption='test'

Q44:請問陣列搜尋函數如何製作?

A:大概只能用傳統的方式了

array('abc')

tot=len(abc)

i=1

do while i<=tot

if abc[i]='搜尋值'

message('找到了')

endif

i=i+1

enddo

如果是二維以上陣列,就要多幾個do while 了。

Q45:請問toseek()的用途?

A:toseek(Table,ToSeek,RetExp,Append,SaveRec)

1.如果Table目前state()=1(代表在browse mode)則 toseek() 會去找 toseek的值, 如retexp沒定義,傳回.T.(找到)/.F.(找不到),如有retexp,則傳回retexp 的值(找不到則傳回空的資料) append則控制找不到是否新增,saverec則用來找到資料傳回後,則須恢復原來找之前的那筆。

2.如果Table目前state()=2或state()=3(代表目前為新增或編輯狀態)則 toseek() 會先去開立另一table,並用新的table去找toseek的值,retexp則與state()=1完全相同,但是如果為此狀態者,append及SaveRec皆無效

Q46:transform('19990516','@d')應該等於'05/06/99',結果還是'19990516'

A:請改成transform('19990516','@D')即可

Q47:請問有什麼方法能知道某一路徑有哪些檔案 ?

A:貼一Filesel,然後設定FileSel0.Directory='c:\???'

FileSel0.FileName='c:\???\*.*'

FileSel0.items就是某一路徑的所有檔案

Q48:如何得知路徑存不存在?

A:使用FILE(dir+'\NUL')即可!

Q49:請問一字串比較問題!?

m1='' && (空字串)

m2="XX"

? m2=m1 => 相等嗎? 它傳回 .t.

這是BUG嗎?

A:此是正常因為

? m2==m1 &&它傳回 .f.

? m1=m2 && .f.

? m1=m2 && .T.

Q50:建議 DTOC3()將日期型態轉換成 "YYYMMDD" 字串型態,因為民國100年快到了

A: DTOC2()即有此功能,請設定_DATE_TYPE為7即可,如下:

_DATE_TYPE=1,3,5,7傳回YYMMDD

_DATE_TYPE=2,4,6傳回YYYYMMDD

_DATE_TYPE=8傳回YYYMMDD

Q51:我用AUTONO()寫AUTONO('table',substr(dtoc2(date()),1,4),6,.t.))則回應

'型態錯誤,巨集為空值',請問要如何修正呢???

A:VD20的AUTONO()規格中沒有TABLE,請改為

sele table

AUTONO(substr(dtoc2(date()),1,4),6,.t.))

Q52:我在一副程式如下:message2(1,'開啟中..','訊息')

newform('form'), Mssage視窗的抬頭'訊息'兩字有顯示出來,但內容'開啟中..'卻

無法同步顯示,要等到FORM開完成後才能顯示出來。

A:請將程式改寫如下:

message2(1,'開啟中..','訊息')

inkey() &&加入此行即可

newform('form')

資料表

Q53:在VD2.0資料集均為各自所有, 那不同的系統之間的資料集可以共用嗎?

A:如果你是指一個FORM上使用不同的資料集,那可以。

Q54:VD 2.0 中的指令 USE AAA IN XXX,資料集可以用變數或 &XXX 嗎?

A:B='XXX'

SETDBASE(B) &&動態設定

USE AAA

Q55: 資料表的自動編號功能在新增時不會先顯示,卻在存檔後才會跑出來.

A: 這是規格,因為在多人同時使用時,在你確定儲存資料時,系統才給AUTONO,這樣才不會有跳號的問題。

Q56:如何去複製一筆資料,例如單號870801的全部內容複製到單號870810?

A:可以把 table A 多開一次得 A1,然後用一 button 執行以下程式:

A1.SEEK(A->NO)

A.APPEND()

A.REPLACE('NO','870810') &&'870810'可用公式或AUTONO()

A.REPLACE('NAME',A1->NAME)

A.REPLACE('NAME2',A1->NAME2)

.

.

.

A.POST()

Q57:當兩台電腦同時存取同一筆資料時,假設A電腦正在修改這筆資料中,尚未 POST;"庫存 "欄位並沒有修改(假設值 = 50),而B電腦對這筆資料直接 POST 存入庫存 (40),這時

A電腦才 POST,請問庫存現在 是 40? 還是 50?

A:因最後POST 是A電腦,所以是50,此為樂觀式鎖定的特性,可讓兩台工作站更改同一筆資料,如果設定為悲觀式鎖定者,則同時只能有一台工作站可以進入更改同一筆的模式。

Q58:請教如何動態關閉過帳?

A:本身過帳也是元件,所以你可以從物件編輯器中看出此過帳的元件名稱,一般命名都會以起始Table加上終止Table去命名,如TransInvoztem等,如下的設定即可達到你要的需求:

Transtable.TransActionMode=3

0=累增

1=累減

2=覆蓋

3=不執行

Q59:我如何才能讓資料表的欄位真的有存入值呢?如果我在FIELD9的運算式下一個

(VAL(FIELD8.TEXT)/(FIELD8.TOTALVAL))*6000,我資料表和欄位有指定給它,但它並不會

放在資料庫裡。

A:有兩個方法

1.在存檔前寫 table.replace('xxx',(VAL(FIELD8.TEXT)/(FIELD8.TOTALVAL))*6000)

'xxx'是field9的欄位

或是

2.field9不要用運算式,然後在field8的結束程序寫

field9.text=str((VAL(FIELD8.TEXT)/(FIELD8.TOTALVAL))*6000 )

Q60:VD2.0資料表中有欄位預設值,資料字典中亦有預設值且新增物件時會帶入,兩者使用時机為何?有何差異?

A:

1.資料表中的系統預設值,可設定是新增或更改時該資料表要預設的欄位值,在存檔前會設值,所以屬於系統預設,不能編輯,因為編輯最後也會被覆蓋。

2.資料字典預設值,新增物件時會帶入,物件在執行模式被點選時會啟動.(當空白沒有內容時將會帶入此預設值)

Q61:當Table之預設值為True,EDIT之驗証條件有設,且強迫檢查為True,系統預設有設資料,在存檔時,不是先將預設值帶入再驗証,而是先驗証,並強迫USER輸入,也不將預設值帶入,規格如此嗎?好像不太對?

A:Table的系統預設是存檔前帶入,不管你有無輸入都會被覆蓋所以如果是系統預設欄位

,就不應該設驗証條件才對,也就是VD會先驗證欄位再做系統預設欄位的動作.

Q62:可否將自動編號的開啟改為動態設定,如此我就可以讓USER去選擇是否要自動編號?

A:請使用table.VDAutoNumber.Active=0 / 1即可

Q63:SQL 使用SUM之後,為何COPY至別的DBF.SUM的欄位卻為0 ?

A:客戶在使用SQL元件做Copy時,發現用Sum出來的欄位都Copy不出來,這個問題追蹤的結果,是BDE的版本問題。VD在Beta版本給你們的是BDE5.0(Delphi4.0),VD目前是使用Delphi3的開發,BDE版本應該為4.5才對,所以之前已裝的BDE,請依下列步驟解除安裝:

1) 先解除安裝BCB 3.0及Delphi 4.0。

2) 解除完BCB 3.0和Delphi 4.0後,解除安裝的程式並不會完全解除已安裝的BDE,所以要手動把BDE的檔案完全殺掉!這個步驟很重要,不然若是有殘餘的檔案未清,則接下來的安裝Delphi 3.0 BDE將會白費功夫。

3) 若是有安裝Delphi 3.0,建議一併解除安裝,再重裝一次會比較乾淨,也是同第2)點一樣,BDE的檔案要手動殺掉。

4) ***解除安裝、手動殺掉BDE後,一定要重新開機一次,否則殘留的Windows Registry會影響到下一次的安裝。

5) 手動殺掉BDE檔案時,若是當初安裝沒有特別去改路徑,則BDE在大部份的情況下會安裝在下列的兩個路徑中的其中一個:

X:\Program Files\Borland\Common Files\BDE

X:\Program Files\Common Files\Borland\BDE

6) 重開機後開始安裝Delphi 3.0,不一定要全裝,若只是為了製作VD安裝片,那只裝BDE和SQL Link就可以了,Delphi 3.0的主程式和其它的程式(如Desktop)都可以不用裝。

7) 安裝Delphi 3.0所附的InstallShield,不要使用BCB 3.0和Delphi 4.0的InstallShield程式,它們認得的BDE檔案不太一樣,混用會出狀況。

如果你們也有SQL Sum欄位Copy的問題,請依照上面的步驟解除Delphi 4.0、BCB 3.0、Delphi 3.0、之前安裝的VD 2.0,再手動殺掉BDE。重新開機後安裝新版的VD 2.0及正確的BDE。若是你們不在乎SQL Sum欄位Copy的問題,那麼就不用這麼麻煩了,使用那一個版本的BDE都無所謂,直接把VD 2.0的BDE灌在舊有的BDE上,沒有關係。

特別注意一點,即使VD 2.0的新安裝程式附了正確的BDE程式,但並不是直接把這個版本的BDE覆蓋安裝在舊BDE上就可以解決上述SQL Copy的問題,一定要清掉舊的BDE檔案後,重開機再安裝,否則是徒勞無功的。但是有一點,若是已經安裝了VD 2.0正確的BDE後,以後再用新版的BDE(BCB 3.0及Delphi 4.0)覆蓋上去也沒關係。也就是說,若是Delphi 3.0的BDE是這個系統中,第一套安裝上去的BDE,那就不會有SQL Copy的問題發生了。

Q64: 以 'PE' 找 TABLE 內欄位內容為 'PETER'之資料使用 TABLE.SEEK('PE') 應該是找不

到但卻傳回 .T. WHY? 好像是 SOFTSEEK一樣?

A: seek本來規格就是如此,只要('PE')前面相同都會找出來,而SOFTSEEK是找相近值

Q65:到底資料庫工具是否只有支援 STANDARD 的DBASE Driver ??若爾後我的資料庫為

Access 的 .MDB會不會也遭此不相容或不支援的問題?

A:資料庫工具只能維護DBASE 4以上的版本,如用到ACCESS,FOXPRO的資料庫需用C/S版

本透過ODBC去抓取

Q66:請問VD2.0之SEEK與SQL之使用時機為何?

A:

1.在C/S的資料庫最好用SQL語法查詢會較快,C/S的架構不適合用Table元件的SEEK動作,所以不能用SEEK。

2.如果使用DBF,用SEEK較容易發揮DBF的特色但複雜的查詢也可用SQL語法。

Q67:在Navigator查詢資料時,是否能顯示查詢正確之資料,其餘不相關之資料可否不必顯示出來?

A:Navigator的查詢是用seek,所以只能seek到正確之資料,你應該用Navigator 的資料搜索 (Set Filter) 或用Table.while()過濾資料才能做到。

Q68:請問Assign(table->field,xxx) 與 Assign(table.”field”,xxx) 有何不一樣?

A:Assign(table->field,xxx)是直接存入TABLE中

Assign(table.”field”,xxx)是存入BUFFER中

Q69:為何VD2.0自動編號無效?

A:請檢查一下TABLE是否把唯一鍵值設成True,請改設為False。因為唯一鍵值是無法支援VD TABLE的<自動編號>功能。

元件使用

Q70:請問於 Grid.CanUpdate 為 false 時 , OnKeyDown 可否知道最後按鍵為何 , 如

DBTOOLS 的 Lastkey()

A:可用一個公用變數記錄OnKeyDown的鍵值,基本上Windows並沒有LastKey()的功能,很難這樣做,也不妥這樣做。

Q71:我在Button0.Fun寫:

Assign(Combo0.Text,'CCC')

而 Combo0.Items[1]='AAA'

Combo0.Items[2]='BBB'

Combo0.Items[3]='CCC'

假設目前Combo0.Text是'AAA',當按下Button0時,畫面上的Combo0.Text果真變'CCC',

但是存檔後,仍舊是原來的'AAA',請問如何解決這問題?

A:Combo元件是不能直接更改Text內容,如果真的要改,也要改Item Index而不是Text,另一種方式則直接更改table的"buffer", table."field"='CCC'即可

Q72:為何Edit的 keydown事件攔不到Enter鍵 ?

A:EDIT <ENTER>有特別用途,請不要使用Keydown事件,改用KEYPRESS事件!

Q73:為何在EDIT0的OnChange 有一程序 LABEL0.CAPTION = EDIT0.TEXT VD 20 不會正確 SHOW出?

A:你要改成 LABEL0.CAPTION = EDIT0.EDITTEXT,這是VD2.0在Edit元件中新增的屬性

代表目前正在輸入的文字內容。

Q74:我在 Main Form 的 Init() 已加上_DATE_TYPE=7,但 Edit 欄位中的日期欄位卻出現 1999/4/6 ??

A: 請在EDIT的<定位格式>加入”@D7”即可。

Q75:請問如何透過filesel傳回不含路徑的檔名 ?

A:你可在edit的結束程序,把路徑去掉,FileSel0.Directory就是它的路徑。

Q76:VD2.0 在 KEY-IN 程式裡, 如果USER 使用 '搜尋' 這個功能,是否可將搜尋條件

顯示於螢幕上, 好讓USER 知道現在是否正在使用 '搜尋' 這個功能?

A:可貼一Edit,資料表設定為該資料表,然後在<運算式>設定為if(empty(getfilter()),'','搜尋中')。

Q77:為什麼我在定位格式欄位上打999,999,它的欄位是N型態,則會出現*******

A:因為欄位數值超過6位了,把定位格式改為@N7就好了。

Q78:COMPORT() 的功能為何?COMPORT()資料到達程序,傳送完畢程序,逾時程序為何用途?

A:COMPORT是設計用來使用串列埠的裝置(RS232)元件,

<資料到達程序>指當有新資料進入輸入緩衝區時會呼叫這個執行程序.

<傳送完畢程序>指當輸出緩衝區資料傳送完畢時會呼叫這個執行程序.

<逾時程序>指在資料輸入或輸出時若超過時限則呼叫這個執行程序.

Q79:想利用LOOKUPLIST做條件查詢,請問該如何做?

A:LOOKUPLIST只有範圍鍵值,是根據索引過濾,如果要更複雜的條件可用EditorPanel

設計,你可以貼入GIRD及FIELD,或設定FILTER等功能。

Q80:建議VD2.0 SUM元件增加一"執行條件"屬性,將可對各種條件做不同的SUM()結果,

例如:付款方式、己收未收等等。

A:如果是SUM元件,則其有[運算式]的屬性,可定義成 IF() 可達到[執行條件]的目的。

Q81:VD2.0的menuitem 元件是否能動態決定某一項顯示或不顯示?

A:可以,程式如下:

IF A='123'

MENUITEM4.VISIBLE=1

ELSE

MENUITEM4.VISIBLE=0

ENDIF

Q82:請問怎麼寫一個程式去看他們KEY的密碼對不對, 再決定是否要存檔,並如何輸入此密碼時出現*號不讓別人看見?

A:可在存檔前程序,判斷比較密碼,如果不符合,就RETURN .F.就不會存入。

如果輸入要出現*號請在edit的"<加密處理>輸入’*’號即可。

Q83:請問VD2.0的POPUPMENU該如何使用, 我在設定POPUPMENU後在前台點右鍵時

MENU並沒有出現。

A:main form有一屬性叫<開窗式選單>(POPUPMENU)需設定為POPUPMENU0才有效。

Q84:如果edit0只可輸入n個字元,要如何在輸入n個字元後,自動跳到下一個鍵盤順序?

A:可用OnKeyDown Event

if len(edit0.edittext)>=n

edit1.focused()

endif

Q85:請問Batchmove的用途?

A:1.取代複雜的COPY/APPEND指令(須幾次COPY才能解決者)

2.專門處理BATCH檔整批過帳到主檔中.

如:部門檔存入總檔,日檔/月檔過年檔等,主檔轉移至歷史檔.

3.取代沒有INDEX的TOTAL功能.

4.報表印表前的統計資料整理,由其是分類整理,按月/按區域/按部門

按SALES...,可雙向整理(二維式).

5.整批處理資料表間的過帳關係(如庫存過帳,傳票過帳)

唯一限制: 不支援Client/Server資料庫,須改用SQL語法或Store Procedure

來處理.

Q86:VD2.0 中'資料庫元件' 的 'CHECK' 元件,為何無<起始程序> 及<結束程序> ?

A:請使用事件功能的OnClick與OnExit,即可。

Q87:form的”位置”屬性中,poDesigned、poDefault...,各代表何意義與邊框型態的設定

是否會影響form的大小,執行模式與設計模式常不一樣,在編排版面非常不方便?

A:1.通常form的位置屬性是設定成poDesigned,因為Form打開時大小和位置都和你設

計時一樣。

2.poDefault:form的size是windows設定的,每打開form一次,位置就往右下移

3.poDefaultPosOnly: size是你設定,位置會右下移

4.poDefaultSizeOnly-: 位置固定,size是windows設定的

5.poScreenCenter: Form打開時,會自動在螢幕中央

Q88:在一個FORM中貼入一個日期欄位,該如何check日期欄位的合理性及不為空白?

A:if empty(stod(edit0.text)) .or. empty(edit0.text)

message('日期不對')

endif

Q89:combo可否動態建立文字內容?如何建立?

A:動態新增內容可用

n=len(Combo0.items)+1

Combo0.items[n]='xxxxx' &&'xxxxx'就是動態新增內容

Q90:SpeedButton「全凸」屬性的意義為何?

A:「全凸」這個屬性應該叫做「允許全凸」比較恰當。在族群代碼不為0時,屬於同一族

群的SpeedButton,在同一時間內只會有一個被點選下凹,而下凹的Button會一直維

持在下凹的狀態,一直到同一個族群的其它Button被按下為止。而「全凸」這個屬性

若是設成了True,則在已經下凹的Button上再點一下,也可以把這個Button的狀態

恢愎成凸起狀,也就是允許同一族群的所有SpeedButton都處於凸起狀態的意思。

Q91:SpeedButton[點選下凹]屬性的意義為何?

A:1.「點選下凹」屬性須與[群組代碼]相配合,設定[群組代碼]才能設定「點選下凹」。

2.「群組代碼」一定必須為1以上的組號,不能為0。(但DEFAULT為0)

3.「點選下凹」為控制那一個SPEEDBUTTON要凹下去,可以用MOUSE點或程式控制,也

可以用此屬性來判斷是否被點選,但同一組只能有一個被點選下凹。

Q92:請問如何動態取消edit的editor(取代編輯器)?

A:可用edit0.editor=0即可

Q93:想在程式執行時去更改LookUpList.Range值,因其為P型態,除了使用Public Var 外

,如何直接將值設給它?如: LookUpList1.Range="E02+E03"會出現型態寫入不符!!

A:可用LookUpList1.Range.source="E02+E03"

Q94:請教如何區分media是按了stop還是完全播完了?

A:可由OnNotify()事件得知

0:命令成功的呼叫完成

1:命令被其它命令替代

2:命令被使用者放棄

3:命令失敗

Q95:請教Lookuplist autocheck 設true之主要意義?功能為何?使用時機?

A:Lookuplist autocheck 的主要功能是當EDIT直接輸入資料,而不用LOOKUPLIST選取時

,他會去檢查你LOOKUPLIST中的TABLE鍵值資料是否存在,如果不存在就會有警告。

Q96:VD2.0 中的 BUTTON 有一個 <執行條件> 讓我們可以設定執行權限,但是 'MAINMEU'

的選項,好像沒有 '執行條件’的選項?

A:menu是有許多item組成的,所以如果您去設定某個menu執行條件為false,那就沒

什麼意義了,您可以去設定item.enabled來控制功能。

Q97:我利用了輸入元件內的"檔案盒"功能,來選擇檔案,選擇以後路徑會更新到所選擇的檔案那個路徑。請問如何還原成原來的路徑或者不讓他變更路徑?

A:可用Filesel0.Directory='c:\'&&原來路徑

Q98:在Grid裡面如果一直按下<UP>鍵至第一筆資料,該dbf會變成BOF()?

A:這是BDE的規格,GO TOP後BOF()為True,GO BOTTOM後EOF()為True,無法改變!

Q99:EDIT 的取代編輯器如何自動跳出??

A:把EDIT的AUTOEDIT屬性設成True即可

Q100:請問navigator 如何控制每個按鈕用與不用?

A:請用Navigator.ButtonEnabled:(C)型態預設值為 111111011011。設定TVDNavigator的功能,

0代表該功能不顯示在 TVDNavigator的選項內,

1代表將該項功能顯示在TVDNavigator選項內。

Q101:在lookuplist結束程序內若有focused()則無效,如edit0取代編輯器為lookuplist0

,lookuplist0之結束程序有edit3.focused()按完lookuplist後仍停在edit0,但有看到游標跑到edit3再跑回edit0

A:這是規格,回去EDIT0是正常的,誰呼叫他,就回去誰那!

Q102:field.totalval問題? 副程式,如下:

parameter f1,f1 &&f1,f2分別為兩個field

warning(&f1.totalval) &&沒問題

warning(&f2.totalval) &&沒問題

amt=&f1.totalval+&f2.totalval &&會出現'variable not found!!'

A:應該用 &(F1).totalval,不能用&F1.totalval

Q103:請教一lookuplist(sql)之問題!全域表單設sql(為二檔inner join而成),使用時,無法像單檔那樣可按鍵直接挑選,只能用捲軸來處理,為什麼?

A:因為SQL沒有SEEK! 所以無法用按鍵直接挑選.

Q104:用EditorPanel當作取代編輯器,裡面有貼SpeedButton,有設定熱鍵,但無法使用熱鍵

A: EDITORPANEL上不支援熱鍵 ,所以無法使用。

Q105: VD2.0的Mail.RecvAllMails(N)需要在括號裡輸入數值, 請問這些數值代表什麼含意?

A: RecvAllMails(Index-N)和DeleteAllMails(Index-N),意義如下:

1. 當傳入參數0或小於0時,表示要接收所有的Mail。

2. 當傳入參數大於0時,表示要操作在某一封Mail上。

***這兩個Method支援預設參數,當沒有輸入參數時,預設值為0。***

Q106: SpeedBtn執行程序去取edit的值都會是edit上一次的舊值

A: 如欲取得EDIT的最新值,請使用EDITTEXT即可,而不是使用TEXT。

Q107: 在edit0中設editor為editorpanel0,在editorpanel上貼一個edit和button,於button執行程序中輸入 : void(assign(editorpanel0.text,edit1.text),assign(editorpanel0.visible,0))

,理論上editorpanel0會關閉,卻沒有, 請問該如何使用

A: editorpanel為輸入元件,如果要傳回值請將button的[樣本]設為[確定]的樣式,

button 的執行程序要改寫為assign(editorpanel0.text,edit1.text),則editorpanel會自動關閉。

Q108:VD1.x 可以設定 PANEL 的 Enabled 屬性,但 VD2.0卻無法使用,不知如何使用?

A:Panel本來就有Enabled屬性,這是一個public屬性(就是不會出現在物件編輯器上)

,使用者直接就可以用了,例如:Panel0.Enabled = 1

Q109:button0的執行程序下,執行run("copy 檔案路徑"),結果都copy不過去

A:請將"copy 檔案路徑"改寫到.BAT內即可。 或直接使用VD的COPY FILE.

Q110:如果再加上一個button元件,然後將"樣本"設成[確定]就是打勾的那一項,上面

的 onkeypress立即失效,奇怪樣本設成別種就不會

A:Button上有兩個屬性,一個叫做Default(預設按鈕),另一個叫做Cancel(這個屬性被

設定成不顯示),當Default屬性被設成True時,這個Button會自動的攔截同一個Form

上的其它元件的<Enter>這個按鍵,視同為在它上面按Click,所以Edit的 OnKeyPress 在這個時後攔不到<Enter>。同理,當Cancel這個屬性被設為True時, Button會自動攔截<Esc>鍵。而檔把"樣本"這個屬性設為"確定"時,會自動的把 Default這個屬性一起設成True,才會造成這個效應。若不想這樣,只是在設定"樣本" 屬性後,再設一次Default屬性成false就好了。

Q111:假設在鍵盤輸入一字元'A':如何透過RS-232介面將字元輸出?

A:需用類似OnKeyDown的Event,並利用到COMPORT元件,在Event內用comport.sendchar()傳送出去。例如:請在表單貼上COMPORT及MEMO元件,MEMO為我們欲傳送的輸入元件,請在MEMO的OnKeyDown輸入一段程式如下:

EVENTPARA SENDER,CH

COMPORT0.ACTIVE=1

COMPORT0.CLEAROUTQUEUE()

COMPORT0.SENDSTR(CH)

COMPORT0.ACTIVE=0

RETURN

Q112:請問grid可否動態設定成不致能或不可改變RECNO()?

A:Assign(grid0.enabled,0) &&不致能, RECNO不能變更

Assign(grid0.enabled,1) &&致能且恢復

Q113:如何動態設定 menuitem 的某一功能不顯示 ?

A:Menuitem.enabled=0 &&Menuitem 會呈灰白

Menuitem.visible=0 &&Menuitem 會不顯示

Q114:1.在取代編輯器中不論是editpanel,lookuplist....等,可否得知

是由那一個edit所呼叫.或是此edit之名稱也可以?

A:你可設一公用變數xxx,然後在有設取代編輯器的EDIT起始程序寫:

TEST()

external xxx

xxx=this && xxx.name 就是edit之名稱

return

SQL

Q115:在MSSQL中查尋使用where B1.B1F1="X",結果無資料;改為WHERE B1.B1X1 LIKE "X%"

則查出符合資料,為什等號無作用?

A:SQL中之等號是完全等於,LIKE是屬於等於

Q116:SQL COMMAND是否可超過 255字?

A:可以超過255字元,以前VD1.x超過255有時會有問題,VD2.x沒有此問題。

Q117:SELECT SUM(INVO.INVO_TOT1) INVO_TOT1 FROM INVO WHERE NOT (INVO_DATE < '09/01/1998') AND NOT (INVO_DATE > '09/30/1998') 以上的SQL語法是否有誤?

A:改寫如下即可

SELECT SUM(INVO.INVO_TOT) as AMT FROM INVO WHERE INVO_DATE between '09/01/1998' and '09/30/1998'

Q118:不知VD2.0是否有支援SubSelectOR JOIN?

A:JOIN在VD1.x本來就有支持,但因為BDE 2.x的原因,所以有些指令不支持,

VD2.X是採用BDE 4.x以上,所以支援Subselect。

Q119:請問SQLRelation的用法為何?

A:你必須貼入兩個SQL,SQL0如為INVO,另一個SQL1為INVOSUB,後者SQL的Where必須為invosub.trn_no=&(SQL0->trn_no),這就是一個一對多SQL的關連,此目的是為了能讓SQL的QUERY資料可以新增更改及刪除,否則你使用JOIN的資料是不能被更改的。(關連時須用MOUSE從SQL0的<active>處拖放至另一個SQL1上即可)

Q120:我有一個table內有100 筆資料

select * from table where cust_no between &(form.edit1.text) and

&(form.edit2.text),如果view有10筆,但是sql.lastrec()=100

換了另外一種sql語法又不會,為什麼有些SQL命令 會有這樣的情形呢?

A:SQL元件有一屬性RequestLive(可否更改)如果設為False,sql.lastrec()就會是10,

這是Delphi的規格,所以使用lastrec()之前,把RequestLive設為False即可。

Q121: x='update invmain set cdate="19990331" 'sql0.send(x) 發生error creating cursor handle的錯誤訊息,但卻更改成功。

A: 請改用EXECUTE(),SEND()現在改為只使用在SELECT的語句上,ADD/UPDATE/DELETE請用EXECUTE()

Q122:在資料庫中,某一欄位鍵入的值有50三筆,40有二筆,60有四筆的話,請問,我要

如何做才能將50,40,60的筆數3,2,4的數值計算出來並且要作由大至小或者是由

小至大的排列組合。

A:可用SQL元件的COUNT函數

Select COUNT(INVO.AMOUNT) AS AMOUNT,INVO.TRN_NO From INVO INVO

Group By INVO.TRN_NO

如果要由大至小排列,再加上”Order By Amount DESC”或”Order By Amount”由小至大即可。

Q123:請教,vd1.x可用sql.send(),下insert,delete,update指令,vd20為何不能?

A:insert,delete,update指令需用sql0.Execute()

Q124:請問sql函數 substring()是否未支援?

select * from aa where substring(aa.f01,1,2) in (...)

為何會出現錯誤 ..,1,2) ?

A:有支援,請改用substring(aa.f01 from 1 for 2)

Q125:SQL語法 中使用 SUBSTRING(NAME,1,4),在程式內使用SEND() 方式產生錯誤,請問該如何使用 ?

A: 語法如下:

SQL0.SEND("SELECT * FROM TSTOCK WHERE SUBSTRING(NAME FROM 1 FOR 4)='0101'")

Q126:SQL物件只要語法寫成類似這樣:SELECT...WHERE A=&(SQL0->B)然後立即預

視結果或手動ACTIVE該SQL物件, 為何有Invalid use of keyword.Token:=的錯

誤訊息

A: 請檢查SQL物件內是否有用到保留字,請在保留字前後加單引號。

Q127:可否詳述一下有關SQL.Send()之語法, 在vd1.x版說的太簡單, 因我們要傳送的主要有vd的變數或物件?

A:SQL.Send()可採用VD的運算式,&()內你可以用VD所有的函數,當該SQL被啟動時,系

會自動尋找出&(),並先執行&()的結果再將此結果合併在原SQL語法內再送出至後端

資料庫,所以 &() 的結果也必須合乎SQL語法。另外 &() 的結果如果為字串型態時

,我們會自動再上引號 (如"或')如果為數值型態者,我們就不會加上引號.至於SQL

語法,可參考SQL書籍(書局很多)

Q128:在VD2.0的DBMODULE中定義了SQL, 其資料是取SQL SERVER, 但我在修改資料時會出現"CANNOT MODIFY A READ-ONLY DATASET", 可否請問一下, 在修改或新增SERVER端的資料時還要我下INSERT或UPDATE的指令嗎?

A:不用, SQL元件可以新增/更改/刪除,只要將他的 [可否更改]設為 True即可!

但你必須重新active一次, 另外,如SELECT有兩個TABLE以上也不能設[可否更改]為 TRUE.

C/S

Q129:VD1.x/VD2.x 除了DBF之外,可用那些資料庫 ?? 使用方式跟DBF一樣嗎??語法和指令也跟DBF一樣嗎??有應注意的事項嗎??

A:

1.VD 網路版只支援DBF, C/S版只要BDE支援,大部分的資料庫都可以使用,例如MS- SQL,ORACLE ...但是各家會有小部份不同,VD20現在測試是以MS-SQL為主。

2.如果用C/S架構,使用方式跟語法,當然會和DBF不一樣最好是用SQL語法。

3.至於c/s資料庫的控制方式,可以參考手冊第十四章。

Q130:在SQL Server上的資料庫我可以在資料庫管理工具上做管理嗎?

A:更改TABLE資料可以,但結構不能更改結構。

Q131:請問SQL Server上Table的正確用法?

A:如果要使用一個SQL Server上的Table,不管是使用TVDTable或是TVDSQL,當連上Grid及其它的資料庫元件時,如果要在上面做修改(或是新增、刪除),請特別注意,在這個SQL Table上,請至少建立一個Unique Index,最好是建立一個Primary Key。一個沒有有設定Unique Index的SQL Server上的Table,在修改的過程中,將可能會出現不正確的結果,例如:剛新增的一筆記錄看不到了(但資料是有寫入的,此時Active設成False再設成True就又看得到了);或是在刪除一筆記錄時,會得到一個"Multiple Record Found!"的錯誤訊息。 要這麼做的原因是,因為SQL Server上的Table沒有Record Number的觀念,如果不是自行直接使用SQL Command來操作,而是使用其它的資料庫元件時,例如Navigator或是Table的各個Method,而此時VD 2.0表面上是用Table的方式來操作,而底層卻是透過BDE轉成了一堆的SQL Command來實作。而在沒有Record Number來定位的情況下,底層的操作需要Index來輔助。不只是VD 2.0有這個問題,在其它以Grid like的界面來修改SQL Server Table Data的Tool,都是一樣的問題。 這樣的用法代價是蠻高的,如果真要發揮SQL的Power,請直接使用SQL Command才是正途。

Q132:Form有c/s的table, 而且第一次進入Form時, 就會有login 的畫面, 如何才能讓這個login的畫面消失, 用自己design的form去login呢?或是用 GetUser來自行Login到c/s呢?

A:可在Main.init的GetUser()後使用LoginDB(database-c,User-c,Pass-c)即可達到你的需求,如LoginDB(“MSSQL1”,_USER_NAME,_USER_PASS)

一.環境

Q1:我在網站上抓回的 VD2.01.....
  在執行時卻會出現 "OLEAUT32.DLL"之錯誤訊息,,
  且VD裝置錯誤....然後就不能執行了,,,,那裡出了問題?
  (我有將NX*.DLL,VENG*.DLL....等檔案覆蓋新版的)
A:這個問題是你的windows環境問題
  OLEAUT32.DLL檔的原始日期不對,你可找一台可執行的電腦,
  然後把它copy出來,覆蓋後就可以執行了.


Q2:在BDE中我們在新增資料庫時,其內容中的一些選項,如 LOCAL/SERVER
  ,如LANGUAGE....等,可以拉出視窗來選擇我們要的項目....
  然而在VD 中的資料庫管理工具中,也是直接關聯到BDE中的,所以我們可
  以直接在VD中新增或刪除或編修該資料庫,可是如我上面所說的那些可
  拉出的項目,郤是要我們自己輸入,無法拉出視窗來選擇,因此可否建議一
  下,將此VD資料庫工具給設成和BDE一樣的功能呢?
A:BDE的API並不是所有功能都能呼叫的!                                    
  有些設定只能在BDE 的ADMIN中設定,
  BDE的API查不到,並不是我們不想做.


Q3:為何使用email會出現vd20 550  <xx@xxxx> we do not support relaying?
A:應該是因為該環境為ROUNTER撥接,或是以MODEM撥接用戶,
  當還沒撥接上網時就會錯誤.


Q4:請問 VD 有沒有像 VB 的專案群組物件Group,來管理多個專案?
  可不可以從專案中呼叫其他專案的表單出來使用?怎麼做?
A:VD的專案都是獨立的,所以沒有,也不需要
  但如果要用其他專案的FORM時,可用專案拷貝的方式達成


Q5:在輸入欄位資料時,做一個驗證條件,而警告訊息有輸入一些提示,
  而我想問當警告訊息出現時,在對話框會出現"VD20警告訊息",
  請問"VD20警告訊息"此標題欄之內容是否可自行輸入呢?
A:設計模式->查看->多國語言->VDsystem->找出有訊息內容有VD2.0的項目
  ,然後自行修改.


Q6:我在功能表中選編輯/鍵盤順序後,為何都沒反應?
A:因為你的焦點不在Form上,滑鼠先點一下Form即可


Q7:VD控制器問題?                                                        
  請問我設定一個指令為SETLEVEL(0),執行之後,VD20控制器雖已隱藏起來,
  但如要呼叫控制器出來用何方式?
A:在捷徑vd20.exe filename.vds -g
  可直接進入設計模式


Q8:如何讓同一個 vds 程式不被重複載入,有時使用者之電腦速度很慢,
  因此每次在點選程式時,都會連續點選結果造成重複進入系統,
  更使得系統當機,因此要求設定能夠防止重複載入之判斷.
A:可在捷徑VD20.exe abc.vds -E 即可


Q9:Higher table level required!!是怎麼一回事???
  請問在vd20中在newform時出現以上的訊息該怎麼解????
A:因為你的BDE,是在較高版本的BDE建立的,例如BDE 5.0
  而目前使用的BDE 是BDE 4.0,
  請至較高版本的機器內,搜尋 IDDBAS32.DLL 複製至較低版本的機器內.


Q10:VD2.0 若執行 用戶登錄功能  於民國百年時只顯示 10/12/12為何?
A:你需在main.init把_date_type=8 才能顯示民國百年


Q11:想請教幾個問題。                                       
  1.普級版須要使用keyport嗎?
  2.keyport什麼時候使用?
  3.是否可匯入已存在的dbase或Access97資料庫檔案?可以的話要如何作業?
A:
  1.普及版不需要使用keypro!
  2.普及版不需要使用keypro,那當然是專業版才需要囉!
    使用後台keypro是在切換到後台設計的時候才要用到的!
  3.VD 2.0皆可使用dbase 及Access97此二種資料庫檔案格式,
    不過,Access97需在VD 2.0 Client/Server環境才可!


Q12:VD1.1與VD2.0程式是否通用?VD1.1版之程式在VD2.0如何轉換或是用何種方式可叫出使用?
A:目前只能重做,不能轉換,但程式語法大致相同


Q13:當有兩部電腦同時間對同一個table建資料時
  ,若該table有設定自動編號,一樣會出現相同
  編號重複,也就是說,將資料放於網路上,
  前台一起key資料,卻會造成每台資料不同步
  ,甚至在只看到有一筆一筆的樣子,欄位裡面
  卻看不到資料的問題,這樣的話,vd所開發出
  的軟體不就變成單機版才可以使用了嗎?
A:我後來測試結果正常,但BDE需設定
  執行BDEADMIN.exe,然後設定<system>/<INIT>
  內的LOCAL SHARE = True即可


!Q14:我用vd2.0在網路的環境裡,我用兩台電腦同時使用同一支key-in
  程式(不同筆),在A電腦修改某一筆資料,然後存檔,這時侯用B電腦
  去看這筆資料,卻是更改前的資料,我無論用'上筆','下筆'
  查詢都是舊資料,一定要按'首筆' 或 '末筆', 資料才會更新,
A:BDE需設定
  執行BDEADMIN.exe,然後設定<system>/<INIT>
  內的LOCAL SHARE = True即可


Q15:vd2.0 網路版可否讀取access 之資料庫,或需c/s才可?                     
A:需c/s版才可 


Q16:請問 VD2.0 如何製作安裝磁片???                                       
A:請用 Install Shield , 在我們的網站上有詳細的說明                                      


Q17:是否有單獨的 BDE 可以 down load ?                                    
A:用Install Shield 即可做成                                            


Q18:執行VD2.0時 , 如何直接進入設計模式 , 而不進入執行模式 ?      
A:vd20.exe *.vds -g 即可


Q19:NT SERVER 認不到keypro? 我照實用手冊上做,仍然認不到keypro??煩請解答,謝謝!!
A:手冊上CONFIG.EXE和WATCHDOG.SYS存放路徑是顛倒,請在程式下載區下載VD20NT.ZIP
  程式,內有詳細安裝說明,請按照說明安裝,這樣才可讀到KEYPRO 


Q20:請問在多人開發同一個專案的環境下 , VD2.0 如何在網路安裝??
  NOVELL .OR. NT Server???
A:最好是各自開發以後,再用專案拷貝整合
  只要資料集共用即可


Q21:如果在程式內執行一個批次作業,當該批次作業完成之後,要如何自動關閉該視窗?
  有沒有類似GETOBJ()的功能?
A:直接對MS-DOS模式(command.com)的內容做設定:
  1.找到command.com(通常這個檔案在同一部PC會有好幾個)
  2.在該程式上按mouse右鍵, 選取"內容"
  3.把"結束時關閉"check box選好
  4.按"確定"


Q22:
  一. 使用者權限置於何檔案, 可否開放給使用者自設
      如何開放?
  二. 資料結構己改變時, 系統該如何更新於客戶原使
      用環境上並改變其結構?
  三. 可否得知目前專案集名稱為何?
A:1.置於專案.vds,USERINFO()給使用者自設
  2.先用SAVESTRU()存成*.INI,在用RESTSTRU()回存
  3.你如果問資料集名稱,那TABLE的屬性就有


Q23:當我將一設計好的FORM 或 REP...存入"樣版"後...
  我去將該專案"清除"掉....結果也會清除掉這些樣版資料......
  不知VD是否可做成像DBTOOLS 5.XX一樣,可以保留著"自定模組"的資料呢?
A:VD20所有FORM,REP資料全在專案*.vds,當然你清除掉就不見了
  所以你可用一專案,專門儲存模版,然後用專案拷貝即可


Q24:我以前是用vd 1.x的網路版,
  如果要昇級到vd 2.x 的c/s版時
  是不是要補足所謂的昇級費用以及
  將vd1.x版的後台keypro寄回訊光來昇級
  成vd2.x呢?
A:沒錯


Q25:如果已昇級成 vd2.x的話,那如果我還要使用
  vd1.x的話,其後台keypro可以抓得到嗎?(也就是
  使用已昇級成vd2.x的keypro,即同一顆keypro)
A:可以


Q26:另外如果可以在vd1.x中抓得到昇級成vd2.x後的keypro
  時,因我以前的vd1.x是網路版,昇級vd2.x是c/s版....
  那麼請問在我昇級後,去執行v1.x時,是網路版還是c/s版呢?
A:c/s版


Q27:請教vd2.0專案中資料集路徑的問題                                      
  假如我有兩個專案.....TEST1 及 TEST2
  TEST1的路徑在C:\TESTA\TEST1.VDS
  TEST2的路徑在C:\TESTB\TEST2.VDS
  另有一個資料集 TESTDATA1 路徑是設在 C:\TESTA
  也有一個資料集 TESTDATA2 路徑是設在 C:\TESTB

  請問....當我在TEST1專案後台,設定資料集是 TESTDATA1後
  ,然後結束TEST1專案...接著去執行TEST2專案,進入後台,結果
  發現在TEST2專案中,其所選取的資料集竟是TESTDATA1....
  所以我便改成TESTDATA2....然後一樣的結束TEST2專案,再去
  進入TEST1專案的後台,卻又發現其資料集竟是TESTDATA2...
  請問這是正常的嗎?
  如果是將來我的客戶一旦安裝了我的兩套軟體時(不同資料集)
  會有問題發生嗎?
  註...根據我的測試,不管單台電腦上有多少個專案,其後台中的
  資料集名稱,都是以最後一次設定的名稱......
  即全部的專案中的資料集名稱都是最後一次設定的名稱....
A:專案的路徑,和資料集的路徑,是一點關係也沒有的
  專案只看的到資料集名稱,不管資料集的路徑
  每一個專案都可用很多資料集,相對的多個專案也可使用
  一個資料集;你的問題只要將VD20.EXE,SYSTEM.VDS,VENGINE32.DLL
  ,NXIPADD.DLL COPY到各目錄下即可,因為改變資料集後,會將結果
  存入SYSTEM.VDS中


Q28:有沒有方法可以將message()所顯示的字型放大?
A:可在專案管理員內的雜項設定頁中設定


Q29:如何才能將vd2.0 普及版的畫面刪除                                     
A:請把KeyPro插上,執行VD20後,切入設計模式
  在專案管理,會出現設定成專業版的選項
  執行它即可,NT環境還需執行config.exe,書上有寫

 

 

 

 

 


二.表單

Q1:執行程式時,可不可以讓Main表單躲起來,要用再秀出來。
A:可用assign(main.visible,0),把Main暫時不顯示,
  等要秀出來時, assign(main.visible,1)即可.


Q2:有一個TEST( FROM)然後再設計一個SQL查詢,
  但SQL必須再重新設計另外一個( FROM),
  是否能利用TEST( FROM)來共用不必再從新開一個from.
A:你應該使用GLOBAL Form ,然後在GLOBAL Form開SQL元件
  此時每個Form都可使用此SQL元件.


Q3:以 GRID OnDBCLICK 事件去執行 NEWFORM 開起一FORM,為何無法進入
  該 FORM 編輯而馬上跳回原 FORM(該FORM已被開啟,但被原 FORM:蓋住),
  但以 OnKEYPRESS 去攔截 ENTER 鍵去執行就無此問題,請多多
  指教 !
A:Newform()後不可再執行其他指令,否則會跳回來.


Q4:為何表單大小固定好了時將表單關掉再開起時表單會自動向下增長
  蓋到下面的開始工具列
A:請把Form的屬性"位置"要設固定,"自動捲軸"設False即可


Q5:是否可以增加logo畫面                                                 
  VD從1.0到現在的版本都沒有logo的畫面, 是不是考慮在專案選項的地方加入此功能....
A:可在main.init
  x=newform('logo')
  x.showmodal()


Q6:請問二個問題                                                             
  1.資料庫管理工具內, 不能更改欄位順序, 也不能插入欄位,是規格嗎?
  2.開啟NewForm('XXX')或報表開檔, 或其他開啟檔案, 可否增加一些訊息
  " 開檔中, 請稍等 " OR " 執行中, 請稍等 ",再加一跑馬登進度, 這方面好像開啟任何
  FORM都沒SHOW訊息,USER 常以為當機...
A:1.是規格
  2.可以自己使用message2()來作訊息   


Q7:RE:VD20一些問題請教?                                                
  1. 例如我在一個test.form中設定一個課室欄位(edit1),而在確定之(botton)中設定
  執行程序為newform('text1'),在test1.form中設定sql,其資料集已設定好例如
  AAA,畫面欄位也已安排好,欄位中AAA.type為課室欄位,請問sql之where
  運算式如何去取得test.form之課室欄位(edit1)資料來做查詢條件?
  2. 另外設定一個密碼欄位(edit10),其定位格式為9999而在輸入數字時有何方法
  不讓數字顯示出來,而只顯示****。
  上述2,3問題煩請賜教,謝謝!
A:2.可用where AAA.type = &(edit1.text)
  3.Edit的加密處理屬性,設成'*' 即可


Q8:要如何才能讓表單於輸入某一鍵值時,可以讓原有相同資料顯示出來,並且可以做修改的功能。
  例如:在姓名欄輸入張三之後螢幕可以顯示原來資料庫中張三的資料,並可做修改的動作。謝謝
A:可用Table.while() or Table.filter()過濾資料

                         
Q9:RE:form  的大小值'常常會跑掉可以修正嗎?
A:Form "位置"的屬性需設成"固定"


Q10: 如何才可以按button後把前一視窗關閉, 開啟button所指定的視窗呢?
A:form.close() 及newform()  

 

 

 

 


三.報表

Q1:1.我在報表的init事件中過濾資料,可是我是用sql的方式,是不是
  不可以用sql0.filter("'...'$..."),應該要用什麼?
   2.table.filter()可不可以用變數來取代,我下
  ffa02.filter("ifa04.edit0.text$欄位")
  它會找不到任何資料What got i do??
A:1.應該是用SQL語法 where 過濾資料,比較好
  2.table.filter()可以用變數來取代,只要語法正確,
    例如,S1=ifa04.edit0.text+'$欄位'
    ffa02.filter(S1)


Q2:在vd1.x的報表中有傳真的功能,很方便很好用.  在2.0中好像不見了,是沒有了?還是設定方法不同?
A:VD2.0沒有傳真功能,但你可用windows 的FAX
  選擇印表機時選用FAX


Q3:有關報表問題請教,
  當報表設群組列印時,SUM設連接群組(每一群組統計一次)
  但無效,仍全部統計!
   例: 8808  S001 88.08.01   X1   10  100 (15  315)
                             V2    5  200  15  315 #
  -------------------------------------------------
             S002 88.08.05   N1    3   60  (7  147)
                             N2    5   80   7  147 #
  -------------------------------------------------
      8808小計:                   23  440  22  462
    本來是一對多,經SQL JOIN 後,原單頭會隨單身重複,
    所以括弧處是沒印出,但SQL表內仍有值,因此印出
    15+15+7+7=44, 315+315+147+147=924
    照理說SUM設有連接群組應只計算該群組之一筆
    15+7=22, 315+147=462
A:sum可用運算式if(empty(field.text),0,sql0->15) 15是欄位名稱
  Empty(field.text)是判斷是否加總.


Q4:為何在GH設定 群組換頁=true 及paintnewpage=true
  群組鍵值也有設定,但一群組印完後pagenumber並不會回到1,仍然繼續累加???
A:會計sample,傳票列印就有此技巧
  可貼一Variable,列印變數設"頁次"
  連接群組表頭設GH,即可


Q5:請教一個笨問題!以前當DETAIL行數設1以上時(Dbt FOR win),可設縱印或橫印
  現在要在何處設定?(不是直印或橫印,而是資料排列是先上下再左右)
  Thank You !!
A:現在改為DT的列印方向.


Q6:請問再設計報表時,物件編輯器中紙張大小除了下拉內定之紙張大小
  外,如何去自訂大小呢?
A:將屬性「預設紙張大小」設成「使用者定義大小」後設定屬性「高度英吋」、
「寬度英吋」即可。單位為百分之一吋


Q7:為何我在屬性「預設紙張大小」裡下拉式內容找不到有「使用者定義大小」這個項目?
A:這是你的印表機所支援的紙張不支援的結果,你可以去控制台的印表機中觀看內容,是否有
  支援使用者自訂大小的功能


Q8:如何動態設定報表的背景圖??                                           
  ReportForm.Picture 不是 C 型態,而是 P 型態!!
A:P=REPORT.Picture
  P.LoadFromFile(FileName)

  因為 REPORT的Picture規格開錯,為TBitMap的Object,
  應該為FileName比較好用,因為也不能改了,所以使用
  VD底層的Method來用.其中 P就是 TBitMap的Object.


Q9:請問在一報表中,如何才能在明細欄右方印出備註欄位,不是針對該筆明細,
  而是針對報表表頭,,,,
A: Memo元件貼在PH,但上座標加高,使Memo的位置和Dt平行.


Q10:請問在DT的明細項該如何控制才可印出明細項之流水號數?
A:REP.DetailCount就是流水號數,用Label
  運算式STR(REP.DetailCount)把它秀出即可


Q11:強烈建議加入GH的換頁重印屬性及功能?                                  
  原vd1.x有的功能在2.0沒有納入,以  GH換頁重印應該是一個很重要的屬性。
  因為在製作多筆銷貨單列印時如果不透過
  此屬性會導致難以設計之窘境
A:換頁重印屬性已存在,可用屬性管理員把他設成顯示


Q12:群組報表問題                                                         
  1.GH page未因群組更換而歸1, paintnewpage=true
  2.GF sum 未統計
A:1.你應該用Variable元件,設連接表頭,才能根據GH顯示頁次
  2.GF的sum不用設連接表頭,才會顯示.


Q13:在設計橫向報表時PageDetail因欄位較多無法擺下,只好把某些欄位擺至下一列
  但執行時DetailTitle只顯示上列之抬頭而下列欄位抬頭卻沒有?要如何做呢?
A:請把detail title拉高就會看到第二列的title.

  
Q14:建議報表提供Eject跳頁指令 
  A:可使用 REPORT. CURRENTTOP來判斷目前位置(點數)
  再以Detail.Height來處理,如下:
  Detail的When中:
  IF REPORT1.CURRENTTOP>680
     Detail0.Height=300 && 讓他跳頁
  ENDIF
  RETURN .T.


Q15:如設變數加總, 該變數會加倍 (報表幾頁就多幾倍) ,假設加總數量,  該數量正確為 
  1000,但因該報表共三頁, 加總值變 3000.
A:VAR不能用在加總!請用SUM,SUM可以用EXP.


Q16:RE:報表的問題                                                        
  請問:我現在要產生一個報表,其中的起始鍵值和終鍵值都有輸入條件了,我在輸入的型態為
  "字串"的欄位都沒問題,可以產生我所要的資料範圍,但在另一個報表中,我要輸入的型態為"日期"型態時,請問為什麼我的資料都沒有顯示出來,
  例如:
  要查編號20到30號人的資料==>可以顯示出來
  要查生日88.06.01到88.06.30的資料==>沒有顯示出來
A:很抱歉,本身BDE不支援日期型態的SET WHILE
  所以資料都沒有顯示出來,建議你用C 8 型態
       做為日期欄位即可


Q17:RE:report之預設列表機及紙張大小要如何動態更改呢???                   
A:1.預設列表機 rep1.DefaultPrinter=getprint(1)
  2.rep1.DefaultPaperSize=N 
  && 如要得知N數值多少,可先設定好DefaultPaperSize
  然後在點提示 ? rep1.DefaultPaperSize 即可


Q18:請問如何將vd20的報表設定成中一刀,vd20好像沒有紙張高度的屬性      
A:設定高度英吋屬性,紙張大小選擇使用者自定


Q19:我在報表的 init 設 
  1.  PUBLIC  CNTL
  2.   CNTL = 0
  在報表的DT 中貼一個報表的 Label , 其運
  算式設為  ASSIGN(CNTL,CNTL+1)
  執行時會出現 'CNTL 變數找不到 ?'
  請問為什麼?
  THANK YOU !!
A:你應該在執行該報表之前的FORM 中設 PUBLIC CNTL
  然後在該支報表的INIT 宣告 EXTERNAL CNTL CNTL = 0
  這樣就不會發生錯誤訊息! 


Q20:當detail中field資料自動折列時,如何讓detail自動拉開
   例:  1   ruweyrw
            quewq       => 自動拉開
        2   sfusdf
        3   sgjdsg
A:1.可用Memo元件取代,DT才可自動長大
   

Q21.在報表中己定義 INVO 一對多 INVOSUB   整理好 TEMPA 1,TEMA2
  INVO.REOPEN('TEMP','TEMPA1','NO')
  INVOSUB.REOPEN('TEMP','TEMPA2,'NO')
  出現 INVO 與 INVOSUB 的關聯被刪除
A:恢復關連的函數是Table.Masterchanged()


Q22:一個form設定好尋找的條件後,如何將範圍傳給rep                         
A:可在report的init過濾Table
  例如: set filter to xxx=form.edit0.text


Q23:欄位有43個要列印在A4紙張,欄位垂直排列,資料筆水平排列
  報表格式如下:
  ==========================================
            1   2   3   4   5   6   7   8
  欄位名1   aa  bb  cc  dd  ff  gg  hh  ii
  欄位名2   aa  bb  cc  dd  ff  gg  hh  ii
  欄位名3   aa  bb  cc  dd  ff  gg  hh  ii
     |            |              |
  欄位名43  aa  bb  cc  dd  ff  gg  hh  ii
  ==========================================
  請問要如何設定??
A:我認為應該要有一個列印工作檔a.dbf
  dbf的格式和報表格式一樣
  然後把資料整理至列印工作檔a.dbf
  報表就用a.dbf設計即可
  
    
Q24:有此報表,要如何印???                                              
  想請教一下,如果有以下的報表:
  INV1    US      1000
  INV2    UK      2000
  INV3        NT        3000
  INV4        SIN        4000       
  INV5        US        100
  INV6        NT        300
  INV7        SIN        400
  =========================
  以上的資料在一DBF中,其中US,UK等為外弊單位,如果在報表印
  完後想印一類似以下的加總:
         US       1100
         UK       2000
         NT       3300
        SIN       4400
  應該怎麼做????(其中外弊單位並不是每一次都固定一樣多個)
A:在REP的INIT先用SQL算出幣別加總,然後填入Label中
  是最簡單的方法


Q25::如何將 KEY-IN 程式中的 ‘搜尋’ 過的資料, 直接貼一個印表的
  BUTTON  , 再將篩選過的資料列印出來 ?
A:可在Rep的INIT 執行Table.Filter(Form.Table.GetFilter())
  此時REP和Form的Table就會同步
  這是最快的方式 Table.Filter(Form.Table.GetFilter()) 但這對於花費二倍的
  時間,如果資料筆數不小(超過3000以上),利用此法,效率大打折扣


Q26:我不想在資料表中列出整個欄位的資料,例如"姓名"欄位我只想要印出"姓"來,我要用什麼指令。
  找出來我"姓"又可不可以做為群組的依據...可否請你說詳細一些...謝謝!!
A:要把姓名欄位中的資料挑出來
  你可用姓名欄位當索引,如果要全部印出所有資料
  以姓分群組,可在GH的群組鍵值設substr('姓名',1,2)
  否則可用table.while()挑資料  


Q27:報表的起始鍵值及結束鍵值 ,如果其鍵值是複合鍵, 資料似乎都不會產生, 請試試看.
A:你要考慮欄位長度不夠,須加空白
  A1 C8  A2 C10 INDEX->A1+A2
  起始鍵值須'ABCD    '+'AAAA' 


Q28:請教印表時2byte的中文字能不能轉90度,類似於DOS ET ~V控制碼的效果
A:可以選有 @開頭的字型或者利用label元件,將其設定直列即可

 

 

 

 

 

 


四.函數、命令

Q1:請問如果DLL有多個傳回值,我該如何做呢??
  如果call()只能有一個傳回值,那是否可以修改成為有多個傳回值??
  因為有很多功能我們可以透過Win32API來作,這樣貴公司的負擔就少很多了,
  但Win32API的傳回值並非只有一個.
A:你可傳回一個結構字串,再一一分解給VD用,
  例如傳回STR1(C8),用substr(STR1,1,4) substr(STR1,5,4)
  分別得到兩個回傳值,
  或是帶入一個參數值,然後帶回應該取的值,相信就可以
  達到您的要求.


Q2:以下是我的程式碼,我寫在BUTTON的執行程序,每次程式執行到第40行時就會出現
  錯誤代碼121,"參數格式錯誤","NEWOBJ"
  if ! empty(ifa04.edit1.text)
     wkcomp = ifa04.edit1.text
  else
     X=Newobj("TVDSQL","SQL")
     X.DataBaseName="DB01"
     X.Send("Select *  INTO WKFA04 From TBFA04")
  endif
  newrep("RFA04")
  return

A:因為你的Newobj("TVDSQL","SQL")參數不夠
  Newobj("TVDSQL","SQL1","Form_name")才對


Q3:請教 SURE() 'Y','N','C'                                              
  SURE 傳回值為一個字元,'Y'代表<是>
                         'N'代表<不是>,
                         'C'代表<取消>  
   IF SURE('確定結帳嗎?','確認視窗',100,200)='Y'
   ..           && 結帳程式
   ENDIF
   請問 回傳值應如何取得?
   又當回傳值為 'C'時 如何去執行某一段程式 ?
A: 你需用一變數
  X=SURE('確定結帳嗎?','確認視窗',100,200)
  if X='C'
    && 結帳程式
  endif


Q4:請問陣列的起值為什麼是1而不是0呢!
  別的軟體好像都是零開始吧...
  如果我要用指標零怎麼辦...
  ARRAY('AAA',15)
  ...
  ...
  AAA[0] = XX
  ...
  會出現錯誤
A:規格是1開始,指標零你可用 AAA[0+1] = XX即可


Q5:請問在一對多的grid中如何才能設計出明細grid的明細項目序號,有什麼技巧嗎?
A:Grid無此功能,你可加一欄位記錄明細項目序號,然後用Autono()自動編號


Q6:如何Call Win32 API (重新啟動電腦)
A: DLL_USER32=Load('User32.DLL')
   CALL(DLL_USER32,'ExitWindowsEx',"5LL",2,0)


Q7:請問Try error 如果要攔截err code, 應該要如何作呢?
A:可以使用_ERR_CODE,_ERR_MSG1,_ERR_MSG2來判斷! 
  TRY                    &&測試是否會發生錯誤
     ..
     ..
  ERROR                 &&發生錯誤時會直接進入本段程式中執行
     Message(_ERR_MSG1)
  ENDTRY                &&宣告停止測試錯誤C


Q8:有關資料加密問題,請教一下!                                           
  我如此作:table->cpw => (c type,16 byte) 要如何用edit編修完之資料經加密存入table? 呼叫時                    可反解密? 如下作法
        edit2.endproc: assign(edit2.text,dlock(edit2.text))
        table.postbefore: table.replace('cpw',edit2.text) 
        可是dunlock(table->cpw)之值和當初輸入之值不符
        若未存檔,直接dunlock(edit2.text)就相同!不懂那兒出問題?
        ****
        1. 使用一edit1來輸入->加密->存檔->顯示(已加密)
        2. 再用另一edit2輸入->比較edit2.text=dunlock(table->cpw)結果都是.f.
        3. 若 1 不存檔 edit2.text=dunlock(edit1.text) => .t.
       為何? thank you !!
A:不用那麼複雜,只要在edit2的定位格式輸入@L即可


Q9:REFORM() 函數好像不能用,                                             
        假設 TABLE=ABC
        我作, REFORM(ABC->NAME,50,.T.)無效,  請問該如何作....  thanks
A:X=REFORM(ABC->NAME,50,.T.)
       X就是重排結果


Q10:dbtools 5.x 在copy next 1 to temp 後,記錄指標仍在原記錄
  但 vd2.0 在 copy next 1 to temp 後,記錄指標會移動,並不會
  停在原記錄.不知道是否系統規劃如此?
A:目前的規格是如此                                                     


Q11:RE:如何動態設定 menuitem 的某一功能不顯示 ?                 
A:Menuitem.enabled=0  &&Menuitem 會呈灰白
  Menuitem.visible=0  &&Menuitem 會不顯示


Q12:1.message2():我在一副程式如下:
             message2(1,'開啟中..','訊息')
             newform('form')
  mssage視窗的抬頭'訊息'兩字有顯示出來,但內容'開啟中..'卻無
  法同步顯示要等到from開完成後才能顯示出來.
A:請將程式修改如下即可
    message2(1,'開啟中..','訊息')
    INKEY()
   Newform('form')           


Q13:如何設定使A FORM   / B FORM  之變數不會相互干擾
  a form 的init設定變數
    Public MasterKey
    MasterKey="abc"
     ..
     ..

  b form的init設定變數
    public Masterkey
    MasterKey="def"
    ..
    ..

  在MID格式下,選A FORM 執行後又選 B FORM 執行
  則最後MASTERKEY="def",若切換至A FORM 的
  則變數會不正確,程式執行錯誤.

  1.如何設定使A FORM   / B FORM  之變數不會相互干擾
  2.如不設PUBIC如何使FROM
    底下FUNTION可用到INIT程式所設的參數

A:1.變數設PUBLIC,當然兩個form會相互干擾,因為利用PUBLIC為公用變數
  2.可使用edit元件當變數


Q14 :請問一字串比較問題
  ? m1= ''        && (空字串)
    m2="XX"
  ? m2=m1   => 相等嗎? 它傳回 .t.
  這是BUG嗎?
A:此是正常,因為  ? m2==m1  &&'=='代表完全相等,固它傳回 .F.
  ? m1=m2    &&代表NULL是否等於"XX",故傳回 .F.
  ? m2=m1    &&代表"XX"是否等於NULL,因為任何值都可以等於NULL,故傳回 .T.


Q15:假設在鍵盤輸入一字元'A',如何透過RS-232介面將字元輸出?如何使用函數寫程式?
A:需用類似OnKeyDown的Event,在Event內用comport.sendchar()傳送
   
                                               
Q16:請問VD2.0之SEEK與SQL之使用時機為何?                                 
A:1.在C/S的資料庫最好用SQL語法查詢會較快
    C/S的架構不適合用Table元件,所以不能用SEEK
  2.如果使用DBF,用SEEK較容易發揮DBF的特色
    但複雜的查詢也可用SQL語法
   

Q17:寫程式, 最好寫一次, 讓很多地方都可輕易的呼叫來使用,
  讓程式維護起來更方便, VD FUNCTION 之寫法, 如牽涉到
  別的FORM 或別的TABLE 時, 好像都無法應用, 可否請教共用
  FUNCTION 之程式技巧, 謝謝.
A:可用Active('form_nmae')來動態設定預設的form,
  但form與form的各Table是獨立的,
  除非Global Form的Table才可共用 


Q18:autono('table',substr(dtoc2(date()),1,4),6,.t.))
  則回應'型態錯誤,巨集為空值'
  請教先進,要如何修正呢???
A:改為
  sele table
  autono(substr(dtoc2(date()),1,4),6,.t.))


Q19:請問有沒有人知道統一編號檢查碼的運算規則.
A:

  PARAMETER cCom_Id                                                                       
  IF LEN(ALLTRIM(cCom_Id)) < 8                                                            
     RETURN .F.                                                                           
  ENDIF                                                                                   
                                                                                        
  I=1                                                                                     
  DO WHILE I<= 8                                                                          
     IF SUBS(cCom_Id,I,1) < '0' .OR. SUBS(cCom_Id,I,1) > '9'                              
        RETURN .F.                                                                        
     ENDIF                                                                                
     I = I + 1                                                                            
  ENDDO                                                                                   
                                                                                        
*               營利事業統一編號 邏輯檢查方法                                           
* ┌────┬────────────┬──────────┐                          
* │項    目│  計    算    方    法  │  說            明  │                          
* ├────┼────────────┼──────────┤                          
* │統一編號│ 0 4 5 9 5 2 5 7        │                    │                          
* │        │                        │                    │                          
* │邏輯乘數│ 1 2 1 2 1 2 4 1        │兩數上下對應相乘    │                          
* │        │                        │                    │                          
* │乘    積│ 0 8 5 1 5 4 2 7        │乘積直寫並上下相加  │                          
* │        │       8     0          │                    │                          
* │        │                        │                    │                          
* │乘積之和│ 0 8 5 9 5 4 2 7        │將相加之和再相加    │                          
* │        │                        │                    │                          
* │        │ 0+8+5+9+5+4+2+7=40     │                    │                          
* │        │                        │                    │                          
* ├────┴────────────┴──────────┤                          
* │最後結果, 40 能被 10 整除, 故 04595257 符合邏輯。       │                          
* ├────┬────────────┬──────────┤                          
* │統一編號│ 1 0 4 5 8 5 7 5        │倒數號二位為 7      │                          
* │        │                        │                    │                          
* │邏輯乘數│ 1 2 1 2 1 2 4 1        │兩數上下對應相乘    │                          
* │        │                        │                    │                          
* │乘    積│ 1 0 4 1 8 1 2 5        │乘積直寫並上下相加  │                          
* │        │       0   0 8          │                    │                          
* │        │                        │                    │                          
* │乘積之和│ 1 0 4 1 8 1 1 5        │再相加時最後第二位數│                          
* │        │             0          │取 0 或 1 均可。    │                          
* │        │                        │                    │                          
* │        │ 1+0+4+1+8+1+1+5=21     │                    │                          
* │        │ 1+0+4+1+8+1+0+5=20     │                    │                          
* │        │                        │                    │                          
* ├────┴────────────┴──────────┤                          
* │最後結果中, 20 能被 10 整除, 故 10458575 符合邏輯。     │                          
* └────────────────────────────┘                          
                                                                                        
** 乘上邏輯乘數                                                                         
cM01=STR(VAL(SUBSTR(cCom_Id,1,1))*1,2)                                                  
cM02=STR(VAL(SUBSTR(cCom_Id,2,1))*2,2)                                                  
cM03=STR(VAL(SUBSTR(cCom_Id,3,1))*1,2)                                                  
cM04=STR(VAL(SUBSTR(cCom_Id,4,1))*2,2)                                                  
cM05=STR(VAL(SUBSTR(cCom_Id,5,1))*1,2)                                                  
cM06=STR(VAL(SUBSTR(cCom_Id,6,1))*2,2)                                                  
cM07=STR(VAL(SUBSTR(cCom_Id,7,1))*4,2)                                                  
cM08=STR(VAL(SUBSTR(cCom_Id,8,1))*1,2)                                                  
                                                                                        
** 計算乘積和                                                                           
nM01=VAL(SUBSTR(cM01,1,1))+VAL(SUBSTR(cM01,2,1))                                        
nM02=VAL(SUBSTR(cM02,1,1))+VAL(SUBSTR(cM02,2,1))                                        
nM03=VAL(SUBSTR(cM03,1,1))+VAL(SUBSTR(cM03,2,1))                                        
nM04=VAL(SUBSTR(cM04,1,1))+VAL(SUBSTR(cM04,2,1))                                        
nM05=VAL(SUBSTR(cM05,1,1))+VAL(SUBSTR(cM05,2,1))                                        
nM06=VAL(SUBSTR(cM06,1,1))+VAL(SUBSTR(cM06,2,1))                                        
nM07=VAL(SUBSTR(cM07,1,1))+VAL(SUBSTR(cM07,2,1))                                        
nM08=VAL(SUBSTR(cM08,1,1))+VAL(SUBSTR(cM08,2,1))                                        
                                                                                        
lRet1=IF(MOD(nM01+nM02+nM03+nM04+nM05+nM06+nM07+nM08,10)=0,.T.,.F.)                     
IF nM07=10     && 7*4=28 ==> 2+8=10                                                     
   lRet2=IF(MOD(nM01+nM02+nM03+nM04+nM05+nM06+1+nM08,10)=0,.T.,.F.)                     
ELSE                                                                                    
   lRet2=.F.                                                                            
ENDIF                                                                                   
RETURN lRet1 .OR. lRet2 
                                                               

Q20:動態改變GLOBFORM LOOKUPLIST RANGE 會有錯誤訊息                       
       FORM A 有一 GRID
GLOBFORM B 內有 LOOKUPLIST  RANGE 空白
在 FORM A 內 FIELD0 取代編輯器填入 GLOBFORM B
  ....       FIELD0 起始程序填入

  ASSIGN(GLOBSELEBASIC1.LookupListPARAC.Range,"'AA'")

執行時卻出現屬性型態錯誤
設定有錯嗎?
A:ASSIGN(GLOBSELEBASIC1.LookupListPARAC.Range.Source,'AA')
    加.Source 即可


Q21:RE:如何執行信件之附加檔?                                            
A:如果執行的附加檔案為word檔,也就是.doc檔,可以利用run()
    寫法如下:
    RUN("路徑\WINWORD.EXE  欲執行的.DOC")
     

Q22:收到的附加檔不是已被改名了嗎?不知檔名的情況下,如何去Run它呢?若我想將它存在自訂的檔名中,該如何操作呢?謝謝…      
A:在收到Mail後,可能對方會有夾檔案,這個部份mail元件會把
    它解開來,存在Disk上,下列的屬性可以用來得到這些夾檔的
    相關資訊:
1. AttachmentNames:A (public),這個屬性是A-Type的,因為一封
   mail可以帶多個檔案,而這個屬性則放著這封mail帶過來的檔案
   的名稱,每一行就是一個檔案名稱。這個屬性也是要
   和MessageIndex合用。
2. AttachmentPaths:A (public),這個屬性和AttachmentNames屬性
   是一對一對應的,AttachmentNames屬性放著傳過來的檔案名稱,
   而AttachmentPaths則是放著這個夾檔被放在收mail電腦上的真在
   位置和檔名,因為收下來的檔案會被mail元件改成一個暫存檔
   名後存到Disk上,這樣可以避免兩封mail的夾檔同名時造成的
   衝突。這個屬性也是要配合MessageIndex來使用的。
3. SaveDir:C (publish),這個屬性用來設定收下的暫存檔要放在那
   一個目錄中,若是沒有設定,則自動設定成Windows的Temp路徑。
   如要將檔名改為自訂的,一樣可以使用run()函數
 
    
Q23:如何寫轉檔程式??                                                  
  若要將文字檔(*.txt)轉到DBF檔內,不知該如何撰寫程式??

A:

Select 0
Use customer
Append From cust.txt SDF

PS: [DBF.Customer] 之檔案結構為:
cust_code    c    6
cust_name    c    26
cust_tel    c    12
cust_fax    c    18
        cust.txt 之內容為:
        AA0033三榮股份有限公司    22334567
    AB0044南一股份有限公司    99337654
    DC0052安二股份有限公司    33229292
    DD0063北志股份有限公司    99227654
    DE0074台明股份有限公司    (02)555-322299999
    AI0028北電股份有限公司    (02)522-234199227654
    AJ0039台枎股份有限公司    (02)312-211199999999
    EA0041中昌股份有限公司    (02)823-113322334567
    EB0052南忠股份有限公司    (02)543-343299337654


Q24:如果是vd物件之尋找功能,設定條件後,其set filer to xxx=變數為何?
A:可用Table.GetFilter()得知                                            


Q25:請教有關資料集路徑更改之方法?                                        
A:1.你可做一管理路徑的專案A,在A專案使用DELALIAS(),ADDALIAS()
      然後用RUN('c:\vd20\vd20.exe B.vds')
      main.close() &&把目前專案關閉
   

Q26:VD20 是否有類似 DBTOOLS 資料結構回存功能                             
A:可用SaveStru()儲存成INI
    再用RestStru()資料結構回存


Q27:我使用的是Visual DBTOOLS 2.0普及版,再建立了上面二種欄位型態後,根本沒有辦法輸入是不是因為是普及版的關係,還是我要搭配資料庫軟體...
A:跟普及版沒有關係,Memo欄位需使用Memo元件處理
  Binary欄位需使用Table.BinRead(),Table.BinWrite()


Q28:例如:用sql找出資料80筆,列印時要在每筆資料中加個序號,(1-80)
A:可在Label的運算式用str(Rep.DetailCount)即可


Q29:VD 2.0 如何產生亂數??                                                
A:直接使用RANDOM()函數!                                                


Q30:我要如何將P型態的欄位如何動態設為空白?
例如:
  EDIT0.EDITOR=''
    -或-
  EDIT0.EDITOR=
(上列兩式都不對)
A:EDIT0.EDITOR=0 即可

 
Q31:請問要如何製作顯示資料總筆數之物件?
A:Table.Reccount(),sql.lastrec(),table.RecordCount
        以上三種方法都可得知資料筆數


Q32:                                                      
1.在edit編輯欄位資料時如何將游標自動移至編輯欄位之起頭,而不必移動向左鍵來移至編輯欄位
   之起頭
2.如何將memo備註型態之資料,append至另一資料庫(此資料庫也有M型態之備註欄位)
A:1.在onclick事件用edit.selstart=0 即可
  2.append blank
        Repl Rem with table->Rem1
         post 

Q33:請問除了用len(Array)之外,還有什麼辦法可以取得陣列的
個數??因為用len時,如果個數太多(幾百甚至上千個),有時
會捉不準確!!!
A:陣列個數不能超過65535/4=16383個
只有Len()可取得陣列個數


Q34:宣告變數除了public外是否有其他宣告的指令?public是不是就是全域變數
A:還有External;public是全域變數


Q35:RE:關閉作用視窗                                                      
A:請用 Form.close()


Q36:RE:Table.IndexOn() 照手冊的說明無法使用,到底該如用??                 
A:Table.IndexOn('Name','Field_Name',0,0,1)即可
  最後一碼固定是1


Q37:RE:我想要在程式編輯器中呼叫Windows的指令,可以嗎?要怎麼下?
例如開啟新接龍.
A:可用WRUN('xxx.exe')


Q38:RE:message有無傳回值                                                 
在使用message可不可以像VB一樣,可以自己設定要出現的按鈕,如確定、取消、忽略...等,如果可以他們的傳回值又是什麼,謝謝!
A:
格式=MESSAGE('本資料已過帳..','訊息視窗',12,20)
無傳回值
可用 SURE(msg-C ,title-C ,pos_x-N ,pos_y-N)
【傳回值】
為一個字元, 'Y' 代表<是>, 'N' 代表<不是>,'C'代表<取消>, 設計者可以此往下控制程式流程。


Q39:我想要在一筆資料更新時將日期寫入其中一個欄位中,以做為證明。請問我要在那下這個指令?指令是什麼?
A:可使用Table的系統預設功能,他會在存檔前根據你的設定給值
   

Q40:return是不是所有的程式都必須在最後下return這個指令
A:不是,但個人習慣會加上RETURN .T. or .F.


Q41:1.如何把數值函數轉成日期函數
    2.每個月的天數都不一樣,如果我要加一個月除了利用
          a=val(dtoc2(date()))+100 外還有沒有更好的方法
    3.可以在VD中設定定時執行的程序嗎,例如每月五日計算薪水?如果可
       以語法是什麼?
A:1.stod(str(19990101))
  2.date()+lastday(date())
  3.設定定時執行,只有Timer元件
      但你的需求,應是在main.init設定
      當執行此專案時,判斷是否計算薪水

 

 

 

 

 


五.資料表

Q1:1.我想要把資料輸出到臨時的table,該用什麼指令
  2.需不需要先把table的結構建好
A:可用copy to temp,不需要先把table的結構建好


Q2:一個table可以下2個set filter to嗎?好像下了第二個第一個就沒有了,如果要下二個
  怎麼辦?
A: 一個table不可以下2個set filter to,
   你可用 .and. 處理兩個條件即可


Q3:我再新增資料存檔時,做一個函數內容如下
    SELE 1
    SEEK NAMESTART.EDIT0.TEXT
    IF !EOF()
        WARNING=('此筆資料已建檔過,請查明在輸入')
        EDIT0.FOCUSED()
        RETU .F.
    ELSE
        RETU .T.
    ENDI
    如果資料重複時,為何沒有出現 WARNING=('此筆資料已建檔過,請查明在輸入')
    警告訊息而直接執行EDIT0.FOCUSED()?
A:你應該多USE一個相同Table來SEEK
  存檔前不可對自己SEEK


Q4:我設計一個BUTTON 為重整,開3個TABLE,BUTTON內容為:
   IF SURE('請確認是否要重整所有檔案?','確認視窗')='Y'
      PACKS('TEST')
   ENDIF
   RETURN
   但為何我執行全部重整,而3個TABLE全部重整失敗?
A:重整前,Table 不能開啟,需Table.active=0  重整後,再把Table.active=1


Q5:如何將兩結構相同資料表同步異動更新,
    已建立且定義table A後又copy 一個與table A相同結構的資料表
    請問要如何寫程式當A有任何異動時(如新增,刪除,修改),B也同
    步跟著異動更新.?
A:在table A的存檔前去新增修改Table B 即可


Q6:我在執行資料重整時出現
    錯誤代碼:2060
   資料表PACK時發生錯誤,外來 (Foreign) 索引檔格式。
   CUSTOM.MDX
  請問是何原因?(資料庫為DB3之CUSTOM.DBF)
A:VD的資料索引檔是MDX,所以不相容,
   你需要在原來的Dbase 環境把索引刪除,
   然後在VD重建索引.


Q7:請教 EditX.AutoEdit 'Ture' or 'False'  可否由程式來加以控制?      
    目的是 新增時希望 EditX.AutoEdit 為 'Ture'
    更新時希望 EditX.AutoEdit 為 'False'
A:在Table的新增前, EditX.AutoEdit=1
  及更新前EditX.AutoEdit=0


Q8:當field設驗證條件時,並強迫檢查,輸入資料後會檢查,並焦點停在該
    欄位上,可是此時資料不修正(欄位沒進入編修狀態),則無法再檢查,
    並可存檔!除非在該欄位按空白箭使其入編修,否則不檢查了!!
    照理說:強迫檢查應強制該欄位完成正確動作後才可離開!!
     而不是只令其回到該欄位而不再入編修!
A:你應該用Table.Valid=1 才對,(自動檢核欄位=True)

Q9:設定資料表問題?                                                     
    IF SURE('請確認是否要重整所有檔案?','確認視窗')='Y'
     SET DATABASE TO NAMECAR     SELE 1
     USE
     PACKS('NAMECAR')
     SELE 1
     USE TITLE
     LABEL2.DATASET='TITLE'
     ASSIGN(LABEL2.VISIBLE=1)
ENDIF
RETURN
  為何會出現"屬性寫入錯誤",屬性寫入時發生型別錯誤: Label2.DATASET
  ,我查過該屬性型態應為(P),請問該如何設定?
A:正確的用法!如下
DataSet為P形態,'TITLE'為C形態
  所以: LABEL2.DATASET='TITLE'改為label0.DataSet=TITLE 即可


Q10有關DBF的關聯速度
A:
前一陣子,有討論到DBF大時的速度不佳,
本來DBF很大時,你就必須注意很多事,
請有這經驗的人來TUNING一下.
目前已知的方法為:

1.請部份DBF置於 GLOBAL FORM
2.沒在MULTI-PAGE主頁的DBF請將開啟模式設為"CLOSE"
  (新的規格)
3.動態來設定field total的關係
4.動態來設定DBF relation的關係
5.SEQ元件一進來都是"CLOSE"的狀態.

速度是規劃問題,VD本身僅是CALL BDE.
不能老是用傳統DOS來思考問題,WINDOWS上的技術
已經不是你們個人可以搞定,這此我們訊光願意為各位
提供解決方案,但請各位不要認為這是VD應該要附贈的KNOWHOW
請大家尊重專業,否則我們訊光很難再做如此的產品.


Q11:如果table的valid為true,在存檔前會檢查edit和field
的驗證條件,能不能知道檢查的順序.....
A:應該是按照貼元件時先後順序檢查                                       

   
Q12:一般在資料表中新增一個DBF檔時,其索引好像只能拉一個索引檔,是否一次能選擇多個?
A:dbf在open時,所有index tag是全部open著,只讓你設一個是
目前order(dbase規定order只能有一個),你可以自由更換order
及tag,但index是全部會自動維護的,你可以不必理會,如果你要
同時用兩個tag,只好open兩個dbf(在同form上是可允許的)


Q13:資料庫管理工具:如果不小心用檔案總管或dos刪除mdx則此dbf無法
  再開啟看到其結構,需用vd1.0的vddesk先刪除其索引註標才行,另外
  如果舊系統的dbf有memo file(*.dbt),則在資料庫管理工具無法新增
  欄位或索引,需將dbt刪除才行,如果幫客戶dos昇級成95版不就有問
  題了嗎?
A:1. message2(1,'開啟中..','訊息')
       inkey(1)   &&加入此行即可
       newform('form')
  2. 因為DBF版本不同,所以最好重建結構
       然後寫程式把舊資料轉到新dbf


Q14:如果我在一個FORM中,貼上一DBMODULE物件,其TABLE是CUSTOMER.DBF
然後貼上一MULTIPAGE物件(共兩頁),第一頁放入CUSTOMER的欄位.....
另外也貼上了一個SQL物件,其資料表也是CUSTOMER.DBF
然後將SQL0中的欄位,放到第二頁中......
請問我有方法可以讓這兩頁的資料"同步"嗎?
也就是當我在第一頁中移動資料或是編修資料後,去切換到第二頁時,會顯示最新的資料情形,
或是在第二頁有移動或編修的話,去切換到第一頁時,也會顯示最新的資料.....
如果不行的話,是否意味著 :
沒有人這樣做.....就是一個FORM中,TABLE和SQL不可同時存在....
A:1.如果你是說Table新增後SQL要能看見,可用SQL.REACTIVE()
      及Table.refresh()&&在存檔後執行
  2.如果你是要SQL和Table要同一筆,那是不可能
      因為SQL元件不能SEEK,你如何跳到那一筆呢?
      SQL是結構化語言,和Table是不同的


Q15:在報表(rep01)中,有A及B兩個檔案,並設一對多的關聯
開啟報表前,已先將A及B檔COPY部份的資料到TEMPA及TEMPB(暫存檔)
在rep01中使用A.REOPEN("TEST","TEMPA","IDXA")或使用
             A.REOPEN("TEST","TEMPA","")
都會產生 "索引改變,必須將關聯刪除"  的訊息...
請問如此做法是否有誤? 還是另有方法可達到相同的效果?
A:通常A及B兩個檔案,並設一對多的關聯
  只要A檔執行SET WHILE 篩選資料即可,不需要REOPEN()
   

Q16:RE:如何動態設定關聯?                                                 
A:用NewObj()動態新增TVDReltion
  已方資料表: TVDRelation.SelfTable
  關連資料表: TVDRelation.RelTable
  關連模式: TVDRelation.RelMode
  刪除模式: TVDRelation.IsDelRelRangeRecord
  關連欄位: TVDRelation.FieldExp


Q17:過帳的功能中可不可以在新增資料時,和刪除資料時分別過到不同的地方,
  例如我下一張訂單,會計科目中的進貨要增加,可是我刪除時,要在進貨退回來
  增加...如果不行程式要如何寫...
A:你可在存檔前,及刪除前自行寫程式過帳  不能用過帳元件

 

 

 

 

 

 

六.元件使用

Q1:請問可否稍為說明一下與WORD 溝通元件的用法?
A:在Windows系統中會有很多的OLE automation的元件,這些元件都是一些
  Application所註冊上去的,例如Word,透過這些元件,我們可以執行相對於該
  Application的一些功能,例如,我們可以使用一個Word的OLE automation物件
  來做一些操作,下列的操作將可以產生一個Word的DOC檔:
        OLEObject0.OLEName = 'Word.Basic'
        OLEObject0.Active = 1
        OLEObject0.ExecProc('FileNew', 'Normal')
        OLEObject0.ExecProc ('Insert', 'This is line 1'+chr(13))
        OLEObject0.ExecProc ('Insert', 'This is line 2')
        OLEObject0.ExecProc ('FileSaveAs', 'C:\SAMPLE.DOC')


Q2:請問Memo元件沒有連接Table,資料如何清空呢?
A:因為Memo的內容是陣列,所以用AFILL(Memo0.lines,'')即可


Q3:請問可不可以將LookUpList的資料傳回到兩個欄位中
A:可在LookUpList的結束程序把值給另一欄位即可.


Q4:請問 Grid 中的 OnColExit 事件中,會在我跳出任何一 Field 就執行
   有沒有辨法設定,只有在我跳出 Field1 時做其他都不做呢?
      謝謝你們!
  A:OnColExit 事件中,可判斷Grid0.col=1 時 才執行,


Q5小弟在一form中作查詢功能,以一個edit作輸入元件,以grid作為輸出結果,
  以set filter 作過濾搜尋但為何一定以將set filter 的執行程序在botton中啟動才
  會有效若下在edit的change...確不行呢?而且同一個作法在vd1.0中卻沒有問題.不知
  各位先進可否點解....thanks
A:在Event()內取edit的值要用edit.edittext 不能用edit.text


Q6為什麼在一grid中的field有的不可更改其資料呢...是否和該field的資料表有關呢?該如何解決....
A:1.如果資料表有兩個時,GRID 只能針對一個資料表做修改,
    你可以看 GRID 的資料表屬性。
  2.如果該欄位為運算式時,不能修改。


Q7:請問我在form的layer1內做了一個editorpanel,將edit1的取代編輯器設為editorpanel該如何才能
  將editorpanel的值傳回,並將layer1的editorpanel結束呢.....thanks...
A:editorpanel貼一Button,樣板設"確定",
  執行程序assign(editorpanel.text,'xxx')即可

    
Q8:是否可以將 LIST 的左右鍵取消掉,留下上下鍵的功能就好??                
  因為使用List時,多半是用上下鍵來移動,將左右鍵取消掉可以
    增加程式上的控制運用.
A:用Event()即可解決,在List的OnKeyDown執行以下程式即可
    eventpara k1,k2
    if k2=37 .or. k2=39
       k2=0
    endif


Q9:請問如何動態設定過帳之運算式...thanks...
A:用TransINVOSUBINVO.SourceExp='運算式'


Q10:grid之MultiSelect要如何得知覆選內容???                               
A:grid.selects[n]  &&得知覆選內容


Q11:請問StatusBar的內容如何設定?
A:*先取得TVDStatusBar的Panels(項目)的值,
  *這個屬性傳回一個P類型的物件TVDStatusPanels
  P = StatusBar0.Panels
  *假設要取得第n個"Panel",
  *請使用TVDStatusPanels的Items屬性
  *Items屬性(帶一個參數)傳回一個P類型的物件TVDStatusPanel
  P0 = P.Items(0)
  P0.Text = 'Test Message'


Q12:為何edit0用lookuplist,lookuplist之結束程序為edit1.focused()
  但lookuplist選完後,不會focused到edit1,
A:因為EDIT的取代編輯流程沒做完,
  lookuplist結束後會先edit1.focused()
  然後又edit0.focused()


Q13:可否動態設定LIST的目前反白項之位置
  當我在做LIST反白所在位置向上置換時, 在置換後反白位置會向上移二筆,
  且成虛線表現, 我希望可以讓USER連續向上置換位罝
  我用X1=LIST.ITEMINDEX
  X2=X1-1
  LIST.ITEMS=...
  .....
  LIST.ITEMINDEX=X2
  結果無效
A:如果list設定為複選,則itemindex當然設定會無效


Q14:請問如何動態增加List的內容,我用list1.insert()時,系統告訴我沒有提供? 
A: 不是用list1.insert()
     而是x=list0.items
          x.insert()


Q15:STATUSBAR寬度如何設定,因其好像為固定寬度
A:X=StatusBar0.Panels
  X.Width=100 即可
 

Q16:為何EDIT 內資料欄位為數值 長度>4 時,無法使用微調模式                    
A:對不起!
  微調模式在規格上只能接受Integer!
  也就是數值5位以內,請見諒!


Q17:10/19的教育訓練有單選的範例程式
    但不知複選時程式該如何修改?
A:可改成OnDragDrop事件內容:
    Eventpara Sender,Source
    X=Sender.Items
    Y=Source.Items
    N=GETREPL(Source.Text,',')
    DO WHILE N>=0
          X.Insert(0,GETPARA(Source.Text,N,','))
          N=N-1
    ENDDO
    N=LEN(Y)
    DO WHILE N>0
           IF GETREPL(Source.Text,Y.items[N])>0
               Y.delete(N-1)
           ENDIF
          N=N-1
    ENDDO


Q18:請問用EMAIL元件收信後,信件的內容存在哪??
A:現在改存在mail.messages內                                            


Q19:[TVDEdit](編輯欄位)    資料元件 的 OnChange (event) 好像有問題          
           在 OnChange 寫  LABEL0.CAPTION = EDIT0.TEXT
           VD 20 不會正確SHOW出
A:你要改成 LABEL0.CAPTION = EDIT0.EDITTEXT
   這是VD2.0在Edit元件中新增的屬性


Q20:是否有偵測focused edit中,目前游標所在位置,是那一函數或屬性??
A:有一屬性,edit.selstart  memo.selstart    
      

Q21:有關取代編輯器中不論是editpanel,lookuplist....等,可否得知是由那一個edit所呼叫.或是此
             edit之名稱也可以.
A:你可設一公用變數xxx,然後在有設取代編輯器的EDIT起始程序
       TEST()
       external xxx
       xxx=this          && xxx.name 就是edit之名稱
       return       
   

Q22:在form上貼入一 edit0 ,在edit0 事件 OnKeyPress 寫如下
             key()
            If GetEvent(1)=13
               Message(Edit0.Text)
               DelForm('form')
            Endif
            為何EDIT0.TEXT是空白的
A:請需使用edit.edittext新屬性,Edit如果輸入後還沒離開edit
    則edit.text玲叢內容,edit.edittext才是新內容
    所以你說的情形是正常的


Q23:e-mail 元件,  傳送正常否, 是否有傳回值 ??                            
A:會傳回值(.t. or .f.)代表傳送成功否


Q24:在Navigator查詢資料時,是否能顯示查詢正確之資料,其餘不相關之資料可否不必顯示出來。
A:Navigator的查詢是用seek,所以只能seek到正確之資料
    你應該用Table.while()過濾資料才對


Q25:如何做出拖曳的功能?例如在訂單輸入時電腦上有產品list或grid, 我想利用拖曳的方式將             產品資料拉入訂單中,請問如何做?
A:產品檔的元件須有拖曳模式的屬性,才能做出拖曳的功能
  例如List元件拖曳模式設成"自動",然後用Event去控制Grid沒有拖曳模式的屬性


Q26:請問grid可否動態設定成不致能或不可改變RECNO()?                       
A:可以,Assign(grid0.enabled,0)  &&不致能
         Assign(grid0.enabled,1)  &&致能


Q27:如何使 LOOKLIST 選定資料結束後,自動跳離原 EDIT 欄位進入下一
EDIT.
A:因為LOOKLIST是取代編輯器,在LOOKLIST 選定資料結束後
    一定會回到EDIT,所以無解,除非你自己做取代輸入的form


Q28: 我用EDIT物件編輯一個欄位,但在輸入資料時游標於空欄位點選時(例如在中
:間點一下),為何游標不會自動靠左邊第一隔,而必須用手動把游標移到最前
:面,請問有何方法可解決!謝謝
A:Windows的標準操作是如此,所以你需自己控制
    方法如下:
    1.可設一公用變數xxx,在EDIT的起始程序Assign(xxx,'a')
    2.EDIT的OnClick事件寫
      external xxx
      if xxx='a'
         Edit0.selstart=0
         xxx=''
      endif


Q29:請問有無辦法設定multipage某一page是否顯示                         
A:沒有設定multipage某一page是否顯示的屬性,
    但你可用adel(MultiPage0.Pages,2),就是刪除第2頁
    只要Form沒存檔就沒真正刪除,但須注意切入設計模式
    時需是沒刪除狀況,否則存檔就沒了
 

Q30:我用Combo 之元件建立一個Combo1之物件,而我又建立一個EDIT9之物件,
    而我想把Combo1之內容傳至EDIT9之內容,於是寫了下面程式:
    我在Combo1之結束程序中加入assign(combo1.text,edit9.text),但發覺edit9.text
    之內容為空白,為何?
A:1.assign(edit9.text,combol1.text)


Q31:在一對多的的資料設計當中, FORM的上半部貼有EDIT,
下半部是GRID. 讓操作者KEY入SEEK值,
GRID的TABLE馬上移到操作者所KEY入值的RECORD,
當GRID裡的TABLE筆數非常多的時候這個功能將很好用
A:可用一Edit設定成不顯示,來記錄目前輸入的值
  Grid 的OnKeyDown 用Edit.text來Seek即可
  可參考,地址精靈範例


Q32:請問filesel.style 的設值方法是
assign(FileSel0.Style,'存檔')
  -或是-
assign(FileSel0.Style,存檔)
Ans:FileSel.Style 是N型態
    0->開啟
    1->新增
    2->存檔
    3->另存新檔 


Q33:每一個FORM 都有它自己的 NAME
但是 MUTIPAGE 上為何找不到自己
的FORM NAME 呢?
A:你是問目前作用頁的名稱嗎?
  如果是請用MultiPage0.ActivePage得知
   

Q34:memo元件要用什麼來清成空白
A:用ADEL(memo0.lines,1,'')!        
                     

Q35:請問Gauge使用方法
A:執行一較長的程序處理時,可以用Gauge元件顯示執行進度。
   進度的百分比由[MaxValue](最大值)、[MinValue](最小值)和[Progress](進度)三者取得。
   例如處理多筆資料
   sele t1
   Gauge.Progress=0
   do while !eof()
      ..
      .
      ...   
      skip
      Gauge.Progress=Gauge.Progress+1
      Gauge.Progress=(Gauge.Progress - Gauge.MinValue)/(Gauge.MaxValue - Gauge.MinValue))*100
    enddo
 

Q36:Timer物件內的執行程序和OnTimer事件是不是一樣...
A:一樣


Q37:請問 Option 之內容(選項)項目如何動態刪除?                            
A:可用ADEL(Option0.Items,1,1)

 

 

 

 

 

 

 

七.SQL

Q1:請問一下,用sql拉入的資料庫,其欄位預設值是否不能寫成
  substr(cust_name,1,10) ???
  我有一個建立在SQL SERVER中的資料表,二個欄位,一個是 CUST_NAME ,
  一個是 CUST_NA,然後在VD 中我開立一個SQL0,而資料集及資料表都設到遠
  端的SQL SERVER,然後將這兩個欄位給拉到FORM上,
  並且CUST_NA的預設值是 SUBSTR(CUST_NAME,1,10)
  結果在執行時,當我編輯完CUST_NAME後,移到CUST_NA時
,系統會出現一錯誤訊息,說CUST_NA錯誤.....
  可是後來我用TABLE的方法,也就是開立一個DBF,而其中的資
  料集和資料表也是設到SQL SERVER上,結果就可以正常了....,為何?
A:你應該用substr(edit0.text,1,10)才對
  edit0是cust_name
  在SQL元件欄位的Buffer是sql0."cust_name",
  所以substr(sql0."cust_name",1,10)也可以


Q2:以下是VD20HELP的內容:是不是有點錯誤...,我在執行時會出現3個錯誤身。
    SQL0.Active=0
    SQL0.SQL[1]="Select * from item"
    SQL0.SQL[2]="where item_no>'3'"
    SQL0.Active=1
A:VD2.0 改成SQL0.sqlExpression[1]="Select * from item"
                             

Q3:我在表單中加入一個叫做SQL的資料表,
   並在BUTTON的執行程序寫下下面的程式,
   目的是要當使用者按下時可以將FA2D資料表中的YYMT欄位全部清成零
   SQL.Send("UPDATE FA2D SET YYMT = 0")
   為何會出現下面的錯誤訊息
   "Error creating cursor handle"?
A:應該用SQL.EXECUTE("UPDATE FA2D SET YYMT = 0")
  只有select 才可用SEND() 


Q4:我設計一個sql form ,而正確資料比數為500筆,請問我寫下列sql語法為何只剩下
    440筆語法如下:
    SELECT * FROM CUSTOM AS CUSTOM WHERE  CUSTOM.MASTER
    like &('%' + trim(edit19.text) + '%')
    經我查詢結果有10筆MASTER欄位是空白,請問語法要如何寫方能顯示出
    原筆數500筆,又可查詢否則看起來原為500比一進入sql form
    只剩下400筆.
A:你應該先判斷edit19.text是否為NULL,然後動態SEND() SQL,
    if empty(edit19.text)
       sql0.send("SELECT * FROM CUSTOM")
    else      
       sql0.send("SELECT * FROM CUSTOM AS CUSTOM WHERE  CUSTOM.MASTER
       like &('%' + trim(edit19.text) + '%')")
    endif


Q5:以下是我的SQL, & 號是我希望用變數來寫回去,可是會出現錯誤,請問要怎麼改??謝謝
X = NEWOBJ("TVDSQL"," ","IFA03"," ",.F.)
X.ACTIVE=0
X.SQLEXPRESSION[1] = "UPDATE FA2D"
X.SQLEXPRESSION[2] = "SET MOMT = &WKMAMT, ACMT = &WKACMT"  X.SQLEXPRESSION[3] = "WHERE ARNO = &WKPDNO"
X.ACTIVE=1
DELOBJ(X)
A:你的寫法不對,
  你應該貼一SQL元件,就不用NEWOBJ()
  此元件可專門給EXECUTE()使用
  然後SQL.EXECUTE("UPDATE FA2D SET MOMT .....")
   才不會有錯誤訊息


Q6:用SQL精靈設計查詢時,加入Order欄位排序時,Navigator之功能表新增,刪除,
    等功能都無法使用,請問要如何設定?
A:SQL加入Order欄位排序時,須是C/S的資料庫才能 新增,刪除,
 

Q7: SELECT * FROM MONEY WHERE CHECKNO = ' '
     應該是會將CHECKNO欄位為空白的挑出來吧,
     可是它都挑不到資料,除非我在CHECKNO欄位中編輯過,我的條件下錯了嗎?
A: SELECT * FROM MONEY WHERE CHECKNO is NULL 才對


Q8:你好,我有一個 TABLE 中有一個日期欄位 INDATE,現在要用 SQL 來挑出本月的資料,
    怎麼下 SELECT
    SELECT * FROM INVO WHERE INDATE ???
    謝謝
A:日期欄位最好用C8處理
    你用D type 要轉換
    d1=dtos(date())
    s1="SELECT * FROM INVO WHERE INDATE='"+substr(d1,1,4)
       +"/"+substr(d1,5,2)+"/"+substr(d1,7,2)+"'"
    sql.send(s1)  


Q9:欄位MEMO型態在MSSQL要定成什麼形態呢?                                 
A:可定成TEXT 型態


Q10:我開啟一個新的表單 (FORM),呼叫出 <資料關聯視窗>,並切換至 SQL 這一頁,利用SQL精靈新增一個SQL0元件,<資料集> 為SEEK,按下 <新增> 鈕並選擇資料表 SEEK.DBF,再以滑鼠拖入所有欄位至 <SQL 編輯器> 後,按 <確定> 存檔並關閉精靈。
啟動SQL0 <物件編輯器> 將 <開啟> 屬性設為True。將SQL0元件的 <可否更改> 屬性設為True,在FORM上拉入一個GRID元件,並將SQL0元件內的欄位拉入GRID中。
在FORM上拉入一個NAVIGATOR元件,將其 <資料表> 設為SQL0。
以上步驟與SQL教學一樣,但我在欄位修改資料卻出現"不能對一個唯讀的資料表去運作"
是否能告知!
A:SQL0元件使用DBF,<可否更改> 屬性不能設為True(因為不支援)
  只有類似SQL server大型資料庫(S/C)才能設為True


Q11:我在EDIT6之編輯欄位輸入06開頭之資料,卻查不到。
(我有設定定位格式為9999-99)
WHERE Seek.NO1 LIKE &(TRIM(EDIT6.TEXT) + '%')
如沒設定定位格式,則可查詢到,請問要如何解決?
謝謝賜教!
A:因為設定定位格式為9999-99後,雖然你只輸入06
  EDIT6的內容已經是'06  -',所以查不到
    你可加貼一EDIT7(不顯示),然後在EDIT6的結束程序
    assign(edit7.text,strtran(edit6.text,'-',''))
    SQL條件
    WHERE Seek.NO1 LIKE &(TRIM(EDIT7.TEXT) + '%')


Q12. 我在SQL加入ORDER之運算式來排序,發現資料可查詢到但新增,刪除,
    編輯等功能卻不能用,如把ORDER之運算式拿掉即可恢復功能,為何?
A:在select時才可使用order子句


Q13:當SQL物件 SELECT 到欄位名是POSITION時,
如果SELECT的TABLE是LOCAL DBF, 就會有問題,
如果是SQL SERVER的TABLE就沒有問題,
如果用TABLE.'POSITION'也不行...請問這是BUG嗎?
A:可改用select AAA,"POSITION",CCC from Table 即可


Q14:POSITION前後加雙引號要怎麼填入sql.sqlexpression裡呢?
A:應該是sql.sqlexpression[1]='select AAA,"POSITION",CCC from Table'


Q15:在 SQL 元件中
只有一組DatabaseName(資料集)
當 Form 的 Table 有兩個以上
而且都不同DatabaseName(資料集)
請問如何處理?
A:invo=vddemo
       item=vddemo2

select * from invo,":vddemo2:item" from invo.item_no=item.item_no

其中的vddemo2為資料集,你sql的資料集設為vddemo即可


Q16:我想要在SQL編輯器加入一個自訂欄位,原來是產品編號的欄位10碼,我想要將第二碼的資料挑出來,我用substr(pdno,2,1)會出現錯誤,我該怎麼辦,我也用過right及left,一樣不行,是不是它不支援這樣的語法,我又要如何做...
A:SQL語法沒有substr(),但有substring(pdno from 2 for 1)


Q17::我在下 SQL 指令
如  SELECT A.NAME , A.TELE, SUM(QTY*PRICE) AS AMT
    FROM A
    這個指令可正常執行
    但是我如果加上 GROUP BY A.NAME
    就常會出現 'When Group by exists, every simple field
                in projectors must be in broup by'
A:應該是加上 GROUP BY A.NAME,A.TELE才對

 

 

 

 

 

 

八.C/S

Q1:請教一個VD和CLIENT/SERVER的問題?                                     
  使用手冊上寫...在BDE中以新增MS-SQL來增加一資料庫...
  可是當我設好後,要去連後端資料庫,卻會出現錯誤訊息...
  於是我用新增SQL SERVER來增加一資料庫,就可以了...
  請問我在設定上有可能在那裡設錯了呢?
  註: MS-SQL 和 SQL SERVER中的設定全都一樣.....
A:在工作站WIN95中,必須安裝SQL SERVER中的CLIENT的工具,
  如此才可使用MSSQL的方法去連結後端的資料庫....


Q2:在上C/S課程時, 在講義上有一段如下:
  用SQL 在整理報表時, 有如下指令
  SQL0.REACTIVE()
  SQL0.GOTOP()
  SELE SQL0
  COPY TO TEMP IN VDDEMO
  ITEM.REOPEN('VDDEMO','TEMP,'TEMP')
  請問SQL0 的資料如果不COPY 出來, 是否在多人同時作業時,
  會發生共用一個檔, 還是每一台Client 的 SQL0 都是各自獨立的?
  THANK YOU !!!
A:每一台Client 的 SQL0 都是各自獨立的
  上面的指令是說SQL資料可copy至local後,在整理
  如果你不需要整理,當然不用REOPEN()


Q3:在SQL SERVER中的TABEL,我設了一個 "觸發器",即在新增時,會以
  PRINT "新增觸發測試",顯示本文字...
  經我在SQL SERVER中的 SQL QUERY中去做新增指令時,本觸發器會正常動作,
  也就是會在結果視窗中顯示該文字.....
  可是我在VD中,以資料控制器物件來新增資料時,卻看不到由後端"觸發器"動作的結果
  ,也就是在VD視窗中看不到該文字,請問...這是怎麼回事呢?
A:Trigger 無法傳給VD,只有 Stored Procedure才能傳回VD

沒有留言: