发信人: coolyylu(GoodDay)
整理人: hunter__fox(2002-03-16 22:15:51), 站内信件
|
【 在 golf2000 的大作中提到:】
: 在程序中使用的视图是事先预定义后使用好,还是在需要时用语句定义,用后删除好?我发现同一视图在每次定义时将会增加数据库的容量,如果采用预定义的方法又觉得视图文件太多,不知高手有何指教?
:......
一般不会很大。使用
open database xml exclusive
pack database &&删除没有的记录,不会影响数据库操作
另外一种情况是建立动态试图。包括远程和本地,通用程序如下(实际例子):
FUNCTION MakeView
PARAMETER ctable,cview
if file("utgl_sql.dbc") &&处理远处视图
If not dbused("utgl_sql")
OPEN DATABASE UTGL_SQL shared
endif
set database to utgl_sql
endif
v_select=SELECT()
SELECT 0
USE utview
sqltable(1,'TABLE')
LOCATE FOR LOWER(table_name)=lower(ctable)
IF !FOUND()
MESSAGEBOX("在SQL Server中不存在"+CTABLE,0,'不能建立视图')
USE
SELECT utview
USE
SELECT (v_select)
RETURN
ENDIF
IF TYPE('cview')#'C'
cview=''
ENDIF
ctable=ALLTRIM(table_name)
SELECT utview
IF EMPTY(cview)
locate all for upper(tablename)=upper(ctable)
cview=ctable
ELSE
locate all for upper(tablename)=upper(ctable).AND.upper(viewname)=upper(cview)
ENDIF
STORE '' TO v_orderby,v_where
if found()
do while found()
cview=trim(viewname)
v_where=alltrim(defa_where)
v_orderby=alltrim(orderby)
do makeview_sub
select utview
continue
enddo
else
do makeview_sub
endif
SELECT utview
USE
SELECT (v_select)
RETURN
FUNCTION MAKEVIEW_SUB &&更改视图子程序
V_CREAT="CREATE SQL VIEW '"+cview+"' REMOTE CONNECT 'sqlsvr_utgl' AS SELECT * FROM "+ctable
if !empty(v_where)
v_where=ctable+subs(v_where,at('.',v_where))
v_creat=v_creat+ ' WHERE '+v_where
endif
if !empty(v_orderby)
v_orderby=ctable+subs(v_orderby,at('.',v_orderby))
v_creat=v_creat+ ' ORDER BY '+v_orderby
endif
&V_CREAT
DBSetProp(cview, 'View', 'UpdateType', 1)
DBSetProp(cview, 'View', 'WhereType', 1)
DBSetProp(cview, 'View', 'SendUpdates', .T.)
DBSetProp(cview, 'View', 'FetchMemo', .T.)
IF !empty(v_where)
* DBSetProp(cview, 'View', 'ParameterList', "cGcbh_view,'C';nKuHao_view,'N'")
endif
SELECT 0
USE &cview
GO BOTTOM
SQLCOLUMN(1,ctable,'NATIVE','sql_stru')
SELECT sql_stru
GO TOP
DO WHILE .NOT. EOF()
t_field=TRIM(column_name)
t_default=ALLTRIM(column_def)
if at("(",t_default)=1
t_default=subs(t_default,2,len(t_default)-2)
else
t_default=''
endif
v_field=cview+'.'+t_field
up_field=ctable+'.'+t_field
SELECT &cview
sql_key=DBGETProp(up_field, 'Field', 'KeyField')
DBSetProp(v_field, 'Field', 'KeyField', sql_key)
DBSetProp(v_field, 'Field', 'Updatable', .T.)
DBSetProp(v_field, 'Field', 'UpdateName', up_field)
sql_type=DBGETPROP(v_field,'Field','DataType')
c_sql_type=SUBS(sql_type,1,1)
DO CASE
CASE c_sql_type="C"
if empty(t_default)
SQLEXEC(1,"alter table "+ctable+" add default '' for "+t_field) &&修改SQL中的默认值
t_default="''"
endif
IF t_field="sqllno"
DBSetProp(v_field, 'Field', 'DefaultValue', "KeyValue()")
REPLACE ALL &t_field with sys(2015)+'系统' FOR EMPTY(&T_FIELD) OR ISNULL(&T_FIELD)
ELSE
DBSetProp(v_field, 'Field', 'DefaultValue', '"' + &t_default + '"')
REPLACE ALL &t_field WITH &t_default FOR ISNULL(&t_field)
ENDIF
IF t_field="sys_creater" &&记录创建者
DBSetProp(v_field, 'Field', 'DefaultValue', "username")
ENDIF
CASE c_sql_type="N"
if empty(t_default)
SQLEXEC(1,"alter table "+ctable+" add default 0 for "+t_field) &&修改SQL中的默认值
t_default='0'
endif
v_len=VAL(SUBS(sql_type,3))
old_type=STRT(sql_type,"N("+ALLTRIM(STR(v_len)),'')
new_type='N('+ALLTRIM(STR(v_len-2))+old_type
DBSETPROP(v_field,'Field','DataType',new_type)
CASE c_sql_type="M"
if empty(t_default)
SQLEXEC(1,"alter table "+ctable+" add default '' for "+t_field) &&修改SQL中的默认值
t_default="''"
endif
CASE c_sql_type="L"
if empty(t_default)
SQLEXEC(1,"alter table "+ctable+" add default 0 for "+t_field) &&修改SQL中的默认值
t_default='.f.'
else
t_default=iif(t_default='0','.f.','.t.')
endif
CASE c_sql_type="B"
if empty(t_default)
SQLEXEC(1,"alter table "+ctable+" add default 0 for "+t_field) &&修改SQL中的默认值
t_default="0"
endif
DBSETPROP(v_field,'Field','DataType','N(13,4)')
CASE c_sql_type="I"
if empty(t_default)
SQLEXEC(1,"alter table "+ctable+" add default 0 for "+t_field) &&修改SQL中的默认值
t_default="0"
endif
DBSETPROP(v_field,'Field','DataType','N(8)')
CASE c_sql_type="T"
DBSETPROP(v_field,'Field','DataType','D')
REPLACE ALL &t_field WITH null FOR year(&t_field)<1911
ENDCASE
IF C_sql_type$"NMLBI"
DBSetProp(v_field, 'Field', 'DefaultValue', "(&t_default)")
REPLACE ALL &t_field WITH &t_default FOR ISNULL(&t_field)
ENDIF
SELECT sql_stru
SKIP
ENDDO
SELECT sql_stru
USE
SELECT &cview
if tableupdate(1,.t.)=.f.
WAIT WIND cview+"更新未成功"
TABLEUPDATE(1,.T.)
endif
USE
RETURN
表字段有:tablename ,viewname ,default_where ,orderby四个字段为字符兴 |
|