Q&A

  • DB Table 에서 소트 & 검색(Seek) ?
묻고답하기 아주 유용한(좋은) 곳이네요.

데이타베이스를 DBGrid1 에 나열해 놓고 경우에 따라 정렬 하고 싶은데,

{ DBGrid1 의 컬럼헤드 클릭 할 때 컬럼헤드 필드 기준으로 정렬 }

Query1 에서는 다음과 같이 하면,

정렬 Query1.SQL.text := 'Select * From DB1.dbf Order By Field1';

검색 ..... Where Field1 >100 and Field2 like 서울';

이런 식으로 하면 Field1 기준으로 정렬 및 검색이 되는데,

한가지 문제는 Order 되면 edit 상태가 안되는군요.

그런데,

Table1 에서는 어떻게 하는지 알고 싶습니다.

데이타베이스 는 정렬, 검색 이런것은 기본이 아닐까 싶은데...

그리고 제가 초보이므로 답변을 쉽고 상세하게 해 주시면 고맙겠습니다.



2  COMMENTS
  • Profile
    임형호 1999.11.28 23:15
    김석수 wrote:

    > 묻고답하기 아주 유용한(좋은) 곳이네요.

    > 데이타베이스를 DBGrid1 에 나열해 놓고 경우에 따라 정렬 하고 싶은데,

    > { DBGrid1 의 컬럼헤드 클릭 할 때 컬럼헤드 필드 기준으로 정렬 }

    > Query1 에서는 다음과 같이 하면,

    > 정렬 Query1.SQL.text := 'Select * From DB1.dbf Order By Field1';

    > 검색 ..... Where Field1 >100 and Field2 like 서울';

    > 이런 식으로 하면 Field1 기준으로 정렬 및 검색이 되는데,

    > 한가지 문제는 Order 되면 edit 상태가 안되는군요.

    > 그런데,

    > Table1 에서는 어떻게 하는지 알고 싶습니다.

    > 데이타베이스 는 정렬, 검색 이런것은 기본이 아닐까 싶은데...

    > 그리고 제가 초보이므로 답변을 쉽고 상세하게 해 주시면 고맙겠습니다.

    >

    Table컴포넌트를 사용할때에는 DB구성시 프라이머리키나 세컨더리인덱스를 설정하지 않으면 정렬을 할 수 가 없는것 같습니다.(다른방법이 있으시면 이글을 보시는분께서 알려주세요)

    프라이머리키나 세컨더리인덱스를 설정은 데이타베이스데스크탑에서 하시면 되구요.

    Table의 indexfieldnames이나 indexname 속성에서 정렬할 필드를 설정하시면 됩니다. 물론 프로그램실행시에도 코딩으로 작성하여 바꿀수 있습니다.



    그리고 Table에서 검색은 몇가지가 있습니다.

    일반적으로 FindKey, FindNearest, GotoKey, GotoNearest, Locate, Filter가 있는것 같습니다.

    먼저 FindKey, FindNearest, GotoKey, GotoNearest는 SetKey라는 명령어를 같이 사용하여야 하며 검색할 필드가 프라이머리키로 설정이 되어있는 필드일경우에는 상관이 없지만 세컨더리인덱스로 설정이 되어있는키라면 FindKey, FindNearest, GotoKey, GotoNearest 명령을 사용하기전에 Indexfieldnames나 indexname으로 검색할 필드를 인덱스명으로 지정해야합니다. 즉 위의 4개의 명령어는 검색할 필드가 프라이머리키나 세컨더리인덱스로 설정이 되어있어야합니다. 그리고 FindKey, GotoKey는 정확한 값을 입력해야하지만 FindNearest, GotoNearest는 정확한 값이 없는경우 근사치의 값을 찾아갑니다.

    만약 검색할 필드가 프라이머리키나 세컨더리인덱스로 설정이 안되어있는경우의 검색이라면 Locate명령어를 사용합니다. 이것은 어떤 필드든지 값을 검색하여 줍니다.

    그리고 Filter는 설정한 조건에 따라 해당되는 값만을 출력합니다. 즉 FindKey..등 위에서 사용한 검색방법의 결과는 해당레코드로 위치를 옮겨주는것에 반해(DBGrid 연결시에 보면 좌측의 화살표가 결과 레코드위치로 옮겨진다.즉 현재 연결된 DB의 모든레코드는 출력된다.)

    Filter는 해당되는 값만을 걸러내어 출력합니다. 조건에 와일드문자(*)를 줄수도 있습니다. 그러나 조건뒤에만 사용할 수 있는것 같더군요.



    위명령어의 사용법은 델파이 도움말이나 책에는 자주언급이 되는 사항이라서 이곳에 적지는 않았습니다.

    상황에 따라 알맞은것을 사용하면 되지만....

    자료가 많을때에는 당연히 인덱스를 사용하여 검색하는것이 빠르다는것은 아실테죠.

    물어보신 내용이 생각보다 기입하기는 많아서 간략히 적었습니다. 도움이 되실지 모르겠네요.

    세부적으로 더 궁금하신것이 있으시면 다시 글을 남겨주세요. 잘 아는것은 아니지만 도움을 주고싶군요. 그럼 이만.....

  • Profile
    안재현 1999.11.29 22:01
    임형호 wrote:

    > 김석수 wrote:

    > > 묻고답하기 아주 유용한(좋은) 곳이네요.

    > > 데이타베이스를 DBGrid1 에 나열해 놓고 경우에 따라 정렬 하고 싶은데,

    > > { DBGrid1 의 컬럼헤드 클릭 할 때 컬럼헤드 필드 기준으로 정렬 }

    > > Query1 에서는 다음과 같이 하면,

    > > 정렬 Query1.SQL.text := 'Select * From DB1.dbf Order By Field1';

    > > 검색 ..... Where Field1 >100 and Field2 like 서울';

    > > 이런 식으로 하면 Field1 기준으로 정렬 및 검색이 되는데,

    > > 한가지 문제는 Order 되면 edit 상태가 안되는군요.

    > > 그런데,

    > > Table1 에서는 어떻게 하는지 알고 싶습니다.

    > > 데이타베이스 는 정렬, 검색 이런것은 기본이 아닐까 싶은데...

    > > 그리고 제가 초보이므로 답변을 쉽고 상세하게 해 주시면 고맙겠습니다.

    > >

    > Table컴포넌트를 사용할때에는 DB구성시 프라이머리키나 세컨더리인덱스를 설정하지 않으면 정렬을 할 수 가 없는것 같습니다.(다른방법이 있으시면 이글을 보시는분께서 알려주세요)

    > 프라이머리키나 세컨더리인덱스를 설정은 데이타베이스데스크탑에서 하시면 되구요.

    > Table의 indexfieldnames이나 indexname 속성에서 정렬할 필드를 설정하시면 됩니다. 물론 프로그램실행시에도 코딩으로 작성하여 바꿀수 있습니다.

    >

    > 그리고 Table에서 검색은 몇가지가 있습니다.

    > 일반적으로 FindKey, FindNearest, GotoKey, GotoNearest, Locate, Filter가 있는것 같습니다.

    > 먼저 FindKey, FindNearest, GotoKey, GotoNearest는 SetKey라는 명령어를 같이 사용하여야 하며 검색할 필드가 프라이머리키로 설정이 되어있는 필드일경우에는 상관이 없지만 세컨더리인덱스로 설정이 되어있는키라면 FindKey, FindNearest, GotoKey, GotoNearest 명령을 사용하기전에 Indexfieldnames나 indexname으로 검색할 필드를 인덱스명으로 지정해야합니다. 즉 위의 4개의 명령어는 검색할 필드가 프라이머리키나 세컨더리인덱스로 설정이 되어있어야합니다. 그리고 FindKey, GotoKey는 정확한 값을 입력해야하지만 FindNearest, GotoNearest는 정확한 값이 없는경우 근사치의 값을 찾아갑니다.

    > 만약 검색할 필드가 프라이머리키나 세컨더리인덱스로 설정이 안되어있는경우의 검색이라면 Locate명령어를 사용합니다. 이것은 어떤 필드든지 값을 검색하여 줍니다.

    > 그리고 Filter는 설정한 조건에 따라 해당되는 값만을 출력합니다. 즉 FindKey..등 위에서 사용한 검색방법의 결과는 해당레코드로 위치를 옮겨주는것에 반해(DBGrid 연결시에 보면 좌측의 화살표가 결과 레코드위치로 옮겨진다.즉 현재 연결된 DB의 모든레코드는 출력된다.)

    > Filter는 해당되는 값만을 걸러내어 출력합니다. 조건에 와일드문자(*)를 줄수도 있습니다. 그러나 조건뒤에만 사용할 수 있는것 같더군요.

    >

    > 위명령어의 사용법은 델파이 도움말이나 책에는 자주언급이 되는 사항이라서 이곳에 적지는 않았습니다.

    > 상황에 따라 알맞은것을 사용하면 되지만....

    > 자료가 많을때에는 당연히 인덱스를 사용하여 검색하는것이 빠르다는것은 아실테죠.

    > 물어보신 내용이 생각보다 기입하기는 많아서 간략히 적었습니다. 도움이 되실지 모르겠네요.

    > 세부적으로 더 궁금하신것이 있으시면 다시 글을 남겨주세요. 잘 아는것은 아니지만 도움을 주고싶군요. 그럼 이만.....



    Table componet 정렬을 바꾸실려면 IndexFieldNames 라는 프로퍼티를 사용하셔도 될 것같네요. 그런데 이건 오름차순 밖에 안됩니다. 사용법은 field1;field2 와 같이 여러 필드를 이용할 경우에는 (;) 으로 구분하셔야 합니다.



    그리고 검색은 아마 filter를 쓰면 원하시는 결과를 얻으실 수 있을것 같네요.