Accodamento record via VBA su tabelle collegate

di il
15 risposte

Accodamento record via VBA su tabelle collegate

Buon giorno.

Piccolo problemino.

Dovrei accodare dei record tramite vba in una tabella collegata con integrità referenziale, copiando naturalmente tutte le chiavi giuste.

Essendo presente l'integrità referenziale non accoda nessun record, tra parentesi non dandomi nessun tipo di errore.

Come aggiro il problema?

questo è la stringa che ho provato ad usare, che funziona se la tabella è senza integrità referenziale.

strSQL = "INSERT INTO Tbl_puntate (numeropuntate,titolo) values " & "(" & a & "," & 15 & “)”

grazie.

(mentre sto scrivendo mi sono calato le braghe, in attesa delle scudisciate sulle chiappe, soprattutto da @Alex, perchè scommetto che la soluzione sarà una baggianata, oppure perché mi illudevo di prendere la stada breve per aggiungere in massa record precompilati)

15 Risposte

  • Re: Accodamento record via VBA su tabelle collegate

    Onestamente non ho capito…

    Se devi inserire dei Records lato M di una relazione mi pare ovvio che tu debba valorizzare nei campi del record inserito la Fk con un valore esistente lato 1… altrimenti.come puoi pensare di aggiungere records…? RELAZIOANLE significa questo ??

    probabilmente ho capito male…?

  • Re: Accodamento record via VBA su tabelle collegate

    08/12/2022 - @Alex ha scritto:


    Onestamente non ho capito…

    Se devi inserire dei Records lato M di una relazione mi pare ovvio che tu debba valorizzare nei campi del record inserito la Fk con un valore esistente lato 1… altrimenti.come puoi pensare di aggiungere records…? RELAZIOANLE significa questo ??

    probabilmente ho capito male…?

    Infatti, riscrivendo il codice con il metodo 

    Dim dbs As Database
    Dim rst As DAO.Recordset
    Dim tabella As String
    tabella = "tabella1"
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset(tabella)
    With rst
    .AddNew
    !testo = 18
    !testo2 = 2
    !idtabella1 = 1
    
    .Update
    End With

    mi sono subito accorto che nell'istruzione precedente non mettevo il riferimento della chiave.

    Che poi lo sapevo che lo dovevo mettere, infatti lo recuperavo dalla form madre, ma non avevo aggiunto il campo nella riga INSERT INTO.

    Ora naturalmente funziona in entrambi i modi.

    Non so perchè, ma ero entrato in cortocircuito ed ogni volta che leggevo la riga, ero sicurissimo di aver inserito anche la chiave esterna.

    Sarà la vecchiaia?
    Comunque grazie.

  • Re: Accodamento record via VBA su tabelle collegate

    08/12/2022 - fratac ha scritto:

    Sarà la vecchiaia?
    Comunque grazie.

    Confermo… e sicuramente quello sono anni che faccio prove che confermano hahaha

  • Re: Accodamento record via VBA su tabelle collegate

    08/12/2022 - @Alex ha scritto:


    Confermo… e sicuramente quello sono anni che faccio prove che confermano hahaha

    Anche tu in questi casi, rispolveri il vocabolario dell'aramaico? XD XD XD XD

    (@Toki, rimetti gli smile che qualche volta servono)

  • Re: Accodamento record via VBA su tabelle collegate

    08/12/2022 - @Alex ha scritto:


    Se devi inserire dei Records lato M…

    Ritornando seri.

    Al di là della chiarezza del codice, dove con INSERT TO, diventa tutto molto complicato per la scrittura della stringa, sopratutto se si hanno una caterva di variabili da attribuire ai vari campi.

    A livello tecnico prestazionale, secondo te, quale metodo è da preferire?

    Il primo con 

    strSQL= INSERT INTO (.....)
    DBEngine(0)(0).Execute (strSQL)

    oppure il secondo con 

    Dim dbs As Database
    Dim rst As DAO.Recordset
    Dim tabella As String
    tabella = "tabella1"
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset(tabella)
    With rst
    .AddNew
    !testo = 18
    !testo2 = 2
    !idtabella1 = 1
    
    .Update
    End With
  • Re: Accodamento record via VBA su tabelle collegate

    Dal momento che l'inserimento è sempre uno alla volta credo cambierebbe poco.

    Se devi inserirne Molti tuttavia d aprirei una transazione prima del ciclo per poi fare il commit

  • Re: Accodamento record via VBA su tabelle collegate

    08/12/2022 - @Alex ha scritto:


    Dal momento che l'inserimento è sempre uno alla volta credo cambierebbe poco.

    Se devi inserirne Molti tuttavia d aprirei una transazione prima del ciclo per poi fare il commit

    Praticamente è un autopopolamento incrementale gestito con un for next di un numero variabile di record con valori di campi che variano, in base alle scelte dell'utente tramite una maschera esterna.
    Questo per evitare di dove immettere manualmente una caterva di record con svariati campi.

    Quello che ho postato era un codice di prova creato al volo, perchè nell'originale mi ero incartato e mi serviva avere solo il codice “pulito” scevro da altri elementi che mi distraevano e rischiavo di commettere errori “fatali” che mi avrebbero compromesso sopratutto i dati già archiviati.

    Comunque la transazione non l'avevo presa in considerazione.

  • Re: Accodamento record via VBA su tabelle collegate

    Se parliamo di una decina di records… non serve se suamo sul centunaio potresti notare la differenza di velocità.

  • Re: Accodamento record via VBA su tabelle collegate

    08/12/2022 - @Alex ha scritto:


    Se parliamo di una decina di records… non serve se suamo sul centunaio potresti notare la differenza di velocità.

    dalle previsioni fatte, si tratta di un valore compreso tra i 10 ed i 30 record per ogni operazione di inserimento, o che bisogna cambiare il record della tabella padre.
    Quindi stiamo parlando di numeri piccoli.

    C'è da dire che una transazione mi permetterebbe un rollback.

    Devo valutare la cosa.

  • Re: Accodamento record via VBA su tabelle collegate

    Si ovviamente… in caso di errore… dici sia lo scenario ipotizzabile…?

    Una volta che chiedi conferma di inserimento errori non ne devono uscire… quindi il Rollback a che pro…?

    Non si tratta di azioni particolarmente critiche però è sicuramente corretto.

  • Re: Accodamento record via VBA su tabelle collegate

    08/12/2022 - @Alex ha scritto:


    Si ovviamente… in caso di errore… dici sia lo scenario ipotizzabile…?

    Una volta che chiedi conferma di inserimento errori non ne devono uscire… quindi il Rollback a che pro…?

    Non si tratta di azioni particolarmente critiche però è sicuramente corretto.

    Premetto che le transazioni le conosco solo a livello didattico. Sono un semplice appassionato e non le ho mai usate a livello pratico.
    Nella fattispecie sarebbe come usare un cannone per sparare ad un uccellino e di errori non ne dovrebbero uscire.

    La mia paura principale e che se per errore, (l'ho visto fare ad un collega su un programma professionale) venisse inserito un numero di un milione di record, gestito con un ciclo for o while, sarebbe impossibile da fermare e molto difficile da riportare allo stato originario.

    anche se nel mio caso, non dovrebbe accadere.

  • Re: Accodamento record via VBA su tabelle collegate

    Quello è un discorso differente…

    Si risolve usando le VALIDATION ROULES e la gestione errori, ovvero nella textbox di inserimento N° Records inserisci >0 and <100

    Non accetterà valori diversi e restituisce errore su Form error che va gestito.

    Oppure ancora più semplice:

    if valore<0 or Valore>100 then
        Msgbox “errore numero”
        exit function
    end if
    Tuo Ciclo…
  • Re: Accodamento record via VBA su tabelle collegate

    08/12/2022 - @Alex ha scritto:


    Quello è un discorso differente…

    Si risolve usando le VALIDATION ROULES e la gestione errori, ovvero nella textbox di inserimento N° Records inserisci >0 and <100

    Non accetterà valori diversi e restituisce errore su Form error che va gestito.

    Oppure ancora più semplice:

    if valore<0 or Valore>100 then
        Msgbox “errore numero”
        exit function
    end if
    Tuo Ciclo…

    E' una delle soluzioni a cui avevo pensato, ma poi sorge il problema se il numero deve essere superiore.
    Però fattispecie facilmente superabile con la possibilità di sblocco del numero massimo dei record inseribili e semplice da gestire a livello di codice. E penso che alla fine adotterò questa via.

    I dati dovrebbero essere immessi giornalmente, e questa funzione specifica dovrebbe essere usata solo nei casi in cui bisognasse archiviare una sostanziale quantità di dati presenti nel cartaceo, nella migrazione da archivio analogico ad archivio digitale. 
    Una volta creati i record, riempiti con tutti gli elementi in comune, poi o manualmente o con query di aggiornamento apposite, si andrebbero ad aggiungere tutti i dati diversi tra di loro.

    A livello concettuale è semplice, fino a quando non ti imbatti in quegli errori  che gli anglosassoni chiamano “le dita grasse”.
    Quindi l'unica via veramente percorribile è quella di evitare il problema a monte.

    Giusto per amor della conversazione e per analizzare eventuali soluzioni alternative, tra le varie soluzioni a cui avevo pensato era quello di stoppare il ciclo con una combinazione dei tasti.

    Però, se ben ricordo, (e correggimi se sbaglio) access quando interagisce con le tabelle, non c'è modo di farlo “rimanere in ascolto”  di eventuali immissioni esterne, quindi non è una strada percorribile.

    Inoltre, mi sono divertito a fare varie prove e per scrivere 32767 nuovi record (ciclo creato con variabile integer) impiega meno di 4 secondi e per scrivere un milione di record, impiega circa 2 minuti e 53 secondi.
    Quindi, nel tempo che intercorre tra accorgersi dell'errore, ricordare la combinazione dei tasti e digitarli nel modo giusto, il danno è già consistente. Ed anche per questo motivo il break non è percorribile.

    Avevo pensato alla proprietà maschera formattata delle text box, ma è scomoda e non mi piace. E comunque se al posto di 99 venisse scritto 999 saremmo punto a capo.

    C'è la possibilità della transazione, ma alla fine non mi risolve il problema.

    Avevo pensato anche ad un semplice avviso tipo “Ehi bello, guarda che stai ad inserire un milione di righe. Poi te le dovrai cancellare a mano”, ma oltre alle dita grasse, esiste anche il prosciutto sugli occhi..

    Comunque penso che dovrò inserire anche un campo dove archivio la data di immissione del record, così da poter eliminare da front end i record immessi erroneamente attraverso una semplice query di eliminazione parametrica, anche se mi si appesantisce il database.

    Comunque al prossimo “amico” che chiama alla due di notte dicendo: "Hey, dormi? Visto quella modifica che mi hai fatto su quel programma facile che sto realizzando con access, beh mi ha aggiunto migliaia di record", gli taglio le dita( grasse).

  • Re: Accodamento record via VBA su tabelle collegate

    09/12/2022 - fratac ha scritto:


    Però, se ben ricordo, (e correggimi se sbaglio) access quando interagisce con le tabelle, non c'è modo di farlo “rimanere in ascolto”  di eventuali immissioni esterne, quindi non è una strada percorribile.

    Se sei in un ciclo, mettere un DoEvents ogni N iterazioni.

Devi accedere o registrarti per scrivere nel forum
15 risposte