Q&A

  • 또 한가지 질문...삭제후 근처값으로 이동
화면에 특정자료가 DBGrid 에 나열되어있습니다...

만약 해당 자료가 총 1000개 중에

Query문(Query * from Code where .... order by number)을

이용해서 10개가 DBGrid 에 나열 되었다면....

나열된 자료는 번호 순서로 정리되어 있구요...

예를 들어 이중에 5번째 자료인 5번을 삭제하고

DBGrid 가 9개로 다시 정리가 될경우...

DBGrid 에 나열된 자료들 중

5번값보다 전자료 혹은 다음자료로 바로 이동시키고자 할경우...

어떻게 해야 합니까?



5  COMMENTS
  • Profile
    하얀까마귀 2000.04.20 19:07
    안녕하세요 하얀까마귀 입니다.



    어제는 비가 시원스럽게 와서 기분이 좋더니 오늘은 좀 찌부둥 하네요...



    날씨도 좀 우중충하고 어제 잠을 거의 못자서 지금 졸리고...



    우선 쿼리에서 읽은 자료는 원하시는대로 되지 않습니다...



    개발을 어떻게 하셧는지 모르겠지만... UpdateSQL을 사용하지 않으셧다면..



    삭제뒤에 쿼리를 다시 오픈해야 할테고.. 이렇때는 안되죠..



    삭제전에 키값을 저장했다가 이동시켜주는 방법밖에는 없을겁니다...



    그럼.. 즐거운시간 되세요.



    - 하얀까마귀 -





    상아 wrote:

    > 화면에 특정자료가 DBGrid 에 나열되어있습니다...

    > 만약 해당 자료가 총 1000개 중에

    > Query문(Query * from Code where .... order by number)을

    > 이용해서 10개가 DBGrid 에 나열 되었다면....

    > 나열된 자료는 번호 순서로 정리되어 있구요...

    > 예를 들어 이중에 5번째 자료인 5번을 삭제하고

    > DBGrid 가 9개로 다시 정리가 될경우...

    > DBGrid 에 나열된 자료들 중

    > 5번값보다 전자료 혹은 다음자료로 바로 이동시키고자 할경우...

    > 어떻게 해야 합니까?

    >

  • Profile
    상아 2000.04.22 18:56
    죄송합니다...

    그럼 삭제전 키값을 저장했다가 이동하는 방법은 어떻게 하면 될까요?

    예제로 들어 주셨으면.....

    근데...삭제전 키값이 삭제 되버려서 가장가까운 근처값으로 이동해야 할텐데...

    어떻게....

    도움 바랍니다...







    하얀까마귀 wrote:

    > 안녕하세요 하얀까마귀 입니다.

    >

    > 어제는 비가 시원스럽게 와서 기분이 좋더니 오늘은 좀 찌부둥 하네요...

    >

    > 날씨도 좀 우중충하고 어제 잠을 거의 못자서 지금 졸리고...

    >

    > 우선 쿼리에서 읽은 자료는 원하시는대로 되지 않습니다...

    >

    > 개발을 어떻게 하셧는지 모르겠지만... UpdateSQL을 사용하지 않으셧다면..

    >

    > 삭제뒤에 쿼리를 다시 오픈해야 할테고.. 이렇때는 안되죠..

    >

    > 삭제전에 키값을 저장했다가 이동시켜주는 방법밖에는 없을겁니다...

    >

    > 그럼.. 즐거운시간 되세요.

    >

    > - 하얀까마귀 -

    >

    >

    > 상아 wrote:

    > > 화면에 특정자료가 DBGrid 에 나열되어있습니다...

    > > 만약 해당 자료가 총 1000개 중에

    > > Query문(Query * from Code where .... order by number)을

    > > 이용해서 10개가 DBGrid 에 나열 되었다면....

    > > 나열된 자료는 번호 순서로 정리되어 있구요...

    > > 예를 들어 이중에 5번째 자료인 5번을 삭제하고

    > > DBGrid 가 9개로 다시 정리가 될경우...

    > > DBGrid 에 나열된 자료들 중

    > > 5번값보다 전자료 혹은 다음자료로 바로 이동시키고자 할경우...

    > > 어떻게 해야 합니까?

    > >

  • Profile
    상아 2000.04.21 22:46
    하얀 까마귀님...너무 감사합니다...

    너무 많은 도움이 되었습니다..

    특히나 인덱스에 대한 설명은 처음엔 뭐가 뭔지 잘 이해가 안됐는데...

    몇가지 테스트 해보니깐....이해가 되네요...

    자상한 설명에 몸둘봐를 모르겠습니다...

    다시한번 감사드리며 혹 나중에 질문이 있으면...

    도움 바랄께요...죄송합니다...

  • Profile
    하얀까마귀 2000.04.22 20:24
    안녕하세요 하얀까마귀 입니다...



    답변이 좀 늦었네요... 인덱스는 적다보니 글이 너무 길어져서.. (죄송) 읽기 좀 힘드



    셧죠??? 그래도 부끄러운 지식이 도움이 되셧다니.. 기쁘기 그지 없습니다.. ^^



    ====================================

    삭제후 근처값으로 이동...

    ====================================

    이건 좀 필요한 기능이죠.... 종종.....



    그리고 찾기 기능을 구현할때도 그렇고...



    그런데.. 속도가 좀... 문제가 되요... 저도 해봤는데.. 무척 속도가 떨어져서..



    좀 데이타가 많고 꼭 필요한 부분에만 넣었었죠....



    구현하는건 TTable인 경우에는 어렵지 않습니다..



    FindNearest(const KeyValues: array of const);



    를 이용하면 쉽게 되죠.. 이놈은 같은게 없으면 비슷한놈으로 가니까..



    대신 이놈은 선택된 인덱스내에서 움직이니까 조금 신경을 써 주어야 합니다..



    그러니까.. 여기에 키 필드의 선택이 없고 단지 키 값만 있는게.. 이놈이



    현재 테이블에서 선택된 인덱스 순으로 움직이고 이 값 또한 인덱스 필드 값을



    차례대로 넣어주어야 합니다....



    하지만 쿼리의 경우는 문제죠.... 인덱스가 아닌 order by로 순서를 지정하므로..



    이건 이런 함수가 없습니다... locate가 있긴 하지만 이건 같을때만 움직이죠..



    같은게 없으면 안됩니다...



    전 이걸 2가지로 구현을 했습니다...



    1. locate 함수 이용

    삭제하기 전에 다음 레코드의 키 값을 변수에 저장한뒤 locate함수를 쓰는거죠..



    그런대로 나쁘지 않는 속도가 나오긴 하지만.. 다음레코드로 이동을 조금 조심해서



    하셔야 합니다.. eof일때를 고려 하셔야 하고.. 쿼리 이므로 다른 사용자가 삭제 했을



    때도 있으니까.....( 이런경우는 좀 어렵죠 )



    2. 두번째는 무식한 방법인데 ( 전 이놈이 더 좋더라고요 )



    그냥 무식하게 삭제한놈의 키값을 변수에 저장하고



    다시 오픈한뒤에 그냥 처음부터 키값을 비교 하는거죠...



    DisableConstraints; <-- 요놈 아시죠???

    while not eof do

    begin

    if query1.FieldbyName('aaa').AsString > aaaValue then

    break;

    Query1.Next;

    end;

    EnableConstraints; <-- 요놈도 아시죠??





    DisableConstraints;

    EnableConstraints;

    // 보충설명 : 이놈은 써보시면 알겠지만.. disavleConstraints를 하시면



    이놈은 적용이 그리드 같은곳에 그 내용이 보이지 않습니다..



    쿼리의 경우나 next를 했을때 그리드에서도 같이 움직이게 되는데.. 이렇게 되면



    보기도 싫고 속도도 많이 떨어지게 되죠....



    그래서 Disable해주면.. 이놈은 내부적으로만 동작을 하죠....



    쿼리를 쓰실때 항상 이놈을 해주세요.. 그럼 수십%정도 빨리진 프로그램을 보실수



    있을겁니다....



    -----------------------

    키값의 저장은 그냥 삭제 버튼이 있으시면 여기서 변수에다가 넣어주시면 되구요..

    btn_DeleteClick1(sender : tobject)

    begin

    with query1 do

    begin

    DisableConstraints;

    aaaValue := query1.fieldbyname('aaa').AsString;

    Close;

    SQL.Clear;

    SQL.Add( delete from aTable );

    SQL.Add(' where aaa = :aaa ');

    ParamByName('aaa').AsString := aaaValue;

    ExecSQL;

    SQL.Clear;

    SQL.Add(' select * from aTable order by aaa ');

    OPEN;

    First;

    while not eof do

    begin

    if FieldByName('aaa').AsString > aaaValue then

    break;

    Next;

    end;

    EnableConstraints;

    end;

    end;



    /-->>> 위의 방식으로 하시면 되구요.. 음..... 이건 테스트한게 아니고



    그냥 타이핑 한거니까 오타나 에러가 있을수 있으니 루틴만 참고 하세요..



    그럼.. 도움이 되셧는지 모르겠네요..



    - 그럼 즐거운 시간 되세요



    - 하얀까마귀 -





    상아 wrote:

    > 하얀 까마귀님...너무 감사합니다...

    > 너무 많은 도움이 되었습니다..

    > 특히나 인덱스에 대한 설명은 처음엔 뭐가 뭔지 잘 이해가 안됐는데...

    > 몇가지 테스트 해보니깐....이해가 되네요...

    > 자상한 설명에 몸둘봐를 모르겠습니다...

    > 다시한번 감사드리며 혹 나중에 질문이 있으면...

    > 도움 바랄께요...죄송합니다...

  • Profile
    상아 2000.04.25 00:01
    삭제 관련 예도 많은 도움이 되었습니다..

    다시 한번 감사드립니다...

    좋은 일만 두루 생기길 바랍니다..