Discussione:
Recordset accodato a tabella
(troppo vecchio per rispondere)
?Mike?
2005-01-20 13:42:17 UTC
Permalink
Ciao a tutto il NG.

Sono alla lezione 1 (o poco più avanti) del manuale di VBA
Sono alle prese con un piccolo programma in Access.

Ho costruito un recordset contenente alcuni elementi della tabella RIS

Dim dbs As Database
Dim rstRIS As Recordset
Set dbs = OpenDatabase(CurrentDb.Name)
Set rstRIS = dbs.OpenRecordset("SELECT * FROM RIS;")

1. Vorrei accodare questo record ad una seconda tabella con le stesse
caratteristiche di RIS (stesso DB Access)
Sapreste spiegarmi come fare in VBA?
RIS ha due campi di tipo testo
"RIS2" ha due campi di tipo testo.

2. E' possibile valorizzare un elenco a discesa di Access con questo stesso
record?
Nelle form di Access posso definire un elenco a discesa e dirgli di andare
a
prendere i dati da una tabella del DB. Io, invece, vorrei fare la stessa
cosa ma attingendo ad un record set da me definito.

Grazie per la disponibilità.
Michele.
Cinzia
2005-01-20 15:28:09 UTC
Permalink
Ciao Mike,
"?Mike?" <***@nograzie.xxx> ha scritto nel messaggio news:ZyOHd.499$***@twister2.libero.it...
[CUT]
Post by ?Mike?
Ho costruito un recordset contenente alcuni elementi della tabella RIS
Dim dbs As Database
Dim rstRIS As Recordset
Set dbs = OpenDatabase(CurrentDb.Name)
Set rstRIS = dbs.OpenRecordset("SELECT * FROM RIS;")
1. Vorrei accodare questo record ad una seconda tabella con le stesse
caratteristiche di RIS (stesso DB Access)
Sapreste spiegarmi come fare in VBA?
RIS ha due campi di tipo testo
"RIS2" ha due campi di tipo testo.
qdef.Execute "Insert into Ris2 Select * from RIS1"
dove qdef è un DAO.Querydef
oppure
DoCmd.RunSQL "Insert into Ris2 Select * from RIS1"
Post by ?Mike?
2. E' possibile valorizzare un elenco a discesa di Access con questo stesso
record?
Nelle form di Access posso definire un elenco a discesa e dirgli di andare
a
prendere i dati da una tabella del DB. Io, invece, vorrei fare la stessa
cosa ma attingendo ad un record set da me definito.
ma se il tuo recordset attinge i dati da delle tabelle invece di creare un
recordset crei una Query che contiene i dati che ti interessano e fai
diventare la query origine dell'elenco a discesa
Post by ?Mike?
Grazie per la disponibilità.
Michele.
Di niente.
Cinzia
?Mike?
2005-01-20 16:12:44 UTC
Permalink
Post by Cinzia
Ciao Mike,
Ciao Cinzia,

sei stata gentilissima.

Tuttavia la mia necessità è quella di passare il record presente nel
recordset dentro la tabella e non da tabella a tabella.

Un'altra esigenza è quella di inserire i record del recordset dentro un
elenco a discesa.
Hai ragione approposito della possibilità di inserire del codice sql nelle
proprietà dell'oggetto ma il riempimento dell'elenco a discesa, nel mio
caso, non è possibile fino a quando non inserisco un particolare valore
nella form.

Da quanto sopra, le mie particolari richieste.
Ho provato a cercare nel web ma credo di cercare in modo sbagliato.
Le mie poche conoscenze della programmazione mi hanno indotto a pensare che
un recordset è, in fin dei conti, un insieme di record. Allora per quale
motivo non dovrebbe essere possibile fare un append.

Ancora grazie, Michele.
Cinzia
2005-01-20 17:02:53 UTC
Permalink
Post by ?Mike?
Ciao Cinzia,
sei stata gentilissima.
Tuttavia la mia necessità è quella di passare il record presente nel
recordset dentro la tabella e non da tabella a tabella.
Continua a sfuggirmi qualcosa vediamo se riusciamo a capirci:
tu dici io ho questo recordset

Dim dbs As Database
Dim rstRIS As Recordset
Set dbs = OpenDatabase(CurrentDb.Name)
Set rstRIS = dbs.OpenRecordset("SELECT * FROM RIS;")

bene il recordset in questione sarà costituito da molti record
quale dei tanti tu vuoi passare alla seconda tabella? e poi passare cosa
significa? (Copiare, spostare ...)
supponendo tu li voglia copiare tutti e tu lo voglia fare proprio un record
alla volta dovresti:

Aprire un nuovo recordset sulla tabella ris2 diciamo rstRis2
e poi fare un ciclo su rsRis e aggiungere tuti i record con AddNew
es :
while not rstRis.eof
rstRis2.Addnew
rstRis2.Fields(0) = rstRis.Fields(0)
rstRis2.Fields(1) = rstRis.Fields(1)
rstRis.MoveNext
wend

però così facendo equivale a fare la stessa cosa che ti ho suggerito prima
per cui non so...
se invece volessi copiare solo determinati record:
potresti usare Insert into Ris2 Select * from RIS1 Where ris1.campo1 like
'a*'
Post by ?Mike?
Un'altra esigenza è quella di inserire i record del recordset dentro un
elenco a discesa.
Hai ragione approposito della possibilità di inserire del codice sql nelle
proprietà dell'oggetto ma il riempimento dell'elenco a discesa, nel mio
caso, non è possibile fino a quando non inserisco un particolare valore
nella form.
sull'evento dopo aggiornamento del valore che inserisci nel form
imposti il rowsource dell'elenco a discesa all'istruzione sql appropriata
Post by ?Mike?
Da quanto sopra, le mie particolari richieste.
Ho provato a cercare nel web ma credo di cercare in modo sbagliato.
Le mie poche conoscenze della programmazione mi hanno indotto a pensare che
un recordset è, in fin dei conti, un insieme di record. Allora per quale
motivo non dovrebbe essere possibile fare un append.
Ancora grazie, Michele.
Ciao
Cinzia
?Mike?
2005-01-21 10:04:01 UTC
Permalink
Post by Cinzia
Ciao
Cinzia
Ciao Cinzia,
Scusami. In realtà, nel fare l'esempio, sono stato un po' grossolano e ti ho
fuorviata.

PROBLEMA reale:
.. RIS (1000 record) e RIS2 (<< 1000 record) due sono due tabelle simili
(per struttura)

.. Nel creare il recordset, a partire da RIS, ottengo un certo numero di
record (ad esempio 3).

.. Solo uno di questi record è "BUONO" per essere girato sulla tabella RIS2.
La scelta del record da girare nel RIS2 non è matematica, ma "soggettiva".

.. Da qui, l'esigenza di inserire i 3 record, frutto del recordset su RIS,
dentro un elenco a discesa dove poter operare una scelta attraverso un clic.

.. Selezionato il recordset, dall'elenco a discesa, vorrei "girarlo" dentro
RIS2.

.. Nota: all'apertura della form, non so ancora quali saranno i parametri
che limiteranno il recordset su RIS. E' per questo che voglio inserire il
frutto del recordset di RIS dentro l'elenco a discesa senza ricorrere al
rowsource.

Nell'esempio che mi hai proposto, mi suggerivi di creare un altro recordset
a partire da RIS2 e di procedere con il trasferimento da un recordset (RIS)
all'altro (RIS2).

while not rstRis.eof
rstRis2.Addnew
rstRis2.Fields(0) = rstRis.Fields(0)
rstRis2.Fields(1) = rstRis.Fields(1)
rstRis.MoveNext
wend

Sarebbe per me un passo avanti (anche se non la soluzione, per quanto
esposto sopra) se non avessi il problema di non essere capace a reintrodurre
il recordset di RIS2 dentro la tabella RIS2.

Grazie per la pazienza e la disponibilità che mi stai mostrando.

Ciao, Michele.
Cinzia
2005-01-21 11:03:25 UTC
Permalink
Post by ?Mike?
Ciao Cinzia,
Scusami. In realtà, nel fare l'esempio, sono stato un po' grossolano e ti ho
fuorviata.
.. RIS (1000 record) e RIS2 (<< 1000 record) due sono due tabelle simili
(per struttura)
.. Nel creare il recordset, a partire da RIS, ottengo un certo numero di
record (ad esempio 3).
.. Solo uno di questi record è "BUONO" per essere girato sulla tabella RIS2.
La scelta del record da girare nel RIS2 non è matematica, ma "soggettiva".
.. Da qui, l'esigenza di inserire i 3 record, frutto del recordset su RIS,
dentro un elenco a discesa dove poter operare una scelta attraverso un clic.
per creare il tuo recordset esguirai una istruzione del tipo:

"Select * From Tabella where campo = " & Me.TextBox1
dove Me.TextBox1 è una casella della maschera che l'utente dovrà riempire
per poi poter fare la selezione.

Invece di creare il recordset e usarlo come origine della ComboBox,
sull'evento After_update di TextBox1 scriverai

Sub TextBox1_After_update()
me.comboBox1.RowSource = "Select * From Tabella where campo = " &
Me.TextBox1
end sub

Se proprio vuoi usare il recordset puoi provare a fare
me.comboBox1.Recordset = rstRis1
Post by ?Mike?
.. Selezionato il recordset, dall'elenco a discesa, vorrei "girarlo" dentro
RIS2.
ricordati di mettere nell'elenco dei campi del recordset anche la chiave
primaria e di impostarla come valore di default dela combo, in questo modo
sarà più semplice fare l'operazione successiva.
Post by ?Mike?
.. Nota: all'apertura della form, non so ancora quali saranno i parametri
che limiteranno il recordset su RIS. E' per questo che voglio inserire il
frutto del recordset di RIS dentro l'elenco a discesa senza ricorrere al
rowsource.
Nell'esempio che mi hai proposto, mi suggerivi di creare un altro recordset
a partire da RIS2 e di procedere con il trasferimento da un recordset (RIS)
all'altro (RIS2).
while not rstRis.eof
rstRis2.Addnew
rstRis2.Fields(0) = rstRis.Fields(0)
rstRis2.Fields(1) = rstRis.Fields(1)
rstRis.MoveNext
wend
Sarebbe per me un passo avanti (anche se non la soluzione, per quanto
esposto sopra) se non avessi il problema di non essere capace a reintrodurre
il recordset di RIS2 dentro la tabella RIS2.
Quando l'utente ha fatto la selezione premendo un pulsante di conferma per
copiare quel record selezionato dalla tabella RIS1 a
tabella RIS2 non dovrai fare altro che eseguire

DoCmd.RunSQL "INSERT INTO RIS2 SELECT campo1, campo2 , ... FROM RIS Where ID
= " & Me.ComboBox1
Post by ?Mike?
Grazie per la pazienza e la disponibilità che mi stai mostrando.
Ciao, Michele.
Spero questa volta di essere stata di maggior aiuto!
Ciao
Cinzia
?Mike?
2005-01-24 07:52:58 UTC
Permalink
"Cinzia" <cinziapagani-no-***@tiscali.it> wrote in message news:u8$JBi6$***@TK2MSFTNGP12.phx.gbl...
Ciao Cinzia,

non sono ancora riuscito a realizzare tutti i miei propositi ma, grazie ad i
tuoi validissimi consigli, sono riuscito ad inserire i record, del
recordset, nell'elenco a discesa:

Set Elenco.Recordset = rstRECORD_RIS

Ancora non riesco ad accodare i recordset alla tabella RIS2 ma la difficoltà
è legata al fatto che la mia pigrizia mi porta a voler inserire il
recordset, nella tabella, in un sol colpo. Se lo inserissi campo per campo
non ci sarebbero problemi.

Mi piacerebbe fare qualcosa del tipo:
DoCmd.RunSQL "INSERT INTO RIS2 (campo1, campo2) VALUES (" &
rstRECORD_RIS.GetRows & ";", 0
Naturalmente non funziona, ma questo dipende dalla mia poca esperienza e
conoscenza della programmazione, da una parte, e del SQL, dall'altra.

Ancora grazie per la tua gentilezza, cortesia, pazienza e professionalità.
Ciao, Michele.
Cinzia
2005-01-24 09:23:45 UTC
Permalink
Post by ?Mike?
Ciao Cinzia,
non sono ancora riuscito a realizzare tutti i miei propositi ma, grazie ad i
tuoi validissimi consigli, sono riuscito ad inserire i record, del
Set Elenco.Recordset = rstRECORD_RIS
Ancora non riesco ad accodare i recordset alla tabella RIS2 ma la difficoltà
è legata al fatto che la mia pigrizia mi porta a voler inserire il
recordset, nella tabella, in un sol colpo. Se lo inserissi campo per campo
non ci sarebbero problemi.
DoCmd.RunSQL "INSERT INTO RIS2 (campo1, campo2) VALUES (" &
rstRECORD_RIS.GetRows & ";", 0
Naturalmente non funziona, ma questo dipende dalla mia poca esperienza e
conoscenza della programmazione, da una parte, e del SQL, dall'altra.
Ancora grazie per la tua gentilezza, cortesia, pazienza e professionalità.
Ciao, Michele.
Ciao Michele,
i valori da inserire nella seconda tabella secondo me dovresti recuperarli
dalla casella combinata non dal recordset

qualcosa del tipo :
DoCmd.RunSQL "INSERT INTO RIS2 (campo1, campo2) VALUES (" &
Me.Elenco.Column(0, Elenco.ListIndex) & ", " & Me.Elenco.Column(1,
Elenco.ListIndex) & ")"

Ciao
Cinzia
?Mike?
2005-01-24 14:41:00 UTC
Permalink
Dentro di te ci deve essere qualcosa di MAGICO.
Non mi hai dato la soluzione ma gli strumenti per arrivarci.
Post by ?Mike?
DoCmd.RunSQL "INSERT INTO RIS2 (campo1, campo2) VALUES (" &
Me.Elenco.Column(0, Elenco.ListIndex) & ", " & Me.Elenco.Column(1,
Elenco.ListIndex) & ")"
sono riuscito ad inserire i record del recordset nella tabella:

Dim record_riga() As Variant
While Not rstRIS.EOF
record_riga = rstRIS.GetRows
DoCmd.RunSQL "INSERT INTO RIS2 (TIPO_RIS2, RIS2_NUM) VALUES " &
record_riga(0, 0) & ", " & record_riga(1, 0) & ";", 0
Wend

GRAZIE TANTISSIMO,
Michele.

Loading...