Q&A

  • 디비그리드에 업데이트한 내용을 나타나게 하려는데...
다덜 델파이 하느라 수고가 많지요?

그러나 저같이 몬하는 사람 좀 도와주세요!

말씀 그대로 Update한 내용을 디비그리드에 바로 나타낼려고 합니다.

근데 Update는 되는데 update한 내용은 디비그리드에 하나도 나타나질 않습니다.

참고로 제가 작성한 소스는 다음과 같습니다.



if copy(edcompany1.text,length(edcompany1.text) - 6 + 1,6) = '대리점' then

begin

query2.close;

query2.SQL.Clear;

sqlstring := 'update tblcost set cost = "' + edgoodcost.text + '" where goodcode = "' + edgoodcode.text + '" and companyname = "대리점"';

query2.sql.add(sqlstring);

query2.execsql;

query1.Close;

query1.sql.Clear;

sqlstring := 'select * from tblcost where companyname = "대리점" order by goodcode';

query1.sql.add(sqlstring);

query1.open;

btnupdate.Caption := '수 정';

btninput.Enabled := true;

btndelete.Enabled := true;

edgoodcode.Text := '';

edgoodcost.text := '';

edgoodcode.setfocus;

end



위와 같이 쿼리콤포넌트 2개를 써서 하나(query2)는 Update하는데 사용하고 또 다른 하나(query1)는 수정한 내용을 실시간으로 디비그리드에 나타내려고 하는데 하나도 안 나타나내요!

물론 query1가 디비에 연결되어 있고 active값도 true로 설정되어있으며 datasource콤포넌트로 모두 연결되어 있습니다.

소스가 잘못됐나 싶어 뚫어지고 보고 또 보고 있어도 잘못된데는 없어 보이는디...

한 곳에서 query콤포넌트 2개 이상 쓸 수가 없는건지...

여하튼 보시고 헬프미 입니다.(자꾸 질문만 하게 되네요 죄송하게시리...)

5  COMMENTS
  • Profile
    bassmania 2000.09.23 22:13
    안녕하세요. 배스마니아 조덕진입니다.

    저도 초보라서 큰 도움이 될지는 모르겠지만, 나름대로 해결법을 찾아봤습니다.



    우선 Query1을 Update용이라 보았을때, Query1의 이벤트에 보시면 AfterPost가 있습니다.

    이곳에 DBGrid와 연결된 Query2를 다시 오픈하시면 됩니다.

    단순히 Query2.Refresh와 같은 것을 사용하시면 안되구요, Query2.Close; Query2.Open을

    사용하셔야 합니다.



    UpdateSQL에 대해 참고로 말씀을 드리겠습니다. 저도 UpdateSQL을 사용하고는 있지만

    정확하게 설명할 자신은 없습니다. 다만, 로컬데이터베이스(Paradox, DBF등)에서 RDBMS가

    제공하는 트랜잭션을 처리할 수 있는 기능을 구현하는 것 정도로 알고 있습니다.



    DB 프로그래밍 입문자이시면 "델파이 데이터베이스 완벽가이드 - 가남사"을 보시는 것도

    좋습니다. 저도 이 책을 보면서 많은 것을 배우고 있으니까요.



    그럼....

  • Profile
    창돌이 2000.09.23 11:02
    안녕하세요

    델파이초보 창돌이 입니다.



    저도 잘 모르지만 혹시 도움이 된다면.

    퀴리 프로퍼티에 보면 CashedUpdates 가 있을 겁니다. 이것이 true이면 직접 처리 한것을 db에 바로 처리하지 않고 메모리 공간에 잠시 기억시켜 놓고 클로즈나 ApplyUpdates 메소드을 통해서 화일로 저장을 하는 것으로 알고 있습니다.



    일단 위 프로퍼티가 true로 되어 있으면 query1.ApplyUpdates을 수정/삽입후 실행해 보세요. 제생각으로는 될것 같은데.

    저도 책 찾아 적는 겁니다. 잘 몰라서여.(특히 db쪽은요)



    그럼 행복하세요.



    혹시 고수님 보시고 틀린점 있으면 지적해주세요 그럼 꾸벅

  • Profile
    제임스박 2000.09.23 11:43
    창돌이 wrote:

    > 안녕하세요

    > 델파이초보 창돌이 입니다.

    >

    > 저도 잘 모르지만 혹시 도움이 된다면.

    > 퀴리 프로퍼티에 보면 CashedUpdates 가 있을 겁니다. 이것이 true이면 직접 처리 한것을 db에 바로 처리하지 않고 메모리 공간에 잠시 기억시켜 놓고 클로즈나 ApplyUpdates 메소드을 통해서 화일로 저장을 하는 것으로 알고 있습니다.

    >

    > 일단 위 프로퍼티가 true로 되어 있으면 query1.ApplyUpdates을 수정/삽입후 실행해 보세요. 제생각으로는 될것 같은데.

    > 저도 책 찾아 적는 겁니다. 잘 몰라서여.(특히 db쪽은요)

    >

    > 그럼 행복하세요.

    >

    > 혹시 고수님 보시고 틀린점 있으면 지적해주세요 그럼 꾸벅



    답변 주셔서 감사합니다.

    근데 어느부분에서 query1.ApplyUpdates을 수정/삽입를 하라는건지 알 수가 없어서 query1.open 대신 사용하기도 해보고 두고 써봐도 에러만 자꾸나네요!

    에러문은 다음과 같습니다.

    query1:dataset not in edit or insert mode

    어디가 잘못된건지 알 수가 없습니다. 아시면은 한번만 더 답변주시면 감사하겠습니다.

    그럼 20000...





  • Profile
    성더기 2000.09.23 20:15
    모 일단 처음쓰신 위의 소스는 맞는거 같습니다.(대충바선..^^;;)

    근데 한가지 궁금한게 있는데여..

    DBGrid Columns Editor(그리드 더블클릭하믄 생기는거)를 사용하셨는지여.

    혹시 그걸 사용해서 그리드의 컬럼을 만들어 두셨다면 각 컬럼마다

    필드를 연결해줘야합니다



    물론 사용안하셨다면

    디자인시에는 Query1을 Active := False

    로 해두시고

    런타임시에

    Query1.Close;

    Query1.Open;

    을 사용하시면 됩니다.



    캐쉬드업데이트는 잘 사용을 안해바설..ㅡ.ㅡ;;;;

    마니들 사용하시던데..

  • Profile
    창돌이 2000.09.23 12:15
    죄성합니다. 잘 모르면서 오답을 드려서요.



    하지만 초보 끼리 한번 해봅시당. ^^;

    그런데 굳이 쿼리을 두개나 쓸필요가 있을까요.

    무슨 다른 이유라도???



    에러의 내용은 query1이 edit모드나 insert모드가 아니라는 내용인데요. 쩝쩝.

    그런데 저는 쿼리는 잘안쓰거든요. 작은 db만 다루기때문, 그리고 로컬로 대부분 처리하니깐여.

    저는 그냥 테이블(table)을 쓰는게 더 편하더군요

    하여튼.

    먼저 query1 프로퍼티에 보면 CashedUpdates = true;로 하시고여(꼭 확인)

    query1.open;

    // 여기에 한번 넣어 보세요.

    query1.ApplyUpdates;

    btnupdate.Caption := '수 정';

    btninput.Enabled := true;

    btndelete.Enabled := true;



    그래도 안되면요. 흐흐 ㅜ.ㅜ

    제가 애기 했든 부분은 모두 삭제 시키고(원래 소스) 그냥 query1 프로퍼티 CashedUpdates을 false로 하고 한번 해보세요.



    이방법도 안되면 그냥 쿼리을 하나로만 써 보세요 프로퍼티을 false로 두고요.

    꼭 dbgrid와 데이타