* Locate by default starts from 0th record. Add option to allow search from current. Fix date handling

This commit is contained in:
michael 2019-05-18 14:20:45 +00:00
parent c149455dce
commit 0a0fd7dfe0
2 changed files with 39 additions and 24 deletions

View File

@ -1002,7 +1002,7 @@ type
TUpdateAction = (uaFail, uaAbort, uaSkip, uaRetry, uaApplied);
TUpdateKind = (ukModify, ukInsert, ukDelete);
TLocateOption = (loCaseInsensitive, loPartialKey);
TLocateOption = (loCaseInsensitive, loPartialKey, loFromCurrent);
TLocateOptions = set of TLocateOption;
TDataOperation = procedure of object;
@ -1293,10 +1293,10 @@ type
procedure Append;
procedure AppendRecord(const Values: array of jsValue);
function BookmarkValid(ABookmark{%H-}: TBookmark): Boolean; virtual;
function ConvertToDateTime(aValue : JSValue; ARaiseException : Boolean) : TDateTime; virtual;
function ConvertDateTimeToNative(aValue : TDateTime) : JSValue; virtual;
Class function DefaultConvertToDateTime(aValue : JSValue; ARaiseException{%H-} : Boolean) : TDateTime; virtual;
Class function DefaultConvertDateTimeToNative(aValue : TDateTime) : JSValue; virtual;
function ConvertToDateTime(aField : TField; aValue : JSValue; ARaiseException : Boolean) : TDateTime; virtual;
function ConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; virtual;
Class function DefaultConvertToDateTime(aField : TField; aValue : JSValue; ARaiseException{%H-} : Boolean) : TDateTime; virtual;
Class function DefaultConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; virtual;
Function BlobDataToBytes(aValue : JSValue) : TBytes; virtual;
Class Function DefaultBlobDataToBytes(aValue : JSValue) : TBytes; virtual;
Function BytesToBlobData(aValue : TBytes) : JSValue ; virtual;
@ -3867,12 +3867,12 @@ end;
function TDataSet.ConvertToDateTime(aValue: JSValue; ARaiseException: Boolean): TDateTime;
function TDataSet.ConvertToDateTime(aField: TField; aValue: JSValue; ARaiseException: Boolean): TDateTime;
begin
Result:=DefaultConvertToDateTime(aValue,ARaiseException);
Result:=DefaultConvertToDateTime(aField,aValue,ARaiseException);
end;
class function TDataSet.DefaultConvertToDateTime(aValue: JSValue; ARaiseException: Boolean): TDateTime;
class function TDataSet.DefaultConvertToDateTime(aField: TField; aValue: JSValue; ARaiseException: Boolean): TDateTime;
begin
Result:=0;
if IsString(aValue) then
@ -3884,13 +3884,13 @@ begin
Result:=TDateTime(AValue)
end;
function TDataSet.ConvertDateTimeToNative(aValue : TDateTime) : JSValue;
function TDataSet.ConvertDateTimeToNative(aField: TField; aValue : TDateTime) : JSValue;
begin
Result:=DefaultConvertDateTimeToNative(aValue);
Result:=DefaultConvertDateTimeToNative(aField, aValue);
end;
Class function TDataSet.DefaultConvertDateTimeToNative(aValue : TDateTime) : JSValue;
Class function TDataSet.DefaultConvertDateTimeToNative(aField : TField;aValue : TDateTime) : JSValue;
begin
Result:=DateTimeToRFC3339(aValue);
@ -6735,18 +6735,20 @@ end;
function TDateTimeField.ConvertToDateTime(aValue: JSValue; aRaiseError: Boolean): TDateTime;
begin
if Assigned(Dataset) then
Result:=Dataset.ConvertToDateTime(aValue,aRaiseError)
if JS.isNull(aValue) then
Result:=0
else if Assigned(Dataset) then
Result:=Dataset.ConvertToDateTime(Self,aValue,aRaiseError)
else
Result:=TDataset.DefaultConvertToDateTime(aValue,aRaiseError);
Result:=TDataset.DefaultConvertToDateTime(Self,aValue,aRaiseError);
end;
function TDateTimeField.DateTimeToNativeDateTime(aValue: TDateTime): JSValue;
begin
if Assigned(Dataset) then
Result:=Dataset.ConvertDateTimeToNative(aValue)
Result:=Dataset.ConvertDateTimeToNative(Self,aValue)
else
Result:=TDataset.DefaultConvertDateTimeToNative(aValue);
Result:=TDataset.DefaultConvertDateTimeToNative(Self,aValue);
end;
function TDateTimeField.GetAsDateTime: TDateTime;
@ -7107,9 +7109,9 @@ Var
begin
V:=GetData;
if Assigned(Dataset) then
Result:=Dataset.ConvertToDateTime(V,True)
Result:=Dataset.ConvertToDateTime(Self,V,True)
else
Result:=TDataset.DefaultConvertToDateTime(V,True)
Result:=TDataset.DefaultConvertToDateTime(Self,V,True)
end;
function TVariantField.GetAsFloat: Double;

View File

@ -282,6 +282,7 @@ type
procedure SetRows(AValue: TJSArray);
procedure SetRowType(AValue: TJSONRowType);
protected
function ConvertDateTimeToNative(aField : TField; aValue : TDateTime) : JSValue; override;
// Determine filter value type based on field type
function FieldTypeToExpressionType(aDataType: TFieldType): TResultType; virtual;
// Callback for IsNull filter function.
@ -643,7 +644,7 @@ var
begin
D1:=Dataset.ConvertDateTimeField(String(GetFieldValue(Rowindex)),Self.Field);
D2:=TDateTime(aValue);
D2:=Dataset.ConvertDateTimeField(String(aValue),Self.Field);
Result:=Round(D1-D2);
end;
@ -1085,6 +1086,15 @@ begin
FRowType:=AValue;
end;
function TBaseJSONDataSet.ConvertDateTimeToNative(aField : TField; aValue: TDateTime): JSValue;
begin
if jsISNan(aValue) then
Result:=Null
else
Result:=FormatDateTimeField(aValue,aField)
end;
function TBaseJSONDataSet.AllocRecordBuffer: TDataRecord;
begin
@ -1174,7 +1184,7 @@ begin
Result:=TFPExpressionParser;
end;
function TBaseJSONDataSet.GetFilterIsNull(Const Args : TExprParameterArray) : TFPExpressionResult;
function TBaseJSONDataSet.GetFilterIsNull(const Args: TExprParameterArray): TFPExpressionResult;
begin
Result.ResultType:=rtBoolean;
@ -1201,7 +1211,7 @@ begin
end;
end;
function TBaseJSONDataSet.GetFilterField(Const AName : String) : TFPExpressionResult;
function TBaseJSONDataSet.GetFilterField(const AName: String): TFPExpressionResult;
Var
F : TField;
@ -1265,7 +1275,7 @@ begin
end;
end;
function TBaseJSONDataSet.GetRecord(Var Buffer: TDataRecord; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
function TBaseJSONDataSet.GetRecord(var Buffer: TDataRecord; GetMode: TGetMode; DoCheck: Boolean): TGetResult;
Var
BkmIdx : Integer;
@ -1689,7 +1699,7 @@ begin
inherited;
end;
Function TBaseJSONDataSet.CreateIndexDefs : TJSONIndexDefs;
function TBaseJSONDataSet.CreateIndexDefs: TJSONIndexDefs;
begin
Result:=TJSONIndexDefs.Create(Self,Self,TJSONIndexDef);
@ -1722,7 +1732,10 @@ begin
Result:=-1;
Comp:=RecordComparerClass.Create(Self,KeyFields,KeyValues,Options);
try
I:=FCurrent;
if loFromCurrent in Options then
I:=FCurrent
else
I:=0;
RI:=FCurrentIndex.GetRecordIndex(I);
While (Result=-1) and (RI<>-1) do
begin