Newsgroup: it.comp.lang.visual-basic
Titolo: [?] nuova riga datagrid e update record

usando un controllo datagrid che visualizza i record estratti con ado senza
utilizzare il controllo ado ma solo codice, ho notato che per inserire un
nuovo record e aggiornarlo fisicamente sul db è necessario spostarsi su un
altra riga.
Nell'evento AfterColEdit ho inserito un send keys {DOWN} per simulare il
passaggio e renderlo automatico poi uso il bookmark preimpostato per
ritornare sulla stessa ma una nuova riga mi si aggiunge ugualmente alla fine
della datagrid.
Ho pensato: passo di nuovo un send keys {UP} subito dopo il down per
anticipare gli eventi del controllo datagrid e ritornare sulla stessa riga
appena inserita e aggiornata. Ma non funziona.
Insomma come si può aggiornare questa riga senza dover per forza passare ad
un'altra e lasciando che il controllo datagrid abbia la funzione allowadnew
attivata ?
Anticipo una possibile parziale risposta uso una sql  UPDATE SET prelevando
i valori dalla griglia ma in quale evento ?
Dani


Allora la cosa ha interessato anche me e ti propongo la mia soluzione
testata ora ora......
VB6 Sp5 WinXp Access2000 ADO 2.7 (quello di xp...va bene anche il 2.6)
provata con questo ambiente....
PRIMA UNA PREMESSA
OCCHIO....è pericoloso quello che vuoi fare tu....non tanto per fini
"logici" ma per fini "pratici"
è pericolo dare all'utonto la possibilita di fare input "diretti"....in
genere si raccolgono i dati e poi si dice "Ma sei sicuro? ma proprio
sicuro?"
Però se stai immettendo dei dati alla "excel" o controllando una serie
numerica fa comodo quello che dici tu !
Allora:
a) Apriti il recordset (ricordati.....modalità adUseClient se vai bound!)
b) popola la griglia
c) STACCA la connessione
d) Modifica il campo
e) RIATTACCA la connessione
f) UPDATEBATCH
siccome un esempio val + di mille parole
fatti una tabella Taglie(dei vestiti si!):
Campi
CodTipo
Taglia
Note ...son tutti text ...codTipo è la chiave
...mettici dei dati...per provare
poi...Una form
2 command
una datagrid
una listbox abbastanza larga
dentro il form:
Option Explicit
Dim Cn As New ADODB.Connection
Dim WithEvents Rs As ADODB.Recordset
Private Sub Command1_Click()
Set Rs = New ADODB.Recordset
Set Cn = ApreConn(, adUseClient)
Set Rs = ApreRec("SELECT * FROM Taglie", Cn, adOpenKeyset,
adLockBatchOptimistic)
If Rs.BOF Then
    MsgBox "Vuoto"
End If
Command1.Enabled = False
End Sub
Private Sub Command2_Click()
Set Dgrid.DataSource = Rs
Dgrid.AllowAddNew = True
Dgrid.AllowUpdate = True
'====DISCONNETTI==========
Set Cn = Nothing
List1.AddItem "LAVORO IN DISCONNESSO"
'====================================
End Sub
Private Sub Dgrid_AfterColUpdate(ByVal ColIndex As Integer)
List1.AddItem "GRIGLIA Dopo aggiornamento colonna :" & CStr(ColIndex)
'=====RICONNETTO=========
Set Cn = ApreConn(, adUseClient)
Rs.UpdateBatch
List1.AddItem "RICONNESSO"
End Sub
Private Sub Dgrid_BeforeColUpdate(ByVal ColIndex As Integer, OldValue As
Variant, Cancel As Integer)
List1.AddItem "Griglia prima di aggiornare colonna " & CStr(ColIndex) & "
Val." & CStr(OldValue)
End Sub
Private Sub Rs_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal
pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset
As ADODB.Recordset)
List1.AddItem "movecomplete"
List1.AddItem "edit active " & CStr(Dgrid.EditActive)
End Sub
Private Sub Rs_WillChangeField(ByVal cFields As Long, ByVal Fields As
Variant, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As
ADODB.Recordset)
List1.AddItem "Field: " & CStr(cFields) & " -- " & CStr(Fields(cFields - 1))
End Sub
in un modulo(modado.bas) le due function
Option Explicit
Public Function ApreConn(Optional DBconnesso As String = "JET", Optional
LatoConn As Long = adUseServer) As ADODB.Connection
Dim StringaConnessione As String
Dim Cn As New ADODB.Connection
Select Case Trim(UCase(DBconnesso))
    Case "JET"
        StringaConnessione = "Provider=Microsoft.Jet.OLEDB.4.0;"
        StringaConnessione = StringaConnessione & "Data Source=" & App.Path
& "\archivio\DBgen.mdb" (NO QUI CAMBIA PUNTA AL TUO DB)& ";Persist Security
Info=False"
        Cn.ConnectionString = StringaConnessione
        Cn.CursorLocation = LatoConn
'il resto non ti importa
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
'Public Function ApreRec(Tsql As String, Connessione As ADODB.Connection,
Optional Apre As Integer = adOpenKeyset, Optional LockRec As Integer =
adLockReadOnly) As ADODB.Recordset
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
e prova clikka su connetti
poi su popola
guarda il listbox
vai su un campo clicca...cambia un valore premi invio!
chiudi l'app...riaprila....
VEDI l'ha scritto!
con il sistema standard non l'avrebbe scritto!
Ripeto....occhio che potenzialmente un sistema del genere è pericoloso in
mano ad una segretaria!!!!
--
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 ...se cercate bene da qualche
parte c'è anche il forum!

 Dani wrote:
CUT
una cosa mi son dimenticato....
funziona solo con record esistenti...ed č giusto sia cosě!
Il NUOVO record devi (almeno dovresti se hai un minimo di esperienza)
validarlo prima di accettarlo!!!
se no fai casini mostruosi!
per questo a me non piacciano le griglie per l'addnew.....apro un piccolo
form valido tutto e poi li do di INSERT!!! e poi aggiorno la griglia!
sapessi quante segretarie fanno input sbagliato  o incongruenti!
--
Il Wodkino Nazionale č a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 ...se cercate bene da qualche
parte c'č anche il forum!

 --
Ok ti ringrazio proverň a seguire le tue indicazioni per adattarlo alla mia
situazione.
Dani