DataBase를 사용할 때 조건절(WHERE 절), 정렬 (ORDER BY)를 사용해서 원하는 데이터를 검색할 수 있다.
조건절과 ORDER BY절은 DataBase마다 형식이 다르기 때문에 사용자는 이 조건들을 사용하기 위해서는 해당 DataBase의 SQL 필터 문을 참조하여야 할것이다.
여기서는 가장 대중적으로 사용되는 MS Access파일(mdb)파일에서의 형식을 설명 할 것이다.
주의할 점은 데이터 베이스(mdb파일) 생성시에 각 테이블의 Field명을 다음과 같은 이름으로 작성하면 외부 프로그램에서 접근할 수 없다. ( DATE, NO, ORDER 등 그 밖에도 여러가지가 있다. 이것은 Access DB가 이 문자들을 자신만의 특수문자로 인식하기 때문이다. 사용자는 DB프로그램의 종류에 따라서 이를 파악하고 사용하여야 할 것이다.)
일반적으로 DataBase의 Field형식은 크게 '텍스트', '숫자', '날짜/시간'으로 사용한다.
이 Field에서 찾을 조건을 WHERE절에 사용하기 위해서 몇가지 예를 들겠다.
우선, 데이터 베이스를 다음과 같이 생성하였다고 가정해 보자
mdb 파일 이름은 Test.mdb 이고, 아래의 Table 이름은 Table2이다.
<그림1> mdb파일의 Table2의 형식을 작성한 내용
<그림2> Table2에 입력된 레코드의 내용
위의 내용들을 감시프로그램상에서 볼 수 있는 방법은 SQL연결 설정을 사용하여 SQL문을 사용하면 되고, 감시 프로그램에서 SQL문의 WHERE절을 사용하여 원하는 내용들을 찾아서 볼 수 있다.
감시프로그램에서 WHERE절을 사용하는 함수는 다음과 같다.
@SQLSelect(DWORD id, char *Table, char *BindList, char *whereExpr, char *orderExpr);
@DatabaseSetFilter(char* class_name, char *where, char *orderby); //이함수는 데이터베이스 오브젝트를 사용할 때 사용한다.
@SQLSelect() 와 @DatabaseSetFilter() 는 DB와 연결방법이 다르다. 전자는 ODBC연결을 사용하며, 후자는 DAO를 사용한다. 따라서 후자를 사용할 때는 ODBC연결 설정이 필요없고, 원본 파일과 테이블명만 입력해 주면된다.
다시 본론으로 들어가서 사용자가 찾을 조건은 여러 방법이 있을 것이다. ('YMD'라는 Field에서 날짜/시간에 따라서 찾고자 하는 경우, 'STR'이라는 Field(텍스트)에서 원하는 TYPE을 보고자 하는 경우, ‘NUM’이라는 Field(숫자)에서 보고자 하는 숫자의 레코드를 보고자 하는 경우 등)
그러면 이제부터 각각의 경우에 대해서 조건 절을 쓰는 방법을 설명 하겠다. (주의 : 이 방법은 MS Access에서만 해당됨, DB마다 형식이 조금씩 차이가 있다는 것을 명심)
WHERE
1. Field가 날짜/시간의 형식으로
된 경우 (이 경우는 Field가 ‘텍스트’로 지정되고 텍스트를 날짜형식(즉, 텍스트형식으로 ‘
1) 선택한 날짜의 사이의 값을 불러올 때
사용자가
ACCESS 의 SQL형식 -> Between #시작월/시작일/시작년# And #끝월/끝일/끝년#
감시프로그램에서 Where절에는 다음과 같이 쓴다. "YMD Between #
@sprintf(buf,"YMD Between #01/02/2001# And #01/05/2001#");
@SQLSelect(ConnectID, Table명, Bindlist명, buf, "NUM ASC");
@DatabaseSetFilter(Classname, buf, "NUM ASC");
위와 같이 써주면 된다. 그러면 선택한 날짜의 데이터를 올림차순("NUM ASC"가 적용)순으로 정렬되어서 볼 수 있다.
데이터베이스 오브젝트를 사용한 예를 간단히 들겠다.
<그림3> 데이터베이스 오브젝트를 사용한 DB 의 찾기 기능
위의 그림대로 화면을 구성한다.
(1) 데이터 베이스 오브젝트를 삽입한다(ClassName ->Database1). 다음에 오브젝트의 속성/DB파일을 연결한다. “ 편집기|데이터베이스 참조 “
(2) 불러올 날짜들을 설정할 태그들 (SYEAR,SMON,SDAY 이상 불러올 시작 년/월/일, EYEAR,EMON,EDAY 이상 불러올 끝 날짜)을 메모리 태그로 구성한다.
(3) 날짜 세팅을 위한 콤보박스를 구성한다. ComboSyear, ComboSmon, ComboSday, ComboEyear, ComboEmon, ComboEday를 구성한다.
(4) 검색하기 위한 프로그램 버튼에 스크립트를 구성한다.
@sprintf(buf, "YMD Between #%02d/%02d/%04d# And #%02d/%02d/%04d#", $SMON,$SDAY,$SYEAR,$EMON,$EDAY+1,$EYEAR);
@DatabaseSetFilter("Database1", buf, "NUM ASC");
문장설명 : %02d라는 것은 뒤쪽의 변수값을 받아들여서 2자리수로 만드는 것이다. 예를 들어 $SMON= 1, $SDAY=2, $SYEAR=2001, $EMON= 1, $EDAY=9, $SYEAR=2001 이라면 buf에 저장되는 값은 “YMD Between #01/02/2001# And #01/09/2001#” 이 된다.
마지막 날짜에 $EDAY에 +1을 해준 이유는 선택한 날짜까지 보기 위함이다. 만약, 해주지 않았다면 끝날짜의 전날까지만 데이터를 불러온다.
2) 지정한 날짜의 모든 데이터를 불러올 때 (주의: 1)번의 경우는 DAY들의 사이의 값을 불러올 때 사용하며, 2)번의 경우는 지정한
날짜의 경우(예를 들면 사용자가
지정한 데이터를 불러오기 위해서는 WHERE절을 사용할 때 Field를 텍스트로 간주하고 사용하여야 한다.( DB에서 날짜/시간 형식으로 하였다 하더라도 WHERE절을 텍스트 형식으로 작성하면 DB에서 자동으로 맞추어 준다.) 주의: 이 경우는 DB에 등록된 내용 그대로 써주어야 한다.
만약 사용자가
@sprintf(buf,"YMD Like
@DatabaseSetFilter("database1",buf,"");
2. Field가 텍스트 형식으로 된 경우
1) 일반적인 문자열인 경우
<그림2>의 테이블에서 Field 'STR' (형식:텍스트)을 사용하여 검색을 하려면 다음과 같이 사용한다.
(1) STR 필드에서 'ABK'값으로 등록된 레코드를 불러오고 싶다면 다음과 같이 스크립트를 구성한다.
@sprintf(buf, "STR = 'ABK'");
@DatabaseSetFilter(char *classname, buf ,""); or @SQLSelect(ConnectID, Table명, Bindlist명, buf,"");
결과 : <그림2>의 내용 중 STR 값이 'ABK' 인 COUNT=1인 레코드만을 불러온다.
주의 : @sprintf에서 buf 에 저장할 때 AB값을 “ ‘ “ 으로 앞뒤로 막아 주어야 한다.(필드 형식이 텍스트인 경우)
(2) STR 필드에서 'A' 로 시작되는 모든 레코드를 불러오고 싶다면 다음과 같이 스크립트를 구성한다.
@sprintf(buf, "STR Like 'A%%'");
@DatabaseSetFilter(char *classname, buf , ""); or @SQLSelect(ConnectID, Table명, Bindlist명, buf, "");
결과 : <그림2>의 내용 중 STR 값이 'A'로 시작되는 COUNT1,2,3 의 레코드들만(STR : ABK,ADL,ACM)을 불러온다.
주의 : @sprintf에서 buf 에 저장할 때 A%%에서 '%' 2개를 주어야 한다는 것이다. 그리고, ‘=’ 대신에 ‘Like’을 써주어야 한다.
(3) STR 필드에서 'G'로 시작되고 'L'로 끝나는 모든 레코드를 불러오고 싶다면 다음과 같이 스크립트를 구성한다.
(단, G 와 L 사이의 글자수에 관계없을 때)
@sprintf(buf, "STR Like 'G%%L'");
@DatabaseSetFilter(char *classname, buf , ""); or @SQLSelect(ConnectID, Table명, Bindlist명, buf,"");
결과 : <그림2>의 내용 중 'G'로 시작하고 'L'로 끝나는 COUNT.20,21,22 레코드들을 불러온다. (STR : GBL, GCL, GAKL)
2) 숫자만으로 구성된 문자열인 경우
만약, STR 필드의 값이 100~1400 까지 등록되었다고 가정해 보자.
(1) STR 필드에서 첫번째 자리가 ‘1’로 시작하고 두번째 자리가 0~9 까지 모든수, 세번째 자리가 ‘2’, 네번째 자리가 ‘0’ 으로 끝나는 값의 레코드를 불러온다면 다음과 같이 WHERE 절을 작성하면 된다.
@sprintf(buf, "STR Like '1#20'");
@DatabaseSetFilter(char *classname, buf , ""); or @SQLSelect(ConnectID, Table명, Bindlist명, buf, "");
결과 : STR값이 1020, 1120, 1320 인 레코드들을 불러올 것이다.
주의 : '%'를 쓰는 경우와 '#'을 쓰는 경우를 혼돈해서는 않된다. ( %는 문자의 개수에 상관없고, #은(숫자로만 구성된 문자열) 1문자를 검색할 때 사용한다.
나머지는 숫자들로 구성된 문자열도 문자열이기 때문에 위의 1)번이 똑같이 적용된다.
3. Field가 숫자 형식으로 된 경우
위의 <그림2>에서 NUM이라는 필드(형식 : 숫자)와 COUNT라는 필드(형식 : 숫자) 를 가지고 검색을 하려면 다음과 같이 하면 된다.
1) 지정한 숫자 찾기
NUM 필드에서 값이 ‘11’인 레코드를 찾는다면 아래와 같이 스크립트를 작성하면 된다.
@sprintf(buf, "NUM = 11");
@DatabaseSetFilter(char *classname, buf , ""); or @SQLSelect(ConnectID, Table명, Bindlist명, buf, "");
결과는 <그림2>에서 COUNT가 1, 12번의 레코드들을 불러올 것이다.
여기서 주의 할 경우는 문자열인 경우는 데이터 값 앞뒤로 “ ' ” 작은 따옴표를 묶었는데 숫자에서는 묶지 않는 것이다.
(예외의 경우가 있는데 이 것은 아래의 3)번을 참조하면 된다.)
2) AND / OR 을 사용한 레코드 불러오기
COUNT 필드에서 5 ~ 10번까지의 레코드를 불러오고 싶다면 다음과 같이 작성하면 된다.
@sprintf(buf, "COUNT >= 5 And COUNT <=10 ");
@DatabaseSetFilter(char *classname, buf , ""); or @SQLSelect(ConnectID, Table명, Bindlist명, buf, "");
COUNT 필드에서 5번 이하 10번 이상의 레코드를 불러오고 싶다면 다음과 같이 작성하면 된다.
@sprintf(buf, "COUNT <= 5 Or COUNT >=10");
@DatabaseSetFilter(char *classname, buf , ""); or @SQLSelect(ConnectID, Table명, Bindlist명, buf, "");
3) NUM 필드에서 값이 7로 끝나는 레코드를 불러오기 위해서는 다음과 같이 작성하면 된다.
이때는 WHERE절을 사용할 때 숫자형식이 아닌 문자열로 작성한다.
@sprintf(buf, "NUM Like '#7'");
@DatabaseSetFilter(char *classname, buf , ""); or @SQLSelect(ConnectID, Table명, Bindlist명, buf, "");
NUM 필드의 형식은 숫자 이지만 이와 같이 검색을 하기위해서는 WHERE절을 텍스트 형식으로 작성한다.
결과 : <그림2>에서 NUM 필드값이 17인 레코드들을 불러온다.
ORDER BY
ORDER BY 절은 데이터베이스에서 검색한 레코드들을 정렬하는 기능을 한다.
@SQLSelect(DWORD id, char *Table, char *BindList, char *whereExpr, char *orderExpr);
@DatabaseSetFilter(char* class_name, char *where, char *orderby); //이함수는 데이터베이스 오브젝트를 사용할 때 사용한다.
위의 함수에서 마지막에 들어가는 절이 ORDER BY 절이다.
만약 <그림2>에서 검색을 하고 검색한 레코드들을 날짜순으로 정렬을 하고 싶다면 다음과 같이 작성하면 된다.
@sprintf( buf , "YMD DESC"); // 이 것은 불러온 레코드들을 내림차순 정렬(가장 최근날짜를 맨 위로 하여 차례로 정렬)
@sprintf( buf , "YMD ASC"); // 이 것은 불러온 레코드들을 올림차순 정렬( 가장 이전날짜를 맨 위로 하여 차례로 정렬)
@DatabaseSetFilter(char* classname, Char* whrer, buf ); or @SQLSelect(ConnectID, Table명, Bindlist명, Char* whrer, buf );
@sprintf( buf , "STR DESC"); // 이 것은 불러온 레코드들을 내림차순 정렬( 한글 : ㅎ -> ㄱ, 영문 : Z -> A )
@sprintf( buf , "STR ASC"); // 이 것은 불러온 레코드들을 올림차순 정렬( 가장 이전날짜를 맨 위로 하여 차례로 정렬)
@DatabaseSetFilter(char* classname, Char* whrer, buf ); or @SQLSelect(ConnectID, Table명, Bindlist명, Char* whrer, buf );
@sprintf( buf , "NUM DESC"); // 이 것은 불러온 레코드들을 내림차순( 가장 큰수부터 차례로 정렬)
@sprintf( buf , "NUM ASC"); // 이 것은 불러온 레코드들을 올림차순( 가장 작은수부터 차례로 정렬)
@DatabaseSetFilter(char* classname, Char* whrer, buf ); or @SQLSelect(ConnectID, Table명, Bindlist명, Char* whrer, buf );