书签无效,如何结决(100分)

  • 主题发起人 hmily1688
  • 开始时间
H

hmily1688

Unregistered / Unconfirmed
GUEST, unregistred user!
我用到了一adodataset1,其中的commandtext为 select * from charge_master ,有另外一个
adodataset2取出相应从表中的数据,我想更改adodataset1中的数据后定义一书签,然后
adodataset1.close ;
adodatset1.open ;
然后再回到书签的位。说书签无效。
保存按钮click事件
if not dm.AdoCn.InTransaction then dm.AdoCn.BeginTrans;
try
MBookMark := ADODataSet1.GetBookmark;
try
ADODataSet1.DisableControls;
ADODataSet2.DisableControls;
Dbgrid1.DisableAlign;
AdoDataSet1.Post;
ADODataSet1.GotoBookmark(MBookMark);
adodataset1.EnableControls;
adodataset2.EnableControls;
dbgrid1.EnableAlign;
//if MBookMark<>nil then ;
finally
ADODataSet1.FreeBookmark(MBookMark);
end;
except
dm.adocn.rollbacktrans;
end;
关键时有时有效有时无效,当修改一时间字段时无效。请问如何解决。
在adodataset1的afterpost事件中有
adodataset1.close ;
adodataset1.open;
请高手指点
 
Bookmark是一个指向dataset中数据记录缓存中的一条记录的指针
dataset关闭后,相应的缓存就释放了
bookmark当然就不能准确标识记录了

还是记录下关键字段的值,用locate定位到哪里吧
 
ADODataSet1.BookmarkValid(MBookMark)检查书签有效性
 
关键是我的主健在没有post前是不确定的(如果是新增的话,调用了库中的一个存储过程)
,可是为什么么有时不出错呢。请各位再想想别的方法。
我层级改写成下面的
AdoDataSet1.Post;
if adodataset1.bookmarkvalid(MBookMark) then ADODataSet1.GotoBookmark(MBookMark);
else adodataset1.last;
可是adodatset1.last不执行.5555~~~~~~~~~~~~~~~~~~~~~`[:(!]

 
错在存储过程贴出来看看
 
存储过程为
CREATE PROCEDURE Return_MAX_ID(@DATE smalldatetime,@MAX_ID varchar(12)
output) AS
DECLARE @Year INTEGER;
DECLARE @Month INTEGER;
DECLARE @Day INTEGER;
DECLARE @MAX_RECORD_CODE numeric;
BEGIN
SELECT @Year=YEAR(@DATE);
SELECT @Month=MONTH(@DATE);
SELECT @Day=DAY(@DATE);
if (SELECT Count(*) as zs FROM MAX_REC_ID_TABLE where
Year(REC_DATE)=@Year and MONTH(REC_DATE)=@Month and
Day(REC_DATE)=@Day)>0
begin
/*如果有当天记录*/
SELECT @MAX_RECORD_CODE= cast(max(MAX_REC) as numeric) from
MAX_REC_ID_TABLE where
Year(REC_DATE)=@Year and MONTH(REC_DATE)=@Month and
Day(REC_DATE)=@Day;
if (isnull(@MAX_RECORD_CODE,0)=0)
begin
Select @MAX_ID=cast(@Year as char(4))+REPLICATE('0',2-len(cast(@Month as
char(2))))+RTrim(cast(@Month as
char(2)))+replicate('0',2-len(cast(@Day as char(2))))+RTrim(cast(@Day
as char(2)))+'0001';
insert into MAX_REC_ID_TABLE(REC_DATE,MAX_REC) values(@DATE, @MAX_ID);
end
else
begin
Select @Max_ID=cast((@MAX_RECORD_CODE+1) as char(12));
Select @Max_ID=SubString(@Max_ID,1,8)+'0'+SubString(@Max_ID,10,3);
Update MAX_REC_ID_TABLE set MAX_REC=@MAX_ID where
Year(REC_DATE)=@Year and MONTH(REC_DATE)=@Month and
Day(REC_DATE)=@Day;
end
end
else
/*如果当天无数据时*/
begin
Select @MAX_ID=cast(@Year as char(4))+REPLICATE('0',2-len(cast(@Month as char(2))))+RTrim(cast(@Month as char(2)))+replicate('0',2-len(cast(@Day as char(2))))+RTrim(cast(@Day
as char(2)))+'0001';
insert into MAX_REC_ID_TABLE(REC_DATE,MAX_REC) values(@DATE,
@MAX_ID);
end
END GO
这个存储过程是在表的一个触发哭中调用的,就是在afterpost后令rec_id=@max_id;
如果解决了再加100分
 
自己解决,是修改后改了一个时间字段,close再open后,sql语句查不出原来的哪一条,就
说书签无效.[:D]
 
多人接受答案了。
 
顶部