Q&A

  • 이런게 가능한지요??
INSERT 및 UPDATE시

저장되는 값이 1개의 테이블에만 있는게 아니라서요...

에...그러니깐...

최소 여러개의 EDIT박스로 JOIN된 값을 불러놓고...그걸 다시 저장하려면...(버튼 하나로)

with PAQuery3 do
  begin
    Close;
    Sql.Clear;
    Sql.Add(' UPDATE TABLE1 SET com = :com, tel = :tel, ');
   ......
    ParamByName('COLUMN1').AsString := PAEdit11.Text;
   ......
    try
    Execsql;
    ShowMessage('수정되었습니다');
    PAQuery2.Close;
    PAQuery2.Open;
    except
    ShowMessage('DBerror');
    Exit;
    end;

이걸로 EDIT박스의 몇개값은 저장되지만...일부는 다른 테이블이라 저장을 못하고 있는데요

한번에 이걸 다 저장시키려면 어떻게 해야 될런지요??

아니...제가 생각하는 방식이 가능한 방법인지요??

제가 생각하는 방식은..ㅡ_ㅡa

with PAQuery3 do
  begin
    Close;
    Sql.Clear;
    Sql.Add(' UPDATE TABLE1 SET com = :com, tel = :tel, ');
   ......
    ParamByName('COLUMN1').AsString := PAEdit11.Text;
   ......
  end;
with PAQuery4 do
  begin
    Close;
    Sql.Clear;
    Sql.Add(' UPDATE TABLE1 SET com = :com, tel = :tel, ');
   ......
    ParamByName('COLUMN1').AsString := PAEdit11.Text;
   ......
   end;
    try
    Execsql;
    ShowMessage('수정되었습니다');
    PAQuery2.Close;
    PAQuery2.Open;
    except
    ShowMessage('DBerror');
    Exit;
    end;

이렇게 두개를 묶어서..ㅡ,.ㅡ;;

가능한 방법인가요??  저의 허접함에 놀라지 마시고...좀 도와주세요...ㅠ_ㅠ

2  COMMENTS
  • Profile
    물고기나라 2002.11.11 21:15

    묶어서 처리 할 수 있습니다.
    처리할 건이 그러니깐 테이블 수만큼 받은값으로 UPDATE 처리 해야된다면
    운 좋게 업데이트할 테이블의 필드이름이 똑같다면 FOR 루프를 돌면
    for i :=0 to 업데이트 개수 do begin
    WITH Query1 DO TRY  
        Close;
        Sql.Clear;
        Sql.Add(' UPDATE TABLE1 SET com = :com, tel = :tel, ');
        --> 테이블이름을 배열로 저장해서 변수 i로 쿼리문을 조정해도 되겠네요
              필드 이름두요.
        Params[0].AsString := 수정문장;
        Params[1].AsString := 수정문장;
        ExecSQL;
    EXCEPT
        ShowMessage('DBerror');
        Exit;
    END;
    end;

    위에꺼 부담되면 이렇게 해도 괜찮겠네요.
    WITH Query1 DO TRY  
        Close;
        Sql.Clear;
        Sql.Add(' UPDATE TABLE1 SET com = :com, tel = :tel, ');
        ParamByName('com').AsString := PAEdit11.Text;
        ParamByName('tel').AsString    := PAEdit11.Text;
        ExecSQL;

        Close;
        Sql.Clear;
        Sql.Add(' 다른테이블 업테이트 쿼리문 ');
        Params[0].AsString := 수정문장;
        Params[1].AsString := 수정문장;
        ExecSQL;

        Close;
        Sql.Clear;
        Sql.Add(' 또 다른테이블 업테이트 쿼리문 ');
        Params[0].AsString := 수정문장;
        Params[1].AsString := 수정문장;
        ExecSQL;
    EXCEPT
        ShowMessage('DBerror');
        Exit;
    END;
  • Profile
    DelChoBo 2002.11.09 04:48
    생각하시는 방식은..
    with PAQuery3 do
      begin
        Close;
        Sql.Clear;
        Sql.Add(' UPDATE TABLE1 SET com = :com, tel = :tel, ');
       ......
        ParamByName('COLUMN1').AsString := PAEdit11.Text;
       ......
      end;
    with PAQuery4 do
      begin
        Close;
        Sql.Clear;
        Sql.Add(' UPDATE TABLE1 SET com = :com, tel = :tel, ');
       ......
        ParamByName('COLUMN1').AsString := PAEdit11.Text;
       ......
       end;
        try
        Execsql;   -->> 이부분이 PaQuery3, PaQuery4 둘다 인거 같은데..
        ShowMessage('수정되었습니다');
        PAQuery2.Close;
        PAQuery2.Open;
        except
        ShowMessage('DBerror');
        Exit;

    위 PaQuery3.ExecSql 이 정상 작동 되고.. PaQuery4에서 에러가 난다면
    롤백되지 않습니다.
    그러니까 PaQuery3만 저장되고 4는 저장이 안되는 거죠..
    3에서 에러가 나거나 에러가 없다면 상관 없지만..
    원하시는 기능은 트랜잭션인거 같은데요..

    한번에 수정 되기를 원하시면 TdataBase 컴포넌트의 트랜잭션 기능을
    쓰시는게 좋을것 같네요.
    인터베이스 등을 쓰시면 IBDATABASE, IBTranSection 컴포넌트를 같이
    쓰시는게.. 또 쓰시는 데이타베이스에 따라 트랜잭션이 지원이 되니..
    위  TDataBase컴포넌트와 트랜잭션에 관해서는 책이나 Q/A 등에
    많이 나오니 검색하시길..