修改FOXPRO數(shù)據(jù)表結(jié)構(gòu),常用MODIFY STRUCTURE命令。這種方法雖然方便,但必須在人機對話中實現(xiàn)。若您的程序已交付許多用戶使用,要求用戶采用MODIFY STRUCTURE命令修改數(shù)據(jù)表結(jié)構(gòu)勢必會帶來許多麻煩。是否可通過執(zhí)行預先編制好的程序來完成擴大字段寬度工作?筆者最近做了一個嘗試,其程序思路是:
1、利用AFIELDS()函數(shù)獲取要修改的數(shù)據(jù)表結(jié)構(gòu)信息,并將信息存放在STR_FIL數(shù)組內(nèi)。AFIELDS()函數(shù)的語法:AFIELDS(ArrayName),ArrayName是放置表結(jié)構(gòu)信息的數(shù)組名(可由自己命名,本例中命名為STR_FIL),數(shù)組為每一個字段創(chuàng)建一行數(shù)據(jù),其每一列里存儲的信息如下:
列號 字段信息 數(shù)據(jù)類型
1 字段名 字符型
2 字段類型 字符型
3 字段寬度 數(shù)值型
4 小數(shù)點位置 數(shù)值型
5 容許的空值 邏輯型
6 字段有效準則 字符型
7 字段有效文本 字符型
8 字段缺省值 字符型
9 表有效準則 字符型
10 表有效文本 字符型
2、根據(jù)要求修改STR_FIL數(shù)組內(nèi)容(本例,修改字段寬度)。
3、利用CREATE CURSOR 命令,按STR_FIL數(shù)組內(nèi)容創(chuàng)建一臨時表結(jié)構(gòu)。
4、將原表數(shù)據(jù)添加到臨時表中。
5、利用COPY TO 命令,將臨時表覆蓋原表。
下面是修改字段寬度的原代碼:
*參數(shù):SOU_FILE(修改的數(shù)據(jù)表文件名),字符型
*參數(shù):FIE_NAME(要修改的字段名),字符型
*參數(shù):FIE_ (修改后的字段寬度),數(shù)字型
PARA SOU_FILE,FIE_NAME,FIE_WID
PRIV STR_FIL,FIEL_SUM,N, STR_TMP
IF USED(“&SOU_FILE”)
&&打開要修改的數(shù)據(jù)表
SELE &SOU_FILE
ELSE
SELE 0
USE &SOU_FILE
ENDIF
=AFIELDS(STR_FIL)
&&獲取表結(jié)構(gòu),并存儲在STR_FIL數(shù)組內(nèi)
FIEL_SUM=FCOUNT() &&計算表字段數(shù)
N=1
DO WHILE N$#@60;=FIEL_SUM
&&查找要修改的字段名
IF ALLT(STR_FIL(N,1))=FIE_NAME
&&如果是要修改的字段名
IF STR_FIL(N,3)=FIE_WID
&&判別字段寬度是否相同
RETURN
&&相同返回
ELSE
&&否則修改表結(jié)構(gòu)
wait "正在修改數(shù)據(jù)結(jié)構(gòu),
請稍侯..." WIND NOWAIT
STR_FIL(N,3)=FIE_WID
&&確定字段長度
EXIT &&退出循環(huán)
IF N= FIEL_SUM &&如果循環(huán)結(jié)束
wait "無修改的字段,按任意鍵返回….
" WIND &&提示用戶
RETURN
ENDIF
ENDIF
ENDIF
N=N+1
ENDDO
*按STR_FIL數(shù)組內(nèi)容,創(chuàng)建臨時表結(jié)構(gòu)
SELE 0
*根據(jù)STR_FIL數(shù)組規(guī)定的字段名字、
類型、寬度創(chuàng)建臨時表STR_TMP
CREATE CURSOR STR_TMP
FROM ARRAY STR_FIL
SELE &SOU_FILE
USE &&關(guān)閉原數(shù)據(jù)表
*將原數(shù)據(jù)表數(shù)據(jù)添加到臨時表STR_TMP中
SELE 0
APPE FROM &SOU_FILE
COPY TO &SOU_FILE &&復制新的數(shù)據(jù)原表
RETURN
1、利用AFIELDS()函數(shù)獲取要修改的數(shù)據(jù)表結(jié)構(gòu)信息,并將信息存放在STR_FIL數(shù)組內(nèi)。AFIELDS()函數(shù)的語法:AFIELDS(ArrayName),ArrayName是放置表結(jié)構(gòu)信息的數(shù)組名(可由自己命名,本例中命名為STR_FIL),數(shù)組為每一個字段創(chuàng)建一行數(shù)據(jù),其每一列里存儲的信息如下:
列號 字段信息 數(shù)據(jù)類型
1 字段名 字符型
2 字段類型 字符型
3 字段寬度 數(shù)值型
4 小數(shù)點位置 數(shù)值型
5 容許的空值 邏輯型
6 字段有效準則 字符型
7 字段有效文本 字符型
8 字段缺省值 字符型
9 表有效準則 字符型
10 表有效文本 字符型
2、根據(jù)要求修改STR_FIL數(shù)組內(nèi)容(本例,修改字段寬度)。
3、利用CREATE CURSOR 命令,按STR_FIL數(shù)組內(nèi)容創(chuàng)建一臨時表結(jié)構(gòu)。
4、將原表數(shù)據(jù)添加到臨時表中。
5、利用COPY TO 命令,將臨時表覆蓋原表。
下面是修改字段寬度的原代碼:
*參數(shù):SOU_FILE(修改的數(shù)據(jù)表文件名),字符型
*參數(shù):FIE_NAME(要修改的字段名),字符型
*參數(shù):FIE_ (修改后的字段寬度),數(shù)字型
PARA SOU_FILE,FIE_NAME,FIE_WID
PRIV STR_FIL,FIEL_SUM,N, STR_TMP
IF USED(“&SOU_FILE”)
&&打開要修改的數(shù)據(jù)表
SELE &SOU_FILE
ELSE
SELE 0
USE &SOU_FILE
ENDIF
=AFIELDS(STR_FIL)
&&獲取表結(jié)構(gòu),并存儲在STR_FIL數(shù)組內(nèi)
FIEL_SUM=FCOUNT() &&計算表字段數(shù)
N=1
DO WHILE N$#@60;=FIEL_SUM
&&查找要修改的字段名
IF ALLT(STR_FIL(N,1))=FIE_NAME
&&如果是要修改的字段名
IF STR_FIL(N,3)=FIE_WID
&&判別字段寬度是否相同
RETURN
&&相同返回
ELSE
&&否則修改表結(jié)構(gòu)
wait "正在修改數(shù)據(jù)結(jié)構(gòu),
請稍侯..." WIND NOWAIT
STR_FIL(N,3)=FIE_WID
&&確定字段長度
EXIT &&退出循環(huán)
IF N= FIEL_SUM &&如果循環(huán)結(jié)束
wait "無修改的字段,按任意鍵返回….
" WIND &&提示用戶
RETURN
ENDIF
ENDIF
ENDIF
N=N+1
ENDDO
*按STR_FIL數(shù)組內(nèi)容,創(chuàng)建臨時表結(jié)構(gòu)
SELE 0
*根據(jù)STR_FIL數(shù)組規(guī)定的字段名字、
類型、寬度創(chuàng)建臨時表STR_TMP
CREATE CURSOR STR_TMP
FROM ARRAY STR_FIL
SELE &SOU_FILE
USE &&關(guān)閉原數(shù)據(jù)表
*將原數(shù)據(jù)表數(shù)據(jù)添加到臨時表STR_TMP中
SELE 0
APPE FROM &SOU_FILE
COPY TO &SOU_FILE &&復制新的數(shù)據(jù)原表
RETURN