2017年11月13日 星期一

如何建立Google快訊

  1. 前往Google 快訊。 (https://www.google.com.tw/alerts)
  2. 在頂端的方塊中,輸入您要追蹤的主題。
    image
  3. 如要變更您的設定,按一下[顯示選項]。 您可以變更的設定如下: 收到通知的頻率 您會看到的網站類型 您的語言 資訊的來源國家/地區 您想看到幾筆結果 ...
  4. 設定完成後,按一下[建立快訊]。 當系統找到相符的搜尋結果時,就會傳送電子郵件給您。

2017年10月1日 星期日

多台寬頻分享器及無線網路同網域接法


若家裏有多台無線AP,按照無線AP的標準接法,則變成AP不在同一個網域,無法彼此分享檔案或裝置(如印表機),下圖的接法,可以讓您的所有連網裝置同屬一個網域,方便分享

10420151_1193365824022041_12288343247825032_n

2017年8月29日 星期二

Fix Office 2010 install error 1402 ‘Setup cannot open the registry key: UNKNOWN\Components\…’

secedit /configure /cfg %windir%\inf\defltbase.inf /db defltbase.sdb /verbose

2017年8月24日 星期四

Windows Security Log Event ID 680 Error

觀察伺服器的事件(安全 Security Events)
發現有台工作站持續的登入失敗~

Error Code:C000006A:user name is correct but the password is wrong
帳號正確,但密碼錯誤

image

該工作站作業系統為 Windows 7

可能原因:

使用者啟用了離線檔案(預設為啟用)且使用者啟用了離線檔案後變更了密碼

解決方法:

關閉離線檔案

2017年8月3日 星期四

Windows 7/8/10 無法移除程式

嘗試看看以下列步驟掃描系統,能否正常移除?

Dism步驟
點選畫面左下角按滑鼠右鍵,選擇命令提示字元(系統管理員)身分執行,輸入以下指令
Dism /Online /Cleanup-Image /CheckHealth
Dism /Online /Cleanup-Image /ScanHealth
Dism /Online /Cleanup-Image /RestoreHealth

sfc /scannow
1.   點選畫面左下角按滑鼠右鍵,選擇命令提示字元(系統管理員)身分執行

2.   於命令提示字元中,輸入指令 sfc /scannow,按下Enter

3.  掃描後,確認是否有跳出檔案毀損之類的訊息。

4.  掃描後請重新啟動電腦測試能否正常使用

2017年7月13日 星期四

取得MSSQL伺服器的相關資訊,如IP,PORT

SELECT 
    CONNECTIONPROPERTY('net_transport') AS net_transport,
    CONNECTIONPROPERTY('protocol_type') AS protocol_type,
    CONNECTIONPROPERTY('auth_scheme') AS auth_scheme,
    CONNECTIONPROPERTY('local_net_address') AS local_net_address,
    CONNECTIONPROPERTY('local_tcp_port') AS local_tcp_port,
    CONNECTIONPROPERTY('client_net_address') AS client_net_address

image

2017年7月12日 星期三

REAL/FLOAT欄位,取到小數點第4位(無條件捨去)

參考了網路的做法,但有一些問題無法排除
網路的解法為:round(VcutMeter,4,1)
但原本1.52會變成1.159 如下圖:
image
經過反覆測試,改用以下方式:
1.轉成varchar型態
2.len(round(VcutMeter,0,1))+1+4 為計算需要取到字串的第幾位,剛好可以取得小數點第4位
3.把取得的字串轉成numeric(10,4)
作法如下:
select  VcutMeter
,substring(CAST(VcutMeter as varchar(50)),1,len(round(VcutMeter,0,1))+1+4) 
,Cast(substring(CAST(VcutMeter as varchar(50)),1,len(round(VcutMeter,0,1))+1+4) as numeric(10,4))
from prodbasic
Where VcutMeter is not null
>>>len(round(VcutMeter,0,1))+1+4)  解法如下:
round(VcutMeter,0,1) : 取得整數部分
+1 : 小數點
+4 : 取小數點第4位

2017年6月9日 星期五

修正Outlook 2003圖片

請下載下面連結的 Fix_Outlook2003_Image_X.reg 

並於執行登錄檔變更後,重新開機  

====連結在下方====

修正OUTLOOK2003圖檔顯示為X

2017年5月17日 星期三

facebook設定索引

應用程式設定:https://www.facebook.com/settings?tab=applications

遊戲和應用程式通知
關閉遊戲和應用程式通知後,系統也會隱藏 Facebook 與 Gameroom 的相關通知。這樣不會影響你使用應用程式或玩遊戲的功能。

應用程式、網站和外掛程式
讓你在 Facebook 及其他地方使用應用程式、附加元件、遊戲和網站。

其他人使用的應用程式
看得到你資料的人,都可以將你的資料帶往他們使用的應用程式。使用此設定可控制他們能帶走的資料類別。

舊版的 Facebook 手機應用程式
對於你使用沒有內聯分享對象選擇器的舊版 Facebook 手機應用程式(例如舊版的 Blackberry 專用 Facebook 應用程式)所發佈的內容,這個設定控制其隱私設定

2017年5月16日 星期二

Windows 10 輸入法切換快速鍵設定

1.控制台>語言>進階設定>變更語言快速鍵

image

2.選取切換輸入語言後按變更按鍵順序

image

3.在這裏您可以設定切換輸入語言,或切換鍵盤配置的快速鍵

image

切換語言為如您裝了一種以上的語言則可設定左側的選頁來快速切換
一般來說我們只會有中文

右側則是輸入法,如注音,倉頡,大易.....的快速切換鍵

2017年3月23日 星期四

SQL server 2000邮件配置方法

SQL server 2000邮件配置方法
--========================================
--SQL 邮件配置
--author:Boyi55 date:2006-11-30
--outlook 2003,sql server 2000,163邮局
--========================================
首先要说的一点是,这里要用到的是outlook而不是系统自带的outlook express.我用outlook express试过好多次都没有成功。这次我做的有些乱,所以就打乱顺序来说吧。先说sql server 2000.这里面要配置的主要是sql server 2000的启动帐号和sql agent的启动帐号。不管是sql server 2000还是sqlagent都要用系统管理号帐号。这个可以在sql server 2000里面设,也可以在系统服务里面设。我是在服务里面做的。在运行里打开services.msc找到mssqlserver和sqlserveragent这两个服务。右击属性,在登录选项卡上用“此帐户”点浏览,找到一个管理员帐号,然后输入两次管理员密码。这里我用的是administrator.然后点确定。再打开cmd重启一下sql server 2000。
由于我一直用的outlook express所以这次我新安了outlook 2003.在outlook 2003里新建一个邮件帐户。这里我选用的是163的信箱:boyi55@163.com。对应的pop3和smtp服务器分别为:pop3.163.com和smtp.163.com。这时如果点测试帐户设置,则最后一步会出错,也就是可以收信而不可以发信。我在163的帮助里找到原因是smtp服务器要求验证。所以。可以点“其他设置”在发送服务器选项卡上选上“我的发送服务器(SMTP)要求验证”下面选择“使用与接收邮件服务器相同的设置”点确定。这样再点“测试帐户设置”就会成功了。然后到控制面板里,找到邮件。点显示“配置文件”这里你会看到里面有一个outlook.如果用的是outlook express则在控制面板里是不会出现邮件这个项目的。然后点确定,打开sql server 2000的企业管理器,展开支持服务,右击“sql 邮件”点属性。这时里面就会出现有outlook了。选择它就可以了。如果要建操作员的话,还得在sqlserveragent属性的邮件配置文件这里也选择outlook。这样,去建一个操作员,输入一个e-mail地址。点测试,过一会到你的信箱里就可以收到信了。呵呵。
要注意的几个问题:
1.sql server 2000的启动帐户要和sqlagent的启动帐户相同。并且不能用系统帐户。
2.smtp服务器是否需要验证。hotmail的免费信箱好像不可以在outlook里设置。
3.在sql邮件运行过程中不能关闭outlook,否则不能发送邮件。
sql 邮件(续)
--==============================
--sql邮件发送
--author:boyi55,date:2006-12-03
--==============================
在电脑前整整坐了一天。下午的时候想到上次只是简单的可以让sql server 2000发送邮件。至于邮件的内容,却只是简单的点了下那个测试按钮所发的一封测试邮件。至于sql 邮件到底能做什么还一点也不了解!刚开始试着用作业,当作业执行完成里发信到指定的信箱里。可是这样,只能发送一个人,并且所发信的内容也只是简单的说明作业成功失败。想起有xp_sendmail这一个存储过程,然后可以在作业里加一个步骤,成功时,用sendmail发一段话到信箱里。失败时,用sendmail发另一段话到信箱里。看了下帮助。还好行容易理解。也很简单的就实现了!那能不能把一个结果集发到我的信箱里呢?这样的话,我就可以把一些常用的统计建成一些作业,当用到的时候就直接执行一下不就可以了吗?这个看上去也很容易实现,可结果往往没有想像的那么好!不过最后还是搞出来了。当时正好在看webcasts,所以顺手拿了一个cube的查询过来,呵呵。下面贴些代码出来吧!
--=============================================
--将hello,this e-mail sent from sql server !
--发送给:fengjicai@hotmail.com,h11h99@126.com
--副本发送给:queeny_fei@yahoo.com.cn
--邮件主题是:alter from you SQL server 2000
--author:boyi55,date:2006-12-03
--=============================================
xp_sendmail @recipients='fengjicai@hotmail.com;h11h99@126.com',
@message='hello,this e-mail sent from sql server !',
@copy_recipients='queeny_fei@yahoo.com.cn',
@subject='Alter from you SQL Server 2000'
--=======================================
--将存储过程的结果发送给指定联系人
--author:boyi55,date:2006-12-03
--=======================================
exec xp_sendmail [url=mailto:'fengjicai@hotmail.com',@query='sp_configure']'fengjicai@hotmail.com',@query='sp_configure'[/url]
--============================================
--统计northwind数据库中相关信息
--并将结果发送到指定的信箱
--author:boyi55,date:2006-12-03
--原理:northwind数据库中没有xp-sendmail
--存储过程,所以采用方式为:
--将查询结果写入一个全局临时表
--然后在删除全局临时表
--===========================================
set nocount on
select case when(grouping(od.productid)=1)then '定单总计:'
else isnull(od.productid,'空值') end as productid,
case when (grouping(od.orderid)=1)then '产品总计:'
else isnull(od.orderid,'空值')end as orderid,sum(od.quantity) as'总计'
into ##boyi55
from (select convert(nvarchar(10),productid) as productid,convert(nvarchar(10),orderid) as orderid,quantity from [order details]) as od
group by od.productid,od.orderid
with cube
exec master..xp_sendmail @recipients='h11h99@126.com;fengjicai@hotmail.com;queeny_fei@yahoo.com.cn',
@subject='northwind数据库中order details相关信息汇总结果',
@message='此信息由sql server 2000数据库作业自动发送,如果输出错误,请直接回复e-mail到:[url=mailto:fengjicai@hotmail.com]fengjicai@hotmail.com[/url]或者电话联系侯向博:13633830414!',
@query='select * from ##boyi55',
@width=100--设置查询的输出文本行宽
drop table ##boyi55
set nocount off
--===========================================
--将结果作为附件文件发送
--author:boyi55,date:2006-12-03
--===========================================
exec xp_sendmail @recipients='fengjicai@hotmail.com',
@query='select * from information_schema.tables',
@subject='SQL Server report',
@message='The contents of information_schema.tables:',
@attach_results='true',
@width= 250
======================
这里我想到两个问题。记得好久以前,长风兄问我outlook怎样开机就可以最小化。当然只记得快捷方式属性里有一个运行方式中有一个属性“最小化”,可试了一下还是老样子一点反应都没有。这里可以有几种方法解决。outlook 2003启动的时候在任务栏和通知区域都有显示图标。只要在通知区域右击outlook图标选择最小化时隐藏就可以了。还有可以用任务计划,定义一个任务,当计算机开机时自动运行outlook,并且要选择登录前运行。另外还可以用启动和@命令,但比较一下还是用任务计划比较好一点。
还有一点就是outlook和sqlserveragent这两个,如果sqlserveragent已经启动,这时候再启动outlook会报错,说是文件正在被使用。这时必须先停掉sqlserveragent才可以把outlook启动开。所以我在我的服务器上设置的是outlook在登录前启动,而sqlserveragent则手动启动。

本文出自 “老侯的菜园子” 博客,请务必保留此出处http://boyi55.blog.51cto.com/4345/26946

2017年3月21日 星期二

增加C槽的可用空間方式

How to Free C:\ Drive Disk Space in Windows 7 and Reduce System Size?

來源:http://www.kavoir.com/2012/07/how-to-free-up-c-drive-disk-space-in-windows-7-easy.html

Windows 7 is a beast in consuming hard drive disk spaces, especially the system drive, C, which is constantly being filled up. After a while it will keep annoying you with low disk space warnings because C drive is running out of space and almost full. So how can I safely free up all the disk spaces in C drive in Windows 7 and reduce its disk storage?

The methodology is to find the fattest folders in C drive, move as many of them to another drive (such as D, E, etc.) as possible, and make symbolic links (by mklink) from C drive to the folders in other drives.

Step 1 – Find culprit folders that occupy the most disk space!

There are so many ways to do this but what I did was to look at the size stats for each of the major folders in my C drive. After 10 minutes, I was able to pinpoint these folders that are consuming large chunks of the disk volume:

  • C:\Windows\winsxs – very high-profile system folder that are not easily reduced / moved, which I’ll leave alone.
  • C:\Windows\Installer – Over 3GB, program installers that can be moved safely and easily.
  • C:\Users\Administrator\AppData\Google – About 0.8GB, Google products data such as those by Chrome.
  • C:\Users\Administrator\AppData\Mozilla – About 1.6GB, Firefox profiles and browser data.
  • Some folders in C:\Program Files – I wish I could move this entire folder but I couldn’t. I could only move some of the folders such as “Microsoft Games”.
  • Some folders in C:\Program Files (x86) – Same as above.

This is just my case. You may as well find totally different folders that need to be moved. After you have found something, proceed to step 2 to duplicate them elsewhere.

Step 2 – Copy these folders to another drive that is much more spacious!

This one is easy. Just perform the omnipotent Ctrl+C and Ctrl+V combination to copy these folders to another drive. In this example, we’ll copy these folders to their new destination – D:\C_DRIVE:

  • C:\Windows\Installer –> D:\C_DRIVE\Windows\Installer
  • C:\Users\Administrator\AppData\Google –> D:\C_DRIVE\Users\Administrator\AppData\Google
  • C:\Users\Administrator\AppData\Mozilla –> D:\C_DRIVE\Users\Administrator\AppData\Mozilla

After the duplications, proceed to step 3.

Step 3 – Delete original folders and create the symbolic links

Now we need to delete the original folders in drive C. Some files and folders in Windows 7 are owned by TrustedInstaller while some by SYSTEM that cannot be easily deleted by Administrator. To delete them, you have to acquire SYSTEM privileges to do this, because the most privileged account in a Windows 7 computer is SYSTEM, not Administrator.

To do this, just create a file named syscmd.bat and put in the following commands:

sc Create SysCMD binPath="cmd /K start" type=own type=interact
sc start SysCMD

Double click to run the file syscmd.bat and you will be prompted by a dialog with 2 buttons, click the top one to view the interactive message.

And you will enter a command line interactive mode with SYSTEM privileges which basically grant you full rights to the computer – you can do whatever you want now.

Run these commands one by one – line by line, you type in the command and hit enter:

rmdir /s /q C:\Windows\Installer
rmdir /s /q C:\Users\Administrator\AppData\Google
rmdir /s /q C:\Users\Administrator\AppData\Mozilla

Now that the original folders are deleted, we’ll make symbolic links in the same name so that any requests for these folders are correctly diverted to those on the D drive:

mklink /D C:\Windows\Installer D:\C_DRIVE\Windows\Installer
mklink /D C:\Users\Administrator\AppData\Google D:\C_DRIVE\Users\Administrator\AppData\Google
mklink /D C:\Users\Administrator\AppData\Mozilla D:\C_DRIVE\Users\Administrator\AppData\Mozilla

That’s it.

After these 3 steps, my C drive is successfully reduced in size by 5.4GB. I can move more folders to further enlarge / extend the free space but for now, it’s good enough for me.

Feel free to leave any comment about how you are doing with this approach.

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

Loading...