Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Importare da file TXT in Access 97:quale strada intraprendere?

Ciao a tutti,
ho cercato in merito al problema e ho trovato fondamentalmente 2
strade........(il mio txt ha righe non delimitate ma di lunghezza fissa =
160 caratteri ed ogni campo ha lunghezza fissa)
1) apertura del file txt e looping di inserimento in una tabella di access,
dividendo a mano i vari campi
2) usando il comando "connect" ed un file ini di descrizione campi
Premesso che la prima strada la posso percorrere tranquillamente ma non mi
convince molto in termini di prestazioni, secondo voi, come dovrei fare?
Grazie 1000
Alex

 ha scritto nel messaggio
news:Mk6Q7.1855$NB6....@news2.tin.it...

Dunque, premetto che la soluzione 2 non l'ho mai provata per cui non so
darti lumi sulle (maggiori) prestazioni; pero' siccome un vecchio spot
citava che "La potenza e' nulla senza il controllo" ho sempre preferito
maneggiare direttamente i dati che dovevo convertire :-)
Detto questo, la prima soluzione puo' soffrire un calo di performance su
file molto grossi, comunque se sei nell'ordine di grandezza dei
50.000/100.000 records non e' niente di particolarmente lungo (certo dipende
anche dall'hardware e da quanto di frequente deve essere eseguita)
Qualche suggerimento:
non dividere "a mano" i campi, dichiara un tipo strutturato che abbia
l'esatto numero di campi e definiscili tutti come 'String * <lunghezza>'; a
questo punto aprendo il file in modalita' Random puoi caricare ogni singolo
record con una semplice 'Get #', e oltretutto puoi lavorare con variabili
piu' "parlanti".
a seconda della tecnologia che usi per l'accesso ai dati cerca di utilizzare
istruzioni SQL di inserimento oppure i metodi 'UpdateBatch' e simili
piuttosto che i metodi canonici per l'inserimento di record singoli,
eventualmente racchiudi il tutto in una transazione di cui farai il 'Commit'
solo ogni tot record inseriti
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 solo ogni tot record inseriti
di nuovo non ho capito.....scusa ma per me è un mondo (quello
dell'importazione da txt) sconosciuto....-(
Grazie 1000, sei gentilissimo...
a presto
Alex

 dell'importazione da txt) sconosciuto....-(
Non e' tanto relativo al mondo delle importazioni quanto di DB in generale;
per farti un'idea prova a dare un occhiata sulla guida di ADO a
"Metodi BeginTrans, CommitTrans e RollbackTrans"


 Ciao
 Ciao Luca sei stato gentilissimo....grazie!
Alex

 conosco....posso aprirlo in input invece che in random?
[SNIP]
Potresti, ma perdi il vantaggio di avere una struttura dato che non puoi
usare l'istruzione Get in questa modalita', a questo punto dovresti separare
i vari campi a botte di Mid$() ecc...
Usando l'accortezza di definire il campo terminatore come dicevo sopra
sfrutti la modalita' Random in maniera molto semplice


 sfrutti la modalita' Random in maniera molto semplice
ho capito.....ora io riesco ad avere una variabile che si chiama RIGA che ha
la struttura del record in lettura e che contiene i dati.
Ho gia' preparato una tabella di access 97 con i campi gia' pronti per
ricevere il mio record in ingresso uno alla volta.
Ho scritto la seguente stringa SQL "INSERT INTO destinazione  select * from
riga;" e quando la esegue mi dice che Jet non puo' trovare la tabella di
origine....
Dovrei comunque specificare i campi di origine e destinazione anche nella
query?
Oppure l'errore e' strutturale alla query?
Grazie in anticipo, sto capendo molte cose...:-)
Ciao
Alex

 Oppure l'errore e' strutturale alla query?
L'errore e' concettuale.
la sintassi del comando INSERT e' formalmente corretta, ma quello che stai
facendo e' dire :
"inserisci nella tabella destinazione tutti i campi e tutti i record
selezionati dalla *tabella* riga"
riga pero' non e' una tabella del database, e' una variabile del programma!
quindi quello che devi fare e' costruire una query di inserimento che
contenga i valori veri e propri, presi dalla variabile, concatenando i vari
elementi, ovvero:
dim strSQL As String
'"riga" ha la struttura dei messaggi precedenti...
strSQL = "INSERT INTO destinazione VALUES ("
strSQL = strSQL & riga.campo1 & ","
strSQL = strSQL & SQLString(riga.campo2) & ","
strSQL = strSQL & SQLString(riga.campo3) & ","
'[...] altri campi fino all'ultimo che sara'
strSQL = strSQL & riga.campoN & ")"
la stringa risultante sara' simile a
"INSERT INTO destinazione VALUES (100,'NINO','D''ANGELO',9999)"
Gia' che ci siamo nota ancora questo:
- nella istruzione qui sopra, tutti i campi non numerici sono delimitati da
un singolo apice (').
- il terzo valore "D'ANGELO" contiene 2 singoli apici consecutivi.
- durante la costruzione della stringa e' stata usata la funzione SQLString,
che non esiste in VB...cosa e'?
Il concetto e' che nella sintassi SQL tutti i campi *alfanumerici* devono
essere delimitati da un singolo apice, sia in fase di modifica che in fase
di confronto, inoltre nel caso il valore stesso contenga un apice, questo
deve essere raddoppiato per non confondere il parser del comando; ovviamente
i dati verranno poi memorizzati in tabella "puliti", nella loro forma
originale.
Quello che facciamo e' di identificare i campi non numerici (nell'esempio il
secondo e il terzo) e di processarli con una funzione creata da noi, che
tenga conto di quanto detto.
Il nome "SQLString" e' assolutamente arbitrario, ecco come potrebbe essere
l'implementazione:
Public Function SQLString(ByVal strIn As String) As String
'raddoppiamo eventuali apici interni alla stringa e la
'delimitiamo con quelli iniziale e finale
SQLString = "'" & Replace(strIn, "'", "''") & "'"
End Function


 L'errore e' concettuale.
hai ragione.....è vero ;-P
[SNIP]
Avevo anche un problema di creazione tabella.....ho cancellato la tabella e
sono ripartito da capo.
Quando vado ad eseguire tramite command la strSQL mi dice che il numero di
parametri nella query non corrisponde ai campi in tabella....
Nella tabella ho aggiunto un campo contatore che funge da indice......
allego il codice che uso:
 Sub apri_tabella_napoli()
Dim strsql As String
'apre comando
With cmdingresso_napoli
        .ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=c:\progetti vb\elsag\elsag.mdb"
        .CommandText = "SELECT * FROM ingresso_napoli"
        .CommandTimeout = 10
        .CommandType = adCmdText
End With
    'rstingresso_napoli.Open cmdingresso_napoli, , , adLockOptimistic 'apre
il recordset in lettura-scrittura
Open "c:\windows\desktop\pozzo.txt" For Random As #1 Len = Len(riga)
Do While Not EOF(1)                 'Ripete fino alla fine del file.
    Get #1, , riga                  'carica il record
    strsql = "INSERT INTO ingresso_napoli VALUES( ,"
    strsql = strsql & "'" & riga.strpolizza & "'," 'campo 1
    strsql = strsql & "'" & riga.intente & "',"    '2
    strsql = strsql & "'" & riga.intclasse & "',"  '3
    strsql = strsql & "'" & riga.intmatricola & "',"  '4
    strsql = strsql & "'" & riga.strcheck & "',"    '5
    strsql = strsql & "'" & riga.intp_rata & "',"   '6
    strsql = strsql & "'" & Replace(riga.strcognome_nome, "'", "''") & "',"
'7 raddoppia l'apice se c'e'
    strsql = strsql & "'" & riga.strcod_fisc & "',"   '8
    strsql = strsql & "'" & riga.intrate & "',"   '9
    strsql = strsql & "'" & riga.intcarico_ini & "',"   '10
    strsql = strsql & "'" & riga.lngrata_mensile & "',"    '11
    strsql = strsql & "'" & riga.lngsaldo_prec & "',"   '12
    strsql = strsql & "'" & riga.lngres_debito & "',"   '13
    strsql = strsql & "'" & riga.data_carico & "',"   '14
    strsql = strsql & "'" & riga.stridpolprec & "',"   '15
    strsql = strsql & "'" & riga.data_annulla & "',"   '16
    strsql = strsql & "'" & riga.flgflag_vecchio & "',"   '17
    strsql = strsql & "'" & riga.strstato_rateale & "',"   '18
    strsql = strsql & "'" & riga.strramo_polizza & "',"   '19
    strsql = strsql & "'" & riga.strstabilimento & "',"   '20
    strsql = strsql & "'" & riga.strqualifica & "',"   '21
    strsql = strsql & "'" & riga.strcod_rateale & "',"   '22
    strsql = strsql & "'" & riga.int9carattere & "',"   '23
    strsql = strsql & "'" & riga.strlibero & "',"           '24
    strsql = strsql & "'" & riga.datascadenza_calcolata & "',"   '25
    strsql = strsql & "'" & riga.intrate_pagate & "',"   '26
    strsql = strsql & "'" & riga.strultimo & "'"         '27
    strsql = strsql & ")"
    cmdingresso_napoli.ActiveConnection.Execute strsql         'accoda il
record alla Tabella
Close #1                            ' Chiude il file.
End Sub
.....se ho capito invece di utilizzare un oggetto recordset utilizzo un
comando SQL di accodamento...non è cosi?
C'e' pero' quell'errore malefico di accodamento....:-((
Mi sa che dovro' tornare al caro Access in "allega Tabelle"...
Che ne pensi dei driver MS "Text ISAM"?Ho trovato sul Sito Ms un esempio di
importazione txt tramite questi...boh!
Ti ringrazio veramente tanto.....sei molto gentile e preparato!Spero di
poter ricambiare!
Ciao
Alex

 importazione txt tramite questi...boh!
Onestamente non li ho mai usati via codice...


 Dovessi mai migrare su altri sistemi....
Beh io veramente ho dichiarato tutti i campi come stringa....ho sbagliato?
Quello che voglio ottenere è:
 una tabella con i dati in ingresso.....fare delle elaborazioni del tipo:
all'andata il codice nel campo x =3, io genero in uscita un archivio (da
trasformare poi di nuovo in txt) che abbia x=4.
Questo è quello che dovrebbe fare il programma......lo avevo già fatto in
Excel2000 e funzionava perfettamente (oltre tutto excel importa i file txt
in un attimo....il mio nuovo programma mi importa circa 15000righe in 4
minuti...:-(  ), ma non mi piaceva far lavorare tutti quei dati in un foglio
di calcolo....quindi ho pensato di appoggiarmi a VB 6 ed access 97....ma
visto l'inizio non so se campero' abbastanza ...:-)
In piu' il ciclo dice che dovrebbe leggere finchè il file txt e' finito, ma
arrivato all'ultima riga utile, mi cicla di nuovo e la stringa sql si
riempie di quadratini....ovviamente dando errore di inserimento in
tabella.....aaaarggghhhhh!
Beh, sentiti pure libero di mandarmi a quel paese...hai già fatto tantissimo
per me....
Ciao
Alex

per me....
Nessun problema, magari se hai qualche altro dubbio mandami direttamente una
mail, cosi' non appesantiamo troppo il NG
