Newsgroup: it.comp.appl.access
Titolo: File di Testo in access

Salve a tutti,
mi hanno chiesto di elaborare alcuni file di testo con access con
tabulazione fissa. Non ci sarebbero particolari problemi se il file
fosse uno e con un nome specifico, perchè protrei collegare il file
stesso come tabella esterna; ma il problema è che questi file, generati
da un'altro programma, sono molti ed hanno nomi attribuiti in modo
soggettivo, tipo miononno.acp. Si oltre a tutto questo i file hanno
estensione .ACP.
Il mio problema quindi è di poter importare i file sopra descritti
(miononno1.acp - miononno2.acp - miononno3.acp), da una directory ben
precisa e inserirli in una tabella da poter elaborare a mio piacimento.
Vi ringrazio di aver letto questo messaggio e se avete qualche
suggerimeto Vi ringrazio ancora di più
Ciao

 ha scritto nel messaggio
news:390FED3F...@pippo.it...

Mi mancano delle informazioni, puoi specificare se:
- i file acp hanno tutti la stessa struttura dei dati;
- se la tabella che contiene i dati deve essere vuotata prima o i dati
devono essere accodati.
Altrimenti puoi vedere l'help alla voce TransferText...
Ciao.

Grazie Sergio per la tua Raply,
La struttura dei dati è fatta così:
 98           TAVERNOLA      2320          48           5
 98           VIGOLO         672           65           5
 98           AGNOSINE       1757          41           5
 98           AZZANO MEL     1537          82           5
 98           BAGNOLO ME     10863         82           5
 98           BARBARIGA      1978          79           5
 98           BARGHE         1079          57           5
 98           BEDIZZOLE      8368          84           5
Mi correggo sul formato che pensavo fosse con tabulazione invece è larghezza
fissa, ma credo che non cambi nulla.
Si tutti hanno la stessa struttura.
La tabella dovrebbe essere svuotata, ed i dati dei file di testo accodati.
Andrò comunque a vedere nell'help (TransferText). Se hai modo di indirizzarmi
al meglio non esitare a rispondere.
Grazie mille ancora



Vabbč spazio o tabulazioni poco importa, la cosa essenziale č il contenuto
(dati), se li trovi sempre allo stesso punto per ogni file non č difficile
perché:
- importi un file acp e salvi la specifica di importazione (es. Importa File
ACP);
- da codice VBA:
    DoCmd.RunSQL "delete * from TuaTabellaContenitore"
    DoCmd.TransferText acImportFixed, "nome della specifica di
importazione", "TuaTabellaContenitore", "TuoFile.ACP"
Fammi sapere...
Ciao.

 (dati), se li trovi sempre allo stesso punto per ogni file non è difficile



Il codice VBA non è un problema, il problema è impostare i passaggi:
Primo: devi memorizzare le specifiche di importazione dei file (per maggiori
informazioni vedi l'help). Come si fa?
File - Carica dati esterni - importa - tipo file: file di testo; segui il
wizard passo per passo, prima di terminare la procedura premi il taso
avanzate e salva le specifiche con un nome che dovrai ricordare (es.
importaACP); alla fine hai costruito la tabella che svuoterai e riempirai
con i dati dei file acp.
Secondo: scelta del nome del file acp da importare, svuotare la tabella e
riempirla. Come si fa? Avrai inserito si una maschera un bottone [IMPORTA
ACP] che ti eseguirà il codice necessario a terminare la procedura; bene ora
in struttura della maschera entra nelle proprietà del bottone scegliendo la
scheda Dati e l'evento "su clic", premi il bottone con tre punti (generatore
di espressione) e scegli "generatore di codice"; più o meno sei in questa
situazione:
Private Sub Comando5_Click()
End Sub
Tra "Private" e "End Sub" scrivi:
Dim fileAcp As String, directory As String, checkErr
checkErr = False
directory = "c:\doveVuoiTu\"
fileAcp = InputBox("Inserire il nome del file ACP da importare", "Importa
ACP", "NomeTabella")
Rem verifica errori
Rem verifica se è stato inserita l'estensione
If InStr(1, fileAcp, ".acp") = 0 Then
    fileAcp = fileAcp & ".acp"
End If
Rem verifica se la variabile è vuota
If IsEmpty(fileAcp) Then
    checkErr = True
Else
    MsgBox "Inserire il nome della tabella. Dati non importati.", vbOKOnly,
"Errore"
End If
Rem verifica se esiste il file
If Dir(directory & fileAcp) = "" Then
    cherckErr = True
Else
    MsgBox "I file " & directory & fileAcp & " non esiste. Dati non
importati.", vbOKOnly, "Errore"
End If
Rem se non ci sono errori importiamo i dati
If Not checkErr Then
Rem vuoto la tabella
    DoCmd.RunSQL "DELETE * FROM NomeTabella;"
Rem importo i dati
    DoCmd.TransferText acImportFixed, "nomeSpecifica", "nomeTabella",
directory & fileAcp
    MsgBox "Il file " & percorso & fileAcp & " è stato importato.",
vbOKOnly, "Importazione file acp"
End If
Scritto tutto? Congratulazioni! Hai scritto la tua prima subroutine... Ora
incrocia le dita, chiudi tutto (salvando) e se non mi sono dimenticato nulla
e hai scritto tutto bene dovrebbe funzionare...
Ciao.
P.S. Devo chiudere, domani mi ricollego; se hai altri problemi invia i
quesiti all'NG e vedrai che si risolveranno.



Mitico,

buona parte della routine è stata eseguita, ma la parte dell'importazione
mi da un'errore. La parte indicata con gli ***** mi da errore ma non ho
capito perchè. Chiaramente io ora ho importato un file con nome
"Maddalena_Francesco.acp", ma credo si possa mettere "*.acp".

Comunque un passo alla volta altrimenti inciampo. Il codice che mi
hai mandato lo modificato così:





Private Sub Comando13_Click()

Dim fileAcp As String, directory As String, checkErr

checkErr = False

directory = "C:\act\Progetti\IMP_RETE1\"

fileAcp = InputBox("Maddalena_Francesco.acp", "ImportaACP", "Prova")

Rem verifica errori

Rem verifica se è stato inserita l'estensione

If InStr(1, fileAcp, ".acp") = 0 Then

    fileAcp = fileAcp & ".acp"

End If

Rem verifica se la variabile è vuota

If IsEmpty(fileAcp) Then

    checkErr = True

Else

    MsgBox "Inserire il nome della tabella. Dati non
importati.", vbOKOnly, "Errore"

End If

Rem verifica se esiste il file

If Dir(directory & fileAcp) = "" Then

    checkErr = True

Else

    MsgBox "I file " & directory & fileAcp &
" non esiste. Dati non importati", vbOKOnly, "Errore"

End If

Rem se non ci sono errori importiamo i dati

If Not checkErr Then

Rem vuoto la tabella

    DoCmd.RunSQL "DELETE * FROM Prova;"

Rem importo i dati

*****    DoCmd.TransferText acImportFixed, "nomeSpecifica",
"Prova", directory & fileAcpMsgBox "Maddalena_Francesco.acp" &
percorso & fileAcp & "è stato importato.", vbOKOnly , "Importazione
file acp"*****

End If

End Sub





Non capisco il problema alla riga ****. Forse tu sai dirmi dove sbaglio.

Ciao



Per favore non inviare messaggi in HTML!
Tra fileAcp e Msgbox c'è un invio (return)...
Ciao.

 End If
... Omissis...
Ciao,
solo una precisazione:
devi solo invertire la verifica della variabile vuota con la verifica
dell'inserimento dell'estensione.
Infatti, mi sembra che attualmente, se non viene inserito il nomefile,
controllando l'esistenza dell'estensione non la trovi e che la aggiunga; di
conseguenza la variabile fileAcp non sarà vuota e il controllo
sull'esistenza del nome del file fallisce.
Scusate l'intromissione.
Silvio

 ha scritto nel messaggio
news:8erl4k$ec5$1...@fe1.cs.interbusiness.it...

Mea culpa!

Scusa per il messaggio in HTML.
Ho fatto ciò che hai indicato ed ora gira, chiaramente non funziona
ancora.
Lanciando la routine mi appere un Box in cui mi indica che Impora un
file Acp sotto il nome della mia tabella "Prova". Facendo OK mi dice
Inserire il nome della tabella. Dati non disponibili.
Ho individuato il punto in cui da questo errore ma il percorso è giusto
ed il file non è vuoto.
---------------
Private Sub Comando13_Click()
Dim fileAcp As String, directory As String, checkErr
checkErr = False
directory = "C:\act\Progetti\IMP_RETE1\"
fileAcp = InputBox("*.acp", "Importa File ACP", "Prova")
Rem verifica errori
Rem verifica se è stato inserita l'estensione
If InStr(1, fileAcp, ".acp") = 0 Then
    fileAcp = fileAcp & ".acp"
End If
Rem verifica se la variabile è vuota
If IsEmpty(fileAcp) Then
    checkErr = True
Else
    MsgBox "Inserire il nome della tabella. Dati non importati.",
vbOKOnly, "Errore"
End If
Rem verifica se esiste il file
If Dir(directory & fileAcp) = "" Then
    checkErr = True
Else
    MsgBox "I file " & directory & fileAcp & " non esiste. Dati non
importati", vbOKOnly, "Errore"
End If
Rem se non ci sono errori importiamo i dati
If Not checkErr Then
Rem vuoto la tabella
    DoCmd.RunSQL "DELETE * FROM Prova;"
Rem importo i dati
    DoCmd.TransferText acImportFixed, "nomeSpecifica", "Prova",
directory & fileAcp
    MsgBox "*.acp" & directory & fileAcp & "è stato importato.",
vbOKOnly, "Importazione file acp"
End If
End Sub
------------------
Come vedrai io ho messo *.acp perchè come indicato nei post precedenti i
file potrebbero essere più di uno e mergiati tutti nella tabella
"Prova".
Ciao



La stringa "Prova" è il default dell'inputbox() (vedi l'help) per evitare
che l'utente non inserisca nulla; chiaramente non è un controllo dell'input
"magistrale", ma almeno è un inizio. Considera anche il messaggio di Silvio
che faceva notare anche un'altra pecca; che se l'utente non inserisce nulla
(variabile fileAcp vuota) ti ritrovi la variabile che contiene solo .acp,
che chiaramente non è... Cacchio! Aspetta ho riletto la routine e ci sono
altre cacchiate.
Così dovrebbe andare.
Private Sub Comando13_Click()
Dim fileAcp As String, directory As String
directory = "C:\act\Progetti\IMP_RETE1\"
fileAcp = InputBox("*.acp", "Importa File ACP", "Prova.acp")
Rem verifica errori
Rem verifica se la variabile è vuota
If IsEmpty(fileAcp) Then
    MsgBox "Inserire il nome della tabella. Dati non importati.",vbOKOnly,
"Errore"
    exit sub
End If
Rem verifica se è stato inserita l'estensione
If InStr(1, fileAcp, ".acp") = 0 Then
    fileAcp = fileAcp & ".acp"
End If
Rem verifica se esiste il file
If Dir(directory & fileAcp) = "" Then
    MsgBox "I file " & directory & fileAcp & " non esiste. Dati
nonimportati", vbOKOnly, "Errore"
    exit sub
End If
Rem se non ci sono errori importiamo i dati
Rem vuoto la tabella
DoCmd.RunSQL "DELETE * FROM Prova;"
Rem importo i dati
DoCmd.TransferText acImportFixed, "nomeSpecifica", "Prova",directory &
fileAcp
MsgBox "*.acp" & directory & fileAcp & "è stato importato.",vbOKOnly,
"Importazione file acp"
End Sub
Note:
- come dicevo prima, l'istruzione inputbox() ha tre parametri (i più
utilizzati) che sono:
    InputBox(prompt[, title] [, default])
    prompt = al suo posto inserisci una stringa da visualizzare come
messaggio all'utente;
    title = stringa che rappresenta il titolo della finestra;
    default = valore di default (appunto) che viene inserito automaticamente
nel campo proprio per evitare che premendo invio accidentalmente, la
variabile sia vuota.
- idem con patate per msgbox (vedi l'help).
In pratica con questa routine dovrai premere il bottone di importazione
dati, per ogni file acp. Avevo un sentore del fatto che volevi tutti i file
importati in un colpo solo quindi a routine sarà:
Private Sub Comando13_Click()
Dim fileAcpDaTrovare As String, directory As String
directory = "C:\act\Progetti\IMP_RETE1\"
fileAcpDaTrovare = directory & "*.acp"
If Dir(fileAcpDaTrovare) = "" Then
    MsgBox "file .acp non trovati"
    Exit Sub
End If
fileAcpTrovati = Dir(fileAcpDaTrovare)
Rem vuoto la tabella
DoCmd.RunSQL "DELETE * FROM Prova;"
Rem importo ogni file acp
Do While fileAcpTrovati <> ""
    If fileAcpTrovati <> "" Then
Rem importo i dati
        DoCmd.TransferText acImportFixed, "nomeSpecifica", "Prova",
fileAcpTrovati
    End If
    fileAcpTrovati = Dir
Loop
End Sub
AriNote: devi sostituire la stringa "nomeSpecifica" con il nome della
specifica di importazione che hai salvato;
               devi sostituire la stringa "Prova" con il nome della tabella
che hai creato e che conterrà i dati dei file acp.
Ciao.




 Ciao.

 Ciao.


Non sei ruscito ad inviare il file perché (se non ricordo male) non sono
permessi gli attachment; neanche se gli metti come oggetto I LOVE YOU... Con
me non attacca! Ho preso i voti...
Per quanto riguarda la pubblicazione sul sito comune; non credo che una
routine così possa interessare. Chi eventualmente è interessato o ha già
fatto copia/incolla o ha preso spunto per adattarla alle sue esigenze, ed è
proprio questo lo scopo (almeno spero) di inviarlo pubblicamente sull'NG e
non privatamente con l'e-mail.
Un consiglio; abbandona l'idea di utilizzare nomi per tabelle o campi tipo:
Prova, tabella1 o campo1 2 etc... Non sono descrittivi e alla fine non ti ci
raccapezzi più! Piuttosto ingegnati a studiare il codice che trovi sull'NG
anche guardando l'help; non è la via migliore, però è un inizio, il
successivo sono i libri...
Mi faccio vivo fra poco.
Ciao.

 *.miononno, ecc ecc.
Fai attenzione piuttosto ad una cosa: se usi A2000 o A97 aggiornato al
Microsoft Jet Service Pack 3, la libreria MSTEXT35.DLL funziona
diversamente.
L'importazione e l'esportazione su file di testo funzionano solo se il file
ha un'estensione tra: txt , csv, tab, asc, htm, html.
Per intenderci, se nel programma si esegue l'istruzione:
DoCmd.TransferText acExportDelim, "MySpec", "MyTbl", "PIPPO.FIL"
il messaggio di errore che si riceve è:
"Can't Update. Database is read-only. "
L'istruzione va cambiata in:
DoCmd.TransferText acExportDelim, "MySpec", "MyTbl", "PIPPO.TXT"
L'articolo della KB Microsoft che descrive il problema (secondo loro è una
miglioria) è:
Article ID: Q239105 Jet 3.5 Text ISAM Allows Users to Append Lines to System
Files
--
Ciao, AntoGal
*************************************************
Gestione punti vendita (casse e pos NCR)
 
www.powerretail.it
-------------------------------------------------------------
per scaricare un gioco di DAMA ITALIANA
http://volftp.mondadori.com/italiani/galletta/
*************************************************

 Ciao.

 Ciao.


Mettiti comodo che inizio...
ho inserito nella maschera:
1 casella di testo nominata [directory];
  1.1 proprietà - scheda "dati" - "valore predefinito":
="C:\act\Progetti\IMP_RETE1\";
  1.2 proprietà - scheda "evento" - "su disattivato":
------ inizio routine da inserire --------------
Private Sub directory_LostFocus()
Dim fileAcpTrovati As String, fileAcpDaTrovare As String, ritorno As String,
noFile As Boolean
fileAcpDaTrovare = Me.directory & "*.acp"
ritorno = ""
Rem aggiunge lo slash finale
If Right(Me.directory, 1) <> "\" Then
    Me.directory = Me.directory & "\"
End If
Rem controlla se ci sono file acp
If Dir(fileAcpDaTrovare) = "" Then
    Me.elencoFileAcp.RowSource = "(Nessun file trovato)"
    Me.bttnImporta.Enabled = False
    GoTo exit_directory_LostFocus
End If
Me.elencoFileAcp.RowSource = ""
Rem primo file
Me.bttnImporta.Enabled = True
fileAcpTrovati = Dir(fileAcpDaTrovare)
Rem leggo i file acp
Do While fileAcpTrovati <> ""
    If fileAcpTrovati <> "" Then
        ritorno = ritorno & IIf(ritorno = "", fileAcpTrovati, ";" &
fileAcpTrovati)
    End If
    fileAcpTrovati = Dir
Loop
Me.elencoFileAcp.RowSource = ritorno
exit_directory_LostFocus:
End Sub
------ fine routine da inserire --------------
2 casella combinata nominata [elencoFileAcp];
    2.1 propietà scheda "formato" - numero colonne 1;
    2.2 scheda "dati" - "tipo origine riga" - elenco valori"
    2.3 "origine riga" - (stringa) "(elenco vuoto)"
3 bottone nominato [bttnImporta];
    3.1 proprietà scheda "dati" - "abilitato" No;
    3.2 evento "su clic"
------ inizio routine da inserire --------------
Private Sub bttnImporta_Click()
On Error GoTo bttnImporta_Click_err
If Me.elencoFileAcp = "(selezionare un file)" Then
    MsgBox "Selezionare un file dall'elenco", vbOKOnly, "Importa file ACP"
    GoTo bttnImporta_click_exit
End If
DoCmd.SetWarnings False
Rem vuoto la tabella
DoCmd.RunSQL "DELETE Prova.* FROM Prova;"
Rem importo i dati
DoCmd.TransferText acImportFixed, "Prova", "Prova", Me.directory &
Me.elencoFileAcp
DoCmd.SetWarnings True
MsgBox "File: " & Me.elencoFileAcp & ", importato!"
bttnImporta_click_exit:
    Exit Sub
bttnImporta_Click_err:
    MsgBox Err.Description & ", " & Err.Number
End Sub
------ fine routine da inserire --------------
Ricapitolando; una casella di testo [directory]; una casella combinata
[elencoFileAcp] ed un bottone [bttnImporta]. Gli eventi controllati sono:
- per la casella di testo "lostfocus", quando si esce dalla casella
controlla se ci sono file .acp nella directory che hai indicato. Se esistono
li inserisce nella casella combinata e abilita il bottone;
- per il bottone (ovviamente) è "click", che controlla se hai selezionato un
nome di file dall'elenco (non la prima voce), vuota la tabella e importa i
dati.
Auguri!

 Rem importo i dati



Lo stavo per scrivere ma pensavo di essere stato chiaro; il messaggio di
errore è riferito al nome della specifica che hai salvato (perché tu l'hai
salvata, vero!!???) quando hai importato e creato la tabella chiamata Prova.
Puoi farne quello che vuoi della routine, è sicuramente migliorabile. A te
l'ardito compito. Ricordati che la casella combinata restituisce un solo
nome di file, mentre la casella di riepilogo con abilitata la selezione
multipla ne restituisce più di uno; e il docmd.transfertext, nel bottone
[bttnImporta], ha come parametro un solo nome di file; quindi dovresti
crearti un ciclo che cicla (spiritoso!) per quanti nomi hai selezionato
nella casella di riepilogo...
Ciao.

 ha scritto nel messaggio



Sono padre!!!

 ha scritto nel messaggio



La subroutine del bottone [bttnImporta] la devi sostituire con:
Private Sub bttnImporta_Click()
On Error GoTo bttnImporta_Click_err
Dim fAcp
If Me.elencoFileacp.ItemsSelected.Count > 0 Then
    For Each fAcp In Me.elencoFileacp.ItemsSelected
        DoCmd.SetWarnings False
        Rem vuoto la tabella
        DoCmd.RunSQL "DELETE Prova.* FROM Prova;"
        Rem importo i dati
        DoCmd.TransferText acImportFixed, "Prova", "Prova", Me.directory2 &
Me.elencoFileacp.ItemData(fAcp)
        DoCmd.SetWarnings True
        MsgBox "File: " & Me.elencoFileacp.ItemData(fAcp) & ", importato!"
    Next
    DoCmd.SetWarnings True
Else
    MsgBox "Selezionare un file dall'elenco", vbOKOnly, "Importa file ACP"
    GoTo bttnImporta_click_exit
End If
bttnImporta_click_exit:
    Exit Sub
bttnImporta_Click_err:
    DoCmd.SetWarnings True
    MsgBox Err.Description & ", " & Err.Number
End Sub
In pratica era quello che ti dicevo; la casella di riepilogo la devi
impostare con la selezione multipla - scheda altro - "selezione multipla -
semplice; poi devi leggere quanti nomi di file hai selezionato dalla lista
(Me.elencoFileacp.ItemsSelected) e avrai il nome del file
(Me.elencoFileacp.ItemData(fAcp), dove fAcp è l'indice della lista)...
Ciao.


E' solo una curiosità, ma l'estensione acp è inventata o viene da
un'applicazione? Perché sul mio pc è riconosciuta nel registry come file di
tipo Office.ActorPreview. Se è inventata ti consiglio di cambiarla con
un'altra meno "particolare"...
Ciao.

 ha scritto nel messaggio


         Rem importo i dati



Non è in dubbio l'utilità dei dati (ci mancherebbe altro); ma la "stranezza"
di trovare associata l'estenzione acp ad un programma già esistente. La cosa
importante è che non provochi problemi alle tue applicazioni...
Buon lavoro.


A questo punto hai tre versioni di una subroutine; l'ultima ti fa vedere
tutti i file acp in una directory, selezionare quelli che vuoi ed
importarli. Non te li accoda perché probabilmente ho interpretato male le
tue istruzioni quando mi dicevi che la tabella doveva prima essere vuotata;
io intendevo prima di ogni importazione, tu indendevi prima di importare
tutti i file in un solo colpo. Non è grave, se hai tempo potresti facilmente
individuare la soluzione del "problema", anche perché ho inserito dei
commenti (rem) nel codice.
Questa è la modifica per il bottone [bttnImporta] che importa tutto in un
colpo:
Private Sub bttnImporta_Click()
On Error GoTo bttnImporta_Click_err
Dim fAcp
DoCmd.SetWarnings False
Rem vuoto la tabella
DoCmd.RunSQL "DELETE Prova.* FROM Prova;"
If Me.elencoFileacp.ItemsSelected.Count > 0 Then
    For Each fAcp In Me.elencoFileacp.ItemsSelected
        Rem importo i dati
        DoCmd.TransferText acImportFixed, "Prova", "Prova", Me.directory &
Me.elencoFileacp.ItemData(fAcp)
    Next
    DoCmd.SetWarnings True
Else
    MsgBox "Selezionare un file dall'elenco", vbOKOnly, "Importa file ACP"
    GoTo bttnImporta_click_exit
End If
bttnImporta_click_exit:
    Exit Sub
bttnImporta_Click_err:
    DoCmd.SetWarnings True
    MsgBox Err.Description & ", " & Err.Number
End Sub
Ricordati di impostare la proprietà della casella di riepilogo: scheda
"altro" - "selezione multipla"  - "selezione semplice"...
Ciao.





1) Il campo contatore (che non serve per contare) è azzerabile se vuoti la
tabella e compatti l'mdb; ma a cosa ti serve un campo contatore ovvero, sei
sicuro che ti serva in campo contatore?
2) ti ho inviato la soluzione un attimo dopo della tua domanda.
Ciao.

 Ciao.


Lo ignora perché non c'è più! Se ti serve reinseriscilo nel punto che
ritieni adatto. Per il problema dell'id ti ho risposto vedi il messaggio di
oggi 10.5.2000 delle 11:13..
Ciao.

 Lo ignora perché non c'č piů! Se ti serve reinseriscilo nel punto che



Anch'io creo ogni tabella con id (contatore univoco) e id_data (data
estesa - e default now()), anche se in alcuni casi potrebbe non servire; ma
io mi riferivo al fatto di non utilizzare l'id contatore per contare i
record, non è comodo...
Ciao.