Accodamento record

di il
9 risposte

Accodamento record

Buon pomeriggio
Ho il seguente problema:
A volte ho bisogno di inserire nel mio database alcuni record che sono
uguali in tutte le sue parti e diversi solo in un campo come di
seguito spiegato:
marca nome mot. matr.
fiat A500 1300 3453
fiat A500 1300 3454
fiat A500 1300 3455
fiat A500 1300 3456
fiat A500 1300 3457
fiat A500 1300 3458
fiat A500 1300 3459
fiat A500 1300 3460
fiat A500 1300 3461
fiat A500 1300 3462
fiat A500 1300 3463
c'è la possibilita di inserire questi dati, visto che cambia in modo
sequenziale solo la matricola, in una volta sola?
cioè
marca nome mot. da matr. a matr.
fiat A500 1300 3453 3463
=========================

Questa domanda la ho fatta qualche anno fa nel forum di google e mi è stato risposto in questo modo:

=========================
For i = 3453 to 3463
RS.AddNew
RS("NomeCampo") = "fiat A500 1300 " & i
RS.Update
Next
=========================
Non sono riuscito ad applicarla, qualcuno mi sa aiutare per cortesia.
Grazie

9 Risposte

  • Re: Accodamento record

    Facci vedere come hai definito il RECORDSET mancano dei pezzi...
  • Re: Accodamento record

    Scusa l'ignoranza ma non so risponderti, sostanzialmente ho bisogno di fare una maschera con il quale vorrei mandare sulla tabella il risultato. Grazie
    Puoi anche non considerare la risposta che mi è stata data e darmi un'altra soluzione, Grazie di nuovo.
  • Re: Accodamento record

    Io non mi fossilizzerei tanto su quel For...Next...
    Propongo un paio di soluzioni spartane, ma semplici ed efficaci.

    1) Io penso che i primi 3 campi non avranno quei valori in eterno. Il modo più banale sarebbe quello di sfruttare la combinazione di tasti CTRL+' (apostrofo) che ti permette di inserire lo stesso dato del record precedente.

    2) Se sai già che per 100, 1000 record quei 3 valori saranno costantemente gli stessi, almeno in via temporanea, potresti impostarli come "Valori predefiniti" nei rispettivi campi. Poi, puoi sempre cambiarli in un secondo momento, quando tale situazione di default dovesse venir meno.
  • Re: Accodamento record

    Salve.
    In effetti, con un maschera dove immettere dall'ID - all'ID (a parte controlli di coerenza/univocità dell' ID), e i valori dei campi che si ripetono e un bel Pulsante: [Inserisci], non sarebbe una cattiva idea per inserirne un bel po, anche se ci sfugge l'utilità di avere 'N' record con gli stessi valori e solo un diverso ID...?! Inoltre, come dice il bravo @Alex, dovresti darci qualche definizione del reordset in più.
    Ma poi, se non sono di fuori per l'ora , con il ciclo che hai scritto, assegneresti i 3 valori:
    marca | nome | mot. dentro il solito [campo], NON è che dovrebbero essere 3 campi distinti della Tabella...?!
    RS("NomeCampo") = "fiat A500 1300 "
    'Notte.
  • Re: Accodamento record

    Ciao.
    Si è possibile, ed in modo diciamo relativamente semplice, ma non in modo automatico, sopratutto con il codice che ti hanno suggerito.
    A parte, come già fatto notare da Alex, è incompleto, il codice suggerito inserisce numeri sequenziali tra di loro da X fino ad Y con un incremento di X+1. Se ad un certo punto hai bisogno di saltare uno o più numeri di matricola, il codice diventa praticamente inutile, anzi ti crea solo un grande disagio e molto lavoro manuale per rimettere tutto a posto, senza contare che ogni volta dovresti modificare X ed Y etc etc e questi sono solo i primi intoppi che mi vengono in mente.
    Per risolvere il problema devi:
    Creare una tabella che contenga i dati che si ripetono, creare una seconda tabella che conterrà il dato che cambia. Colleghi le due tabelle.
    Ora creiamo la maschera, che per semplicità costruiremo usando il wizard di access.
    Scegli crea maschera guidata, ti appare una schermata che ti chiede di inserire i campi da immettere nella maschera.
    Seleziona la prima tabella e scegli tutti i campi.
    Seleziona la seconda tabella e scegli tutti i campi.
    procedi seguendo le istruzioni a video.
    Una volta creata la maschera, avrai nella parte superiore i campi della prima tabella, nella parte inferiore, contenuti in una sottomaschera, i dati che cambiano contenuti nella seconda tabella, in questo caso la matricola.
    Per immettere la matricola ti basterà inserire i dati nella sottomaschera, senza creare un nuovo record nella maschera superiore. Praticamente la prima parte viene immessa solo la prima volta.
    Se poi avrai bisogno di immettere un nuovo modello di macchina, ti basterà aggiungere un nuovo record alla maschera superiore (contenuto nella prima tabella) e poi inserire le nuove matricole (contenute nella seconda).
    Ricorda che devi collegare le due tabelle, usando le relazioni, altrimenti non funziona.
    1Nf applicata.
    Questo naturalmente implica che tu dovrai immettere i dati matricola in modo manuale.
    Volendo si può automatizzare il tutto, ma questo significa andare "pesante" con il VBA, minimo altre due maschere per inserire i dati di partenza e di arrivo, considerare le eccezioni.............. secondo me, meglio mettere i dati manualmente e comunque, anche automatizzando il tutto, la base di partenza deve essere quella delle tabelle collegate tra di loro, altrimenti in presenza di una mole consistente di dati si creerrebbe pure il problema di avere una ricerca rapida e funzionale.
    ciao, fammi sapere se questa è una soluzione che ti può andare bene.
  • Re: Accodamento record

    Una domanda, è possibile invece, tramite una maschera, fare una query di creazione tabella e dopodiché fare un accodamento alla tabella principale?
    Significando che ho bisogno sempre di un aiuto nel creare la query, inserendo come campi:
    MARCA
    NOME
    MOTORIZZAZIONE
    MATRICOLA (CAMPO CHE SI AUTOINCREMENTA DA UN NUMERO AD UN ALTRO NUMERO)

    Insomma la maschera dovrebbe avere i campi

    MARCA
    NOME
    MOTORIZZAZIONE
    DA MATRICOLA
    A MATRICOLA

    non potrebbe essere una soluzione?
    Grazie
  • Re: Accodamento record

    Salve.
    Non comprendo tutte queste complicazioni, addirittura creare tabelle di appoggio...
    Credo di interpretare, come già detto, quello che vorrebbe fare 'Romano...'.
    Accodare ad una Tabella esistente N record, riportanti i soliti dati nei campi:
    'MARCA'
    'NOME'
    'MOTORIZZAZIONE'

    e nel campo univoco ID (Matricola), inserire un progressivo DA... AL...
    Allora, ho fatto una prova e funziona benissimo, chiaramente, ripeto, NON ci sono controlli di coerenza (es. di duplicazione degli ID, nel caso andrebbe gestito l'errore generato).
    Ora capisco che vorresti tutto fatto, ma NON credo che sia lo spirito del Forum.
    Io ti fornisco il codice, abbinato all'evento 'click' di un pulsante presente in una maschera (nome pulsante, come puoi vedere = 'CmdIns', che inserisce N record con ID = Dal, Al... (io ho inserito 10 record con ID = da 20 a 30), la Tabella si chiama 'Tabella1', i campi chiamati come hai indicato.
    
    Private Sub CmdIns_Click()
        ' --- prova inserimento vari record .... campi uguali con ID diverso...
        Dim DBCorrente As DAO.Database
        Dim Tabella As DAO.Recordset
        ' - Variabile che si incrementa...
        Dim CtId As Long
        
        
        '- Apro la tabella
        Set DBCorrente = CurrentDb
        Set Tabella = DBCorrente.OpenRecordset("Tabella1", dbOpenDynaset)
        
        ' - Inizio ciclo inseritore record -
        For CtId = 20 To 30
            ' --- Inserimento nuovo rec.
            Tabella.AddNew
            Tabella.Fields("IdTab1") = CtId
            Tabella.Fields("Marca") = "Fiat"
            Tabella.Fields("Nome") = "500"
            Tabella.Fields("Motorizz") = "1300"
            Tabella.Update
        Next
        
        'Chiusura tabelle
        Tabella.Close
        DBCorrente.Close
        
        MsgBox ("Records Inseriti!!!")
        
    End Sub
    
    
    Chiaramente, se nella Maschera inserirai 2 caselle testo con gli estremi degli ID (DAL... AL...) Numerici - es. li chiami: TxtDal e TxtAl e altre 3 Caselle testo, per ogni campo, e dentro ci scriverai il contenuto dei 3 campi fissi, puoi chiamrli: TxtC1, TxtC2 e TxtC3
    Nel codice del mio es., andrai a sostituire il 20 con: TxtDal.Value e il 30 con: TxtAl.Value - Poi dove ho scritto "Fiat" e così per gli altri 2 - Metterai: TxtC1.Value, TxtC2.Value e TxtC3.Value.
    Dovrebbe andare tutto...
    Saluti.
    Luciano.
  • Re: Accodamento record

    Ciao.
    Lucky, mi hai anticipato di poco
    Comunque io non userei la matricola come Id univoco, perchè potrebbe essere non univoca.
    Io propenderei per aggiungere un Id indipendente univoco.
  • Re: Accodamento record

    Attenzione che il campo che immagino possa essere UNIVOCO [IdTab1] se fosse una PK di tipo COUNTER non può essere SCRITTA, è un AUTOINCREMENT.

    Lo specifico in quanto 99% dei casi ha Campi PK di tipo COUNTER, peraltro se così non fosse è tutto OK, aggiungerei la distruzione finale degli oggetti per pulizia
    
    Tabella.Close
    DBCorrente.Close
    Set Tabella=Nothing
    Set DBCorrente=Nothing
    Al posto di dichiarare sempre Oggetti di tipo Database, si può ovviare usando l'istanza in essere
    
    Set Tabella=DbEngine(0)(0).OpenRecordset(.....)
    oltre ad essere più veloce in quanto non necessita riassegnazione in memoria di un'oggetto, evita la chiamata a CurrentDB, e non ha l'effetto negativo della chiamata a CurrentDB che genera in memoria una copia inutile...

    Ovviamente sono mie pignolerie.
Devi accedere o registrarti per scrivere nel forum
9 risposte