Q&A

  • update가 안되여....살려줘여...
음~ 고민하다가 소스전체를 올립니다.

업데이트가 안됩니다..어케하나요?

에궁, 뭐부터 말해야하나..

* 오라클(서버)을 사용하구요,여러가지 별짓 다해봤지만, 안됩니다.

* 예외구문도 무사히(?) 통과하구요..에러도 업습다..

* 근데, DB에 저장이 안됩니다.. 왜 왜 왜 일까요?

* 소스가 잘못된 것일까요? 그럼....잘못된부분을..

* 아님.. 오라클과 델파이 사이에 제가 모르는 뭔가가 있나여?



부디, 하수의 푸념이라 생각 마시고 죽어가는 사람 살리는셈 치고 부탁드립니다..



//===================================================

procedure TFrm_C_GERAI.Change_Info( Order : Integer);

Var

Qry_Update : TQUERY;

begin

Qry_Update := TQuery.Create(Self);

Qry_Update.DataBaseName := 'KING';

// Qry_Update.RequestLive := True; -->이부분을 추가시켜도 안되여..ㅠㅠ



TRY

MAINFRM.DATABASE1.StartTransaction;



//작업지시서 변경

If Order = 1 Then Begin //오더번호와 거래처 변경시.

With Qry_Update Do Begin

Close;

SQL.CLEAR;

SQL.ADD('UPDATE ORDER1');

SQL.ADD(' SET WK_ORNO1 = :CHK_NEWORNO');

SQL.ADD(' , WK_GSCODE = :CHK_GSCODE');

SQL.ADD(' , WK_GSNAME = :CHK_GSNAME');

SQL.ADD(' WHERE WK_ORNO1 = :CHK_ORNO');

PREPARE;

PARAMBYNAME('CHK_ORNO').VALUE := TRIM(EDT_ORNO.TEXT);

PARAMBYNAME('CHK_NEWORNO').VALUE := TRIM(EDT_NEWORNO.TEXT);

PARAMBYNAME('CHK_GSCODE').VALUE := TRIM(EDT_NEWGERAI.TEXT);

PARAMBYNAME('CHK_GSNAME').VALUE := TRIM(CB_NEWGERAINAME.TEXT);

EXECSQL;

End;

End;



//생지 수불 변경

With Qry_Update Do Begin

Close;

SQL.CLEAR;

SQL.ADD('UPDATE SANGJI');

SQL.ADD(' SET S_ORNO1 = :CHK_NEWORNO'); //오더번호

SQL.ADD(' , S_GERAI = :CHK_GSCODE'); //거래처코드

SQL.ADD(' , S_GERAINAME = :CHK_GSNAME'); //거래처 명

SQL.ADD(' , S_IPGOCHUCODE = :CHK_GSCODE'); //입고처코드

SQL.ADD(' , S_IPGOCHUNAME = :CHK_GSNAME'); //입고처 명

SQL.ADD(' WHERE S_ORNO1 = :CHK_ORNO');

PREPARE;

PARAMBYNAME('CHK_ORNO').VALUE := TRIM(EDT_ORNO.TEXT);

PARAMBYNAME('CHK_NEWORNO').VALUE := TRIM(EDT_NEWORNO.TEXT);

PARAMBYNAME('CHK_GSCODE').VALUE := TRIM(EDT_NEWGERAI.TEXT);

PARAMBYNAME('CHK_GSNAME').VALUE := TRIM(CB_NEWGERAINAME.TEXT);

EXECSQL;

End;



//가공지 수불 변경

With Qry_Update Do Begin

Close;

SQL.CLEAR;

SQL.ADD('UPDATE GAGONG');

SQL.ADD(' SET GAGONG_ORNO1 = :CHK_NEWORNO');

SQL.ADD(' , GAGONG_GERAI = :CHK_GSCODE');

SQL.ADD(' , GAGONG_GERAINAME = :CHK_GSNAME');

SQL.ADD(' WHERE GAGONG_ORNO1 = :CHK_ORNO');

PREPARE;

PARAMBYNAME('CHK_ORNO').VALUE := TRIM(EDT_ORNO.TEXT);

PARAMBYNAME('CHK_NEWORNO').VALUE := TRIM(EDT_NEWORNO.TEXT);

PARAMBYNAME('CHK_GSCODE').VALUE := TRIM(EDT_NEWGERAI.TEXT);

PARAMBYNAME('CHK_GSNAME').VALUE := TRIM(CB_NEWGERAINAME.TEXT);

EXECSQL;

End;



//태그 정보 변경

With Qry_Update Do Begin

Close;

SQL.CLEAR;

SQL.ADD('UPDATE TAG_PRINT');

SQL.ADD(' SET ORDER_NO = :CHK_NEWORNO');

SQL.ADD(' WHERE ORDER_NO = :CHK_ORNO');

PREPARE;

PARAMBYNAME('CHK_ORNO').VALUE := TRIM(EDT_ORNO.TEXT);

PARAMBYNAME('CHK_NEWORNO').VALUE := TRIM(EDT_NEWORNO.TEXT);

EXECSQL;

End;



MAINFRM.DATABASE1.Commit;

APPLICATION.MessageBox('변경되었습니다.','변경 확인',MB_OK+MB_ICONINFORMATION);

EXCEPT

MAINFRM.DATABASE1.Rollback;

APPLICATION.MessageBox('수정하는데 실패했습니다.','변경 실패',MB_OK+MB_ICONEXCLAMATION);

END;

Qry_Update.Close;

Qry_Update.UnPrepare;

Qry_Update.Free;

End;



//================================================================================



왜 안될까요???????????

1  COMMENTS
  • Profile
    coolling 2000.07.28 20:45
    어떤 님이 이런 답변을 멜로 보내주셨습니다..

    감사합니다....



    근데 WK_ORNO1 필드에 공백은 없는것 같습니다.. TRIM함수를 사용하면 되는거 아닌가요.

    좀더 자세한 의견을 듣고 싶습니다...



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

    RowsAffected 를 사용하시면 몇개의 레코드가 UPDATE 혹은 DELETE 되었는지 알수가 있습니다

    값이 0으로 나온다면 쿼리의 조건이 맞지 않는것일 테지요

    SQL.ADD(' WHERE WK_ORNO1 = :CHK_ORNO');

    와 같은 문장에서 WK_ORNO1필드에 공백이 삽입되어 있을 가능성도 있으니

    RTRIM 또는 LTRIM 으로 필드의 공백을 제거해 보세요

    쿼리에서 알아야 할것은 RTRIM또는 LTRIM 을 사용하게 되면 수행속도에

    영향을 많이 줍니다 인덱스가 깨져서 FULL SCAN이 되기도 하지요

    만약 공백이 들어가 있다면 디비에 먼저 공백이 생기는 요소를 제거하시고

    사용하시는것이 좋습니다

    하나 추가하여

    그리고 제가 알기로는

    OPEN 이나 CLOSE 메소드를 사용하는것보다는

    ACTIVE := TRUE

    ACTIVE := FALSE

    프로퍼티를 사용하시는게 속도면에서 바람직 하다고 생각됩니다

    물론 SELECT 문 이외에는 EXECSQL을 사용해야지요

    도움이 되었기를..

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