2012-04-03 4 views
6

Ich habe eine TTable-Komponente, die die BDE verwendet, um auf eine DBase-Tabelle zuzugreifen. Es gibt keinen Index für die Tabelle, daher ist die Sortierreihenfolge die physische Reihenfolge der Datensätze in der Tabelle. Wenn ich die RecNo-Eigenschaft lese, enthält sie die erwartete Zahl für den aktuellen Datensatz.Warum wird das Festlegen der RecNo-Eigenschaft einer Tabelle nicht in diesen Datensatz verschoben?

Ich hatte den Eindruck, dass es mit dieser Konstellation (BDE + DBase) auch möglich ist, die RecNo-Eigenschaft auf den entsprechenden Datensatz zu setzen. Aber anscheinend funktioniert das nicht in meinem Programm.

Also: Erinnere ich mich daran falsch? Oder muss ich etwas Besonderes tun, damit dies funktioniert?

(Bitte nicht raten, über die BDE fallen zu lassen. Ich bin mir bewusst, seine Probleme und wir sind bereits von ihm Migration weg.)

Antwort

8

TBDEDataSet implementiert RecNo Setter nur für Paradox (nicht DBase).

unit DBTables; 
... 
procedure TBDEDataSet.SetRecNo(Value: Integer); 
begin 
    CheckBrowseMode; 
    if (FRecNoStatus = rnParadox) and (Value <> RecNo) then 
    begin 
    DoBeforeScroll; 
    if DbiSetToSeqNo(Handle, Value) = DBIERR_NONE then 
    begin 
     Resync([rmCenter]); 
     DoAfterScroll; 
    end; 
    end; 
end; 

Vielleicht möchten Sie etwas generisch so versuchen:

procedure SetRecNo(DataSet: TDataSet; const RecNo: Integer); 
var 
    ActiveRecNo, Distance: Integer; 
begin 
    if (RecNo > 0) then 
    begin 
    ActiveRecNo := DataSet.RecNo; 
    if (RecNo <> ActiveRecNo) then 
    begin 
     DataSet.DisableControls; 
     try 
     Distance := RecNo - ActiveRecNo; 
     DataSet.MoveBy(Distance); 
     finally 
     DataSet.EnableControls; 
     end; 
    end; 
    end; 
end; 
+0

Oder sonst etwas von ihren Primärschlüssel [dbase] finden. Oder Abfrage auf Primärschlüssel [sql]. –