数码控科技猎奇Iphone动漫星座游戏电竞lolcosplay王者荣耀攻略allcnewsBLOGNEWSBLOGASKBLOGBLOGZSK全部技术问答问答技术问答it问答代码软件新闻开发博客电脑/网络手机/数码笔记本电脑互联网操作系统软件硬件编程开发360产品资源分享电脑知识文档中心IT全部全部分类全部分类技术牛文全部分类教程最新网页制作cms教程平面设计媒体动画操作系统网站运营网络安全服务器教程数据库工具网络安全软件教学vbscript正则表达式javascript批处理更多»编程更新教程更新游戏更新allitnewsJava新闻网络医疗信息化安全创业站长电商科技访谈域名会议专栏创业动态融资创投创业学院 / 产品经理创业公司人物访谈营销开发数据库服务器系统虚拟化云计算嵌入式移动开发作业作业1常见软件all电脑网络手机数码生活游戏体育运动明星影音休闲爱好文化艺术社会民生教育科学医疗健康金融管理情感社交地区其他电脑互联网软件硬件编程开发360相关产品手机平板其他电子产品摄影器材360硬件通讯智能设备购物时尚生活常识美容塑身服装服饰出行旅游交通汽车购房置业家居装修美食烹饪单机电脑游戏网页游戏电视游戏桌游棋牌游戏手机游戏小游戏掌机游戏客户端游戏集体游戏其他游戏体育赛事篮球足球其他运动球类运动赛车健身运动运动用品影视娱乐人物音乐动漫摄影摄像收藏宠物幽默搞笑起名花鸟鱼虫茶艺彩票星座占卜书画美术舞蹈小说图书器乐声乐小品相声戏剧戏曲手工艺品历史话题时事政治就业职场军事国防节日风俗法律法规宗教礼仪礼节自然灾害360维权社会人物升学入学人文社科外语资格考试公务员留学出国家庭教育学习方法语文物理生物工程学农业数学化学健康知识心理健康孕育早教内科外科妇产科儿科皮肤科五官科男科整形中医药品传染科其他疾病医院两性肿瘤科创业投资企业管理财务税务银行股票金融理财基金债券保险贸易商务文书国民经济爱情婚姻家庭烦恼北京上海重庆天津黑龙江吉林辽宁河北内蒙古山西陕西宁夏甘肃青海新疆西藏四川贵州云南河南湖北湖南山东江苏浙江安徽江西福建广东广西海南香港澳门台湾海外地区

如何动态指定自动计算字段-CSDN论坛

来源:互联网  责任编辑:小易  时间:2018/2/1 15:57:23
本网有用户碰到这样的问题:如何动态指定自动计算字段-CSDN论坛,具体问题如下:

本网根据需求用户需求,为用户寻得以下其他网友提供的解决方法,方法仅供参考,具体如下:

解决方案1:

使用ADOTable,ADOQuery均可。

解决方案2:

使用最笨的办法可以实现,是这样吗?
当然可以使用遍历取得abc的表名。

procedure TForm5.ADOQuery1CalcFields(DataSet: TDataSet);
begin
 ADOQuery1['c'] := ADOQuery1['a'] + ADOQuery1['b'] ;
end;

procedure TForm5.Button1Click(Sender: TObject);
var
  newfield: tintegerfield;
begin
  ADOQuery1.Close;

  newfield := Tintegerfield.create(ADOQuery1);
  newfield.fieldname := 'a';
  newfield.FieldKind:=fkData;
  newfield.DataSet:=ADOQuery1;

  newfield := Tintegerfield.create(ADOQuery1);
  newfield.fieldname := 'b';
  newfield.FieldKind:=fkData;
  newfield.DataSet:=ADOQuery1;

  newfield := Tintegerfield.create(ADOQuery1);
  newfield.fieldname := 'c';
  newfield.FieldKind:=fkCalculated;
  newfield.DataSet:=ADOQuery1;

  ADOQuery1.Open;
  DBGridEh1.DataSource := DataSource1;
end;

解决方案3:

1、动态创建表的字段

procedure TPreserveFrm.Button17Click(Sender: TObject);
var SQL,Err:string;
begin
  SQL:='ALTER TABLE 表名 D float';
// 以下是C/S代码 你只要执行SQL语句即可
  if Not DataModule1.SocketConnection1.AppServer.MyQuery(SQL,err)
    then MessageBox(self.handle,pchar('更新数据出错:'+err),'错误',MB_OK+MB_ICONERROR);
end;

2、通过数据集循环赋值
  with DBGrid1.DataSource.DataSet do
  begin
    First;
    While Not Eof do
    begin
      edit;
      FieldByName('C').AsFloat:=FieldByName('A').AsFloat+FieldByName('B').AsFloat;
      FieldByName('D').AsFloat:=FieldByName('A').AsFloat+FieldByName('B').AsFloat+FieldByName('C').AsFloat;
      Post;
      Next;
    end;
  end; 

解决方案4:

引用 3 楼 lyhoo163 的回复:
1、动态创建表的字段
procedure TPreserveFrm.Button17Click(Sender: TObject);
var SQL,Err:string;
begin
  SQL:='ALTER TABLE 表名 D float';
// 以下是C/S代码 你只要执行SQL语句即可
  if Not DataModule1.SocketConnection1.AppServer.MyQuery(SQL,err)
    then MessageBox(self.handle,pchar('更新数据出错:'+err),'错误',MB_OK+MB_ICONERROR);
end;

2、通过数据集循环赋值
  with DBGrid1.DataSource.DataSet do
  begin
    First;
    While Not Eof do
    begin
      edit;
      FieldByName('C').AsFloat:=FieldByName('A').AsFloat+FieldByName('B').AsFloat;
      FieldByName('D').AsFloat:=FieldByName('A').AsFloat+FieldByName('B').AsFloat+FieldByName('C').AsFloat;
      Post;
      Next;
    end;
  end; 

有点晕晕的,前辈误解了。我想使用fkCalculated字段,因为录入ab时,不想录入c,如果不使用fkCalculated字段,设置c为只读字段,会引起只读错误,设置fkCalculated字段后,在DBGridEH表中光标不会在fkCalculated字段上停留。你的例子如果设置c或d只读,就不能计算了,会提示只读错误。
我试过不使用fkCalculated字段,直接使用fkData字段,在OnColexit事件中累计,但是光标会在累计字段停留。设置表列只读,OnColexit事件中累计动作最后一个不计算,是因为没有离开col的动作判断,使用ONcolenter也不行。基本上我所有的事件都试过了,只有fkCalculated字段比较理想。
使用控件直接设置fkCalculated字段我会,使用代码一直搞不明白。就算上面我的例子里,也只能运行一次,再次刷新后,出现错误,可能是没有释放创建的控件,反正都不太理想。
我主要是用在评价应用中的。

解决方案5:

比如网上的这个案例,是肯定运行不起来的,不知道为什么:

procedure TForm1.FormCreate(Sender: TObject);
var
  NewField:TField;
  i:integer;
begin
//表中有两字段SName,Birth,现在我们动态生成一个计算字段Age,显示出年龄
  NewField:=TStringField.Create(ADOTable);
  //创建一个TStringField类型的字段
  ADOTable.Close;
  for i:=0 to ADOTable.Fields.Count-1 do
    ADOTable.Fields[0].Free;//释放所有的静态字段
  for i:=0 to ADOTable.FieldDefs.Count-1 do
    ADOTable.FieldDefs.Items[i].CreateField(ADOTable);
 //根据FieldDefs的字段信息动态的生成静态字段 
  NewField.Size:=5;
  NewField.FieldName:=Age;
  NewField.FieldKind:=fkCalculated;
 //设置这个这字段为计算字段
  NewField.DataSet:=ADOTable;
 //把这个字段加到ADOTable上
  ADOTable.Open;
end;

解决方案6:

上面网上的例子中,如果ADOTable.Close;
那么 ADOTable.Fields.Count能统计出字段的数量?反正我反复试了又试,肯定是0统计不出来的,难道是我设置的有问题?
表在关闭的情况下field.count,fieldscount等等,均不能统计出字段数量。
如果ADOTable.open;
那么显示的肯定是ADOtable的数据集,悖论啊,我彻底晕菜了

解决方案7:

Delphi数据库字段有三种类型:
1、fkData:表示字段取自一个数据库表格的物理字段。 
2、fkCalculated:表示字段是一个计算字段,值由数学计算而得。 
3、fkLookup:表示字段是一个查询字段,值来自于查询另外一个数据库表格。  
当一个字段是查询字段时,通过指定字段的KeyFields、LookUp,LookUpDataSet、LookUpKeyField、LookUpResultField特性的值,可以实现两个数据库表格的连接。

解决方案8:

fkCalculated字段,在DBGrid中,是不能编辑的。

解决方案9:

计算字段并不是表中的一个真正的字段,它是由一个表达式决定的字段。如:
select   A,B,C,A+C  from   table   where   A>0
A+C就是计算字段。

解决方案10:

1、
通过 Fields、FieldList、Field 可以得到更多信息, 但必须是在数据集打开的情况下;
通过 FieldDefs、FieldDefList、FieldDef 只能获取定义时的信息, 但即使在数据集关闭时也能使用.

不会是我的系统出问题了吧,以上在数据集关闭的情况下,均不能统计count,我晕死

2、

引用 9 楼 lyhoo163 的回复:
计算字段并不是表中的一个真正的字段,它是由一个表达式决定的字段。如:
select   A,B,C,A+C  from   table   where   A>0
A+C就是计算字段。

这个道理我明白,但是不使用fkCalculated设置计算字段,无法触发OnCalcfields事件,也就无法实时显示计算字段的结果。
如果使用select   A,B,A+B as C  from   table在Dbgrideh中显示,确实能达到使用fkCalculated设置C的效果,但是C永远不能被实时修改,只能最后直接提交数据表(假如数据表是A,B,C,C=A+B)

解决方案11:

不知道我是否表达清楚了,或者简单点说:
数据表中A,B,C三个字段,C=A+B。
我想用代码直接设置C为fkCalculated,然后在OnCalcfields事件中通过ADOquery['c']:=ADOquery['A']+ADOquery['B']实现实时显示,然后离开时判断数据是否被修改,修改就保存(我尝试了实施保存的方式,均不能实现)。
不想使用控件设置fkCalculated是因为必须要先连接数据库且激活才能增加和设置ADOquery1C的fieldkind属性,DBgrideh打开就显示默认的字段,很不舒服。

解决方案12:

好吧,我用最笨的办法实现了想要的功能,但总觉得不是很正规:

procedure TForm13.Button2Click(Sender: TObject);
begin
  ADOQuery1.Close;
  ADOQuery1.sql.Clear;
  ADOQuery1.sql.add('select a,b,c,d,e from test');
  ADOQuery1.Open;
end;

procedure TForm13.DBGridEh1ColEnter(Sender: TObject);
begin
  if DBGridEh1.SelectedField.Index = 4 then  
  begin
    if not ADOQuery1.Eof then
      ADOQuery1.Next
    else
      ADOQuery1.First;   //这个动作并不能回到初位,回头再琢磨吧
    DBGridEh1.Fields[2].FocusControl;
  end;
end;

procedure TForm13.DBGridEh1ColExit(Sender: TObject);
begin
  ADOQuery1.edit;
  DBGridEh1.Columns[4].Field.AsInteger := DBGridEh1.Columns[2].Field.AsInteger +
    DBGridEh1.Columns[3].Field.AsInteger;
  ADOQuery1.post;
end;

如果有其他的方法,请一定告诉我。

解决方案13:

计算字段是临时字段,它不能编辑的。
你的方法可行。

实际上,我的第一次回复的方法。建立一个长期字段C,再通过赋值C。就可以了。

解决方案14:

引用 13 楼 lyhoo163 的回复:
计算字段是临时字段,它不能编辑的。
你的方法可行。
实际上,我的第一次回复的方法。建立一个长期字段C,再通过赋值C。就可以了。


多谢,这种方式唯一一样不好就是,输入字段值后,如果不用回车用上下箭头或鼠标点击其他单元格时,不能实时更新累计字段,因为它不触发colexit事件,找了很久也没有合适的事件支持,判断key键值也不行,只能在退出时再判断一下了,如果是使用fkCalculated 就不会出现这样的问题。
系统基本完成,现在主要精力是用在了使用的便利性了,比如光标控制、回车控制、字段控制等等上,太耗费精力了。

再等等结贴,看看有没有使用代码完成fkCalculated的。

  • 本文相关:
  • 站长必读,如何真正写好一篇原创文章
  • 互联网之路细嗅蔷薇 资深站长分享掘金之道
  • 企业站的站长的工作重心究竟有哪些
  • 浅析:行业门户网站的一些盈利模式
  • 3000IP的企业网站每天订单不到30个的苦恼
  • 网站想内外兼修?先学习提高网站可用性的6大原则
  • 浅谈网页设计中的简约之美
  • 网页改版实战:日本设计师如何彻底优化旅游网站?
  • 网页改版实战!日本设计师如何彻底优化招聘网站?
  • 2015年值得关注的21个网页设计趋势
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved