Newsgroup: it.comp.appl.access
Titolo: Riferimento a campo db su form, da codice su modulo generico

Form continua Articoli, che visualizza righe di dati da tabella db via odbc
Tra i vari campi di ogni riga ci sono Campo1, Campo2, Campo3, Campo4
Sulla form c'e' un command button 'INSERISCI' , destinato 
all'inserimento nuove righe, il cui codice e'
--------------------------------------------------
DoCmd.GoToRecord , , acNewRec
dummy = testata_record(Me.Form)
Me!Campo1= 12345
Me!Campo2= "Test"
Me.dirty=false
--------------------------------------------------
 
Su altro modulo di codice e' presente la funzione
 
--------------------------------------------------
Function testata_record(ByVal NOME_FORM As Form)
NOME_FORM!Campo3= "peppe"
NOME_FORM!Campo4= "ostrega"
end function
--------------------------------------------------
 
Quando premo il command button INSERISCI mi attenderei di trovare i 
quattro campi presenti nel db
Ma non e' cosi', nel senso che Campo3 e Campo4 NON vengono valorizzati
Come fare per valorizzare Campo3 e Campo4 da codice esterno alla form?

Hai salvato...?
Perche metro dirty=false...?
 
Se non salvi sarebbe meglio usare Defaultvalue altrimenti salva.
 
@Alex


E' il  dirty=false  che salva
Ed infatti Campo1 e Campo2 li tiene
Il problema e' che dal codice funzione presente nel modulo, non riesco a 
'raggiungere' i campi Campo3 e Campo4 (nomi dei campi nel db) presenti 
nella form
Ed il successivo dirty=false salva, ma solo i due campi valorizzati con 
codice nella form
 
 

 codice nella form
 
Sei sicuro che il DIRTY salva...?
Oppure semplicemente un giro contorto che annulla la TRANSAZIONE di inserimento... come eseguita, e forza il COMMIT..?
Hai provato a vedere cosa succede se su BeforeInsert fai un ME.UNDO ed un CANCEL=TRUE...?
Se non riesci ad annullare l'inserimento è la dimostrazione di quanto dicevo, ed anche che la procedure non è tecnicamente corretta, magari mi sbaglio...
 
Certo mi chiedo perchè non usi semplicemente un 
DoCmd.RunCommand acCmdSaveRecord
che invece passa per tutti gli eventi in modo corretto.
 
Parli di non riuscire a raggiungere il Campo3 e Campo4 quali Campi del DB... questa cosa mi lascia perplesso.
Puoi raggiungere i CONTROLLI dell'Oggetto Form, per raggiungere i CAMPI devi accedere alla proprietà RECORDSET.FIELDS(NomeCampo).Value.
 
Non capisco di cosa stai parlando...
 
@Alex


Il problema da risolvere e' avere una funzione generica chiamiamola 
dati_testata(), usabile in tutto il codice, che possa valorizzare alcuni 
campi db ad ogni inserimento o modifica record, i classici: utente, 
data, ora, ...
 
Per ogni form (form continue) vorrei mantenere la possibilita' di 
inserire una nuova riga sia premendo in tasto INS_RIGA sia andando a 
digitare direttamente sull'ultima riga del corpo, la riga bianca
 
Per fare questo, nell'evento BeforeInsert della form ci metto il codice per:
- aggiungere un nuovo record
- valorizzare i campi essenziali
- richiamare routine dati_testata()
------------------------------------
DoCmd.GoToRecord , , acNewRec
Me!ID_ARTICOLI = nuovo_id()
dummy = dati_testata_record_da_form(Me.Form, "INS")
------------------------------------
 
Poi per ottenere l'inserimento riga anche da tasto INS_RIGA nel codice 
suo evento click ci metto il richiamo del codice dentro BeforeInsert
------------------------------------
Form_BeforeInsert False
DoCmd.RunCommand acCmdSaveRecord
------------------------------------
 
Quello che non quadra e' la routine dati_testata() che riceve come 
parametri la form di partenza e un flag per aggiornare o inserire
------------------------------------
Function test_record(ByVal NOME_FORM As Form, byval agg_ins as string)
NOME_FORM.Recordset.Fields("utente").Value= "peppe"
NOME_FORM.Recordset.Fields("data").Value= "10/01/2020"
end function
------------------------------------
 
I campi che la funzione testata_record dovrebbe aggiornare non vengono 
aggiornati, ma alla prima istruzione della funzione, viene restituito un 
errore 3020 come stessi tentando di scrivere senza un AddNew/Edit, che 
pero' e' stato impartito poco prima (DoCmd.GoToRecord , , acNewRec)
 
Quindi o c'e' un errore oppure c'e' uno sbaglio, una delle tre