Philcattivocarattere ha scritto:
NorinRadd ha scritto:
...
Ho un campo chiamato "numero ordine" che AMMETTE duplicati (come chiave primaria ho un ID a numerazione automatica) e un altro campo che si chiama "numero problematica".
Ho una maschera che permette l'inserimento dei dati e vorrei che ogni volta che viene inserito un "numero ordine" per la prima volta il "numero problematica" è 1, mentre se già il "numero ordine" inserito fosse già esistente vorrei che il contatore di "numero problematica" si incrementasse.
Quello che chiedi è facilmente realizzabile con un DMax ma non funziona se si è in multiutenza. Prima di lanciarmi in link, però, esprimo un dubbio che mi è sorto: temo che le tabelle siano strutturate male. Puoi confermare che hai seguito i principi della normalizzazione o eventualmente, se non l'hai fatto, per quale motivo?
La maschera dovrebbe essere strutturata con maschera principale (con le caratteristiche dell'ordine) e una sottomaschera (per le diverse "problematiche" legate a quell'ordine)
Ciao FIL.
La questione MultiUtenza... in realtà è critica più per le PK e di conseguenza quando al posto del Counter si pensa di usare l'assegnazione di una PK a priori usando il DMAX...!
In tal caso, in Multiutenza, l'uso di DMAX rischia di essere pericoloso... in quanto non si ha la certezza sia veramente l'ultimo...
Tuttavia per essere più chiari, il problema non è l'attribuzione della PK in fase di INSERIMENTO, questo con un COUNTER non accade, quanto appunto il RECUPERO della PK appena inserita... che con DMAX per quello che si diceva prima... potrebbe non essere coerente.
A questo si può sopperire, ricavando il valore reale della PK salvata nel DB in tempo REALE usando:
LastID = DbEngine(0)(0).OpenRecordset("SELECT @@IDENTITY")(0)
Questo non si può fare con un campo che non sia PK, quindi a mio avviso si usa tranquillamente il solito
NZ(DMAX(...))+1
La cosa però da osservare è il MOMENTO in cui si attribuisce il Valore che non potrà essere come DEFAULT VALUE, ma piuttosto su BEFOREUPDATE.