当前位置:主页>销售管理软件> 列表

提问如何SQL及打印,

企业管理软件版1楼: 表结构
编号 姓名 工序号 件数
01 王 1 100
01 王 2 120
02 张 1 100
03 李 2 150
03 李 3 120
04 李 4 150
要求打印出如下结果
编号 姓名 工序号 件数 工序号 件数 工序号 件数 工序号 件数 工序号 件数
01 王 1 100 2 120
02 张 1 100
03 李 2 150 3 120 4 150
请问高手如何解决,是先用SQL查询出来再打印,还是直接在quickreport可以解决吗,

2楼: 这有很多方法可以解决,最简单的方法就是做一个临时表。表结构如下:
编号 姓名 工序号 件数 工序号 件数 工序号 件数 工序号 件数 工序号 件数
然后把每个编号人的数据读到这个表中,然后再打印。
其它方法比如说可以写存储过程用游标查询,或者说一个复杂的SQL语句查询也可以实现这个目标。 如免费局域网管理软件

3楼: 楼主先确定共有多少工序再来看看吧

4楼: 其中工序不确定,但是不会很多,不超过每个人不超过10道吧,我用的是access2000,请问高手如何解决,具体一些,好吗

5楼: 用交叉表,楼主可以查查以前的老帖子。

6楼: 交叉表这么实现呀?


在交叉表中能又重复工件序号,件数吗?至少我没有见过,,,我给你例子,自己看吧,改改能实现你的要求。。。


ALTER procedure 门诊收费_按病人类型统计
@rq1 datetime,
@rq2 datetime,
@brlx smallint,
@km tinyint=0,
@kslx tinyint=0
as

declare @fd varchar(50)
declare @rd varchar(50)
declare @rhj decimal(14,4)
declare @val decimal(14,4)
declare @rc int
declare @sqlStr varchar(200)

set noCount on

create table #fd(fName varchar(50) null)
create table #rd(rName varchar(50) null)

if @km=0
insert into #fd select distinct yjkmmc from v_sfxmInfo where sfxmdm in
(select sfxmdm from v_mzfp_mzfpmx where rq between @rq1 and @rq2 and brlx=@brlx)
else
insert into #fd select distinct ejkmmc from v_sfxmInfo where sfxmdm in
(select sfxmdm from v_mzfp_mzfpmx where rq between @rq1 and @rq2 and brlx=@brlx)

insert into #fd(fName) values(''人数'')
insert into #fd(fName) values(''合计'')

if @kslx=0
insert into #rd select distinct kdksmc from v_mzfp_mzfpmx where rq between @rq1 and @rq2


and brlx=@brlx
else
insert into #rd select distinct zxksmc from v_mzfp_mzfpmx where rq between @rq1 and @rq2
and brlx=@brlx

if exists(select * from #fd)
create table #tb(ksmc varchar(50) null)
else
return

declare cur_field cursor for select fName from #fd
open cur_field
fetch next from cur_field into @fd

while @@fetch_status=0
begin
set @sqlStr=''alter table #tb add ''+@fd+'' varchar(50) null''
exec (@sqlStr)

fetch next from cur_field into @fd
end

close cur_field
deallocate cur_field


declare cur_rd cursor for select rName from #rd
open cur_rd
fetch next from cur_rd into @rd

while @@fetch_status=0
begin
set @rhj=0
insert into #tb(ksmc) values(@rd)

declare cur_fd cursor for select fName from #fd
open cur_fd
fetch next from cur_fd into @fd

while @@fetch_status=0
begin
if @kslx=0
begin
if @km=0
set @val=isnull((select sum(ssje) from v_mzfp_mzfpmx where yjkmmc=@fd and

rq between @rq1 and @rq2 and kdksmc=@rd and brlx=@brlx),0)
else
set @val=isnull((select sum(ssje) from v_mzfp_mzfpmx where ejkmmc=@fd and
rq between @rq1 and @rq2 and kdksmc=@rd and brlx=@brlx),0)
end
else
begin
if @km=0
set @val=isnull((select sum(ssje) from v_mzfp_mzfpmx where yjkmmc=@fd and
rq between @rq1 and @rq2 and zxksmc=@rd and brlx=@brlx),0)
else
set @val=isnull((select sum(ssje) from v_mzfp_mzfpmx where ejkmmc=@fd and
rq between @rq1 and @rq2 and zxksmc=@rd and brlx=@brlx),0)
end
set @sqlStr=''update #tb set ''+@fd+''=''+cast(convert(decimal(14,2),@val) as varchar)+'' where ksmc=''''''+@rd+''''''''
exec(@sqlStr)

set @rhj=@rhj+@val

if @fd=''合计''
update #tb set 合计=convert(decimal(14,2),@rhj) where ksmc=@rd

fetch next from cur_fd into @fd
end

close cur_fd
deallocate cur_fd

-----------------人数统计------------------------
if @kslx=0
begin
set @rc=(select count(distinct abs(mzfph)) from v_mzfp_mzfpmx where rq between @rq1 and @rq2 and
kdksmc=@rd and brlx=@brlx)
end
else
begin
set @rc=(select count(distinct abs(mzfph)) from v_mzfp_mzfpmx where rq between @rq1 and @rq2 and
zxksmc=@rd and brlx=@brlx)
end
set @sqlStr=''update #tb set 人数=''+cast(@rc as varchar)+'' where ksmc=''''''+@rd+''''''''
exec (@sqlStr)

fetch next from cur_rd into @rd

end

close cur_rd
deallocate cur_rd

insert into #tb(ksmc) values(''合计'')

declare cur_field cursor for select fName from #fd
open cur_field
fetch next from cur_field into @fd

while @@fetch_status=0
begin
set @val=0
if (@fd<>''ksmc'') and (@fd<>''人数'')
begin
set @sqlStr=''update #tb set ''+@fd+''=(select sum(isnull(cast(''+@fd+'' as decimal(14,2)),0)) from #tb) where ksmc=''''合计''''''

exec (@sqlStr)
end

if (@fd=''人数'')
begin
set @sqlStr=''update #tb set ''+@fd+''=(select sum(isnull(cast(''+@fd+'' as int),0)) from #tb) where ksmc=''''合计''''''
exec (@sqlStr)
end
fetch next from cur_field into @fd

end

close cur_field
deallocate cur_field

select * from #tb

企业管理软件版7楼: access支持存贮过程吗,

8楼: 我一般用BDE提供的paradox表作临时表(可按要求格式新建),
然后读取源表数据,while..do语句逐条写到临时表中(注意建主键,可用FindKey检索)。
临时表用DBGrid或DBGridEh显示。
窗体关闭后,可将临时表DeleteTable。

这不使用任何报表。

9楼: 我这有一个例字,和你类似已经调试成功,你看一下可能对你有帮助
如:
学号 课程 成绩
转换后格式如下:
学号 课程 课程 课程
成绩 成绩 成绩
. . .
. . .
. . .
程序如下:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
s:string;
begin
try
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.sql.Text := ''select 学号 into b from chengjibiao group by 学号'';
adoquery1.execsql;
adoquery1.close;
adoquery1.SQL.Clear;
adoquery1.sql.text := ''select 课程 from chengjibiao group by 课程'';
adoquery1.open;
while not adoquery1.Eof do
begin
adoquery2.sql.text :=format(''alter table b add %s integer'',[adoquery1.FieldValues[''课程'']]);
adoquery2.execsql;
adoquery1.Next;
adoquery2.close;
adoquery2.SQL.Clear;
end;

adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Add(''select * from chengjibiao'');
adoquery1.open;
adoquery1.first;
while not adoquery1.eof do
begin
adoquery2.sql.text := ''update b set %s =%s where 学号=''''%s'''''';
adoquery2.sql.text := format(adoquery2.sql.text,
[adoquery1.fieldbyname(''课程'').asstring,
adoquery1.fieldbyname(''成绩'').asstring,
adoquery1.fieldbyname(''学号'').Asstring]);
adoquery2.execsql;
adoquery2.close;
adoquery1.next;


end;
adoquery1.close;
showmessage(''ok'');
except
end;
end;
end.

10楼: TO:都当主席谁种地, 你给的答案还是不太合适,由于每道产品有上百道工序,所以这样的话,你的结杲的列就会很多,我要的是结果是这样的

编号 姓名 工序号 件数 工序号 件数 工序号 件数 工序号 件数 工序号 件数
01 王 1 100 2 120
02 张 1 100
03 李 2 150 3 120 4 150
工序号,件数,这样就不会很长啦,我太自己研究一下,谢谢你们

11楼: var i,ls: integer; //ls为列数,可以自定义 ,当前为10个,
s,fname,lname:string; //fname为前一个工号, lname为后一个工号.
begin

try
with dm.ADOQ_stat,dm.ADOQ_statedit do
begin
dm.ADOQ_stat.Close;
dm.ADOQ_stat.SQL.Clear;
dm.ADOQ_stat.sql.Text := ''drop table b '';
dm.ADOQ_stat.execsql;
dm.ADOQ_stat.Close;
dm.ADOQ_stat.SQL.Clear;
dm.ADOQ_stat.sql.Text := ''select 工号 into b from mztjmx group by 工号'';
dm.ADOQ_stat.execsql;
dm.ADOQ_stat.close;


dm.ADOQ_stat.SQL.Clear;
dm.ADOQ_stat.sql.text := ''select 工序号 from mztjmx group by 工序号'';
dm.ADOQ_stat.open;
ls:=1;
while ls<11 do
begin
dm.ADOQ_statedit.close;
dm.ADOQ_statedit.SQL.Clear;
dm.ADOQ_statedit.sql.text :=format(''alter table b add %s string'',[''工序号''+inttostr(ls)]);
dm.ADOQ_statedit.execsql;
dm.ADOQ_statedit.close;
dm.ADOQ_statedit.SQL.Clear;
dm.ADOQ_statedit.sql.text :=format(''alter table b add %s integer'',[''件数''+inttostr(ls)]);
dm.ADOQ_statedit.execsql;
ls:=ls+1;
end;
dm.ADOQ_stat.Close;
dm.ADOQ_stat.sql.Clear;
dm.ADOQ_stat.SQL.Add(''select * from mztjmx'');
dm.ADOQ_stat.open;
dm.ADOQ_stat.first;
fname:=dm.ADOQ_stat.Fieldbyname(''工号'').AsString;
lname:=dm.ADOQ_stat.Fieldbyname(''工号'').AsString;
ls:=1;
while not dm.ADOQ_stat.eof do
begin
if fname<>lname then ls:=1;
fname:=dm.ADOQ_stat.Fieldbyname(''工号'').AsString;
dm.ADOQ_statedit.sql.text := ''update b set %s =%s,%s=%s where 工号=''''%s'''''';
dm.ADOQ_statedit.sql.text := format(dm.ADOQ_statedit.sql.text,
[''工序号''+inttostr(ls),dm.ADOQ_stat.fieldbyname(''工序号'').asstring,
''件数''+inttostr(ls),dm.ADOQ_stat.fieldbyname(''件数'').asstring,
dm.ADOQ_stat.fieldbyname(''工号'').Asstring]);
dm.ADOQ_statedit.execsql;
dm.ADOQ_statedit.close;
dm.ADOQ_stat.next;
ls:=ls+1;
lname:=dm.ADOQ_stat.Fieldbyname(''工号'').AsString;
end;
dm.ADOQ_stat.close;
showmessage(''ok'');
end;
except
end;


谢谢 都当主席谁种地 ,我按照你的思路稍改了一个实现这个功能,

12楼: 大家好 如销售管理软件下载