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를 하여 확인합니다.

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



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

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



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



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



서버에 요청 중입니다. 잠시만 기다려 주십시오...