Newsgroup: it.comp.lang.delphi
Titolo: Problemi con SQL e autoinc

Salve a tutti.
Ho un problema da porvi
Io ho un programma che utilizza un db in access. Esiste una tabella register
che controlla e gestisce gli ID di tutte le tabelle quando faccio l'insert,
infatti quando faccio DM.table.insert il comando viene passato all'evento
"IsoleAfterInsert" e l'ID viene autoincrementato...
Il mio problema e' che se uso query il comando Query1.insert non passa x
l'evento e quindi mi si genera una riga nella tabella senza ID...
Spero di essermi spiegato.... Che cosa sto sbagliando???

Spero di essermi spiegato.... 
e' difficile capire precisamente come hai strutturato la logica, se postassi
un po' di codice sarebbe meglio.
CiaO
-- 
Morde. 
(
mo...@despammed.com
)

 id autoincrementate in automatico.
Io ho usato nella register un contatore che mantiene l'ultimo id generato,
ma quando faccio query.insert non passa nell'evento della tabella collegata
alla query x generare l'id, infatti mi crea una riga nel db con id blank e
tutti gli altri campi della tabella in questione movimentati

tutti gli altri campi della tabella in questione movimentati
Non hai risposto alle mie domande...
Se tu fai adoquery.append, non scateni nessun evento se non Beforeinsert della
query stessa, ma NON della tabella "collegata" dalla sql presente nella query.
spiegati meglio per favore perche' e' difficile capire cosa stai usando: ADO o
BDE ?
-- 
Morde. 
(
mo...@despammed.com
)

 ha scritto nel messaggio
news:ovrc00huj34f3p5jb...@4ax.com...


query.insert non va nella procedura tdm.impiantiafterinsert...
7 - Visto che usi ADO, e che prelevi un'intera tabella, utilizza una ADOTable
che e' fatta apposta per questo.
Impianti.insert cambialo in Impianti.Append.
Vai negli eventi della adotable Impianti, fai doppio click su afterinsert e
mettici il codice che invoca Aggiorna_ID.
Ho tolto Tabella.edit perche' sei gia' in insert di un record, quindi potresti
avere problemi.
In questo specifico caso la transazione non serve a un granche', pero' ti
aiuta a capire come sia meglio condensare tutte le scritture su una tabella o
gruppi di tabelle in una sola funzione.
Nel tuo caso fai una insert in una tabella e invochi una funzione che ti
scrive nella tabella stessa il nuovo ID, ma se il post di questa nuova tabella
poi fallisce ? Succede che hai gia' incrementato irrimediabilmente il tuo ID!
A questo proposito, e qui chiudo questo onirico post post-pranzo :), ti
suggerisco di cercare su questo stesso ng le discussioni dove si parlava di
generazioni numeratori (problema vecchio quanto l'informatica)
Ciao!
------------------------------------------
function TDM.Aggiorna_ID(sTabella: String; Tabella: TDataSet): Boolean;
begin
   try
      Result := False;
      TabRegister.Connection.BeginTrans;
      TabRegister.Open;
      if TabRegister.Locate('Tabella',sTabella,[]) then begin
         TabRegister.Edit;
         TabRegisterTabella_Counter.Value :=
TabRegisterTabella_Counter.AsInteger +1;
         TabRegister.Post;
         Tabella['ID'] := Format('%.17d',
[TabRegisterTabella_Counter.AsInteger]);
      end;
      TabRegister.Close;
      TabRegister.Connection.CommitTrans;
      Result := True;
   except on e: exception do begin
         TabRegister.Connection.RollBacktrans;
         MessageDlg('Errore di scrittura sul DB.'+#13+#10+'Codice: ' +
e.Message, mtError, [mbOK], 0);
      end;
   end;
end;
----------------------------------------
-- 
Morde. 
(
mo...@despammed.com
)

 ha scritto nel messaggio
news:u75d009h4hv0g1dk8...@4ax.com...


function TDM.Aggiorna_ID(sTabella: String; Tabella: TDataSet): Boolean;
procedure TDM.ImpiantiAfterInsert(DataSet: TDataSet);
begin
   if not Aggiorna_ID('Impianti',DataSet) then DataSet.Cancel;
end;
procedure TDM.EspiantiAfterInsert(DataSet: TDataSet);
begin
   if not Aggiorna_ID('Espianti',DataSet) then DataSet.Cancel;
end;
procedure TDM.BevoIlChiantiAfterInsert(DataSet: TDataSet);
begin
   if not Aggiorna_ID('BevoIlChianti',DataSet) then DataSet.Cancel;
end;
-- 
Morde. 
(
mo...@despammed.com
)

 ha scritto nel messaggio
news:7a9d009708hvp6hp1...@4ax.com...


non ti piace?
Non lo preferisco perche' tendo sempre a seguire la logica progettuale dei
componenti ADO:
Adotable per lavorare sulle tabelle intere.
Adoquery per visionare ed eventualmente aggiornare viste di dati (join, ecc).
Adocommand per eseguire comandi dove non mi interessa avere un recordset di
ritorno. (es. update di massa, delete di massa, ecc..)
Comunque, non e' sbagliato usare una adoquery per fare un update, solo che non
lo preferisco.
Per ogni questione, il tasto F1 sul componente puo' dirimere tanti altri
dubbi.
-- 
Morde. 
(
mo...@despammed.com
)