안녕하세요...
고수님들의 조언을 듣고자 합니다.
Query Component 를 사용하여 Delete를 하였는데 작업은 오류가 없으나 실제 테이블에
있는 데이타가 삭제가 되질 않아요.
다음과 같은 방식으로 하였거든요...
function TDBViewForm.DeleteSQLExec(sTableName, sFieldName, sFieldValue: string): Boolean;
begin
Result := FALSE;
with Qry do begin
Close;
SQL.Clear;
SQL.Add('DELETE FROM ');
SQL.Add(sTableName);
SQL.Add(' WHERE ');
SQL.Add(sFieldName);
SQL.Add(' = ''');
SQL.Add(sFieldValue);
SQL.Add('''');
end;
if not ExecuteSqlQuery(Qry, 'DELETE') then EXIT;
Result := TRUE;
end;
function ExecuteSqlQuery(Qry: TQuery; UseMode: string): Boolean;
var
ErrCode: word;
ErrString: array[0..DBIMAXMSGLEN + 1] of Char;
begin
Result := FALSE;
try
if UseMode = 'OPEN' then Qry.Open
else Qry.ExecSQL;
except
// on E : EDataBaseError do
on E : EDBEngineError do
begin
ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;
DbiGetErrorString(ErrCode, ErrString);
MessBox(UseMode + ' Error 입니다' + #13 +
Format('Error Code : %6d', [ErrCode]) + #13 +
Format('Error String : %s', [ErrString]), 'DataBase 오류', 4, 0, 1);
Qry.Close;
EXIT;
end;
end;
Result := TRUE;
end;
function MessBox(Body: string; Title: string; Icon: byte; Buttons: byte; Focus: byte): byte;
var
ParaST: integer;
begin
RESULT := 0;
ParaST := 0;
//-- 대화상자 아이콘 선택
case Icon of
1: ParaST := ParaST + MB_ICONEXCLAMATION;
2: ParaST := ParaST + MB_ICONINFORMATION;
3: ParaST := ParaST + MB_ICONQUESTION;
4: ParaST := ParaST + MB_ICONSTOP;
else ParaST := 0;
end;
//-- 대화상자 버튼 종류 선택
case Buttons of
0: ParaST := ParaST + MB_OK;
1: ParaST := ParaST + MB_OKCANCEL;
2: ParaST := ParaST + MB_ABORTRETRYIGNORE;
3: ParaST := ParaST + MB_YESNOCANCEL;
4: ParaST := ParaST + MB_YESNO;
5: ParaST := ParaST + MB_RETRYCANCEL;
6: ParaST := ParaST + MB_HELP;
else ParaST := ParaST + MB_OK;
end;
//-- 대화상자 디폴트 버튼 선택
case Focus of
1: ParaST := ParaST + MB_DEFBUTTON1;
2: ParaST := ParaST + MB_DEFBUTTON2;
3: ParaST := ParaST + MB_DEFBUTTON3;
4: ParaST := ParaST + MB_DEFBUTTON4;
else ParaST := ParaST + MB_DEFBUTTON1;
end;
//-- 대화상자 눌러진 버튼값 설정
case application.MessageBox(PChar(Body), PChar(Title), ParaST) of
IDOK: RESULT := 1;
IDCANCEL: RESULT := 2;
IDYES: RESULT := 3;
IDNO: RESULT := 4;
IDABORT: RESULT := 5;
IDIGNORE: RESULT := 6;
IDRETRY: RESULT := 7;
end;
end;
//-- 실제 데이타 지우는 Procedure
procedure TDBViewForm.DeleteBtnClick(Sender: TObject);
var
DeleteFieldValue: string;
begin
if MessBox('선택한 자료에 해당하는 모든자료를 삭제합니다', '삭제 확인', 3, 4, 2) = 3 then begin
DeleteFieldValue := A_Tbl.FieldByName('AAA').AsString;
if not DeleteSQLExec(C_Tbl.TableName, 'AAA', DeleteFieldValue) then EXIT;
if not DeleteSQLExec(B_Tbl.TableName, 'AAA', DeleteFieldValue) then EXIT;
if not DeleteSQLExec(A_Tbl.TableName, 'AAA', DeleteFieldValue) then EXIT;
end;
end;
이와 같이 작업을 하면 오류는 발생하지는 않는데 삭제되어야 할 데이타가 삭제가 되지 않거든요.....
고수님들의 조언을 부탁드립니다..
참고로 설명을 드리자면
각 기준별로 테이블 3개를 가지고 있고 각 테이블을 동적으로 생성하기때문에
고유의 물리적인 테이블명을 알수없기에 SQL 문에서 테이블명을 변수를 사용하였구요.
A, B, C 테이블은 각각 Master/Detail 관계를 가지고 있어여
A 테이블이 마스타이고 B 테이블이 디테일이 됩니다 또한
B 테이블이 마스타이고 C 테이블이 디테일이 됩니다.
A 테이블 구조
AAA 키
XXX
XXX
.
.
B 테이블 구조 "Master Field = AAA"
AAA 키
BBB 키
XXX
XXX
.
.
C 테이블 구조 "Master Field = AAA;BBB"
AAA 키
BBB 키
CCC 키
XXX
XXX
.
.
이런 구조로 되어있거든요...
두서없는 질문이 되어버렸는데요...
알고계신분은 저한테 꼭 답변을 주셨으면 감사하겠습니다.
좀더 자세한 사항을 알고싶으시면 멜을 주시던지 여기에 글을 올리시면 다시 알려드리겠습니다.
꼭 부탁좀 드리겠습니다....
좋은하루 되세요........... ^.^
> 안녕하세요...
> 고수님들의 조언을 듣고자 합니다.
>
> Query Component 를 사용하여 Delete를 하였는데 작업은 오류가 없으나 실제 테이블에
> 있는 데이타가 삭제가 되질 않아요.
>
> 다음과 같은 방식으로 하였거든요...
>
>
>
> function TDBViewForm.DeleteSQLExec(sTableName, sFieldName, sFieldValue: string): Boolean;
> begin
> Result := FALSE;
> with Qry do begin
> Close;
> SQL.Clear;
> SQL.Add('DELETE FROM ');
> SQL.Add(sTableName);
> SQL.Add(' WHERE ');
> SQL.Add(sFieldName);
> SQL.Add(' = ''');
> SQL.Add(sFieldValue);
> SQL.Add('''');
> end;
>
> if not ExecuteSqlQuery(Qry, 'DELETE') then EXIT;
> Result := TRUE;
> end;
>
>
> function ExecuteSqlQuery(Qry: TQuery; UseMode: string): Boolean;
> var
> ErrCode: word;
> ErrString: array[0..DBIMAXMSGLEN + 1] of Char;
> begin
> Result := FALSE;
> try
> if UseMode = 'OPEN' then Qry.Open
> else Qry.ExecSQL;
> except
> // on E : EDataBaseError do
> on E : EDBEngineError do
> begin
> ErrCode := (E as EDBEngineError).Errors[0].ErrorCode;
> DbiGetErrorString(ErrCode, ErrString);
> MessBox(UseMode + ' Error 입니다' + #13 +
> Format('Error Code : %6d', [ErrCode]) + #13 +
> Format('Error String : %s', [ErrString]), 'DataBase 오류', 4, 0, 1);
> Qry.Close;
> EXIT;
> end;
> end;
> Result := TRUE;
> end;
>
>
> function MessBox(Body: string; Title: string; Icon: byte; Buttons: byte; Focus: byte): byte;
> var
> ParaST: integer;
> begin
> RESULT := 0;
> ParaST := 0;
> //-- 대화상자 아이콘 선택
> case Icon of
> 1: ParaST := ParaST + MB_ICONEXCLAMATION;
> 2: ParaST := ParaST + MB_ICONINFORMATION;
> 3: ParaST := ParaST + MB_ICONQUESTION;
> 4: ParaST := ParaST + MB_ICONSTOP;
> else ParaST := 0;
> end;
> //-- 대화상자 버튼 종류 선택
> case Buttons of
> 0: ParaST := ParaST + MB_OK;
> 1: ParaST := ParaST + MB_OKCANCEL;
> 2: ParaST := ParaST + MB_ABORTRETRYIGNORE;
> 3: ParaST := ParaST + MB_YESNOCANCEL;
> 4: ParaST := ParaST + MB_YESNO;
> 5: ParaST := ParaST + MB_RETRYCANCEL;
> 6: ParaST := ParaST + MB_HELP;
> else ParaST := ParaST + MB_OK;
> end;
> //-- 대화상자 디폴트 버튼 선택
> case Focus of
> 1: ParaST := ParaST + MB_DEFBUTTON1;
> 2: ParaST := ParaST + MB_DEFBUTTON2;
> 3: ParaST := ParaST + MB_DEFBUTTON3;
> 4: ParaST := ParaST + MB_DEFBUTTON4;
> else ParaST := ParaST + MB_DEFBUTTON1;
> end;
> //-- 대화상자 눌러진 버튼값 설정
> case application.MessageBox(PChar(Body), PChar(Title), ParaST) of
> IDOK: RESULT := 1;
> IDCANCEL: RESULT := 2;
> IDYES: RESULT := 3;
> IDNO: RESULT := 4;
> IDABORT: RESULT := 5;
> IDIGNORE: RESULT := 6;
> IDRETRY: RESULT := 7;
> end;
> end;
>
>
> //-- 실제 데이타 지우는 Procedure
>
> procedure TDBViewForm.DeleteBtnClick(Sender: TObject);
> var
> DeleteFieldValue: string;
> begin
> if MessBox('선택한 자료에 해당하는 모든자료를 삭제합니다', '삭제 확인', 3, 4, 2) = 3 then begin
> DeleteFieldValue := A_Tbl.FieldByName('AAA').AsString;
>
> if not DeleteSQLExec(C_Tbl.TableName, 'AAA', DeleteFieldValue) then EXIT;
> if not DeleteSQLExec(B_Tbl.TableName, 'AAA', DeleteFieldValue) then EXIT;
> if not DeleteSQLExec(A_Tbl.TableName, 'AAA', DeleteFieldValue) then EXIT;
> end;
> end;
>
>
> 이와 같이 작업을 하면 오류는 발생하지는 않는데 삭제되어야 할 데이타가 삭제가 되지 않거든요.....
>
> 고수님들의 조언을 부탁드립니다..
>
> 참고로 설명을 드리자면
> 각 기준별로 테이블 3개를 가지고 있고 각 테이블을 동적으로 생성하기때문에
> 고유의 물리적인 테이블명을 알수없기에 SQL 문에서 테이블명을 변수를 사용하였구요.
>
> A, B, C 테이블은 각각 Master/Detail 관계를 가지고 있어여
>
> A 테이블이 마스타이고 B 테이블이 디테일이 됩니다 또한
> B 테이블이 마스타이고 C 테이블이 디테일이 됩니다.
>
> A 테이블 구조
> AAA 키
> XXX
> XXX
> .
> .
>
> B 테이블 구조 "Master Field = AAA"
> AAA 키
> BBB 키
> XXX
> XXX
> .
> .
>
> C 테이블 구조 "Master Field = AAA;BBB"
>
> AAA 키
> BBB 키
> CCC 키
> XXX
> XXX
> .
> .
>
> 이런 구조로 되어있거든요...
>
> 두서없는 질문이 되어버렸는데요...
> 알고계신분은 저한테 꼭 답변을 주셨으면 감사하겠습니다.
> 좀더 자세한 사항을 알고싶으시면 멜을 주시던지 여기에 글을 올리시면 다시 알려드리겠습니다.
>
> 꼭 부탁좀 드리겠습니다....
>
> 좋은하루 되세요........... ^.^
>
>
DB가 무엇인지 잘 모르지만
제가 보기엔 sqld을 생성하시고
실행을 안한것 같아요.
참고로 저는 SYBASE를 사용하는데
select는 sql.open을 사용하고
delete,insert,update는 sql.exec를 사용합니다.
그라니까
sql.add();
.
.
sql.add();를 하시고
밑에서 function call한후 sql.open이나 sql.exec와 같은 기능을
추가해야 될것같은데요.
잘 해결되기를 바라면서