Newsgroup: it.comp.appl.access
Titolo: Campo con chiave univoca

é possibile far si che in un campo come all'oggetto di questo post, ad ogni
inserimento di un nuovo record mi proponga il numero successivo all'ultimo
inserito? faccio un esempio:
in una tabella anagrafica ho un campo "codice ditta" in cui devo inserire un
numero, però ogni volta che inserisco una nuova ditta mi devo andare a
vedere quale è l'ultimo inserito, bello sarebbe se avessi la possibilita di
trovarmi già nel campo della maschera il numero che devo inserire.
qualcuno mi potrebbe consigliare di metterci un contatore, ma questo mi
mette il numero che vuole lui,si successivo, ma nel caso volessi metterci un
numero diverso non me lo consentirebbe.
Ciao Fabry.

 ha scritto nel messaggio
news:ufGb9.122550$lu5.3...@twister1.libero.it...

Ho visto qlc sul sito comune sui campi contatori, non capisco però: vuoi che
Access ti suggerisca il numero che dovresti mettere e poi decidi tu se ti va
bene?
Ciao. Fabrizio.

"Fabrizio" <fabrizio...@SPAMtiscalinet.it> ha scritto nel messaggio
news:akncek$s8b$1...@lacerta.tiscalinet.it...

 Ho già spulciato il sito comune ma niente.
Access mi deve suggerire,ma poi sta a me decidere se va bene quel numero.
Certo potrei creare una casella di testo(non visibile) nella maschera a cui
assegno il valore massimo del campo in oggetto
attraverso una query, eppoi assegnare in apertura della form il valore della
castext al campocodiceditta.
cercavo però qulcs di + semplice


select max(campo)+1 from tabella
a.cara

 cercavo però qulcs di + semplice
Sinceramente non saprei come.
Ciao.Fabrizio.

 ha scritto nel messaggio
news:3D6F3793...@blunet.it...

dove la metto? su evento attivato del campo in questione?

 ha scritto nel messaggio
news:ufGb9.122550$lu5.3...@twister1.libero.it...

Probabilmente l'inserimento avviene attraverso una maschera, basta che tu
realizzi una macro che ti posizione all'ultimo record iserito a questo punto
puoi inserire manualemnte il nuovo codice, o semplicemente utilizzare un
campo contatore per tale codice cliente ( sia progressivo che random)
Ciao Giuseppe


Nell'evento della maschera prima di inserire scrivi il seguente codice:
Private Sub Form_BeforeInsert(Cancel As Integer)
  Me.Riga = GetNumeroRiga
End Sub
Private Function GetNumeroRiga() As Long
  Dim strSQL As String
  Dim rcs As Recordset
  strSQL = "SELECT Riga FROM [Dettaglio Fatture] WHERE " & _
           "IDFattura = " & 
Me.Parent.ID
 & " " & _
           "ORDER BY Riga DESC"
  Set rcs = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
  If rcs.EOF = True Then
    GetNumeroRiga = 1
  Else
    GetNumeroRiga = rcs!Riga + 1
  End If
  rcs.Close
End Function
Lo devi aggiustare un po' in base al campo della maschera nel mio caso si
chiama riga
e la struttura della tua tabella.
In pratica io l'ho usato per generarmi in automatico il numero di riga del
dettaglio di una fattura.
L'evento prima di inserire scatta quando in un nuovo record inizi ad
inserire i dati.
Fammi sapere, saluti Antonio.

 ha scritto nel messaggio
news:46Hb9.122826$lu5.3...@twister1.libero.it...

uhm non è molto scorrevole, a soluzione cmq la ho, cercavo qualcosa di +
snello.
tipo il suggerimento di A.Cara   select max(campo)+1 from tabella ma non
saprei dove inserire questo codice.

 dove la metto? su evento attivato del campo in questione?
Allora Fabrizio? dal nick potrebbe essere
Mi sono limitato a dirti come si fa ad avere il valore massimo di un 
campo (sbaglio o per quanto riguarda l'SQL sei un po indietro?)
Sulla questione che poni ci sono una serie di cose che andrebbero
prese in considerazione
1) Quello che vuoi fare va bene per una applicazione, come si suol dire,
   "stand alone" poiche' nel caso contrario devi mettere su una serie di
   controlli per far funzionare il tutto
2) La cosa va gestita in modo differenziato fra nuovo
record/visualizzazione/
   aggiornamento 
3) Rifare sempre la query sulla tabella potrebbe diventare pesante
rifletti su questo e poi se desideri ancora andare avanti possiamo 
discutere su dove mettere l'istruzione e come fare. Per quanto riguarda
l'evento di attivato potrebbe andare bene ma ce ne sono anche altri
ivi compreso il famoso "current"
--
a.cara

 ha scritto nel messaggio
news:ufGb9.122550$lu5.3...@twister1.libero.it...

La soluzione più semplice mi sembra questa:
nell'evento SuCorrente della maschera metti
if me.newrecord then
    me.CodiceDitta=dmax("[Codice]","TabellaDitte")+1
endif
vedi tu se poi vuoi fare un controllo sull'annullamento dell'inserimento.
Ciao, FABIO

"Antonio Ganci" <a.ganci@NO_SPAMMING_megattera.it> ha scritto nel messaggio
news:aknep5$acu$1...@newsreader.mailgate.org...

Allora la mia tabella è strutturata cosi:
codiceditta chiave primaria univoca
cognome
nome
.....
quindi sostituisco riga con codiceditta (e fin qui tutto ok)
ma poi tu mi metti "IDFattura = " & 
Me.Parent.ID
 & " " & _
io cosa ci metto "codiceditta=& 
me.parent.id
 &" "&_ ?
cosi non funge!

 ha scritto nel messaggio
news:2sHb9.124418$n04.3...@twister2.libero.it...

Ok Fabio, funziona, ora devo "solo" fare in modo che se l'utente una volta
aperta la maschera per l'inserimento di un nuovo record
nel caso decida di abortire l'operazione mi annulli anche il valore nel
campo codice ditta!
Che Dio me la mandi buona.

inserito?
E' ordinaria amministrazione :)
Non fai altro che definire un "valore predefinito". Puoi darlo al
campo, nella struttura della tabella, oppure al relativo controllo
nella maschera di immissione dei dati (as you like).
Se il codice e' un numero, il valore predefinito e' semplicemente
dmax(codice;tabella)+1. Se e' una stringa, ti farai la funzione che ne
ricava la parte numerica, la incrementa e restituisce ancora la
stringa. P.es. =Format(Val(DMax("[numero]";"offerte"))+1;"0000") e' il
valore predefinito per il campo "numero" della mia tabella "offerte" e
viene fuori una numerazione tipo 0001, 0002, 0003 ecc. in formato
stringa.

 ha scritto nel messaggio
news:3D6F41FB...@blunet.it...

 Si il mio nome è Fabrizio, con l'sql sono agli inizi, ma mi sto buttando
dentro di brutto,
non è semplice ma già qualche passo l'ho fatto. Diciamo che il problema cmq
l'ho risolto a modo mio come ho detto in un post precedente (con query e via
dicendo), so che ci sn delle operazioni più semplice tramite il codice e
quindi sto cercando di carpirle da voi,delle volte ho avuto delle risposte
generiche ma poi a forza di provare tutte le soluzioni ci sn arrivato. In
questo caso pensavo che bastasse inserire quella riga di codice da te
fornita, in un evento.
Avevo capito 
male.io
 sto creando un database, man mano che incontro un
problema lo pongo all'attenz del NG!
Questa era una miglioria che volevo fare.Infatti poi rispetto ai mille
passaggi che ho fatto io, con questa istruzione(fornita da FABIO che
ringrazio) ho snellito il tutto
if me.newrecord then
    me.CodiceDitta=dmax("[CodiceDitta]","Anagrafica")+1
endif
Adesso si pone il problema dell'annullamento dell'inserimento....come dire
le disgrazie non vengono mai sole!!!
Cmq, ti ringrazio xkè attraverso i tuoi post sto imparando tanto. Il
problema e che molte
volte date tutto per scontato,mentre la maggior parte delle persone che
chiedono sono a livello 1 in una scala da 0 a 10.
Ciao Fabry.

nell'evento SuCorrente della maschera metti
Scusa, ma perche' mai nell'evento su corrente, visto che esiste,
apposta per questo, la proprieta' valore predefinito?


posso provare a risponderti io?
Perche' chi e' partito come programmatore, magari su linguaggi
"procedurali",
pensa per prima cosa a codice ed istruzioni quanto piu' possibile
complicate.
Chi, invece, e' partito con i moderni strumenti visuali utilizza
preferbilmente wizard e proprieta'. Prendi me per esempio, so che
esistono,
ma difficilmente faccio dlookup o dmax ma mi scrivo sempre la select per
una
ormai inveterata abitudine e non parliamo poi del QBE che per me e' uno
strumento del "dimonio"
---
a.cara

 Ciao Fabry.
Per quanto mi riguarda cerco sempre di "non" dare la risposta completa
(in questo qui una volta c'era un maestro un tal "lbo")
poiche' credo che e' bene che chi chiede faccia comunque degli "sforzi".
E' vero qualche volta si commettono dei grossi errori del tipo  
spiegare "l'acqua calda" a chi sa benissimo cos'e' o invece dare per
scontato "l'acqua calda" a chi non sa cos'e' "l'acqua"
Non credo che l'annullamento sia un grosso problema nel senso che
poiche'
non usi l'ID il "buco" non si crea. E' evidente che il record appena
inserito deve essere cancellato.
--
a.cara

 ha scritto nel messaggio
news:guhumu82dmabkl53l...@4ax.com...

Ciao Catja visto che ci sei conviene scriverlo correttamente,
imparate a non dare nulla per scontato.
=DMax("[nomecampo]";"[nometabella]")+1
Cmq grazie.
Ciao Fabry.

 ha scritto nel messaggio
news:l7jumu8t7vpgca8c5...@4ax.com...

Da una parte è vero quello che ha detto Alessandro, ovvero mi è venuta per
prima la soluzione "via codice" ma soprattutto perchè in casi simili magari
mi capita di avere nella maschera un campo "Tipo Anagrafica" e in base al
tipo di anagrafica do un codice diverso che segue un progressivo a sè stante
per Fornitori, Clienti ecc..
In questo caso metterei quindi l'istruzione nell'evento Dopo_Aggiornamento
del controllo "Tipo Anagrafica" con i dovuti controlli (scusa il gioco di
parole) sul precedente valore e quant'altro
Ciao, FABIO