Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
App. Visual Studio 6.0
Routine ricerca dati
martedì 13 maggio 2008 - 21.49
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
Meryotta
Profilo
| Newbie
31
messaggi | Data Invio:
mar 13 mag 2008 - 21:49
Salve, avrei un quesito da porre!
Ho un database MDB con circa 2000 o più record che corrispondono ad articoli di magazzino (descrizione, costo, codice a barre etc.....). Ogni mese circa, mi arriva un file in formato txt, con all'interno tutti i dati degli articoli ordinati in quel mese e che quindi devono essere aggiunti a quelli già presenti nel database, e fin qui tutto bene....
Se l'articolo è già presente nel mio mdb devo solo modificarne alcuni campi, per es. aggiungere la quantità acquistata a quella già esistente.
Siccome il database è di ampie dimensioni, fare per ogni riga del file txt una ricerca nell'mdb attraverso un "do while" richiede un sacco di tempo, perchè ogni volta leggo tutto l'archivio (2000 record!!!!!!), come posso ricercare più velocemente l'esistenza o meno di un articolo nell'mdb?
Notizie aggiuntive: il database mdb l'ho indicizzato per codice a barre (forse vi è utile sapere ciò). Mentre il file txt (che comprende più ordini) è ordinato per numero d'ordine e all'interno di un singolo ordine per codice a barre.
Grazie in anticipo per la risposta!!
angelotv
Profilo
| Guru
1.010
messaggi | Data Invio:
mar 13 mag 2008 - 22:35
magari con delle chiavi alternative...
by Angelo
Meryotta
Profilo
| Newbie
31
messaggi | Data Invio:
mar 13 mag 2008 - 23:32
Cioè? Cosa intendi per "chiavi alternative"?
angelotv
Profilo
| Guru
1.010
messaggi | Data Invio:
mer 14 mag 2008 - 22:41
in access puoi avere delle chiavi secondarie e quindi ordinare una tabella per i campi che la compongono: in excel basta fare fare "Dati" poi "Ordina" e ordinare il foglio per i campi che interessano.
by Angelo
Dainesi
Profilo
| Senior Member
476
messaggi | Data Invio:
gio 15 mag 2008 - 11:06
Punto primo: hai inserito degli indici o delle chiavi primarie nella tua tabella di Access ? Se no, fallo subito e concentrati sui campi che utilizzi per la ricerca (es. il codice dell'articolo).
Punto secondo: devi creare una routine che legge il file txt (che spero sia a campi delimitati o a luinghezza fissa ...).
Quindi hai due alternative:
- Importi i dati del file txt in una tabella temporanea che a fine aggiornamento eliminerai
- Analizzi in linea il file txt ed aggiorni in tempo reale
Ti consiglio il primo metodo in quanto se per una qualche ragione il processo dovesse venire interrotto puoi ripartire da dove eri arrivato (sempre chè ad ogni aggiornamento resetti il record della tabella temporanea).
Se usi la tabella temporanea ricordati di compattare (in automatico via programma) il db per recuperare lo spazio richiesto dalla tabella temporanea.
Buon lavoro!
Meryotta
Profilo
| Newbie
31
messaggi | Data Invio:
ven 16 mag 2008 - 11:08
Scusate se non ho risposto subito ma solo oggi sono riuscita a collegarmi.
Nella tabella mdb ho solo una chiave primaria sul codice a barre
Il file txt è delimitato
Il mio problema è cercare il metodo più VELOCE per aggiornare il campo qta esistente o aggiungere il record se ho un articolo nuovo (mai acquistato prima) nella tabella mdb.
Una volta creata una tabella temporanea in cui metto tutto il file txt io farei così:
-un ciclo do while sulla tabella temporanea
- prenderei il campo per il confronto
- con una funzione di ricerca farei un altro do while sulla TABELLA ORIGINARIA (dove devo aggiornare i dati) partendo sempre dal PRIMO record
- se trovo il record aggiorno la tabella originaria
- se non trovo il record aggiungo l'articolo alla tabella originaria.
Domanda: Questo è un metodo veloce o ci sono dei metodi più veloci?
Grazie per la pazienza!!!!
Dainesi
Profilo
| Senior Member
476
messaggi | Data Invio:
mer 21 mag 2008 - 20:58
>Scusate se non ho risposto subito ma solo oggi sono riuscita
>a collegarmi.
>
>Nella tabella mdb ho solo una chiave primaria sul codice a barre
>
>Il file txt è delimitato
>
>Il mio problema è cercare il metodo più VELOCE per aggiornare
>il campo qta esistente o aggiungere il record se ho un articolo
>nuovo (mai acquistato prima) nella tabella mdb.
>
>
>Una volta creata una tabella temporanea in cui metto tutto il
>file txt io farei così:
>
>-un ciclo do while sulla tabella temporanea
>- prenderei il campo per il confronto
>- con una funzione di ricerca farei un altro do while sulla TABELLA
>ORIGINARIA (dove devo aggiornare i dati) partendo sempre dal
>PRIMO record
>- se trovo il record aggiorno la tabella originaria
>- se non trovo il record aggiungo l'articolo alla tabella originaria.
>
>Domanda: Questo è un metodo veloce o ci sono dei metodi più veloci?
>
>Grazie per la pazienza!!!!
>
>
>
>
>
Va bene l'iterazione sulla tabella temporanea mentre non va affatto bene il do while su quella di ricerca !!! Lì devi ricreare un Recordset passandogli una SELECT parametrica con chiave di ricerca il campo indicizzato. Se il recordset è vuoto (BOF e EOF sono True) aggiungo un nuovo record mentre in caso contrario eseguo un Update.
Ciao !
Meryotta
Profilo
| Newbie
31
messaggi | Data Invio:
ven 23 mag 2008 - 09:28
Lì devi ricreare un Recordset passandogli una SELECT parametrica con chiave di ricerca il campo indicizzato. Se il recordset è vuoto (BOF e EOF sono True) aggiungo un nuovo record mentre in caso contrario eseguo un Update.
Scusa ma non mi è molto chiaro "Lì devi ricreare un Recordset passandogli una SELECT parametrica con chiave di ricerca il campo indicizzato" saresti così gentile da fami un esempio?
Cosa è una SELECT parametrica con chiave di ricerca?
Grazie Ciao
ridaria
Profilo
| Expert
905
messaggi | Data Invio:
ven 23 mag 2008 - 11:50
Select * from tabella where nomeCampo = 'valoreDacercare'
oppure select nomeCAmpo from tabella where nomeCampo = 'valoreDacercare'
If recordset.eof = False then
il valore esistenella Tabella
else
il valore NON esiste nella tabella
end if
'Esiste un altro metodo che puoi usare dopo aver aperto la sola tabella, ed è il metodo find dell'oggetto recordset di ado.
Ciao Riccardo
Ridaria
Dainesi
Profilo
| Senior Member
476
messaggi | Data Invio:
ven 23 mag 2008 - 12:43
>
>Lì devi ricreare un Recordset passandogli una SELECT parametrica
>con chiave di ricerca il campo indicizzato. Se il recordset è
>vuoto (BOF e EOF sono True) aggiungo un nuovo record mentre in
>caso contrario eseguo un Update.
>
>Scusa ma non mi è molto chiaro "Lì devi ricreare un Recordset
>passandogli una SELECT parametrica con chiave di ricerca il campo
>indicizzato" saresti così gentile da fami un esempio?
>Cosa è una SELECT parametrica con chiave di ricerca?
>Grazie Ciao
>
Poniamo il caso di usare ADO (poi ti faccio l'esempio con DAO)
Dim con as New ADODB.Connection
Dim rc as New ADODB.Recordset
Dim fTXT as Integer
Dim rec as String
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & LocalDbPath & ";Jet OLEDB:Database Password=" & P & ";"
Set con= New ADODB.Connection
Con.CursorLocation = adUseServer
Con.ConnectionString = strConn
Con.Open
fTXT = FreeFile
Open "C:\FileToImport.txt" For Input As #fTXT
With rc
.ActiveConnection = Con 'Con è una variabile che rappresenta la connessione al tuo DB
.CursorType =
End With
Do Until EOF(fTXT)
Line Input #fTXT, rec
lngCodice = Clng(Mid(rec,start,lenght)) 'Rec è una variabile stringa che contiene la riga, start è il punto di inizio di dove è collocata la variabile cercata nel caso di campi a posizione fissa)
strSQL = "SELECT * FROM [TABELLA DA MODIFICARE] WHERE CodiceBARRE =" & lngCodice 'lngCodice è una variabile che rappresenta il codice che hai ricavato dall'esame della riga del file txt
With rc
.ActiveConnection = con
.CursorLocation = adUseServer
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.Source = strSQL
.Open
If .EOF or .BOF then
.AddNew
'Aggiungi un record nuovo ...
.Update
Else
'Modifichi i campi che devi modificare
'....
.Update
End If
.Close
End With
Loop
Con.Close
Close fTXT
Set rc = Nothing
Set Con = Nothing
Nel caso tu preferisca utilizzare DAO ...
Dim con as DAO.Database
Dim rc as New DAO.Recordset
Dim fTXT as Integer
Dim rec as String
Set con= DBEngine.OpenDatabase(DbPath, False, False)
fTXT = FreeFile
Open "C:\FileToImport.txt" For Input As #fTXT
Do Until EOF(fTXT)
Line Input #fTXT, rec
lngCodice = Clng(Mid(rec,start,lenght)) 'Rec è una variabile stringa che contiene la riga, start è il punto di inizio di dove è collocata la variabile cercata nel caso di campi a posizione fissa)
strSQL = "SELECT * FROM [TABELLA DA MODIFICARE] WHERE CodiceBARRE =" & lngCodice 'lngCodice è una variabile che rappresenta il codice che hai ricavato dall'esame della riga del file txt
Set Rc = con.OpenRecordset(strSQL, dbOpenDynaset)
With Rc
If .EOF or .BOF then
.AddNew
'Aggiungi un record nuovo ...
.Update
Else
'Modifichi i campi che devi modificare
.Edit
'....
.Update
End If
.Close
End With
Loop
Con.Close
Close fTXT
Set rc = Nothing
Set Con = Nothing
Meryotta
Profilo
| Newbie
31
messaggi | Data Invio:
ven 6 giu 2008 - 10:49
grazie infinite funziona alla perfezione!!!!!
Dainesi
Profilo
| Senior Member
476
messaggi | Data Invio:
ven 6 giu 2008 - 12:08
E' sempre un piacere vedere qualcuno contento grazie ai tuoi consigli.
Torna su
Stanze Forum
Elenco Threads
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?
Dopo esserti registrato potrai chiedere
aiuto sul nostro
Forum
oppure aiutare gli altri
Consulta le
Stanze
disponibili.
Registrati ora !