일부 완성된 프로그램을 보완중....
DataSet의 null에 의해 문제가 발생한 경우가 있다.
상황1)
Field.AsString := '1'; 일때
상황2) Field.Value := null 일때
현재 검토중인 소스를 기반으로 보았을때 null일 경우는 모두 0으로 바꿔야 한다는 전재 조건이 있어 위와 같이 수정을 하려 보니 ... ㅜㅜ
좀더 쉽게 접근하는 방법을 찾아 보자...
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 |