Q&A

  • Query로 삽입시 북마크이용..
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을 해서 북마크를 사용할 수 없어서 그런것 같은데

다른 방법은 없나요?

2  COMMENTS
  • Profile
    이재식 1999.10.08 22:00
    이양규 wrote:

    > 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 ;



    이렇게 하시면 새로운 데이터가 등록이 될 것이고

    다시 오픈하면 항상 방금 입력된 데이터에 커서가 가 있을 것입니다.

    물론 새로운 데이터는 제 위치에 등록될 것이고요.

    그럼, 도움이 되셨으면...

    그런데, 왠지 낯익은 이름인데요...







  • Profile
    김영대 1999.10.08 20:55
    이양규 wrote:

    > 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을 해서 북마크를 사용할 수 없어서 그런것 같은데

    > 다른 방법은 없나요?



    Query를 refresh 하거나 위 처럼 다른 용도로 사용하시게 되면

    당연히 bookmark의 포인터는 깨지게 됩니다

    bookmark는 물리적인 위치를 가지게 되므로 그것 보다는

    직접 검색하여 찾아가는 방법이 좋을듯 합니다

    데이터 세트(TTable, TQuery)의 검색시 많이 사용하는 함수가 Goto(),

    GotoNearest(), Find(), FindNearest(), Locate() 등이 있는데

    Locate()를 사용하시면 편리합니다