巨难:能动态的添加crossTab的列(用空白列填充)吗?或者使用sql语句?——中国龙请进来

pbworm 2002-07-31 06:03:00
我想将crossTab的列固定在25列,但是如果检索出来的项目小于25的话,怎么使用空白列来填充????
我的项目总数是大于25的,但是通过条件检索后得到的项目数目应该是小于等于25的。

to 中国龙:
你的sql语句我试了,如果只有25个项目的话应该是可以的,但是我现在的项目总数大于25个,使用你的语句得到的结果就不太正确了。或者是我使用的有问题?
...全文
63 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
pbworm 2002-10-14
  • 打赏
  • 举报
回复
还没有完
踢一下
TianChong 2002-08-04
  • 打赏
  • 举报
回复
UP~
pbworm 2002-08-03
  • 打赏
  • 举报
回复
to lzp_lrp(lzp) ( )
怎么做?
pbworm 2002-08-02
  • 打赏
  • 举报
回复
实际上最后select * #temp语句中的where 应该是在select ……into #temp的where中的,可是如果这样的话,直接就无法生成crossTab了。
pbworm 2002-08-02
  • 打赏
  • 举报
回复
to llitcwl(中国龙)
使用manual result set的话,如果是生成grid类型(其他的我没有试)数据窗口的话就没有问题。但是如果生成crossTab类型的话就会自动关闭pb(2000、8.02和7.03都试了)
pbworm 2002-08-02
  • 打赏
  • 举报
回复
为什么在将下面的存储过程(有两处有/*……*/去掉)作为数据源生成crosstab的时候,define corss rows、columns、values 的窗口中无法看见存储过程返回结果集中的列。

而将/*……*/加上后的存储过程就可以呢?

CREATE PROCEDURE usp_getCrossTab
@depaCode int = 15,
@courseTerm int = 2,
@studentGrade int = 2001,
@classAsAdmin varchar(5) = '02'
AS
SELECT VIEW_STUDENTGRADEINFO.studentCode,
studentInfoTab.studentName,
courseInfoTab.courseName,
VIEW_STUDENTGRADEINFO.credithour,
VIEW_STUDENTGRADEINFO.grade,
studentInfoTab.depaCode,
VIEW_STUDENTGRADEINFO.courseTerm,
studentInfoTab.studentGrade,
studentInfoTab.classasadmin
into #temp
FROM courseInfoTab,
studentInfoTab,
VIEW_STUDENTGRADEINFO
WHERE ( studentInfoTab.studentcode = VIEW_STUDENTGRADEINFO.studentCode ) AND
( VIEW_STUDENTGRADEINFO.courseCode = courseInfoTab.courseCode )


declare @courseCount int
declare @i int
declare @studentCode varChar(15)
declare @studentName varChar(50)

select @courseCount = count(distinct (courseName)) from #temp
/* where ( depaCode = @depaCode ) AND
( courseTerm = @courseTerm) AND
( studentGrade = @studentGrade ) AND
( classasadmin = @classAsAdmin )*/

select @studentCode = studentCode,@studentName = studentName from #temp
/* where ( depaCode = @depaCode ) AND
( courseTerm = @courseTerm) AND
( studentGrade = @studentGrade ) AND
( classasadmin = @classAsAdmin ) */

set @i = @courseCount

while ( @i < 25 ) begin
insert into #temp (studentCode,studentName,courseName,credithour,grade,depaCode,courseTerm,studentGrade,classAsAdmin)
values(@studentCode,@studentName,cast(@i as varchar(50)),0,'',@depaCode,@courseTerm,@studentGrade,@classAsAdmin)
set @i = @i + 1
end

select * from #temp
where ( depaCode = @depaCode ) AND
( courseTerm = @courseTerm) AND
( studentGrade = @studentGrade ) AND
( classasadmin = @classAsAdmin )
WorldMobile 2002-08-02
  • 打赏
  • 举报
回复
我有办法了,你动态创建几个计算列不就行了么?
WorldMobile 2002-08-02
  • 打赏
  • 举报
回复
动态的添加crossTab的列实际上只需要动态改变Crossrtab的定义使之符合要求即可~????

我也学习学习
pbworm 2002-08-02
  • 打赏
  • 举报
回复
to SOFTFUN_CSDN(不知所云~)
动态的添加crossTab的列实际上只需要动态改变Crossrtab的定义使之符合要求即可~????
如何做,请指教
bigworld 2002-08-02
  • 打赏
  • 举报
回复
用存储过程比较好。我开始作报表时没有用存储过程,给PM狠批了一顿。现在学乖了。
Methodor 2002-08-02
  • 打赏
  • 举报
回复
感觉使用crosstab要满足要求只能参照楼上说的2中方法~
其实lzp说的也是一般的比较实际的解决方法(动态判断)~
sp有速度优势~
不加where条件确实应该出现你说的现象-正常~
grid-没有问题,因为列是固定的~
crosstab则行和列均未知,所以无法选择~
使用manual result set产生crosstab肯定是溢出-不用试~
事实上我的意见是:动态的添加crossTab的列实际上只需要动态改变Crossrtab的定义使之符合要求即可~
不要尝试在crosstab内部做什么复杂的变动处理(产生后)~
不过考虑稳定性等要求,则使用datastore之类借助外部数据源来实现是比较稳妥(也比较保守)的方法,缺点可能是效率的牺牲~
pbworm 2002-08-01
  • 打赏
  • 举报
回复
to lzp_lrp(lzp)
使用外部数据源再将数据插入的话速度是一个问题,虽然控制起来比较的灵活。

昨天晚上和中国龙讨论了一下,好象只有使用存储过程是一个比较好的方法。

其他人还有什么好的建议吗?
佣工7001 2002-08-01
  • 打赏
  • 举报
回复
都是星星!
dotnba 2002-08-01
  • 打赏
  • 举报
回复
学习
WorldMobile 2002-08-01
  • 打赏
  • 举报
回复
不过我觉的你还是不要用crosstab,你用外部数据源,然后把数据插进出,多好

我以前做这样的报表都是这样做的,控制起来灵活
lanying 2002-08-01
  • 打赏
  • 举报
回复
vb,asp,c我熟,pb刚开始
llitcwl 2002-07-31
  • 打赏
  • 举报
回复
同意楼上,我暂时也想不到别的办法了,但是再说一句:
"为了使用合乎规格的报表,需要使用空白列来填充"
这样看,是不是已经有了一张固定格式表?如果有的话,是不是可以不考虑这个问题?直接使用CROSSTAB去套打,没有数据就是空白了嘛。
WorldMobile 2002-07-31
  • 打赏
  • 举报
回复
你用数据存储做数据源建数据窗口,在数据存储中判断一下列的分组后是否为25行,或者你可以传一个参数过去,判断一下分组后是否为这个参数,不够的话就插入几条数据,不过要保证数据不一样,否则你还是白插了

肯定没有问题,你可以试试

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧