一种看似简单的报表格式,请求解决办法? ( 积分: 100 )

  • 主题发起人 主题发起人 dadada
  • 开始时间 开始时间
D

dadada

Unregistered / Unconfirmed
GUEST, unregistred user!
表一:
收款日期 收款
2007-01-01 100
2007-01-10 150
2007-01-12 300
2007-01-14 200
2007-01-20 150
表二:
付款日期 付款
2007-01-03 200
2007-01-10 100
2007-01-11 150
2007-01-16 200
2007-01-22 300
要求生成以下格式的报表或临时表:
收款日期 收款 付款日期 付款
2007-01-01 100
2007-01-03 200
2007-01-10 150 2007-01-10 100
2007-01-11 150
2007-01-12 300
2007-01-14 200
2007-01-16 200
2007-01-20 150
2007-01-22 300
要点: 按日期的先后,将两个表中的数据报到一个表中,
除非是一天有同时发生,否则要求错开罗列.
象这种东东,不使用报表控件,只用SQL语句
来表达,或用SQL写个临时表,都不好办,在此请教各位
高手了,请出点建议?
 
我想,应该是以下这种格式吧:
收付日期 收款 付款
2007-01-01 100
2007-01-03 200
2007-01-10 150 100
2007-01-11 150
 
這個可以動態在後面寫代碼。應該可以實現,別的不會了,
 
to;
maolu28
不,不是你写的那种格式.
所以不知该怎么办才好.
to: Delphiguanshui
我用SQL写也没写出来.
 
新建一个表,用几句语句把2个表合并。
New Table 字段定义:
日期 Date //主键 //排序打印
金额1 Money
金额2 Money
======================
//统计表一
while not tab1.eofdo
begin
if Tab3.Locate('日期', Tab1['日期']) then
Tab3.Edit else
Tab3.Append;
Tab3['金额1'] := Tab1['金额'];
Tab3.post;
tab1.Next;
end;
//统计表二
.....................
.....................
Tab3['金额2'] := Tab2['金额'];
............................
end;
 
delphi世界qq群:23981160,喜欢Delphi的都进来
 
建一个表,收款日期 收款 付款日期 付款4个字段
发生业务时,直接写入对应条目.
 
既然是报表,那就union两个表吧
select 收款日期, 收款, '', '' from 表一
union all
select '', '', 付款日期, 付款 from 表二
然后排成你要的格式就可以了。
 
如果用的是SQL SERVER,可以用这个存储过程
CREATE PROCEDURE [TEST_TOTAL] AS
begin
TRANSACTION
/*先整理出来一个排好序的日期*/
SELECT 付款日期 AS 日期, 付款 AS 数目, 1 AS 标识
INTO #DATALIST
FROM 表1
UNION
SELECT 收款日期 AS 日期, 收款 AS 数目, 2 AS 标识
FROM 表2
/*定义几个变量*/
DECLARE @SFRQ DATETIME,
@SFSL FLOAT,
@BS INTEGER,
@SFRQ2 DATETIME,
@SFSL2 FLOAT,
@BS2 INTEGER,
@NUM INTEGER
/*空表,保存最终数据使用*/
SELECT 0 AS 流水号,
付款日期 AS 日期一, 付款 AS 数目一,
付款日期 AS 日期二, 付款 AS 数目二,
INTO #RESULTDATA
FROM 表1 WHERE 0=1
/*使用游标查询数据*/
DECLARE #DATALIST_CURSOR CURSOR FOR
SELECT * FROM #DATALIST ORDER BY 日期,标识
OPEN #DATALIST_CURSOR
FETCH NEXT FROM #DATALIST_CURSOR
INTO @SFRQ, @SFSL, @BS
@NUM = 1
WHILE @@FETCH_STATUS = 0
begin
IF (@BS=2)
begin
INSERT INTO #RESULTDATA (流水号, 日期二, 数目二) VALUES (@NUM, @SFRQ, @SFSL)

FETCH NEXT FROM #DATALIST_CURSOR
INTO @SFRQ, @SFSL, @BS
@NUM = @NUM + 1
END

IF (@BS=1)
begin
INSERT INTO #RESULTDATA (流水号, 日期一, 数目一) VALUES (@NUM, @SFRQ, @SFSL)

FETCH NEXT FROM #DATALIST_CURSOR
INTO @SFRQ2, @SFSL2, @BS2
@NUM = @NUM + 1

IF (@SFRQ2 = @SFRQ)
begin
UPDATE #RESULTDATA SET 日期二 = @SFRQ2, 数目二 = SFSL2 WHERE 流水号 = @NUM - 1

FETCH NEXT FROM #DATALIST_CURSOR
INTO @SFRQ, @SFSL, @BS
END
END
END
CLOSE #DATALIST_CURSOR
DEALLOCATE #DATALIST_CURSOR
IF (@@ERROR =0)
begin
SELECT * FROM #RESULTDATA
END
COMMIT TRANSACTION
GO
 
直接用一个视图就可以搞定 假定收款表是Table1, 付款表是Table2, 先建一个视图得到未排序的目标结果,然后使用时再根据时间排序一下就可以了。以下语句直接在查询分析器运行即可。
CREATE VIEW VIEW1 AS
select 收款日期,收款,付款日期,付款 from table1 left join table2 on 收款日期=付款日期
union
select 收款日期,收款,付款日期,付款 from table1 Right join table2 on 收款日期=付款日期
GO
select * From view1 order by Case when 收款日期 is null then
付款日期 else
收款日期 end
 
晕倒,有那么复杂嘛,看似简单的东西就应该简单.
select *
from [表一] full join [表二] on day(收款日期)=day(付款日期)
order by isnull(收款日期, 付款日期)
SQL Server 2000下验证通过,看似正确.
 
本人的统计程序才是唯一正解,
打印出的报表完全满足需要。
统计表每次统计前要清空。
 
to LeeChange兄:
“看似正确”应改为“完全正确”,哈哈[:D]
用 FullJoin + Order By IsNull ——又学了一招,哈哈[:D]
2007-1-1 100
2007-1-3 200
2007-1-10 150 2007-1-10 100
2007-1-11 150
2007-1-12 300
2007-1-14 200
2007-1-16 200
2007-1-20 150
2007-1-22 300
 
楼主没有说明使用的是何种数据库啊
如果是 Access 数据库就不行
 
本来此问题的关键失误在于:建立了2个表。
其实只要建立一个表就行了的事情,搞成这样,
反而骨朵麻烦。建立一个表如下字段描述:
日期 收款 付款
就很简单了,为什么要简历个表呢?
程序员啊,系统分析规划是怎么做的啊?????
 
呵呵,由此可见,如果前期工作到位,就不会需要挖空心思想技巧来填补不足。
一分预防胜于十分补救! 没有修练到系统分析员的程序员,还没有到高级阶段。
 
直接用外连接查询就可以了吧
 
是什么数据库,如果是SQL SERVER 可以这样实现
select status,
case status when '-' then
''
else
reldate
end as '收款日期',
case status when '-' then
0
else
amt
end as '收款',
case status when '+' then
''
else
reldate
end as '付款日期',
case status when '+' then
0
else
amt
end as '付款'
from (
select 收款日期 as reldate,收款 as amt,‘+’ as status
from 表一
UNION all
select 付款日期 as reldate,付款 as amt,‘-’ as status
from 表二
)
order by reldate
 
数据整合自己做,展现应该用那个报表工具都做得到。
Grid++Report 为 Delphi、C++Builder 编写专门的包装类,象使用 VCL 构件一样。主页:
http://www.rubylong.cn
 
感谢各位高见!
分不够分,委屈大家了!
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部