Q&A

  • 업데이트시 일련번호를 부여하려고 하는데요....
아래와 같이 insert된 data가 있습니다.

순번,   완료일     문서번호  기관기호    이름
num,   InDate       PreNo    HosNo    Name
        '20020113'    '00001'   '10080'   '아무개'
        '20020114'    '00002'   '10080'   '아무도'
        '20020113'    '00003'   '10080'   '아무나'
        '20020114'    '00004'   '10080'   '아무리'
        '20020114'    '00005'   '10080'   '아무냐'
.            .              .             .            .
.            .              .             .            .
.            .              .             .            .


어떤 버튼을 누르면 다른 테이블들을 업데이트하면서 위의 테이블도 업데이트를 하는데요, 하면서 순번을 함께 업데이트해줘야 합니다. 그러니까 같은 완료일 중의 가장 큰값을 가져와서 +1을 해주면 되거든요.
그래서 아래처럼 해주었어요.

with Query1 do
begin
  Close;
  SQL.Clear;
  SQL.Add('Update AAA ');
  SQL.Add('  set num = (select nvl(max(num), ''000'') + 1 ');
  SQL.Add('               from AAA                        ');
  SQL.Add('              where Indate = ''20010113'')     ');
  SQL.Add(' where PreNo = ''00001''                       ');
  SQL.Add('   and HosNo = ''10080''                       ');
  ExecSQL;
end;

근데 이렇게 했더니 중복되는 번호가 생깁니다.... ㅜㅜ;  C/S 환경으로 클라이언트가 7대이거든요... 같은 완료일 중에서는 같은 번호가 업데이트되는게 있음 안되는데 말이죠...

어떻게 해야하죠? 답변 부탁드립니다........... 흑흑,, 이거가지고 고생한지 한달도 넘었어요. 머리털 빠지겠어용............ ㅠㅜ
아시는 분 꼭 답변을 좀............ ! ㅠㅠ;

참!!! 데이타베이스는 오라클입니다..
10  COMMENTS
  • Profile
    최진찬 2002.01.15 10:49
    MAX값 구해올때....
    FOR UPDATE 구문 사용하면 됩니다.

  • Profile
    김나영 2002.01.15 18:59
    ^^;

    제가 알기로는 for update 구문은 그룹함수와 함께 사용하지 못하는걸로 알고 있는데요...
    그리구, for update 구문은 검색시 락을 걸어 다른 사용자들이 락을 걸거나 업데이트를 하지 못하게 하는거지 검색은 할 수 있지 않나요???
    실제로 이렇게 해서 테스트를 해보았었는데 검색을 되는것 같던데...
    답변 다시 한번 부탁드릴께요..
    수고하세요.


  • Profile
    이병훈 2002.01.15 10:00
    안녕하세요. ^^;;

    지나가다 그냥 함 적습니다. ^^;;

    with Query1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Update AAA ');
      SQL.Add('  set num = (select nvl(max(num), ''000'') + 1 ');
      SQL.Add('               from AAA                        ');
      SQL.Add('              where Indate = ''20010113'')     ');
      SQL.Add(' where PreNo = ''00001''                       ');
      SQL.Add('   and HosNo = ''10080''                       ');
      ExecSQL;
    end;

    이 쿼리를
    (만약 database componet를 사용하신다면.. )
    database.starttransaction;
    try
    with Query1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Update AAA ');
      SQL.Add('  set num = (select nvl(max(num), ''000'') + 1 ');
      SQL.Add('               from AAA                        ');
      SQL.Add('              where Indate = ''20010113'' ');
      SQL.Add('                 and PreNo = ''00001''      ');
      SQL.Add('                 and HosNo = ''10080'')    ');
    end;
    database.commit;
    except
    database.rollback;
    end;

    이렇게 바꾸시면 안되는지요. ^^;;

    그냥 지나가다 적어 봅니다.

    그럼 수고하세요..


  • Profile
    이한별 2003.12.27 03:18
  • Profile
    김나영 2002.01.15 19:01
    안녕하세요. ^^
    음,.. 안그래두 트랜잭션을 다 사용하고 있거든요. 근데두 그러네요. ㅡㅡ;
    트랜잭션을 사용하는것과 안사용하는것이 락과 어떤 관련이 있나요?
    다시 한번 답변 부탁드려도 될런지.....
    수고하세요. ^^


  • Profile
    이병훈 2002.01.16 22:12
    훔..
    저의 답을 잘못 이해 하신것 같아여. ^^;;

    트랜젝션은 제가 그냥 쓴거구요. ^^;;

    with Query1 do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Update AAA ');
      SQL.Add('  set num = (select nvl(max(num), ''000'') + 1 ');
      SQL.Add('               from AAA                        ');
      SQL.Add('              where Indate = ''20010113''     ');
      SQL.Add('                  and PreNo = ''00001''                       ');
      SQL.Add('                  and HosNo = ''10080'' )                      ');
      SQL.Add(' where PreNo = ''00001''                       ');
      SQL.Add('   and HosNo = ''10080''                       ');
      ExecSQL;
    end;

    이렇게 하면 안되냐구 제가 적었는데요. ^^;;
    함 확인해 주세요.
    현재 set절에 있는 max값은 13일때의 값을 가져 옵니다.
    그럼 하나씩 증가 시킬수가 없죠.
    왜냐 하면 날짜는 PerNo, HOsNo는 여러개가 생기는데. Indate는 무조건
    하나니까요.
    그래서 Set 절에 Max값을 구할때 조건을 주라고 한겁니다.
    머.. 이렇게 하면 안되냐는 거죠. 쩝. .

    그럼 함 해보시구요. 다시 함 리플 달아 주세요. ^^
    그럼 성공하시기를...

  • Profile
    또치 2002.01.16 23:39
    아... 글쿤요.. ^^; 제가 답변해주신걸 자세히 보질 못했네요. ^^;;;
    계속 답변 이렇게 자세히 주셔서 감사합니다.

    음.. 근데 제가 첨에 질문 올릴때 샘플 데이타를 잘못 올렸나봐요.

    거기서 PreNo랑 HosNo가 Primary Key이구요, 한 날짜를 기준으로 Max값 + 1을 해주어야 하거든요. 업데이트시 매일 아침 첨에 업데이트되는 문서가 001, 그다음 업데이트되는 문서가 002, .... 이렇게 번호가 매겨지다가 다시 담날이 되면 아침에 첨에 업데이트되는 문서가 또 001, 그 다음이 002, 그담이 003,... 이런식으로 되는거거든요. 님께서 해주신 쿼리를 날리게 되면 프라이머리키를 where절에 다 주었으니 맥스값을 구해도 늘 '001'이 나오게 되는거죠. ^^;

    아아, 이거 이번주까지 해결해준다고 철썩같이 약속해놨는데 해결 못하면 저 끝이예요... 도대체 뭐가 문제이고 제가 파악해내지 못한 문제가 무엇일까요..

    죄송하지만, 한번만 더 답변을... ㅡㅡ;
    고맙습니다. ^^


  • Profile
    델파이탐크루즈 2002.01.14 23:29
    Before Post시점에서 최종값을 읽어와서 저장하시면 될듯싶군요...

    저도 그런것을 해보았거든요...
    잘되던데...

    다시 자 ~ 알 해보세요...

    그럼...

    샬롬...

  • Profile
    꿈의대화 2002.01.14 22:45
    .
  • Profile
    김나영 2002.01.14 23:25
    움.... 다시 한번 질문 드릴께요.
    안그래두 시퀀스를 이용해서 해봤었거든요.
    근데두 같은 날짜중에 중복되는 번호가 있네요.
    왜 그런건지 이유는 잘 모르겠어요.
    날짜별로 순번을 주어야 하니까
    날짜가 바뀌면 시퀀스를 drop 후 다시 생성하는 방법으로 했거든요.
    왜 그런건지..........?

    그리구, 시퀀스를 사용하구 위의 방법으로 사용하면 날짜가 바뀌어 시퀀스를 다시 생성하면 이전날짜의 레코드는 번호를 제대로 가져오지 못한다는 문제점도 있고요. 다시 한번만 답변 부탁드릴께요.
    수고하세요.