tdatasetprovider에서 ongettablename event가 발생 한다면
onbeforeupdaterecord event도 같이 발생을 했을 것입니다.
그 event에서 작업을 진행 하면 됨니다.
해당 event의 parameter를 보면
sourceds : 원본 dataset내용
deltads : 변경된 dataset의 내용
updatekind : 작업된 내용(insert, update, delete중 하나)
applied : 적용 했는지 여부 반환
입니다.
작업 방식은 updatekind의 값이 뭐냐에 따라 db에 해당 query를 실행 시키면 되는 것입니다.
case updatekind of
ukmodify : // 수정 작업
begin
// table이 2개 이니까 query문을 2번 실행 시켜야 합니다.
// 참고로 key에 대한 값은 sourceds에서 fieldbyname으로 해당 값을 찾을수 있고
// 변경된 값은 deltads에서 fieldbyname으로 찾을수 있습니다.
applied := true; // 적용 완료
end;
ukinsert : ; // 삽입작업
begin
applied := true; // 적용 완료
end;
ukdelete : ; // 삭제 작업
begin
applied := true; // 적용 완료
end;
end;
나머지 내용은 modify와 비슷 합니다.
table a와 table b에 대해 query문을 각각 만들어 실행 하면 됨니다.
db2 님이 쓰신 글 :
: sqlconnection -> sqlquery -> datasetprovider -> clientdataset -> datasource -> dbgrid 로 연결후 수정/삭제/입력 후 저장하는 샘플 제작중입니다.
:
: sqlquery에 단일테이블 select 에 대해서는 잘 되는데 테이블 조인후 특정테이블의 값만 db에 반영하려고 하면 어떻게 해야 하는지요.
:
:
: 여기저기 검색한 결과
:
: 1. sqlquery의 필드에 대하여 Providerflag를 설정
:
: 2. datasetprovider의 ongettablename 이벤트에 수정할 테이블명 지정하고 applyupdate하면 될 것 같은데
: 에러메시지도 없고 db에 반영이 안됩니다.
:
:
:
: //sqlquery의 sql문
:
: select b.name,a.*
: from table1 a,
: table2 b
: where a.key=b.key
:
:
: //db반영
: procedure TForm1.SaveButtonClick(Sender: TObject);
: begin
: if clientdataset1.ChangeCount>0 then
: begin
: if clientdataset1.active then
: clientdataset1.CheckBrowseMode;
: clientdataset1.ApplyUpdates(-1);
: end;
: end;
:
:
: //ongettablename 이벤트
: procedure TForm1.DataSetProvider1GetTableName(Sender: TObject; DataSet: TDataSet;
: var TableName: WideString);
: begin
: TableName :='table1';
: end;
:
:
: 위와 같은 소스인데 목적은 table1에 대한 수정/입력/삭제입니다.
: updatesql처럼 DML문장을 제어할 수 있는 속성이나 이벤트가 어디 있을까요?
:
: 미리 감사드립니다.
|