Newsgroup: it.comp.lang.visual-basic
Titolo: Sempre problemi con ADO :(

Salve NG!
Scusate se ripropongo un problema "famoso", ma non riesco a venirne a capo,
sto diventando matto, aiutatemi voi!!
Allora, io dichiaro db e rsPazienti variabili pubbliche a livello di modulo
.BAS, poi apro una connessione con:
db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path &
"\archivio.mdb"
poi apro un recordset con:
rsPazienti.CursorLocation = adUseClient
rsPazienti.Open "select * from Pazienti order by ID", db, adOpenStatic,
adLockOptimistic
ID è un campo long autoincrementale.
Poi inserisco un nuovo record con rsPazienti.AddNew
Al termine dell'edit lo registro con rsPazienti.Update
A questo punto io *credevo* di trovarmi col puntatore del record corrente
sul nuovo record appena immesso, ma invece *eh beh, sarebbe troppo bello*,
il puntatore si trova altrove.
Evvabbè, facciamo un Requery, ma dopo il requery è normale che il puntatore
non si trovi sull'ultimo immesso, ma, dato che la query di apertura era
ordinata col campo ID, dovrebbe bastare fare un MoveLast e dovrei trovarmi
sull'ultimo, cioè quello appena immesso....? Macché, il risultato è lo
stesso di prima, il puntatore si trova altrove!
Sigh, io al termine dell'immissione del record devo aprire un altro form che
possibilmente dovrebbe visualizzarmi i dati di QUEL record, non di un altro!
Se esco da questo secondo form e poi seleziono il paziente appena immesso
dal datagrid apposito, tutto funziona.
Help please.....
Grazie a tutti

 possibilmente dovrebbe visualizzarmi i dati di QUEL record, non di un
altro!
Prova a vedere se, immediatamente dopo la Update, rsPazienti!ID è definito,
ovvero ha un valore. Se sì e se è lui (testa un altro campo) sei a posto. Ma
stai dicendo che così non è.
Non è escluso che tutto dipenda dal lato client (adUseClient). Il recordset
è statico (altro non potrebbe essere) e presumibilmente non può recuperare
dal server l'ID (assegnato dalla Update) del nuovo record. Se apri lato
Server (adUseServer), non dovresti avere problemi (però perderai altre
funzionalità, vedi la guida sulle differenze lato client e server).
Altre strade, non mi vengono in mente. (La tabella Pazienti ha almeno un
indice con chiave univoca? Crealo!)

credo che ci siano diverse possibilità: dopo aver lanciato il metodo
.Update, prova a vedere se riesci a leggere il valore
rsPazienti("ID"), che dovrebbe restituirti il valore del campo contatore. Se
ce l'hai sei a posto, giusto?
Altrimenti, prova a cambiare il tipo di cursori: io non userei un cursore
statico, bensì dinamico.....
comunque secondo me dopo il .Update dovresti sempre rimanere sul record
corrente, non ci sono spostamenti all'interno del recordset. Sei sicuro?
good coding!!!
-- 
Damiani Liborio Igor
ig...@igordamiani.it
 - 
soft...@igordamiani.it
 - 
idam...@hotmail.com
http://www.igordamiani.it
ICQ : 11847262

 indice con chiave univoca? Crealo!)
Ce l'ha, è proprio basato sul campo ID, fosse questo l'inghippo??
Grazie intanto! :)

 statico, bensì dinamico.....
Già provato, stessa identica cosa
Voglio tornà bambinooooo!
Grazie intanto! :)


Scusate Igor e Lupo, vi ho mandato una mail privata, ho sbagliato pulsante,
VB mi fonde i neuroni....

Ciao Alessandro,
Io vorrei dire solo una cosa: ma qual'è la difficoltà nel fare una
INSERT? Perché bisogna usare AddNew?
Con una INSERT hai maggiore flessibilità, possibilità di
movimento, tutta un'altra cosa rispetto ad AddNew.
Se poi Access ha le Stored Proceedure( mi sembra di
aver letto di no ), per i tuoi scopi puoi anche farne una che ti
restituisce proprio l'ID ed usare quello in una select.
Un'altra cosa: non usate controlli data-bound, fate tutto via codice e
SOPRATTUTTO mai fidarsi dei contatori di access, visto che
implementarne uno è una cavolata, si risparmia tempo e mal di testa!
Ciao
Andrea

 INSERT? Perché bisogna usare AddNew?
Perdona l'ignoranza, cosa è una Insert e soprattutto come si fa a provarla?
Sono disposto a provare di tutto....!
;)

una INSERT è una query di esecuzione. In pratica, usa il metodo .Execute
dell'ADODB.Connection e fai:
db.Execute "INSERT INTO " & NomeTabella & " (Campo1, Campo2, Campo3) VALUES
(ValoreCampo1, ValoreCampo2, ValoreCampo3)
Sostituisci i campi con i nomi dei tuoi campi, con i valori
corrispondenti....
Io, comunque, preferisco usare l'Addnew e l'Update, è molto più
leggibile......


 good coding!!!
Ciao
Andrea

 Andrea
====================
Scusa, potresti dire quale č l'altro sistema che usi tu?
E' comodo, chiaro, veloce quando i campi da inserire cominciano ad essere +
di 10?
Grazie
Greg

 Greg
Ciao
Andrea

 senza impazzire con una query di 800 Km :-)
??
salutiAndrea Montanari
montanar...@virgilio.it
http://www.asql.biz/DbaMgr.shtm
DbaMgr2k ver 0.4.0  -  DbaMgr ver 0.50.0
(my vb6+sql-dmo little try to provide MS MSDE 1.0 and MSDE 2000 a visual
interface)
--------- remove DMO to reply

 salutiAndrea Montanari
Ciaux
Andrea

 come modifichi la struttura ti viene modificato anche il risultato...
Dimenticavo una cosa: in questo programma che sto facendo ora, se
cambia la struttura del DB *devono* cambiare anche le queries,
specialmente quelle dove ho una Select Tabella.* poiché in quel
caso specifico, la tabella è collegata ad una classe, quindi se cambia la
struttura, cambia tutto :-)
Andrea

Alessandro wrote:
Cut
vb6 sp5 ADO 2.7
Un form....una datagrid...2 command...uno si chiama cmdADD
Un database access con dentro una tabella Anagrafica con un campo IDanag
contatore
incolla
Option Explicit
Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Private Sub cmdADD_Click()
rs.AddNew
    rs("Nome") = "Test" & CStr(Date)
rs.Update
    MsgBox rs("Nome") & " - " & CStr(rs("IDanag"))
End Sub
Private Sub Command1_Click()
Dim Tsql As String
Tsql = "SELECT * FROM Anagrafica"
Set rs.ActiveConnection = cn
rs.CursorLocation = adUseClient
rs.CursorType = adOpenStatic
rs.LockType = adLockOptimistic
rs.Open Tsql
Set Me.DataGrid1.DataSource = rs
End Sub
Private Sub Form_Load()
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Lavori\AUTOFFICINA\COPIA_DI_AUTOF.MDB;Persist Security Info=False"
cn.Open
End Sub
a me funziona tutto!
compreso l'aggiornamento automatico della griglia!
bye man!
:-)
--
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Quotefix e altro:
http://www.martek.it/go.asp?portamia=4
Usr: ICLVB Pw: amici

 Il Wodkino Nazionale č a : 
www.martek.it
