表HS
 RYID(姓名) TPM(图片名) GZL(工作量) ZLXS(质量系数)GZZY(标额) XMID
1          C1              3             4              25       1
1          C2              6            8               25       1
1          C3              5            4               25       2
2          C4              4            4               25       1
2          C5              3            6               25       2表PD
RYID(姓名))   EW1(额外1)       EW2(额外2)    EW3(额外3) XMID(项目名称编号)
1          2                   3                 5      1
1          5                   5                 8      1
2          5                   4                 6      2XMDF
XMID(项目编号)  XMMC(项目名称)
1               SO
2               FDS
RYDF
RYID(人员编号)     XM(姓名)
1                 小哈
2                 小分核算系数Q=(一个人得工作量之和+AVG(EW1)+AVG(EW2))/(所选人员的工作量之和/所选人数)+(一个人质量系数之和/一个人的图片数)+EW3
然后得到一个表
我能不能做个程序
把所有的项目都读到CHECKLISTBOX1中,然后我选择几个项目,就参与项目的人出现在CHECKLISTBOX2中,然后我又选择多个人参加核算
然后我可以得到所选人得核算系数
XM  Q
1    
2   
该怎么做
谁能教教我?源码怎么写?
QQ59476621

解决方案 »

  1.   


       sql语句写啊!!  不过你描述的太乱了.
      

  2.   

    给你个小小记吧
    你先把数据add到listbox中去(这里是先有一笔数据读到listbox1,然后在读取一些数据到listbox2中去),然后利用索引读取要用到的那些数据,就是利用listbox中的index值用数组把他们选出来,然后就是用你给的那个公式计算就可以了,用一个function或者是一个procedure就可以了
      

  3.   

    HI,qiongfei(茕菲) 你帮人帮到底咯,人家要代码:)
      

  4.   

    qiongfei(茕菲) 已经描述得很清楚了?还不明白?
    再给你具体点提示了,只是大概的代码,全部Copy肯定不行的。sSQL : String;
    iCount : Integer;程序初始化时在ListBox1列出所有的项目
    sSQL := 'Select * From XMDF';
    adoQuery.SQL.Add(sSQL);
    adoQuery.Open;
    For iCount := 0 to adoQuery.RecordCount -1 do
    Begin
     ListBox1.Items.Add(adoQuery.FieldByName('XMMC').AsString);
     adoQuery.Next;
    End; 在ListBox1的Click事件中,将项目人员加入到Listbox2中
    sSQL := Format('Select * From PD Where XMID = %d',[ListBox1.ItemIndex];
    adoQuery.SQL.Add(sSQL);
    adoQuery.Open;
    For iCount := 0 to adoQuery.RecordCount -1 do
    Begin
     CheckListBox1.Items.Add(adoQuery.FieldByName('RYID).AsString);
     adoQuery.Next;
    End; 在ListBox2的Click事件中,获取选中的用户的相关信息,生成核算系数Q就可以了
      

  5.   

    if exists (select name from sysobjects where name='MyProcedure' and type='p')
    drop procedure MyProcedure
    go
    create procedure MyProcedure 
    @ryid varchar(1000),
    @xmid varchar(1000)
    as
    declare @abc table(
    xm varchar(50) primary key,
    Q int null)
    insert into @abc(Q,xm)
    select sum(hs.gzl)+avg(pd.ew1)+avg(pd.ew2)/sum(hs.gzl)/count(hs.ryid)+sum(hs.zlxs)/count(hs.tmp)+sum(pd.ew3) as Q
    ,rydf.ryid
    from rydf inner join hs on rydf.ryid=hs.ryid 
    inner join pd on (hs.ryid=pd.ryid and
    hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
    where rydf.ryid in (@ryid) and xmdf.xmid in (@xmid) 
    group by rydf.ryid
    select * from @abc 
    go
    如果不需要存储过程
    select sum(hs.gzl)+avg(pd.ew1)+avg(pd.ew2)/sum(hs.gzl)/count(hs.ryid)+sum(hs.zlxs)/count(hs.tmp)+sum(pd.ew3) as Q
    ,rydf.ryid
    from rydf inner join hs on rydf.ryid=hs.ryid 
    inner join pd on (hs.ryid=pd.ryid and
    hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
    where rydf.ryid in (‘ryid',.....) and xmdf.xmid in ('xmid',....) 
    group by rydf.ryid
      

  6.   

    核算系数Q=(一个人得工作量之和+AVG(EW1)+AVG(EW2))/(所选人员的工作量之和/所选人数)+(一个人质量系数之和/一个人的图片数)+EW3上面的ew3是唯一的,还是谁的ew3,
    或者是之和呢
      

  7.   

    每个项目每个参加得人都一个唯一的EW1,EW2.EW3
    先谢谢先了
      

  8.   

    其实我就差最后一步
    写那个好生复杂得SQL语句了
    怎么写都不对?
      

  9.   

    昨天太匆忙了,没有看清楚问题,今天是改过的
    你在看看吧
    直接生成你要得临时表
    if exists (select name from sysobjects where name='MyProcedure' and type='p')
    drop procedure MyProcedure
    go
    create procedure MyProcedure @ryid varchar(1000),@xmid varchar(1000)
    as
    declare @b float 
    select @b=sum(hs.gzl)/count(hs.ryid)
    from rydf inner join hs on rydf.ryid=hs.ryid 
    inner join pd on (hs.ryid=pd.ryid and
    hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
    where rydf.ryid in (@ryid) and xmdf.xmid in (@xmid) declare @id varchar(50) , @S float ,@Q floatdeclare MyCursor cursor   
    for 
    select sum(hs.gzl)+avg(pd.ew1)+avg(pd.ew2),sum(hs.zlxs)/count(hs.tmp)+sum(pd.ew3)
    ,rydf.ryid
    from rydf inner join hs on rydf.ryid=hs.ryid 
    inner join pd on (hs.ryid=pd.ryid and
    hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
    where rydf.ryid in (@ryid) and xmdf.xmid in (@xmid)
    group by rydf.ryidopen MyCursor 
    fetch next from MyCursor
    into @S,@Q,@iddeclare @abc table(
    xm varchar(50) primary key,
    Q float null)while @@fetch_status=0 
    begin
      insert into @abc(xm,Q) values(@id,@S/@b+@Q)
      fetch next from MyCursor
      into @S,@Q,@id
    end;close MyCursor
    deallocate MyCursorselect * from @abc
    go
      

  10.   

    解决方法:
    存储过程名:Myprocedure (可改名)
    原码:
    if exists (select name from sysobjects where name='MyProcedure' and type='p')
      drop procedure MyProcedure
    go
      create procedure MyProcedure @ryid varchar(2000),@xmid varchar(2000)
      as
        declare @id varchar(50),@S float,@Q float,@sql1 nvarchar(4000),@sql2 nvarchar(4000)
        create table #a(sm1 float)
        set @sql1='insert into #a select sum(hs.gzl)/count(hs.ryid)
        from rydf inner join hs on rydf.ryid=hs.ryid 
        inner join pd on (hs.ryid=pd.ryid and
        hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
        where rydf.ryid in ('+@ryid+') and xmdf.xmid in ('+@xmid+')' 
       exec sp_executesql @sql1
       declare @tmp float
       select @tmp=sm1 from #a
       drop table #a   create table #tbl(sm1 float,sm2 float,rid varchar(50) primary key) 
       set @sql2='insert into #tbl select sum(hs.gzl)+avg(pd.ew1)+avg(pd.ew2),sum(hs.zlxs)/count(hs.tmp)+sum(pd.ew3),rydf.ryid 
       from rydf inner join hs on rydf.ryid=hs.ryid inner join pd on (hs.ryid=pd.ryid and
       hs.xmid=pd.xmid) inner join xmdf on pd.xmid=xmdf.xmid
       where rydf.ryid in ('+@ryid+') and xmdf.xmid in ('+@xmid+')group by rydf.ryid'
       exec sp_executesql @sql2
       declare @abc table(xm varchar(50) primary key,Q float null)
       declare MyCursor cursor
       for
         select * from #tbl
       open MyCursor 
       fetch next from MyCursor
       into @S,@Q,@id
       while @@fetch_status=0 
      begin
        insert into @abc(xm,Q) values(@id,@S/@tmp+@Q)
        fetch next from MyCursor
        into @S,@Q,@id
      end
      close MyCursor
      deallocate MyCursor
      drop table #tbl
      select * from @abc
    go
    调用示例:
      exec Myprocedure ryid,xmid   如exec Myprocedure '1,2,3,4','1,2,3,4'在delphi下将生成的ryid字符串,格式如‘1,2,3,4,...’
    以及xmid字符串,格式如‘1,2,3,4...'
    当作参数传入TADOStoredProc中,执行即可结果:
      xm,    q
        1 5.0
        2 8.0
        3 8.0
        4 3.5
      

  11.   

    你是用SQL存储过程实现的,那在DELPHI中怎么实现啊
    也要建这么多临时表吗,那游标呢?
      

  12.   

    不用,你把checklistbox中选种的项目以及人员的id连成字符串如:‘1,2,3’分别传给存储过程的两个参数就好了
      

  13.   

    这样吧,你要是不着急,我明天作一个给你用delphi,
    你把email留下
      

  14.   

    太感人了555555555555555555555555555555
    [email protected]
    lz是小写的
    谢谢:)
      

  15.   

    还是做办工室助理好.为什么去要啃这些看了都会变成冰的Code