有一种技术是:
  动态创建参数视图。只下载需要的数据。动态创建的参数视图指参数是动态的(where的条件)。
使用的命令是CREATE SQL VIEW [ViewName ] [REMOTE] 。或者你选择passth

解决方案 »

  1.   

    我用SPT,不知道好不好,正在尝试
      

  2.   

    VFP做前台用参数化远程视图、SPT或调用SQL的存储过程来与后台数据库联系,灵活、方便、高效。
      

  3.   

    ufp用过一些,感觉不太爽哦!
      

  4.   

    多谢各位,能否多谈一些经验,比如如何解决远视图的刷新与效率问题,是要效率还是要尽量避免冲突,另外可否介绍一下这方面的资料,如VFP用ADO与后以联结
      

  5.   

    谢谢coolyylu(将来是我) 我在www.myf1.net找到VFP的高级教程其中有这方面的介绍
      

  6.   

    呵呵。www.myf1.net应该是全国最大vfp论坛,不过不是很好。
    另外一个面向vfp前沿的网站在www.yckj.net.我们将会拥有我们的服务器,专门为中国的foxer提供服务。希望所有的foxer
    有时间到www.myf1.net 讨论一下。
      

  7.   

    to  coolyylu(将来是我) :怎么不早说啊,赶紧去看看
      

  8.   

    第一种方法要好一点,现在流行地是后台的操作,这样的话,可以把数据库和管理分开,减轻了dbms的负担,可以使用一台机子专门来存放数据和处理数据,这是其中的一个原因,还有一个原因是,通过传递方法而不是传递数据,可以降低访问的速度,提高效率!所以说,用第一种方法比较好!!
      

  9.   

    网络编程,我一向不用view,一直用sqlexec,相对来说编程麻烦一点,但好控制,程序也简洁
      

  10.   

    其实结合动态视图我觉得更加好吧:
    下面是一个动态视图类:*------ 动态建立视图
    *------ 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 
      

  11.   

    *----- 检查字段是否存在
          *----- 如果存在则返回区分大小写的字段名称
          *----- 第二个参数必须是数组
          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 
          
      

  12.   

    PROCEDURE CloseConnection
              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
                
      

  13.   

    在http://www.boeworks.com/index.htm有这方面非常精彩的文章。
    谢谢大家,结贴了
      

  14.   

    up
    我没试过前台用VFP、后台用SQL:)