Q&A

  • DbGrid의 자료를 update하려는데 잘 안되네요...


query, datasource, dbgrid 를 사용하는데 update를 하려하는데 잘안되는데요..



query문은



begin

inherited;

with query1 do

begin

Close;

Sql.Clear;

Sql.Add(' select substring(sojae from 1 for 1) chk ,');

Sql.Add(' substring(sojae from 2 for 29)sojae, ');

Sql.Add(' myeon,gosi,gam,buga ');

Sql.Add(' from pilji ');

Sql.Add(' where substring(gojibun from 1 for 4) = ''' + edit1.Text + ''' ');

Sql.Add(' and substring(gojibun from 5 for 4) = ''' + edit2.Text + ''' ');

Sql.Add(' and substring(gojibun from 9 for 3) = ''' + edit3.Text + ''' ');

Sql.Add(' and substring(gojibun from 12 for 2) = ''' + edit4.Text + ''' ');

Prepare;

Open;

end;

end;



pilji테이블의 sojae 필드를 substring으로 dbgrid에 chk,sojae 두 필드로 나누어 표현하였는데..

dbgrid의 각필드는 chk,sojae,myeon,gosi,gam,buga 입니다.



저장 버튼으로 수정자료를 저장하려하는데 onclick events에 아래와 같이

기술하였읍니다.



begin

inherited;

with query1 do

begin

Close;

Sql.Clear;

Sql.Add(' update pilji ');

Sql.Add(' set sojae = :sojae, ');

Sql.Add(' myeon = :myeon, gosi = :gosi, ');

Sql.Add(' gam = :gam, buga = :buga ');

Sql.Add(' where substring(gojibun from 1 for 4) = ''' + edit1.Text + ''' ');

Sql.Add(' and substring(gojibun from 5 for 4) = ''' + edit2.Text + ''' ');

Sql.Add(' and substring(gojibun from 9 for 3) = ''' + edit3.Text + ''' ');

Sql.Add(' and substring(gojibun from 12 for 2) = ''' + edit4.Text + ''' ');

ExecSQL;

Open;

end;

end;



실행하면 'query1:field 'sojae'is of an unknown type'. error 메세지가 나타납니다.

dbgrid의 수정된 자료를 update하려하는데 어떤방법으로 해야할지 모르겠네요..

초보자가 부탁드립니다..







3  COMMENTS
  • Profile
    하얀까마귀 2000.04.11 23:07
    안녕하세요 하얀까마귀 입니다..



    Sql.Add(' update pilji ');

    Sql.Add(' set sojae = :sojae, ');

    Sql.Add(' myeon = :myeon, gosi = :gosi, ');

    Sql.Add(' gam = :gam, buga = :buga ');



    이런 코드를 넣어 주셧으면

    ExecSQL;하시기 전에 반드시 여기의 값들을 넣어 주셔야죠..



    ParamByName('sojae').AsString := 어떤값;

    ParamByName('myeon').AsString := 어떤값;

    등등 5개 필드 모드다 이런식으로 넣어주세요...



    그리고 where조건과 execSQL;을 하시면 됩니다.



    그럼. 즐거운시간 되세요



    - 하얀까마귀 -







    초보1 wrote:

    >

    > query, datasource, dbgrid 를 사용하는데 update를 하려하는데 잘안되는데요..

    >

    > query문은

    >

    > begin

    > inherited;

    > with query1 do

    > begin

    > Close;

    > Sql.Clear;

    > Sql.Add(' select substring(sojae from 1 for 1) chk ,');

    > Sql.Add(' substring(sojae from 2 for 29)sojae, ');

    > Sql.Add(' myeon,gosi,gam,buga ');

    > Sql.Add(' from pilji ');

    > Sql.Add(' where substring(gojibun from 1 for 4) = ''' + edit1.Text + ''' ');

    > Sql.Add(' and substring(gojibun from 5 for 4) = ''' + edit2.Text + ''' ');

    > Sql.Add(' and substring(gojibun from 9 for 3) = ''' + edit3.Text + ''' ');

    > Sql.Add(' and substring(gojibun from 12 for 2) = ''' + edit4.Text + ''' ');

    > Prepare;

    > Open;

    > end;

    > end;

    >

    > pilji테이블의 sojae 필드를 substring으로 dbgrid에 chk,sojae 두 필드로 나누어 표현하였는데..

    > dbgrid의 각필드는 chk,sojae,myeon,gosi,gam,buga 입니다.

    >

    > 저장 버튼으로 수정자료를 저장하려하는데 onclick events에 아래와 같이

    > 기술하였읍니다.

    >

    > begin

    > inherited;

    > with query1 do

    > begin

    > Close;

    > Sql.Clear;

    > Sql.Add(' update pilji ');

    > Sql.Add(' set sojae = :sojae, ');

    > Sql.Add(' myeon = :myeon, gosi = :gosi, ');

    > Sql.Add(' gam = :gam, buga = :buga ');

    > Sql.Add(' where substring(gojibun from 1 for 4) = ''' + edit1.Text + ''' ');

    > Sql.Add(' and substring(gojibun from 5 for 4) = ''' + edit2.Text + ''' ');

    > Sql.Add(' and substring(gojibun from 9 for 3) = ''' + edit3.Text + ''' ');

    > Sql.Add(' and substring(gojibun from 12 for 2) = ''' + edit4.Text + ''' ');

    > ExecSQL;

    > Open;

    > end;

    > end;

    >

    > 실행하면 'query1:field 'sojae'is of an unknown type'. error 메세지가 나타납니다.

    > dbgrid의 수정된 자료를 update하려하는데 어떤방법으로 해야할지 모르겠네요..

    > 초보자가 부탁드립니다..

    >

    >

    >

  • Profile
    초보1 2000.04.12 00:50
    하얀까마귀 wrote:

    > 안녕하세요 하얀까마귀 입니다..

    >

    > Sql.Add(' update pilji ');

    > Sql.Add(' set sojae = :sojae, ');

    > Sql.Add(' myeon = :myeon, gosi = :gosi, ');

    > Sql.Add(' gam = :gam, buga = :buga ');

    >

    > 이런 코드를 넣어 주셧으면

    > ExecSQL;하시기 전에 반드시 여기의 값들을 넣어 주셔야죠..

    >

    > ParamByName('sojae').AsString := 어떤값;

    > ParamByName('myeon').AsString := 어떤값;

    > 등등 5개 필드 모드다 이런식으로 넣어주세요...

    >

    > 그리고 where조건과 execSQL;을 하시면 됩니다.

    >

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

    >

    > - 하얀까마귀 -



    죄송한데 한가지만 더 질문합니다...



    ParamByName('sojae').AsString := 어떤값;

    ParamByName('myeon').AsString := 어떤값;

    ....

    에서 위에서 어떤값에는 DBGrid 의 수정된 필드의 값이 들어가는것 같은데...

    어떻게 기술하는지 알려주세요....





  • Profile
    하얀까마귀 2000.04.12 03:20
    >

    > 죄송한데 한가지만 더 질문합니다...

    >

    > ParamByName('sojae').AsString := 어떤값;

    > ParamByName('myeon').AsString := 어떤값;

    > ....

    > 에서 위에서 어떤값에는 DBGrid 의 수정된 필드의 값이 들어가는것 같은데...

    > 어떻게 기술하는지 알려주세요....



    안녕하세요 하얀까마귀 입니다..



    음... 콤포넌트 사용이 조금 잘못된것 같네요.....



    콤포넌트에 대해 조금 설명을 드릴께요..



    1. 쿼리, dbgrid, Datasource...



    이렇게 사용하신 경우에는 dbGrid는 단지 보여주는 뷰역활만 합니다. 여기서 수정은 안되죠..



    그럼. 수정은 어떻게 하시냐하면 insert or Update SQL문을 써서 테이블 하나하나 만들어 주셔야



    합니다.. 그리고 레코드의 각각의 값은 모두 에디트 같은 곳에 넣어 주어야 수정 또는 신규가 가능



    하겠죠??? 그러니까 불러와서 오픈했을때 이 모든 에디트의 값을 변경해주고



    edit.Text := query1.FieldByName(a').AsString; <--요렇게 모든 필드에



    그리고 저장할때는



    SQL.Add( insert into 테이블명 ( a) values (:a));



    Parambyname('a').AsString := edit.Text; <-이것도 모든필드에



    이런식으로 코딩하실려면 엄청 많은 양이 되겠죠?? 하지만 이렇게 하면 기능을 가장 많이 넣을수



    있습니다... 자신이 원하는 대로 만들수 있다는 장점은 있지만 개발기간은 많이 걸리죠..



    (초보1님은 이 에디트들을 만들지 않으셧네요... )



    두번째 방법



    테이블, 그리드, 데이타소스



    이건 아까보다 훨씬 쉽죠.. 왜냐구요??? 이놈은 sql문이 없으니까요...



    그리드에서 바로 수정하시면 별도의 코딩없이 (테이블이니까 sql문이 없겠죠??)



    바로 수정이 됩니다...



    dbGrid와 함께 dbEdit, dBCombobox등등을 사용하시면 되구요...



    1번방법에서 이렇게 사용이 가능하지만 수정은 안됩니다.



    이방법은 아주 간단히 구현할수 있지만 활용도가 많이 떨어집니다..



    음.. 정열방식 하나 바꿀려면 인덱스 하나하나 만들어야만 가능하고 조건을 넣으려



    해도 filter를 사용해야 하구요... 1개의 테이블만 사용가능하다는 거죠..



    마스터/디테일 설정을 해야한다던지.. 뭐 어쨌든 쿼리에 비해 많이 제한적이죠..



    하지만 첫번째 방법에 비하면 너무나도 간단히 구현됩니다..



    간단한건 테이블과 데이타소스 디비그리드 연결만 하면 신규, 수정의 기능이 되니까요.





    세번째 방법..



    쿼리, 그리드, 데이타소스, UpdateSQL



    이건 첫번째와 두번째의 방법을 조합한겁니다..



    테이블을 이용한것 만큼은 아니지만 그래도 개발기간을 단축시켜 주고 쿼리를 이용하기



    때문에 첫번째 방법 만큼은 아니지만 활용도 또한 어느정도 되죠...



    어떻게 하는가 하면.. 쿼리와 데이타소스를 연결해서 디비그리드와 연결을 하고요



    updateSQL component는 쿼리에 보시면 (이건 테이블에도 있음) Update Object라는게



    있습니다.. 여기에 UpdateSQL Component 이름이 나오는데 지정해주면 되겠죠???



    그다음에 UpdateSQL을 더블클릭하면 ( 이거 하기전에 쿼리에 sql문을 넣어주어야 합니



    다) 쿼리에서 오픈한 내용에 대해서 insert, update, delete문을 자동으로 생성해 줍



    니다..물론 편집도 가능하고요.. 이렇게 해주면 테이블 처럼 dataSource에 연결된



    모든 콤포넌트에서 수정한 내용이 post명령 한번으로 저장됩니다.



    이 UpdateSQL을 연결해서 수정등을 원할대는 반드시 CashedUpdates 를 True로 만드셔야



    합니다. 그리고 이렇게 하시면 post를 해도 실제로 저장되는게 아니라 메모리에만



    기록 됩니다. 실제 저장을 할려면 post는 해주시구요... 뭐 폼을 닫을때나 그럴때



    ApplyUpdate를 호출해야 합니다.. 이렇게 해야 실제 테이블에 반영이 됩니다..



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

    이 세가지 방법이 많이 쓰이는 거고요.. 초보1님은 1번처럼 코딩을 하셧는데 에디트



    들에 대한 코딩이 없어서 그렇습니다...



    그럼.. 조금 도움이 되셧기를...



    - 하얀까마귀 -0