精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● VFP>>〖源码共赏〗>>一个关于Grid中使用Select - SQL 数据源的解决办法

主题:一个关于Grid中使用Select - SQL 数据源的解决办法
发信人: hunter__fox(雁回西楼)
整理人: hunter__fox(2002-03-16 23:01:10), 站内信件
    当我们使用一个 Selcet - SQL 语句作数据源时,基本上每次我们都在重新设定表格的宽度和标题列的标题,这样做,很不方便.更在一点,Select - SQL 语句并不关闭查询过程中使用的源表...我不得不一次一次的去关掉它们.次数多了,我就有了为这此事做一个类的念头.这一段代码,基本完成了这一功能.用法是,建立一个 Grid 类,在这个类中建立一个自定义方法,将这段代码放进去...呵呵,以后,只要是用 Selcet - SQL 作数据源,则用这个方法程序来设置数据源...
    功能有:设置数据源,设置各列宽度和标题,关闭查询过程中打开的源表.对于调用前已经打开的表,是不会关闭的.
    如果 Select - SQL 语句没有指定输出表格,则使用源有的别名...代码中,自动修改了 Select - SQL 语句来完成这一点.因此 ,有时候,可以不在 Select - SQL 语句中指定输 出表格了...呵呵,这就是"懒人自有懒办法"...
---------------------------------------------------------------------------------------------------
LParameters cSQL,aFieldName,aFieldWidth
&& cSQL : 用于查询的 Select - SQL 语句
&& aFieldName : 各列的标题
&& aFieldWidth : 各列的宽度
&& Hunter   2001-10-31

&& 参数验证

If Not Type("cSQL") = "C"
   Return
EndIF
If Not(IsArray(@aFieldName) And IsArray(@aFieldWidth))&& 此两参数不是数组
   Return
EndIf
&& 保存原来打开的表格记录
Local aUsedList[1]
aUsed(aUsedList)

&& 输出工作区的别名
Local lcCurName
If At(" into ",Lower(cSQL)) > 0
   && 指定了输出表格
   Local lnAliasNameStart&& 别名的起点
   lnAliasNameStart = At(" into ",Lower(cSQL)) + 6 ;
                      + At(" ",Substr(Lower(cSQL),At(" into ",Lower(cSQL)) + 6))
   lcCurName = Substr(cSQL,lnAliasNameStart,At(" ",Substr(cSQL,lnAliasNameStart))-1)
   Release lnAliasNameStart
Else
   && 未指定输出表格
   lcCurName = Alltrim("cur_" + Sys(2015))
   cSQL = cSQL + " Into Cursor " + lcCurName
EndIf
&& 执行查询语句
Wait "进行数据查询,请稍候..." Window NoWait NoClear
&cSQL
Wait Clear
&& 关闭查询时打开的表格
&& 原表格列表在数组 aUsedList 中

Local aNewUsedList[1]
aUsed(aNewUsedList)
If Not(aLen(aUsedList) + 2 = aLen(aNewUsedList)) 
   && 不止增加了一个表格 
   Local n 
   For n = 1 To aLen(aNewUsedList) / 2 
      If aScan(aUsedList,aNewUsedList[n,1]) < 1 ;
           And Not Alltrim(Lower(aNewUsedList[n,1])) == Alltrim(Lower(lcCurName)) 
         Use In (aNewUsedList[n,1]) 
      EndIf 
   EndFor 
   Release n 
EndIf 
Release aUsedList 
Release aNewUsedList 
&& 改变 Grid 外观 
If _Tally = 0
   Wait "没有数据可供查看." Window NoWait
EndIF
&& 列数
This.ColumnCount = aLen(aFieldName)
&& 释放原数据,关联新数据
&& 因为调用者可能指定别名与已用的别名相同,所以要进行判断

If Not(Lower(Alltrim(This.RecordSource)) = Lower(Alltrim(lcCurName)))
   &&  源数据别名与现有别名不同
   If Not(Alltrim(This.RecordSource) == "") && 第一次它是没有数据源的
      Use In (This.RecordSource)
   EndIf
   This.RecordSource = lcCurName
Else
   && 同名,已经覆盖,什么也不用做
EndIf
Release lcCurName
&& 标题和宽度
Local n
For n = 1 To This.ColumnCount
   This.Columns[n].Header1.Caption = aFieldName[n]
   This.Columns[n].Header1.AlignMent = 2
   This.Columns[n].Width = aFieldWidth[n]
EndFor
Release n
&& Grid 重读数据
This.Refresh

---------------------------------------------------------------------------------------------------
这是一个调用的例子,设这个方法程序名为"NewData"
下面的代码在一个Combo控件的InteractiveChange事件中写.这个控件是两个选顶是字串,可通过AddItem方法加入:"历史记录"和"物品列表"
---------------------------------------------------------------------------------------------------
Do Case
Case This.Value == "历史记录"
   Local cSQL,aFieldName[3],aFieldWidth[3]
   cSQL = "Select Time,User,HowDo From " + pcDatabase + "!ActLog"
   aFieldName[1] = "时间"
   aFieldWidth[1] = 130
   aFieldName[2] = "用户"
   aFieldWidth[2] = 60
   aFieldName[3] = "进行的操作"
   aFieldWidth[3] = 200
   ThisForm.grd_BrowseData.NewData(cSQL,@aFieldName,@aFieldWidth)
Case This.Value == "物品列表"
   Local cSQL,aFieldName[3],aFieldWidth[3]
   cSQL = "Select PartCode,PartName,LastValid From " + pcDatabase + "!Part"
   aFieldName[1] = "物品编号"
   aFieldWidth[1] = 70
   aFieldName[2] = "物品名称"
   aFieldWidth[2] = 110
   aFieldName[3] = "输入日期"
   aFieldWidth[3] = 60
   ThisForm.grd_BrowseData.NewData(cSQL,@aFieldName,@aFieldWidth)
OtherWise
   Wait "没有定义相应的动作......无法继续." Window NoWait
EndCase



----
在代码天地里
我要做一个
猎狐者    

[关闭][返回]