Q&A

  • SQL에 관한 몇가지 질문...
안녕하세요... 델파이 초보입니다...
프로그램을 구성하면서 SQL에 관해 몇가지 질문이 있어서 이렇게 고수님들에 가르침을 바라고 글을 올립니다...

먼저, DELPHI6.0에 PARADOX DB를 사용하고요 등록,수정,삭제 거의 모두를 Query로 사용하고 있습니다...

다음과 같은 상황에서 몇가지 질문이 생기더군요...

하나의 DBGrid에서 다음과 같은 내용을 표현하고 싶습니다...
     "거래처코드, 거래처명, 거래금액, 결재금액, 잔금"
그래서 다음과 같이 SELECT문을 구성하는데 이중 잔금부분의 조건이 틀립니다..

SELECT 거래처명, SUM(금액) 거래금액, SUM(입금-출금) 결재금액, SUM(잔금) 잔금 FROM 전표 WHERE 일자 = 조회일자 GROUP BY 거래처명

물론 조회일자는 변수명입니다...
이중 거래금액이나 결재금액은 산출조건은 "일자 = 조회일자"인데
잔금산출의 조건은 "일자 <= 조회일자"이어야 하거든요...

전에 VISUAL FOXPRO를 사용할때는 각각 데이터를 산출하여 임시화일로 저장하고 둘을 병합하였습니다...
그런데 DELPHI에서 Query로 생성한 결과는 화일로 어떻게 저장이 안되더군요...
그래서 무슨 방법이 없나 아무리 찾아봐서 마따한 답이 없습니다...

질문1. 하나의 DBGrid에 서로 다른 조건으로 검색된 사항을 표시할 수 있는 방법이 없는가 하는것이구요...

질문2. FOXPRO에서는 SELECT 문 마지막에 "INTO TABLE 화일명"하던가 SELECT문을 끝낸후 "COPY TO 화일명"을  해서 화일로 저장을 해서 해당화일을 이용했거든요...
DELPHI에는 그런기능이 없는지요...
INTO TABLE 명령을 사용하니깐 에러가 나더군요...
다른 ORACLE이나 SQL DB는 기능이 있다고 하시던데 PARADOX에는 없는건지...

질문3. SELECT 문에 UNION이라는 구문이 있던데 설명이 자세히 된것이 없더군요... 어떻게 사용하는건지 SAMPLE이나 설명을 해주실수는 없는지요...

고수님들, 이 초보를 위해 수고스러우시겠지만 가르침을 주십시요...
꼭 꼭 꼭 가르침을 주십시요....^^
3  COMMENTS
  • Profile
    정형준 2002.06.05 18:41
    다음 두가지 방법이 생각나는데
    속도 또는 관리 측면에서 조금 더 고려하신후 적당한것으로 구현해보세요...

    1. Join 사용

    SELECT A.거래처명, A.거래금액, A.결재금액, B.잔금
    FROM  ( SELECT 거래처명,
                              SUM(금액) 거래금액,
                              SUM(입금-출금) 결재금액
                 FROM 전표
                 WHERE 일자 = 조회일자
                 GROUP BY 거래처명 ) A,
              ( SELECT 거래처명,
                             SUM(잔금) 잔금
                 FROM 전표
                 WHERE 일자 <= 조회일자
                 GROUP BY 거래처명 ) B
    WHERE   A.거래처명 = B.거래처명;

    2. Union 사용

    SELECT 거래처명, SUM(거래금액), SUM(결재금액), SUM(잔금)
    FROM  ( SELECT 거래처명,
                              SUM(금액) 거래금액, SUM(입금-출금) 결재금액, 0  잔금
                 FROM 전표
                 WHERE 일자 = 조회일자
                 GROUP BY 거래처명
                 UNION ALL
                 SELECT 거래처명, 0, 0, SUM(잔금)
                 FROM 전표
                 WHERE 일자 <= 조회일자
                 GROUP BY 거래처명 )
    GROUP BY 거래처명 );
  • Profile
    정형준 2002.06.05 18:30
    Select cName From Customer
    Union
    Seelct eName From Employee;

    위의 문장에서 보듯이 Union은 두개 이상의 Query의 결과를 합하는 일을 합니다.
    위의 결과는 고객과 직원의 이름이 모두 나오겠죠.
    두개의 Query의 필드의 수는 같아야 하고 Type도 같아야 합니다.
    필드명은 첫번째 Query를 따라갑니다.
    위의 경우 cName이 필드명이 됩니다.

    참고로 알아두셔야 할것은 Query결과는 Unique하게 나옵니다.
    예로 Customer에 A, B가 있고, Employee에는 B,C가 있다면
    결과는 A, B, C로 나온다는거죠.

    A,B,B,C의 결과를 원한다면

    Select cName From Customer
    Union all
    Select eName From Employee;

    이렇게 all option을 사용하여 처리합니다.
    (참고로 속도가 좀더 빠릅니다. 비교하는 처리가 빠지므로)

    또는

    Select 1 as Flag, cName From Customer
    Union
    Select 2,             eName From Employee;

    처럼 고객인지 직원인지 구분하는 필드를 강제로 만들어 모두 가져와서
    Query한 이후 사용하는 방법도 있습니다.

    이상 Union의 설명입니다.

    Database는 재미있습니다.
    즐겁게....

  • Profile
    머슴 2002.06.05 03:35
    질문1.
    하나의 DBGrid에 서로 다른 조건으로 검색된 사항을 표시할 수 있는 방법이 없는가 하는것이구요...

    답변1.
          
         With Query1 do
          begin
           SQL.Clear;
           SQL.Add('SELECT 거래처명, SUM(금액) 거래금액,    ');
           SQL.Add('SUM(입금-출금) 결재금액, SUM(잔금) 잔금 ');
           SQL.Add('     FROM 전표                          ');

          <요렇게요>
          if (결재금액조건) then                                  
             SQL.Add(' WHERE 일자 = :조회일자               ')
           else   SQL.Add(' WHERE 일자< = 조회일자          ');  
          

           SQL.Add(' GROUP BY 거래처명                      ');
           ParamByName('조회일자').AsString(형은 맞추고요) := edit1.text;
           Open;
           <생략>      

         화일상태로 저장하는 것이 아니라..
         꼭 컴퍼넌트에 쿼리문은 넣을 필요가 없고 위와 같이 코딩으로
         해결할 수 있습니다.

          이 방법이 싫으시면 쿼리컴퍼넌트를 두개를 놓으시고 조건에 따라서
          Datasource를 변경해주시는 방법도 있겠네요..

              

    질문3. SELECT 문에 UNION이라는 구문이 있던데 설명이 자세히 된것이 없더군요... 어떻게 사용하는건지 SAMPLE이나 설명을 해주실수는 없는지요...


      샘플예

       select deptno from sawon where saname='최진실'  
       UNION  
       select deptno from sawon where saname='이성계'

      
      같은 테이블내에서는 별로 좋은 쿼리는 안될것 같고요...

      즉 거래처 외상테이블  거래처 수금테이블이 있을 경우

      외상과 수금을 일자별로 보겠다 했을때 사용할 수 있을것 같습니다..

      사용시 주의해야할점은 필드가 1대1대 일치를 해야한다는 점입니다..

      즉 외상테이블에서 5개 필드를 수금테이블에서 6개 이것은 안됩니다...

      (외상테이블에서 빈값이라도 넣어주셔야 합니다 즉 '' 또는 1 이런식으로)
    • 정우석
    • 2002.06.05 21:29
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이광수
      2002.06.06 00:48
      as는 도움말에 보시면 다음과 같습니다. The as operator performs checked typecasts 즉 형이 변환...
    • 이경혜
    • 2002.06.05 21:00
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 머슴
      2002.06.06 00:09
      .Dpk를 더블클릭하면 델파이실행되거든요... 이것을 컴파일하면 보통 설치가 됩니다...
    • 이상현
    • 2002.06.05 20:29
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김수경
      2002.06.06 00:04
      Delphi에서 제공되는 Sample중 ...ExamplesInternetChat Fold 에 있는 Source를 분석/실행해 보세요...
    • 김도형
    • 2002.06.05 17:28
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.06.05 19:34
      안녕하세요. 최용일입니다. 리소스에 있는 폼하고 유닛에 선언된 폼하고 틀리는가 보네요... 아마도 유...
    • 김경록
      2002.06.05 18:20
      해당폼의 Resource(*.res)가 없다는 뜻인거 같네여.. 찾아 보시길.. 이런건 Copy하다가 잘 발생하는건데....
    • 김도형
      2002.06.05 18:36
      .res 파일이 있는데도 그러네요..... 그리고 이젠 폼 자체도 보이지 않네요.... View - Forms 해서 ...
    • 프리맨
      2002.06.05 19:24
      간혹 .res 가 깨질떄도 있는데 그문제인지 모르겠군요.. 다른 프로젝트의 .res 를 복사한후 이...
    • 정우석
      2002.06.05 21:47
      음... 아는 대로 개괄적으로 적자면... 1. unit 다음에는 물리적으로 저장되는 pas 파일의 이름이 옵니...
    • 제임스
    • 2002.06.05 03:44
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 조현우
    • 2002.06.05 03:17
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김경록
      2002.06.05 18:34
      에러난 문장을 올려 주셔여져... 그래야 자세히 갈켜 드리는건데.. 일단.. 님의 Coding내용에서 의심스...
    • 김지엽
      2002.06.05 03:46
      컴파일러가 안된다는건 무슨 뜻이죠?
    • 이승근
    • 2002.06.05 02:46
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 정형준
      2002.06.05 18:41
      다음 두가지 방법이 생각나는데 속도 또는 관리 측면에서 조금 더 고려하신후 적당한것으로 구현해보세요....
    • 정형준
      2002.06.05 18:30
      Select cName From Customer Union Seelct eName From Employee; 위의 문장에서 보듯이 Union은 두개 ...
    • 머슴
      2002.06.05 03:35
      질문1. 하나의 DBGrid에 서로 다른 조건으로 검색된 사항을 표시할 수 있는 방법이 없는가 하는것이구요....
    • 정민섭
    • 2002.06.05 02:45
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.06.05 03:00
      안녕하세요. 최용일입니다. 그냥 Close로 닫으시면 안되나요? 차일드폼의 OnClose이벤트에서 Action파라...
    • ssoya
    • 2002.06.05 02:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.06.05 02:58
      안녕하세요. 최용일입니다. OwnerData를 가진 경우는 리스트뷰의 데이터(Item)를 정렬하는것이 아니라 O...
    • 박만웅
      2002.06.08 02:37
      firewall과 관련되서 잘 안되는것이라 추측됩니다. FTP component property중에 "Passive mode...
    • 최석기
      2002.06.05 19:54
      이런 식으로 와일드 카드 문자를 사용해서 써야해요.. tb_IfName.Filter := 'IFNAME = ''*' + trim(et_IfN...
    • 김수경
      2002.06.05 20:05
      부분 비교시 사용되는 문자는 '*'입니다.   Table1.Filter = '찾을 값*'; 입니다. 하지...
    • 곰다방~미스김
      2002.06.05 19:30
      허접답번이라 지송..... 필터에 라이크 기능 되는데....... 어떻게 쓰는지는 까먹었네염..... 되긴 해염...
    • 연기훈
    • 2002.06.05 00:14
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 김경록
      2002.06.05 18:42
      일단 할 수 있습니다.. 사용법은           Select * fro...
    • 김지엽
      2002.06.05 03:59
      만약 RDBMS를 사용하신다면, DB별로 DataBase 스키마를 변경시켜주면 해결될 일일거 같지만, 말씀하신 내용...
    • 연기훈
      2002.06.05 19:06
      캄사 캄사.. 두분의 답변 감사합니다.... 제가 지금 개발하는건 로컬 DB에서 돌아가는거라.... 앞...
    • 이호성
    • 2002.06.05 00:06
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 하얀까마귀
      2002.06.05 00:08
      안녕하세요 하얀까마귀 입니다. pos 라는 함수가 있습니다 해당 문자열에서 찾는문자열의 위치를 리...
    • 연기훈
      2002.06.05 00:49
      제가알기론.. sleep은 잠깐 실행을 정지하는걸로 알고 있씁니다. 아래 프로그램은... 1/1000 초 정지한...
    • 김진기
    • 2002.06.04 22:58
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김경록
      2002.06.05 18:27
      해당 오류는 DB내의 Table에 정의한 칼럼의 Size를 너무 크게 하였기 때문입니다.. 예를 들면.. Varchar...
    • 김도형
    • 2002.06.04 22:38
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 머슴
      2002.06.04 23:14
      지금 pas화일과 dfm화일을 혼동하신것 같습니다.. dfm화일은 응용프로그램의 폼 정보를 가지고 있...