Q&A

  • Query에서 조건부 다중 질의를 쉽게 하는 방법이 없나요?
델파이 초보자입니다.



다섯개의 에디트박스를 놓고 사용자가 선택하여 입력할 경우

입력한 내용에 대하여(사용자는 두개만 입력할 수 있음) 조건에 맞는것만

DBGrid에 출력하게 하고 싶습니다.



쉽고 좋은 방법이 있으면 고수님들께 부탁드립니다.



예))



성별:______ 부서:_______ 입사일:______ 출신지역:______ 나이:______



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

사번 성명 주민등록번호 주소 우편번호

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

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

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

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

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

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





부탁드립니다. 감사합니다.



3  COMMENTS
  • Profile
    유수 1999.08.13 04:57
    차례대로 Edit1, Edit2... 의 이름을 가지는 경우를 가정하겠습니다.



    각 필드는 문자형이며, 조건문은 = 을 사용하도록 하겠습니다.



    Addsql : String;



    Query1.Clear;

    Query1.Sql.Add('select * from TableName');



    if Edit1.Text <> '' then AddSql := AddSql + 'field1 = '+ Edit1.Text

    if Edit2.Text <> '' then

    begin

    if AddSql <> '' then AddSql := AddSql + ' And ';

    AddSql := AddSql + 'field2 = '+ Edit2.Text;

    end;

    if Edit3.Text <> '' then

    begin

    if AddSql <> '' then AddSql := AddSql + ' And ';

    AddSql := AddSql + 'field3 = '+ Edit3.Text;

    end;

    if Edit4.Text <> '' then

    begin

    if AddSql <> '' then AddSql := AddSql + ' And ';

    AddSql := AddSql + 'field4 = '+ Edit4.Text;

    end;

    if Edit5.Text <> '' then

    begin

    if AddSql <> '' then AddSql := AddSql + ' And ';

    AddSql := AddSql + 'field5 = '+ Edit5.Text;

    end;



    if AddSql <> '' then AddSql := ' where ' + AddSql;



    Query1.Sql.Add(AddSql);



    Query1.Open;



    보시다시피 단순노동작업으로 생각되는데, 다른 방법이 있을지도..



    게임방이라 테스트 못하고 올려 죄송합니다.



    이영배 께서 말씀하시기를...

    > 델파이 초보자입니다.

    >

    > 다섯개의 에디트박스를 놓고 사용자가 선택하여 입력할 경우

    > 입력한 내용에 대하여(사용자는 두개만 입력할 수 있음) 조건에 맞는것만

    > DBGrid에 출력하게 하고 싶습니다.

    >

    > 쉽고 좋은 방법이 있으면 고수님들께 부탁드립니다.

    >

    > 예))

    >

    > 성별:______ 부서:_______ 입사일:______ 출신지역:______ 나이:______

    >

    > -------------------------------------------------------------------------

    > 사번 성명 주민등록번호 주소 우편번호

    > -------------------------------------------------------------------------

    > - -- --------- - -------

    > - -- --------- - -------

    > - -- --------- - -------

    > - -- --------- - -------

    > - -- --------- - -------

    >

    >

    > 부탁드립니다. 감사합니다.

    >





  • Profile
    이영배 1999.08.13 23:35
    답을 주셔서 대단히 감사합니다.



    저의 질문에 정확히 맞는 훌륭한 로직인것 같습니다.



    그런데 에러 메시지가



    Invalid use of keyword

    Token: =변수

    Line Numver: 2.



    이렇게 뜨는데 아래줄 마지막의 Edit1.Text 에서의 오류인것 같은데요.

    if Edit1.Text <> '' then AddSql := AddSql + 'field1 = '+ Edit1.Text



    실제로 SQL문의 where절에 보면

    Query1.Sql.Add(' where field1 = "'+Edit1.Text+'" ');

    와 같이 사용하는데 본 로직에선 그냥 Edit1.Text를 대입하였는데 이상이 없는

    것인지요. field1은 문자형입니다.



    또하나 의심이 가는곳은 맨 마지막 라인의



    Query1.Sql.Add(AddSql);



    가 있는데 괄호열고 아무런 쿼테이션 없이 그냥 쓰는것인지요 ?

    Query1.Sql.Add('AddSql'); 이렇게 하고 쿼리를 날리면 where절이 먹질 않습니다.



    혹시 Query1.Sql.Add("'AddSql'"); 나 Query1.Sql.Add("AddSql"); 를 써 봤는데 안되더군요.



    다시한번 부탁드립니다.



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

    유수 께서 말씀하시기를...

    > 차례대로 Edit1, Edit2... 의 이름을 가지는 경우를 가정하겠습니다.

    >

    > 각 필드는 문자형이며, 조건문은 = 을 사용하도록 하겠습니다.

    >

    > Addsql : String;

    >

    > Query1.Clear;

    > Query1.Sql.Add('select * from TableName');

    >

    > if Edit1.Text <> '' then AddSql := AddSql + 'field1 = '+ Edit1.Text

    > if Edit2.Text <> '' then

    > begin

    > if AddSql <> '' then AddSql := AddSql + ' And ';

    > AddSql := AddSql + 'field2 = '+ Edit2.Text;

    > end;

    > if Edit3.Text <> '' then

    > begin

    > if AddSql <> '' then AddSql := AddSql + ' And ';

    > AddSql := AddSql + 'field3 = '+ Edit3.Text;

    > end;

    > if Edit4.Text <> '' then

    > begin

    > if AddSql <> '' then AddSql := AddSql + ' And ';

    > AddSql := AddSql + 'field4 = '+ Edit4.Text;

    > end;

    > if Edit5.Text <> '' then

    > begin

    > if AddSql <> '' then AddSql := AddSql + ' And ';

    > AddSql := AddSql + 'field5 = '+ Edit5.Text;

    > end;

    >

    > if AddSql <> '' then AddSql := ' where ' + AddSql;

    >

    > Query1.Sql.Add(AddSql);

    >

    > Query1.Open;

    >

    > 보시다시피 단순노동작업으로 생각되는데, 다른 방법이 있을지도..

    >

    > 게임방이라 테스트 못하고 올려 죄송합니다.

    >

    > 이영배 께서 말씀하시기를...

    > > 델파이 초보자입니다.

    > >

    > > 다섯개의 에디트박스를 놓고 사용자가 선택하여 입력할 경우

    > > 입력한 내용에 대하여(사용자는 두개만 입력할 수 있음) 조건에 맞는것만

    > > DBGrid에 출력하게 하고 싶습니다.

    > >

    > > 쉽고 좋은 방법이 있으면 고수님들께 부탁드립니다.

    > >

    > > 예))

    > >

    > > 성별:______ 부서:_______ 입사일:______ 출신지역:______ 나이:______

    > >

    > > -------------------------------------------------------------------------

    > > 사번 성명 주민등록번호 주소 우편번호

    > > -------------------------------------------------------------------------

    > > - -- --------- - -------

    > > - -- --------- - -------

    > > - -- --------- - -------

    > > - -- --------- - -------

    > > - -- --------- - -------

    > >

    > >

    > > 부탁드립니다. 감사합니다.

    > >

    >

    >





  • Profile
    유수 1999.08.14 06:17
    안녕하세요.

    참고만 하시라고, 떠오르는데로 쓴 코드라, 죄송하게 되었네요.



    > 이렇게 뜨는데 아래줄 마지막의 Edit1.Text 에서의 오류인것 같은데요.

    > if Edit1.Text <> '' then AddSql := AddSql + 'field1 = '+ Edit1.Text



    if Edit1.Text <> '' then AddSql := AddSql + 'field1 = '''+ Edit1.Text+'''' 로 고쳐 주시면 됩니다.



    그리고, where 은, 만약 한개이상의 검색어가 있을때만, 붙도록

    검색어를 조합한 후에 앞에 Addsql앞에 붙여 주도록 하였습니다.

    그리고, Query1.Sql.Add(AddSql)은 쿼테이션이 필요가 없고 들어가면

    안됩니다.

    AddSql은 문자열 변수인지라 그안의 내용(즉, 완성된 검색문장)이

    추가됩니다. 그 안의 내용은 'where field1='홍길동''등으로 되어 있겠죠!

    문자형 필드를 비교할때는 검색어 앞뒤에

    퀘테이션이 붙어야 하므로 위의 if문에서 보듯이

    ''''을 붙여 주는데, 파스칼에서는 '를 나타내기 위해 연속 두개의 ',즉 ''로 나타납니다.

    그러니 ''''는 ' 더해준다는 의미가 됩니다.

    ~~

    그 앞의 '''가 세개 연속 오는 것도 문장 제일 앞에 '가 한개 더 있다는

    것을 생각하시면 쉽게 이해가 되실것입니다.

    자세한 설명이 더해 드리고 싶은데, 상황이 여의치 않네요. 죄송해여..

    어쨌든, 수정된 코드를 적어 보겠습니다.(역시 겜방에 있어서 확인을

    못하고 올립니다.)



    Addsql : String;



    Query1.Sql.Clear;

    Query1.Sql.Add('select * from TableName');



    if Edit1.Text <> '' then AddSql := AddSql + 'field1 = '''+ Edit1.Text + +'''';

    if Edit2.Text <> '' then

    begin

    if AddSql <> '' then AddSql := AddSql + ' And ';

    AddSql := AddSql + 'field2 = '''+ Edit2.Text+'''';

    end;

    if Edit3.Text <> '' then

    begin

    if AddSql <> '' then AddSql := AddSql + ' And ';

    AddSql := AddSql + 'field3 = '''+ Edit3.Text+'''';

    end;

    if Edit4.Text <> '' then

    begin

    if AddSql <> '' then AddSql := AddSql + ' And ';

    AddSql := AddSql + 'field4 = '''+ Edit4.Text+'''';

    end;

    if Edit5.Text <> '' then

    begin

    if AddSql <> '' then AddSql := AddSql + ' And ';

    AddSql := AddSql + 'field5 = '''+ Edit5.Text+'''';

    end;



    // 검색어가 한개 이상일때만, 쿼리에 더해 준다.

    if AddSql <> '' then

    begin

    AddSql := ' where ' + AddSql; // 앞에 where 붙여 준다.

    Query1.Sql.Add(AddSql);

    end;

    Query1.Open;





    이영배 께서 말씀하시기를...

    > 답을 주셔서 대단히 감사합니다.

    >

    > 저의 질문에 정확히 맞는 훌륭한 로직인것 같습니다.

    >

    > 그런데 에러 메시지가

    >

    > Invalid use of keyword

    > Token: =변수

    > Line Numver: 2.

    >

    > 이렇게 뜨는데 아래줄 마지막의 Edit1.Text 에서의 오류인것 같은데요.

    > if Edit1.Text <> '' then AddSql := AddSql + 'field1 = '+ Edit1.Text

    >

    > 실제로 SQL문의 where절에 보면

    > Query1.Sql.Add(' where field1 = "'+Edit1.Text+'" ');

    > 와 같이 사용하는데 본 로직에선 그냥 Edit1.Text를 대입하였는데 이상이 없는

    > 것인지요. field1은 문자형입니다.

    >

    > 또하나 의심이 가는곳은 맨 마지막 라인의

    >

    > Query1.Sql.Add(AddSql);

    >

    > 가 있는데 괄호열고 아무런 쿼테이션 없이 그냥 쓰는것인지요 ?

    > Query1.Sql.Add('AddSql'); 이렇게 하고 쿼리를 날리면 where절이 먹질 않습니다.

    >

    > 혹시 Query1.Sql.Add("'AddSql'"); 나 Query1.Sql.Add("AddSql"); 를 써 봤는데 안되더군요.

    >

    > 다시한번 부탁드립니다.

    >

    > =========================================================================

    > 유수 께서 말씀하시기를...

    > > 차례대로 Edit1, Edit2... 의 이름을 가지는 경우를 가정하겠습니다.

    > >

    > > 각 필드는 문자형이며, 조건문은 = 을 사용하도록 하겠습니다.

    > >

    > > Addsql : String;

    > >

    > > Query1.Clear;

    > > Query1.Sql.Add('select * from TableName');

    > >

    > > if Edit1.Text <> '' then AddSql := AddSql + 'field1 = '+ Edit1.Text

    > > if Edit2.Text <> '' then

    > > begin

    > > if AddSql <> '' then AddSql := AddSql + ' And ';

    > > AddSql := AddSql + 'field2 = '+ Edit2.Text;

    > > end;

    > > if Edit3.Text <> '' then

    > > begin

    > > if AddSql <> '' then AddSql := AddSql + ' And ';

    > > AddSql := AddSql + 'field3 = '+ Edit3.Text;

    > > end;

    > > if Edit4.Text <> '' then

    > > begin

    > > if AddSql <> '' then AddSql := AddSql + ' And ';

    > > AddSql := AddSql + 'field4 = '+ Edit4.Text;

    > > end;

    > > if Edit5.Text <> '' then

    > > begin

    > > if AddSql <> '' then AddSql := AddSql + ' And ';

    > > AddSql := AddSql + 'field5 = '+ Edit5.Text;

    > > end;

    > >

    > > if AddSql <> '' then AddSql := ' where ' + AddSql;

    > >

    > > Query1.Sql.Add(AddSql);

    > >

    > > Query1.Open;

    > >

    > > 보시다시피 단순노동작업으로 생각되는데, 다른 방법이 있을지도..

    > >

    > > 게임방이라 테스트 못하고 올려 죄송합니다.

    > >

    > > 이영배 께서 말씀하시기를...

    > > > 델파이 초보자입니다.

    > > >

    > > > 다섯개의 에디트박스를 놓고 사용자가 선택하여 입력할 경우

    > > > 입력한 내용에 대하여(사용자는 두개만 입력할 수 있음) 조건에 맞는것만

    > > > DBGrid에 출력하게 하고 싶습니다.

    > > >

    > > > 쉽고 좋은 방법이 있으면 고수님들께 부탁드립니다.

    > > >

    > > > 예))

    > > >

    > > > 성별:______ 부서:_______ 입사일:______ 출신지역:______ 나이:______

    > > >

    > > > -------------------------------------------------------------------------

    > > > 사번 성명 주민등록번호 주소 우편번호

    > > > -------------------------------------------------------------------------

    > > > - -- --------- - -------

    > > > - -- --------- - -------

    > > > - -- --------- - -------

    > > > - -- --------- - -------

    > > > - -- --------- - -------

    > > >

    > > >

    > > > 부탁드립니다. 감사합니다.

    > > >

    > >

    > >

    >

    >





    • 이영배
    • 1999.08.13 03:28
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 04:57
      차례대로 Edit1, Edit2... 의 이름을 가지는 경우를 가정하겠습니다. 각 필드는 문자형이며, 조건문...
    • 이영배
      1999.08.13 23:35
      답을 주셔서 대단히 감사합니다. 저의 질문에 정확히 맞는 훌륭한 로직인것 같습니다. 그런데 에러 ...
    • 유수
      1999.08.14 06:17
      안녕하세요. 참고만 하시라고, 떠오르는데로 쓴 코드라, 죄송하게 되었네요. > 이렇게 뜨는데 아래줄...
    • 이현철
    • 1999.08.13 03:12
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 03:22
      다음의 함수를 참조해 주세요. function ReplaceStr(const S, Srch, Replace: string): string; va...
    • 1999.08.13 03:21
      이현철 께서 말씀하시기를... > 안녕하세요. > 메모의 내용을 문자열 변수에 넣었어요. > 문자열 변수에...
    • 김용철
    • 1999.08.13 03:11
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 04:31
      데이타 베이스 화일을 여는 데 걸리는 시간은 일정하지 않은 것으로 알고 있습니다. 데이타의 양이...
    • 김용철
      1999.08.13 04:53
      감사합니다. 지금 유수님께서 설명해 주신 방법으로 프로그램이 작성되어 있습니다. 그런데 프로그래스...
    • 이현신
    • 1999.08.13 03:09
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조복기
      1999.08.14 08:09
      안녕하세요..조복기입니다.. 흠..막상 하는일은 학습용 겜을 만들고있는데 아는게 넘 부족해서 제...
    • 댕이
    • 1999.08.13 03:06
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 조복기
      1999.08.13 03:22
      안녕하세요..조복기입니다.. 저도 몰랐었는데 몇일전에 저희 거래처 서버에 들어갈려고 하니까 되...
    • 장일형
    • 1999.08.13 02:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 03:56
      DLL을 사용하기 위해선 DLL내의 함수의 포인터를 알아야 합니다. 이는 GetProcAddress로 구할 수 있...
    • 홍성기
    • 1999.08.13 02:35
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 04:19
      http://www.borland.co.kr/delphi/productinfo/featurelist/ 을 방문해 보시면 자세히 알 수 있습니...
    • 여재모
    • 1999.08.13 02:04
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 04:25
      http://members.tripod.com/sungdong/DelphiMag.htm 을 방문해 보시면 사이트를 알 수 있을 것입니...
    • 박인재
    • 1999.08.13 01:35
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 03:42
      인재님께서는 이미지를 가질 수 있는 패널을 원하시는 모양입니다. 패널에 이미지 캑체를 넣어쓰게 되...
    • 박인재
      1999.08.13 07:05
      정성스러운 답변 말씀 잘 들었습니다. ^^ 저도 글을 올리고 나서 이렇게 저렇게 생각해보니, 님께서 말...
    • 유수
      1999.08.14 04:32
      안녕하세요. 패널의 소스가 어떻게 구성되어 있는지 모르겠습니다만, 제가 앞에 올린 컴포넌트...
    • 박인재
      1999.08.15 20:27
      유수님의 답변 말씀 정말 잘 들었습니다. 그리고 아주 많은 도움이 되었습니다. 제가 어려움을 겪고 ...
    • bluetin
    • 1999.08.13 01:15
    • 0 COMMENTS
    • /
    • 0 LIKES
    • bluetin
    • 1999.08.13 01:11
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 조복기
      1999.08.13 03:26
      안녕하세요..조복기입니다.. 신현묵, 정지훈님이 쓰신 '델파이4의 모든것'을 추천하네요.. 다른부...
    • 김미영
      1999.08.13 20:12
      조복기 께서 말씀하시기를... > > 안녕하세요..조복기입니다.. > > 신현묵, 정지훈님이 쓰신 '델파이...
    • 정연섭
    • 1999.08.12 23:52
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 03:27
      방법은 두가지가 있습니다. 코딩으로 Panel.Caption := '한출' + #13#10 + '두줄'.. 과 같이 ...
    • 남현선
    • 1999.08.12 23:39
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.13 03:32
      델파이4 정식판을 사용하시는지 묻고 싶네요. 혹시 베타판을 사용하신다면, 정식판으로 바꾸어 주셔...
    • 홍의식
      1999.08.12 23:59
      현재 화면은 screen.width와 screen.height로 구할수 있습니다. 그러면 form1,top := 1; form1,left ...
    • 문창완
      1999.08.14 04:27
      윤정선 께서 말씀하시기를... > 저는 델파이는 초보인데요, 연구소에서 시물레이션 프로그램을 다루게
    • 1999.08.12 21:44
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 유수
      1999.08.14 05:38
      안녕하세요. RxLib의 데모 프로그램중에 RichEdit 예제가 있습니다. 그중에 Paragraph(문단)설정메...