Newsgroup: it.comp.www.asp
Titolo: [DB] Campo contatore access

NT4, IIS4, SP3
Devo inserire un nuovo record in una tabella la cui chiave primaria e'
un campo contatore. Codice:
   Set conn = Server.CreateObject("ADODB.Connection")
   conn.open "nomedb"
   sql = "ordini2"
   Set rs = Server.CreateObject("ADODB.Recordset")
   rs.Open sql, conn, adOpenKeyset ,adLockOptimistic
   rs.addnew 
   rs("OData")=now
   rs("Nome")=nome
   '.....
   rs.update
Appena prima di "rs.update", rs dovrebbe puntare al nuovo record. Ma il
campo [ID Ordine] (chiave primaria) non e' ancora visibile e risulta
vuoto.
Dopo "rs.update", rs non punta piu' all'ultimo record (quello appena
immesso) ma all'ultimo della tabella. 
....ebbene si! Anche se il campo e' un contatore e l'ultimo immesso e'
quello con il numero piu' alto, non e' detto che sia l'ultimo nella
tabella. In pratica se faccio un 
  "select * from ordini" 
invece di 
  "select * from ordini order by [ID Ordine]"
mi ritrovo i record fuori ordine.
Il punto fondamentale e' che a me serve il numero di ordine assegnato
nel nuovo record!
  grazie x info
   saluti
-----------------------------------------------------
 Fabrizio Accatino                                   
 Web:   
http://www.cclinf.polito.it/~fhtino
 
 
http://www.geocities.com/SoHo/Workshop/2495/
 
 EMail: 
fht...@cclinf.polito.it
 - 
fht...@usa.net
 
-----------------------------------------------------

mi ritrovo i record fuori ordine.
Questo succede se a volte cancelli dei record dalla tabella senza
compattarla. Lui rimane delle zone "vuote" nel DB e ci va a scrivere come
succede sugli HD.
Saluti.
Stefano.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Moderatore di it.comp.www.asp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 succede sugli HD.
Scusa?!?!
Mi sembra che quello che mi stai dicendo tu non c'entri nulla.
La questione e' che io vedo come ultimo record quello che logicamente
non lo e'.
Ti faccio un esempio. Ho una tabella:
  ID    contatore (primary key)
  nome  string
Con i seguenti dati:
  1 fabrizio
  2 ernesto
  3 carlo
  4 giovanni
  5 erasmo
  6 paolo
  7 davide
Ora, se con ADO faccio un "select * from tabella" ottengo quello che
vedi sopra. Se invece faccio "tabella" ottengo un ordine sparso, ad
esempio:
  1 fabrizio
  2 ernesto
  5 erasmo
  6 paolo
  7 davide
  3 carlo
  4 giovanni
Quindi quando vado ad aggiungere un nuovo record, se access me lo infila
fra il 7 e il 3, l'ultimo non e' "8" ma "4".


 un campo contatore...
Puoi provare a definire il cursore del DB come Server Side:
	...(dopo aver creato l'oggetto recordset rs)
	rs.CursorLocation = adUseServer (o anche valore 2 se non includi il
file delle definizioni VB o JScript)
	rs.Open...
In questa maniera puoi risolvere il tuo problema, per default ADO utilizza il
cursore come Client Side ma questo porta a problemi se abbiamo bisogno di
connessioni per un periodo piu' lungo della singola operazione.
Bye
Peppix
;-)))))))))))))))))))))))))
Remove XX for reply
pepp...@hotmail.com
;-)))))))))))))))))))))))))
-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/
       Search, Read, Discuss, or Start Your Own    

fra il 7 e il 3, l'ultimo non e' "8" ma "4".
Questo di succede se cancelli dei record senza compattare la tabella, non
succede normalmente. Tu normalmente cancelli record nella tabella?


non lo e'.
E se tu anziche' usare un campo contatore utilizzassi un campo numero e poi
incrementi manualmente tu il valore? Per esempio io nel mio negozio assegno
ad una variabile nella Session un numero ordine sequenziale ma lo ottengo
con un semplice x + 1 dove x e' il valore piu' alto che ho nel campo ordine
della tabella ordini. In questo modo mi semplifico notevolmente la vita
rispetto ad usare il contatore di Access.


 rispetto ad usare il contatore di Access.
Non per portare sfiga, ma mi sembra che ci sia un possibile baco:
difficile che si verifichi, ma la sfiga non ha mai limite.
Allora, le operazione che fai sono:
- x=dmax("select....")+1
- crea record con ID uguale ad x
Giusto?
Immagina due "clienti" A e B quasi contemporanei: eventi:
- A: xa=dmax()+1
- B: xb=dmax()+1
- A: nuovo record con ID uguale ad xa
- B: nuovo record con ID uguale ad xb ---> ERRORE xa e' uguale ad xb!
Per la cronaca ho risolto il mio problema (e forse anche il tuo
possibile bug) con una query "assurda" (l'ho trovata, mi sono stupito,
ma funziona e... la uso. Paura!).
Codice che inserire un nuovo ordine:
  Set conn = Server.CreateObject("ADODB.Connection")
  conn.open "negoziodb"
  sql = "select * from Ordini2 where 1=2"
  Set rs = Server.CreateObject("ADODB.Recordset")
  rs.Open sql, conn, adOpenStatic ,adLockOptimistic
  ' ora rs e' vuoto visto che 1 non e' mai uguale a 2  :-)))
  rs.addnew 
  rs("..campi_vari..")=....
  rs.update
  ' ora in rs vedo *solo* il nuovo record e non gli altri della rabella
  ...resto del codice.....
Commenti?
   saluti


ma funziona e... la uso. Paura!).
Questo e' il problema, funziona! Per quanto? Quante risorse chiede? Io dico
che a 100 visite al giorno dovro' ridisegnare tutto il sito perche' il
codice e' tutt'altro che ottimizzato e al crescere delle visite temo anche
un crescere delle risorse assorbite e dei problemi creati.


 Questo e' il problema, funziona! Per quanto? Quante risorse chiede? 
Scusa, ma non l'ho capita!
Una query con "where 1=2" funziona sempre e richiede pochissime risorse.
O no?
 saluti
-----------------------------------------------------


O no?
Non chiederlo a me, comunque me la segno per quando ristrutturero' il sito.
