Visual Basic에서 보고서를 만드는 방법은 data report로 만드는 방법과 crystal report로 만드는 방법이 있다. 보고서를 만드는 작업을 하기 이전에 data view와 data environment에 대한 이해가 필요하기 때문에 우선적으로 data view에 대해서 설명하도록 한다.
data view소개
data view창을 이용하여 데이터베이스 구조를 엑세스하고 조작할 수 있다.
data view는 다음과 같은 작업을 가능한게 한다.
- 테이블과 뷰를 작성/수정
- 데이터베이스 다이어그램을 작성/수정
- 저장 프로시저와 트리거를 작성/수정
프로젝트에서는 data environment를 사용하여 응용프로그램의 데이터를 엑세스한다.
- data view창은 프로젝트에 추가된 모든 data environment를 보여주고 data environment로부터의 연결을 표시한다.
- data view창에 있는 개체를 data environment로 끌어오면 data environment에서 명령을 자동으로 만들 수 있다.
- data environment창의 명령을 폼과 보고서로 끌어올 수 있다.
data view창 사용방법
- data view를 사용하기 위해서는 [보기-data view창]메뉴를 선택한다. 열려진 data view창에서는 [새 데이터 연결추가]아이콘을 선택하여 연결 대화상자를 호출한다.
- 여기에서는 우리가 앞에서 만들었던 myDB.mdb를 사용할 것이기 때문에 [microsoft jet 3.51 OLE provider]를 선택한다.
- 다음 대화상자에서는 실제 사용할 파일을 선택한다. 여기에서는 myDB.mdb를 선택하도록 한다. 연결이 잘 되었는지 확인하고 싶다면 [연결테스트]버튼을 클릭한다.
- 사용할 데이터를 연결하였다면 data view창에서 확인을 해보도록 한다. data view창이 나타나고 데이터 연결부분에 새로운 data link1이 생겼음을 확인할 수 있다.
data view를 사용하여 data environment개체를 작성할 수 있는데, data environment개체에는 connection개체 및 command개체, command개체간의 관계인 계층 구조, 그룹화 및 집합체가 포함될 수 있다. data environment개체를 디자인하기 전에 제공할 정보를 결정하고, 정보를 포함하는 데이터베이스를 식별하며, data report 또는 hierarchical flexGrid컨트롤 작성과 같은 실행모드작업의 목적을 결정해야 한다. 우선 프로젝트에서 data environment를 추가하는 방법에 대해서 알아본다.
우선 data view창에서 [현재 프로젝트에 data environment추가]아이콘을 클릭한다. 또는 [프로젝트-data environment추가]메뉴를 클릭하여 data environment창을 활성화시킨다.
data environment에서 data연결하기
data environment를 사용하여 데이터를 엑세스하려면 connection개체를 작성해야 한다. 그러므로 모든 data environment에는 적어도 하나 이상의 connection개체가 있어야 한다. connection개체는 데이터원본으로 사용되는 원격 데이터베이스에 대한 연결을 나타낸다.
visual basic프로젝트에 data environment를 추가할 때 data environment는 자동으로 connection1이라는 새 연결을 포함한다. 디자인 모드에서는 environment는 연결을 열어서 데이터베이스 개체이름, 테이블구조 및 프로시저 매개변수 등과 같은 메타데이터를 연결해서 가져온다.
- connection1을 클릭하고 속성창을 불러온다. 그러면 데이터링크 등록정보 창이 나타나게 되는데 여기에서도 마찬가지로 access로 만든 DB를 사용할 것이기 때문에 [microsoft jet 3.51 OLE DB provider]를 선택한다.
- 다음에는 데이터링크 등록정보창이 나타나게 된다. 여기에서는 우리가 사용할 DBfile(myDB.mdb)을 선택하면 된다.
- 명령추가 메뉴를 선택하여 command1을 추가하도록 한다.
- 해당 속성메뉴를 선택하여 command1등록정보창을 불러온다. 다음과 같이 수정한다.
- 명령이름 : student
- 데이터베이스 개체 : 테이블
- 개체이름 : student
- 동일한 방법으로 eng_score테이블을 설정한다. 모두 완료하였다면 다음과 같은 창을 볼 수 있다.
- 이제 두 테이블을 연결했으므로 두 테이블의 number field의 관계를 맺는다.
우선 eng_score를 클리하고 속성을 선택하도록 한다. 그러면 eng_score테이블의 등록정보창이 나타나게 되는데, 여기에서는 [일반]탭이 아니라 [관계]탭을 선택하도록 한다. 상위명령개체와 관계맺기를 체크하고 상위명령란을 student로 선택한다. 그러면 상위필드란의 student테이블의 number가 나타나게 된다. 여기에서 [추가]버튼을 선택한다. 그러면 아래 창에 [number to number]가 나타나게 된다. 이제 두 테이블이 관계를 맺게 된 것이다. 확인버튼을 누르면 연결된 두 테이블을 볼 수 있다.
data environment에서 간단한 바운드폼 작성
data environment에서 command개체를 작성한 다음, 데이터원본에서 사용할 경우 command개체를 비어있는 폼에 끌어와 데이터 바운드 폼을 쉽게 작성할 수 있다. 여기에서는 myDB.mdb 예제 데이터베이스의 student테이블과 eng_score테이블을 연결한 폼을 작성한다.
- command개체인 student를 data environment에서 빈 폼으로 끌어온다. 그러면 그것을 표현하기위한 모든 컨트롤들이 자동으로 만들어지게 된다. 이 상태에서도 실행하면 충분히 데이터가 연결되는 것을 볼 수 있다.
- 하지만 여기에서는 레코드를 탐색할 수가 없다. 그래서 지금부터 레코드를 탐색할 수 있는 명령단추를 작성한다. 폼에 command버튼을 두개 작성하고 속성을 다음과 같이 바꾸도록 한다.
속성설정
command1
└ name : cmd_next
└ caption : 다음 레코드command2
└ name : cmd_previous
└ caption : 이전 레코드
- 다음과 같이 코드를 작성한다.
소스코드
Private Sub cmd_next_Click()
DataEnvironment1.rsstudent.MoveNext
End SubPrivate Sub cmd_previous_Click()
DataEnvironment1.rsstudent.MovePrevious
End Sub
이제 폼을 실행하면 커맨드버튼을 사용하여 레코드를 탐색할 수 있다.
이 것은 앞장에서 데이터베이스를 다루었던 것보다 쉬운 방법일 것이다. 다음에는 해당내용을 근거로 보고서를 만들어 보기로 한다.
이제까지 data view와 data environment에 대해서 설명하였다. 지금부터는 연결한 데이터를 가지고 data report를 만들어 본다. 앞에서 언급한 바와 같이 보고서를 만드는 방법은 두가지가 있는데, 이 장에서는 data report로 보고서를 만드는 방법에 대해서 설명한다. 실제 업무를 하는데 있어서 데이터를 입력, 수정, 삭제등의 작업을 하는 것은 중요하다. 하지만 이 업무에 추가하여 보고서를 만드는 일은 비즈니스에서는 중요한 일일 것이다. visual basic6.0에서 추가된 기능인 data report에 대해서 알아본다.
data report소개
microsoft data report디자이너는 결합된 계층구조의 보고서를 작성할 수 있는 범용의 data report생성 프로그램이다. data environment디자이너와 같은 데이터원본과 함께 사용하여 서로 다른 몇가지 관계형 테이블로부터 보고서를 작성할 수 있다. 인쇄할 수 있는 보고서를 작성할 수 있을 뿐만 아니라 보고서를 html이나 텍스트파일로 내보낼 수도 있다.
data report의 용도
- 인터넷에서 바로 배포할 수 있도록 html형식으로 내보내는 보고서를 자동으로 작성할 수 있다.
- 매일 발생하는 거래의 총합을 보여주는 보고서를 작성할 수 있다.
data report의 특징
- 필드 끌어서 놓기 기능
필드를 microsoft data environment디자이너에서 data report디자이너로 끌어올 수 있다. 이렇게하면 visual basic은 자동으로 data report에 textbox컨트롤을 작성하고 끌어온 필드의 dataMember와 dataField속성을 설정한다. 또한 command개체를 data environment디자이너에서 data report디자이너로 끌어올 수 있다. 이 경우 command개체에 포함된 각 필드에 대하여 textbox컨트롤이 data report에 작성되며 각 입력란에 대한 dataMember와 dataField속성이 적절한 값으로 설정된다. - 도구상자 컨트롤
data report디자이너의 특징은 자신의 컨트롤 집합이 있다는 것이다. data report디자이너가 프로젝트에 추가될 때 data report라는 새 도구상자 탭에 컨트롤이 자동으로 작성된다. 대부분의 컨트롤은 기능적으로 visual basic의 기본 컨트롤과 동일하며 label, shape, image, textbox, line컨트롤등이 있다. 여섯째 컨트롤인 function컨트롤은 sum, average, minimum, maximum등의 네가지 정보중 하나를 자동으로 생성한다. - 인쇄 미리보기
show메서드를 사용하여 보고서를 미리 볼 수 있다. data report가 작성되어 자신의 창에 표시된다.(인쇄 미리보기모드로 보고서를 보려면 시스템에 프린터가 설치되어 있어야 한다.) - 보고서 인쇄
print report메서드를 호출하여 프로그램 방식으로 보고서를 인쇄할 수 있다. data report가 미리보기모드로 되어 있으면 도구모음의 인쇄 아이콘을 눌러 인쇄할 수도 있다.(보고서를 인쇄하려면 시스템에 프린터가 설치되어 있어야 한다.) - 파일 내보내기
export report메서드를 사용하여 data report정보를 내보낸다. 내보내기 형식에는 html과 텍스트형식이 있다. - 내보내기 템플릿
export report메서드에 사용되는 파일 템플릿 컬렉션을 작성할 수 있다. 이것은 보고서의 형식에 각각 맞추어진 다양한 형식으로 보고서를 내보낼 때 유용하다. - 비동기 작업
dataReport개체의 printreport와 exportReport메서드는 비동기적으로 동작한다. processingTimeOut이벤트를 사용하여 이들의 상태를 감시하고 시간이 너무 많이 걸리는 작업은 취소할 수 있다.
dataReport의 개체들
- dataReport개체
dataReport개체는 visual basic폼과 비슷하며 비주얼 디자이너와 코드모듈을 모두 가지고 있다. 디자이너를 사용하여 보고서의 레이아웃을 작성한다. 또한 디자이너의 코드모듈에 코드를 추가하여 프로그램 방식으로 디자이너에 포함되는 컨트롤이나 구역의 형식을 지정할 수 있다. - section개체
dataReport디자이너의 각 구역은 section컬렉션의 section개체로 표현된다. 디자인모드에서 각 구역은 구역을 선택하기 위해 마우스단추를 누를 수 있는 머리글과 컨트롤을 놓아 위치시킬 수 있는 구역창으로 표현된다. 보고서를 작성하기 전에 개체와 개체속성을 사용하여 동적으로 보고서를 재구성할 수 있다. - data report컨트롤
data report디자이너에서만 작동되는 특정 컨트롤이 포함되어 있다.(참고 - data report디자이너에서는 visual basic기본 컨트롤이나 어떠한 activeX컨트롤도 사용할 수 없다.) 이들 컨트롤은 visual basic도구상자에 있지만 "dataReport"라는 별도의 탭에 놓여진다.
data report디자이너 구역
기본 data report디자이너에는 다음과 같은 구역이 있다.
- 보고서 머리글
보고서의 맨 처음에 나타나는 보고서 제목, 작성자 또는 데이터베이스 이름과 같은 텍스트가 포함된다. 보고서 머리글이 보고서의 첫 페이지가 되게 하려면 forcePageBreak속성을 rptPageBreackAfter로 설정하면 된다. - 페이지 머리글
보고서 제목과 같이 매 페이지의 상단에 나타나는 정보가 포함된다. - 그룹 머리글/바닥글
data report의 "반복"구역을 포함한다. 각 그룹 머리글은 그룹 바닥글과 짝을 이룬다. 머리글과 바닥글 한 쌍은 data environment디자이너에서 하나의 command개체와 연관된다. - 자세히
보고서 제일 안쪽의 "반복"부분(레코드)을 포함한다. 자세히 구역은 data environment계층구조에서 최하위 command개체와 연관된다. - 페이지바닥글
페이지 번호와 같이 매 페이지의 하단에 나타나는 정보가 포함된다. - 보고서 바닥글
요약 정보나 주소, 담당자 이름같이 보고서의 맨 마지막에 텍스트가 포함된다. 보고서 바닥글은 마지막 페이지 머리글과 페이지 바닥글 사이에 나타난다.
dataReport컨트롤
새 data report디자이너가 프로젝트에 추가되면 아래의 컨트롤이 dataReport라는 도구상자 탭에 자동으로 놓여지게 된다.
- textbox(rptTextBox)
텍스트의 형식을 지정하거나 dataFormat을 지정할 수 있다. 디자인 모드에서 사용자가 입력한 정보를 표시할 수 없으며, 실행모드에서 데이터를 입력하는 데 사용할 수 없다. - label(rptLabel)
필드나 구역을 식별할 수 있도록 보고서에 레이블을 달 수 있다. label컨트롤은 사용자가 텍스트를 직접 바꿀 수 없도록 텍스트를 표시하는데 사용하는 그래픽 컨트롤이다. dataReport디자이너 버전의 label컨트롤은 응용프로그램에 텍스트를 표시하는 방법을 제공하는 점에서 표준 visual basic 고유 label컨트롤과 비슷하다. 그러나 이러한 기본적인 기능이외에 표준 label컨트롤의 일부 속성은 data report버전에서 사용할 수 없다. - image(rptImage)
보고서에 그래픽을 넣을 수 있다. 이 컨트롤은 데이터필드에 바인딩될 수 없음에 유의하여야 한다. image컨트롤은 확장 메타파일, jpeg, gif파일뿐만 아니라 비트맵, 아이콘, 메타파일의 그래픽을 표시할 수 있다. data report디자이너 버전의 image컨트롤은 응용프로그램에 이미지를 표시하는 점에서 표준 visual basic고유 image컨트롤과 비슷하다. 그러나 이러한 기본적인 기능이외에 표준 image컨트롤의 일부속성은 data report버전에서 사용할 수 없다. - line(rptLine)
보고서에 선을 그려 구역을 더 잘 식별할 수 있게 한다. line컨트롤은 가로, 세로 또는 대각선을 나타내는 그래픽컨트롤이다. dataReprot디자이너 버전의 line컨트롤은 응용프로그램에 줄을 표시하는 점에서 표준 visual basic 고유 line컨트롤과 비슷하다. 그러나 이 컨트롤은 x, y좌표를 사용하여 줄의 모양을 결정하는 대신 lineSlant속성을 사용하여 줄이 기울어진 방향을 결정한다. - shape(rptShape)
shape컨트롤은 보고서에 직사각형, 정사각형, 타원형, 원형, 둥근 직사각형, 둥근 정사각형을 나타내는 그래픽 컨트롤이다. data Report디자이너 버전의 shape컨트롤은 응용프로그램에 특정도형을 표시하는 방법을 제공하는 점에서 표준 visual basic shape컨트롤과 비슷하다. 그러나 이 컨트롤은 borderWidth, fillColor, fillStyle속성을 지원하지 않는다. - function(rptFunction)
function컨트롤은 기본제공된 다양한 함수를 사용하여 실행모드에서 계산되는 숫자를 표시한다. 이것은 곧 보고서가 작성될 때 값을 계산하는 특수한 textBox이다. function컨트롤은 data report디자이너의 그룹바닥글 영역에만 놓을 수 있다. data environment역시 function컨트롤과 일부 기능이 비슷한 계산 필드의 기능이 있다.- sum : 필드값의 총합을 구한다.
- min : 필드의 최소값을 표시한다.
- max : 필드의 최대값을 표시한다.
- average : 평균값을 표시한다.
- standard deviation : 숫자열의 표준편차를 표시한다.
- standard error : 숫자열의 표준 오류를 표시한다.
- value count : null이 아닌 값을 갖는 필드의 개수를 표시한다.
- row count : 보고서의 영역에 있는 행의 갯수를 표시한다.
이 함수들은 실제 data를 조작하기위해 필요한 것이다.
보고서를 만들기위해 필요한 몇가지가 있다. 우선 data environment를 설정해주는 것이고, data report를 사용하여 보고서 틀을 만드는 것이다. 우선 data environment를 사용하여 사용할 DB를 연결한다.
DB연결
- 먼저 data environment를 추가하고 새로운 "myDB"란 이름의 connection을 추가한다. 여기에서 myDB를 연결해 주도록 한다.
- 다음은 "table_join"이란 이름으로 command를 추가한다. 이때 중요한 점은 우리가 사용할 테이블을 설정하는 것이다. 여기에서 myDB.mdb안의 student테이블과 eng_score테이블을 join시켜서 하나의 보고서를 만들고자 한다.
- 속성을 확인하여 [일반]탭에서 [sql문]을 선택하고 [sql작성기]를 선택한다.
- sql작성기를 선택하면 data view창과 함께 sql디자인창이 나타난다. sql디자인창은 다음과 같이 구분되고 data view나 data environment에서 사용할 테이블을 다이어그램 부분에 끌어와서 data를 조작한다. 각 창중에 숨기고 싶은 부분이 있다면 [보기]메뉴에서 [창 표시]에서 선택을 해주면 된다.
- 여기에서는 data view창에서 student테이블과 eng_score테이블을 다이어그램창에 끌어다 놓고 student테이블에서는 number와 name필드를 eng_score테이블에서는 mig와 final필드를 선택하고 실행시키도록 한다.
- 여기에서 실행이란 sql문의 실행을 의미하는 것으로, sql디자인 창에서 마우스 오른쪽버튼을 클릭하고 실행을 클릭하거나 [쿼리]메뉴에서 [실행]을 선택하는 것을 말한다. 이렇게 실행을 선택하면 결과창에 쿼리결과가 나온다. 여기에서 다이어그램 창에 체크를 하면 sql창은 자동으로 생성된 sql문을 보여준다.
- 우리가 원하는 결과가 나왔으므로 이제는 이 결과를 새로운 테이블로 만들도록 한다. sql디자인 창에는 오른쪽 마우스를 클릭하고 [make table 쿼리]를 선택한다. 또는 [쿼리]메뉴에서 [형식 바꾸기-make table 쿼리]를 선택한다. 여기에서 table이름은 sql_table로 주도록 한다.
[make table 쿼리]를 선택한 후 재실행하여 해당내용을 갱신하고 INTO문은 삭제/재실행하도록 한다. INTO문은 data environment의 table_join의 하위필드를 확장하지 못하는 결과를 가져올 수 있다. - 그러면 sql_table이 myDB.mdb에 추가되었을 것이다. data view창에서 [새로고침]메뉴를 클릭하거나 data environment창을 활성화하여 확인을 해보자. 여기서 주의할 점은 결과 창에 쿼리결과가 나온 것을 확인한 뒤에 저장을 하여야 한다는 것이다. 나오지 않으면 [SQL 실행]을 다시 하고 SQL디자인 창을 종료한다. 그러면 다음과 같은 결과를 볼 수 있을 것이다.
사용할 테이블을 만들었으므로 data report를 만들어본다.
- [프로젝트-data report추가]메뉴를 클릭하여 data report창을 불러온다.
- data environment에서 연결시켰던 table_join을 data report의 [페이지 머리글]부분에는 label을, [자세히]부분에는 textbox컨트롤을 끌어서 옮긴다. 그리고 보기좋게 적절히 배치시키고 속성창에서 font크기/굵기를 조절한다. 페이지 머리글에 line컨트롤을 이용하여 선을 그어준다.
- data report속성을 설정한다.
속성설정
dataReport1
└ dataSource : dataEnvironment1
└ dataMember : table_join label1
└ alignment : rptJustifyCenter
└ caption : 학번label2
└ alignment : rptJustifyCenter
└ caption : 이름label3
└ alignment : rptJustifyCenter
└ caption : 중간고사 점수label4
└ alignment : rptJustifyCenter
└ caption : 기말고사 점수 txtNumber
└ alignment : rptJustifyCenter
└ backStyle : rptBkOpaque
└ dataField : numbertxtName
└ alignment : rptJustifyCenter
└ backStyle : rptBkOpaque
└ dataField : nametxtMid
└ alignment : rptJustifyCenter
└ backStyle : rptBkOpaque
└ dataField : mid
└ dataFormat : 숫자txtFinal
└ alignment : rptJustifyCenter
└ backStyle : rptBkOpaque
└ dataField : final
└ dataFormat : 숫자
- 그리고 각 textbox와 label컨트롤의 backColor를 적절히주면 훨씬 보고서를 보기 쉬워진다. 이는 다른 셀과의 구분을 줄 수 있다. 더불어 다른 속성에 대해서도 적절히 조절하면 좋다.
- 이제 보고서의 머리글을 작성해 본다. [보고서 머리글]부분에 클릭을 한 뒤 마우스의 오른쪽 버튼을 눌러 [컨트롤 삽입]메뉴를 선택한다. 그러면 여러 삽입가능한 컨트롤이 나타나게 된다. 그 중에서 보고서 제목을 선택한다. 그리고 속성을 다음과 같이 바꾸어 주고, 보고서 제목을 둘러싸도록 shape컨트롤을 선택하여 네모를 만들어 준다.
속성설정
label5
└ alignment : rptJustifyCenter
└ caption : 학생 데이터 보고서
└ font : 굴림 16pt, 굵게
- 이제 [프로젝트]메뉴에서 시작개체를 'data report1'로 바꾸어서 실행을 시켜보도록 한다.
여기에서 프린트 아이콘을 선택하면 이 form이 자동으로 출력될 것이다. 여러분이 지금까지 만든 보고서는 있는 data를 display하는 것에 불과하다 이제는 함수를 이용하여 그 값을 이용한 보고서를 만들어 보도록 한다. - 실행시켰던 프로젝트를 종료하고 function컨트롤을 사용하여 각 점수의 합과 평균을 구한다.
도구상자에서 function컨트롤을 클릭하여 보고서 바닥글로 끌어서 놓는다. default로 sum함수가 정해져 있으므로, label컨트롤을 보고서 바닥글에 추가한다. 다음과 같이 속성을 변경한다.
속성설정
label6
└ alignment : rptJustifyCenter
└ caption : 점수 합계label7
└ alignment : rptJustifyCenter
└ caption : 점수 평균 functoin1
└ alignment ; rptJustifyCenter
└ dataField : mid
└ dataFormat : 숫자
└ dataMember : table_join
└ functionType : rptFuncSumfuncton2
└ alignment : rptJustifyCenter
└ dataField : final
└ dataFormat : 숫자
└ dataMember : table_join
└ functionType : rptFuncSumfunction3
└ alignment : rptJustifyCenter
└ dataField : mid
└ dataFormat : 숫자
└ dataMember : table_join
└ functionType : rptFuncAvefunction4
└ alignment : rptJustifyCenter
└ dataField : final
└ dataFormat : 숫자
└ dataMember : table_join
└ functoinType : rptFuncAve
- 그리고 f5키를 눌러 시켜보도록 한다. 점수합과 평균을 확인한다.
끝으로 data report를 실행시키는 방법에는 두 가지가 있는데, 첫번째 방법은 위에서 설명한 것과 같이 프로젝트 메뉴에서 시작개체를 바꿔주는 방법과 폼에서 command버튼을 추가하여 코딩을 하는 방법이다. command버튼을 사용하여 click이벤트에서 "dataReport1.show"를 코딩하면 data report가 실행될 것이다.