2014-04-25 3 views
0

데이터베이스로 절대 데이터베이스를 사용하고 있습니다. 절대 데이터베이스는 트리거를 지원하지 않으므로 내 자신의 UPDATE 트리거를 작성해야합니다. 나는이 방법을 시도 :레코드가 변경 될 때 테이블 타임 스탬프 필드 업데이트

procedure TDataModule2.ABSQuery6AfterPost(DataSet: TDataSet); 
begin 
    ABSQuery4.Close; 
    ABSQuery4.SQL.Clear; 
    ABSQuery4.SQL.Text :='UPDATE MYTABLE SET RECORDCHANGED=CURRENT_TIMESTAMP'; 
    ABSQuery4.ExecSQL; 
end; 

하지만이 방법은 내가 전체 테이블을 업데이 트입니다. 변경된 레코드 (행) 만 업데이트하려면 어떻게합니까?

편집 : 이것은 내가 그것을

당신은 당신의 쿼리에 ''절에 추가해야
procedure TDataModule2.ABSQuery6AfterPost(DataSet: TDataSet); 
begin 
with ABSQuery4 do begin 
ABSQuery4.Close; 
ABSQuery4.SQL.Clear; 
ABSQuery4.SQL.Text :='UPDATE MYTABLE SET RECORDCHANGED=CURRENT_TIMESTAMP WHERE T_ID=:a1'; 
ABSQuery4.Params.ParamByName('a1').AsInteger := ABSQuery6.FieldByName('T_ID').AsInteger; 
ABSQuery4.ExecSQL; 
end; 
end; 

답변

0

을 작동하게하는 방법이다. 은 SQL 그것은 마지막의 ID를 전달하는 것이 가장 좋습니다

update mytable 
set recordchanged = current_timestamp 
where id = id_of_last_changed_record 

이는 TDataSet.BeforePost 이벤트와 매우 정직하고 해결할 수

with ABSQuery4 do 
begin 
    Close; 
    SQL.Clear; 
    SQL.Text :='UPDATE MYTABLE SET RECORDCHANGED=CURRENT_TIMESTAMP WHERE ID = :P1'; 
    sql.params[0].asinteger:= id_of_last_changed_record; 
    ExecSQL; 
end; 
+0

을보고 어디 "id_of_last_changed_record"을받을 수 있나요 – user763539

+1

방금 ​​업데이트 한 기록의 ID를 알고 계실 것입니다. 이드를 모른 채 어떻게 업데이트 했습니까? –

2

코드 만드는 매개 변수를 통해 기록을 변경하게된다 (또한이) .... ???? ... docwiki에서 code sample)

procedure TDataModule2.ABSQuery6BeforePost(DataSet: TDataSet); 
begin 
    DataSet['RECORDCHANGED'] := now; 
end; 
+1

+1하지만 서버와 클라이언트가 시간을 동기화하지 못하는 문제에 유의하십시오. 실제로 서버는 다른 시간대에있을 수도 있습니다.이 경우 기록 된 시간은별로 의미가 없습니다. – Johan

+0

@Sir Rufo - 데이터 집합이 삽입 모드가 아닙니다. 삽입 모드로 설정 한 다음 게시를 호출하면 프로그램이 중단됩니다. – user763539

+0

이 메서드를'BeforePost' 이벤트에 연결 하시겠습니까? 문서가 명확한 것은 데이터를 게시하기 전에 호출되며 데이터 세트가 삽입 또는 편집 상태에 있어야한다는 것입니다. TABSQuery 내부에 버그가있을 수 있습니다. –