Q&A

  • DBgrid에서 Cannot modify...... 메세지 나오는 현상?.. (델 초보)


안녕하십니까? 델 초보입니다..

DBgrid을 사용하는데요.. error가 자꾸납니다...한번 봐주세요!..



for i := Low(A) to High(A) do

for j := Low(B) to High(B) do

if A[i] <> B[j] then

begin

dbgrid1.DataSource.DataSet.Append;

dbgrid1.DataSource.DataSet.FieldByName('user_name').asString := A[i];

dbgrid1.DataSource.DataSet.Post;

dbgrid1.DataSource.DataSet.Close;

dbgrid1.DataSource.DataSet.open;

end;



이렇게 하면 Query1:'connect modify a read_only dataset' process stopped......

이런 메세지가 뜨거든요... -> 이거가지고 하루반을 싸우고 있습니다...^^^에고..



위와 같이 하면 현재 그리드에(10개의 data가그리드에 있음)있는것에 추가가 되는건가요?..



--> 저는 비교해서 B에없는 A값만 그리드에 뿌려주고 싶거든요!.

어떻게 해야하죠!... ( 비교한 A값만...)



--> 그리고 그리드에서 insert, delete 하면 실제 DB에있는 값들도

insert, delete가 되는지 ^*^'' 궁금합니다.



고수님의 조언을 기다립니다... 델 신생아.....

3  COMMENTS
  • Profile
    이상우 2000.06.19 20:15
    배훈 wrote:

    >

    > 안녕하십니까? 델 초보입니다..

    > DBgrid을 사용하는데요.. error가 자꾸납니다...한번 봐주세요!..

    >

    > for i := Low(A) to High(A) do

    > for j := Low(B) to High(B) do

    > if A[i] <> B[j] then

    > begin

    > dbgrid1.DataSource.DataSet.Append;

    > dbgrid1.DataSource.DataSet.FieldByName('user_name').asString := A[i];

    > dbgrid1.DataSource.DataSet.Post;

    > dbgrid1.DataSource.DataSet.Close;

    > dbgrid1.DataSource.DataSet.open;

    > end;

    >

    > 이렇게 하면 Query1:'connect modify a read_only dataset' process stopped......

    > 이런 메세지가 뜨거든요... -> 이거가지고 하루반을 싸우고 있습니다...^^^에고..

    >

    > 위와 같이 하면 현재 그리드에(10개의 data가그리드에 있음)있는것에 추가가 되는건가요?..

    >

    > --> 저는 비교해서 B에없는 A값만 그리드에 뿌려주고 싶거든요!.

    > 어떻게 해야하죠!... ( 비교한 A값만...)

    >

    > --> 그리고 그리드에서 insert, delete 하면 실제 DB에있는 값들도

    > insert, delete가 되는지 ^*^'' 궁금합니다.

    >

    > 고수님의 조언을 기다립니다... 델 신생아.....





    안녕하세요...



    지금 현재 Select해서 Table을 Open 하지 않고 그냥 Table을 불러서 보여진것 같은데요..



    그럼 Query 의 RequestLive를 True로 설정해 보십시오..



    그럼 잘 되실 것 같구요..



    만약 Select로 Table을 Open하셨다면 다로 검색하시어 수정,삭제 하셔야 합니다..



    답변은 드렸는데.. 잘 드렸는지 모르겠습니다,,



    그럼 좋은 하루 되십시오...



  • Profile
    배훈 2000.06.19 21:03
    이상우님의 답변 감사합니다.

    그런데.. 가르쳐주신데로 했더니 '' This table is read olny라는 메세지가 뜨네요!..^^'');



    저는 수정/삭제 하는 작업이 아니라 비교해서 비교값만 그리드에 뿌려주고 싶거든요..

    이번에는 전체 소스입니다....

    type

    TForm1 = class(TForm)

    DataSource1: TDataSource;

    Query1: TQuery;

    Database1: TDatabase;

    DBGrid1: TDBGrid;

    DBGrid2: TDBGrid;

    Button1: TButton;

    Edit1: TEdit;

    Edit2: TEdit;

    Button2: TButton;

    Query2: TQuery;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    private

    { Private declarations }

    public

    { Public declarations }

    end;



    var

    Form1: TForm1;



    implementation

    var

    A : array[1..100] of string;

    B : array[1..100] of string;

    {$R *.DFM}



    procedure TForm1.Button1Click(Sender: TObject);

    var

    i : integer;

    begin

    With Query1 do

    begin

    Query1.close;

    Query1.sql.clear;

    Query1.sql.Add('select distinct user_name from sec_user');

    Query1.sql.Add('where user_name = ''이름1''');

    Query1.open;

    end;



    Query1.First;

    for i := 1 to Query1.RecordCount do

    begin

    A[i] := Query1.FieldByName('user_name').AsString;

    Query1.Next;

    end;



    Query1.Active := true;

    edit1.text := inttostr(Query1.RecordCount);

    if A[i] = '' then

    ShowMessage('추출완료!');

    end;



    procedure TForm1.Button2Click(Sender: TObject);

    var

    i,J : integer;

    begin

    With Query2 do

    begin

    Query2.close;

    Query2.sql.clear;

    Query2.sql.Add('select distinct user_name from sec_user');

    Query2.sql.Add('where user_name = ''이름2''');

    Query2.open;

    end;



    Query2.First;

    for j := 1 to Query2.RecordCount do

    begin

    B[j] := Query2.FieldByName('user_name').AsString;

    Query2.Next;

    end;



    Query2.Active := true;

    edit2.text := inttostr(Query2.RecordCount);

    if B[j] = '' then

    ShowMessage('추출완료!');



    for i := Low(A) to High(A) do

    for j := Low(B) to High(B) do

    if A[i] <> B[j] then <-- DATA 비교해서 A값만 그리드에 나오게....

    begin

    dbgrid1.DataSource.DataSet.Append;

    dbgrid1.DataSource.DataSet.FieldByName('user_name').asString := A[i];

    dbgrid1.DataSource.DataSet.Post;

    dbgrid1.DataSource.DataSet.Close;

    dbgrid1.DataSource.DataSet.open;

    end;

    end;



    이상입니다... 자꾸 죄송한데요.. 다시부탁 드리겠습니다...





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

    이상우 wrote:

    > 배훈 wrote:

    > >

    > > 안녕하십니까? 델 초보입니다..

    > > DBgrid을 사용하는데요.. error가 자꾸납니다...한번 봐주세요!..

    > >

    > > for i := Low(A) to High(A) do

    > > for j := Low(B) to High(B) do

    > > if A[i] <> B[j] then

    > > begin

    > > dbgrid1.DataSource.DataSet.Append;

    > > dbgrid1.DataSource.DataSet.FieldByName('user_name').asString := A[i];

    > > dbgrid1.DataSource.DataSet.Post;

    > > dbgrid1.DataSource.DataSet.Close;

    > > dbgrid1.DataSource.DataSet.open;

    > > end;

    > >

    > > 이렇게 하면 Query1:'connect modify a read_only dataset' process stopped......

    > > 이런 메세지가 뜨거든요... -> 이거가지고 하루반을 싸우고 있습니다...^^^에고..

    > >

    > > 위와 같이 하면 현재 그리드에(10개의 data가그리드에 있음)있는것에 추가가 되는건가요?..

    > >

    > > --> 저는 비교해서 B에없는 A값만 그리드에 뿌려주고 싶거든요!.

    > > 어떻게 해야하죠!... ( 비교한 A값만...)

    > >

    > > --> 그리고 그리드에서 insert, delete 하면 실제 DB에있는 값들도

    > > insert, delete가 되는지 ^*^'' 궁금합니다.

    > >

    > > 고수님의 조언을 기다립니다... 델 신생아.....

    >

    >

    > 안녕하세요...

    >

    > 지금 현재 Select해서 Table을 Open 하지 않고 그냥 Table을 불러서 보여진것 같은데요..

    >

    > 그럼 Query 의 RequestLive를 True로 설정해 보십시오..

    >

    > 그럼 잘 되실 것 같구요..

    >

    > 만약 Select로 Table을 Open하셨다면 다로 검색하시어 수정,삭제 하셔야 합니다..

    >

    > 답변은 드렸는데.. 잘 드렸는지 모르겠습니다,,

    >

    > 그럼 좋은 하루 되십시오...

    >

  • Profile
    이상우 2000.06.19 22:35
    배훈 wrote:

    > 이상우님의 답변 감사합니다.

    > 그런데.. 가르쳐주신데로 했더니 '' This table is read olny라는 메세지가 뜨네요!..^^'');

    >

    > 저는 수정/삭제 하는 작업이 아니라 비교해서 비교값만 그리드에 뿌려주고 싶거든요..

    > 이번에는 전체 소스입니다....

    > type

    > TForm1 = class(TForm)

    > DataSource1: TDataSource;

    > Query1: TQuery;

    > Database1: TDatabase;

    > DBGrid1: TDBGrid;

    > DBGrid2: TDBGrid;

    > Button1: TButton;

    > Edit1: TEdit;

    > Edit2: TEdit;

    > Button2: TButton;

    > Query2: TQuery;

    > procedure Button1Click(Sender: TObject);

    > procedure Button2Click(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    > var

    > A : array[1..100] of string;

    > B : array[1..100] of string;

    > {$R *.DFM}

    >

    > procedure TForm1.Button1Click(Sender: TObject);

    > var

    > i : integer;

    > begin

    > With Query1 do

    > begin

    > Query1.close;

    > Query1.sql.clear;

    > Query1.sql.Add('select distinct user_name from sec_user');

    > Query1.sql.Add('where user_name = ''이름1''');

    > Query1.open;

    > end;

    >

    > Query1.First;

    > for i := 1 to Query1.RecordCount do

    > begin

    > A[i] := Query1.FieldByName('user_name').AsString;

    > Query1.Next;

    > end;

    >

    > Query1.Active := true;

    > edit1.text := inttostr(Query1.RecordCount);

    > if A[i] = '' then

    > ShowMessage('추출완료!');

    > end;

    >

    > procedure TForm1.Button2Click(Sender: TObject);

    > var

    > i,J : integer;

    > begin

    > With Query2 do

    > begin

    > Query2.close;

    > Query2.sql.clear;

    > Query2.sql.Add('select distinct user_name from sec_user');

    > Query2.sql.Add('where user_name = ''이름2''');

    > Query2.open;

    > end;

    >

    > Query2.First;

    > for j := 1 to Query2.RecordCount do

    > begin

    > B[j] := Query2.FieldByName('user_name').AsString;

    > Query2.Next;

    > end;

    >

    > Query2.Active := true;

    > edit2.text := inttostr(Query2.RecordCount);

    > if B[j] = '' then

    > ShowMessage('추출완료!');

    >

    > for i := Low(A) to High(A) do

    > for j := Low(B) to High(B) do

    > if A[i] <> B[j] then <-- DATA 비교해서 A값만 그리드에 나오게....

    > begin

    > dbgrid1.DataSource.DataSet.Append;

    > dbgrid1.DataSource.DataSet.FieldByName('user_name').asString := A[i];

    > dbgrid1.DataSource.DataSet.Post;

    > dbgrid1.DataSource.DataSet.Close;

    > dbgrid1.DataSource.DataSet.open;

    > end;

    > end;

    >

    > 이상입니다... 자꾸 죄송한데요.. 다시부탁 드리겠습니다...

    >

    >

    > ===================================================================

    > 이상우 wrote:

    > > 배훈 wrote:

    > > >

    > > > 안녕하십니까? 델 초보입니다..

    > > > DBgrid을 사용하는데요.. error가 자꾸납니다...한번 봐주세요!..

    > > >

    > > > for i := Low(A) to High(A) do

    > > > for j := Low(B) to High(B) do

    > > > if A[i] <> B[j] then

    > > > begin

    > > > dbgrid1.DataSource.DataSet.Append;

    > > > dbgrid1.DataSource.DataSet.FieldByName('user_name').asString := A[i];

    > > > dbgrid1.DataSource.DataSet.Post;

    > > > dbgrid1.DataSource.DataSet.Close;

    > > > dbgrid1.DataSource.DataSet.open;

    > > > end;

    > > >

    > > > 이렇게 하면 Query1:'connect modify a read_only dataset' process stopped......

    > > > 이런 메세지가 뜨거든요... -> 이거가지고 하루반을 싸우고 있습니다...^^^에고..

    > > >

    > > > 위와 같이 하면 현재 그리드에(10개의 data가그리드에 있음)있는것에 추가가 되는건가요?..

    > > >

    > > > --> 저는 비교해서 B에없는 A값만 그리드에 뿌려주고 싶거든요!.

    > > > 어떻게 해야하죠!... ( 비교한 A값만...)

    > > >

    > > > --> 그리고 그리드에서 insert, delete 하면 실제 DB에있는 값들도

    > > > insert, delete가 되는지 ^*^'' 궁금합니다.

    > > >

    > > > 고수님의 조언을 기다립니다... 델 신생아.....

    > >

    > >

    > > 안녕하세요...

    > >

    > > 지금 현재 Select해서 Table을 Open 하지 않고 그냥 Table을 불러서 보여진것 같은데요..

    > >

    > > 그럼 Query 의 RequestLive를 True로 설정해 보십시오..

    > >

    > > 그럼 잘 되실 것 같구요..

    > >

    > > 만약 Select로 Table을 Open하셨다면 다로 검색하시어 수정,삭제 하셔야 합니다..

    > >

    > > 답변은 드렸는데.. 잘 드렸는지 모르겠습니다,,

    > >

    > > 그럼 좋은 하루 되십시오...

    > >



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

    그럼.. Query1의 검색된 내용중에 원하는 항목만 DBGrid에 보여지게 하실려는 것이죠..?



    그런데.. Select 해서 보여진 DBGrid의 내용은 Read Only 속성을 가지기 때문에

    입력, 수정 할 수 없습니다..



    제 생각에는 StringGrid를 사용하시면 원하는 결과를 얻으실 수 있을것 같은데요..

    저도 그런방법은 StringGrid를 사용하거든요..





    [예문]

    Query로 검색한 데이타를 StringGrid로 넣는법



    If Query1.FieldByName('이름').AsString = '홍길동' Then

    Beign

    for i:= 1 to 10 do --> [ Field 수 ]

    begin

    StringGrid1.Cells[1,i] := Query1.Fileds[0].AsString;

    StringGrid1.Cells[2,i] := Query1.Fileds[1].AsString;

    StringGrid1.Cells[3,i] := Query1.Fileds[2].AsString;

    end;

    end;



    이러면 StringGrid에는 '홍길동' 이라는 사람의 내용만 있겠죠...

    이번에는 답변이 되었는지요...! 제가 아는 법위는 이정도이네요...

    그럼..