永发信息网

pb的DW查询sql server的表时,过滤器中不能用dateadd?

答案:2  悬赏:80  手机版
解决时间 2021-04-13 10:32
  • 提问者网友:疯子也有疯子的情调
  • 2021-04-13 05:47
一直搞不太明白 到底能不能再filter中使用dateadd函数
这不是sqlserver中自带的函数么? 在pb的filter却不识别?
如果我想做这样的操作:表中有周期(月、日、年、等)还有保存的日期
过滤出快要到期的物品应该怎样做?
过滤器中又不能用if语句和dateadd函数 而dw的显示也是一次完成的
我要怎样才能一次滤出快到期的所有物品?
=0= 眼圈都看大了 好心的人啊~~ 99999

啊~~ 对不起啊 问得不明白。。。辛苦了 其实我想做的是 根据到期日期是“季度”“月”和“年”这样的 带回不同的结果集 本来是想如果是“月”就dateadd(month,1,startdate)这样的。要用日期加上过期的期限来和today()比= = 发愁啊。。。
不是输入数据比较 是根据表里日期加上期限的

没人搭理我。。分你给你 最后我是调用存储过程又+了一列标识做的。。。= = 无奈之举 哎
最佳答案
  • 五星知识达人网友:你可爱的野爹
  • 2021-04-13 06:18
首先要明确:filter()是不能嵌套任何函数和语句的。

其次,这样的应用,用datediff()函数要比dateadd()好很多。

//-----------------------------------------------------------
这个问题很好解决:修改你数据窗口的数据源

打开数据窗口的数据源(Data Source),
增加一个检索的变量(菜单的Retrieval Arguments),名称例如n,类型为number数值型,这个变量的意义是“天数”(用datediff()函数来计算全部物品两个时间点上的天数差,然后和这个变量比较)

再加一个where条件,使数据源变成类似这样:

select a,b,……m,n
from 表
where datediff(dd,表里的物品日期字段,getdate()) <= :n //--有冒号的,注意
//--假如你表里的每个物品都有其各自不同的到期时间,那就将getdate()替换为这个字段吧

到这步,你在PB里打开这个数据窗口,不再一股脑的显示出对应表里的数据了,而是提示你输入一个值,假如你输入10,那么就是检索10天内即将到期的物品数据。

好了,数据窗口完工之后,就要写程序脚本了,弄个文本输入框(如sle_1)、一个按钮(如cb_1)就可以,文本框用于输入那个变量,按钮用于执行检索语句。

按钮cb_1的脚本这样写(假设你数据窗口叫dw_1):
dw_1.retrieve(:sle_1.text)//--有冒号的,注意

只这一句,非常简单,就是让数据窗口以sle_1里你输入的数值作为变量来执行检索事务(retrieve)。输入25,就是检查还有25天到期的物品。

如果有这个要求:什么也不输入,直接点按钮查询就无条件的检索出全部物品,那么可以在cb_1的脚本里加点东西:
integer li_n //--定义变量,用sle_1的内容赋值
if trim(sle_1.text) = '' then li_n = 9999 //--若sle_1没有值,则天数为9999天,反正大些就行
dw_1.retrieve(:li_n)

--------------------------------------------------------------
其实还有很多方法,比如组合数据窗口的数据源,重写其SQL并提交检索,这复杂一点点,需要些的语句会多些

不知道是否有帮助,你的问题不是十分明了,我只能按自己的理解写写了。

//--附:datediff()函数
datediff(dd,日期1,日期2)
//--1--计算两个日期之间的天数,日期1一般早于日期2,若晚于,则返回负值(绝对值是一样的)。
//--2--函数中dd指定了计算两个日期所差的天数,若换成mm,则是计算月数,yy你就好理解了吧,呵呵
全部回答
  • 1楼网友:北城痞子
  • 2021-04-13 07:16
支持一下感觉挺不错的
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯