关于报警功能的设定 ( 积分: 100 )

  • 主题发起人 主题发起人 lsssxs
  • 开始时间 开始时间
L

lsssxs

Unregistered / Unconfirmed
GUEST, unregistred user!
请指教:有啥好的方法还,感谢先!
问题点:现在从另外一个数据库取得了一个数字,显示在edit1里面,我要在这个edit在范围之内,否则报警;
说明:edit1取的了数据库表的数据,这个是另外的代码,自动取得的了,这个代码不要理了,是别人的dll自动取得的,这个dll会自动取数据到dbedit1显示;
dll同时把数据库表里面的2个字段也取了,放在dbedit2和dbedit3显示;
现在我要作的就是先要edit1比较dbedit2小 比dbedit3大 否则报警
我现在做的方法是先写一个函数,
function baojing(num:string):string;
begin
with DataModule5.baojing do
begin
Close;
SQL.Clear;
SQL.Add('select baojingID,故障名称,报警上限,报警下限,当前值 from baojing');
SQL.Add('where (当前值<=报警下限 and 报警下限<>0) or (当前值>=报警上限 and 报警上限<>0) order by baojingID');//比较查询显示出来
OPen;
next;
end;
end;
然后在edit的onChange事件下:

procedure TFrame9.Edit1Change(Sender: TObject);
begin//先写进去值进去函数,但是我有很多个edit的呀,80个edit呀,都要写这个代码,会累死,程序也会很大,
with DataModule5.baojing do
begin
Close;
SQL.Clear;
SQL.Add('select* from baojing');
OPen;
edit;
fieldbyname('当前值').AsString:=trim(edit1.Text);
post;
if (trim(edit1.Text)<trim(dbedit2.Text)) and (trim(edit1.Text)>trim(dbedit3.Text)) then//这里的比较如果写代码进去,就不需要了,我重复写一下在这里,是想不写edit的值进去数据库就比较,如果写进去了,上面的代码就比较了大小了
begin
baojing(trim(edit1.Text)); //执行函数
end;
end;

要兄弟们指教的是:
1.查询这个事件我写成函数了,可以在onchange下面调用这个函数,但是也要写执行函数的代码,也麻烦;还有好的方法吗?。
2.咋样作一个函数就可以把edit1的值写进去,80个edit的值只要如果改变了,就写进去,最好是简单一点,一句就好,或者设置一下就好,代码公用呢,嘻嘻嘻,咋样作
3.还有一种方法,就是数据库表里面我列表了1~80种故障信息,只要是如果edit的值和dbedit2,dbedit3比较以后满足报警,就找到相对应的报警信息,比如edit1对应数据库表里面的12号故障信息,比如edit55对应数据库表里面的15号信息,如果edit55比较后满足报警条件,就显示15号故障,这个方法最好,那位兄弟有好的方法,
4.还有一种,就是先建立故障列表,写进去80个故障信息,然后使用一个time定时增加edit的值进去字段里面,再使用一个time定期的进行数据库的轮询的比较过滤,把比较后的显示出来,但是这样就会使数据库频繁的查询,会不会对速度或者其他产生影响
在这里感谢大家先,同时先给大家拜个早年
 
procedure TFrame9.Timer1Timer(Sender: TObject);
begin//定期每2s向数据库写进去80个edit的值
with DataModule5.baojing do
begin
edit;//编辑状态
fieldbyname('当前值').AsString:=trim(edit1.Text); //要写在第edit1对应的那行
fieldbyname('当前值').AsString:=trim(edit3.Text); //要写在第edit3对应的那行
fieldbyname('当前值').AsString:=trim(edit24.Text); //要写在第edit24对应的那行,就是edit24对应数据库报警列表‘报警ID’字段的值为24 ,这里要咋样对应?可以不可以 fieldbyname('当前值').AsString('报警ID'=24):=trim(edit24.Text);这样的语法
post;
end;
end;


function baojing():string;
begin//建立一个函数,方便所有的edit的inchang事件调用
with DataModule5.baojing do
begin
Close;
SQL.Clear;
SQL.Add('select baojingID,故障名称,报警上限,报警下限,当前值 from baojing');
SQL.Add('where (当前值<=报警下限 and 报警下限<>0) or (当前值>=报警上限 and 报警上限<>0) order by baojingID');
OPen;
// next;
end;
end;


procedure TFrame9.Edit1Change(Sender: TObject);
begin
baojing(); //执行查找数据库的函数
end;

问题点:fieldbyname('当前值').AsString:=trim(edit24.Text); //要写在第edit24对应的那行,就是edit24对应数据库报警列表‘报警ID’字段的值为24 ,这里要咋样对应?可以不可以 fieldbyname('当前值').AsString('报警ID'=24):=trim(edit24.Text);这样的语法
我报警ID分别列表了80个(1~80) 然后我edit1对应数据库表里面字段‘报警ID’的值1
edit79对应数据库表里的 ‘报警ID’的值73;
就是:如果edit79里面改变,我就把edit79的text写到对应的‘报警ID’值为73的这行的‘当前值'字段里
 
Edit 有 Tag 的属性呀. 建立的时候把 Tag 赋值成对应的数据, 到时取出来用就可以了
所有的edit 是不是可以共用一段代码就可以了呢?
 
procedure TFrame9.Edit1Change(Sender: TObject);
begin
with DataModule5.baojing do
begin
Close;
SQL.Clear;
SQL.Add('select* from baojing');
OPen;
while not eof do
begin
edit;
IF DataModule5.baojing.FieldValues['baojingID']=4 then
BEGIN
fieldbyname('qty').AsString:=trim(edit1.Text);
END;
IF DataModule5.baojing.FieldValues['baojingID']=5 then
BEGIN
fieldbyname('qty').AsString:=trim(edit2.Text);
END;
IF DataModule5.baojing.FieldValues['baojingID']=6 then
BEGIN
fieldbyname('qty').AsString:=trim(edit3.Text);
END;
post;
NEXT;
END;
baojing(trim(edit1.Text)); //执行函数
end;
end;

这个方法有点笨,在数据库表里面加一个baojingID来过滤,写入之前先过滤这些东西,如果是80个,要写很多代码,有好的方法吗?
 
wzca:请详细一点,感谢先
 
procedure TFrame9.Timer1Timer(Sender: TObject);
begin//这里使用一个timer来定时过滤里面已经作判断的,需要报警的行
with DataModule5.baojingxs do
begin
Close;
SQL.Clear;
SQL.Add('select name,lowerlimit,upperlimit,qty from baojing');
SQL.Add('where (qty<=lowerlimit and lowerlimit<>0) or (qty>=upperlimit and upperlimit<>0)order by baojingID');//这里比较后过滤显示
OPen;
end;
end;

procedure TFrame9.Timer2Timer(Sender: TObject);
begin
with DataModule5.baojing do
begin
Close;
SQL.Clear;
SQL.Add('select name,lowerlimit,upperlimit,qty,ID from baojing');
OPen;
while not eof do//循环
begin
edit;
IF DataModule5.baojing.FieldValues['ID']=1 then
BEGIN//过滤判断数据库表里面的ID编号,对应写入edit的值
fieldbyname('qty').AsString:=trim(edit1.Text);
END;
IF DataModule5.baojing.FieldValues['ID']=2 then
BEGIN
fieldbyname('qty').AsString:= edit2.Text ;
END;
IF DataModule5.baojing.FieldValues['ID']=3 then
BEGIN
fieldbyname('qty').AsString:= edit3.Text ;
END;
IF DataModule5.baojing.FieldValues['ID']=4 then
BEGIN
fieldbyname('qty').AsString:= edit4.Text ;
END;
post;
NEXT;
END;

end;
end;
过滤判断的方法有点笨,大家有啥好方法,比如:可以不可以 fieldbyname('当前值').AsString('报警ID'=24):=trim(edit24.Text);这样的语法
直接就过滤找到对应的行?
总结一下:目前就使用这样笨的办法搞的,大家还有啥好办法,我先把这个办法共享给大家,但是不理想,希望厉害的高手提出更加好的方法,问题没有结束,请继续!!!!
 
procedure TFrame9.Timer1Timer(Sender: TObject);
begin//这里使用一个timer来定时过滤里面已经作判断的,需要报警的行
with DataModule5.baojingxs do
begin
Close;
SQL.Clear;
SQL.Add('select name,lowerlimit,upperlimit,qty from baojing');
SQL.Add('where (qty<=lowerlimit and lowerlimit<>0) or (qty>=upperlimit and upperlimit<>0)order by baojingID');//这里比较后过滤显示
OPen;
end;
end;
我要把过滤显示的这些数据添加到另外一个表里面,并且加上时间,作为报警历史,指教,
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
923
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部