일부 완성된 프로그램을 보완중.... DataSet의 null에 의해 문제가 발생한 경우가 있다. 상황1) Field.AsString := '1'; 일때
  
var
  i: Integer;
begin
  i := Field.AsInteger;  <-- 정상적으로 1이 rerutn된다.
end;

상황2) Field.Value := null 일때
  
var
  i: Integer;
begin
  i := Field.AsInteger; <-- 에러를 발생하게 된다.
end;
['' is not integer value ....] 애초에 이러한 문제를 피해 개발을 해야 겠지만.. 이미 개발되어 있는 경우 많은 부분을 수정, 보완 해야 한다.
  
if Field.IsNull then
  i := 0
else
  i := Field.AsInteger;
or
i := StrToIntDef(Field.AsString, 0);
등등.. 많은 방법이 있을수 있겠다..
현재 검토중인 소스를 기반으로 보았을때 null일 경우는 모두 0으로 바꿔야 한다는 전재 조건이 있어 위와 같이 수정을 하려 보니 ... ㅜㅜ
좀더 쉽게 접근하는 방법을 찾아 보자...
  
TStringField = class(Data.DB.TStringField)
protected
  function GetAsInteger: LongInt; override;
end;

function TStringField.GetAsInteger: LongInt;
begin
  Result := StrToIntDef(AsString, 0);
end;

or

function TStringField.GetAsInteger: LongInt;
begin
  if AsString = '' then
    Result := 0
else
    Result := inherited(AsInteger);
end;
위 방법을 사용해 보니 Design time에서 생성된 ClientDataSet의 경우 잘 동작 한다. 하지만... Run time에서 동적생성한 ClientDataSet은 동작하지 않았다... ㅡㅡ 그래서 찾은 방법... 프로그램의 Default로 지정된 TField를 바꿔보자..
  
TMyStringField = class(Data.DB.TStringField)
protected
  function GetAsInteger: LongInt; override;
end;

function TMyStringField.GetAsInteger: LongInt;
begin
  if AsString = '' then
    Result := 0
else
    Result := inherited(AsInteger);
end;

initialization
  RegisterClass(TMyStringField);
  DefaultFieldClasses[ftString] := TMyStringField;
finalization
  UnRegisterClass(TMyStringField);
ㅎ.... 잘된다.. 원하는 대로..

'Delphi' 카테고리의 다른 글

7Zip with Delphi (펌)  (0) 2018.09.21
Call function (procedure) as "Method Name"  (0) 2018.09.10
ApplicationEvent.OnException 한곳에서 처리  (0) 2018.09.10
FireDAC DataSet의 변경된 Record 확인  (0) 2018.09.10
GetFileInfo  (0) 2018.09.06
Posted by Revers Tuna
,
Using TApplicationEvent component event OnException
Apply try .. except
  
try
except
  on e: exception do
    Application.OnException(self, e);  // into TApplicatoinEvent.OnException event
Posted by Revers Tuna
,
TFDDataSet의 변경 이력은 ChangeLog를 통해 기록에 남게 된다.
변경된 Record만 검색 하는 방법으로는 


1. FilterChange를 이용.

  
FDDataSet.FilterChange := [rtModified, rtInserted, rtDeleted];
를 하게 되면 변경된 데이터만 남게 된다.

 단점으로는 변경된 Record는 알수 있지만 변경 순서까지는 확인이 되지 않는다. 

  (Sorting이 안됨....)


2. 두번째로는 TFDDatSUpdatesJournal를 이용하는 방법이다. 
  
var
  oJournal: TFDDatSUpdatesJournal;
  oRow: TFDDatSRow;
begin
  oJournal := FDDataSet.Delta.DataView.Manager.Updates;
  if oJournal = nil then
    Exit;

  oRow := oJournal.FirstChange;
  while oRow <> nil then
  begin
    // To Do
    oRow := oJournal.NextChange(oRow);
  end;
end; 

- Data는 GetValue, GetData를 사용

  oRow.GetData("Column Name or Column Index", TFDDatSRowVersion)

  [TFDDatSRowVersion]

  rvOriginal: 원본 (OldValue)

  rvDefault: 현재값(NewValue)

Posted by Revers Tuna
,