Newsgroup: it.comp.lang.delphi
Titolo: ADO - Impossibile trovare record

Ciao a tutti.
Database MSAccess 2000 con accesso tramite ADO
Una tabella (max una 20ina di record) che contiene dei dati su stagionalità.
Dei record presenti un solo può avere un campo impostato come corrente.
Durante l'uso dell'applicazione devo sempre aver sott'occhio i dati del
record correntem quindi all'avvio apro una ADOQuery (qryStagioneCorrente)
con:
SELECT * FROM stagioni WHERE stg_corrente = true
Fin qui tutto bene.
La maschera di gestione dalla tabella stagioni è composta:
- una griglia corrispondente ad una TADOTable che istantaneamente viene
aperta sulla tabella stagioni (tbStagioni);
- un pannello con all'interno alcune label che puntano ai dati prelevati
dall'unico record della mia qryStagioneCorrente;
- un dbNavigator per navigare nella griglia;
- un pulsante per impostare la riga evidenziata in grid come stagione
corrente;
L'utente può editare tutte le righe che vuole, inserire e cancellare tramite
la grid, mentre, imposta la stagione corrente tramite il pulsante (viene
impostata quella selezionata in grid).
Nel click del pulsante ho inserito:
procedure TfrmStagioni.btCorrenteClick(Sender: TObject);
{ Imposta la stagione selezionata come stagione corrente
}
var
  codStagione: integer;
begin
  with dmStock do begin
    try
      { Salva Eventuali modifiche al record corrente
        e deposita il codice
      }
      if tbStagioni.State = dsBrowse then begin
        tbStagioni.Edit;
        fldStgCorrente.AsBoolean := true;
        tbStagioni.Post;
<----(1)
      end;
      codStagione := fldStgCodice.AsInteger;
      if qryStagioneCorrente.Active then
        qryStagioneCorrente.Active := false;
      tbStagioni.First;
      while not tbStagioni.Eof do begin
        if (fldStgCodice.AsInteger <> codStagione) and
(fldStgCorrente.AsBoolean) then begin
          tbStagioni.Edit;
          fldStgCorrente.AsBoolean := false;
          tbStagioni.Post;
        end;
        tbStagioni.Next;
      end;
    finally
      { Aggiorna i dati
      }
      qryStagioneCorrente.Active := true;
      VerificaSaldi;
    end;
  end;
end;
Avendo bisogno solo del record 'stagione corrente' durante l'uso
dell'applicazione, la tbStagioni viene aperta all'apertura della maschera e
chiusa in chiusura.
La funzione di settaggio del record corrente funziona correttamente solo se
viene eseguita su record già presenti.
Se l'utente apre la maschera (quindi la tabella) ed inserisce uno o piu
record, quando tenta di impostare uno di questi ultimi come corrente in  (1)
mi solleva un'eccezione "Impossibile individuare la riga specificata per
l'aggiornamento. E' possibile che alcuni valori siano stati modificati dopo
l'ultima operazione di lettura".
A questo punto l'unica cosa che mi lascia è premere "Annulla" sul
dbNavigator.
Se chiudo form (e tabella) e rientro, posso impostare correttamente il
record precedente.
Qualcuno sa qualcosa in merito?
Grazie.
Gianluca.

OPS... Delphi 6.0


Scusa Gianluca, perche' non crei una tabella TabStagioneCorrente con un solo campo e ci inserisci
l'Id della stagione impostata come corrente?
Cosi' facendo ti levi i problemi di accesso concorrenziale con la griglia (che presumo ha il dgEditing a true)
e inoltre eviti anche di dover de-flaggare (aAARGHH!!! che idioma englishitalianese....) il precedente record.
Quindi, cosi' facendo, avresti una cosa del genere:
(tbCurrentSeason e' la tabella che ti ho suggerito)
procedure TfrmStagioni.btCorrenteClick(Sender: TObject);
begin  
    try      
      if tbStagioni.State <> dsBrowse then tbStagioni.Post;
      tbCurrentSeason.open;
      tbCurrentSeason.Edit;
      tbCurrentSeason.fieldbyname('IdStagioneAttiva').value := tbStagioni.fieldbyname('fldStgCodice').asinteger;
      tbCurrentSeason.Post;
      tbCurrentSeason.Close;
     excpect on e: exception do begin
     	   MessageDlg('Sei nella menta: '+ e.message , mtError, [mbOK], 0);     	   
     	end;
    finally
      { Aggiorna i dati
      }
      qryStagioneCorrente.Active := true;
      VerificaSaldi;
    end;
  end;
end;
Ciao!
Morde.
morde [at] programmer [.] net

 (tbCurrentSeason e' la tabella che ti ho suggerito)
In effetti ho poi risolto il problema salvando e reperendo il dato nel file
di configurazione del programma.
A volte, piu bisogna far cose semplici, piu ci andiamo a complicare la
vita....
In ogni caso, il problema risiede nel fatto che la griglia ha accesso
concorrenziale alla tabella? Ho provato anche ad usare DisableControls, ma
ho lo stesso risultato.
Grazie.
Gianluca.

ho lo stesso risultato.
La griglia non rimane aggiornata con la tabella, dovresti cercare di fare un refresh
sui datasoruce....
Cmq se ti va prova a mandarmi un zippone con il prg, ci do' un'occhiata e ti faccio sapere.
