Newsgroup: it.comp.lang.visual-basic
Titolo: Griglia che carica dati ADO in automatico...

Ciao a tutti,
vorrei sapere quale è il modo più semplice per caricare una griglia
(MSFlexGrid o altro) direttamente con un recordset.
Ad esempio ho:
AdoCN (connessione a DB interbase)
Set ADORs = New ADODB.Recordset
ADORs.ActiveConnection = ADOCn
'E' possibile fare una cosa del genere
adors.source= "SELECT * FROM Tabella"
adors.open
Grid.DataSource=adors
Ho fatto delle prove, ed ho anche cercato con google, ma da quello che ho
capito posso solo passare da un controllo ADODC.
Grazie a tutti :)

 Grid.DataSource=adors
genericamente bisogna fare:
set grid.datasource = adors
-- 
Salutoni
Sergio
Per rispondere... togli il group dall'indirizzo
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Grazie a tutti :)
Siccome io credo che tu sia abbastanza inesperto ti suggerirei un percorso
(una roadmap per usare una parola di moda)
Comincia a capire come funziona ADO
Connessioni
Recordset
in particolare guarda la differenza fra connessioni server e client
Studia il fatto che non tutti gli ole provider hanno tutti i cursori
Pensa che una griglia potrebbe avere senso lato client
pensa che
griglia.datasource=recordset
non ha senso
cosa è datasource e cosa è recordset?
sono variabili o sono oggetti?
come si assegna un oggetto ?
dai che ci arrivi da te!
Buon lavoro!
-- 
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Demo classe vb.NET :
WodkaThumb 
www.villaceleste.it
  click su "spippolando e
Programmando"


comunque NO!
la daresti buona se dovessimo usare la schifezza dell'adodatacontrol!!!!!!

 set grid.datasource = adors
Mi funziona, ma solo se adors è chiuso.
Come faccio poi a caricare i dati? Del tipo:
  Set .Grid2.DataSource = ADORs2
  ADORs2.Source = "SELECT * FROM Tabella"
  ADORs2.Open
  'Qui dovrebbe caricare i dati dell'adors2
Ho provato con .refresh della grid ma non si aggiorna :)
Grazie :D

 Mi funziona, ma solo se adors č chiuso.
personalmente apro sempre il recordset prima di utilizzarlo come fonte
dati, quindi non capisco questa tua affermazione.
a margine, ti ricordo che, per essere utilizzato come fonte dati, un
recordset deve essere dotato di un cursore statico lato client.
di piů nin zň.


 come si assegna un oggetto ?
Credo che il recordset è un oggetto in quanto lo dichiaro:
Set Adors= New ADODB.recordset
Quindi se è così ci sono arrivato, ma al momento che faccio:
Set .Grid2.DataSource = ADORs2
Se il rs è aperto mi da errore (forse è il probl. del cursore lato client
come mi è stato detto), se lo faccio col rs chiuso e poi lo apro non carica
i dati :)
Grazie ancora :)

 Melchiade Bedrosian Baol wrote:
butta via l'adodatacontrol!
che appesantisce inutilmente e non è versatile!
a seconda della griglia c'è una sorta di caching fra ADOdatacontrol e
Griglia...questo perchè son tutti asincroni.
dipende dalla griglia e dal cursore....
quando mi cison imbattuto (sempre con l'adodatacontrol)
bastava staccare la connessione e riattaccarla!...la griglia si riallineava


 Grazie ancora :)
spiegai una cosa che fatica hai fatto fin ora?
tanta!
guarda qui:
TSQL = "SELECT * FROM Customers"
Set Cn = ApreConn
'serve solo per riempire il recordset tanto vale farla veloce
With Rs
    If .State = adStateOpen Then .Close
    .ActiveConnection = Cn
    .CursorType = adOpenStatic 'ma qui puoi cambiare come ti pare
    .LockType = adLockBatchOptimistic'come sopra
    .CursorLocation = adUseClient
    .Source = TSQL
    .Open
End With
'
Set Griglia1.DataSource = Rs
Griglia1.Refresh
apreConn è una tua funzione che prende una connectionstring e apre un
qualsiasi database (qui era access) e ritorna un oggetto ado.connection
non è più semplice e più bello da capire?...oltre che aver buttato via un
ocx dal progetto che non fa mai male?


 di piů nin zň.
Avevi ragione č bastato fare:
ADORs2.Open , , adOpenStatic
Solo che l'adors2.close ovviamente si svuotava.
Ora vedo un po' come funziona e vedo se passare da FlexGrid a DataGrid (in
questo modo potrei utilizzare un'unica form di ricerca sia che ricerchi una
cosa od un'altra, evitando di scrivere 2km di codice ^_^)

 Solo che l'adors2.close ovviamente si svuotava.
sei proprio incontentabile. :-)
puoi continuare a vedere i dati anche se la connessione su cui si appoggia
il recordset (non ricordo se vale anche per il recordset, ma mi pare
duretta), passando ad una logica disconnessa. in una prima approssimazione
ciň si ottiene utilizzando un lock di tipo batch ottimistico.


 si ottiene utilizzando un lock di tipo batch ottimistico.
ci mancherebbe altro!
certo che continua a funzionare!
che mi cadete su una buccia di banana!???!!!
cercatevi su internet "recordset disconnessi"
p.s.
il codice che ho pstato sotto è un pezzettino di un vbp fatto ad un ragazzo
per spiegare tempo fa una cosa del genere
Ti connetti al database...
riempi il recordset(mostri la griglia)
lo salvi in XML
stacchi tutto (refresh griglia...pof non c'è nulla)
lo carichi dall'XML disconesso (refresh griglia...miracolo riappare)
modifichi e riaggiorni updatebatch il database!
secondo voi come funziona NET?...tutto disconnesso(normalmente)!


 che mi cadete su una buccia di banana!???!!!
Mi ci vorrebbe un po' di tempo per studiare il libro sul VB, ho visto che i
Lock ci sono.
Solamente ho la necessità di fare qualcosa di funzionante entro fine mese,
quindi le ottimizzazione mi sa che verranno fatte tutte in un secondo
momento, oltre allo studio di nuove proprietà/metodi che mi facciano in
automatico quello per cui ho scritto 1 pagina di codice :\.
Per ora uso il vecchio sistema
do until adors.eof
    Grid.AddItem (...)
loop
Poi spero di trovarmi un po' di tempo e rendere tutto parametrizzato
(soprattutto sulla form di ricerca dati, dove potrei fare tutto passandomi
come parametro la stringa SQL e un vettore di stringhe in uscita (per
riempire le text col record selezionato dal cerca))
Grazie :)

 ottimistico.
Option Explicit
Private CN As ADODB.Connection
Private RS As ADODB.Recordset
'Connetto e Visualizzo
Private Sub Command1_Click()
Set CN = New ADODB.Connection
CN.ConnectionString = "Provider=SQLOLEDB.1;Password=mypwd;Persist Security 
Info=True;User ID=myuser;Initial Catalog=Northwind;Data Source=127.0.0.1"
CN.Open
Set RS = New ADODB.Recordset
Set RS.ActiveConnection = CN
RS.CursorLocation = adUseClient
RS.CursorType = adOpenStatic
RS.Source = "select * from categories"
RS.Open
Set DataGrid1.DataSource = RS
End Sub
'DISCONNETTO
Private Sub Command2_Click()
Set RS.ActiveConnection = Nothing
CN.Close
Set CN = Nothing
End Sub
'Refresh
Private Sub Command3_Click()
DataGrid1.Refresh
End Sub
Ciao
Alberto
-- 
E tutto mi sembrava andasse bene... 

 Set RS.ActiveConnection = Nothing
sì, hai ragione.
non è necessario dichiarare il lockbatchoptimistic, è sufficiente
disconnettere il recordset dalla connessione prima di chiudere
quest'ultima.


 Grazie :)
Link!
http://www.devx.com/getHelpOn/10MinuteSolution/20407
http://www.soft-land.org/cgi-bin/doc.pl?doc=../documenti/adomod_res&tpl=doc
guarda ad esempio: GetRows
per me se sei sveglio in 3 giorni hai imparato e spippolato....entro la fine
del mese dai un programma funzionante ed ottimizzato!
buon lavoro!
p.s.
L'adodatacontrol si lega ad un path!....devi forzarlo a sentire la dir di
installazione con app.path...allora se lo fai ...tanto vale farsi supito una
function!
base di partenza: un tempo le avevo messe sul sito di gbc!
Public Function ApreConn(Optional DBconnesso As String = "JET", Optional
LatoConn As Long = adUseServer, Optional NomeServer As String, Optional
UserName As String, Optional Password As String, Optional Opzioni As
Variant) As ADODB.Connection
Dim StringaConnessione As String
Dim Cn As New ADODB.Connection
'NB CONST_PATHDB è una variabile o costante che indica il path del database
'Nel caso di MSDE variare a seconda della connessione scelta!(posson non
bastare le variabili)
Select Case Trim(UCase(DBconnesso))
    Case "JET"
        'si varia se serve
        StringaConnessione = "Provider=Microsoft.Jet.OLEDB.4.0;"
        StringaConnessione = StringaConnessione & "Data Source=" &
CONST_PATHDB & ""
        Cn.ConnectionString = StringaConnessione
        Cn.CursorLocation = LatoConn
    Case "MSDE"
        'qui non ci si sta a smazzare tanto! si varia se serve
        StringaConnessione = "Provider=sqloledb;"
        StringaConnessione = StringaConnessione & "Data Source=" &
Trim(NomeServer) & ";"
        StringaConnessione = StringaConnessione & "Initial Catalog=" &
CONST_PATHDB & ";" 'Nome del server
        StringaConnessione = StringaConnessione & "User Id=" &
Trim(UserName) & ";"
        StringaConnessione = StringaConnessione & "Password=" &
Trim(Password)
        Cn.ConnectionString = StringaConnessione
        Cn.CursorLocation = LatoConn
    Case "SHAPE"
        'si varia se serve
        Cn.Provider = "MSdataShape"
        StringaConnessione = "DATA Provider=Microsoft.Jet.OLEDB.4.0;Data
Source="
        'StringaConnessione = StringaConnessione & App.Path &
"\archivio\DBibemnew.mdb" & ";Persist Security Info=False"
        StringaConnessione = StringaConnessione & CONST_PATHDB & ";Persist
Security Info=False"
    'espandibile con altri CASE ad altri DB!
End Select
Cn.Open
Set ApreConn = Cn
End Function
Public Function ApreRec(TSQL As String, Connessione As ADODB.Connection,
Optional Apre As ADODB.CursorTypeEnum = adOpenKeyset, Optional LockRec As
ADODB.LockTypeEnum = adLockReadOnly) As ADODB.Recordset
'di default apre keyset readonly compromesso fra velocità e versatilità!
Dim Rs As New ADODB.Recordset
Rs.CursorType = Apre
Rs.LockType = LockRec
Rs.ActiveConnection = Connessione
Rs.Source = Trim(TSQL)
Rs.Open
Set ApreRec = Rs
End Function
Public Function TrovaDatoTabella(NomeTabella As String, DatoDaTrovare As
String, NomeCampoRicerca As String, ValoreChiaveRicerca As String, Optional
ValoreTESTO As Boolean = True) As Variant
Dim mCn As ADODB.Connection
Dim mRec As New ADODB.Recordset
Dim TSQL As String
TSQL = "SELECT * FROM " & NomeTabella
TSQL = TSQL & " WHERE " & NomeCampoRicerca
If ValoreTESTO Then
    TSQL = TSQL & "='" & Trim(ValoreChiaveRicerca) & "'"
Else
    TSQL = TSQL & "=" & Trim(ValoreChiaveRicerca)
End If
Set mCn = ApreConn
Set mRec = ApreRec(TSQL, mCn)
If mRec.BOF Then
    TrovaDatoTabella = ""
    mRec.Close
    mCn.Close
    Set mRec = Nothing
    Set mCn = Nothing
    Exit Function
End If
If Len(mRec(DatoDaTrovare) & "") <= 0 Then
    TrovaDatoTabella = ""
    mRec.Close
    mCn.Close
    Set mRec = Nothing
    Set mCn = Nothing
Else
    TrovaDatoTabella = Trim(CStr(mRec(DatoDaTrovare) & ""))
    mRec.Close
    mCn.Close
    Set mRec = Nothing
    Set mCn = Nothing
End If
End Function
nei Credits del tuo programma se le usi citami...son vanitoso!
:-P


 che mi cadete su una buccia di banana!???!!!
scusa wodka, ho sbagliato a scrivere.
volevo dire "puoi continuare a vedere i dati anche se *chiudi* la
connessione"
e quindi la parte relativa al recordset č da intendersi: "non so se riesci
a vedere i dati se fai recordset.close"


 :-P
Se mi fanno mettere i Credits nel programma ovviamente :)

 ha scritto nel messaggio
news:oU4Hd.9477$fs6.2...@twister2.libero.it...
