动态指定数据序列号的问题(50分)

  • 主题发起人 主题发起人 菜菜
  • 开始时间 开始时间

菜菜

Unregistered / Unconfirmed
GUEST, unregistred user!
从甲表选取相应的数据插入到乙表中 然后再在乙表中动态的制定序列号
我地方法怎么不行?
用什么方法可以?
我的代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
zg.close;
zg.SQL.Clear;
zg.sql.add('insert into rsjb(rsjb_05,rsjb_04,rsjb_06,rsjb_07,rsjb_08,rsjb_02,rsjb_09,rsjb_11,rsjb_19,rsjb_20,rsjb_18,rsjb_10,rsjb_12,rsjb_13,rsjb_14,rsjb_15,rsjb_16)');
zg.sql.add('(select zgda_02,zgda_03,zgda_04,zgda_05,zgda_06,zgda_07,zgda_08,zgda_10,zgda_12,zgda_13,zgda_14,zgda_17,zgda_24,zgda_25,zgda_26,zgda_32,zgda_37 from zgda)');
zg.execsql;
zg.Close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
rsjb.close;
rsjb.Open;
rsjb.First;
while not rsjb.eof do
begin
if rsjb.FieldByName('rsjb_01').value= null then
begin
rsjb.edit;
rsjb.fieldbyname('rsjb_01').value:=edit1.text;
rsjb.post;
end;
if rsjb.fieldbyname('rsjb_03').value=null then
begin
rsjb.edit;
rsjb.fieldbyname('rsjb_03').value:=inttostr(rsjb.recno);
rsjb.post;
end;
rsjb.next;
end;
rsjb.close;
rsjb.Open;
end;

还有 我在用adoquery2.close;
adoquery2.sql.clear;
adoquery2.sql.add('select * from rsjb where rsjb_01 = null');
adoquery2.Open;
查找rsjb为空的字段 为什么没有返回数据 但是数据库里有这样的亚?
问题很简单 可我搞了两天都没有头绪 希望高手执教 不要K我呀[:D][:D]
 
怎么没有人会?[:(]帮一下小弟呀 是我没有说明白 还是[?]
在加50分好不好?[:)]
 
稍稍看了一下,好象没有什么问题

最后没有返回数据是因为判断一个字段是否为空应该用 is null而非 = null.
 
可是在进行数据的修改的时候 只有第一条数据被修改了 而且rsjb的值是-1 为什么?
真的就这样难吗?
 
这不是难吧, 应该是太简单了,那些高手们都懒得回答。

procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
begin
with rsjb do
begin
Close;
Open;
I := 1;
while not EOF do
begin
Edit;
if FieldByName('rsjb_01').AsString = '' then
FieldByName('rsjb_01').AsString := edit1.text;
if FieldByName('rsjb_03').AsInteger = 0 then
FieldByName('rsjb_03').AsInteger := I;
Next; //Auto Post here.
Inc(I);
end;
Post;
end;
end;
 
忘了说为什么了。
fieldbyname('rsjb_03').value返回是Variant值,就是说可能有两种情况,一是为NULL
一是为EMPTY,所以你要判断两种情况
V := FieldByName('rsjb_03').Value;
if VarIsNull(V) or VarIsEmpty(V) then
FieldByName('rsjb_03').Value :=
所以不如直接用FieldByName('rsjb_03').AsInteger来判断。
另外, RecNo并不是什么情况下都可以返回正确的值的,你可以看一下帮助
所以我用了一个局部变量I
最后一点就是,你这样写效率是非常低的!
因为不知你是什么数据库,如果是Oracle的话可以用伪列RowNum来实现,你上面写的
一大堆代码用两条SQL就搞定了:
update table rsjb set rsjb_03 = rownum;
update table rsjb set rsjb_01 = /*Edit1.Text*/ where rsjb_01 is null;
 
补充xianjun:
当fields.asstring = ' '时,写成if fieldbyname().asstring = '' then ...是判断不出来的,
所以加上去空格的函数:if trim(fieldbyname().asstring) = '' then ....
 
谢谢 接受答案了 我用的数据库是sql server2000
怎么样在给你多加分??
 
接受答案了.
 
后退
顶部