Q&A

  • 디비 그리드에 관한 질문입니다...
각각 쿼리해온 내용이 DBGrid1과 DBGrid2에 뿌려집니다... DBGrid2에서 원하는 항목을 선택한 후 확인 버튼을 눌러 DBGrid1에 Insert합니다.

DBGrid1에 미리 Insert한 내용을 한눈에 알아보기위해 DBGrid2에서 선택하여 DBGrid1에 넣은 내용은 Color Box로 표시할려고 합니다.DBGrid1과 DBGrid2에 있는 항목들을 비교 할 수 있는 효율 적인 방법을 알려주셔여..........





1  COMMENTS
  • Profile
    정우성 2001.02.10 20:29


    안녕하세요... 정우성입니다.



    질문의 내용을 대략 정리하면..

    -----------------------------------------------------------

    DBGrid2의 내용을 선택하여 DBGrid1로 Insert 했을경우



    기존의 DBGrid1내용과 새로 등록된 DBGrid1의 내용을



    색깔이나.. 또는 기타 방법으로 항목들을 비교 또는 구분한다.

    -----------------------------------------------------------



    이렇게 구현할려면 확인버튼을 눌렀을 경우 바로 DB에 Insert가 되면 안되고



    TQuery를 사용하여 Cachedupdate를 True 지정한 다음 임의의 필드를 추가합니다.



    임의의 필드을 추가하는 방법은 간단합니다.



    //----------------------------------------------------------------------------

    임의의 필드를 추가하는 이유 기존 DATA와 New DATA를 구분하기 위해서 필요함

    //----------------------------------------------------------------------------



    1. DBGrid1의 SQL문 이렇게 작성합니다.

    Select 주민번호, -|

    성명, |

    생년월일, | 실제로 존재하는 필드 입니다.

    성별, | '*'를 사용하시면 안됩니다.

    소속사, -|

    'X' Temp <=== 임의로 추가한 Temp성 필드입니다.

    From 연예인



    2. DBGrid2의 내용을 선택후 확인 버튼 클릭 이벤트에서 아래와 같이 처리합니다.



    With Query1 do

    begin

    Insert;

    FieldByNaem('주민번호').AsString := Edit1.Text;

    FieldByNaem('성명' ).AsString := Trim(Edit2.Text);

    FieldByNaem('성별' ).AsString := ComboBox1.ItemIndex;

    FieldByNaem('소속사' ).AsString := Table1.FieldByNaem('소속사').AsString;

    FieldByNaem('Temp' ).AsString := 'O'; //여기가 중요합니다.

    Post;

    end;

    ==================================================================================

    1. 번에서 기존 DATA를 불러왔을 경우에는 Temp가 'X'로 셋팅되어 있고

    2. 번에서 신규로 등록 할때는 Temp를 'O'으로 셋팅하므로 일단 기존데이타와

    신규등록 된 자료가 구분이 됩니다. 2.번과 같은 경우에는 실제로 등록된 상태가

    아니므로 나중에.. 일괄적으로 실제 DB에 Insert 하여야 합니다.

    참고적으로 UpdateSQL컴포넌트를 사용하면 쉽게 해결될 것입니다.

    ==================================================================================



    3. DBGrid1에서 기존 DATA와 신규 DATA를 구분하여 색깔을 다르게 처리합니다.

    이렇게 하기 위해서는 선행되어야 할 작업이 몇개 있습니다.

    1) 만약 DBGrid1에 Columns(TColumn)추가가 되어 있으면 모두 삭제를 합니다.

    2) DBGrid1의 Columns의 Width 등 기타 설정을 하시려면 DBGrid1의 Query

    컴포넌트에서 처리합니다. 특히 DBGrid1의 ColumnTitle에 필드명이 아닌

    문자열을 넣고 싶으면 Query의 해당 필드의 DisplayLabel에서 입력하시면

    됩니다.

    3) DBGrid1의 Query에서 추가한 Temp 필드의 Visible를 False로 지정합니다.

    => 구지 보여주고 싶지 않으니깐...^^



    4. 1, 2, 3번 같이 처리후 DBGrid1의 DBGrid1DrawDataCell 이벤트에

    아래와 같이 코딩합니다.



    //Temp 필드의 값이 'O'일때 레코드 색을 변경처리한다.

    //즉 신규일때만 'O'이므로 레코드 색변경



    if Field.DataSet.FieldByName('Temp').AsString = 'O' then

    begin

    (Sender as TDbGrid).canvas.brush.Color := $0080FFFF;

    (Sender as TDbGrid).canvas.font.Color := clBlack;

    (Sender as TDbGrid).canvas.FillRect(Rect);

    (sender as TDbGrid).DefaultDrawDataCell(Rect,Field,State) ;

    end

    else

    begin

    (sender as TDbGrid).DefaultDrawDataCell(Rect,Field,State) ;

    end;





    여기까지 오시는데 수고 하셨습니다. ^^



    자 이렇게 하시고 Run를 하여 확인합니다.

    확인 버튼으로 등록하시면 신규는 노란색으로 칠해질거에요..



    아흑.. 안돼면.. 우짜지.. 해보시구여... 안되시면.. 메일 주십시오..

    같이 고민해드리겠습니다..



    그럼.. 즐코하시구여.. 항상 건승하세요...



    음햐햐... 광화문에서 이상 정우성이였습니다..