看看这段代码那里出错了!那位大侠帮帮我这个菜鸟啊!(100分)

  • 主题发起人 主题发起人 poim110
  • 开始时间 开始时间
P

poim110

Unregistered / Unconfirmed
GUEST, unregistred user!
COUNT_QUERY.Close;
COUNT_QUERY.SQL.Text:='SELECT TZNAME_TABLE.PROJECTNUMBER as 编码,TZNAME_TABLE.PROJECTFATHER AS 父编码, '
+'TZdate_TABLE.WORKGS AS 概算工作量,TZdate_TABLE.WORKYS AS 预算工作量,TZdate_TABLE.TZWORKS AS 调整工作量,TZdate_TABLE.CWWORKS AS 财务决算工作量,'
+'TZdate_TABLE.ADDCOUNT AS 累计工作量,TZdate_TABLE.OFYEAR AS 年份 FROM TZDATE_TABLE INNER JOIN TZNAME_TABLE '
+'ON TZDATE_TABLE.PROJECTNUMBER = TZNAME_TABLE.PROJECTNUMBER order by TZNAME_TABLE.projectnumber DESC';
COUNT_QUERY.Open;
COUNT_QUERY.First;
while not COUNT_QUERY.Eof do
begin
COUNT_QUERY.Edit;
//概算工作量
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select sum(WORKGS) as 概算工作量 from TZDATE_TABLE INNER JOIN TZNAME_TABLE '
+'ON TZDATE_TABLE.PROJECTNUMBER = TZNAME_TABLE.PROJECTNUMBER where TZNAME_TABLE.projectfather='+#39+COUNT_QUERY.fieldbyname('编码').AsVariant+#39+' and ofyear='+COUNT_QUERY.fieldbyname('年份').AsString;
ADOQuery1.Open;
if ADOQuery1.FieldByName('概算工作量').AsInteger<>0 then
begin
COUNT_QUERY.FieldByName('概算工作量').AsVariant:=ADOQuery1.FieldByName('概算工作量').AsVariant;
end;
//预算工作量
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select sum(WORKYS) as 预算工作量 from TZDATE_TABLE INNER JOIN TZNAME_TABLE '
+'ON TZDATE_TABLE.PROJECTNUMBER = TzNAME_TABLE.PROJECTNUMBER where projectfather='+#39+COUNT_QUERY.fieldbyname('编码').AsVariant+#39+' and ofyear='+COUNT_QUERY.fieldbyname('年份').AsString;
ADOQuery1.Open;
if ADOQuery1.FieldByName('预算工作量').AsInteger<>0 then
begin
COUNT_QUERY.FieldByName('预算工作量').AsVariant:=ADOQuery1.FieldByName('预算工作量').AsVariant;
end;
//调整工作量
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select sum(TZWORKS) as 调整工作量 from TZDATE_TABLE INNER JOIN TZName_TABLE '
+'ON TZDATE_TABLE.PROJECTNUMBER = TZName_TABLE.PROJECTNUMBER where projectfather='+#39+COUNT_QUERY.fieldbyname('编码').AsVariant+#39+' and ofyear='+COUNT_QUERY.fieldbyname('年份').AsString;
ADOQuery1.Open;
if ADOQuery1.FieldByName('调整工作量').AsInteger<>0 then
begin
COUNT_QUERY.FieldByName('调整工作量').AsVariant:=ADOQuery1.FieldByName('调整工作量').AsVariant;
end;
//财务工作量
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select sum(CWWORKS) as 财务工作量 from TZDATE_TABLE INNER JOIN TZName_TABLE '
+'ON TZDATE_TABLE.PROJECTNUMBER = TZName_TABLE.PROJECTNUMBER where projectfather='+#39+COUNT_QUERY.fieldbyname('编码').AsVariant+#39+' and ofyear='+COUNT_QUERY.fieldbyname('年份').AsString;
ADOQuery1.Open;
if ADOQuery1.FieldByName('财务工作量').AsInteger<>0 then
begin
COUNT_QUERY.FieldByName('财务决算工作量').AsVariant:=ADOQuery1.FieldByName('财务工作量').AsVariant;
end;
//累计工作量
ADOQuery1.Close;
ADOQuery1.SQL.Text:='select sum(CWWORKS) as 累计工作量 from TZDATE_TABLE INNER JOIN TZName_TABLE '
+'ON TZDATE_TABLE.PROJECTNUMBER = TZName_TABLE.PROJECTNUMBER where TZName_TABLE.projectnumber='+#39+COUNT_QUERY.fieldbyname('编码').AsVariant+#39+' and ofyear<='+COUNT_QUERY.fieldbyname('年份').AsString;
ADOQuery1.Open;
if ADOQuery1.FieldByName('累计工作量').AsInteger<>0 then
begin
COUNT_QUERY.FieldByName('累计工作量').AsVariant:=ADOQuery1.FieldByName('累计工作量').AsVariant;
end;
COUNT_QUERY.Post;
COUNT_QUERY.Next;
end;
错误提示:缺少更新或刷新的键列信息!
主键是有的,就算没有主键我这个得到的绝对也是唯一的数据结果集!
本人刚学检查了半天了找不到问题啊!还请大侠们指点一、二啊!
 
您的代码太长呀,不好看呀。挑出重点再来提问吧。
 
晕,自己跟踪调试啊
 
代码习惯不好让人看完很难。。。累死了。
 
懒得看了,太臃肿
 
确实代码不整齐不好看,算是帮你提前一下
 
干吗不用sql一次更新, 用while循环edit,post. 这样效率低,而且容易出错.
 
我发现一个问题,你的query控件close之后,没有使用query.sql.clear;这个方法,这么做的话是不是可取的哦?不妨在close之后,都加入这一条,不管是adoquery还是普通的query,然后在对sql.text赋值!
 
有几种可能
1:我记得ADO控件用eof 或 bof时有个bug,需要打一个包,不知打没打.
2:主从表的数据更新一般都是用TDataSet控件,而且主表和从表是用不同的TDataSet,我看你的代码是将主从表用sql连在一起,然后试图更新某个字短,这应该是问题所在(好久没用Delphi了,不知现在是否有了新的技术?).当然用TQuery也最好主从表分别使用不同的.分成两个实例,也比较符合数据库编程的思想.
 
最好先确定你的sql语句有没有问题!可以拷贝到你的数据库管理软件中试试看。
 
9861
我觉得你好象是说到点上了,我记得以前我也出现过这个问题,可是我忘了当初我是怎么解决了可以说的详细点么?
 
你可以试一下,把涉及到的每一个表都用一个TDataSet或TQuery封装.如果用TdataSet,可以参考TDataSet.MasterFields属性,可以实现从表更新后主表自动更新.如果是TQuery可以处理AfterPost或者是AfterScroll事件.
还有一种方式我记的是将子表作为主表TDataSet里的一个字短进行处理的,唉几年不用delphi了,具体细节回忆中...
 
我现在明白你的意思了,就是说DELPHI不支持主从表同时更新是吧,那我将他们分开处理不就对了!
 
或者你用视图就可以了.据我所知.net也不可能实现的
 
数据库设计太不好了,怎么用中文呢?

出错的原因COUNT_QUERY对标进行更新(UPDATE)时出现了错误,错误的原因是表中有两条(多条)完全一样的记录(数据),你查查数据库就知道了。
 
不会的我试了只有一条数据
SHOWMESSAGE(inttostr(COUNT_QUERY.recordcount))
测试提示为1!
 
谢谢你了,等了1天了就你说到点上了[:)]
 
后退
顶部