Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Evento su checkbox causa errore condivisione con backend MySQL

  1. #1
    Maramauri non è in linea Novello
    Buon pomeriggio a tutti,
    Ho una maschera “articoli” e una sottomaschera “indici di modifica” che mostra le varie modifiche introdotte nel tempo per ciascun articolo e solo una di queste modifiche può avere il flag sulla checkbox “modifica corrente” quindi per evitare che ve ne sia uno di troppo (magari dimenticato dall’utente) ho gestito l’evento con questa query (che pulisce le checkbox)
    Private Sub IndModAttivo_BeforeUpdate(Cancel As Integer)
    Dim strSQL As String
    strSQL = "UPDATE tblIndiciModifica "
    strSQL = strSQL & "SET tblIndiciModifica.IndModAttivo = '" & False & " ' "
    strSQL = strSQL & "WHERE tblIndiciModifica.FK_IDAnaArt_IndMod = [Maschere]![frmAnagraficaArticoli]![IDAnaArt]"
    DoCmd.RunSQL strSQL
    End Sub
    
    Con il backend di access (2016) la query va a buon fine ma con il backend MySQL restituisce il risultato: “Impossibile aggiornare tutti i record nella query di aggiornamento. Numero di campi non aggiornati per un errore di conversione tra tipi: 0; a causa di violazione di chiavi:0; a causa di violazioni di condivisioni:2; bla bla.. “
    Non capisco la ragione del messaggio di violazione di condivisione. Il tipo di dati in MySql è tinyint (con tipo Boolean oltre a questo avviso mi da anche l’avviso di modifica contemporanea di records)
    Avete qualche suggerimento per ovviare (a parte disattivare gli avvisi)?
    Grazie molte per la Vs. attenzione
    Ciao

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Sicuro che il pezzo nel SET sia corretto...?
    Metti un False molto strano...
    Poi MySql non riconosce di certo [Maschere]![frmAnagraficaArticoli]![IDAnaArt]
    Sei certo poi che l'evento giusto sia Before...?

    Insomma mi pare ci siano molte cose strane...
    Ultima modifica di @Alex; 27-04-2021 18:02 
    ℹ️ Leggi di più su @Alex ...

  3. #3
    Maramauri non è in linea Novello
    Grazie Alex per il tuo intervento.
    il SET l'avevo scritto anche cosi: "SET tblIndiciModifica.IndModAttivo = False" e in entrambe i modi funziona. (lo verifico direttamente su phpMyAdmin).
    SQL lo esegue Access non MySQL quindi la forma [Maschere]![frmAnagraficaArticoli]![IDAnaArt] va bene.
    L'evento Before credo sia giusto perchè così prima di valorizzare a TRUE la checkbox cliccata mi assicuro che tutte siano state poste su FALSE

  4. #4
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Quote Originariamente inviato da Maramauri Visualizza il messaggio
    Grazie Alex per il tuo intervento.
    il SET l'avevo scritto anche cosi: "SET tblIndiciModifica.IndModAttivo = False" e in entrambe i modi funziona. (lo verifico direttamente su phpMyAdmin).
    Se metti ZERO (0) in numero... ovviamente...?
    Quote Originariamente inviato da Maramauri Visualizza il messaggio
    SQL lo esegue Access non MySQL quindi la forma [Maschere]![frmAnagraficaArticoli]![IDAnaArt] va bene.
    Che venga eseguito da Access è ovvio ma solo perché tu la scrivi male e costringi MySQL a restituire a JET l'intero recordset di dati ed operare l'UPDATE.
    Questo è proprio il modo peggiore di gestire i dati.
    Una query di questo tipo va fatta eseguire al SERVER... anche se la lanci da Access, il driver è intelligente, ma tu devi scrivere cose sensate.
    Quote Originariamente inviato da Maramauri Visualizza il messaggio
    L'evento Before credo sia giusto perchè così prima di valorizzare a TRUE la checkbox cliccata mi assicuro che tutte siano state poste su FALSE
    Avrebbe senso se fossi in una transazione, ma così non è quindi quello che dici non ha alcun senso.
    Vedi tu...
    ℹ️ Leggi di più su @Alex ...

  5. #5
    Maramauri non è in linea Novello
    Se metti ZERO (0) in numero... ovviamente...?
    non cambia il comportamento, avevo già tentato.

    Una query di questo tipo va fatta eseguire al SERVER... anche se la lanci da Access, il driver è intelligente, ma tu devi scrivere cose sensate.
    Puoi darmi una indicazione su come scriverla per farla eseguire al server?

    Avrebbe senso se fossi in una transazione, ma così non è quindi quello che dici non ha alcun senso.
    secondo me è corretto l'evento su before perchè l'azione "svuota tutte le checkbox" deve essere effettuata prima che il checkbox selezionato diventi true, altrimenti cosa uso? Su attivato? Tento.

    Grazie molte per l'aiuto
    Saluti

  6. #6
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scribacchino
    Quote Originariamente inviato da Maramauri Visualizza il messaggio
    Puoi darmi una indicazione su come scriverla per farla eseguire al server?
    Semplice : non inserire nella query quello che il motore di MySQL NON può risolvere (perchè non sa cosa sia).
    Quindi NON usare : [Maschere]![frmAnagraficaArticoli]![IDAnaArt] ma usa direttamente il valore di IDAnaArt.

    Ultima considerazione : se persona informata del fatto che MySQL codifica il valore True = 1 (mentre per Access è = -1) ?

  7. #7
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Non va bene il Before usato così... non ha proprio senso perché fai un'azione esterna non gestita in transazione.
    usa AfterUpdate.

    Che tipo di campo è IndModAttivo...?
    ℹ️ Leggi di più su @Alex ...

  8. #8
    Maramauri non è in linea Novello
    Grazie Max.Riservo per i suggerimenti,

    quindi devo usare campi/tabelle e non controlli/maschere, ovvero:
    "WHERE tblIndiciModifica.FK_IDAnaArt_IndMod = tblAnagraficaArticoli.IDAnaArt"
    
    Per il valore di TRUE, si, sapevo. Gentilissimo
    Grazie molte

  9. #9
    Maramauri non è in linea Novello
    Quote Originariamente inviato da @Alex Visualizza il messaggio
    Non va bene il Before usato così... non ha proprio senso perché fai un'azione esterna non gestita in transazione.
    usa AfterUpdate.

    Che tipo di campo è IndModAttivo...?
    ho usato AfterUpdate, non cambia nulla.
    Il campo IndModAttivo è tinyint(1); ho provato anche con Boolean ma ancora comportamento immutato, ovvero la query va a buon fine ma permane l'avviso di violazione di condivisione.

    Grazie molte per l'interessamento!

  10. #10
    L'avatar di @Alex
    @Alex non è in linea Moderatore Globale
    Quote Originariamente inviato da Maramauri Visualizza il messaggio
    Grazie Max.Riservo per i suggerimenti,

    quindi devo usare campi/tabelle e non controlli/maschere, ovvero:
    "WHERE tblIndiciModifica.FK_IDAnaArt_IndMod = tblAnagraficaArticoli.IDAnaArt"
    
    Per il valore di TRUE, si, sapevo. Gentilissimo
    Grazie molte
    Temo tu non abbia compreso...!

    Devi evitare che sia il Motore di MySQL a dover risolvere il riferimento... quindi lo devi risolvere in modo ESPLICITO in modo che al motore di MySQL arrivi il valore già convertito.
    "WHERE tblIndiciModifica.FK_IDAnaArt_IndMod = " & Me.IDAnaArt
    
    ℹ️ Leggi di più su @Alex ...

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. CheckBox evento CheckedChanged non funziona
    Da perla0279 nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 20-02-2017, 16:39
  2. checkbox ricerca mysql dato
    Da creatorweb nel forum PHP
    Risposte: 2
    Ultimo Post: 05-09-2009, 09:09
  3. [VB6] Esportazione XLS causa errore DataGrid
    Da StegcO nel forum Visual Basic 6
    Risposte: 16
    Ultimo Post: 22-10-2008, 16:43
  4. MySQL condivisione dati in rete
    Da ablazione nel forum Delphi
    Risposte: 3
    Ultimo Post: 12-06-2007, 00:31
  5. Errore su checkbox
    Da cippalippa nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 09-06-2006, 11:07