Q&A

  • [질문]DB그리드 문자 카운타 너무어렵습니다.


안녕하십니까? 전봉수입니다.
DB그리드에서 위의 이미지에서 장비코드에 대한 각 공종별로(3번째 컬럼 감지기 부터 ) A/S횟수를 카운트를 하여 나온  숫자를 붙여야 되는데요  첨부파일과같이  전부 합계만 나옵니다. 몇칠을 고민 고민하다 고수님들에게 부탁을 드립니다. 공종은 테이블에있는 필드가 아니고 임으로 만든 필드 입니다. 그리고 소스도 첨부하오니 좋은 소식 기다리겠습니다. PC환경 : WinXp  Delphi 7.0 파이어버드 2.1  사용컴포넌드 :  IBQuery, IBDatabase, IBTransaction 을 사용하고 있습니다.
6  COMMENTS
  • Profile
    왕재식 2010.07.07 23:19
    나오는걸로 봐서는
    쿼리의 내용이 잘못되었거나
    뿌리는 부분에서 잘못되신것 같습니다.
  • Profile
    전봉수 2010.07.08 00:54
    왕재식님 답변 감사합니다.
    여러가지 방법을 구사하여봤지만 제실력으로는 이것박에 않되서 소스를 첨부하여 잘못된곳을 지적하여 달라고 부탁 드리는것입니다.
    답변을 구체적으로 달아주시면 고맙겠습니다.
    A/S일자의 시작일자와 마지막일자를 인식을 못하는것 같습니다.
  • Profile
    왕재식 2010.07.08 02:30
    IBQ_EQM_CAD_CNTCD 이 함수 부분에서 쿼리를 해 올때
    FEQ_CODE는 있지만
    감지기, 장력, 플리, 누수 등의 구분이 없이 합계만 구해지고 있으신 것 같습니다.
    각 구분을 해주는 필드 또는 조건이 추가로 필요할 것 같습니다.
    소스상으로는 알 수 없어 쿼리문가지는 알려드릴수가 없습니다.
  • Profile
    전봉수 2010.07.09 00:42
    왕재식님 답변 감사합니다.
    코드 중복필드를 DISTINCT로 제거하고 시작일 자와 마직막 일지를 구분 하고져 파라메타로 아래와같이 SQL문을 사용하였는데요 중복 제거는 되는데 조인이 안되어 다른
    필드는 사용을 못하고 있습니다. 그럼 우선 SQL문에서 조인이 되어야되는데 어떻게해야될지 모르겠네요
    테이블은 TF_EQM_CAD 에다 TF_EQM_STD를 조인이 되어야 합니다. 아래 SQL문에서 중복필드를 제거하면서 조인이되는 SQL문을 좀 부탁드립니다.

    // 조회 하고져하는 날짜만 입력하였을경우
    sSQL:=' SELECT DISTINCT AA.FEQ_CODE FROM (SELECT A.* , B.FEQ_NM,FEQ_DV '+
    ' FROM TF_EQM_CAD A,TF_EQM_STD B '+
    ' Where A.FEQ_CODE = B.FEQ_CODE) AA WHERE AS_DATE Between :PAS_DATE1 and :PAS_DATE2 ';


    // 장비 이력카드 A/S등록관리
    CREATE TABLE TF_EQM_CAD ( //장비 이력카드 A/S등록 테이블
    AS_DATE DATE NOT NULL, //AS일자
    AS_SEQ INTEGER NOT NULL, //순번
    PART_CD VARCHAR(20) NOT NULL, //부서코드
    FEQ_CODE VARCHAR(20) NOT NULL, //장비코드
    AS_MEMO VARCHAR(50), //AS내역
    AS_AMT NUMERIC(13,2), //AS금액
    ETC_USE VARCHAR(40), //비고
    CHN_DT VARCHAR(20), //변경일시
    CHN_ID VARCHAR(20), //변경자ID
    JOB_CODE VARCHAR(20) NOT NULL, //공종코드
    AS_YEAR VARCHAR(20), //년도
    AS_MONTH VARCHAR(20) //월별
    );


    ALTER TABLE TF_EQM_CAD
    ADD PRIMARY KEY (AS_DATE, AS_SEQ);

    // 장비이력카드 제원등록
    CREATE TABLE TF_EQM_STD ( //장비 이력카드 제원등록 테이블
    FEQ_CODE VARCHAR(20) NOT NULL, //장비코드
    FEQ_NM VARCHAR(20) NOT NULL, //기기명
    FEQ_DV VARCHAR(20), //장비분류
    PART_CD VARCHAR(20) NOT NULL, //부서코드
    SPL_LC VARCHAR(20), //공급장소
    MAK_NO VARCHAR(20), //제조번호
    MET_COMP VARCHAR(20), //제작회사
    ESBH_LC VARCHAR(20), //설치장소
    ESBH_YR VARCHAR(20), //설치년도
    FEQ_FROM VARCHAR(20), // 형식
    FEQ_QTY INTEGER, //수량
    FEQ_STD VARCHAR(400), //장비제원
    CHN_DT VARCHAR(20), //변경일시
    CHN_ID VARCHAR(20) //변경자ID
    ASQTY NUMERIC //AS카운트
    );


    ALTER TABLE TF_EQM_STD
    ADD PRIMARY KEY (FEQ_CODE, FEQ_NM);


  • Profile
    왕재식 2010.07.09 01:11
    제가 테이블을 잘 이해했는지는 모르겠습니다..^^;

    IBQ_EQM_CAD_CNTCD 함수가 있었습니다.

    1: sSQL:=' SELECT COUNT(JOB_CODE) From TF_EQM_CAD '+
    ' Where AS_DATE BETWEEN :PDATE1 AND :PDATE2 '+
    ' AND FEQ_CODE = :PCODE';
    이 부분이 뿌리는 부분으로 알고 있습니다.
    ' AND JOB_CODE = 잡코드';
    전체를 하실 때는 이 잡코드 부분을 없애시면 될 거 같습니다.

    테이블 조인 방법은
    table1 A JOIN table2 B ON A.필드 = B.필드
    한쪽 테이블 기준 조인 방법은
    table1 A (LEFT or RIGHT) OUTER JOIN table2 ON A.필드 = B.필드
    이렇게 조인 하시는 겁니다.

    메신저 사용하시면
    wjsbest@nate.com으로 친구추가주시면 제가 아는 부분에서는 도와드리도록 하겠습니다.
  • Profile
    전봉수 2010.07.09 15:32
    왕재식님 답변 너무 고맙습니다.
    DBGRID 필드 중복제거가 DISTINCT방법 말고 코드 필드OnGetText 를 이용하여 하는방법도 있다는데요 제가 잘못 사용을 하였는지 성공하지 못하였습니다.
    DISTINCT방법을 이용하니까 FEQ_CODE 1개만 조인이 되는군요
    이제는 다른방법으로 전환해서 각 필드에 카운트는 제대로 됩니다. 그런데 날짜로 기간을 설정하면 무조건 전체 숫자가 카운투 됩니다.
    메신저에 친구추가하였습니다.
    제 이이디는 jeunbskr@nate.com입니다.