VISUAL DBTOOLS 2.0 Q&A
環境
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