Routine ricerca dati

martedì 13 maggio 2008 - 21.49

Meryotta Profilo | Newbie

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

magari con delle chiavi alternative...
by Angelo

Meryotta Profilo | Newbie

Cioè? Cosa intendi per "chiavi alternative"?

angelotv Profilo | Guru

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

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

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

>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


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

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

>
>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

grazie infinite funziona alla perfezione!!!!!

Dainesi Profilo | Senior Member

E' sempre un piacere vedere qualcuno contento grazie ai tuoi consigli.
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 !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5