Q&A

  • SQL문 사용 조회후 Read-Only Dataset해제 방법
안녕하세요.. 델파이 초보자인데요. 급한 문제가 발생해서 질문을 합니다.



DataSource 컴포넌트 하나와 Query 컴포넌트 하나로 구성된 것에서

처음 실행시는 DBNavigator의 추가, 삭제, 수정등등이 전부 사용가능한데 아래와 같이 코딩으로 조회를 하면 조회는 잘 되는데 일단 아래와 같이 하면 DBNavigator의 수정, 삭제, 추가버튼이 disable되고 레코드이동 버튼만이 Enable되어 다시 운래대로 돌아오지 않는데 어떻게 하면 조회후에도 수정, 삭제 추가가 이루어 지도록 할 수 있을까요. 데이타베이스는 로컬에서 사용됩니다.



procedure TForm1.BitBtn8Click(Sender: TObject);

begin

if Edit3.Text='' then Application.MessageBox('찾고자 하는 고객명을 입력하세 요', '고객명 미 입력', mb_Ok)

else

begin

with Data.Query2 do

begin

Close;

SQL.Clear;

SQL.Add('Select * from Service');

if Edit3.Text <> '' then

begin

SQL.Add('Where NAME=:NAME1');

ParamByName('NAME1').AsString:=Edit3.Text;

end

else SQL.Add('(NAME is Null or NAME is Not Null)');



SQL.Add('Order By NAME');

Open;

if RecordCount=0 then Application.MessageBox('검색된 결과가 없습니다.','고객정비내용 조회', mb_Ok);

end;

end;



end;



해결책 꼭 좀 부탁합니다. 그리고 데이타 데이타소스와 쿼리 각각 하나를 모듈로 사용하고 있습니다.



고수님의 해결책 가몸에 비한줄기 기다리듯이 기다리겠습니다..



꼭 좀...



그럼 안녕히...



5  COMMENTS
  • Profile
    한일석 2000.03.20 22:33
    안녕하세요.. 고수님들의 조언을 근거로 제가 여러가지 방법을 시도한 결과 정석이 아닐지라도 해결했습니다.



    Query 컴포넌트의 속성중 cachedUpdates를 True로 만들어 주면 일단은 Read-Only Dataset이라는 메시지는 안뜨더군요. 그리고 DBNavigator의 버튼을 사용할 수 있게 되었습니다.



    그러나 여기서 BDNavigator로 추가,삭제,수정이 이루어진 작업이 데이타 베이스에 적용이 되지를 않는 군요. 일단은 삭제시 DBGrid에서는 사라지는데 다시 불러오면 원래 상태 그래로 남아 있습니다. 이제 이것을 해결해야 되겠습니다.



    고수님들의 가르침을 기다립니다.



    그럼 안녕히...







  • Profile
    김두현 2000.03.19 07:35
    한일석 wrote:

    > 안녕하세요.. 델파이 초보자인데요. 급한 문제가 발생해서 질문을 합니다.

    >

    > 아래와 같이 코딩으로 조회를 하면 조회는 잘 되는데 일단 아래와 같이 하면 BNavigator의 수정, 삭제, 추가버튼이 disable되어서 다시 돌아오지 않는데 어떻게 하면 조회후에도 수정, 삭제 추가가 이루어 지도록 할 수 있을까요..

    >

    > with Data.Query2 do

    > begin

    > Close;

    > SQL.Clear;

    > SQL.Add('Select * from Service');

    > if Edit3.Text <> '' then

    > begin

    > SQL.Add('Where NAME=:NAME1');

    > ParamByName('NAME1').AsString:=Edit3.Text;

    > end

    > else SQL.Add('(NAME is Null or NAME is Not Null)');

    > SQL.Add('Order By NAME');

    > Open;

    > end;

    >

    > 해결책 꼭 좀 부탁합니다. 그리고 데이타 데이타소스와 쿼리 각각 하나를 모듈로 사용하고 있습니다.

    >

    > 고수님의 해결책 가몸에 비한줄기 기다리듯이 기다리겠습니다..

    >

    > 꼭 좀...

    >

    > 그럼 안녕히...

    >



    아주 간단한 문제입니다. edit명령만 주면 되죠.

    하지만 주의할것은 모든 것을 처리한 후 마지막에 edit가 와야 한다는 겁니다.

    수정 소스 입니다.

    with Data.Query2 do

    begin

    RequestLive := True;

    Close;

    SQL.Clear;

    SQL.Add('Select * from Service');

    if Edit3.Text <> '' then

    begin

    SQL.Add('Where NAME=:NAME1');

    ParamByName('NAME1').AsString:=Edit3.Text;

    end

    else SQL.Add('(NAME is Null or NAME is Not Null)');

    SQL.Add('Order By NAME');

    Open;

    Edit;

    RequestLive := False;

    end;

    원본 소스에서 2개가 추가되었습니다. RequestLive와 Edit 부분입니다.

    참고로 RequestLive는 Query문으로 Table에 update, insert가 가능하게 합니다.

    한마디로, 테이블에 쓰기를 가능하게 하고요,

    Edit는 테이블의 수정을 가능하게 합니다.



    그럼 수고 하세요

  • Profile
    한일석 2000.03.19 13:30
    답변 정말 감사힙니다.



    고수님이 가르쳐 주신 방법으로 해보았는데 계속 read-only dataset이라 수정이 할 수 없다는 에러 메시지를 띄우는 군요. 조회는 되는데 조회후 DBNavigator의 추가, 삭제, 수정, 업데이트 버튼이 모두 Disable로 되고 단지 레코드 이동 버튼만 Enable로 되는 군요.

    그런데 처음실행시 query 컴포넌트의 RequestLive속성이 True이면 DBNavigator의 버튼 몇개만 빼고 다 Enable인데 False로 하면 레코드 이동하는 버튼만 Enable로 됩니다.



    로컬 데이타 베이스에서 SQL문으로 조회후 정말 Read-Only dataset를 못 푸는 것입니까?

    Table를 써야만 하나요...쩝...



    혹시, DBGrid는 상황상 Read-only속성을 True해 놓았는데 이것이 영향을 주나요?



    해결책이 있으면 가르쳐 주세요.



    감사합니다.

  • Profile
    하얀까마귀 2000.03.19 05:54
    안녕하세요 하얀까마귀 입니다.



    쿼리의 경우에는 바로 수정 삭제등이 불가능 합니다. 그걸 가능하게 할려면 테이블을



    쓰셔야 합니다...



    쿼리를 쓰면서 가능하게 할려면. UpdateSQL Component를 사용해서 SQL Component와



    연결을 하셔야 합니다....



    연결후 UpdateSQL Component를 더블클릭하시면 여기에 SQL을 자동생성해주는



    마법사가 뜨거든요??? 그럼 거기서 만들면 됩니다.



    그럼 즐거운 시간 되세요...



    하얀까마귀.



    한일석 wrote:

    > 안녕하세요.. 델파이 초보자인데요. 급한 문제가 발생해서 질문을 합니다.

    >

    > 아래와 같이 코딩으로 조회를 하면 조회는 잘 되는데 일단 아래와 같이 하면 BNavigator의 수정, 삭제, 추가버튼이 disable되어서 다시 돌아오지 않는데 어떻게 하면 조회후에도 수정, 삭제 추가가 이루어 지도록 할 수 있을까요..

    >

    > with Data.Query2 do

    > begin

    > Close;

    > SQL.Clear;

    > SQL.Add('Select * from Service');

    > if Edit3.Text <> '' then

    > begin

    > SQL.Add('Where NAME=:NAME1');

    > ParamByName('NAME1').AsString:=Edit3.Text;

    > end

    > else SQL.Add('(NAME is Null or NAME is Not Null)');

    > SQL.Add('Order By NAME');

    > Open;

    > end;

    >

    > 해결책 꼭 좀 부탁합니다. 그리고 데이타 데이타소스와 쿼리 각각 하나를 모듈로 사용하고 있습니다.

    >

    > 고수님의 해결책 가몸에 비한줄기 기다리듯이 기다리겠습니다..

    >

    > 꼭 좀...

    >

    > 그럼 안녕히...

    >

  • Profile
    한일석 2000.03.19 13:31
    답변 정말 감사힙니다.



    쿼리를 쓰면서 가능하게 할려면. UpdateSQL Component를 사용해서 SQL Component와



    연결을 해야 한다고 하셨는데 SQL 자동 생성해서 했는데도 Read-only dataset이 풀리지 않는 군요. DBGrid는 상황상 Read-only속성을 True로 설정하고 DBNavigator로 처리하려고 합니다.



    정 안되면 테이블을 써야 겠습니다.



    초보의 질문에 관심을 가져 주셔서 정말 감사합니다.



    다음에 또 부탁드립니다.



    그럼 즐거운 시간 되세요..