PROGRAMMING WORKSHOP

VB.Net |
System.Data.DataSet...DB데이타 저장하기..

앞의 페이지에서 관계가 정상적으로 이루어진 테이블들을
콘트롤의 데이타쏘스로 활용하면 여러개의 콘트롤이 동기화
되어 움직이는 것을 보았다
이제 억세스의 NorthWind.mdb화일의 메인폼과 같은 기능을 만들어 보자
억세스를 학습하시는 분들도 도움이 될 것이니..
잘 보시면 좋을 것이다



위의 그림이 northwind.mdb화일의 메인 작업폼이다
이 폼의 입장에서 Orders(주문테이블)이 메인이고
나머지..모든 직원테이블, 운송회사테이블, 고객테이블
주문내역테이블등은 모두 참조테이블과 같은 역할이 되는 셈이다
하나의 주문이 이루어질때..이것이 회사의 하나의 수익모델이라고
할 수 있는 것이고..
이런 관계를 유지하려면 관계형테이블의 컨셉을 갖고 있지 않으면
구현하기 힘들어 진다
주문테이블에서의 정보는 오직 직원ID, 고객ID,주문상세ID,
운송회사ID와 같은 다른 테이블과 연결고리(Foreign Key)의
정보만 갖고 있고 자체가 갖고 있는 정보는 이런 여러개의
고리가 연결된 날짜정보만 갖고 있을 뿐인 것이다
또는 거래건에 대한 상세한 정보도 Orders테이블에 갖고
있을수 있을 것이다
여러분이 어느 싸이트에 회원으로 가입했다면 줄줄이 개인정보가
있겠지만 이중의 하나 ID만 다른 곳에서 갖고 있다면
개인정보중의 어느 것이라도 이 ID하나면 참조할수 있는 것이다
회원으로서 그 싸이트와 어떤 거래를 계속 한다면
거래되는 내용을 관리하는 테이블은 그냥 단순히 여러분의 ID만
참조하고 있으면 되는 것이다

조금 복잡해진다 싶을때..
이쯤되면 포기하시는 분들이 슬슬 나올 것 같다
포기하는 분들은 그냥 포기하시고..가실분들은 계속 가시고
Orders테이블을 Details타입으로 DataSource창에서 정한후
윈도우에 끌어다 놓으면 아래의 그림과 같을 것이다



주문을 하면 발생하는 주문날짜, 배송주소,배송비등의
주문테이블의 자체정보와 더불어 빨강색으로 표시한
관련정보, 주문한 고객은 누구, 주문을 담당한 직원은 누구
주문을 배달할 운송회사는 누구..라는 외부테이블의 정보가
빨강색으로 연결된 것이다
이런 주문에 직원의 상세한 정보를 모두 넣을필요도 없을 것이고
고객에 대한 기타정보를 줄줄이 같이 표현할 필요도 없을 것이고
운송회사의 관련정보를 또한 표현할 필요가 없을 것이다
그냥 나중에 필요하면 연결된 빨강색 ID가 중간고리역할을 하여
얼마던지 필요한 정보를 뽑아내게 되는 것이다

위의 빨강색정보는 모두 텍스트박스로 자동으로 만들어졌고
이곳에 나타나는 정보는 ID정보..사람이 인식하기 고약한
숫자라는 것이 문제다
지난 페이지에서는 DataGridView상에서 콤보상자를 만들어서
연결 ID(Foreign Key, 외부키)를 이용하여 이름을 나타나게 하였듯이
위의 텍스트박스도 콤보상자로 바꾸는 것이 좋을 것이고
그 작업이 이번 페이지의 주제가 되겠다

또한 자동으로 만들어지는 텍스트박스등의 크기와 위치를
적절히 각자의 입맛에 맞게 배치하여도 좋은 것이고
필요없는 것은 삭제해도 좋고..예를 들면 OrderID같은 것은
자동으로 생성되는 일련번호이므로 입력하거나 수정하는 값이
아니므로 삭제를 해도 좋고 Enabled=False로 하여 비활성화를
시켜도 좋은 것이고.. 자동생성된 라벨의 Text도 인식하기 좋은
이름으로 바꾸어도 좋고..
이런 결정을 내리려면, 각 휠드값의 성격을 잘 알고 있어야 하는 것



콤보상자로 바꾸려는 텍스트박스가 있다면 어떤순서를 밟아야 하나??
앞페이지를 기억하시면 되는데..
LookUp테이블을 만들어야 한다
콤보상자에서 사용할 LookUp(참조테이블)..그럼 이것은 어떻게 만드나??
DataSet을 또 추가하면 될 것이다
프로젝트를 진행하다보면 수많은 DataSet, BindingSource등이
지저분하게 계속 윈도우폼 하단에(이것을 Component Tray라고 한다)만들어 질 것이고..
그럼 위의 그림에서 보듯이 Lookup테이블을 3개 만들어야 하는 셈이네...맞다!!
엑셀시트에서도 유효성검사에 목록을 하나 만들더라도 참조목록(Lookup Table, LookUp List)을
만들었던 기억이 나면 상식선에서..아하..별로 이상할 것이 없는 것!!
Orders테이블을 윈도우에 끌고 올때..
각휠드의 콘트롤의 타입을 변경시키고 끌고 오면 시간을 절약할수 있을 것이다



그리고 콘트롤의 DataSoruce만 적절히 설정하면 될것이고..

그러나 모두 텍스트박스로 끌고 왔다치고..
이것을 콤보상자로 바꾼다
바꾸기전에 Lookup Table..참조테이블..
LookUp List..참조목록..라고 하는 것이 좋겠다
이런 용어들때문에 실은 헷갈리게 되는 것이다
개념을 아는 것이 중요하지 헷갈리는 이름에 헷갈리지 마시기를..



이름을 customerLookUpDataSet 이라고 지어주면 좋겠고
그래서 DataSet이 하나 만들어졌다..프로젝트창(소루션창)에도
나타나고 DataSource에도 나타났다
이제 도구상자에서 Bindingsource를 하나 끌어다 놓고
이름을 customerLookUpBindingSource라고 지어주고
customerLookUpBindingSource 의 DataSourc를 아래의 그림과같이
셋팅해준다 다음은..
윈도우폼상의 CustomerID 텍스트박스를 삭제하고
대신에 콤보상자를 그려 넣는다



콤보상자를 선택후 오른쪽에 나타나는 화살표를 크릭하면
Unbound Mode라고 되어 있다
이것은 현재 목록도 없고 빈탕.. Binding되지
않은 상태라는 것을 의미한다

콘트롤의 바인딩된 상태와 언바인딩상태와는 전혀 다르다
이것을 체크박스를 체크하여 바인딩상태로 바꾼다
그러면 어떻게 바인딩하겠냐고 목록이 나타난다

1,DataSorce= customerBiningSource 로하고
2,DisplayMember=companyName으로 하고
3,ValueMember=customerID 로 하고
4,SelectedValue= ordersBindingSource.customerID

라고 설정해주면 끝났다
폼을 로딩시키면 콤보상자가 Orders테이블과 잘 연결이 된 상태를
볼 수 있을 것이다
이런 설정은 모두 프로그래밍적으로 처리할수 있으나
컨셉을 좀더 잘 관찰하시도록 하기 위하여 이렇게 용을 쓴다

위의 3번과 4번을 헷갈려 하는 경우가 많으니
유심히 잘 기억하여 두시는 것이 좋을 것이다

4번은 Orders테이블의 BindingSource인 OrdersBindingSource의
customerID가 되는 것이고 콤보상자에서 값을 바꾸면
ValueMember가 바뀌고 이것이 SelectedValue와 잘 관계를
유지하고 있는 것!!!
DisplayValue는 그야말로 그냥 눈에 보이는 쇼윈도의 값일뿐인것이다
엑셀셀의 진정한 값(Value)과 서식된 값(Text)가 있다는 것을
상기하시면 모든 것이 엑셀의 기능과 성질머리와 흡사하다
그러니 엑셀을 진정 잘 이해하면 모든 것이 이해되게 된다
어느 새로운 것이 나타나도 엑셀의 원리를 생각하면 된다
그러니 엑셀을 수박겉핥기로 하지 말고 잘 이해하고
깊이 관계를 유지하는 것이 모든 다른 생각으로의 확장의
기초가 된다

나머지 EmployeeID와 ShipperID 두개의 텍스트상자도
콤보상자로 바꿔주기 위하여
DataSet을 employeeLookUpDataSet---직원참조콤보용
DataSet을 shipperLookUPDataSet----운송회사참조콤보용
을 만들고 BindingSourc두개를 끌어다 놓고 이름을 각각
employeeLookUpBindingSource와
shipperLookUpBindingSource를 만들고
텍스트박스를 각각 콤보상자로 바꾼후 아래와 같이 속성을
위의 요령과 같이 주면 된다



엑셀에서와 잘 지내다가..이거 원...콘트롤을 끌어 오고
수많은 콘트롤에 여엉 헷갈리고..이놈이 저놈같고..저놈이 이놈같고
속성을 주고..여엉 체질에 안맞네!!라고 할 수도 있을 것이다
그래서 이름을 짓는다고 하는 것이 참으로 중요한것이다
이름을 잘 지어주면 두고 두고 편리하고
이름을 헷갈리게 지어주면 두고..두고 골치를 앓는다!!
그러니 엑셀에서도 변수이름, 프로시져이름, 범위에 이름짓기등에
대하여 좀더 관심을 갖는다면 이와 같은 작업이 그렇게 낯섫지
않게 된다
이름짓기에 좀더 관심을 갖으시도록!!

위의 폼이 완성되지 않은 상태다..
뭐가 있어야 할까..
여기에서 뭐가 있어야 할까..라는 문제의 답은
northwind.mdb화일을 구성하고 있는 업무프로세스..
테이블간의 관계를 잘 이해하고 있다면 당연히 무엇이 필요한지 안다
하나의 주문을 받으면 관련된 테이블은 위에서와 같이
담당직원이 누구였고
고객이 누구였고
운송회사가 어느 회사였고 라는 내용이 위의 폼에 완성이 된 것이다
중요한 것은
이 하나의 주문에서
어떤 상품을 어떤 가격에 몇개를 주문 받았는지가
추가되어야 할 사항이 되는 것이다
그럼 하나의 주문을 받는 프로세스가 완성이 되는 것이고
이것이 DB의 Orders테이블에 계속 추가 되거나 수정되게 되는 것이다
Orders테이블이 실제영업활동을 하는 테이블이고
나머지 테이블들은 한번 입력하면 Static(정적)으로 별로
변경없이 존재하게 되는 것..Orders테이블만 열나게 바쁜것일 것이다
물론 각각의 직원,고객테이블등도 별도로 추가되고 변경되기도 하지만
Orders테이블같이 바쁜 테이블이 아닌..참조개념의 테이블이 되는 셈이다

이제 Ordders테이블과 철저한 관계가 있는 Order Details(주문내역)테이블을
DataSource에서 선택하여 폼의 하단에 끌어다 놓는다
이때 Order Details테이블의 콘트롤 타입은 DataGridView로 선택후..



끌어온 후 DataGridview콘트롤의 속성중 Anchor속성에서
그림과 같이 오른쪽도 앙카를 시켜주면 폼을 옆으로 확장하면
자동으로 DataGridView도 확장되어 테이블의 모양을 모두 볼수 있어서
편리하다
DataGridView의 열편집을 통하여 productID를 콤보상자로 바꾸기만
하면 모두 완변한 주문관리도구가 완성된다
앞에서 했었지만 다시 복습하는 의미에서
1)상품명을 쉽게 선택할수 있게 하기 위하여 DataSet을 하나 만들고
2)이것을 연결할 BindingSource콘트롤을 삽입하여 DataSet을 연결
3)DataGridview콘트롤의 열편집을 통하여 ProductID열을 콤보상자로 변경
4)콤보상자의 DataSource를 위의 BindgingSource콘트롤로 연결하고
5)콤보상자의 Displaymember와 ValueMember를 각각설정하면 끝!!



이 폼 하나면 실시간 주문프로세스의 관리가 되는 것
윈도우폼을 통한 DB관리도구를 만들고 싶다면 이것을 꼭
만들어 보시고, 몇번 만들어 보시면 ..모든 것이 감이 잡히게 된다

위의 내용을 만들다보면 데이타처리관련 개체들이 잔뜩
윈도우포밑의 트레이에 쌓여간다..
한참하다 보면 헷갈린다..어느 개체가 무엇과 연결되었는지..
이것에 대한 목록이 [도구상자]에 만들어졌으니 이것을 크릭하면
해당 개체를 찾아준다



이제 마지막 처리단계
편집을 하거나 추가삭제하거나 한후 저장 버튼을 크릭하면
원본에 저장이 되어야 한다
다음 페이지에서 계속 하자