Q&A

  • DELETE Query 문 실행후 데이타가 삭제되지 않는 이유는 ???
안녕하세요...

고수님들의 조언을 듣고자 합니다.



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

.

.



이런 구조로 되어있거든요...



두서없는 질문이 되어버렸는데요...

알고계신분은 저한테 꼭 답변을 주셨으면 감사하겠습니다.

좀더 자세한 사항을 알고싶으시면 멜을 주시던지 여기에 글을 올리시면 다시 알려드리겠습니다.



꼭 부탁좀 드리겠습니다....



좋은하루 되세요........... ^.^





1  COMMENTS
  • Profile
    양익호 2000.07.05 23:56
    우동진 wrote:

    > 안녕하세요...

    > 고수님들의 조언을 듣고자 합니다.

    >

    > 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와 같은 기능을

    추가해야 될것같은데요.

    잘 해결되기를 바라면서

    • 박정모
      2000.06.30 03:07
      초보 wrote: > 안녕하십니까? 도사님들의 답변을 기다립니다. > > select * from a > where to_char(a...
    • 성호종
      2000.06.30 04:10
      박정모 wrote: WHERE a_date >= :from_date and a_date 초보 wrote: > > 안녕하십니까? 도사님들...
    • 초보
      2000.06.30 19:00
      정말 감사합니다. 오늘도 좋은 하루 되십시요.. ^_^
    • 김정수
    • 2000.06.30 20:22
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김정수
      2000.06.30 20:17
      김정수 wrote: > [error] > vender initial failed... > cannot load an idapi service library > file...
    • 이재식
      2000.06.30 04:34
      김정수 wrote: > [error] > vender initial failed... > cannot load an idapi service library > file...
    • 이상우
    • 2000.06.30 02:20
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 박정모
      2000.06.30 02:57
      이상우 wrote: > 안녕하세요.. > 다름이 아니오라 너무나 황당한 문제가 있어서요.. > SMTP를 사용하여 ...
    • 이상우
      2000.06.30 03:13
      박정모 wrote: > 이상우 wrote: > > 안녕하세요.. > > 다름이 아니오라 너무나 황당한 문제가 있어서요....
    • 심동훈
      2000.07.01 00:55
      안녕하세요? 심동훈입니다. 최신버전으로 업데이트 해보세요. NetMaster의 홈페이지에 가시면 업데이...
    • 갱수
      2000.07.01 00:20
      박정모 wrote: > 여기 한델에 나와있는 방법을 모두 해봤는데, 되다가 안되다가 하는 코드가 > 많고 또, ...
    • 박정모
      2000.07.01 02:19
      갱수 wrote: > 박정모 wrote: > > 여기 한델에 나와있는 방법을 모두 해봤는데, 되다가 안되다가 하는 코...
    • 코비
      2000.07.02 07:15
      그런 경우는 간단합니다. 소켓으로 80번을 접속해서 해당 쿼리를 보내주시면 됩니다. 중앙일보 같...
    • 우동진
    • 2000.06.30 01:46
    • 1 COMMENTS
    • /
    • 2 LIKES
    • 양익호
      2000.07.05 23:56
      우동진 wrote: > 안녕하세요... > 고수님들의 조언을 듣고자 합니다. > > Query Component 를 사용하...
    • 공성환
    • 2000.06.30 01:27
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.06.30 01:55
      안녕하세요. 최용일입니다. 델코에서 봤는데.. 이게 새롬데이타맨하고 충돌한다고 하더군요. 혹시 그...
    • 공성환
      2000.06.30 03:09
      최용일 wrote: > 안녕하세요. 최용일입니다. > > 델코에서 봤는데.. 이게 새롬데이타맨하고 충돌한다고...
    • 초보
    • 2000.06.30 01:20
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 박정모
      2000.06.30 02:47
      초보 wrote: > 오라클에서 where 조건의 (+)를 파라독스에서 어떤게 > 변경해야 하는지 좀 가르쳐 주세요...
    • 성호종
      2000.06.30 04:16
      박정모 wrote: Left outer join, Full outer join 이것은 델파이가 가지고 있는것이 아니고 paradox가 가...
    • 초보
      2000.06.30 18:56
      감사 감사..^_^ 그런데 노가다는 어떻게 해야 하는지좀... 정말 죄송해서.. ^_^;; 성호종 wrote: > ...
    • 성호종
      2000.06.30 04:18
      성진영 wrote:] 각각의 unit들을 모두 별개의 module로 나누신다음 Quickrep가 포함되지 않았다는 전제하...
    • 호야
    • 2000.06.30 00:59
    • 0 COMMENTS
    • /
    • 0 LIKES
    • hee
    • 2000.06.30 00:51
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 성호종
      2000.06.30 04:42
      hee wrote: protocol 을 TNS로 해보세요... TCP-IP말고... > Network Type Unknown > ORA-03121 > 하면...
    • 호야
    • 2000.06.30 00:48
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2000.06.30 21:27
      안녕하세요. 최용일입니다. 씨로 짜든 뭘로 짜든간에 프로그램을 실행하려면 WinExec나 ShellExecute함...
    • 김만성
    • 2000.06.30 00:35
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 김영환
      2000.06.30 00:58
      김만성 wrote: > > 델피가족 여러분 안녕하세요.. > 진짜로 장마가 시작될려나 비가 오기 시작하는군...
    • 최용일
      2000.06.30 01:44
      안녕하세요. 최용일입니다. 인스톨쉴드에 관한 질문은 인스톨쉴드 홈펭이지에다가 하는 것이 훨씬 더 빠...
    • 류응철
      2000.06.30 02:14
      GetByte란 함수는 없군요...ㅠ.ㅠ 최용일 wrote: > 안녕하세요. 최용일입니다. > > 인스톨쉴드에 ...
    • 최용일
      2000.06.30 03:59
      안녕하세요. 최용일입니다. 인스톨쉴드 버전에 따라 차이가 있더군요. 제가 알려드린것은 IS3이고 IS5에...
    • 류응철
      2000.06.30 02:10
      고맙습니다.... 그리고, 죄송합니다. 영어 열심히 배워서 그쪽에다 질문 올리겠습니다.. 최용일 wrote:...
    • 문홍철
    • 2000.06.29 23:02
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 사발우성
      2000.06.29 23:42
      그부분을 조인하는게 쉽지가 않네엽..... 그래서리....아예 쿼리를 하나 더 사용했습니당....ㅠ.ㅠ ...
    • 김태영
    • 2000.06.29 22:28
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박정모
      2000.06.30 03:19
      김태영 wrote: > 폼을 추가하려고 하는데 갑자기 폼이 추가가 되지 않습니다. 그리고 다음과 같은 에러 메...
    • 사발우성
      2000.06.29 21:42
      그게 아닌가봄당.....다시 갈켜주심 감솨 하겠습니당....
    • 이미나
      2000.06.30 00:15
      사발우성 wrote: > 그게 아닌가봄당.....다시 갈켜주심 감솨 하겠습니당.... 아마도 데이타베이스는 ...
    • 사발우성
      2000.06.30 03:33
      이미나님 감사~ 헐 이미나??? 어디서 마니 들어본이름 같당...혹시 만화가 이미나님... 하하~ 죄성...