Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    19

    [VB.6] Cancellazione multipla di righe in Datagrid

    Salve a tutti.

    Ho un problema da un paio di giorni e non riesco a risolverlo.
    Programmo in ambiente VB.6
    La mia applicazione deve gestire alcune tabelle in un DB SQL Server.
    Precisamente deve dare la possibilità di aggiungere righe, modificarle e cancellarle.
    Lavora sa due tabelle una contiene vari dati e per ogni riga esiste una chiave primaria, autoincrementale e non duplicabile, contenente il progressivo del cliente.
    L'altra contiene descrizioni utili per lanciare delle store procedure e anche qui una chiave primaria autoincrementale e non duplicabile.
    Il mio problema è questo.
    In un datagrid collego le due tabelle in base al progressivo e l'utente una volta selezionata una riga nella 1° tabella deve poterla eliminare, fino qui nessun problema, ma automaticamente tutte le righe della 2° tabella con quel progressivo devono essere eliminate in maniera corretta per tenere il DB pulito in un altro datagrid.
    Se ad esempio esistono tre righe con lo stesso progressivo, la prima la elimina correttamente, ma appena chiamo la delete sulla 2° riga mi visualizza a video il seguente messaggio: "impossibile individuare la riga specificata per l'aggiornamento, E' possibile che alcuni valori siano stati modificati dopo l'utlima operazione di lettura."

    Vi posto il codice che non funziona e la connessione al DB:
    [CODE]
    QUI POPOLO I DUE DATAGRIDnessun problema)
    'Imposto le variabili cs e rs come istanze degli oggetti Connection e Recordset'
    Set cs = New ADODB.Connection
    Set csDesMod = New ADODB.Connection
    Set rs2 = New ADODB.Recordset
    Set rsflag = New ADODB.Recordset

    cs.Open Stringa
    cs.CursorLocation = adUseClient
    rs2.Open "SELECT * FROM XXX_Analisi_Skipper", cs, adOpenKeyset, adLockPessimistic

    Set DataGrid1.DataSource = rs2
    DataGrid1.Refresh

    csDesMod.Open Stringa
    csDesMod.CursorLocation = adUseClient

    '********INNER JOIN SQL
    sql = "SELECT dbo.XXX_Analisi_Skipper_Flags.id, dbo.XXX_Analisi_Skipper.id AS Expr1, dbo.XXX_Analisi_Skipper_Flags.flag1, dbo.XXX_Analisi_Skipper_Flags.desflag1, " & _
    "dbo.XXX_Analisi_Skipper_Flags.flag2 , dbo.XXX_Analisi_Skipper_Flags.desflag2 " & _
    "FROM dbo.XXX_Analisi_Skipper_Flags INNER JOIN " & _
    "dbo.XXX_Analisi_Skipper ON dbo.XXX_Analisi_Skipper_Flags.id = dbo.XXX_Analisi_Skipper.id " & _
    "ORDER BY dbo.XXX_Analisi_Skipper_Flags.id"

    rsflag.Open sql, csDesMod, adOpenKeyset, adLockPessimistic
    Set DataGrid3.DataSource = rsflag
    DataGrid3.Refresh

    QUI AVVIO L'ELIMINAZIONE:
    numberofrow = DataGrid1.ApproxCount
    numberofrow3 = DataGrid3.ApproxCount

    If (numberofrow > 1) Then
    If (rs2.Supports(adDelete) And rsflag.Supports(adDelete)) Then
    If MsgBox("Confermi cancellazione riga?", vbYesNo) = vbYes Then
    Cancella = True
    controllo = 0
    Do While (controllo <> numberofrow3)
    DataGrid3.Row = controllo
    If (LTrim(RTrim(DataGrid1.Columns(8).Text)) = LTrim(RTrim(DataGrid3.Columns(0).Text)))
    Then
    rsflag.Delete
    rsflag.Update
    controllo = -1
    numberofrow3 = numberofrow3 - 1

    rsflag.Update
    DataGrid3.Refresh
    End If
    controllo = controllo + 1
    Loop
    ......
    .....
    .....
    [CODE]
    L'errore come potete immaginare si presenta quando viene chiamato per la 2° volta rsflag.delete

    Vi prego illuminatemi

  2. #2
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Invece che incartarti sui problemi del DataGrid ti conviene eliminare tutto in un solo colpo usanod un oggetto ADODB.Command oppure direttamente dalla connessione ADO.

    Scegliere poi i record da eliminare utilizzando
    numberofrow = DataGrid1.ApproxCount
    mi pare quanto meno temerario, ed è comunque inutile se fai come sopra.

    Il modo SICURO per eliminare correttamente dei record è riferirsi a questi utilizzando la chiave primaria, visto che c'è e puoi utilizzarle.
    Naturalmente il tutto 'condito' all'interno di una transazione. Ovvero:

    codice:
    Dim bOnTransaction As Boolean
    Dim sSQL As String
    Dim oCursorLocation As integer
    
    On Error Goto ERR_HANDLER
    
    oCursorLocation = cs.CursorLocation ' prendo nota dell'impostazione esistente
    cs.CursorLocation = AdUseServer
    cs.BeginTrans
    bOnTransaction = True
    
    ' prima eliminazione
    sSQL = "DELETE FROM tabella1 WHERE ChiavePrimaria = " & pk
    cs.Execute(sSQL)
    
    ' seconda eliminazione
    sSQL = "DELETE FROM tabella2 WHERE ChiavePrimaria = " & pk
    cs.Execute(sSQL)
    
    cs.CommitTrans
    cs.CursorLocation = oCursorLocation ' rimetto tutto a posto
    
    ' se sono qui, tutto è andato bene!
    
    On Error Goto 0
    Exit Sub
    
    ERR_HANDLER:
    ' Qualcosa è andato storto, annullo tutto
    If bOnTransaction Then
        cs.CursorLocation = oCursorLocation
        cs.RollBackTrans
    End If
    Ho scritto al volo, quindi verifica bene PRIMA

    Ovviamente dovrai poi fai il requery dei 2 recordset, distruggere gli oggetti, insomma le solite cose.


  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2009
    Messaggi
    19
    Hai ragione, basta far eseguire una query sql in cui indico il progressivo da eliminare senza complicarmi la vita con il datagrid e in un attimo non ho nessun problema di consistenza e correttezza dei dati contenuti nel mio DB.
    Grazie per la dritta ciao. :quote:

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.