菜鸟问,怎样用"case","while...do","if...then "???(100分)

  • 主题发起人 主题发起人 yaminboy
  • 开始时间 开始时间
Y

yaminboy

Unregistered / Unconfirmed
GUEST, unregistred user!
第一问:取一字段query1.Fields[1].AsString='? '其值可能是1、2、3、4对应的分别是学生、
    工人、干部、其他,怎样用case去判断?
第二问:如下程序,循环结果是将满足人员(基本信息库)编码相同的记录,并要求年段数据(如:另一数据库1997年...2002年),
    添加到表中指定位置,该程序执行后基本能完成任务(较慢)。①怎样改进能快些?②在特殊情况下数据会不正确,比如基
    本信息库里的人多出另一数据库时。如继续使用应怎样改正?
while not query2.Eof do begin
year:=query2.Fields[1].Asinteger;
rybm:=query2.Fields[0].AsString;
if rybm=bm then begin
if year=year1 then begin
Cells[lin,3].Value:=query2.Fields[2].AsString;
year:=year+1;
end;
end;
query2.Next;
end;
第三问:为什么上问中的判断语句不能这样写:
      if rybm=bm and inttostr(year)=inttostr(year1) then begin
Cells[lin,3].Value:=query2.Fields[2].AsString;
year:=year+1;
end;
注:以上程序是在delphi6中调用access时实现的,“数据库”亦是access中的表。

   欢迎大虾踊跃参加!谢谢!
 
问题1
case query1.Fields[1].value of
1:语句1(学生);
2:语句2(工人);
3:语句3(干部);
4:语句4(其他);
end;
 
if rybm=bm and inttostr(year)=inttostr(year1) then begin
不可以的,应该写成:
if (rybm=bm) and (inttostr(year)=inttostr(year1)) then begin
因为and运算符的级别高于算术运算符(只在pascal是这样的。其他语言正好相反)
 
case是对有序数来霁的。
 
1.case只能是整型和美举型因此 query.field[1].asinteger;
2.查询时只查许1997的数据,这样可以减少循环的次数,如必须查出所有数据,可使用filter,以达到少次数的目的。2.2(请详细说明,基
    本信息库里的人多出另一数据库时,指的时什么意思)
3.可以,你的if语句写错了,改为:
      if (rybm=bm) and (inttostr(year)=inttostr(year1)) then
需要加括号
 
1、
case strtoint(query1.Fields[1].AsString) of
1:...
2:...
3:...
4:...
end;
 
靠!俺多此一举了!呵呵,没看答案,把分分给1楼的和2楼的吧
 
to 完颜康、晶晶:
  你们对第三问回答是正确的,我非常高兴接受你们的答案,给分誰都不会少,我们的讨论还没有结束。
比如一问能否给出我具体的写法;二问中所说的特殊情况下数据会不正确,是指:由基本数据库中的指定
人员去提取另一数据库中的历年数据写入一输出报表时,基本数据库中人员>另一数据库中的人员数据,
所出现的错误。
  谢谢大家的指导!
 
这样好象还是部队:
ryxz:=strtoint(query1.Fields[1].AsString);
case strtoint(query1.Fields[1].AsString) of
1: begin
sthkxz:=1;
Cells[8,5].Value :='学生';
end;
2: begin
sthkxz:=2;
Cells[9,5].Value :='工人';
end;
3: begin
sthkxz:=3;
Cells[10,5].Value :='干部';
end;
 
1.var
tag: integer;
begin
tag:=Query1.Fields[1].AsInteger;
case tag of
1: <your code>;
2: ...
end;

2. 优化:
if (rybm=bm) and (year=year1) then
begin
Cells[lin,3].Value:=query2.Fields[2].AsString;
inc(year);
end;

3.楼上的说过了。
 
如下表(最后字段1:学生,2:工人,3:干部):

    rybm name xb grsf
001  刘阳  男   1
    002   李村  男   2
    003   赵红  女   3
    004   于艳  女   2
    005   吕轩  男   1

我用case目的是当读出第条记录时将grsf=1,写入excel输出报表的相应位置

比如:
    --------------
    姓名| 刘阳 |姓别| 男   
    --------------  
        | 学生 | √ 
        |---------   
    个人身份| 工人 |
        |---------
        | 干部 |
    --------------
用if...then运行结束后,会从004开始在学生、工人、干部后都出现“√”

while not query1.Eof do begin
...........
...........
...........
grsf:=query1.Fields[1].AsString;
if grsf='1' then
Cells[8,5].Value :='√';

if grsf='2' then
Cells[9,5].Value :='√';

if grsf='3' then
Cells[10,5].Value :='√';

query1.next;
end;

用case亦是如上错误
intgrsf:=strtoint(query1.Fields[1].AsString);
 case strtoint(query1.Fields[1].AsString) of
1: if intgrsf=1 then
Cells[8,5].Value :='√';
2: if intgrsf=2 then
Cells[9,5].Value :='√';
3: if intgrsf=3 then
Cells[10,5].Value :='√';
end;

请各位大虾,指点迷津。



 
多人接受答案了。
 

Similar threads

后退
顶部