TQuery컴포넌트 하나로 db에 자료를 삽입한 후에
다시 select 하였을 때 방금전에 삽입된 자료를 가리키도록
하고싶은데 잘 안되네요...
var
bm : tbookmark;
begin
query1.close;
query1.sql.clear;
query1.sql.add('insert into db1 ... ');
query1.sql.execsql;
bm := query1.getbookmark;
query1.close;
query1.sql.clear;
query1.sql.add('select * from db1');
query1.open;
if query1.bookmarkvalid(bm) then
begin
query1.gotobookmark(bm);
query1.freebookmark(bm);
end;
이런식으로 코딩 했는데 bookmarkvalid(bm)에서 오류가 발생하면서
북마크가 이동을 하지 않네요...
query1.execsql을 해서 북마크를 사용할 수 없어서 그런것 같은데
다른 방법은 없나요?
> TQuery컴포넌트 하나로 db에 자료를 삽입한 후에
> 다시 select 하였을 때 방금전에 삽입된 자료를 가리키도록
> 하고싶은데 잘 안되네요...
>
> var
> bm : tbookmark;
> begin
> query1.close;
> query1.sql.clear;
> query1.sql.add('insert into db1 ... ');
> query1.sql.execsql;
>
> bm := query1.getbookmark;
>
> query1.close;
> query1.sql.clear;
> query1.sql.add('select * from db1');
> query1.open;
>
> if query1.bookmarkvalid(bm) then
> begin
> query1.gotobookmark(bm);
> query1.freebookmark(bm);
> end;
>
> 이런식으로 코딩 했는데 bookmarkvalid(bm)에서 오류가 발생하면서
> 북마크가 이동을 하지 않네요...
> query1.execsql을 해서 북마크를 사용할 수 없어서 그런것 같은데
> 다른 방법은 없나요?
이재식 Wrote :
안녕하세요?
저역시 북마크 기능을 좀 자주 쓰는 편입니다.
삽입시 중요한것은 데이터가 항상 맨끝에 들어간다는 보장은 없습니다.
데이터가 삽입되었다해도 테이블의 설계상 다시 소트가 되어서
적당한 위치를 찾아가겠죠.
즉, 사용자가 3번을 삽입했는데, 기존에는 1, 2, 5이렇게 데이터가
있을경우, 3의 위치가 1, 2, 5, 3이 된다면 문제없는데,
1, 2, 3, 5가 되어야 한다면 경우도 있는거죠.
그런데, 어떤 경우이든 삽입시에는 SQL를 쓰지말고
바로 매소드를 쓰면 문제가 해결됩니다.
즉, 삽입시에
Query1.Append ;
..
..
Query1.Post ;
를 했어도 항상 데이터는 맨끝에 들어가질 않습니다.
그것은 테이블이 갱신될때 데이터 display를 어떻게 해놓았냐에따라
새로운 데이터는 맨끝에 또는 중간에 들어갈 수 있죠.
어떤 경우이든 이렇게 하시면 되긴되는데, 과연 이양규님의
의도에 맞는지는 모르겠어요.
다만, 이런 방법도 있다는것을 알려드립니다.
var
save : TBookMark ;
begin
with Query1 do
begin
Append ;
Fieldbyname('sabun').asString := '222' ;
FieldByName('name').asString := 'ooo' ;
Post ;
Save := GetBookMark ;
end ;
with Query1 do
begin
Close ;
SQL.Clear;
SQL.Add('select *') ;
SQL.add('from test') ;
open ;
GotoBookMark(save) ;
FreeBookMark(Save) ;
end ;
이렇게 하시면 새로운 데이터가 등록이 될 것이고
다시 오픈하면 항상 방금 입력된 데이터에 커서가 가 있을 것입니다.
물론 새로운 데이터는 제 위치에 등록될 것이고요.
그럼, 도움이 되셨으면...
그런데, 왠지 낯익은 이름인데요...