Newsgroup: it.comp.lang.visual-basic
Titolo: ADO: Aggiungere campi ad un recordset derivante da una Select

Ciao.
Ecco il mio problema di oggi:
Devo aggiungere dei campi modificabili ad un recordset che creo facendo una
select da una tabella di un database.
In pratica io creo il record in questo modo:
sql = "SELECT Moduli.Id AS IdModulo, Moduli.Descr FROM Moduli"
rs.Open sql,cn,adOpenStatic,adLockOptimistic
Set rs.ActiveConnection = Nothing
A questo punto ho un recordset con due campi.
Vorrei aggiungervi altri 2 campi per fare elaborazioni che servono a me. Il
recordset non dovrà più in nessun modo essere collegato al database.
Ho utilizzato il metodo Add dell'oggetto Fields, ma funziona solo se il
recordset è chiuso.
Quando chiudo il recordset peròà perdo tutti i suoi dati.
C'è qualche modo per aggiungere dei campi ad un recordset con già dei dati o
devo per forza creare un altro recordset di appoggio?
Grazie a tutti.
Ciao
-- 
Skysurfer

devo per forza creare un altro recordset di appoggio?
Purtroppo non si possono aggiungere campi ad un recordset aperto
neanche se disconnesso!
Potresti provare col Data Shaping con cui sono venuto a contatto di
recente (argomento che devo ancora approfondire!):
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/pg_ado_shape_hierarchy_8.asp
es.
    Dim rs As New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.Open "SHAPE {SELECT * FROM ORDERS WHERE ORDERID = 10300} " & _
            "APPEND NEW adNumeric (10,3) AS PROVA", _
            gadoConnessione, adOpenStatic, adLockBatchOptimistic
come stringa di connessione ho usato :
"Provider=MSDataShape;Data Provider=SQLOLEDB.1;Persist Security
Info=False;User ID=sa;Initial Catalog=Northwind;Data Source=SERVER"
notare che c'è un "Provider=MSDataShape" ...
e un "Data Provider=SQLOLEDB.1".
Nel mio caso ho usato SQL Server, non se se funziona con altri db.
Ciao!

 Vorrei aggiungervi altri 2 campi per fare elaborazioni che servono a me.
Se ti servono campi semplici (numerici o stringa) puoi fare cosě:
SELECT 1 as camponumerico1, "pippo" as campostringa1, Moduli.Id AS IdModulo,
Moduli.Descr FROM Moduli
In questo modo ti trovi il recodset con la struttura giusta e non devi far
altro che popolare i campi fittizi aggiuntivi.
termoPilucco.

Moduli.Descr FROM Moduli
Se faccio una cosa del genere :
rs.Open "SELECT *, " & _
              "0 as PN," & _
              "'' as PS" & _
              "FROM ORDERS WHERE ORDERID = 10300", _
            gadoConnessione, adOpenStatic, adLockBatchOptimistic
Cercando di impostare PN o PS ottengo:
Si sono verificati errori in un'operazione composta da più passaggi.
Controllare i singoli valori di stato.
Se a te funziona è probabile che dipenda dal provider utilizzato.

 Se a te funziona è probabile che dipenda dal provider utilizzato.
Uh.. in effetti parrebbero campi in sola lettura.
Anche dopo aver disconnesso il recordset, pur potendo scrivere sui campi
relativi allo * non si riesce a scrivere su quelli introdotti a manina...
Credo dipenda dalla proprietà attributes dei campi: mi ritrovo
attributes=114 per il campo stringa creato a manina e attributes=106 per
quello che era collegato ad un campo reale di tipo stringa.
Si evince che mentre il secondo ha attivo il bit dell'attributo
adFldUnknownUpdatable (106 and adFldUnknownUpdatable =
adFldUnknownUpdatable),  il primo no (114 and adFldUnknownUpdatable = 0) e
quindi non è aggiornabile.
Bah,
termoPilucco.

 quindi non è aggiornabile.
Lol, c'è un articolo di M$ a tal proposito:
http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/Q241/8/18.asp&NoWebContent=1
M$, così come erPotenza, consiglia di usare Shape.
termoPilucco.

M$, cosě come erPotenza, consiglia di usare Shape.
Era materia di qualche discussione fa (23/07) ... :)
Ciao!

 Era materia di qualche discussione fa (23/07) ... :)
Ecco, non l'avevo visto...
...č tale quale a questo thread.. anche il link di M$
termoPilucco distratto.

Grazie a tutti per le risposte, e scusate se ho riaperto un argomento
affrontato pochi giorni fa.
Ho guardato la soluzione con lo SHAPE, ma preferisco non usarla perchè devo
fare un software il più possibile indipendente dal database e non voglio
correre rischi che questa soluzione non funzioni con altri DB.
Per ora ho risolto creando un Recordset di appoggio con tutti i campi che mi
servono e inserendoci i dati derivati dalla Select in un altro Recordset.
Ciao a tutti
-- 
Skysurfer