Condividi tramite

Creare più tabelle da tabella preesistente

Anonimo
2014-06-25T13:29:16+00:00

Buongiorno a tutti,

per motivi di lavoro ultimamente mi sono finalmente avvicinato a Ms Access, più imparo a usarlo e più ne percepisco le potenzialità.

Per facilitarmi in un'attività routinaria dell'ufficio, vorrei riuscire a creare più tabelle da una tabella preesistente. Mi spiego con un esempio:

Mi trovo ad aver importato da una sorgente (sorvolo su quale possa essere) in un'unica tabella così composta:

AMMINISTRATORI

Mario Bianchi  Milano

Sergio Rossi ; Roma

Franco Blu ; Venezia

CONSIGLIERI

Luca Verde ; Palermo

Paolo Rosso ; Firenze

Davide Giallo ; Bologna

IMPIEGATI

Giulia Marrone ; Bologna

Sergio Bianco ; Padova

Nicola Viola ; Padova

Quindi nel Campo1 ho sia ruoli (amministratori, consiglieri, impiegati) che i nomi, mentre nel Campo2 ho i comuni di nascita.

Ora il mio obbiettivo sarebbe, partendo da questa tabella, crearne tre una per ciascun ruolo (amministratori, consiglieri, impiegati) contenente i rispettivi nominativi.

Facendo un pò di ricerche online mi sono convinto che il modo più semplice sia quello di creare un modulo VBA che testando il Campo1 riesca a "delimitare" la tabella ed esportarla in una nuova.

Quindi vi chiederei innanzitutto se trovate che il mio ragionamento sia corretto (usare un modulo VBA) o se esiste un'ulteriore modo (solo se più agevole ovviamente) per arrivare allo stesso risultato; e poi se possibile vi chiederei qualche indicazione su come procedere per compilare un codice che effettui questo "test" sul Campo1 ai fini della limitazione di una tabella...

Grazie!

Alberto

Microsoft 365 e Office | Accesso | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

2 risposte

Ordina per: Più utili
  1. Anonimo
    2014-06-26T07:48:49+00:00

    David, grazie per la pronta risposta!

    Purtroppo l'esempio da me citato era banalmente esemplificativo, la tabella che devo "dividere" non contiene informazioni anagrafiche...

    Ti dirò che mi hai dato però due ottimi spunti che riuscirò sicuramente ad utilizzare!

    Il mio obbiettivo è proprio quello di (avendo una sorgente simile a quella da me citata dove ogni n record c'è una riga di intestazione e a seguire i record appartenenti a quella tabella) di riuscire a delimitare queste sezioni,

    Ho fatto un esempio banale perchè questo problema mi tornerebbe utile in molteplici e svariate situazioni in relazione alle tipologie di dati con cui mi trovo a lavorare..Se può essere utile ch'io sia più preciso, tratto spesso con output .txt di procedure aziendali nei quali, in un unico file sono contenute (separate e identificabili da una riga di intestazione) enormi quantità di informazioni più disparate che è inutile descrivervi..

    Da qui il motivo del mio semplice esempio e dubbio: trovare un modulo/macro che sia in grado di testare i record in modo da poter riconoscere una sorta di "intestazione" tramite la quale delimitarli per riga e identificarli in tabelle...!

    Ciao e buona giornata a tutti!

    grazie

    Alberto

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2014-06-25T14:48:18+00:00

    Ciao AlbertoBaVi,

    se posso permettermi un consiglio, creare tre tabelle una per ciascun ruolo non è, a mio avviso, l'approccio più efficiente al problema: cosa accadrebbe se una persona cambiasse ruolo (ammettendo che questo fosse possibile)? Dovresti eliminare la persona in una tabella ed accodarla in un'altra.

    Io creerei una tabella anagrafica unica per tutte le persone gestendo un campo che identifica il ruolo di questa persona. In questo modo basterebbe cambiare il valore di quel campo per cambiare il ruolo di quella persona in tutto il db.

    Seguendo questa filosofia, per importare i tuoi dati in una nuova tabella, ho fatto in questo modo:

    1. ho creato una nuova tabella "Anagrafica_Ruoli" con due campi: IdRuolo (Contatore) e Ruolo (descrittivo del ruolo identico ai ruoli che hai nella tabella di origine). Nella tabella ho precaricato i ruoli esistenti.
    2. ho creato una nuova tabella "Anagrafica_Persone" con i seguenti campi: IdAnagrafica (contatore), IdRuolo (numerico), Nome (stringa), Cognome (stringa), Citta (stringa).

    Ipotizzando che la tua tabella origine si chiami Anagrafica ed abbia 2 campi, Campo1 e Campo2, ho inserito all'interno di VBA un nuovo modulo standard e fatto girare questa routine:


    Sub sAnagrafica()

        Dim db As DAO.Database

        Dim rstO As DAO.Recordset   'Anagrafica origine

        Dim rstD As DAO.Recordset   'Anagrafica Persone

        Dim rstR As DAO.Recordset   'Ruoli

        Set db = CurrentDb

        With db

            Set rstO = .OpenRecordset("Select * From Anagrafica", dbOpenSnapshot, dbReadOnly)

            Set rstD = .OpenRecordset("Select * From Anagrafica_Persone", dbOpenDynaset, dbSeeChanges)

        End With

        With rstO

            Do While Not .EOF

                If DCount("*", "Anagrafica_Ruoli", "Ruolo = '" & !Campo1 & "'") > 0 Then

                    'sono in presenza di un ruolo

                    Set rstR = db.OpenRecordset("Select * From Anagrafica_Ruoli " _

                        & "WHERE Ruolo = '" & !Campo1 & "'", dbOpenSnapshot, dbForwardOnly)

                    .MoveNext

                    Do While Not DCount("*", "Anagrafica_Ruoli", "Ruolo = '" & !Campo1 & "'") > 0

                        rstD.AddNew

                            rstD!IdRuolo = rstR!IdRuolo

    rstD!Nome = Split(!Campo1, " ")(0)

    rstD!Cognome = Split(!Campo1, " ")(1)

                            rstD!Citta = !Campo2

                        rstD.Update

                        .MoveNext

                        If .EOF Then Exit Do

                    Loop

                    .MovePrevious

                    rstR.Close

                End If

                .MoveNext

            Loop

        End With

        rstD.Close

        rstO.Close

        db.Close

        Set rstR = Nothing

        Set rstD = Nothing

        Set rstO = Nothing

        Set db = Nothing

    End Sub


    La routine divide anche il nome/cognome della persona tenendo conto di uno spazio separatore e ipotizzando che il nome venga prima del cognome (mi sono basato sul tuo esempio). Ovviamente potresti non volere questa separazione e in questo caso sostituisci le due righe in grassetto con un'unica riga rstD!NomeCognome = !Campo1 (modificando ovviamente anche il nome del campo nella tabella Anagrafica_Persone.

    La routine è sicuramente perfettibile ma nel test raggiunge il suo scopo

    David

    La risposta è stata utile?

    0 commenti Nessun commento