Newsgroup: it.comp.appl.access
Titolo: salvare record da maschera non associata

Saluti a tutti.
Vorrei che qualcuno mi aiutasse a capire se scrivo una corbelleria.
Ho una maschera che è già associata ad una altra tabella.
 
Dalla scelta di una combo, scelgo il record "123456" da una tabella
"anagrafica" non associata alla maschera e ne incollo i valori sulla
maschera stessa nei campi relativi a quel record.
 
Dopo che ho fatto alcune operazioni, avrei bisogno di salvare il
contenuto di quei campi nei singoli campi del record "123456" della
tabella "anagrafica"
 
Posso farlo da codice ? Non lo so fare e sono in grande difficoltà.
grazie mille a chiunque mi possa aiutare.


StrSql=""UPDATE TuoRecord SET Campo1=" & Me.TuoCampo .....
WHERE Id=123456" va bene?
Se no fai una query parametrica nel QBE e li metti per ogni campo da aggiornare il riferimento Forms![TuaForm].[NomeCampo]


con ADO e VBA
 
Dim cnn As New ADODB.Connection
Set cnn = CurrentProject.Connection
Dim tuaTab As New ADODB.Recordset
 
tuaTab.Open "select * from TabellaCheVuoiModificare where id=123465", 
cnn, adOpenKeyset, adLockOptimistic
 
tuaTab.Fields("nomedelcampochevuoimodificare") = "valore che gli vuoi dare"
tuaTab.Fields("nomedelcampochevuoimodificare2") = "valore che gli vuoi
dare"
 
 
tuaTab.Update
 
tuaTab.Close
Set tuaTab = Nothing
cnn.Close
Set cnn = Nothing
 
 
 
ciao
BFS


ciao BFS,
scusami ma non capisco:
 
tuaTab.Fields("nomedelcampochevuoimodificare") = "valore che gli vuoi
dare"
tuaTab.Fields("nomedelcampochevuoimodificare2") = "valore che gli
vuoidare"
è un refuso per cui hai scritto due volte la stessa istruzione ?
 
ciao grazie

ignazio.pilone submitted this idea :

Prova così:
====================================
Private Sub Command12_Click()
Dim db As Database, RS(1 To 2) As DAO.Recordset
Dim tDef(1 To 2) As TableDef
Dim i As Object, j As Object, k As Integer
Dim Criteria As String
Dim TableName(1 To 2) As String
 
' Definizioni -----------------
TableName(1) = "AltraTabella"
TableName(2) = "Anagrafica"
Criteria = "ID='123456'"
' -----------------------------
 
Set db = CurrentDb
For k = 1 To 2
    Set RS(k) = db.OpenRecordset(TableName(k), dbOpenDynaset)
    Set tDef(k) = db.TableDefs(TableName(k))
    RS(k).FindFirst Criteria
Next
 
For Each i In tDef(1).Fields
    For Each j In tDef(2).Fields
        If i.Name = j.Name Then
            RS(2).Edit
            RS(2)(i.Name) = RS(1)(i.Name)
            RS(2).Update
        End If
    Next
Next
 
End Sub
=======================================
 
- Anagrafica deve contenere almeno tutti i campi di AltraTabella,
  ancorché in diversa sequenza.
 
- Se 123456 è numero anziché stringa:
  Criteria = "ID=123456"
 
Bruno
 
PS
Puoi anche eseguire una roba del genere, specificando per le due 
tabelle esattamente i nomi dei campi:
 
UPDATE AltraTabella INNER JOIN Anagrafica ON AltraTabella.ID = 
Anagrafica.ID SET Anagrafica.Patente = [AltraTabella].[Patente], 
Anagrafica.SAF = [AltraTabella].[SAF], Anagrafica.SAF_Descrizione = 
[AltraTabella].[SAF_Descrizione], Anagrafica.NBCR = 
[AltraTabella].[NBCR], Anagrafica.NBCR_Descrizione = 
[AltraTabella].[NBCR_Descrizione], Anagrafica.TPSS = 
[AltraTabella].[TPSS], Anagrafica.TPSS_Descrizione = 
[AltraTabella].[TPSS_Descrizione]
WHERE (((Anagrafica.ID)="123456"));
 
 


IMHO usare ADO con vba non ha senso......


era per dirti che avrai n istruzioni di quel tipo in base ai valori che 
devi "traferire" da form a tabella
 
ciao
BFS

 - Mostra testo citato -
 
buongiorno,
grazie a tutti per l'aiuto e per i chiarimenti ma rimango abbastanza
impedito.
 
Forse ho espresso male il problema ma volevo specificare che la
seconda tabella è già collegata ad uno storico che mi serve per vedere
altri dati e non deve quindi essere aggiornata dalla maschera
"ANAGRAFICA",
 
Dalla combo "Sceltaimmo" della maschera "ANAGRAFICA" cerco in tabella
"ANAGRAFICA2011" l'edificio che devo analizzare e modificare.
La scelta della combo mi valorizza sulla maschera il campo "IMMO" che
è il dato che contraddistingue il record (quello che originariamente
avevo chiamato "123456") e gli altri campi oggetto di analisi e
modifica.
Dopo le mie modifiche su questi campi mi serve che, tramite un
pulsante, i dati di quelle caselle relative al record "IMMO" vadano a
sovrascrivere i corrispettivi dati in tabella "ANAGRAFICA2011"
 
Dagli aiuti che mi avete indicato vedo diverse strade da percorrere e
sinceramente sono un pò (molto) confuso su quale utilizzare, forse la
soluzione è più semplice del casino che ho descritto ma spero che
qualcuno mi possa aiutare.
grazie infinite per l'attenzione.


Sono riuscito con una query di aggiornamento...grazie infinite a
tutti, ora ne capisco un pelino di più e solo grazie a Voi.
Unico problema è che la query di aggiornamento mi segnala un errore di
chiave, domattina in ufficio proverò a controllare se si tratta di un
errore di compatibilità nei formati del copia incolla, spero sia
quello.
Allego il codice se potesse interessare ( o se a qualcuo venisse
l'adorabile idea di aiutarmi a superare quest'ultimo ostacolo...)
La cosa più simpatica è che domattina alle 10.00 dovrei presentarlo...
grazie di cuore buonanotte.
 
UPDATE ANAGRAFICA2011 SET ANAGRAFICA2011.POTKW = [Forms]![ANAGRAFICA].
[POTKW], ANAGRAFICA2011.POTKC = [Forms]![ANAGRAFICA].[POTKC],
ANAGRAFICA2011.POTEROKW = [Forms]![ANAGRAFICA].[POTEROKW],
ANAGRAFICA2011.POTEROKC = [Forms]![ANAGRAFICA].[POTEROKC],
ANAGRAFICA2011.ORE = [Forms]![ANAGRAFICA].[ORE], ANAGRAFICA2011.GIORNI
= [Forms]![ANAGRAFICA].[GIORNI], ANAGRAFICA2011.SETTIMANE = [Forms]!
[ANAGRAFICA].[SETTIMANE], ANAGRAFICA2011.CONSUMO = [Forms]!
[ANAGRAFICA].[CONSUMO], ANAGRAFICA2011.RENDI2010 = [Forms]!
[ANAGRAFICA].[RENDI2010], ANAGRAFICA2011.RENDI2011 = [Forms]!
[ANAGRAFICA].[RENDI2011]
WHERE (((ANAGRAFICA2011.[Codice Immobile]) Like "*" & [forms]!
[ANAGRAFICA]![EDIFICIO]));

 [ANAGRAFICA]![EDIFICIO]));
 
 
perchè questo e non
 
WHERE (((ANAGRAFICA2011.[Codice Immobile]) = [forms]!
  [ANAGRAFICA]![EDIFICIO]));
 
?
 
se nella tabella anagrafica2011 hai il codice immobile 5123 e 123
e nella tua maschera la casella Edificio contiene "123" ti verrebbero 
aggiornate entrambe le righe
 
 
ti consiglio cmq la strada del codice vba con dao o ado vedi tu per 
queste opezioni di lettura e scrittura su tabelle.
Molto più semplice da gestire e mantenere
 
BFS


Sono riuscito a fare tutto tranne un errore di conversione tra tipi
che all'avvio della query di aggiornamento segnala un messaggio di
errore.(..anche se copia correttamente i campi in tabella).
I formati dei campi tra maschera e tabella sono coerenti, non so più
che pesci prendere.

 - Mostra testo citato -
 
i campi sono hanno tutti formato simile tranne il campo [IMMO] sulla
form che è una casella di testo alla quale non riesco a dare formato
( ha solo valori numerici)che viene generata dalla combo.
Il corrispondente campo in tabella [immobile] è di tipo testo.
 
la query è:
 
UPDATE ANAGRAFICA2011 SET ANAGRAFICA2011.POTKW = [Forms]![ANAGRAFICA].
[POTKW], ANAGRAFICA2011.POTKC = [Forms]![ANAGRAFICA].[POTKC],
ANAGRAFICA2011.POTEROKW = [Forms]![ANAGRAFICA].[POTEROKW],
ANAGRAFICA2011.POTEROKC = [Forms]![ANAGRAFICA].[POTEROKC],
ANAGRAFICA2011.ORE = [Forms]![ANAGRAFICA].[ORE], ANAGRAFICA2011.GIORNI
= [Forms]![ANAGRAFICA].[GIORNI], ANAGRAFICA2011.SETTIMANE = [Forms]!
[ANAGRAFICA].[SETTIMANE], ANAGRAFICA2011.CONSUMO = [Forms]!
[ANAGRAFICA].[CONSUMO], ANAGRAFICA2011.RENDI2010 = [Forms]!
[ANAGRAFICA].[RENDI2010], ANAGRAFICA2011.RENDI2011 = [Forms]!
[ANAGRAFICA].[RENDI2011]
WHERE (((ANAGRAFICA2011.Immobile)=[forms]![ANAGRAFICA]![IMMO]));


 
prova da codice
 
metti un pulsante sulla tua maschera anagrafica e sull'evento click:
 
Dim cnn As New ADODB.Connection
Set cnn = CurrentProject.Connection
Dim tuaTab As New ADODB.Recordset
 
tuaTab.Open "select * from ANAGRAFICA2011 where immobile='" & me.immo & 
"'", cnn, adOpenKeyset, adLockOptimistic
 
tuaTab.Fields("POTKW") = me.potkw
tuaTab.Fields("POTKC") = me.potkc
tuaTab.Fields("ore") = me.ore
tuaTab.Fields("giorni") = me.giorni
tuaTab.Fields("settimane") = me.settimane
tuaTab.Fields("consumo") = me.consumo
tuaTab.Fields("rendi2010") = me.rendi2010
tuaTab.Fields("rendi2011") = me.rendi2011


 - Mostra testo citato -
 
GRANDE BFS  !!!
 
Funziona perfettamente. Unico problema rimasto e che solo uno dei due
campi kw o kc è alimentato a piacere l'altro rimane vuoto.
Il codice quando trova uno due due vuoto va in errore.
Puoi ancora aiutarmi qui ????
 
grazie, grazie, grazie, grazie, grazie,


 
modifica il codice precedente cosě
 
....
 
if not isnull(me.potkw) then
    tuaTab.Fields("POTKW") = me.potkw
end if
 
if not isnull(me.potkc) then
    tuaTab.Fields("POTKc") = me.potkw
end if
 
....
 
 
ciao
BFS
 

 - Mostra testo citato -
 
Grazie infinite BFS sei sempre splendido e gentile.
ho solo, ma non è assolutamente una critica, eliminato gli endif
perchè davano errore.
 
grazie davvero tanto.


 
 
se la condizione then la metti sulla stessa riga del if non serve l'endif
se lo metti nella riga sotto invece devi mettere l'end if
 
ciao
BFS