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를 쓰거든요. 이게 더 편하드라구요..



    그럼...



    • 박종성
    • 1999.07.10 03:07
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 이호선
      1999.04.29 06:02
      안녕하세요. 별다른 것은 없고요 현재 설정된 기본 프린트를 바꿀려하는데 바꿔도 이전설정된 프린트장치...
    • 김종호
      1999.07.12 09:59
      박종성 께서 말씀하시기를... > 안녕하세요! > 윈도우즈 탐색기에서 특정 화일을 선택하고 오른쪽 버튼을...
    • 이정욱
      1999.04.29 21:53
      제가 만든 기본프린터 바꾸는 함수 입니다. 참고하시구요... 이것은 프린터 이름의 일부만 넣어줘도 됩니...
    • 안치봉
      1999.04.29 07:10
      이호선 wrote: > 안녕하세요. > 별다른 것은 없고요 현재 설정된 기본 프린트를 바꿀려하는데 바꿔도 > ...
    • 이정욱
      1999.04.29 05:30
      인쇄루틴을 조금 보여주셔야 답을 찾을 수 있을것 같네요. 이호선 wrote: > 안녕하세요. > HP Laser...
    • 박성훈
    • 1999.07.10 02:17
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이정욱
      1999.07.10 02:56
      제가 이미 답변을 했던것 같은데요... 쩝.. TPrinter클래스는 윈도우의 Printer Driver를 이용합니다. ...
    • 델초보
    • 1999.07.10 01:31
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 권만섭
      1999.04.29 05:27
      여기에 자주 답변 올려주시는 많은 분들께 감사드리면서 저희가 주고객과 주고객의 고객(부고객)을 관리...
    • 정영호
      1999.04.30 07:28
      권만섭 wrote: > 여기에 자주 답변 올려주시는 많은 분들께 감사드리면서 > > 저희가 주고객과 주고객...
    • 안치봉
      1999.04.29 03:38
      장아무개 wrote: > DBGrid name : printer_DBGrid 이고요 > > properties 중에 options 라는 항목 있습...
    • OHJANG
    • 1999.07.10 00:24
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 이호선
      1999.04.29 02:07
      안녕하세요. HP Laserjet프린트기가 현재 기본 프린터기로 설정되있고 프로그램중 PrintSetupDialog에서 ...
    • 이정욱
      1999.07.10 02:54
      Image안에있는 Picture.Bitmap.Canvas의 크기를 늘려주어야 합니다. 즉, Image.Picture.Bitmap.Canvas.H...
    • 이정욱
      1999.04.29 05:30
      인쇄루틴을 조금 보여주셔야 답을 찾을 수 있을것 같네요. 이호선 wrote: > 안녕하세요. > HP Laser...
    • OHJANG
      1999.07.10 04:35
      우선 귀하의 빠른 답변에 감사드립니다... 그러나~~ T.T 말씀하신데로 아래와 같이 이미지의 Bitmap의 ...
    • 이정욱
      1999.07.10 06:07
      Canvas가 빠졌습니다..쩝.. Image1.Picture.Bitmap,Canvas.Width 입니다. OHJANG 께서 말씀하시기를....
    • 안치봉
      1999.04.29 03:38
      장아무개 wrote: > DBGrid name : printer_DBGrid 이고요 > > properties 중에 options 라는 항목 있습...
    • Faster
    • 1999.04.29 00:23
    • 4 COMMENTS
    • /
    • 0 LIKES
    • OHJANG
      1999.07.10 00:14
      질문은 다름아닌 SetActiveWindow에 대한 질문입니다. 델파이1에서 SetActiveWindow(Self.Handle); ...
    • 이정욱
      1999.07.10 02:53
      SetForegroundWindow 함수를 사용해 보세요. OHJANG 께서 말씀하시기를... > 질문은 다름아닌 SetActiv...
    • OHJANG
      1999.07.10 04:30
      제가 글에서 분명히 아래와 같이 밝혔거늘... 쩝... > 예전에 수많은 델파이전문가(?)들이 수많은 종류...
    • 구창민
      1999.07.10 11:53
      OHJANG 께서 말씀하시기를... > 제가 글에서 분명히 아래와 같이 밝혔거늘... 쩝... > 예전에 수많은 델...
    • 1999.07.09 23:42
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 1999.07.09 23:34
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이호선
    • 1999.04.28 09:04
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김영대
      1999.04.28 21:33
      이호선 wrote: > 안녕하세요. > 한 폼에서 프린트가 끝난상태를 알고 폼을 닫을려 합니다. > 프린트가 ...
    • 문창완
      1999.07.09 23:11
      이런 질문 올려도 되는지는 모르지만..죄송... 아이비엠피시 의 프로그램을 맥으로 포팅(맥프로그램으...
    • 이정욱
      1999.07.10 02:51
      C로 되어있다면 맥용 C를 구해서 맥용 OS에 맞는 API들로 변환을 한 후 재 컴파일 해야 합니다. 델파이로 ...
    • Heaven
    • 1999.04.28 17:33
    • 1 COMMENTS
    • /
    • 0 LIKES
    • rain
      1999.04.28 20:48
      음..제 개인적인 의견으로는 table 컴퍼넌트 보다는 query 컴퍼넌트를 사용하시는게 더욱 나을것 같습니다....
    • 유민호
    • 1999.07.09 21:16
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 이호선
      1999.04.28 09:40
      안녕하세요. 일반 Control들의 Drag&Drop은 어떻게 해야 하는지 궁금합니다. 예를들면 Tab Control을 Dra...
    • 신인재
      1999.04.28 20:12
      이호선 wrote: > 안녕하세요. > 일반 Control들의 Drag&Drop은 어떻게 해야 하는지 궁금합니다. > 예를...
    • 이일수
    • 1999.07.09 20:34
    • 3 COMMENTS
    • /
    • 0 LIKES
    • Heaven
      1999.04.28 17:33
      안녕하세요? 프로그램 개발중에 잘 안되는 것이 있어 이렇게 질문을 드립니다. 현재 데이타베이스 관...
    • 이정욱
      1999.07.10 02:58
      델파이에있는 ServerSocket은 다중연결을 지원합니다. 메모리가 허용하는 범위내에서 말이죠. 그리고 ...
    • rain
      1999.04.28 20:48
      음..제 개인적인 의견으로는 table 컴퍼넌트 보다는 query 컴퍼넌트를 사용하시는게 더욱 나을것 같습니다....
    • 심주성
    • 1999.04.26 05:39
    • 4 COMMENTS
    • /
    • 0 LIKES
    • 1999.07.09 20:23
      프로그램을 실행 중 어떤 Item Menu를 Click을 하는 순간에 Name을 가져오는 방법을 가르쳐 주세요.
    • 안치봉
      1999.04.26 19:30
      심주성 wrote: > > 안녕하세요. 완전프로그래밍 초짜입니다. > > delphi4.0을 해볼려구 함 깔아...
    • 조복기
      1999.07.09 20:46
      정 께서 말씀하시기를... > 프로그램을 실행 중 어떤 Item Menu를 Click을 하는 순간에 Name을 > 가져오...
    • 심주성
      1999.04.28 09:40
      안치봉 wrote: > > 안녕하세요. > > 잘은 모르겠지만 델파이4가 일부 그래픽카드와 충돌한다는 설도 ...