以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  fill 加载表后,用LoadFilter 和Load 加载同表数据 遇到的问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=48131)

--  作者:fubblyc
--  发布时间:2014/3/23 20:12:00
--  fill 加载表后,用LoadFilter 和Load 加载同表数据 遇到的问题

各位老师晚上好,

 

我在窗口的after load 用fill加载表,代码如下:

Dim sql,ex1,ex2 As String
ex1 = "Round(DateDiff( m,MAX(消费日期),GetDate()),0)"
ex2 = vbcrlf  & "(Case" & vbcrlf
ex2+ ="When " & ex1 & ">= 13  Then \'一星活跃\'"  & vbcrlf
ex2+ ="When " & ex1 & ">= 10 and " & ex1 & " < 13 Then \'二星活跃\'" & vbcrlf
ex2+ ="When " & ex1 & ">= 6 and " & ex1 & " < 10 Then \'三星活跃\'" & vbcrlf
ex2+ ="When " & ex1 & ">= 3 and " & ex1 & " < 6 Then \'四星活跃\'" & vbcrlf
ex2+ = "Else  \'五星活跃\'" & vbcrlf
ex2+ ="End) As 活跃级别  "

 

 sql = "select  * from (Select {rjsytVIP基本信息}.归属门店代号 As 归属门店代号 , {rjsytVIP消费信息}.VIP卡号, MAX(消费日期) As 最后购买日, " & ex1 & " As 几个月没来买, " & ex2 & "   FROM "
 sql+ = "( rjsytVIP基本信息  RIGHT JOIN rjsytVIP消费信息 ON 卡号 = {rjsytVIP消费信息}.VIP卡号 ) where {rjsytVIP消费信息}.[_Identify] Is Null  GROUP BY  {rjsytVIP消费信息}.VIP卡号, {rjsytVIP基本信息}.归属门店代号) As a  "   

 DataTables("VIP行为信息_VIP行为信息").Fill(sql,"VIP数据", True)

 

然后在窗口的 一个名为 【查询】的按钮写下如下代码:

 

Dim filter As String

 

With e.Form.Controls("归属门店代号")
    If .Value IsNot Nothing Then
        Filter = "归属门店代号 = \'" & .Value & "\'"
    End If
End With

 

With e.Form.Controls("VIP卡号")
    If .Value IsNot Nothing Then
        Filter = "VIP卡号 = \'" & .Value & "\'"
    End If
End With

 

If Filter > "" Then

With DataTables("VIP行为信息_VIP行为信息")
    .LoadFilter = "" \'一定要清除加载条件
    .LoadFilter = Filter
    .Load()
End With

 

应用窗口后,在“归属门店代号”控件输入 代号,点击 【查询】按钮,出现错误提示:

 

\')\' 附近有语法错误。

 

 

 

 

之前  【查询】按钮也是用 fill加载表的,但是看到【帮助】这样写:

 

请不要滥用Fill

通过Fill生成的Table,在打开窗口后,如果需要从同一个表加载其它数据进来,请采用LoadFilter和Load,切不可再用Fill(除非需要从另一个表加载数据),因为Fill会重新生成DataTable和Table,不仅效率低,还会导致设置好的绑定失效。

例如窗口中有个“最近七天”按钮,希望单击此按钮,加载最近七天的订单,可以将按钮的代码设置为:

Dim dt As Date = Date.Today.AddDays(-7)
DataTables
("订单").LoadFilter = "日期 > #" & dt & "#"
DataTables
("订单").Load()

总之,只有需要从不同的表中加载数据时,使用Fill方法,如果从同一个表中加载数据,应该使用LoadFilter和Load。

 

才想用这种方式

 

 

不知道是不是我理解错误了。。。。

[此贴子已经被作者于2014-3-23 21:28:48编辑过]

--  作者:fubblyc
--  发布时间:2014/3/23 21:31:00
--  

帮助文档上写的:

 

 


图片点击可在新窗口打开查看此主题相关图片如下:帮助文档.png
图片点击可在新窗口打开查看

--  作者:有点酸
--  发布时间:2014/3/23 22:17:00
--  

帮助也说了:

http://www.foxtable.com/help/topics/2721.htm

 


--  作者:jspta
--  发布时间:2014/3/23 22:39:00
--  
你有几个错误,
1.这次长的SQL应该直接写成视图放在数据库中,调用的时候调用视图就可以了,你有错误都能自动帮你检查出来,你现在是少了括号了。
2.datatable 有Fill方法吗?只有table才有
3.学会用别名,但不是滥用别名
4.vbcrlf 是换行,你用在SQL语句中没有意义。
5. 谁跟你说的,在设置loadfilter时候要先 = “” 然后再设置条件?完全不需要,只要在load前设置好了就行了
6.两个条件查询无法同时进行,是有意为之吗?

如果你吧SQL语句写成视图,那么你调用的时候就非常方便了,select * from a 



--  作者:fubblyc
--  发布时间:2014/3/23 23:22:00
--  

原来如此,谢谢 有点酸 老师。搞定了!!


--  作者:fubblyc
--  发布时间:2014/3/24 16:06:00
--  

啊,我现在才看到jspta老师的帖子。。。对自己无语了。。。

 

我现在是用SQLLoad()方法。

Dim sql,ex1,ex2,filter As String

 

With e.Form.Controls("归属门店代号")
    If .Value IsNot Nothing Then
        Filter = "归属门店代号 = \'" & .Value & "\'"
    End If
End With

 

With e.Form.Controls("VIP卡号")
    If .Value IsNot Nothing Then
        Filter = "VIP卡号 = \'" & .Value & "\'"
    End If
End With


ex1 = "Round(DateDiff( m,MAX(消费日期),GetDate()),0)"
ex2 = vbcrlf  & "(Case" & vbcrlf
ex2+ ="When " & ex1 & ">= 13  Then \'一星活跃\'"  & vbcrlf
ex2+ ="When " & ex1 & ">= 10 and " & ex1 & " < 13 Then \'二星活跃\'" & vbcrlf
ex2+ ="When " & ex1 & ">= 6 and " & ex1 & " < 10 Then \'三星活跃\'" & vbcrlf
ex2+ ="When " & ex1 & ">= 3 and " & ex1 & " < 6 Then \'四星活跃\'" & vbcrlf
ex2+ = "Else  \'五星活跃\'" & vbcrlf
ex2+ ="End) As 活跃级别  "

 If Filter > "" Then

 sql = "select  * from (Select {rjsytVIP基本信息}.归属门店代号 As 归属门店代号 , {rjsytVIP消费信息}.VIP卡号, MAX(消费日期) As 最后购买日, " & ex1 & " As 几个月没来买, " & ex2 & "   FROM "
 sql+ = "( rjsytVIP基本信息  RIGHT JOIN rjsytVIP消费信息 ON 卡号 = {rjsytVIP消费信息}.VIP卡号 ) where {rjsytVIP消费信息}.[_Identify] Is Null  GROUP BY  {rjsytVIP消费信息}.VIP卡号, {rjsytVIP基本信息}.归属门店代号) As a  "   

DataTables("VIP行为信息_VIP行为信息").SQLLoad(sql)

 

两个问题:

1.确实两个条件无法同时查询,但不是有意为之,是希望能同时查询,但是不知道是怎么回事,问题出在哪里。。。

2.长的SQL应该直接写成视图放在数据库中,调用的时候调用视图就可以了   具体要怎么做呢?

 

我看了帮助里的表视图以及论坛里的表视图有关的帖子,还是没怎么弄明白。。。

 

是不是这样就是写成了表视图了:?

Dim sql,ex1,ex2 As String
ex1 = "Round(DateDiff( m,MAX(消费日期),GetDate()),0)"
ex2 = vbcrlf  & "(Case" & vbcrlf
ex2+ ="When " & ex1 & ">= 13  Then \'一星活跃\'"  & vbcrlf
ex2+ ="When " & ex1 & ">= 10 and " & ex1 & " < 13 Then \'二星活跃\'" & vbcrlf
ex2+ ="When " & ex1 & ">= 6 and " & ex1 & " < 10 Then \'三星活跃\'" & vbcrlf
ex2+ ="When " & ex1 & ">= 3 and " & ex1 & " < 6 Then \'四星活跃\'" & vbcrlf
ex2+ = "Else  \'五星活跃\'" & vbcrlf
ex2+ ="End) As 活跃级别  "

 

 sql = "select  * from (Select {rjsytVIP基本信息}.归属门店代号 As 归属门店代号 , {rjsytVIP消费信息}.VIP卡号, MAX(消费日期) As 最后购买日, " & ex1 & " As 几个月没来买, " & ex2 & "   FROM "
 sql+ = "( rjsytVIP基本信息  RIGHT JOIN rjsytVIP消费信息 ON 卡号 = {rjsytVIP消费信息}.VIP卡号 ) where {rjsytVIP消费信息}.[_Identify] Is Null  GROUP BY  {rjsytVIP消费信息}.VIP卡号, {rjsytVIP基本信息}.归属门店代号) As a  "   

 

调用的时候要怎么调用呢?

 

 

 


--  作者:jspta
--  发布时间:2014/3/24 16:15:00
--  
外部数据源的话,直接在数据库中创建视图,用SQL语句调用。
狐表内部表就要用SQL查询表生成,但是没办法用SQL语句调用,可以当做普通表进行处理。


With e.Form.Controls("归属门店代号")
    If .Value IsNot Nothing Then
        Filter = "归属门店代号 = \'" & .Value & "\' and "
    End If
End With

 

With e.Form.Controls("VIP卡号")
    If .Value IsNot Nothing Then
        Filter+ = "VIP卡号 = \'" & .Value & "\'"
    End If
End With

Filter = Filter.TrimEnd(" ", "d", "n", "a")


--  作者:fubblyc
--  发布时间:2014/3/24 17:02:00
--  

jspta老师,如何在数据库创建视图,我百度了下,需要这样:

 


图片点击可在新窗口打开查看此主题相关图片如下:qq图片20140324170125.jpg
图片点击可在新窗口打开查看

 

能不能直接在狐表创建呢。。


--  作者:狐狸爸爸
--  发布时间:2014/3/24 17:05:00
--  
不可以
--  作者:Bin
--  发布时间:2014/3/24 17:07:00
--  
用SQLCOMMAND 执行 T-SQL语句来创建视图倒是可以的.