Browse Source

* Fixed bug #15939

git-svn-id: trunk@15856 -
michael 15 years ago
parent
commit
04bd5e208b
1 changed files with 19 additions and 9 deletions
  1. 19 9
      packages/fcl-db/src/sdf/sdfdata.pp

+ 19 - 9
packages/fcl-db/src/sdf/sdfdata.pp

@@ -163,6 +163,7 @@ type
     FBookmarkOfs        :Integer;
     FSaveChanges        :Boolean;
     FDefaultRecordLength:Cardinal;
+    FDataOffset         : Integer;
   protected
     function AllocRecordBuffer: PChar; override;
     procedure FreeRecordBuffer(var Buffer: PChar); override;
@@ -465,7 +466,7 @@ end;
 function TFixedFormatDataSet.GetRecord(Buffer: PChar; GetMode: TGetMode;
   DoCheck: Boolean): TGetResult;
 begin
-  if (FData.Count < 1) then
+  if (FData.Count < (1+FDataOffset)) then
     Result := grEOF
   else
     Result := TxtGetRecord(Buffer, GetMode);
@@ -542,12 +543,12 @@ begin
         else
           Inc(FCurRec);
       gmPrior:
-        if FCurRec <= 0 then
+        if FCurRec <= FDataOffset then
           Result := grBOF
         else
           Dec(FCurRec);
       gmCurrent:
-        if (FCurRec < 0) or (FCurRec >= RecordCount) then
+        if (FCurRec < FDataOffset) or (FCurRec >= RecordCount) then
           Result := grError;
     end;
     if (Result = grOk) then
@@ -851,7 +852,10 @@ begin
   if not IsCursorOpen then
     exit;
   if (FData.Count = 0) or (Trim(FData[0]) = '') then
-    FirstLineAsSchema := FALSE
+    begin
+    FirstLineAsSchema := FALSE;
+    FDataOffset:=0;
+    end
   else if (Schema.Count = 0) or (FirstLineAsSchema) then
   begin
     Schema.Clear;
@@ -902,13 +906,18 @@ begin
   if FirstLineAsSchema then
   begin
     if (FData.Count < 2) then
-      Result := grEOF
+      begin
+      if GetMode=gmPrior then
+       Result := grBOF
+      else
+       Result := grEOF
+      end
     else
-    begin
+      begin
+      If (FCurrec=-1) and (GetMode=gmNext) then
+        inc(FCurrec);
       Result := inherited GetRecord(Buffer, GetMode, DoCheck);
-      if (Result = grOk) and (FCurRec = 0) then
-        Result := inherited GetRecord(Buffer, GetMode, DoCheck);
-    end;
+      end;
   end
   else
     Result := inherited GetRecord(Buffer, GetMode, DoCheck);
@@ -1008,6 +1017,7 @@ procedure TSdfDataSet.SetFirstLineAsSchema(Value : Boolean);
 begin
   CheckInactive;
   FFirstLineAsSchema := Value;
+  FDataOffset:=Ord(FFirstLineAsSchema);
 end;
 
 //-----------------------------------------------------------------------------