delphi 求和问题(50分)

  • 主题发起人 主题发起人 倒数第一
  • 开始时间 开始时间

倒数第一

Unregistered / Unconfirmed
GUEST, unregistred user!
//如果有相同的那么新增一条记录,把原来的rkcp_zs+edit6的值=新增记录的总数
ADOquery4.Close;
ADOquery4.SQL.Clear;
ADOquery4.SQL.Text:='select * from cprk where rkcp_name=:edit1 ';
ADOquery4.Parameters.ParamByName('edit1').Value:=edit1.Text;
ADOquery4.Open;
if not ADOquery4.Eof then
begin
ADOquery4.Close;
ADOquery4.SQL.Clear;
ADOquery4.SQL.Add('insert into cprk (rkcp_name,rkcp_gg,rkcp_xh,rkcp_bh,rkcp_mey,rkcp_sl,rkcp_zs) values

('''+edit1.Text+''','''+edit2.Text+''','''+edit3.Text+''','''+edit4.Text+''','''+edit5.Text+''','''+edit6.Text+''') ');
ADOquery4.ExecSQL;
end
else //如果没有相同的,那么就创建一条新的记录,并且:(假设rkcp_zs的值为0)那么rkcp_zs=edit6的值
ADOquery4.Close;
ADOquery4.SQL.Clear;
ADOquery4.SQL.Add('insert into cprk (rkcp_name,rkcp_gg,rkcp_xh,rkcp_bh,rkcp_mey,rkcp_sl) values

('''+edit1.Text+''','''+edit2.Text+''','''+edit3.Text+''','''+edit4.Text+''','''+edit5.Text+''','''+edit6.Text+''') ');
ADOquery4.ExecSQL;
end;

按上面的代码,这个求和的SQL代码应该怎么写? rkcp_zs=rkcp_sl+edit6 的代码怎么写?
 
看了很久都不明白楼主的问题
 
啊,写法太乱了,用同一个ADOquery4关来开去的.这是错误一,有了if not ADOquery4.Eof then 却没有adoquery4.next,这是一个死循环.又是错误.唉,此问题不可解.
 
不明白,不过ADOquery有一个可以进行字段计算的事件,只要在事件里面写要计算的表达式就行。
 
if not ADOquery4.Eof then 楼主的意思应该是 if ADOquery4.recordcount<>0 吧
 
嘿嘿,,,2楼所语极是,俺才学delphi不到一星期,从什么都不懂,慢慢摸索过来的。

正在改进,正在改进。
 
to 2 楼,
不会死循环的,那个是IF不是While
楼主这样写是有点问题,但不会致命的,只是觉得这样拼SQL十分怪异~~
 
不好用Quotedstr代替""""
看着都晕了..
 
看来学编程的首先要学好的是中文.
 
看了半天。樓主是不是想問的是:

新增時,如果編號已經存在,就是把新增的數量+數據庫裏的數量 = 新增的數量存儲在數據庫裏。

?????
 
TO Delphizhou

正是这个道理。
 
我新学的,还望日后多多指点。
 
//改写一个漂亮的
//库:mssql2000
//表:product_in 产品入库表 (sn,id,name,size,type,qty,totalqty)
//表单:填写一个产品的编码,名称,规格,型号,本条记录数量,总数(计算)
//对应控件: edt_id,edt_name,edt_size,edt_type,edt_qty,edt_totalqty
//要求将产品入库记录插入 product_in,并将此产品以前的入库总数,汇总到本记录
//其中sn字段是 自增1 integer类型

//
var sId:string;//产品编号
sName:string;
sSize:string;
sType:string;
dQty:double;
dTotalQty:double;//之前数量
begin
//从控件取数据
sId := trim(edt_id.text);//关键字段,用trim去掉前后空格
sName := edt_Name.text;
sSize := edt_Size.text;
sType := edt_Type.text;

try
dQty := strToFloat(edt_Qty.text);//如果不是数字,提示出错
except
application.messagebox('数量必须输入数字~','提示',mb_iconinformation);
edt_qty.text := '';
edt_qty.setfocus;//设置焦点,要求重新输入
exit; //提前结束,什么也不做
end;


//统计以前的入库数量
AQry.Close;
AQry.SQL.Clear;
AQry.SQL.Text:='select * from product_in where product_id=:product_id ';
AQry.Parameters.ParamByName('product_id').Value:=edit1.Text;
AQry.Open;

//至少有一条
if not AQry.Eof then
begin
dTotalQty := AQry.fieldbyname('totalqty').asfloat;
end
else
begin
dTotalQty := 0; //以前没有这个产品
end;

dTotalQty := dTotalQty + dQty ;//和以前数量相加

//插入记录,其实你无论以前有没有都是插入了记录的
AQryNew.Close;
AQryNew.SQL.Clear;
AQryNew.SQL.Add('insert into product_in(id,name,size,type,qty,totalqty) ');
AQryNew.SQL.Add('values (:id,:name,:size,:type,:qty,:totalqty)');
AQryNew.parameters.paramByName('id').value := sId;
AQryNew.parameters.paramByName('name').value := sName;
AQryNew.parameters.paramByName('size').value := sSize;
AQryNew.parameters.paramByName('type').value := sType;
AQryNew.parameters.paramByName('qty').value := dQty;
AQryNew.parameters.paramByName('totalqty').value := dTotalQty;

try

AQryNew.ExecSQL;
except //可以用其他方式处理
application.messagebox('保存失败!','错误',mb_iconerror);
end;

end;

//这样写是不是很好理解呢?
//1.表,字段最好用 英文,好理解,上面的意思不用去猜了吧?
//2.参数最好用parameters 的形式,如果别人在edt_name.text 输入 ' or 1=1 ' 这样的字符,你的sql可能会出错
// 用参数可以避免,而不是用 字符串 互加的形式,难以理解
//3.控件最好有相关的名字
//4.取数据,最好用局部变量,一次性集中取,存也是,更加高级的做法是做一个类,然后做一个对象来存取
//5.取某数据,最好用primary key ,关键字,也就是一般说的Id类字段
//6.sn字段是自动增1,在insert into 一般不显式 插入
//7.每种控件都要有简明的前缀,一般是3个字符,去掉自动生成的i,e,a,o,u,元音字符,还有重复字符,比如
// 控件类
// Tedit -----> edt
// TADOQuery ----> aQry
// TLabel ----> lbl
// TButton ----->btn
//
//8.你这个是无论如何都要新增的情况,如果只是更新,可以用这种形式
if not aqry.eof then
begin
aqry.edit;//有就编辑
aqry.fieldbyname('totalqty').asfloat := dtotalQty;
end
else
begin
aqry.append;
aqry.fieldbyname('id').asfloat := sId;//一定要有id
aqry.fieldbyname('name').asfloat := sname;
... //其他字段
aqry.fieldbyname('totalqty').asfloat := dtotalQty;
end;

try
aqry.post;
except
end;

//最后提交
 
学了很多东西,谢谢楼上的
 
楼上的写的很 清楚啊
看来是个高手。
 
TO:bsense,非常受用,谢谢你!

不断学习中。
 
TO bsense 大婶:非常感谢您的指点,偶受用的很,让我用类似方法解决了不少难题,给偶上了非常生动的一课,在次送上万分感谢,还望请笑纳。
 
先求出之前所有rkcp_zs的總和,然後與Edit6.Text里的值相加即可.
var
frkcp_zs: Double;

...

frkcp_zs := 0;
ADOquery4.Close;
ADOquery4.SQL.Clear;
ADOquery4.SQL.Text:='select sum(rkcp_zs) from cprk where rkcp_name=:edit1 ';
ADOquery4.Parameters.ParamByName('edit1').Value:=edit1.Text;
ADOquery4.Open;
if not ADOquery4.Eof then frkcp_zs := AdoQuery4.Fields[0].AsFloat;
frkcp_zs := frkcp_zs + StrToFloat(edit6.Text);

ADOquery4.Close;
ADOquery4.SQL.Clear;
ADOquery4.SQL.Add('insert into cprk (rkcp_name,rkcp_gg,rkcp_xh,rkcp_bh,rkcp_mey,rkcp_sl) values
('''+edit1.Text+''','''+edit2.Text+''','''+edit3.Text+''','''+edit4.Text+''','''+edit5.Text+''','''+FloatToStr(frkcp_zs)+''') ');
ADOquery4.ExecSQL;
 
后退
顶部