Q&A

  • DBGrid에 출력이 되지 않았요.. 도와주세요..
DBGrid에 Table을 select하여 출력하는 것입니다.
아래와 같이 했는데  DBGrid에 데이타가 출력이 되지 않습니다.
물론 Table에는 조건에 맞는 데이타는 존재하고 있어요..
DBGrid에는 table필드 중 2개 필드만 출력해 주고,
폼이 생성될 때 조건에 관계없이 모두 출력이 되도록 연결을 하였습니다.
그리고 폼의 콤보 박스 값에 따라 조건에 맞는 것만 출력을 해주는 것으로
했는데 잘 안되고 있어요...
고수님의 도움을 요청합니다.


procedure TSeqInqForm.ComboBox1Change(Sender: TObject);

begin

  Case StrToInt(copy(TComboBox(Sender).Text,1,2)) Of
    00:begin
          combobox2.Items.Clear;
          combobox2.Enabled := True;
          combobox2.Text := '';
    01:begin
          combobox2.Items.Clear;
          combobox2.Enabled := False;
          combobox2.Text := '';
          w_item_kb := '01';
       end;
   end;

   Stock_code_inq;

end;

procedure Stock_code_inq;
var
   i,ii :integer;
begin

  Try
    queryi1 := Tquery.create(application);
    queryi1.DatabaseName := 'DBTEST';
    if (w_item_kb = '00') or (w_item_kb = '') then
        wk_sql := ' Select * from TT_000_IF    ' +
                  '  order by St_kbn1, St_kbn2 '
    else
    if (w_item_kb = '01') or (w_item_kb = '02') then
        wk_sql := ' Select * from TT_000_IF   ' +
                  '  where St_kbn1 = :sb1     ' +
                  '  order by St_code         '
    else wk_sql := ' Select * from TT_000_IF   ' +
                   '  where St_kbn2 = :sb2     ' +
                   '  order by St_code         ';

  // wk_sql의 값이 두번째입니다. wk_item_kb => '01'

  with queryi1 do
  begin
      Close;
      SQL.Clear;
      SQL.Add(wk_sql);
      if (w_item_kb = '00') or (w_item_kb = '') then
      else
      if (w_item_kb = '01') or (w_item_kb = '02') then
          queryi1.params.ParamByName('sb1').Value := w_item_kb
      else
          queryi1.params.ParamByName('sb2').Value := w_item_kb;

      try
         open;
      except
         on E: EDBEngineError do
         begin
            sterr_no := inttostr(E.Errors[0].ErrorCode);
            sterr_pg := 'SeqInq';
            sterr_tb := 'TT_100_IF';
            sterr_mg := E.Message;
            w_return := 'S100';
            Error_msg := sterr_no + ' : ' +
                         sterr_pg + ' : ' +
                         sterr_tb + ' : ' +
                         sterr_mg + ' : ' +
                         w_return;
            TEST_error(Error_msg);
         end;
         on E: Exception do
         begin
            sterr_pg := 'SeqInq';
            sterr_tb := 'TT_100_IF';
            sterr_mg := E.Message;
            w_return := 'S101';
            Error_msg := sterr_no + ' : ' +
                         sterr_pg + ' : ' +
                         sterr_tb + ' : ' +
                         sterr_mg + ' : ' +
                         w_return;
            TEST_error(Error_msg);
         end;
      end;

  end;

  EndFlag := false;

  while (not queryi1.eof) and (EndFlag = false) do begin

      if queryi1.eof then EndFlag := true
      else begin

         with SeqInqForm do
         begin
            DBGrid1.Columns[0].FieldName
            := queryi1.fieldbyname('St_code').asstring;
            DBGrid1.Columns[1].FieldName
            := queriy1.fieldbyname('St_name').asstring;
            i := i +1;
         end
      end;

      queryi1.next;

  end; // while end

  finally
   queryi1.free;
  end;

// * 'i'의 값이 56이 나왔습니다.
end;
3  COMMENTS
  • Profile
    최용일 2005.04.28 01:39
    안녕하세요. 최용일입니다.

    DBGrid는 기본적으로 연결된 DataSource와 함께 동작하도록 되어 있습니다.

    폼이 생성될때는 DBGrid와 연결된 Query 컴포넌트(DataSource)에서 모든 데이터를 읽어오시는 것 같은데....

    폼의 콤보 박스 값에 따라 조건에 맞는 것만 출력하실때는 연결된 쿼리컴포넌트를 쓰시지 않고 따로 쿼리 컴포넌트를 생성하셔서 하는것 같네요...

    DBGrid와 연결된 쿼리 컴포넌트에서 SQL을 실행하시던가, 생성한 쿼리컴포넌트와 DataSource를 연결해주시면 해결될것 같네요...

    ^^ 항상 즐코하세요...

  • Profile
    Unistar 2005.04.28 05:03
      
    답변 감사합니다.

    제가 델파이를 시작한지 얼마되지 않아서 개념이 잘 잡히지가 않네요..
    말씀하신 내용을 제 나름대로 해석하여 해봤지만  잘 되지 않습니다.

    좀 더 쉽게 설명을 해주시면 감사하겠습니다.

    님의 말씀을 아래와 같이 해석하여 해봤습니다.....

    폼의 콤보 박스 값에 따라 조건에 맞는 것만 출력하실때는 연결된 쿼리컴포넌트를 쓰시지 않고 따로 쿼리 컴포넌트를 생성하셔서 하는것 같네요...
    ==> 폼에 연결된 컴포넌트(DataSource1,Table1)를 삭제하란 말씀인가요?
            삭제는 하지 않고 했습니다.

    DBGrid와 연결된 쿼리 컴포넌트에서 SQL을 실행하시던가, 생성한 쿼리컴포넌트와 DataSource를 연결해주시면 해결될것 같네요...
    ==> 이 내용을 아래와 같이 추가하여 해봤습니다.
            결과는 DBGrid에 내용이 출력되지 않았습니다.
            무엇이 잘못되었는지 이해를 못하겠네요....
             님의 말씀을 잘못 해석했는것 같은데 어떻게 해야 할 지 모르겠습니다.

    답변 기다리겠습니다... 감사합니다.


    // < 추가 >
      SeqInqForm.Table1.Active  := False;
      SeqInqForm.DataSource1.dataSet := queryi1;
      SeqInqForm.DBGrid1.DataSource  := SeqInqForm.DataSource1;
      SeqInqForm.DBGrid1.DataSource.DataSet  := queryi1;


  • Profile
    최용일 2005.04.29 01:38
    안녕하세요. 최용일입니다.

    쩝...

    SQL을 쓰실거면 Table컴포넌트 대신에 Query컴포넌트를 쓰시는것이 좋습니다.

    Table컴포넌트를 Query컴포넌트로 바꾸시구요.

    Stock_code_inq는 메소드가아니라 일반 함수라서 폼의 Query컴포넌트를 참조할수 없으니까 파라매터로 받도록하셔야 겠네요...

    쿼리 컴포넌트는 테이블컴포넌트와 달리 연결될때 레코드들을 로드하지 않으니까 첨에 Select * from 테이블명 .. 이런식으로 쿼리 날려줘서 전체 레코드 불러오세요...

    델파이 첨이신것 같은데... 어느정도 할때까지는 책한권 사서 보시는게 좋을듯 하네요...

    <!--CodeS-->

    procedure TSeqInqForm.ComboBox1Change(Sender: TObject);
    begin
        ......

        Stock_code_inq(Query1); // Query1은 Table에서 Query로 바꾼 컴포넌트입니다.
    end;

    procedure Stock_code_inq(Query: TQuery);
    begin
        try
            //query := Tquery.create(application); 필요없음
            //query.DatabaseName := 'DBTEST'; 필요없음

            if (w_item_kb = '00') or (w_item_kb = '') then
                .........

        finally
            //query.free; 필요없음
        end;
    end;

    <!--CodeE-->

    ^^ 항상 즐코하세요...