两个问题(100分)

  • 主题发起人 主题发起人 fstao
  • 开始时间 开始时间
F

fstao

Unregistered / Unconfirmed
GUEST, unregistred user!
第一:
假如有一表a.db,字段no1为主索引:
a.db
no1 name
1 a
2 b
添加组件database1和table1,tabl1连接a.db,用dbgrid1显示数据,我在tabl1的AfterPost事件添加:
try
database1.applyupdates([table1]);
except
messagedlg(字段No1重复);
table1.cancelupdates;
abort;
end;
我这段程序只是防止字段No1数据重复,但是要防止字段Name的数据重复又如何做?我曾经这样做,在table1的
BeforePost事件添加:
with query1 do
begin
close;
sql.clear;
sql.add('select count(*) from a.db where name=:name');
parambyname('name').AsString:=table1name.value;
open;
end;
然后利用query1.fields[0].Asinteger>0来判断字段Name的数据是否重复,但有一个问题,当我把数据“b”
改为“b”时,按照我的方法,肯定会出现数据重复的提示,这显然是错误的。请教大家有何好的方法?

第二:
有一表a.db,字段为Name,数据为:
a.db
name
a
b
c
d
在Form1添加Table1和Table2组件,其中Table1连接a.db,用DBgrid1显示a.db的数据。在Form1里添加Edit1、
Edit2、Button1(作用是“+”)。我想这样实现:
当鼠标对着DBGrid1显示数据“a”连续双击,则Edit1显示“a”,Edit2显示“Table2a.value”。再单击Button1,则
Edit1显示“a+”,Edit2显示“Table2a.Value+”。如果鼠标连续双击数据“b”,则Edit1显示“a+b”,
Edit2显示“Table2a.value+Table2b.value”。请问如何实现?
 
1:我想你可以添加一个判断,看query得到的纪录的no1是不是当前的no1,
或者看query得到的纪录的序号是不是当前纪录序号。
 
问题一: 添加一个主关键字段,用自增加类型字段.
这样每个记录都有一个唯一的标识,不管你的记录如何相似,都可以通过
该字段区分开来.

问题二:该问题没有技术难点,就是麻烦,真想不通你怎么会想出这样的法子?
实现起来很简单,实在懒的写代码,请参见下面关于dbgird的系列问答:
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=153675
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=153244
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=152840
 
我再说一次关于第一个问题:
在字段No1和Name是人为输入数据,没有什么自增,只要在字段No1和Name里的所有数
据不能有重复就行。但我只解决了NO1,只要在No1设置主关键字,再利用异常处理就
可以避免字段NO1数据重复,但是字段Name又如何避免数据重复呢?比如,DBGrid1显
示数据:
no1 name
1 a
2 b
先table1.append,然后我在No1随便输入数字“7”,在Name随便输入“b”,然后
Post,我希望出现数据重复的提示,其实这个问题很容易解决,只要在table1的
Beforepost添加判断重复的代码就行。但问题在于:假如DBGrid1显示数据:
no1 name
1 a
2 b
我把字段Name的b改b时,正常情况下是没有数据重复,或者把b改为a时,正常情况下
是有数据重复,这两者如何解决?各位有何好的方法呢?
 
1:我想你可以添加一个判断,看query得到的纪录的no1是不是当前的no1,
或者看query得到的纪录的序号是不是当前纪录序号。
 
真对不起,多按了一个发送键,呵呵。
 
1. sql.add('select count(*) from a.db where name=:name and id<>:id');
parambyname('name').AsString:=table1name.value;
parambyname('id').AsInteger:=table1id.value;

2. hehe, 关键是处理dbgrid的单击和双击. cakk给的连接仔细看看.
 
是啊,可以直接在SQL中第一步就解决了,我怎么那么傻,还想
在查出来后再判断呢,呵呵。
//admire cytown
 
我明白你的意思.如果您能够保证no1不会重复,那么当你在BeforePost里面搜索
到一个存在的b的纪录时,判断该纪录的no1是否等于当前正在修改的纪录的no1
即可, 如相等,说明是同一条纪录,不重复. 如不等,说明有重复纪录.

其实DreameTiger他们说的也就是这个意思.
 
1. a unique index!
 
请各位多多讲解
 
CJ: 他的no1就相当于一个unique index了.
 
CAKK:一个表可以有N个唯一索引,但主键只有一个,看他的样子,NO为主键
那么加个唯一索引呀,在建索引时CHECK了UNIQUE就成
 
第一个问题多谢大家帮我解决了,至于第二个问题如何解决呢?CAKK给我的例子我已经
去看了,由于我进入教育网很难,得等好长时间才能进得了。希望大家能给出第二个
问题的例子给我,分数我照给。
 
这个问题本人已经解决了,本想问另一个问题,我现在想做一个打印工资条,不知用
什么报表控件可以做?谁能给我一个例子,要求在DBGrid1看见什么就打印什么。比如DBGrid1显示(f0、f1和f2为字段):
f0 f1 f2
0 a0 b0
1 a1 b1
则报表则打印(一定要有表格):
f0 f1 f2
0 a0 b0

f0 f1 f2
1 a1 b1

如果DBGrid1显示(f0和f1为字段):
f0 f1
0 a0
1 a1
则报表则打印(一定要有表格):
f0 f1
0 a0

f0 f1
1 a1
如何实现?
 
深度历险上有支持打印的dbgrid.

退一步说.自己写一个也不难.
 
我在编程时发现这样的问题:
有两个表,分别是a.db和b.db,其数据如下:
a.db(f0~f3是字段,全部是数字型)
f0 f1 f2 f3

b.db(name为字段,是字符型)
name
table1f0.value+table1f1.value+table1f2.value <-数据

在form1添加table1和table2组件,table1连接a.db,table2连接b.db。
我如果在表a.db的f0、f1和f2分别添加1、2和3,我想f3得到结果是6,我这样写(在BeforePost):
table1f3.value:=table1f0.value+table1f1.value+table1f2.value;
肯定会得到“6”。但是我想用参数来代替,我这样写:
table1f3.value:=strtofloat(table2name.value);
如果按照我上面写的语句“table1f3.value:=strtofloat(table2name.value);”,这样写
肯定会出错,请问如何修改这个语句呢?
 
呵呵, 这是要作通配符呀??? delphi不支持的.
如果一定要这样, 可以这么写:
table2name.asstring:='a1 +a2 +a3';
s:=table2name.asstring;
t:=0;
i:=pos(' ',s);
while i>0 do
begin
s:=copy(s,i+1,length(s));
if pos(' ',s)>0 then
f:=copy(s,2,pos(' ',s)-2)
else
f:=copy(s,2,length(s));
case copy(s,1,1) of
'+':t:=t+fieldbyname(f).value;
'-':t:=t-fieldbyname(f).value;
'x'...
'/'...
end;
i:=pos(' ',s);
end;
s:=table2name.asstring;
if pos(' ',s)>0 then
f:=copy(s,1,pos(' ',s)-1)
else
f:=copy(s,1,length(s));
t:=t+fieldbyname(f).value;

table1f3.value:=t;

 
cytown, 他问的好象不是这个问题.
他需要的是将b.db中的name字段的值作为数字赋给a.db中的f3字段.
其实很简单呀:
table1f3.asstring := table2name.asstring
或者
table1f3.asfloat := table2name.asfloat
或者
table1f3.asfloat := strtofloat(table2name.asstring)

为什么都喜欢用TField.Value??? value是个Variant型. 没搞清楚variant型
之间的关系最好不要用TField.Value. 指定数据类型进行赋值是个好习惯.
 
后退
顶部