음~ 고민하다가 소스전체를 올립니다.
업데이트가 안됩니다..어케하나요?
에궁, 뭐부터 말해야하나..
* 오라클(서버)을 사용하구요,여러가지 별짓 다해봤지만, 안됩니다.
* 예외구문도 무사히(?) 통과하구요..에러도 업습다..
* 근데, 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;
//================================================================================
왜 안될까요???????????
감사합니다....
근데 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을 사용해야지요
도움이 되었기를..
----------------------------------------------------------------------------------