Q&A

  • Query로 마스터/디테일 구현시 트랜잭션 처리 문제..
안녕하세요.

프로그램중에 한가지 막히는게 있어서 질문을 드립니다.

지금까지는 이곳의 질문란에서 찾아서 해결했는데 이번것은 없는것 같아서...



C/S 환경, NT 서버, SQL 설치하여 동작합니다.

하나의 MAIN DB에 5개의 SUB DB가 해당키의 내용에 맞추어 보여줍니다.

키를 SANO 라고 했을때 Master/Detail 식으로 동작하도록 Query 콤포넌트로 구현했습니다. 여기 질문란을 찾아서 해결했지요.

그런데, 수정이나 추가를 해야 할때요. 트랜잭션을 걸어서 Cached Update를 하려고

합니다. Main DB에 대해서는 수정/추가가 되는데요.

Sub DB에는 되지를 않아요.

db_Main.StartTransaction; // 트랜잭션 시작.

q_Main.Edit; q_Sub01.Edit;

q_Sub02.Edit; q_Sub03.Edit;

q_Sub04.Edit; q_Sub05.Edit;

.

.

try

q_Main.ApplyUpdates; q_Sub01.ApplyUpdates;

q_Sub02.ApplyUpdates; q_Sub03.ApplyUpdates;

q_Sub04.ApplyUpdates; q_Sub05.ApplyUpdates;

db_Main.Commit;

except

ShowMessage('저장 명령을 수행할수 없어 저장을 취소합니다.');

db_Main.Rollback;

end; // Cache Buffer Clear

q_Main.CommitUpdates; q_Sub01.CommitUpdates;

q_Sub02.CommitUpdates; q_Sub03.CommitUpdates;

q_Sub04.CommitUpdates; q_Sub05.CommitUpdates;

.

.



위처럼 했는데요. Main DB는 저장이 되는데, Sub는 저장이 되지 않아요.

UpdateSQL 도 연결을 했구요, UpdateSQL Editor로 키필드를 sano로 주고

Generate SQL 버튼을 눌러서 문장을 만들었습니다.

제대로 적지도 못했지만 많은 도움 바랍니다.

미리 감사드립니다.







위대한 단군혼이 살아있는 나라... 대한민국

5  COMMENTS
  • Profile
    하얀까마귀 2000.03.24 22:05
    안녕하세요 하얀까마귀 입니다..



    음... 동족을 만나니.. 기쁘네요.. 하하...



    우선 Master Detail 관계이든 아니든 디비를 각각 열어주셧으면 UpdateSQL도 각각 설정을



    하셔야 하구요... 그리고 이런경우 read only = False로 캐시 업데이트는 트루로 해주



    시면 됩니다... UpdateSQL은 사용하실줄 아시는것 같으니 넘어가구요....



    그냥 이렇게만 하면 자료는 저장되게 되어 있는데...



    안된다면 다른부분이 이상할것 같네요... 상세한 코드를 보면 더 좋겠네요..



    그럼 즐거운시간 되세요



    - 하얀까마귀 -



    까마귀 wrote:

    > 안녕하세요.

    > 프로그램중에 한가지 막히는게 있어서 질문을 드립니다.

    > 지금까지는 이곳의 질문란에서 찾아서 해결했는데 이번것은 없는것 같아서...

    >

    > C/S 환경, NT 서버, SQL 설치하여 동작합니다.

    > 하나의 MAIN DB에 5개의 SUB DB가 해당키의 내용에 맞추어 보여줍니다.

    > 키를 SANO 라고 했을때 Master/Detail 식으로 동작하도록 Query 콤포넌트로 구현했습니다. 여기 질문란을 찾아서 해결했지요.

    > 그런데, 수정이나 추가를 해야 할때요. 트랜잭션을 걸어서 Cached Update를 하려고

    > 합니다. Main DB에 대해서는 수정/추가가 되는데요.

    > Sub DB에는 되지를 않아요.

    > db_Main.StartTransaction; // 트랜잭션 시작.

    > q_Main.Edit; q_Sub01.Edit;

    > q_Sub02.Edit; q_Sub03.Edit;

    > q_Sub04.Edit; q_Sub05.Edit;

    > .

    > .

    > try

    > q_Main.ApplyUpdates; q_Sub01.ApplyUpdates;

    > q_Sub02.ApplyUpdates; q_Sub03.ApplyUpdates;

    > q_Sub04.ApplyUpdates; q_Sub05.ApplyUpdates;

    > db_Main.Commit;

    > except

    > ShowMessage('저장 명령을 수행할수 없어 저장을 취소합니다.');

    > db_Main.Rollback;

    > end; // Cache Buffer Clear

    > q_Main.CommitUpdates; q_Sub01.CommitUpdates;

    > q_Sub02.CommitUpdates; q_Sub03.CommitUpdates;

    > q_Sub04.CommitUpdates; q_Sub05.CommitUpdates;

    > .

    > .

    >

    > 위처럼 했는데요. Main DB는 저장이 되는데, Sub는 저장이 되지 않아요.

    > UpdateSQL 도 연결을 했구요, UpdateSQL Editor로 키필드를 sano로 주고

    > Generate SQL 버튼을 눌러서 문장을 만들었습니다.

    > 제대로 적지도 못했지만 많은 도움 바랍니다.

    > 미리 감사드립니다.

    >

    >

    >

    > 위대한 단군혼이 살아있는 나라... 대한민국

  • Profile
    까마귀 2000.03.24 23:12
    하얀까마귀 wrote:

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

    >

    > 음... 동족을 만나니.. 기쁘네요.. 하하...

    >

    > 우선 Master Detail 관계이든 아니든 디비를 각각 열어주셧으면 UpdateSQL도 각각 설정을

    >

    > 하셔야 하구요... 그리고 이런경우 read only = False로 캐시 업데이트는 트루로 해주

    >

    > 시면 됩니다... UpdateSQL은 사용하실줄 아시는것 같으니 넘어가구요....

    >

    > 그냥 이렇게만 하면 자료는 저장되게 되어 있는데...

    >

    > 안된다면 다른부분이 이상할것 같네요... 상세한 코드를 보면 더 좋겠네요..

    >

    > 그럼 즐거운시간 되세요

    >

    > - 하얀까마귀 -

    >



    고맙습니다. 하얀 까마귀님. 저도 반갑습니다.



    각각의 db에 대해 전부 UpdateSQL을 연결을 했구요.

    Cached Update 도 True로 잡았습니다.

    그런 상황에서 실행을 하면, Main db는 제대로 되는데, 그 Sub는 저장이 되지 않습니다.

    디테일 구조로 되어 있으니까요, 키인 sano와 동일한 레코드는 전부다 보여지게 됩니다.

    아예 없을수도 있지만 한두개 이상씩 있을수도 있습니다.

    한두개 이상 있는게 많지요.

    그리드에서 수정 및 추가가 같이 들어갔을때, 수정한 내용과 추가한 내용이 전부 저장이 되게 하려고 합니다.

    트랜잭션을 걸어서 하면 Main 은 저장이 되는데 Sub는 저장이 되지 않아요.

    에러 메세지도 없고요.



    해당 소스입니다.

    procedure TFrm_Input.bit_EditClick(Sender: TObject);

    //---------------------------> 데이터 수정.

    begin

    BtEnable(0); // 저장,취소 버튼 ON.

    de_Sano.SetFocus;

    With dm_Closing do begin

    db_Main.StartTransaction; // 트랜잭션 시작.

    q_Main.Edit; q_Sub01.Edit;

    q_Sub02.Edit; q_Sub03.Edit;

    q_Sub04.Edit; q_Sub05.Edit;

    end;

    end;

    .

    . Main db는 거의 Edit 콤포넌트를 쓰기때문에 그 처리문은 뺐습니다.

    . 단순히 리턴이면 다음 콤포넌트로 가고 하는정도밖에 없어요.

    .

    procedure TFrm_Input.bit_SaveClick(Sender: TObject);

    //---------------------------> 데이터 저장.

    begin

    BtEnable(1); // 저장,취소 버튼 OFF.

    With dm_Closing do

    begin

    try

    q_Main.ApplyUpdates; q_Sub01.ApplyUpdates;

    q_Sub02.ApplyUpdates; q_Sub03.ApplyUpdates;

    q_Sub04.ApplyUpdates; q_Sub05.ApplyUpdates;

    db_Main.Commit;

    except

    ShowMessage('저장 명령을 수행할수 없어 저장을 취소합니다.');

    db_Main.Rollback;

    end; // Cache Buffer Clear

    q_Main.CommitUpdates; q_Sub01.CommitUpdates;

    q_Sub02.CommitUpdates; q_Sub03.CommitUpdates;

    q_Sub04.CommitUpdates; q_Sub05.CommitUpdates;

    end;

    end;

    이게 제가 쓴 소스입니다.

    Main db는 거의 DBEdit 콤포넌트이고요, Sub는 DBGrid 콤포넌트입니다.

    Grid 콤포넌트는 또 다른 방식으로 처리를 해야 하는가 하고 머리를 굴리고 있습니다.

    좀 도와 주세요.

    감사합니다.







    위대한 단군혼이 살아있는 나라... 대한민국





  • Profile
    이재식 2000.03.24 18:21
    이재식 Wrote :

    안녕하세요?



    아마 M/S관계를 설정하시고, 그리드 자체에서 수정을 하는 것 같습니다.

    아니면 DBEdit박스를 이용해서 하든지요.





    UpdateSQL에서 GenerateSQL를 보면 해당 테이블에 대해서

    쿼리를 만드는데, 아마 하나의 테이블밖에는 안됩니다.



    따라서, 디테일 관련 테이블에는 자체 저장이 안 될것입니다.



    조인이 아니라면, UpdateSQL를 제거하세요.

    그리고, 각 테이블에 cachedUpdate속성을 true로 하시고요,

    다시 한번 해보시고..



    그래도 안되면 일반 매소드로 하시길 바랍니다.

  • Profile
    까마귀 2000.03.24 23:21
    이재식 wrote:

    > 이재식 Wrote :

    > 안녕하세요?

    >

    > 아마 M/S관계를 설정하시고, 그리드 자체에서 수정을 하는 것 같습니다.

    > 아니면 DBEdit박스를 이용해서 하든지요.

    >

    >

    > UpdateSQL에서 GenerateSQL를 보면 해당 테이블에 대해서

    > 쿼리를 만드는데, 아마 하나의 테이블밖에는 안됩니다.

    >

    > 따라서, 디테일 관련 테이블에는 자체 저장이 안 될것입니다.

    >

    > 조인이 아니라면, UpdateSQL를 제거하세요.

    > 그리고, 각 테이블에 cachedUpdate속성을 true로 하시고요,

    > 다시 한번 해보시고..

    >

    > 그래도 안되면 일반 매소드로 하시길 바랍니다.



    먼저 답해주셔서 고맙습니다.

    그런데, 그리드에서는 그런식으로 하면 저장이 않되는 겁니까?

    UpdateSQL을 각각의 Query 마다 하나씩 연결을 했거든요.

    Query 하나는 Main이고, 나머지는 거기에 연결된 Sub입니다.

    Sub는 Main에 대한 디테일이고요.

    Main은 거의 DBEdit 콤포넌트이고요, Sub는 전부 DBGrid입니다.

    CachedUpdate속성은 True입니다.

    그리고, 일반 메소드로 하라는 것은 어떻게 구현하라는 건지요?

    그리드 상에서 수정 추가하는 것은 각각 처리하려고 하니 감이 잘 않잡히네요.

    도움 부탁드립니다.







    위대한 단군혼이 살아있는 나라... 대한민국



  • Profile
    이재식 2000.03.25 02:09
    이재식 Wrote :

    안녕하세요?



    메인은 디비에디트이고 나머지 서브는 그리드상에서 수정을 한다고 하셨습니다.

    그리고, 각 디비는 다른 테이블하고 조인도 없고요..



    위에 소스를 보니까, 서브테이블에 edit를 하셨는데요,

    필요가 없습니다.



    이유는 각 서브그리드는 조인결과를 보여주는 그리드가 아니기때문에

    그냥 자체내에서 수정이 됩니다.



    가령, 메인을 수정한다면 디비에디트에서 수정을 하겠죠.

    보니까, 수정전에 각 서브를 edit호출하시는데, 다 빼세요.



    그런다음 그냥 서브수정은 그리드상에서 하시면 될 것입니다.



    물론 저장버튼은 그냥 두시고요.



    edit명령은 해당 사항이 아닙니다.



    서브는 그냥 그리드상에서 수정하시고요,

    저장버튼만 누르시면 되리가 생각됩니다.



    그래도 안되면 다시 말씀하세요.