Q&A

  • DBGrid에서 강제로 Selection 하기?
DBGrid와 Query를 연결하여 사용하고 있습니다.

'삽입' 버튼을 눌렀을 경우

1) DBGrid에서 1개의 Row가 선택된 상태라면 선택된 레코드의 Secondary Key Field에 1을 더하여 새로운 레코드를 추가하고

2) Row가 선택되지 않은 상태라면 마지막 레코드의 Primary Key Field에 1을 더하여 새로운 레코드를 추가하려고 합니다.

그런데, Query를 Open후 계속 '삽입'버튼을 눌러 작업하면 위 2)의 경우만 발생합니다.

조언을 부탁합니다.
3  COMMENTS
  • Profile
    박재용 2002.05.15 19:07
    삽입버튼이 무엇을 이야기 하는건가요?
    기본적으로 DB에 래코드를 추가하는 방법에는 2가지가 있습니다..
    Append => 이넘은 래코드 제일 마지막에 자료를 추가합니다.
    Insert    => 이넘은 해당 래코드 위치에 자료를 추가합니다..

    삽입버튼의 코딩을 하번 확인해 보세요.. 이런씩으로 되어있는지 &^&

  • Profile
    김경록 2002.05.15 19:06
    질문이 애매모호하군여..
    Row가 선택된 상태라는건 어떤 상태인지를 알고 싶군여..
    혹시 입력상태가 아닌 그냥 선택 상태라는 건지..
    만약, Row선택이라는건 입력상태가 아닌
    한 Row가 파란줄로 끄인 상태(입력상태가 아닌)를 말하고,
    Row가 선택되지 않은 상태.. 그러니까.. 입력상태이면..

    님이 말씀하신데로 할 수 가 있습니다..

    If DBGrid1.Options in [dsRowSelect] Then
        Secondary에 + 1추가 액션
    else
        Primary에 + 1 추가 액션;

    답이 되셨길..



  • Profile
    김규상 2002.05.15 19:33
    죄송합니다... 제대로 된 질문이 아니라서...

    DBGrid의 Options중 dsRowSelect는 True로 하였습니다.
    그리고, Query의 BeforeInsert와 AfterInsert 이벤트를 아래와 같이 지정하였습니다.

    아래에서 레코드를 Insert하여 Save후 Insert된 레코드가 Selection 되도록 (Highlight) 되도록 만들려면 어떻게 해야 하는가가 질문의 요지입니다.

    procedure TfrmAvTesti.QryAvTestBeforeInsert(DataSet: TDataSet);
    var
      i : integer;
    begin
      InsOutNum := '';
      InsOutSeq := '';
      if DBGrid1.SelectedRows.Count > 0 then
       begin
         i := DBGrid1.SelectedRows.Count - 1;
         with DBGrid1.DataSource.DataSet do
           begin
             GotoBookMark(pointer(DBGrid1.SelectedRows.Items[i])); // 레코드 이동
             InsOutNum := FieldByName('AV_OUTNUM').AsString;
             InsOutSeq := FieldByName('AV_OUTSEQ').AsString;
           end;
       end;
    end;

    procedure TfrmAvTesti.QryAvTestAfterInsert(DataSet: TDataSet);
    var
      i : integer;
      s, z : ShortString;
    begin
      if ((Trim(InsOutNum)<>'') and (Trim(InsOutSeq)<>'')) then
         s := '*'
      else
         s := '';

      if s = '*' then
           QryAvTest.FieldByName('AV_OUTNUM').AsString := InsOutNum;

      with frmDataDM.CodeMaster do
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT * FROM EVAL_MASTER ');
        if s = '*' then
          SQL.Add('WHERE EV_OUTNUM = :EV_OUTNUM ');
        SQL.Add('ORDER BY EV_OUTNUM, EV_OUTSEQ');
        if s = '*' then
           ParamByName('EV_OUTNUM').AsString := InsOutNum;
        Open;
        Last;
      end;

      if s = '' then
         QryAvTest.FieldByName('AV_OUTNUM').AsString :=
            IntToStr(StrToInt(frmDataDM.CodeMaster.FieldByName('EV_OUTNUM').AsString) + 1)
      else
         //AV_OUTNUM은 위에서 대입하였으므로...AV_OUTSEQ만 증가시킴.
         QryAvTest.FieldByName('AV_OUTSEQ').AsString :=
            IntToStr(StrToInt(frmDataDM.CodeMaster.FieldByName('EV_OUTSEQ').AsString) + 1);
    end;