有一种技术是:
动态创建参数视图。只下载需要的数据。动态创建的参数视图指参数是动态的(where的条件)。
使用的命令是CREATE SQL VIEW [ViewName ] [REMOTE] 。或者你选择passth
动态创建参数视图。只下载需要的数据。动态创建的参数视图指参数是动态的(where的条件)。
使用的命令是CREATE SQL VIEW [ViewName ] [REMOTE] 。或者你选择passth
另外一个面向vfp前沿的网站在www.yckj.net.我们将会拥有我们的服务器,专门为中国的foxer提供服务。希望所有的foxer
有时间到www.myf1.net 讨论一下。
下面是一个动态视图类:*------ 动态建立视图
*------ View维护用于维护视图的完整性
*-----------------------------------------------------------
*------ 这个类有待完善
DEFINE CLASS View AS Custom
*---- 当前数据库
PROTECTED lcDataBase
lcDataBase = []
*---- 这些属性暂时用不上
*---- 连接句柄
PROTECTED nConnHandle
nConnHandle = 0
*---- 连接名称
PROTECTED cConnection
cConnection = []
*---- 连接对应的数据库
PROTECTED cDataBase
cDataBase = []
*---- 服务器表名
PROTECTED cTable
cTable = []
*----- dbc视图名称
PROTECTED cView
cView = []
*----- 是否设置默认值
PROTECTED lSetDefault
*----- 是否用默认值检查现存数据
PROTECTED lCheckDataByDefault
*----- 检查服务器是否存在此表
*----- 并且返回大小写的表名
*----- 第一个参数tcTable检查的表名,不区分大小写
*----- 第二个参数是后台服务器连接(代表某一个数据库)
PROCEDURE CheckTable
LPARAMETERS tnConnHandle ,tcTable
lcAlias = Alias()
*---- 避免结果名称和系统其他工作去表名重复
lcTableDictionary = SYS(2015)
IF SQLTABLES(tnConnHandle ,[TABLE] ,lcTableDictionary) < 0
*---- 失败,返回
RETURN .F.
ENDIF
SELECT (lcTableDictionary)
LOCATE FOR LOWER(table_name) = LOWER(tcTable)
IF !FOUND()
USE
*---- 如果数据库中没有此表
RETURN []
ENDIF
*----- 如果作为引用,这句话有用
tcTable = ALLTRIM(table_name)
IF NOT EMPTY(lcAlias)
SELECT lcAlias
ENDIF
USE IN (lcTableDictionary)
RETURN tcTable
ENDPROC
*----- 如果存在则返回区分大小写的字段名称
*----- 第二个参数必须是数组
PROCEDURE CheckField
LPARAMETERS tnConnHandle ,tcTable ,tacField ,tnColIndex
*---- tacField是一个字段数组
*---- 数组可能是多维
lcTableStru = SYS(2015)
IF SQLCOLUMN(tnConnHandle ,tcTable ,[NATIVE] ,lcTableStru) <= 0
RETURN .F.
ENDIF
SELECT (lcTableStru)
lnRow = ALEN(tacField ,1)
m.i = 1
*---- 加入调试命令
lcAssert = SET([Asserts])
SET ASSERTS ON
FOR i = 1 TO lnRow
IF EMPTY(tnColIndex)
lcField = tacField[m.i]
LOCATE FOR LOWER(ALLTRIM(column_name)) = LOWER(ALLTRIM(tacField[m.i]))
IF FOUND()
tacField[m.i] = ALLTRIM(column_name)
ELSE
ASSERT FOUND() MESSAGE [字段] + tacField[m.i] + [在服务器表中找不到了]
ENDIF
ELSE
lcField = tacField[m.i,tnColIndex]
LOCATE FOR LOWER(ALLTRIM(column_name)) = LOWER(ALLTRIM(tacField[m.i,tnColIndex]))
IF FOUND()
tacField[m.i,tnColIndex] = ALLTRIM(column_name)
ELSE
ASSERT FOUND() MESSAGE [字段] + tacField[m.i,tnColIndex] + [在服务器表中找不到了]
ENDIF
ENDIF
ENDFOR
USE IN (lcTableStru)
SET ASSERTS &lcAssert
RETURN tacField
ENDPROC
*----- 创建连接
*----- 第一个参数是数据库
*----- 第二个参数连接名称
PROCEDURE CreateConnection
LPARAMETERS tcDataBase ,tcConnection
*---- 保存当前数据库的名称
*---- 这样子可以对多个数据库进行操作
This.lcDataBase = SET([Database])
IF NOT EMPTY(tcDataBase) AND (LOWER(tcDataBase) # LOWER(This.lcDataBase) OR EMPTY(This.lcDataBase))
IF NOT DBUSED(tcDataBase)
OPEN DATABASE (tcDataBase) SHARED
ENDIF
SET DATABASE TO (tcDataBase)
ENDIF
IF EMPTY(SET([Database]))
MESSAGEBOX([请打开数据库] ,16 ,[错误])
RETURN 0
ENDIF
*----- 检查连接的合法性。如果合法,进行连接
*----- 建议连接为空的是否系统自动弹出连接对话框
*----- 让用户选择,暂时不加入此功能
IF EMPTY(tcConnection) OR VARTYPE(tcConnection) # [C]
RETURN 0
ELSE
DIMENSION acConnection[1]
IF ADBOBJECTS(acConnection ,[CONNECTION]) > 0
IF ASCAN(acConnection ,UPPER(tcConnection)) <= 0
MESSAGEBOX([连接名称] + tcConnection + [不存在数据库中] ,16 ,[错误])
RETURN 0
ENDIF
ENDIF
lnConnHandle = SQLCONNECT(tcConnection)
*---- 如果连接不通
IF lnConnHandle <= 0
MESSAGEBOX([不能连接] ,16 ,[错误])
RETURN 0
ENDIF
ENDIF
RETURN lnConnHandle
ENDPROC
LPARAMETERS tnConnHandle
*---- 如果执行视图前数据已经打开了数据的话
IF NOT EMPTY(This.lcDataBase)
SET DATABASE TO (This.lcDataBase)
This.lcDataBase = []
ENDIF
RETURN SQLDISCONNECT(tnConnHandle)
ENDPROC
*----- 创建视图
*---- CreateView的参数解释
*---- 第一个参数是数据库的,如果此参数为空那么,CreateView使用当前数据库 ,如果当前数据库没有打开则提示错误返回
*---- 第二个参数是服务器的表名,不区分大小写(避免程序员记错大小写)
*---- 第三个参数远程视图的名称
*---- 第四个是远程连接的参数{现存连接(数值型) , 连接名称(字符型)},系统自动识别
*---- 第五个参数是设置默认值的是否需要检查现存的数据
PROCEDURE CreateView
LPARAMETERS tcDataBase ,tcTable ,tcView ,tvConnection ,tlValidData ,tcWhere ,tcOrderBy ,tlFieldSetting ,tlUpdatable
lCloseHandle = .T.
*---- tvConnection 是已经存在的连接
IF VARTYPE(tvConnection) = [N]
lnConnHandle = tvConnection
tvConnection = [SQLCONNECTION]
lCloseHandle = .F.
ELSE
lnConnHandle = This.CreateConnection(tcDataBase ,tvConnection)
ENDIF
*This.CheckTable(lnConnHandle ,@tcTable)
*----- 创建远程视图 lcCreateViewSql = [CREATE SQL VIEW ] + tcView + [ REMOTE CONNECT ] + tvConnection + [ AS SELECT * FROM ] + tcTable *---- 建议在前面匹配大小写
*---- 视图参数
IF NOT EMPTY(tcWhere)
tcWhere = tcTable + SUBSTR(tcWhere ,AT([.] ,tcWhere ))
lcCreateViewSql = lcCreateViewSql + [ WHERE ] + tcWhere
ENDIF
*---- 排序字段
IF NOT EMPTY(tcOrderBy)
lcOrderBy = tcTable + SUBSTR(tcOrderBy ,AT([.] ,tcOrderBy))
lcCreateViewSql = lcCreateViewSql + [ ORDER BY ] + tcOrderBy
ENDIF
*---- 产生视图
&lcCreateViewSql
谢谢大家,结贴了
我没试过前台用VFP、后台用SQL:)