안녕하십니까 여러분
가끔 들러 잘 모르는 부분 검색해서 작업에 적용하고 있는 초금 개발자 입니다.
그런데 문제가 생겼습니다.
제가 개발하는 툴은 델파이 5.0 구번젼에 추가 컴포넌트 하나 없이 그냥 있는 툴로 개발합니다.
DBGrind 에 Query 값을 붙여 넣는 작업을 하는데 Title 명을 선택하면 정렬 하는 기능이 필요합니다.
1. 한번 쿼리해 놓은 DB그리드 값을 가지고 쿼리 없이 소팅하는 방법 과
2. 1번이 안된다면 아래와 같이 변수에 선택한 타이틀명과 알리아스를 붙여 재 조회 하는 방법을 하는데
한번은 정렬이 되는데 두번째 부터는 변화가 없는 현상??을 알고 싶습니다.
Try
Screen.Cursor := -11; //마우스 커서 모래시계
Self.Query1.Close;
Self.Query1.SQL.Clear;
Self.Query1.SQL.Add(' SELECT ');
Self.Query1.SQL.Add(' a.BK_STAT
Self.Query1.SQL.Add(' ,a.CUST_CD ');
Self.Query1.SQL.Add(' ,a.ACCOUNT_NO ');
Self.Query1.SQL.Add(' ,a.SALES_TERRITORY ');
Self.Query1.SQL.Add(' ,nvl(b.seq,0) as CALLF ');
Self.Query1.SQL.Add(' ,a.CUSTOMER_NM ');
Self.Query1.SQL.Add(' ,a.MAIN_PHONE ');
Self.Query1.SQL.Add(' ,a.ADDR1 ');
Self.Query1.SQL.Add(' ,a.ADDR2 ');
Self.Query1.SQL.Add(' ,a.PRODUCT
Self.Query1.SQL.Add(' ,decode(a.LEAD_PRIORITY,''1'',''1.낮음'',''2'',''2.중간'', ');
Self.Query1.SQL.Add(' ''3'',''3.높음'') as lead_priority ');
Self.Query1.SQL.Add(' ,substr(a.UP_DATE,1,4)||''.''||substr(a.UP_date,5,2)||''.''||substr(a.UP_date,7,2) as up_date ');
Self.Query1.SQL.Add(' ,substr(a.SYS_DATE,1,4)||''.''||substr(a.sys_date,5,2)||''.''||substr(a.sys_date,7,2) as sys_date ');
Self.Query1.SQL.Add(' ,a.SYS_EMP_NO ');
Self.Query1.SQL.Add(' From um1m01 a , ui1m05 b ');
Self.Query1.SQL.Add(' where a.cust_cd = b.cust_cd(+) ');
Self.Query1.SQL.Add(' and a.cust_cd <> ''SS0000001'' ');
Self.Query1.SQL.Add(' and a.cust_cd = decode(:p1, ''Y'', :p2, a.cust_cd ) ');
Self.Query1.SQL.Add(' and a.CUSTOMER_NM like decode(:p3, ''Y'', :p4, a.CUSTOMER_NM ) ');
Self.Query1.SQL.Add(' and a.bk_stat not in ( ''1'', ''9'') '); //1:접수, 9:포기
Self.Query1.SQL.Add(' and a.bk_stat like :p7 '); //2:전달,4:승인,5:번호요청,6:사용중
Self.Query1.SQL.Add(' and a.SALES_TERRITORY = DECODE(:p5,''U'', :p6, a.SALES_TERRITORY) ');
Self.Query1.SQL.Add(' ORDER BY :p8 '); //<--소트할 녀석 기준
Self.Query1.ParamByName('p1').AsString := t1; //영업코드 값 정의
Self.Query1.ParamByName('p2').AsString := t2; //고객코드
Self.Query1.ParamByName('p3').AsString := t3; //고객상호
Self.Query1.ParamByName('p4').AsString := t4; //영업코드
Self.Query1.ParamByName('p5').AsString := t5; //사용자 레벨 값 정의;
Self.Query1.ParamByName('p6').AsString := t6; //사용자 레벨 값 정의;
Self.Query1.ParamByName('p7').AsString := t7; //사용자 레벨 값 정의;
Self.Query1.ParamByName('p8').AsString := 'a.'+is_TtileName; //is_TitleName 은 타이틀을 클릭하면 선택한 컬럼명을 담아놓는 변수
Self.Query1.OPEN;
dbgrid2.DataSource := DataSource1;
Self.Query1.First;
self.Query1.FetchAll;
이런식으로 작업을 하는데
1. 쿼리를 하지 않고 처음 1번 가져온 데이터를 가지고 정렬을 하지 못하는지요?
2. 1번안이 현실적으로 힘들다면 p8에 타이틀값을 넣고 쿼리를 다시 돌리는데 소트가 되지 않는다는 점인데 이유가 뭘가요?
1번과 2번을 모두 사용해 보았었는데요..
1번은 그냥 Query 컴포넌트의 속성(TQuery.sort)에 필드명을 넣어주니 쉽게 되더군요..
2번은 아래와 같이... 할때는 문제가 있겠죠??
즉, " ORDER BY :p8 " 이부분이 문제입니다.
parameter로 사용할때 :p8 부분은 필드명을 줄 수 없습니다..
왜냐하면, parameter는 Delphi가 DB로 SQL문장을 보낼때 parameter는
상수(숫자,문자)인것 처럼 처리해서 보내기때문입니다.
따라서,
Self.Query1.SQL.Add(' ORDER BY :p8 ');
===> Self.Query1.SQL.Add(' ORDER BY ' + '변수명');
혹은 Self.Query1.SQL.Add(' ORDER BY ' + '변수명1 desc' + ',변수명2' + ... + ',변수명n');
등등으로 해야되겠죠?
(asc, desc 붙인이유는 아시죠? 오름차순,내림차순.. ^^;)
답이 되셨으면 하네요..