Q&A

  • 데이타베이스에 관한 중요한 질문
안녕하세요?

프로그램 개발중에 잘 안되는 것이 있어

이렇게 질문을 드립니다.



현재 데이타베이스 관련 프로그램을 개발하고 있습니다.

제가 질문하고자 하는것은 마스터/디테일 관계입니다.



예를 들어 aa.db와 bb.db가 마스터/디테일 관계일때,

값의 입력시 문제가 발생합니다.



table 컴포넌트를 이용하여 화면에 각각 aa.db의 내용을

보여줄 수 있는 dbgrid1와 bb.db의 내용을 보여줄 수

있는 dbgrid2가 있으면 dbgrid1에 내용변화에 따라

dbgrid2의 내용이 변하겠지요..



근데, dbgrid1와 dbgrid2에 데이타를 추가 하려고 할때

문제가 발생합니다. aa.db에 append를 하고 dbgrid1에서

값을 넣고 , 마우스의 포커스를 dbgrid2로 옮겨 계속

값을 입력하려고 합니다.



이때 , aa.db에 post를 하지않은 상태에서 dbgrid2에

한 레코드가 아니고 여러줄의 레코드를 입력하려고 하면

key violation이 발생합니다. 제가 생각하기로는 dbgrid2,

즉 bb.db는 마스터테이블의 주키를 참조하여 값을

보여주고 하는데, 새로운 값 입력시 aa.db에 입력된

값은 아직 post가 안된 메모리상에 있는 값이라 bb.db에서

그 상태로 값을 입력하려고 하니 인식을 못하는것 같습니다.



그래서 dbgrid2에 포커스가 갈때 dbgrid1의 내용을 post하고

싶지만, 후에 값의 cancel시 값을 다시 지워야 하는 문제가

발생되네요.



다르게, dbaware컨트롤을 사용하지 않고 일반 edit같은

컨트롤을 사용하여 값이 확정될때 대입해보려고도 했지만,

필드라든가 여러가지 문제로 하지 못하게 되었습니다.



혹시라도 table컴포넌트를 이용하여, 마스터/디테일 구조에서

마스터테이블과 디테일테이블에 동시에 값을 추가하면서

그리고 디테일테이블에 연속적으로 값을 추가하고자 할때,

위와 같은 에러없이 post와 cancel를 수행할 수 있는

방법 좀 알려주세요...



/////////////////////////////////////////////////////////

그리고 두번째로, 이것도 table컴포넌트를 이용했는데......

여러개의 마스터/디테일로 이루어진 테이블들에서 필요한

필드만 추출해서 dbgrid에 보여줄 순 없는지요.

dbgrid는 특정 datasource와 연결되어서 여러 관련된

테이블의 특정 필드를 한번에 보여줄 수 없네요.....

dblookupcombobox를 쓰려고 하니 연관된 필드의 데이타가

너무 많아 너무 비효율적이라 dblookupcombox도 쓰지

못하겠고요...



query컴포넌트를 이용하지 않고 해결할 수 있는

방법 좀 부탁드립니다.





여러분들의 답변 부탁드립니다.



참, 그리고 혹시 dbgrid에서 dblookupcombobox를 쓸 때,

dblookupcomboboxdm의 값 변경시 값이 즉시 바뀌지 않고

다른 셀이나 다른 컴포넌트로 포커스가 변경되야만

값이 보여지던데, 이것의 해결 방법도 부탁드립니다.



그럼..행운이 있기를 빕니다.

해결 방법도 부탁드립니다.





1  COMMENTS
  • Profile
    rain 1999.04.28 20:48
    음..제 개인적인 의견으로는 table 컴퍼넌트 보다는 query 컴퍼넌트를 사용하시는게 더욱 나을것 같습니다. 저는 예전에 table 컴퍼넌트 때문에 프로젝트 기간을 제대로 채우지 못한 경험이 있어서 (혼났죠..엄청..^^;) 그뒤로는 사용을 자제하고 있답니다.. query 컴퍼넌트를 사용하신다면 지금의 문제점들을 더욱 쉽게 해결하실 수 있을 겁니다.



    물론 부득이한 사정으로 table 컴퍼넌트만을 사용하셔야 된다면, table1에서 table2로의 focus 이동시 table1을 close한 다음 table2를 open하셔서 작업을 하신 다음 table1으로의 이동시 table2를 닫고 table1을 열어주심이 어떠실까 싶습니다. 물론 event 발생은 form active시 발생하면 되겠지요. Form.Activate 부분에 talbe1.open, Form.Deactivate 부분에 table1.close 하시면 되지 않을까 싶습니다. 번거로우시면



    table1.Activate ---> table2.close, table1.open, table1.refresh

    table2.Activate ---> table1.close, table2.open, table2.refresh



    라는 작업을 번갈아가면서 수행하시는건 어떨까요.. 좀 우습죠..--;



    그래서 기왕이면 query 컴퍼넌트를 사용하시는게 좋을것 같다는 말씀입니다.



    첫번째 문제의 원인은 테이블 사용할때 '커서'라는 녀석이 테이블의 컬럼 사이를 헤집고 다니면서 질의를 수행하기 위한 준비를 해주는데, 이 '커서'가 풀리지 않으면 데이터의 입력이나 수정, 삭제등이 정확하게 수행되지 않습니다. 만약 데이터를 삭제하려고 del 버튼을 눌렀는데, key violation이 발생하게 되지요. 하지만 실제 테이블에서는 삭제처리는 되어 있는 경우가 많습니다. '커서'를 잡지 못해서 이지요..

    table 컴퍼넌트만을 사용하셔야 한다면 open, close, refresh events를 적절히 활용해 보세요..



    두번째 문제의 경우도 query 컴퍼넌트를 사용하시면 정말, 엄청 편하게 해결하실 수 있는 문제가 아닙니까..?



    디비그리드가 특정 datasource와 연결되어서 여러 관련된 테이블의 특정 필드를 한번에 보여줄 수 없다면, 필요한 값을 보여주고 싶을때 기존의 연결을 잠시 끊어두는 방법은 어떨까요..그리고 필요한 작업을 수행한 후에 다시 연결을 붙여주면 될것 같네요..편법은 아닙니다. 많이들 이렇게 쓰고 있던데요..^^;



    dblookupcombobox는 제가 써보질 않아서 잘 모르겠습니다만, 값을 집어넣으실때 데이터베이스에서 올라오는 값을 배열로 받아서 그 값을 콤보박스에 올려보시는 방법도 좋을것 같습니다. 물론 동적으로요. 전 Delphi Component 들 중에서 제일 맘에 안드는게 Data Control 이라서 잘 사용을 하지 안거든요.. 대신 일반 컴퍼넌트들을 사용한답니다. DBComboBox 대신 ComboBox를, DBEdit 대신 Edit를, DBListBox 대신에 ListBox를 쓰거든요. 이게 더 편하드라구요..



    그럼...