2012-04-03 7 views
6

Ho un componente TTable che usa BDE per accedere a una tabella DBase. Non esiste un indice sulla tabella, quindi l'ordinamento è l'ordine fisico dei record nella tabella. Se leggo la proprietà RecNo, contiene il numero previsto per il record corrente.Perché l'impostazione della proprietà RecNo di una tabella non si sposta su tale record?

Ho avuto l'impressione che con questa costellazione (BDE + DBase) è anche possibile impostare la proprietà RecNo per spostarsi sul record corrispondente. Ma a quanto pare questo non funziona nel mio programma.

Quindi: lo ricordo male? O c'è qualcosa di speciale che devo fare perché funzioni?

(Si prega di non consiglio di far cadere il BDE. Sono consapevole dei suoi problemi e stiamo già migrando lontano da esso.)

risposta

8

TBDEDataSet implementa RecNo setter solo per Paradox (non 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; 

Si potrebbe desiderare di provare qualcosa di generico come questo:

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

Oppure individuare qualcosa per la sua chiave primaria [dbase]. Oppure interrogare sulla chiave primaria [sql]. –

Problemi correlati