Proprieta' campi tabella ACCESS in VBA

di il
13 risposte

Proprieta' campi tabella ACCESS in VBA

Ciao a tutti,
Mio primo intervento/richiesta aiuto. Chiedo scusa per eventuali errori o repliche.
Dunque, avrei la necessità di caricare correttamente i dati contenuti in un'array a due dimensioni (tutti String) all'interno di una tabella in ACCESS.
I campi della tabella sono di tipo DATA Stringa Numero Integer Numero Double ..ecc. A tal punto, prima di procedere all'APPEND dei dati, ho necessità di convertire i dati dell'array prima di aggiungerli in tabella. La mia difficoltà è nel trovare le definizioni dei campi contenuti nella tabella al fine di dare un senso ai dati scritti nella medesima. Non ho fatto una premessa: vorrei evitare di procedere a priori, ovvero preferirei codificare la procedure al fine di utilizzarla con altre strutture dati. Grazie a tutti. Piero

13 Risposte

  • Re: Proprieta' campi tabella ACCESS in VBA

    Se un utente più esperto di me ha capito meglio, si faccia avanti. Per me:
    1. Da dove lo vai a prendere questo array?
    2. Se non vedo qualche esempio di dati significativi (2-3 record) non riesco a capire quale funzione appropriata possa fare la corretta conversione.
    3. Puoi elencare tutti i nomi campo e loro tipologie?
  • Re: Proprieta' campi tabella ACCESS in VBA

    Ciao OsvaldoLaviosa,
    Grazie per la "vista" :)
    1.1) L'array viene popolata attraverso un file testo "TAB"
    1.2) Rispondo prima della tua affermazione: no .. la mia intenzione è fare un INPUT LINE e non una importazione ACCESS f34
    2.1) sono almeno 15000 righe per 35 colonne dati
    Ho allegato l'immagine

    Grazie mille ancora
    Allegati:
    27846_2851479aad77d52c97a87cfbf57efe44.jpg
    27846_2851479aad77d52c97a87cfbf57efe44.jpg
  • Re: Proprieta' campi tabella ACCESS in VBA

    Io non so come si fa a gestire l'array di dati provenienti da un file testo. Presuppongo tu lo sappia fare. Riguardo la conversione da Stringa negli altri tipi di dati, leggi qui
    https://support.office.com/it-it/article/funzioni-di-conversione-tra-tipi-di-dati-8ebb0e94-2d43-4975-bb13-87ac8d1a2202
  • Re: Proprieta' campi tabella ACCESS in VBA

    Io non ho ben capito... prima di tutto come inserisci i dati in tabella... usi un recorder o una query Action...?
    Secondo me il modo migliore sarebbe attraverso il metodo Addnew del recordset.
    In questo caso il FieldType lo ricavi proprio dal campo stesso quindi in relazione al valore restituito dalla proprietà Type dell'oggetto Field devi condizionare la formattazione del dato con cui valorizzi il campo stesso...
    Sembra un gioco di parole ma è semplice...
    I problemi li puoi avere in 2 casi:
    1) campo data... ma nemmeno più di tanto...
    2) campo numerico con decimali(dipende da che carattere hai come separatore dal campo testo)...
    Altri tipi di valore non hanno nulla da convertire.

    Quindi prova a ragionare in tal senso e ti accorgi che se scrivi una funzione alla quale passi valore da manipolare come stringa perché sicuramente hai tutte stringhe e FieldType... poi con un select case formatti la stringa in tipo adeguato...
    La funzione deve restituire un variant in modo da adattarsi al casting forzato dal select case...
  • Re: Proprieta' campi tabella ACCESS in VBA

    Non è chiaro lo scenario, pertanto:
    - descrivi meglio i vari punti con una terminologia più chiara;
    - esplica gli acronimi ("TAB", "F34")
    - specifica cosa intendi di array (string) a due dimensioni all'interno di Access (visto che le matrici sono impiegate prettamente in memoria).
    Presenta anche la sequenza delle operazioni da condurre ed il flusso dei dati da trattare (presentando un esempio) in quanto anche l'immagine non permette di avere una dettagliata visione.
  • Re: Proprieta' campi tabella ACCESS in VBA

    Ciao a tutti. Ciao OsvaldoLaviosa - @Alex - willy55
    Vi ringrazio per i messaggi e mi scuso per la poca chiarezza.
    Dunque, mi spiego meglio... spero... colpa mia per la poca esperienza.
    Sto cercando di implementare un'applicazione in ACCESS al fine di elaborare una serie di dati provenienti sia da file di testo (separatori di dati "tabulazione" - ecco il mio termine "TAB") che da EXCEL.
    Tale procedura di importazione la vorrei implementare io e quindi non vorrei utilizzare i classici strumenti ACCESS per due motivi:
    1) Potrò utilizzare tale procedura anche per altre applicazioni senza preoccuparmi di modificare la routine perchè in "comanderebbero" le definizioni di campi della tabella e non i dati di origine (testo o Excel). Esempio, se il primo campo della tabella è di tipo "NUMERICO" procederei con la trasformazione del dati di provenienza in dato numerico e quindi eseguire l'append dello stesso.
    2) Visto che i dati sono di un'ingente quantità, durante l'importazione avrei intenzione di informare l'utente tramite una "barra di caricamento".
    Vi allego il codice che ho "messo su" per importare i dati da un file TXT con separatore di campo di tipo tabulazione o "TAB" o chr(9)
    ... ps. non trovo la sezione "CODE" ... la incollo qui ... mi scuso ..
    -----------------------------------------------------------------------------------------------------------------------------------------------------------
    Private __________

    Dim NomeFile As String
    Dim LetturaDati As String
    Dim LetturaCampi As String
    Dim NumeroCampi As Integer
    Dim NumeroDati As Integer
    Dim NumeroRec As Double
    Dim CompRecOK As Boolean
    Dim DatiFile() As Variant

    Dim I As Integer

    NomeFile = "Line_Input.txt" 'Nome del file da aprire
    NomeFile = Application.CurrentProject.Path & "\" & NomeFile

    NumeroCampi = 0
    NumeroRec = 0
    CompRecOK = True

    Open NomeFile For Input As #1 'Apre il file.
    Line Input #1, LetturaDati 'Legge il primo record del file BINARIO "INTESTAZIONE DEI DATI"
    NumeroRec = NumeroRec + 1

    For I = 1 To Len(LetturaDati)
    If Mid(LetturaDati, I, 1) = Chr(9) Then
    NumeroCampi = NumeroCampi + 1
    End If
    Next I


    If Asc(Right(LetturaDati, 1)) <> 9 Then
    NumeroCampi = NumeroCampi + 1
    End If

    Do While Not EOF(1) 'Legge tutti i record fino alla fine del file

    Line Input #1, LetturaDati 'Legge il record successivo del file BINARIO
    NumeroRec = NumeroRec + 1

    '----- Legge la composizione dei campi data -----
    NumeroDati = 0
    For I = 1 To Len(LetturaDati)
    If Mid(LetturaDati, I, 1) = Chr(9) Then
    NumeroDati = NumeroDati + 1
    End If
    Next I

    If Asc(Right(LetturaDati, 1)) <> 9 Then
    NumeroDati = NumeroDati + 1
    End If

    'Il totale dei campi data deve essere sempre uguale!
    'Ovvero: NumeroCampi = NumeroDati
    If NumeroCampi <> NumeroDati Then

    CompRecOK = False
    Exit Do

    End If
    '----- Legge la composizione dei campi data -----

    Loop

    'ATTENZIONE!!! Ora si e' alla fine del file. Visto che il file e' stato aperto con l'istruzione
    '"Line Input", ovvero con l'importazione lineare, occorre chiudere il file e riaprirlo per
    'posizionarsi all'inizio del file dati.

    Close #1 'Chiude il file.

    'Se CompRecOK è Vera allora tutti i dati sono "integri" e si può procedere al carico dei dati nell'array
    'Riaprire il file e procedere con la lettura del file BINARIO
    'Prima di procedere all'importazione dei dati occorre sapere se c'è almeno un record oltre l'intestazione
    'e se c'è almeno un campo dati. Il primo record letto è l'intestazione del file dati.
    'Quindi i dati sono "NumeroRec - 1"

    If NumeroRec > 1 And NumeroCampi > 0 Then
    NumeroRec = NumeroRec - 1 'Dati effettivi senza l'intestazione
    Else
    CompRecOK = False 'Solo l'intestazione; quindi senza dati effettivi, oppure senza campi dati
    End If

    If CompRecOK Then
    '-------- Importazione dei dati nell'array ------
    ReDim DatiFile(NumeroRec, NumeroCampi) As Variant
    LetturaCampi = ""
    NumeroCampi = 1
    NumeroRec = 0

    Open NomeFile For Input As #1 'Apre il file.
    Line Input #1, LetturaDati 'Legge il primo record, ovvero l'intestazione

    Do While Not EOF(1) 'Legge tutti i records a partire dal secondo (primo record di dati) fino alla fine del file
    Line Input #1, LetturaDati
    NumeroRec = NumeroRec + 1
    NumeroCampi = 1

    For I = 1 To Len(LetturaDati)

    If Mid(LetturaDati, I, 1) = Chr(9) Then
    DatiFile(NumeroRec, NumeroCampi) = LetturaCampi
    NumeroCampi = NumeroCampi + 1
    LetturaCampi = ""
    Else
    LetturaCampi = LetturaCampi + Mid(LetturaDati, I, 1)

    If I = Len(LetturaDati) Then
    DatiFile(NumeroRec, NumeroCampi) = LetturaCampi
    NumeroCampi = NumeroCampi + 1
    LetturaCampi = ""
    End If

    End If

    Next I

    Loop

    Close #1
    '-------- Importazione dei dati nell'array ------
    End If
    '--------------- importazione dati dall'array alla tabella INZIO -------
    '-------- Lettura della struttura della tabella - INIZIO -------
    '-------- Lettura della struttura della tabella - FINE -------
    '--------------- importazione dati dall'array alla tabella FINE --------

    End Sub
    -----------------------------------------------------------------------------------------------------------------------------------------------------------

    Ciao a tutti
    Piero
  • Re: Proprieta' campi tabella ACCESS in VBA

    Piero1967 ha scritto:


    ... ps. non trovo la sezione "CODE" ... la incollo qui ... mi scuso ..
    Se scendi in basso alla finestra dell'editor dove scrivi il messaggio, trovi il tasto "Editor completa & Anteprima". Cliccaci sopra. Appariranno in alto una serie di tasti. Quindi seleziona tutto il codice, poi clicca sul tasto </> (Codice). Per vedere l'effetto finale puoi cliccare sul tasto in basso Anteprima.
  • Re: Proprieta' campi tabella ACCESS in VBA

    Scusate ....
    
    Private __________
        
        Dim NomeFile As String
        Dim LetturaDati As String
        Dim LetturaCampi As String
        Dim NumeroCampi As Integer
        Dim NumeroDati As Integer
        Dim NumeroRec As Double
        Dim CompRecOK  As Boolean
        Dim DatiFile() As Variant
            
        Dim I As Integer
        
        NomeFile = "Line_Input.txt"     'Nome del file da aprire
        NomeFile = Application.CurrentProject.Path & "\" & NomeFile
        
        NumeroCampi = 0
        NumeroRec = 0
        CompRecOK = True
        
        Open NomeFile For Input As #1   'Apre il file.
        Line Input #1, LetturaDati      'Legge il primo record del file BINARIO "INTESTAZIONE DEI DATI"
        NumeroRec = NumeroRec + 1
        
        For I = 1 To Len(LetturaDati)
            If Mid(LetturaDati, I, 1) = Chr(9) Then
                NumeroCampi = NumeroCampi + 1
            End If
        Next I
        
        
        If Asc(Right(LetturaDati, 1)) <> 9 Then
            NumeroCampi = NumeroCampi + 1
        End If
        
        Do While Not EOF(1)             'Legge tutti i record fino alla fine del file
         
            Line Input #1, LetturaDati  'Legge il record successivo del file BINARIO
            NumeroRec = NumeroRec + 1
         
            '----- Legge la composizione dei campi data -----
            NumeroDati = 0
            For I = 1 To Len(LetturaDati)
                If Mid(LetturaDati, I, 1) = Chr(9) Then
                    NumeroDati = NumeroDati + 1
                End If
            Next I
            
            If Asc(Right(LetturaDati, 1)) <> 9 Then
                NumeroDati = NumeroDati + 1
            End If
            
            'Il totale dei campi data deve essere sempre uguale!
            'Ovvero: NumeroCampi = NumeroDati
            If NumeroCampi <> NumeroDati Then
            
                CompRecOK = False
                Exit Do
                
            End If
            '----- Legge la composizione dei campi data -----
         
        Loop
        
        'ATTENZIONE!!! Ora si e' alla fine del file. Visto che il file e' stato aperto con l'istruzione
        '"Line Input", ovvero con l'importazione lineare, occorre chiudere il file e riaprirlo per
        'posizionarsi all'inizio del file dati.
    
        Close #1        'Chiude il file.
        
        'Se CompRecOK è Vera allora tutti i dati sono "integri" e si può procedere al carico dei dati nell'array
        'Riaprire il file e procedere con la lettura del file BINARIO
        'Prima di procedere all'importazione dei dati occorre sapere se c'è almeno un record oltre l'intestazione
        'e se c'è almeno un campo dati. Il primo record letto è l'intestazione del file dati.
        'Quindi i dati sono "NumeroRec - 1"
        
        If NumeroRec > 1 And NumeroCampi > 0 Then
            NumeroRec = NumeroRec - 1   'Dati effettivi senza l'intestazione
        Else
            CompRecOK = False           'Solo l'intestazione; quindi senza dati effettivi, oppure senza campi dati
        End If
        
        If CompRecOK Then
            '-------- Importazione dei dati nell'array ------
            ReDim DatiFile(NumeroRec, NumeroCampi) As Variant
            LetturaCampi = ""
            NumeroCampi = 1
            NumeroRec = 0
            
            Open NomeFile For Input As #1   'Apre il file.
            Line Input #1, LetturaDati      'Legge il primo record, ovvero l'intestazione
                    
            Do While Not EOF(1)             'Legge tutti i records a partire dal secondo (primo record di dati) fino alla fine del file
                Line Input #1, LetturaDati
                NumeroRec = NumeroRec + 1
                NumeroCampi = 1
                
                For I = 1 To Len(LetturaDati)
                    
                    If Mid(LetturaDati, I, 1) = Chr(9) Then
                        DatiFile(NumeroRec, NumeroCampi) = LetturaCampi
                        NumeroCampi = NumeroCampi + 1
                        LetturaCampi = ""
                    Else
                        LetturaCampi = LetturaCampi + Mid(LetturaDati, I, 1)
                        
                        If I = Len(LetturaDati) Then
                            DatiFile(NumeroRec, NumeroCampi) = LetturaCampi
                            NumeroCampi = NumeroCampi + 1
                            LetturaCampi = ""
                        End If
    
                    End If
                
                Next I
                
            Loop
            
            Close #1
            '-------- Importazione dei dati nell'array ------
    
    
    	'--------------- importazione dati dall'array alla tabella INZIO -------
    
    	'-------- Lettura della struttura della tabella - INIZIO -------
    
    	'-------- Lettura della struttura della tabella - FINE -------
    
    	'--------------- importazione dati dall'array alla tabella FINE --------
    
        End If
    
    End Sub
    
  • Re: Proprieta' campi tabella ACCESS in VBA

    Visto il tuo codice ove procedi con la lettura del file sequenziale e per ciascuna linea analizzi carattere per carattere al fine di individuare quello di separazione fra i campi (nel tuo caso il carattere di tabulazione, ASCII 009 = TAB) valuta che esiste la funzione Split:
    https://support.office.com/it-it/article/funzione-split-876f246a-5144-44fa-889f-10078c7878f5
    https://www.techonthenet.com/access/functions/string/split.php
    http://www.cpearson.com/excel/Split.asp
    https://stackoverflow.com/questions/30346682/getting-full-split-array-into-a-vba-variable
    https://www.access-programmers.co.uk/forums/threads/arrays-and-the-split-function.97750/
  • Re: Proprieta' campi tabella ACCESS in VBA

    Assegnati i valori al vettore (e validati nel tipo e valore) puoi pensare di assegnarli ad una tabella tramite il suo recordset:
    https://stackoverflow.com/questions/34443316/how-to-split-a-string-and-store-in-ms-access-tableer
    http://www.vbforums.com/showthread.php?109169-Converting-Array-to-recordset
    https://www.access-programmers.co.uk/forums/threads/arrays-vs-recordsets.192578/
    https://bytes.com/topic/access/answers/581937-creating-array-recordset
    https://www.tek-tips.com/viewthread.cfm?qid=52818
  • Re: Proprieta' campi tabella ACCESS in VBA

    Ciao a tutti. Ciao willy55, Grazie tantissimo per i suggerimenti per eseguire lo "split" della stringa caricata con Line Input.
    Dico la verità, ho davvero poco tempo e dedicarne un po per questa mia passione, la nostra passione, diventa sempre più difficile.... non demordo!!!
    Ciò che cercavo di spiegare e quindi quale fosse la mia richiesta di aiuto, in realtà non sono riuscito a comunicarvela... ma ho trovato!!
    Abilitando la libreria ADO, posso eseguire il codice:
    
    	....
    	....
    	Dim objRecordset As ADODB.Recordset
    	Dim arrInteger() As Integer
    	....
    	Set objRecordset = New ADODB.Recordset
            objRecordset.ActiveConnection = CurrentProject.Connection
            objRecordset.Open ("TBProva")
            
            ReDim arrInteger(objRecordset.Fields.Count)
            
            For i = 0 To objRecordset.Fields.Count - 1
                arrInteger(i + 1) = objRecordset.Fields.Item(i).Type
            Next i
    
    Dove potrò analizzare i codici contenuti nell'array arrInteger. Essi difatti sono riportati in:


    Esempio: codice 202 corrisponde a un Campo carattere - adVarWChar - Text (Access 2000 (OLEDB))
    Sfruttando quindi questa informazione potrò fare la giusta conversione....
    Ora non mi resta che implementare il codice che farà tutto questo. Quindi oltre alla necessaria e giusta conversione, l'append di tutti i dati contenuti nella mia array alla tabella da popolare.
    Vi ringrazio moltissimo a tutti. Grazie davvero!.... e alla prossima ...
    Buona serata a tutti
    Piero
  • Re: Proprieta' campi tabella ACCESS in VBA

    Per il codice che hai scritto non serve ADO ... anche DAO espone la collection fields allo stesso modo senza dover referenziale ado.
  • Re: Proprieta' campi tabella ACCESS in VBA

    Ciao a tutti. Ciao Alex.
    Ok grazie nuovamente per il suggerimento.
    A questo punto la domanda nasce spontanea... ma visto che esula dal contesto, la porrò eventualmente con un altro post.
    Buona serata a tutti
    Piero
Devi accedere o registrarti per scrivere nel forum
13 risposte