Discussione:
differenza tra tabelle, limiti access, intestazione
(troppo vecchio per rispondere)
LeonardoTT
2008-04-21 21:12:36 UTC
Permalink
Salve a tutti,
sto cercando di valutare quanto più comodo sia access rispetto ad
excel ed in particolare, la prima cosa che devo scoprire è questa:
ho due tabelle con gli stessi campi (un centinaio) e lo stesso numero
di record. Vorrei crearne una terza che abbia gli stessi campi e
record, ma i cui valori siano la differenza tra quelli di Tabella1 e
quelli di Tabella2, cioè:

Tabella3.campo1 = Tabella2.campo1 - Tabella1.campo1
Tabella3.campo2 = Tabella2.campo2 - Tabella1.campo2
...
Tabella3.campo100 = Tabella2.campo100 - Tabella1.campo100

Purtroppo i campi di queste tabelle non hanno un nome semplice come
campo1, campo2, campo3,...
Ho pensato addirittura di scrivere una query SQL usando un foglio di
lavoro excel come appoggio per comporla e poi copiare e incollare le
celle come testo in in una query access.
Sapete suggerirmi un metodo più rapido per farlo, con una query o con
una macro, senza scrivere 100 differenze?

Già che ci sono ho altre due curiosità:
- sapete se c'è un limite massimo di record e/o di campi in access per
una singola tabella?
- queste tabelle sono ognuna in un file di testo (che non creo io) e
hanno l'intestazione fatta di tre righe, come faccio a far digerire ad
access che solo la seconda riga è di intestazione e le altre due non
servono? Posso scrivere una macro che elimini le righe in più prima di
importare il file, ma mi chiedevo se access lo facesse già da solo...


Grazie mille a tutti,

Leonardo
VeroToad [MVP]
2008-04-21 22:58:48 UTC
Permalink
Ciao LeonardoTT,
Post by LeonardoTT
Salve a tutti,
sto cercando di valutare quanto più comodo sia access rispetto ad
ho due tabelle con gli stessi campi (un centinaio) e lo stesso numero
di record.
Secondo me il primo punto da cui partire è: ma mi servono davvero 100 campi?
Che cosa contengono questi campi?
--
Simone Viganò AKA VeroToad - MVP Windows Desktop Experience
My blog: http://blogs.dotnethell.it/VeroToad
My profile:
http://mvp.support.microsoft.com/default.aspx/profile/simone.vigano
Tarima
2008-04-22 16:36:01 UTC
Permalink
Ciao Leonardo,
se davvero le tre tabelle sono identiche, se tutti i campi sono numerici e
contengono dei valori diversi da Null, potresti fare un piccolo programmino
per fare la differenza di cui hai bisogno, utilizzando un riferimento
numerico per individuare i campi.
Infatti, ci si può riferire ai campi delle tabelle in vari modi, uno dei
quali è
<Nome tabella>.Fields(n).value
Il primo campo di ogni tabella è il campo con ordinale zero e quindi, il suo
contenuto sarà: <Nome tabella>.Fields(0).value.
Il centesimo campo sarà: <Nome tabella>.Fields(99).value.
Nel tuo caso, dovresti fare qualcosa di simile a questo:

Sub ....

Dim i as Integer
Dim k as Integer
Dim rsA as DAO.Recordset
Dim rsB as DAO.Recordset
Dim rsC as DAO.Recordset

Set rsA = CurrentDB.OpenRecordSet(<Nome tabella A>)
Set rsB = CurrentDB.OpenRecordSet(<Nome tabella B>)
Set rsC = CurrentDB.OpenRecordSet(<Nome tabella C>)

Do Until rsA.Eof()
rsC.Edit
For i = 0 to 99
rsC.Fields(i).Value = rsA.Fields(i).Value - rsB.Fields(i).Value
Next i
rsC.Update
rsA.MoveNext
rsB.MoveNext
rsC.MoveNext
Loop

rsA.Close
rsB.Close
rsC.Close

Set rsA = Nothing
Set rsB = Nothing
Set rsC = Nothing

End Sub


Ciao

Giovanni
Post by LeonardoTT
Salve a tutti,
sto cercando di valutare quanto più comodo sia access rispetto ad
ho due tabelle con gli stessi campi (un centinaio) e lo stesso numero
di record. Vorrei crearne una terza che abbia gli stessi campi e
record, ma i cui valori siano la differenza tra quelli di Tabella1 e
Tabella3.campo1 = Tabella2.campo1 - Tabella1.campo1
Tabella3.campo2 = Tabella2.campo2 - Tabella1.campo2
...
Tabella3.campo100 = Tabella2.campo100 - Tabella1.campo100
Purtroppo i campi di queste tabelle non hanno un nome semplice come
campo1, campo2, campo3,...
Ho pensato addirittura di scrivere una query SQL usando un foglio di
lavoro excel come appoggio per comporla e poi copiare e incollare le
celle come testo in in una query access.
Sapete suggerirmi un metodo più rapido per farlo, con una query o con
una macro, senza scrivere 100 differenze?
- sapete se c'è un limite massimo di record e/o di campi in access per
una singola tabella?
- queste tabelle sono ognuna in un file di testo (che non creo io) e
hanno l'intestazione fatta di tre righe, come faccio a far digerire ad
access che solo la seconda riga è di intestazione e le altre due non
servono? Posso scrivere una macro che elimini le righe in più prima di
importare il file, ma mi chiedevo se access lo facesse già da solo...
Grazie mille a tutti,
Leonardo
LeonardoTT
2008-04-23 20:45:06 UTC
Permalink
Post by Tarima
Ciao Leonardo,
se davvero le tre tabelle sono identiche, se tutti i campi sono numerici e
contengono dei valori diversi da Null, potresti fare un piccolo programmino
per fare la differenza di cui hai bisogno, utilizzando un riferimento
numerico per individuare i campi.
Infatti, ci si può riferire ai campi delle tabelle in vari modi, uno dei
quali è
<Nome tabella>.Fields(n).value
Il primo campo di ogni tabella è il campo con ordinale zero e quindi, il suo
contenuto sarà: <Nome tabella>.Fields(0).value.
Il centesimo campo sarà: <Nome tabella>.Fields(99).value.
Sub ....
Dim i as Integer
Dim k as Integer
Dim rsA as DAO.Recordset
Dim rsB as DAO.Recordset
Dim rsC as DAO.Recordset
Set rsA = CurrentDB.OpenRecordSet(<Nome tabella A>)
Set rsB = CurrentDB.OpenRecordSet(<Nome tabella B>)
Set rsC = CurrentDB.OpenRecordSet(<Nome tabella C>)
Do Until rsA.Eof()
rsC.Edit
For i = 0 to 99
rsC.Fields(i).Value = rsA.Fields(i).Value - rsB.Fields(i).Value
Next i
rsC.Update
rsA.MoveNext
rsB.MoveNext
rsC.MoveNext
Loop
rsA.Close
rsB.Close
rsC.Close
Set rsA = Nothing
Set rsB = Nothing
Set rsC = Nothing
End Sub
Ciao
Giovanni
Post by LeonardoTT
Salve a tutti,
sto cercando di valutare quanto più comodo sia access rispetto ad
ho due tabelle con gli stessi campi (un centinaio) e lo stesso numero
di record. Vorrei crearne una terza che abbia gli stessi campi e
record, ma i cui valori siano la differenza tra quelli di Tabella1 e
Tabella3.campo1 = Tabella2.campo1 - Tabella1.campo1
Tabella3.campo2 = Tabella2.campo2 - Tabella1.campo2
...
Tabella3.campo100 = Tabella2.campo100 - Tabella1.campo100
Purtroppo i campi di queste tabelle non hanno un nome semplice come
campo1, campo2, campo3,...
Ho pensato addirittura di scrivere una query SQL usando un foglio di
lavoro excel come appoggio per comporla e poi copiare e incollare le
celle come testo in in una query access.
Sapete suggerirmi un metodo più rapido per farlo, con una query o con
una macro, senza scrivere 100 differenze?
- sapete se c'è un limite massimo di record e/o di campi in access per
una singola tabella?
- queste tabelle sono ognuna in un file di testo (che non creo io) e
hanno l'intestazione fatta di tre righe, come faccio a far digerire ad
access che solo la seconda riga è di intestazione e le altre due non
servono? Posso scrivere una macro che elimini le righe in più prima di
importare il file, ma mi chiedevo se access lo facesse già da solo...
Grazie mille a tutti,
Leonardo
Grazie Giovanni,
in effetti è la soluzione più immediata, dato che i campi mi servono
proprio tutti; anzi può pure essere che saranno anche di più in
prossimo futuro.

Sai per caso darmi una risposta anche alle altre due curiosità di cui
sopra?
In particolare, speravo di poter scegliere almeno quante righe saltare
prima di importare i dati sottostanti...
Sai se si può farlo con qualche funzione VBA anzichè usare
l'interfaccia grafica di access per l'importazione?

Grazie ancora,

Leonardo
Tarima
2008-04-24 08:19:02 UTC
Permalink
Ciao Leonardo,
per quanto riguarda il massimo numero di records, credo che il limite sia la
dimensione del file .mdb: al massimo 2 Gb
Il numero massimo di record per tabella è di 255.
Di questi limiti sono abbastanza sicuro fino alla versione 2002.

Capisco che devi importare un file generato da un altro sistema, tuttavia
trovo inquietante l'eventualità di avere un numero di campi così elevato.
Access è un db relazionale. Hai pensato di normalizzare il db, dopo aver
importato i dati in una tabella di transito?

Infine, con VBA puoi sicuramente saltare le righe che vuoi, ma non c'è una
funzione specifica. Devi scrivere una routine usando le funzioni di accesso
ai file (Open, Write, Close). Se fai una ricerca con google, trovi
sicuramente qualche esempio.
Ciao

Giovanni
Post by LeonardoTT
Post by Tarima
Ciao Leonardo,
se davvero le tre tabelle sono identiche, se tutti i campi sono numerici e
contengono dei valori diversi da Null, potresti fare un piccolo programmino
per fare la differenza di cui hai bisogno, utilizzando un riferimento
numerico per individuare i campi.
Infatti, ci si può riferire ai campi delle tabelle in vari modi, uno dei
quali è
<Nome tabella>.Fields(n).value
Il primo campo di ogni tabella è il campo con ordinale zero e quindi, il suo
contenuto sarà: <Nome tabella>.Fields(0).value.
Il centesimo campo sarà: <Nome tabella>.Fields(99).value.
Sub ....
Dim i as Integer
Dim k as Integer
Dim rsA as DAO.Recordset
Dim rsB as DAO.Recordset
Dim rsC as DAO.Recordset
Set rsA = CurrentDB.OpenRecordSet(<Nome tabella A>)
Set rsB = CurrentDB.OpenRecordSet(<Nome tabella B>)
Set rsC = CurrentDB.OpenRecordSet(<Nome tabella C>)
Do Until rsA.Eof()
rsC.Edit
For i = 0 to 99
rsC.Fields(i).Value = rsA.Fields(i).Value - rsB.Fields(i).Value
Next i
rsC.Update
rsA.MoveNext
rsB.MoveNext
rsC.MoveNext
Loop
rsA.Close
rsB.Close
rsC.Close
Set rsA = Nothing
Set rsB = Nothing
Set rsC = Nothing
End Sub
Ciao
Giovanni
Post by LeonardoTT
Salve a tutti,
sto cercando di valutare quanto più comodo sia access rispetto ad
ho due tabelle con gli stessi campi (un centinaio) e lo stesso numero
di record. Vorrei crearne una terza che abbia gli stessi campi e
record, ma i cui valori siano la differenza tra quelli di Tabella1 e
Tabella3.campo1 = Tabella2.campo1 - Tabella1.campo1
Tabella3.campo2 = Tabella2.campo2 - Tabella1.campo2
...
Tabella3.campo100 = Tabella2.campo100 - Tabella1.campo100
Purtroppo i campi di queste tabelle non hanno un nome semplice come
campo1, campo2, campo3,...
Ho pensato addirittura di scrivere una query SQL usando un foglio di
lavoro excel come appoggio per comporla e poi copiare e incollare le
celle come testo in in una query access.
Sapete suggerirmi un metodo più rapido per farlo, con una query o con
una macro, senza scrivere 100 differenze?
- sapete se c'è un limite massimo di record e/o di campi in access per
una singola tabella?
- queste tabelle sono ognuna in un file di testo (che non creo io) e
hanno l'intestazione fatta di tre righe, come faccio a far digerire ad
access che solo la seconda riga è di intestazione e le altre due non
servono? Posso scrivere una macro che elimini le righe in più prima di
importare il file, ma mi chiedevo se access lo facesse già da solo...
Grazie mille a tutti,
Leonardo
Grazie Giovanni,
in effetti è la soluzione più immediata, dato che i campi mi servono
proprio tutti; anzi può pure essere che saranno anche di più in
prossimo futuro.
Sai per caso darmi una risposta anche alle altre due curiosità di cui
sopra?
In particolare, speravo di poter scegliere almeno quante righe saltare
prima di importare i dati sottostanti...
Sai se si può farlo con qualche funzione VBA anzichè usare
l'interfaccia grafica di access per l'importazione?
Grazie ancora,
Leonardo
Tarima
2008-04-27 21:13:01 UTC
Permalink
Ciao Leonardo,
ho sbagliato a scrivere nel post precedente:
il numero massimo di campi (non di record) per tabella è di 255.
Ciao
Giovanni
Post by Tarima
Ciao Leonardo,
per quanto riguarda il massimo numero di records, credo che il limite sia la
dimensione del file .mdb: al massimo 2 Gb
Il numero massimo di record per tabella è di 255.
Di questi limiti sono abbastanza sicuro fino alla versione 2002.
Capisco che devi importare un file generato da un altro sistema, tuttavia
trovo inquietante l'eventualità di avere un numero di campi così elevato.
Access è un db relazionale. Hai pensato di normalizzare il db, dopo aver
importato i dati in una tabella di transito?
Infine, con VBA puoi sicuramente saltare le righe che vuoi, ma non c'è una
funzione specifica. Devi scrivere una routine usando le funzioni di accesso
ai file (Open, Write, Close). Se fai una ricerca con google, trovi
sicuramente qualche esempio.
Ciao
Giovanni
Post by LeonardoTT
Post by Tarima
Ciao Leonardo,
se davvero le tre tabelle sono identiche, se tutti i campi sono numerici e
contengono dei valori diversi da Null, potresti fare un piccolo programmino
per fare la differenza di cui hai bisogno, utilizzando un riferimento
numerico per individuare i campi.
Infatti, ci si può riferire ai campi delle tabelle in vari modi, uno dei
quali è
<Nome tabella>.Fields(n).value
Il primo campo di ogni tabella è il campo con ordinale zero e quindi, il suo
contenuto sarà: <Nome tabella>.Fields(0).value.
Il centesimo campo sarà: <Nome tabella>.Fields(99).value.
Sub ....
Dim i as Integer
Dim k as Integer
Dim rsA as DAO.Recordset
Dim rsB as DAO.Recordset
Dim rsC as DAO.Recordset
Set rsA = CurrentDB.OpenRecordSet(<Nome tabella A>)
Set rsB = CurrentDB.OpenRecordSet(<Nome tabella B>)
Set rsC = CurrentDB.OpenRecordSet(<Nome tabella C>)
Do Until rsA.Eof()
rsC.Edit
For i = 0 to 99
rsC.Fields(i).Value = rsA.Fields(i).Value - rsB.Fields(i).Value
Next i
rsC.Update
rsA.MoveNext
rsB.MoveNext
rsC.MoveNext
Loop
rsA.Close
rsB.Close
rsC.Close
Set rsA = Nothing
Set rsB = Nothing
Set rsC = Nothing
End Sub
Ciao
Giovanni
Post by LeonardoTT
Salve a tutti,
sto cercando di valutare quanto più comodo sia access rispetto ad
ho due tabelle con gli stessi campi (un centinaio) e lo stesso numero
di record. Vorrei crearne una terza che abbia gli stessi campi e
record, ma i cui valori siano la differenza tra quelli di Tabella1 e
Tabella3.campo1 = Tabella2.campo1 - Tabella1.campo1
Tabella3.campo2 = Tabella2.campo2 - Tabella1.campo2
...
Tabella3.campo100 = Tabella2.campo100 - Tabella1.campo100
Purtroppo i campi di queste tabelle non hanno un nome semplice come
campo1, campo2, campo3,...
Ho pensato addirittura di scrivere una query SQL usando un foglio di
lavoro excel come appoggio per comporla e poi copiare e incollare le
celle come testo in in una query access.
Sapete suggerirmi un metodo più rapido per farlo, con una query o con
una macro, senza scrivere 100 differenze?
- sapete se c'è un limite massimo di record e/o di campi in access per
una singola tabella?
- queste tabelle sono ognuna in un file di testo (che non creo io) e
hanno l'intestazione fatta di tre righe, come faccio a far digerire ad
access che solo la seconda riga è di intestazione e le altre due non
servono? Posso scrivere una macro che elimini le righe in più prima di
importare il file, ma mi chiedevo se access lo facesse già da solo...
Grazie mille a tutti,
Leonardo
Grazie Giovanni,
in effetti è la soluzione più immediata, dato che i campi mi servono
proprio tutti; anzi può pure essere che saranno anche di più in
prossimo futuro.
Sai per caso darmi una risposta anche alle altre due curiosità di cui
sopra?
In particolare, speravo di poter scegliere almeno quante righe saltare
prima di importare i dati sottostanti...
Sai se si può farlo con qualche funzione VBA anzichè usare
l'interfaccia grafica di access per l'importazione?
Grazie ancora,
Leonardo
LeonardoTT
2008-04-28 21:01:03 UTC
Permalink
Mi sono inbattuto in questo limite giusto questa mattina infatti :)
In realtà i campi potrebbero essere ben più di 256, ma non mi resta
altro che rigirare tutto quanto, convertendo 255 campi in 255 record;
Facendo due conti, ora come ora, ho 50,000 record, facendo la
trasposizione me ne verrebbero 255*50,000=12,750,000....
mmm, Non ho ancora provato, ma credo che, comunque rigiro sti dati,
comincino a diventare un po tantini da tenere in una tabella sola.
Certo potrei smistarli su più tabelle e poi le query le faccio su una
tabella alla volta e unisco il risultato.
Mi rendo conto ora che sto tirando un po' la corda, anche se comunque,
questo è più che altro una valutazione iniziale di fattibilità.
Alla fine se dovrò gestire tutta sta roba, mi converrà passare a
qualcosa di più adatto... chessò, mySQL.
... Ma a quel punto scaricherò il barile a qualcun altro :)

Vorrei comunque approfondire un po' SQL e access per lavori più
piccolini, mi sai per caso consigliare un sito/libro per beginner e
uno intermedio?

grazie tante,

ciao,

Leonardo
Post by Tarima
Ciao Leonardo,
il numero massimo di campi (non di record) per tabella è di 255.
Ciao
Giovanni
Post by Tarima
Ciao Leonardo,
per quanto riguarda il massimo numero di records, credo che il limite sia la
dimensione del file .mdb: al massimo 2 Gb
Il numero massimo di record per tabella è di 255.
Di questi limiti sono abbastanza sicuro fino alla versione 2002.
Capisco che devi importare un file generato da un altro sistema, tuttavia
trovo inquietante l'eventualità di avere un numero di campi così elevato.
Access è un db relazionale. Hai pensato di normalizzare il db, dopo aver
importato i dati in una tabella di transito?
Infine, con VBA puoi sicuramente saltare le righe che vuoi, ma non c'è una
funzione specifica. Devi scrivere una routine usando le funzioni di accesso
ai file (Open, Write, Close). Se fai una ricerca con google, trovi
sicuramente qualche esempio.
Ciao
Giovanni
Post by LeonardoTT
Post by Tarima
Ciao Leonardo,
se davvero le tre tabelle sono identiche, se tutti i campi sono numerici e
contengono dei valori diversi da Null, potresti fare un piccolo programmino
per fare la differenza di cui hai bisogno, utilizzando un riferimento
numerico per individuare i campi.
Infatti, ci si può riferire ai campi delle tabelle in vari modi, uno dei
quali è
<Nome tabella>.Fields(n).value
Il primo campo di ogni tabella è il campo con ordinale zero e quindi, il suo
contenuto sarà: <Nome tabella>.Fields(0).value.
Il centesimo campo sarà: <Nome tabella>.Fields(99).value.
Sub ....
Dim i as Integer
Dim k as Integer
Dim rsA as DAO.Recordset
Dim rsB as DAO.Recordset
Dim rsC as DAO.Recordset
Set rsA = CurrentDB.OpenRecordSet(<Nome tabella A>)
Set rsB = CurrentDB.OpenRecordSet(<Nome tabella B>)
Set rsC = CurrentDB.OpenRecordSet(<Nome tabella C>)
Do Until rsA.Eof()
rsC.Edit
For i = 0 to 99
rsC.Fields(i).Value = rsA.Fields(i).Value - rsB.Fields(i).Value
Next i
rsC.Update
rsA.MoveNext
rsB.MoveNext
rsC.MoveNext
Loop
rsA.Close
rsB.Close
rsC.Close
Set rsA = Nothing
Set rsB = Nothing
Set rsC = Nothing
End Sub
Ciao
Giovanni
Post by LeonardoTT
Salve a tutti,
sto cercando di valutare quanto più comodo sia access rispetto ad
ho due tabelle con gli stessi campi (un centinaio) e lo stesso numero
di record. Vorrei crearne una terza che abbia gli stessi campi e
record, ma i cui valori siano la differenza tra quelli di Tabella1 e
Tabella3.campo1 = Tabella2.campo1 - Tabella1.campo1
Tabella3.campo2 = Tabella2.campo2 - Tabella1.campo2
...
Tabella3.campo100 = Tabella2.campo100 - Tabella1.campo100
Purtroppo i campi di queste tabelle non hanno un nome semplice come
campo1, campo2, campo3,...
Ho pensato addirittura di scrivere una query SQL usando un foglio di
lavoro excel come appoggio per comporla e poi copiare e incollare le
celle come testo in in una query access.
Sapete suggerirmi un metodo più rapido per farlo, con una query o con
una macro, senza scrivere 100 differenze?
- sapete se c'è un limite massimo di record e/o di campi in access per
una singola tabella?
- queste tabelle sono ognuna in un file di testo (che non creo io) e
hanno l'intestazione fatta di tre righe, come faccio a far digerire ad
access che solo la seconda riga è di intestazione e le altre due non
servono? Posso scrivere una macro che elimini le righe in più prima di
importare il file, ma mi chiedevo se access lo facesse già da solo...
Grazie mille a tutti,
Leonardo
Grazie Giovanni,
in effetti è la soluzione più immediata, dato che i campi mi servono
proprio tutti; anzi può pure essere che saranno anche di più in
prossimo futuro.
Sai per caso darmi una risposta anche alle altre due curiosità di cui
sopra?
In particolare, speravo di poter scegliere almeno quante righe saltare
prima di importare i dati sottostanti...
Sai se si può farlo con qualche funzione VBA anzichè usare
l'interfaccia grafica di access per l'importazione?
Grazie ancora,
Leonardo
Tarima
2008-04-28 22:58:00 UTC
Permalink
Ciao Leonardo,
anzitutto, capisco che la mole di dati che hai davanti sia, per così dire,
imbarazzante.
Tuttavia, pur non conoscendo il campo di applicazione a cui i tuoi dati si
riferiscono, stento a credere che debbano risiedere tutti in una sola tabella.
Access (come il fratello maggiore SQL Server), è un database relazionale.
Ed il primo passo per gestire efficacemente una base dati relazionale è di
normalizzare i dati.
Scusami se ti faccio la predica. Probabilmente queste cose le sai già.
Ma, sono più di vent'anni che lavoro con le basi di dati e rarissimamente mi
è capitato di avere una tabella con più di 50 campi.
Inoltre, la scelta se gestire i dati con Access o SQL Server dipende da
diverse considerazioni, fra le quali la mole è soltanto una di esse.
Per quanto riguarda i libri da consigliarti, ce n'è davvero tanti.
Dovresti dirmi se leggi in inglese, oppure solo in italiano e inoltre, se
vuoi approfondire la programmazione (VBA), oppure no.
Giovanni
Post by LeonardoTT
Mi sono inbattuto in questo limite giusto questa mattina infatti :)
In realtà i campi potrebbero essere ben più di 256, ma non mi resta
altro che rigirare tutto quanto, convertendo 255 campi in 255 record;
Facendo due conti, ora come ora, ho 50,000 record, facendo la
trasposizione me ne verrebbero 255*50,000=12,750,000....
mmm, Non ho ancora provato, ma credo che, comunque rigiro sti dati,
comincino a diventare un po tantini da tenere in una tabella sola.
Certo potrei smistarli su più tabelle e poi le query le faccio su una
tabella alla volta e unisco il risultato.
Mi rendo conto ora che sto tirando un po' la corda, anche se comunque,
questo è più che altro una valutazione iniziale di fattibilità.
Alla fine se dovrò gestire tutta sta roba, mi converrà passare a
qualcosa di più adatto... chessò, mySQL.
... Ma a quel punto scaricherò il barile a qualcun altro :)
Vorrei comunque approfondire un po' SQL e access per lavori più
piccolini, mi sai per caso consigliare un sito/libro per beginner e
uno intermedio?
grazie tante,
ciao,
Leonardo
Post by Tarima
Ciao Leonardo,
il numero massimo di campi (non di record) per tabella è di 255.
Ciao
Giovanni
Post by Tarima
Ciao Leonardo,
per quanto riguarda il massimo numero di records, credo che il limite sia la
dimensione del file .mdb: al massimo 2 Gb
Il numero massimo di record per tabella è di 255.
Di questi limiti sono abbastanza sicuro fino alla versione 2002.
Capisco che devi importare un file generato da un altro sistema, tuttavia
trovo inquietante l'eventualità di avere un numero di campi così elevato.
Access è un db relazionale. Hai pensato di normalizzare il db, dopo aver
importato i dati in una tabella di transito?
Infine, con VBA puoi sicuramente saltare le righe che vuoi, ma non c'è una
funzione specifica. Devi scrivere una routine usando le funzioni di accesso
ai file (Open, Write, Close). Se fai una ricerca con google, trovi
sicuramente qualche esempio.
Ciao
Giovanni
Post by LeonardoTT
Post by Tarima
Ciao Leonardo,
se davvero le tre tabelle sono identiche, se tutti i campi sono numerici e
contengono dei valori diversi da Null, potresti fare un piccolo programmino
per fare la differenza di cui hai bisogno, utilizzando un riferimento
numerico per individuare i campi.
Infatti, ci si può riferire ai campi delle tabelle in vari modi, uno dei
quali è
<Nome tabella>.Fields(n).value
Il primo campo di ogni tabella è il campo con ordinale zero e quindi, il suo
contenuto sarà: <Nome tabella>.Fields(0).value.
Il centesimo campo sarà: <Nome tabella>.Fields(99).value.
Sub ....
Dim i as Integer
Dim k as Integer
Dim rsA as DAO.Recordset
Dim rsB as DAO.Recordset
Dim rsC as DAO.Recordset
Set rsA = CurrentDB.OpenRecordSet(<Nome tabella A>)
Set rsB = CurrentDB.OpenRecordSet(<Nome tabella B>)
Set rsC = CurrentDB.OpenRecordSet(<Nome tabella C>)
Do Until rsA.Eof()
rsC.Edit
For i = 0 to 99
rsC.Fields(i).Value = rsA.Fields(i).Value - rsB.Fields(i).Value
Next i
rsC.Update
rsA.MoveNext
rsB.MoveNext
rsC.MoveNext
Loop
rsA.Close
rsB.Close
rsC.Close
Set rsA = Nothing
Set rsB = Nothing
Set rsC = Nothing
End Sub
Ciao
Giovanni
Post by LeonardoTT
Salve a tutti,
sto cercando di valutare quanto più comodo sia access rispetto ad
ho due tabelle con gli stessi campi (un centinaio) e lo stesso numero
di record. Vorrei crearne una terza che abbia gli stessi campi e
record, ma i cui valori siano la differenza tra quelli di Tabella1 e
Tabella3.campo1 = Tabella2.campo1 - Tabella1.campo1
Tabella3.campo2 = Tabella2.campo2 - Tabella1.campo2
...
Tabella3.campo100 = Tabella2.campo100 - Tabella1.campo100
Purtroppo i campi di queste tabelle non hanno un nome semplice come
campo1, campo2, campo3,...
Ho pensato addirittura di scrivere una query SQL usando un foglio di
lavoro excel come appoggio per comporla e poi copiare e incollare le
celle come testo in in una query access.
Sapete suggerirmi un metodo più rapido per farlo, con una query o con
una macro, senza scrivere 100 differenze?
- sapete se c'è un limite massimo di record e/o di campi in access per
una singola tabella?
- queste tabelle sono ognuna in un file di testo (che non creo io) e
hanno l'intestazione fatta di tre righe, come faccio a far digerire ad
access che solo la seconda riga è di intestazione e le altre due non
servono? Posso scrivere una macro che elimini le righe in più prima di
importare il file, ma mi chiedevo se access lo facesse già da solo...
Grazie mille a tutti,
Leonardo
Grazie Giovanni,
in effetti è la soluzione più immediata, dato che i campi mi servono
proprio tutti; anzi può pure essere che saranno anche di più in
prossimo futuro.
Sai per caso darmi una risposta anche alle altre due curiosità di cui
sopra?
In particolare, speravo di poter scegliere almeno quante righe saltare
prima di importare i dati sottostanti...
Sai se si può farlo con qualche funzione VBA anzichè usare
l'interfaccia grafica di access per l'importazione?
Grazie ancora,
Leonardo
LeonardoTT
2008-05-01 17:31:40 UTC
Permalink
Grazie Giovanni,
i suggerimenti sono sempre ben accetti, specie da chi ha giusto
qualche anno di esperienza in più...

La mia conoscenza dei database è una semplice infarinatura tratta da
appunti di università e lettura dell'help di mysql.
Per la tesi avevo fatto un programma in visual basic che usava access
come base dati (giusto due o tre tabelle correlate tra loro), quindi
un po' di VBA lo digerisco senza grossi problemi.
I libri in inglese vanno benissimo.
Le esigenze che ho adesso, in termini di codice da scrivere sono
mooolto più semplici e peraltro dovranno rimanere tali, quindi
qualsiasi macro farò in futuro dovrà stare dentro un migliaio di righe
al massimo)
Scrivere software non è il mio mestiere ma saper fare qualche
programmino che mi semplifichi la vita farà sempre comodo, e poi,
sapere le potenzialità di certi strumenti può essere utile per
chiedere a qualcun altro di farlo per me :)

Mille grazie,

Leonardo


PS:
Se hai la curiosità di sapere che cosa ho tra le mani, ti ho scritto
due righe qui sotto (non posso entrare in dettagli, dato che si tratta
di lavoro, ma spero che basti):
ho un certo numero di sensori su un aereo, ognuno di questi fornisce
un segnale che viene campionato ad una certa frequenza e di tutto
quanto viene fatto una specie di indice che riporta i valori medio,
minimo e massimo all'interno di intervalli di tempo definiti durante
il volo.
Nella mia mente, la trasposizione in tabella era semplice nel caso del
solo valore medio:
il valore del campo i al record j è il valore medio del parametro i-
esimo nell'intervallo di tempo j-esimo.
Quando servono tutti e tre, si potrebbero
- triplicare i campi
- usare solo tre campi (min,med,max) e "trasporre" i dati avendo, i
record saranno [Numero Parametri] x [Numero intervalli di tempo]
- avere tre tabelle.
Ora, esiste già un sistema officiale di gestione molto efficiente (non
ho idea di che DB ci sia dietro), ma non è molto interattivo.
La mia intenzione era solo provare a sfruttare i grafici pivot di
access, con i quali si possono fare facilmente grafici scatter con una
certa libertà, per dare un'occhiata ai dati prima di usare il sistema
ufficiale.
Attualmente, mi faccio restituire un file di testo con i parametri e i
record che mi servono, lo importo in access e faccio i grafici.
Avevo già una specie di query che mi produceva un file di testo con
256 parametri e avevo cominciato ad usare quella.
La differenza tra tabelle mi serviva per avere la differenza tra
massimo e minimo di circa un centinaio di parametri per tutti i record
che avevo nel file di testo (cioè tanti).
La domanda sull'intestazione era legata al fatto che nel file di testo
ha tre righe di intestazione prima dell'inizio dei dati.


Guarda, già che ci sono, ne apprifitto per farti un altro paio di
domande un po' fuori tema access, magari sono fortunato
- non è che per caso conosci qualche bel programma (gratuito o meno)
per plottare i dati? tipo 2D, 3D + linee di livello, grafici scatter
il cui colore cambia con il valore di un parametro (chessò, immagina
la traiettoria dell'aereo colorata in base alla velocità...)
- mi avevano suggerito matlab, ma alla fine ho scoperto che per
gestire tali quantità di dati, dovevo comprare un apposito toolbox,
oppure usare una libreria di interfaccia con mysql. questa soluzione
non ho mai avuto il tempo di implementarla e testarla: per caso
conosci qualcuno che l'abbia mai provata?


Grazie ancora!
Post by Tarima
Ciao Leonardo,
anzitutto, capisco che la mole di dati che hai davanti sia, per così dire,
imbarazzante.
Tuttavia, pur non conoscendo il campo di applicazione a cui i tuoi dati si
riferiscono, stento a credere che debbano risiedere tutti in una sola tabella.
Access (come il fratello maggiore SQL Server), è un database relazionale.
Ed il primo passo per gestire efficacemente una base dati relazionale è di
normalizzare i dati.
Scusami se ti faccio la predica. Probabilmente queste cose le sai già.
Ma, sono più di vent'anni che lavoro con le basi di dati e rarissimamente mi
è capitato di avere una tabella con più di 50 campi.
Inoltre, la scelta se gestire i dati con Access o SQL Server dipende da
diverse considerazioni, fra le quali la mole è soltanto una di esse.
Per quanto riguarda i libri da consigliarti, ce n'è davvero tanti.
Dovresti dirmi se leggi in inglese, oppure solo in italiano e inoltre, se
vuoi approfondire la programmazione (VBA), oppure no.
Giovanni
Post by LeonardoTT
Mi sono inbattuto in questo limite giusto questa mattina infatti :)
In realtà i campi potrebbero essere ben più di 256, ma non mi resta
altro che rigirare tutto quanto, convertendo 255 campi in 255 record;
Facendo due conti, ora come ora, ho 50,000 record, facendo la
trasposizione me ne verrebbero 255*50,000=12,750,000....
mmm, Non ho ancora provato, ma credo che, comunque rigiro sti dati,
comincino a diventare un po tantini da tenere in una tabella sola.
Certo potrei smistarli su piùtabellee poi le query le faccio su una
tabella alla volta e unisco il risultato.
Mi rendo conto ora che sto tirando un po' la corda, anche se comunque,
questo è più che altro una valutazione iniziale di fattibilità.
Alla fine se dovrò gestire tutta sta roba, mi converrà passare a
qualcosa di più adatto... chessò, mySQL.
... Ma a quel punto scaricherò il barile a qualcun altro :)
Vorrei comunque approfondire un po' SQL e access per lavori più
piccolini, mi sai per caso consigliare un sito/libro per beginner e
uno intermedio?
grazie tante,
ciao,
Leonardo
Post by Tarima
Ciao Leonardo,
il numero massimo di campi (non di record) per tabella è di 255.
Ciao
Giovanni
Post by Tarima
Ciao Leonardo,
per quanto riguarda il massimo numero di records, credo che il limite sia la
dimensione del file .mdb: al massimo 2 Gb
Il numero massimo di record per tabella è di 255.
Di questi limiti sono abbastanza sicuro fino alla versione 2002.
Capisco che devi importare un file generato da un altro sistema, tuttavia
trovo inquietante l'eventualità di avere un numero di campi così elevato.
Access è un db relazionale. Hai pensato di normalizzare il db, dopo aver
importato i dati in una tabella di transito?
Infine, con VBA puoi sicuramente saltare le righe che vuoi, ma non c'è una
funzione specifica. Devi scrivere una routine usando le funzioni di accesso
ai file (Open, Write, Close). Se fai una ricerca con google, trovi
sicuramente qualche esempio.
Ciao
Giovanni
Post by LeonardoTT
Post by Tarima
Ciao Leonardo,
se davvero le tretabellesono identiche, se tutti i campi sono numerici e
contengono dei valori diversi da Null, potresti fare un piccolo programmino
per fare ladifferenzadi cui hai bisogno, utilizzando un riferimento
numerico per individuare i campi.
Infatti, ci si può riferire ai campi delletabellein vari modi, uno dei
quali è
<Nome tabella>.Fields(n).value
Il primo campo di ogni tabella è il campo con ordinale zero e quindi, il suo
contenuto sarà: <Nome tabella>.Fields(0).value.
Il centesimo campo sarà: <Nome tabella>.Fields(99).value.
Sub ....
Dim i as Integer
Dim k as Integer
Dim rsA as DAO.Recordset
Dim rsB as DAO.Recordset
Dim rsC as DAO.Recordset
Set rsA = CurrentDB.OpenRecordSet(<Nome tabella A>)
Set rsB = CurrentDB.OpenRecordSet(<Nome tabella B>)
Set rsC = CurrentDB.OpenRecordSet(<Nome tabella C>)
Do Until rsA.Eof()
rsC.Edit
For i = 0 to 99
rsC.Fields(i).Value = rsA.Fields(i).Value - rsB.Fields(i).Value
Next i
rsC.Update
rsA.MoveNext
rsB.MoveNext
rsC.MoveNext
Loop
rsA.Close
rsB.Close
rsC.Close
Set rsA = Nothing
Set rsB = Nothing
Set rsC = Nothing
End Sub
Ciao
Giovanni
Post by LeonardoTT
Salve a tutti,
sto cercando di valutare quanto più comodo sia access rispetto ad
ho duetabellecon gli stessi campi (un centinaio) e lo stesso numero
di record. Vorrei crearne una terza che abbia gli stessi campi e
record, ma i cui valori siano ladifferenzatra quelli di Tabella1 e
Tabella3.campo1 = Tabella2.campo1 - Tabella1.campo1
Tabella3.campo2 = Tabella2.campo2 - Tabella1.campo2
...
Tabella3.campo100 = Tabella2.campo100 - Tabella1.campo100
Purtroppo i campi di questetabellenon hanno un nome semplice come
campo1, campo2, campo3,...
Ho pensato addirittura di scrivere una query SQL usando un foglio di
lavoro excel come appoggio per comporla e poi copiare e incollare le
celle come testo in in una query access.
Sapete suggerirmi un metodo più rapido per farlo, con una query o con
una macro, senza scrivere 100 differenze?
- sapete se c'è un limite massimo di record e/o di campi in access per
una singola tabella?
- questetabellesono ognuna in un file di testo (che non creo io) e
hanno l'intestazione fatta di tre righe, come faccio a far digerire ad
access che solo la seconda riga è di intestazione e le altre due non
servono? Posso scrivere una macro che elimini le righe in più prima di
importare il file, ma mi chiedevo se access lo facesse già da solo...
Grazie mille a tutti,
Leonardo
Grazie Giovanni,
in effetti è la soluzione più immediata, dato che i campi mi servono
proprio tutti; anzi può pure essere che saranno anche di più in
prossimo futuro.
Sai per caso darmi una risposta anche alle altre due curiosità di cui
sopra?
In particolare, speravo di poter scegliere almeno quante righe saltare
prima di importare i dati sottostanti...
Sai se si può farlo con qualche funzione VBA anzichè usare
l'interfaccia grafica di access per l'importazione?
Grazie ancora,
Leonardo
Tarima
2008-05-01 18:11:03 UTC
Permalink
Ciao Leonardo,
comincio dalla fine: alle ultime due domande non so proprio darti una
risposta, perché non ho esperienza al riguardo.
Per quanto riguarda il problema principale, premesso che non sono sicuro di
aver capito bene il tuo problema, io partirei dai dati di base (se
possibile), con una tabella di questo tipo:
IDLettura, IDSensore, Tempo, Valore
nella quale il campo IDSensore rappresenta il collegamento (chiave esterna)
con la tabella dei sensori:
IDSensore, Nome, Posizione, ecc.

Ti puoi ritrovare facilmente con diverse centinaia di migliaia di record in
poco tempo, ma non è certo un problema.
A quel punto, sarai tu ad aggregre i dati come meglio ti aggrada,
eventualmente con tabelle e grafici pivot.

Il problema è com'è fatto il file di testo che hai a disposizione!
Potresti dover fare un programma che, analizzando il file riga per riga,
popoli le due tabelle,
separando la parte "anagrafica" dei sensori dalla parte "dinamica" delle
letture.

Per quanto riguarda i libri:
Access 2007 Bible - Wiley Publishing, Inc. - ISBN-10: 0-470-04673-2
Access 2007 VBA Programmer’s Reference - Wiley Publishing, Inc. - ISBN:
978-0-470-04703-3

Ciao
Giovanni
Post by LeonardoTT
Grazie Giovanni,
i suggerimenti sono sempre ben accetti, specie da chi ha giusto
qualche anno di esperienza in più...
La mia conoscenza dei database è una semplice infarinatura tratta da
appunti di università e lettura dell'help di mysql.
Per la tesi avevo fatto un programma in visual basic che usava access
come base dati (giusto due o tre tabelle correlate tra loro), quindi
un po' di VBA lo digerisco senza grossi problemi.
I libri in inglese vanno benissimo.
Le esigenze che ho adesso, in termini di codice da scrivere sono
mooolto più semplici e peraltro dovranno rimanere tali, quindi
qualsiasi macro farò in futuro dovrà stare dentro un migliaio di righe
al massimo)
Scrivere software non è il mio mestiere ma saper fare qualche
programmino che mi semplifichi la vita farà sempre comodo, e poi,
sapere le potenzialità di certi strumenti può essere utile per
chiedere a qualcun altro di farlo per me :)
Mille grazie,
Leonardo
Se hai la curiosità di sapere che cosa ho tra le mani, ti ho scritto
due righe qui sotto (non posso entrare in dettagli, dato che si tratta
ho un certo numero di sensori su un aereo, ognuno di questi fornisce
un segnale che viene campionato ad una certa frequenza e di tutto
quanto viene fatto una specie di indice che riporta i valori medio,
minimo e massimo all'interno di intervalli di tempo definiti durante
il volo.
Nella mia mente, la trasposizione in tabella era semplice nel caso del
il valore del campo i al record j è il valore medio del parametro i-
esimo nell'intervallo di tempo j-esimo.
Quando servono tutti e tre, si potrebbero
- triplicare i campi
- usare solo tre campi (min,med,max) e "trasporre" i dati avendo, i
record saranno [Numero Parametri] x [Numero intervalli di tempo]
- avere tre tabelle.
Ora, esiste già un sistema officiale di gestione molto efficiente (non
ho idea di che DB ci sia dietro), ma non è molto interattivo.
La mia intenzione era solo provare a sfruttare i grafici pivot di
access, con i quali si possono fare facilmente grafici scatter con una
certa libertà, per dare un'occhiata ai dati prima di usare il sistema
ufficiale.
Attualmente, mi faccio restituire un file di testo con i parametri e i
record che mi servono, lo importo in access e faccio i grafici.
Avevo già una specie di query che mi produceva un file di testo con
256 parametri e avevo cominciato ad usare quella.
La differenza tra tabelle mi serviva per avere la differenza tra
massimo e minimo di circa un centinaio di parametri per tutti i record
che avevo nel file di testo (cioè tanti).
La domanda sull'intestazione era legata al fatto che nel file di testo
ha tre righe di intestazione prima dell'inizio dei dati.
Guarda, già che ci sono, ne apprifitto per farti un altro paio di
domande un po' fuori tema access, magari sono fortunato
- non è che per caso conosci qualche bel programma (gratuito o meno)
per plottare i dati? tipo 2D, 3D + linee di livello, grafici scatter
il cui colore cambia con il valore di un parametro (chessò, immagina
la traiettoria dell'aereo colorata in base alla velocità...)
- mi avevano suggerito matlab, ma alla fine ho scoperto che per
gestire tali quantità di dati, dovevo comprare un apposito toolbox,
oppure usare una libreria di interfaccia con mysql. questa soluzione
non ho mai avuto il tempo di implementarla e testarla: per caso
conosci qualcuno che l'abbia mai provata?
Grazie ancora!
Post by Tarima
Ciao Leonardo,
anzitutto, capisco che la mole di dati che hai davanti sia, per così dire,
imbarazzante.
Tuttavia, pur non conoscendo il campo di applicazione a cui i tuoi dati si
riferiscono, stento a credere che debbano risiedere tutti in una sola tabella.
Access (come il fratello maggiore SQL Server), è un database relazionale..
Ed il primo passo per gestire efficacemente una base dati relazionale è di
normalizzare i dati.
Scusami se ti faccio la predica. Probabilmente queste cose le sai già.
Ma, sono più di vent'anni che lavoro con le basi di dati e rarissimamente mi
è capitato di avere una tabella con più di 50 campi.
Inoltre, la scelta se gestire i dati con Access o SQL Server dipende da
diverse considerazioni, fra le quali la mole è soltanto una di esse.
Per quanto riguarda i libri da consigliarti, ce n'è davvero tanti.
Dovresti dirmi se leggi in inglese, oppure solo in italiano e inoltre, se
vuoi approfondire la programmazione (VBA), oppure no.
Giovanni
Post by LeonardoTT
Mi sono inbattuto in questo limite giusto questa mattina infatti :)
In realtà i campi potrebbero essere ben più di 256, ma non mi resta
altro che rigirare tutto quanto, convertendo 255 campi in 255 record;
Facendo due conti, ora come ora, ho 50,000 record, facendo la
trasposizione me ne verrebbero 255*50,000=12,750,000....
mmm, Non ho ancora provato, ma credo che, comunque rigiro sti dati,
comincino a diventare un po tantini da tenere in una tabella sola.
Certo potrei smistarli su piùtabellee poi le query le faccio su una
tabella alla volta e unisco il risultato.
Mi rendo conto ora che sto tirando un po' la corda, anche se comunque,
questo è più che altro una valutazione iniziale di fattibilità.
Alla fine se dovrò gestire tutta sta roba, mi converrà passare a
qualcosa di più adatto... chessò, mySQL.
... Ma a quel punto scaricherò il barile a qualcun altro :)
Vorrei comunque approfondire un po' SQL e access per lavori più
piccolini, mi sai per caso consigliare un sito/libro per beginner e
uno intermedio?
grazie tante,
ciao,
Leonardo
Post by Tarima
Ciao Leonardo,
il numero massimo di campi (non di record) per tabella è di 255.
Ciao
Giovanni
Post by Tarima
Ciao Leonardo,
per quanto riguarda il massimo numero di records, credo che il limite sia la
dimensione del file .mdb: al massimo 2 Gb
Il numero massimo di record per tabella è di 255.
Di questi limiti sono abbastanza sicuro fino alla versione 2002.
Capisco che devi importare un file generato da un altro sistema, tuttavia
trovo inquietante l'eventualità di avere un numero di campi così elevato.
Access è un db relazionale. Hai pensato di normalizzare il db, dopo aver
importato i dati in una tabella di transito?
Infine, con VBA puoi sicuramente saltare le righe che vuoi, ma non c'è una
funzione specifica. Devi scrivere una routine usando le funzioni di accesso
ai file (Open, Write, Close). Se fai una ricerca con google, trovi
sicuramente qualche esempio.
Ciao
Giovanni
Post by LeonardoTT
Post by Tarima
Ciao Leonardo,
se davvero le tretabellesono identiche, se tutti i campi sono numerici e
contengono dei valori diversi da Null, potresti fare un piccolo programmino
per fare ladifferenzadi cui hai bisogno, utilizzando un riferimento
numerico per individuare i campi.
Infatti, ci si può riferire ai campi delletabellein vari modi, uno dei
quali è
<Nome tabella>.Fields(n).value
Il primo campo di ogni tabella è il campo con ordinale zero e quindi, il suo
contenuto sarà: <Nome tabella>.Fields(0).value.
Il centesimo campo sarà: <Nome tabella>.Fields(99).value.
Sub ....
Dim i as Integer
Dim k as Integer
Dim rsA as DAO.Recordset
Dim rsB as DAO.Recordset
Dim rsC as DAO.Recordset
Set rsA = CurrentDB.OpenRecordSet(<Nome tabella A>)
Set rsB = CurrentDB.OpenRecordSet(<Nome tabella B>)
Set rsC = CurrentDB.OpenRecordSet(<Nome tabella C>)
Do Until rsA.Eof()
rsC.Edit
For i = 0 to 99
rsC.Fields(i).Value = rsA.Fields(i).Value - rsB.Fields(i).Value
Next i
rsC.Update
rsA.MoveNext
rsB.MoveNext
rsC.MoveNext
Loop
rsA.Close
rsB.Close
rsC.Close
Set rsA = Nothing
Set rsB = Nothing
Set rsC = Nothing
End Sub
Ciao
Giovanni
Post by LeonardoTT
Salve a tutti,
sto cercando di valutare quanto più comodo sia access rispetto ad
ho duetabellecon gli stessi campi (un centinaio) e lo stesso numero
di record. Vorrei crearne una terza che abbia gli stessi campi e
record, ma i cui valori siano ladifferenzatra quelli di Tabella1 e
Tabella3.campo1 = Tabella2.campo1 - Tabella1.campo1
Tabella3.campo2 = Tabella2.campo2 - Tabella1.campo2
...
Tabella3.campo100 = Tabella2.campo100 - Tabella1.campo100
Purtroppo i campi di questetabellenon hanno un nome semplice come
campo1, campo2, campo3,...
Ho pensato addirittura di scrivere una query SQL usando un foglio di
lavoro excel come appoggio per comporla e poi copiare e incollare le
celle come testo in in una query access.
Sapete suggerirmi un metodo più rapido per farlo, con una query o con
una macro, senza scrivere 100 differenze?
- sapete se c'è un limite massimo di record e/o di campi in access per
una singola tabella?
- questetabellesono ognuna in un file di testo (che non creo io) e
hanno l'intestazione fatta di tre righe, come faccio a far digerire ad
access che solo la seconda riga è di intestazione e le altre due non
servono? Posso scrivere una macro che elimini le righe in più prima di
importare il file, ma mi chiedevo se access lo facesse già da solo...
Grazie mille a tutti,
Leonardo
Grazie Giovanni,
in effetti è la soluzione più immediata, dato che i campi mi servono
proprio tutti; anzi può pure essere che saranno anche di più in
prossimo futuro.
Sai per caso darmi una risposta anche alle altre due curiosità di cui
sopra?
In particolare, speravo di poter scegliere almeno quante righe saltare
prima di importare i dati sottostanti...
Sai se si può farlo con qualche funzione VBA anzichè usare
l'interfaccia grafica di access per l'importazione?
Grazie ancora,
Leonardo
LeonardoTT
2008-05-04 10:23:21 UTC
Permalink
Cia Giovanni, grazie mille per la bibliografia.
Per il formato del file di testo, che sono banali file tabellari csv,
ho due possibilità:
(1) simile a quelle che mi proponi
IDLettura, IDSensore, ValoreMinimo, ValorMassimo, ValoreMedio
(2) questa in realtà produce 3 file, ognuno quella con tanti campi
quanti sono i sensori che mi interessano
file1: IDLettura, ValoreMinimoSensore1,... , ValoreMinimoSensoreN
file2: IDLettura, ValoreMassimoSensore1,... , ValoreMassimoSensoreN
file3: IDLettura, ValoreMedioSensore1,... , ValoreMedioSensoreN
La parte di "anagrafica" non la vedo nemmeno in questi files.

Esempio di problema pratico:
Fare il grafico di VelocitàMedia vs PotenzaMedia per tutte le letture
in cui l'aereo volava orizzontale a circa 2000 metri.
Facciamo finta che
- Volare orizzontale significa che lo scarto tra il massimo e il
minimo della VelocitàVerticale, all'interno della lettura, sia tra -1
e +1 m/s
- volare a circa 2000 metri significa che lo scarto max-min della
quota sia tra -100 e +100 metri
(Ora forse si capisce il perchè della domanda iniziale: fare la
differenza tra due tabelle)
Correggimi se sbaglio, ma basta che, nel caso del formato (1), ricavo
gli IDLettura (distinti) per cui sono rispettate le condizioni che
cerco e poi li uso per prendere i record dei parametri che mi servono
relativi a quelle letture; il tutto in una sola query.
Nel caso del formato (2) basta che seguo la macro che mi avevi
indicato all'inizio.

In sostanza la soluzione ce l'ho in entrmbi i casi :)

Mi rimane solo un cruccio: diciamo che dopo ogni volo importo in
access il file di testo formato (1), con una macro VBA che accoda i
dati sempre in una sola tabella, per quanto potrò andare avanti? La
settimanda scorsa un collega si è divertito a caricare 300 parametri
per tutti i voli usando il formato(1) (non so che sistema abbia usato)
e il risultato è un file access di 1.5 GB. Visto che siamo solo a metà
dell'attività, non è che poi è troppa roba per un solo file?

Grazie per la pazienza,
ciao,
Leonardo
Post by Tarima
Ciao Leonardo,
comincio dalla fine: alle ultime due domande non so proprio darti una
risposta, perché non ho esperienza al riguardo.
Per quanto riguarda il problema principale, premesso che non sono sicuro di
aver capito bene il tuo problema, io partirei dai dati di base (se
IDLettura, IDSensore, Tempo, Valore
nella quale il campo IDSensore rappresenta il collegamento (chiave esterna)
IDSensore, Nome, Posizione, ecc.
Ti puoi ritrovare facilmente con diverse centinaia di migliaia di record in
poco tempo, ma non è certo un problema.
A quel punto, sarai tu ad aggregre i dati come meglio ti aggrada,
eventualmente con tabelle e grafici pivot.
Il problema è com'è fatto il file di testo che hai a disposizione!
Potresti dover fare un programma che, analizzando il file riga per riga,
popoli le due tabelle,
separando la parte "anagrafica" dei sensori dalla parte "dinamica" delle
letture.
Access 2007 Bible - Wiley Publishing, Inc. - ISBN-10: 0-470-04673-2
978-0-470-04703-3
Ciao
Giovanni
Post by LeonardoTT
Grazie Giovanni,
i suggerimenti sono sempre ben accetti, specie da chi ha giusto
qualche anno di esperienza in più...
La mia conoscenza dei database è una semplice infarinatura tratta da
appunti di università e lettura dell'help di mysql.
Per la tesi avevo fatto un programma in visual basic che usava access
come base dati (giusto due o tre tabelle correlate tra loro), quindi
un po' di VBA lo digerisco senza grossi problemi.
I libri in inglese vanno benissimo.
Le esigenze che ho adesso, in termini di codice da scrivere sono
mooolto più semplici e peraltro dovranno rimanere tali, quindi
qualsiasi macro farò in futuro dovrà stare dentro un migliaio di righe
al massimo)
Scrivere software non è il mio mestiere ma saper fare qualche
programmino che mi semplifichi la vita farà sempre comodo, e poi,
sapere le potenzialità di certi strumenti può essere utile per
chiedere a qualcun altro di farlo per me :)
Mille grazie,
Leonardo
Se hai la curiosità di sapere che cosa ho tra le mani, ti ho scritto
due righe qui sotto (non posso entrare in dettagli, dato che si tratta
ho un certo numero di sensori su un aereo, ognuno di questi fornisce
un segnale che viene campionato ad una certa frequenza e di tutto
quanto viene fatto una specie di indice che riporta i valori medio,
minimo e massimo all'interno di intervalli di tempo definiti durante
il volo.
Nella mia mente, la trasposizione in tabella era semplice nel caso del
il valore del campo i al record j è il valore medio del parametro i-
esimo nell'intervallo di tempo j-esimo.
Quando servono tutti e tre, si potrebbero
- triplicare i campi
- usare solo tre campi (min,med,max) e "trasporre" i dati avendo, i
record saranno [Numero Parametri] x [Numero intervalli di tempo]
- avere tre tabelle.
Ora, esiste già un sistema officiale di gestione molto efficiente (non
ho idea di che DB ci sia dietro), ma non è molto interattivo.
La mia intenzione era solo provare a sfruttare i grafici pivot di
access, con i quali si possono fare facilmente grafici scatter con una
certa libertà, per dare un'occhiata ai dati prima di usare il sistema
ufficiale.
Attualmente, mi faccio restituire un file di testo con i parametri e i
record che mi servono, lo importo in access e faccio i grafici.
Avevo già una specie di query che mi produceva un file di testo con
256 parametri e avevo cominciato ad usare quella.
La differenza tra tabelle mi serviva per avere la differenza tra
massimo e minimo di circa un centinaio di parametri per tutti i record
che avevo nel file di testo (cioè tanti).
La domanda sull'intestazione era legata al fatto che nel file di testo
ha tre righe di intestazione prima dell'inizio dei dati.
Guarda, già che ci sono, ne apprifitto per farti un altro paio di
domande un po' fuori tema access, magari sono fortunato
- non è che per caso conosci qualche bel programma (gratuito o meno)
per plottare i dati? tipo 2D, 3D + linee di livello, grafici scatter
il cui colore cambia con il valore di un parametro (chessò, immagina
la traiettoria dell'aereo colorata in base alla velocità...)
- mi avevano suggerito matlab, ma alla fine ho scoperto che per
gestire tali quantità di dati, dovevo comprare un apposito toolbox,
oppure usare una libreria di interfaccia con mysql. questa soluzione
non ho mai avuto il tempo di implementarla e testarla: per caso
conosci qualcuno che l'abbia mai provata?
Grazie ancora!
Post by Tarima
Ciao Leonardo,
anzitutto, capisco che la mole di dati che hai davanti sia, per così dire,
imbarazzante.
Tuttavia, pur non conoscendo il campo di applicazione a cui i tuoi dati si
riferiscono, stento a credere che debbano risiedere tutti in una sola tabella.
Access (come il fratello maggiore SQL Server), è un database relazionale..
Ed il primo passo per gestire efficacemente una base dati relazionale è di
normalizzare i dati.
Scusami se ti faccio la predica. Probabilmente queste cose le sai già.
Ma, sono più di vent'anni che lavoro con le basi di dati e rarissimamente mi
è capitato di avere una tabella con più di 50 campi.
Inoltre, la scelta se gestire i dati con Access o SQL Server dipende da
diverse considerazioni, fra le quali la mole è soltanto una di esse.
Per quanto riguarda i libri da consigliarti, ce n'è davvero tanti.
Dovresti dirmi se leggi in inglese, oppure solo in italiano e inoltre, se
vuoi approfondire la programmazione (VBA), oppure no.
Giovanni
Post by LeonardoTT
Mi sono inbattuto in questo limite giusto questa mattina infatti :)
In realtà i campi potrebbero essere ben più di 256, ma non mi resta
altro che rigirare tutto quanto, convertendo 255 campi in 255 record;
Facendo due conti, ora come ora, ho 50,000 record, facendo la
trasposizione me ne verrebbero 255*50,000=12,750,000....
mmm, Non ho ancora provato, ma credo che, comunque rigiro sti dati,
comincino a diventare un po tantini da tenere in una tabella sola.
Certo potrei smistarli su piùtabellee poi le query le faccio su una
tabella alla volta e unisco il risultato.
Mi rendo conto ora che sto tirando un po' la corda, anche se comunque,
questo è più che altro una valutazione iniziale di fattibilità.
Alla fine se dovrò gestire tutta sta roba, mi converrà passare a
qualcosa di più adatto... chessò, mySQL.
... Ma a quel punto scaricherò il barile a qualcun altro :)
Vorrei comunque approfondire un po' SQL e access per lavori più
piccolini, mi sai per caso consigliare un sito/libro per beginner e
uno intermedio?
grazie tante,
ciao,
Leonardo
Post by Tarima
Ciao Leonardo,
il numero massimo di campi (non di record) per tabella è di 255.
Ciao
Giovanni
Post by Tarima
Ciao Leonardo,
per quanto riguarda il massimo numero di records, credo che il limite sia la
dimensione del file .mdb: al massimo 2 Gb
Il numero massimo di record per tabella è di 255.
Di questi limiti sono abbastanza sicuro fino alla versione 2002.
Capisco che devi importare un file generato da un altro sistema, tuttavia
trovo inquietante l'eventualità di avere un numero di campi così elevato.
Access è un db relazionale. Hai pensato di normalizzare il db, dopo aver
importato i dati in una tabella di transito?
Infine, con VBA puoi sicuramente saltare le righe che vuoi, ma non c'è una
funzione specifica. Devi scrivere una routine usando le funzioni di accesso
ai file (Open, Write, Close). Se fai una ricerca con google, trovi
sicuramente qualche esempio.
Ciao
Giovanni
Post by Tarima
Ciao Leonardo,
se davvero le tretabellesono identiche, se tutti i campi sono numerici e
contengono dei valori diversi da Null, potresti fare un piccolo programmino
per fare ladifferenzadi cui hai bisogno, utilizzando un riferimento
numerico per individuare i campi.
Infatti, ci si può riferire ai campi delletabellein vari modi, uno dei
quali è
<Nome tabella>.Fields(n).value
Il primo campo di ogni tabella è il campo con ordinale zero e quindi, il suo
contenuto sarà: <Nome tabella>.Fields(0).value.
Il centesimo campo sarà: <Nome tabella>.Fields(99).value.
Sub ....
Dim i as Integer
Dim k as Integer
Dim rsA as DAO.Recordset
Dim rsB as DAO.Recordset
Dim rsC as DAO.Recordset
Set rsA = CurrentDB.OpenRecordSet(<Nome tabella A>)
Set rsB = CurrentDB.OpenRecordSet(<Nome tabella B>)
Set rsC = CurrentDB.OpenRecordSet(<Nome tabella C>)
Do Until rsA.Eof()
rsC.Edit
For i = 0 to 99
rsC.Fields(i).Value = rsA.Fields(i).Value - rsB.Fields(i).Value
Next i
rsC.Update
...
leggi tutto
Tarima
2008-05-04 10:46:00 UTC
Permalink
Ciao Leonardo,
mi fai venire il mal di testa :)
Andiamo con ordine.
La parte "anagrafica" te la devi costruire tu in qualche modo.
Ad esempio, metti in una cartella tutti i files del tipo (2), li processi
uno ad uno, aggiungendo man mano alla tabella dei sensori il sensore del file
corrente.
Dalla volta successiva, prima di aggiungere un nuovo sensore, dovrai
verificare che non ci sia già.
Fatto questo, passi a processare i movimenti. Grossolanamente:
- Apri il file .csv del tipo (1).
- Individui il sensore e recuperi il suo ID dall'anagrafica.
- Aggiungi il record di movimento alla relativa tabella (IDLettura,
IDSensore, ValoreMinimo, ValorMassimo, ValoreMedio).
- Chiudi il .csv.

Tieni presente che è meglio avere un milione di record in una tabella di 5
campi, che
centomila record in una tabella di 50 campi.

Prova a fare un prototipo per capire fino a che punto puoi spingerti con
Access.
Se raggiungi velocemente il limite, puoi passare a SQL Server 2005: gratuito
(nella versione Express), e altamente scalabile:
http://www.microsoft.com/sql/prodinfo/features/compare-features.mspx

Ciao
Giovanni
Post by LeonardoTT
Cia Giovanni, grazie mille per la bibliografia.
Per il formato del file di testo, che sono banali file tabellari csv,
(1) simile a quelle che mi proponi
IDLettura, IDSensore, ValoreMinimo, ValorMassimo, ValoreMedio
(2) questa in realtà produce 3 file, ognuno quella con tanti campi
quanti sono i sensori che mi interessano
file1: IDLettura, ValoreMinimoSensore1,... , ValoreMinimoSensoreN
file2: IDLettura, ValoreMassimoSensore1,... , ValoreMassimoSensoreN
file3: IDLettura, ValoreMedioSensore1,... , ValoreMedioSensoreN
La parte di "anagrafica" non la vedo nemmeno in questi files.
Fare il grafico di VelocitàMedia vs PotenzaMedia per tutte le letture
in cui l'aereo volava orizzontale a circa 2000 metri.
Facciamo finta che
- Volare orizzontale significa che lo scarto tra il massimo e il
minimo della VelocitàVerticale, all'interno della lettura, sia tra -1
e +1 m/s
- volare a circa 2000 metri significa che lo scarto max-min della
quota sia tra -100 e +100 metri
(Ora forse si capisce il perchè della domanda iniziale: fare la
differenza tra due tabelle)
Correggimi se sbaglio, ma basta che, nel caso del formato (1), ricavo
gli IDLettura (distinti) per cui sono rispettate le condizioni che
cerco e poi li uso per prendere i record dei parametri che mi servono
relativi a quelle letture; il tutto in una sola query.
Nel caso del formato (2) basta che seguo la macro che mi avevi
indicato all'inizio.
In sostanza la soluzione ce l'ho in entrmbi i casi :)
Mi rimane solo un cruccio: diciamo che dopo ogni volo importo in
access il file di testo formato (1), con una macro VBA che accoda i
dati sempre in una sola tabella, per quanto potrò andare avanti? La
settimanda scorsa un collega si è divertito a caricare 300 parametri
per tutti i voli usando il formato(1) (non so che sistema abbia usato)
e il risultato è un file access di 1.5 GB. Visto che siamo solo a metà
dell'attività, non è che poi è troppa roba per un solo file?
Grazie per la pazienza,
ciao,
Leonardo
Post by Tarima
Ciao Leonardo,
comincio dalla fine: alle ultime due domande non so proprio darti una
risposta, perché non ho esperienza al riguardo.
Per quanto riguarda il problema principale, premesso che non sono sicuro di
aver capito bene il tuo problema, io partirei dai dati di base (se
IDLettura, IDSensore, Tempo, Valore
nella quale il campo IDSensore rappresenta il collegamento (chiave esterna)
IDSensore, Nome, Posizione, ecc.
Ti puoi ritrovare facilmente con diverse centinaia di migliaia di record in
poco tempo, ma non è certo un problema.
A quel punto, sarai tu ad aggregre i dati come meglio ti aggrada,
eventualmente con tabelle e grafici pivot.
Il problema è com'è fatto il file di testo che hai a disposizione!
Potresti dover fare un programma che, analizzando il file riga per riga,
popoli le due tabelle,
separando la parte "anagrafica" dei sensori dalla parte "dinamica" delle
letture.
Access 2007 Bible - Wiley Publishing, Inc. - ISBN-10: 0-470-04673-2
978-0-470-04703-3
Ciao
Giovanni
Post by LeonardoTT
Grazie Giovanni,
i suggerimenti sono sempre ben accetti, specie da chi ha giusto
qualche anno di esperienza in più...
La mia conoscenza dei database è una semplice infarinatura tratta da
appunti di università e lettura dell'help di mysql.
Per la tesi avevo fatto un programma in visual basic che usava access
come base dati (giusto due o tre tabelle correlate tra loro), quindi
un po' di VBA lo digerisco senza grossi problemi.
I libri in inglese vanno benissimo.
Le esigenze che ho adesso, in termini di codice da scrivere sono
mooolto più semplici e peraltro dovranno rimanere tali, quindi
qualsiasi macro farò in futuro dovrà stare dentro un migliaio di righe
al massimo)
Scrivere software non è il mio mestiere ma saper fare qualche
programmino che mi semplifichi la vita farà sempre comodo, e poi,
sapere le potenzialità di certi strumenti può essere utile per
chiedere a qualcun altro di farlo per me :)
Mille grazie,
Leonardo
Se hai la curiosità di sapere che cosa ho tra le mani, ti ho scritto
due righe qui sotto (non posso entrare in dettagli, dato che si tratta
ho un certo numero di sensori su un aereo, ognuno di questi fornisce
un segnale che viene campionato ad una certa frequenza e di tutto
quanto viene fatto una specie di indice che riporta i valori medio,
minimo e massimo all'interno di intervalli di tempo definiti durante
il volo.
Nella mia mente, la trasposizione in tabella era semplice nel caso del
il valore del campo i al record j è il valore medio del parametro i-
esimo nell'intervallo di tempo j-esimo.
Quando servono tutti e tre, si potrebbero
- triplicare i campi
- usare solo tre campi (min,med,max) e "trasporre" i dati avendo, i
record saranno [Numero Parametri] x [Numero intervalli di tempo]
- avere tre tabelle.
Ora, esiste già un sistema officiale di gestione molto efficiente (non
ho idea di che DB ci sia dietro), ma non è molto interattivo.
La mia intenzione era solo provare a sfruttare i grafici pivot di
access, con i quali si possono fare facilmente grafici scatter con una
certa libertà, per dare un'occhiata ai dati prima di usare il sistema
ufficiale.
Attualmente, mi faccio restituire un file di testo con i parametri e i
record che mi servono, lo importo in access e faccio i grafici.
Avevo già una specie di query che mi produceva un file di testo con
256 parametri e avevo cominciato ad usare quella.
La differenza tra tabelle mi serviva per avere la differenza tra
massimo e minimo di circa un centinaio di parametri per tutti i record
che avevo nel file di testo (cioè tanti).
La domanda sull'intestazione era legata al fatto che nel file di testo
ha tre righe di intestazione prima dell'inizio dei dati.
Guarda, già che ci sono, ne apprifitto per farti un altro paio di
domande un po' fuori tema access, magari sono fortunato
- non è che per caso conosci qualche bel programma (gratuito o meno)
per plottare i dati? tipo 2D, 3D + linee di livello, grafici scatter
il cui colore cambia con il valore di un parametro (chessò, immagina
la traiettoria dell'aereo colorata in base alla velocità...)
- mi avevano suggerito matlab, ma alla fine ho scoperto che per
gestire tali quantità di dati, dovevo comprare un apposito toolbox,
oppure usare una libreria di interfaccia con mysql. questa soluzione
non ho mai avuto il tempo di implementarla e testarla: per caso
conosci qualcuno che l'abbia mai provata?
Grazie ancora!
Post by Tarima
Ciao Leonardo,
anzitutto, capisco che la mole di dati che hai davanti sia, per così dire,
imbarazzante.
Tuttavia, pur non conoscendo il campo di applicazione a cui i tuoi dati si
riferiscono, stento a credere che debbano risiedere tutti in una sola tabella.
Access (come il fratello maggiore SQL Server), è un database relazionale..
Ed il primo passo per gestire efficacemente una base dati relazionale è di
normalizzare i dati.
Scusami se ti faccio la predica. Probabilmente queste cose le sai già.
Ma, sono più di vent'anni che lavoro con le basi di dati e rarissimamente mi
è capitato di avere una tabella con più di 50 campi.
Inoltre, la scelta se gestire i dati con Access o SQL Server dipende da
diverse considerazioni, fra le quali la mole è soltanto una di esse.
Per quanto riguarda i libri da consigliarti, ce n'è davvero tanti.
Dovresti dirmi se leggi in inglese, oppure solo in italiano e inoltre, se
vuoi approfondire la programmazione (VBA), oppure no.
Giovanni
Post by LeonardoTT
Mi sono inbattuto in questo limite giusto questa mattina infatti :)
In realtà i campi potrebbero essere ben più di 256, ma non mi resta
altro che rigirare tutto quanto, convertendo 255 campi in 255 record;
Facendo due conti, ora come ora, ho 50,000 record, facendo la
trasposizione me ne verrebbero 255*50,000=12,750,000....
mmm, Non ho ancora provato, ma credo che, comunque rigiro sti dati,
comincino a diventare un po tantini da tenere in una tabella sola.
Certo potrei smistarli su piùtabellee poi le query le faccio su una
tabella alla volta e unisco il risultato.
Mi rendo conto ora che sto tirando un po' la corda, anche se comunque,
questo è più che altro una valutazione iniziale di fattibilità..
Alla fine se dovrò gestire tutta sta roba, mi converrà passare a
qualcosa di più adatto... chessò, mySQL.
... Ma a quel punto scaricherò il barile a qualcun altro :)
Vorrei comunque approfondire un po' SQL e access per lavori più
piccolini, mi sai per caso consigliare un sito/libro per beginner e
uno intermedio?
grazie tante,
ciao,
Leonardo
Post by Tarima
Ciao Leonardo,
il numero massimo di campi (non di record) per tabella è di 255.
Ciao
Giovanni
Post by Tarima
Ciao Leonardo,
per quanto riguarda il massimo numero di records, credo che il limite sia la
dimensione del file .mdb: al massimo 2 Gb
Il numero massimo di record per tabella è di 255.
Di questi limiti sono abbastanza sicuro fino alla versione 2002.
Capisco che devi importare un file generato da un altro sistema, tuttavia
trovo inquietante l'eventualità di avere un numero di campi così elevato.
Access è un db relazionale. Hai pensato di normalizzare il db, dopo aver
importato i dati in una tabella di transito?
Infine, con VBA puoi sicuramente saltare le righe che vuoi, ma non c'è una
funzione specifica. Devi scrivere una routine usando le funzioni di accesso
ai file (Open, Write, Close). Se fai una ricerca con google, trovi
sicuramente qualche esempio.
Ciao
Giovanni
Post by Tarima
Ciao Leonardo,
se davvero le tretabellesono identiche, se tutti i campi sono numerici e
contengono dei valori diversi da Null, potresti fare un piccolo programmino
per fare ladifferenzadi cui hai bisogno, utilizzando un riferimento
numerico per individuare i campi.
Infatti, ci si può riferire ai campi delletabellein vari modi, uno dei
quali è
<Nome tabella>.Fields(n).value
Il primo campo di ogni tabella è il campo con ordinale zero e quindi, il suo
contenuto sarà: <Nome tabella>.Fields(0).value.
Il centesimo campo sarà: <Nome tabella>.Fields(99).value.
Sub ....
Dim i as Integer
Dim k as Integer
Dim rsA as DAO.Recordset
Dim rsB as DAO.Recordset
Dim rsC as DAO.Recordset
Set rsA = CurrentDB.OpenRecordSet(<Nome tabella A>)
Set rsB = CurrentDB.OpenRecordSet(<Nome tabella B>)
Set rsC = CurrentDB.OpenRecordSet(<Nome tabella C>)
Do Until rsA.Eof()
rsC.Edit
For i = 0 to 99
rsC.Fields(i).Value = rsA.Fields(i).Value - rsB.Fields(i).Value
Next i
rsC.Update
...
leggi tutto
LeonardoTT
2008-05-06 21:25:16 UTC
Permalink
Grazie della dritta sul SQL Server, non ci avevo mai pensato!
Seguirò il consiglio: pochi campi e tanti record è meglio...
Ok per la procedura con file csv.
Vedrò di mettere a frutto queste cose appena potrò e posterò il
risultato, così almeno saprai come è andata a finire questa
ingarbugliata faccenda.

Grazie per aver trasmesso online un po' della tua esperienza,

Leonardo
Post by Tarima
Ciao Leonardo,
mi fai venire il mal di testa :)
Andiamo con ordine.
La parte "anagrafica" te la devi costruire tu in qualche modo.
Ad esempio, metti in una cartella tutti i files del tipo (2), li processi
uno ad uno, aggiungendo man mano alla tabella dei sensori il sensore del file
corrente.
Dalla volta successiva, prima di aggiungere un nuovo sensore, dovrai
verificare che non ci sia già.
- Apri il file .csv del tipo (1).
- Individui il sensore e recuperi il suo ID dall'anagrafica.
- Aggiungi il record di movimento alla relativa tabella (IDLettura,
IDSensore, ValoreMinimo, ValorMassimo, ValoreMedio).
- Chiudi il .csv.
Tieni presente che è meglio avere un milione di record in una tabella di 5
campi, che
centomila record in una tabella di 50 campi.
Prova a fare un prototipo per capire fino a che punto puoi spingerti con
Access.
Se raggiungi velocemente il limite, puoi passare a SQL Server 2005: gratuito
(nella versione Express), e altamente scalabile:http://www.microsoft.com/sql/prodinfo/features/compare-features.mspx
Ciao
Giovanni
Post by LeonardoTT
Cia Giovanni, grazie mille per la bibliografia.
Per il formato del file di testo, che sono banali file tabellari csv,
(1) simile a quelle che mi proponi
IDLettura, IDSensore, ValoreMinimo, ValorMassimo, ValoreMedio
(2) questa in realtà produce 3 file, ognuno quella con tanti campi
quanti sono i sensori che mi interessano
file1: IDLettura, ValoreMinimoSensore1,... , ValoreMinimoSensoreN
file2: IDLettura, ValoreMassimoSensore1,... , ValoreMassimoSensoreN
file3: IDLettura, ValoreMedioSensore1,... , ValoreMedioSensoreN
La parte di "anagrafica" non la vedo nemmeno in questi files.
Fare il grafico di VelocitàMedia vs PotenzaMedia per tutte le letture
in cui l'aereo volava orizzontale a circa 2000 metri.
Facciamo finta che
- Volare orizzontale significa che lo scarto tra il massimo e il
minimo della VelocitàVerticale, all'interno della lettura, sia tra -1
e +1 m/s
- volare a circa 2000 metri significa che lo scarto max-min della
quota sia tra -100 e +100 metri
(Ora forse si capisce il perchè della domanda iniziale: fare la
differenza tra due tabelle)
Correggimi se sbaglio, ma basta che, nel caso del formato (1), ricavo
gli IDLettura (distinti) per cui sono rispettate le condizioni che
cerco e poi li uso per prendere i record dei parametri che mi servono
relativi a quelle letture; il tutto in una sola query.
Nel caso del formato (2) basta che seguo la macro che mi avevi
indicato all'inizio.
In sostanza la soluzione ce l'ho in entrmbi i casi :)
Mi rimane solo un cruccio: diciamo che dopo ogni volo importo in
access il file di testo formato (1), con una macro VBA che accoda i
dati sempre in una sola tabella, per quanto potrò andare avanti? La
settimanda scorsa un collega si è divertito a caricare 300 parametri
per tutti i voli usando il formato(1) (non so che sistema abbia usato)
e il risultato è un file access di 1.5 GB. Visto che siamo solo a metà
dell'attività, non è che poi è troppa roba per un solo file?
Grazie per la pazienza,
ciao,
Leonardo
Post by Tarima
Ciao Leonardo,
comincio dalla fine: alle ultime due domande non so proprio darti una
risposta, perché non ho esperienza al riguardo.
Per quanto riguarda il problema principale, premesso che non sono sicuro di
aver capito bene il tuo problema, io partirei dai dati di base (se
IDLettura, IDSensore, Tempo, Valore
nella quale il campo IDSensore rappresenta il collegamento (chiave esterna)
IDSensore, Nome, Posizione, ecc.
Ti puoi ritrovare facilmente con diverse centinaia di migliaia di record in
poco tempo, ma non è certo un problema.
A quel punto, sarai tu ad aggregre i dati come meglio ti aggrada,
eventualmente con tabelle e grafici pivot.
Il problema è com'è fatto il file di testo che hai a disposizione!
Potresti dover fare un programma che, analizzando il file riga per riga,
popoli le due tabelle,
separando la parte "anagrafica" dei sensori dalla parte "dinamica" delle
letture.
Access 2007 Bible - Wiley Publishing, Inc. - ISBN-10: 0-470-04673-2
978-0-470-04703-3
Ciao
Giovanni
Post by LeonardoTT
Grazie Giovanni,
i suggerimenti sono sempre ben accetti, specie da chi ha giusto
qualche anno di esperienza in più...
La mia conoscenza dei database è una semplice infarinatura tratta da
appunti di università e lettura dell'help di mysql.
Per la tesi avevo fatto un programma in visual basic che usava access
come base dati (giusto due o tre tabelle correlate tra loro), quindi
un po' di VBA lo digerisco senza grossi problemi.
I libri in inglese vanno benissimo.
Le esigenze che ho adesso, in termini di codice da scrivere sono
mooolto più semplici e peraltro dovranno rimanere tali, quindi
qualsiasi macro farò in futuro dovrà stare dentro un migliaio di righe
al massimo)
Scrivere software non è il mio mestiere ma saper fare qualche
programmino che mi semplifichi la vita farà sempre comodo, e poi,
sapere le potenzialità di certi strumenti può essere utile per
chiedere a qualcun altro di farlo per me :)
Mille grazie,
Leonardo
Se hai la curiosità di sapere che cosa ho tra le mani, ti ho scritto
due righe qui sotto (non posso entrare in dettagli, dato che si tratta
ho un certo numero di sensori su un aereo, ognuno di questi fornisce
un segnale che viene campionato ad una certa frequenza e di tutto
quanto viene fatto una specie di indice che riporta i valori medio,
minimo e massimo all'interno di intervalli di tempo definiti durante
il volo.
Nella mia mente, la trasposizione in tabella era semplice nel caso del
il valore del campo i al record j è il valore medio del parametro i-
esimo nell'intervallo di tempo j-esimo.
Quando servono tutti e tre, si potrebbero
- triplicare i campi
- usare solo tre campi (min,med,max) e "trasporre" i dati avendo, i
record saranno [Numero Parametri] x [Numero intervalli di tempo]
- avere tre tabelle.
Ora, esiste già un sistema officiale di gestione molto efficiente (non
ho idea di che DB ci sia dietro), ma non è molto interattivo.
La mia intenzione era solo provare a sfruttare i grafici pivot di
access, con i quali si possono fare facilmente grafici scatter con una
certa libertà, per dare un'occhiata ai dati prima di usare il sistema
ufficiale.
Attualmente, mi faccio restituire un file di testo con i parametri e i
record che mi servono, lo importo in access e faccio i grafici.
Avevo già una specie di query che mi produceva un file di testo con
256 parametri e avevo cominciato ad usare quella.
La differenza tra tabelle mi serviva per avere la differenza tra
massimo e minimo di circa un centinaio di parametri per tutti i record
che avevo nel file di testo (cioè tanti).
La domanda sull'intestazione era legata al fatto che nel file di testo
ha tre righe di intestazione prima dell'inizio dei dati.
Guarda, già che ci sono, ne apprifitto per farti un altro paio di
domande un po' fuori tema access, magari sono fortunato
- non è che per caso conosci qualche bel programma (gratuito o meno)
per plottare i dati? tipo 2D, 3D + linee di livello, grafici scatter
il cui colore cambia con il valore di un parametro (chessò, immagina
la traiettoria dell'aereo colorata in base alla velocità...)
- mi avevano suggerito matlab, ma alla fine ho scoperto che per
gestire tali quantità di dati, dovevo comprare un apposito toolbox,
oppure usare una libreria di interfaccia con mysql. questa soluzione
non ho mai avuto il tempo di implementarla e testarla: per caso
conosci qualcuno che l'abbia mai provata?
Grazie ancora!
Post by Tarima
Ciao Leonardo,
anzitutto, capisco che la mole di dati che hai davanti sia, per così dire,
imbarazzante.
Tuttavia, pur non conoscendo il campo di applicazione a cui i tuoi dati si
riferiscono, stento a credere che debbano risiedere tutti in una sola tabella.
Access (come il fratello maggiore SQL Server), è un database relazionale..
Ed il primo passo per gestire efficacemente una base dati relazionale è di
normalizzare i dati.
Scusami se ti faccio la predica. Probabilmente queste cose le sai già.
Ma, sono più di vent'anni che lavoro con le basi di dati e rarissimamente mi
è capitato di avere una tabella con più di 50 campi.
Inoltre, la scelta se gestire i dati con Access o SQL Server dipende da
diverse considerazioni, fra le quali la mole è soltanto una di esse.
Per quanto riguarda i libri da consigliarti, ce n'è davvero tanti.
Dovresti dirmi se leggi in inglese, oppure solo in italiano e inoltre, se
vuoi approfondire la programmazione (VBA), oppure no.
Giovanni
Post by LeonardoTT
Mi sono inbattuto in questo limite giusto questa mattina infatti :)
In realtà i campi potrebbero essere ben più di 256, ma non mi resta
altro che rigirare tutto quanto, convertendo 255 campi in 255
...
leggi tutto
Giovanni Caruso
2008-05-06 21:36:01 UTC
Permalink
In bocca al lupo e fammi sapere.
Ciao
Giovanni
Post by LeonardoTT
Grazie della dritta sul SQL Server, non ci avevo mai pensato!
Seguirò il consiglio: pochi campi e tanti record è meglio...
Ok per la procedura con file csv.
Vedrò di mettere a frutto queste cose appena potrò e posterò il
risultato, così almeno saprai come è andata a finire questa
ingarbugliata faccenda.
Grazie per aver trasmesso online un po' della tua esperienza,
Leonardo
Post by Tarima
Ciao Leonardo,
mi fai venire il mal di testa :)
Andiamo con ordine.
La parte "anagrafica" te la devi costruire tu in qualche modo.
Ad esempio, metti in una cartella tutti i files del tipo (2), li processi
uno ad uno, aggiungendo man mano alla tabella dei sensori il sensore del file
corrente.
Dalla volta successiva, prima di aggiungere un nuovo sensore, dovrai
verificare che non ci sia già.
- Apri il file .csv del tipo (1).
- Individui il sensore e recuperi il suo ID dall'anagrafica.
- Aggiungi il record di movimento alla relativa tabella (IDLettura,
IDSensore, ValoreMinimo, ValorMassimo, ValoreMedio).
- Chiudi il .csv.
Tieni presente che è meglio avere un milione di record in una tabella di 5
campi, che
centomila record in una tabella di 50 campi.
Prova a fare un prototipo per capire fino a che punto puoi spingerti con
Access.
Se raggiungi velocemente il limite, puoi passare a SQL Server 2005: gratuito
(nella versione Express), e altamente scalabile:http://www.microsoft.com/sql/prodinfo/features/compare-features.mspx
Ciao
Giovanni
Post by LeonardoTT
Cia Giovanni, grazie mille per la bibliografia.
Per il formato del file di testo, che sono banali file tabellari csv,
(1) simile a quelle che mi proponi
IDLettura, IDSensore, ValoreMinimo, ValorMassimo, ValoreMedio
(2) questa in realtà produce 3 file, ognuno quella con tanti campi
quanti sono i sensori che mi interessano
file1: IDLettura, ValoreMinimoSensore1,... , ValoreMinimoSensoreN
file2: IDLettura, ValoreMassimoSensore1,... , ValoreMassimoSensoreN
file3: IDLettura, ValoreMedioSensore1,... , ValoreMedioSensoreN
La parte di "anagrafica" non la vedo nemmeno in questi files.
Fare il grafico di VelocitàMedia vs PotenzaMedia per tutte le letture
in cui l'aereo volava orizzontale a circa 2000 metri.
Facciamo finta che
- Volare orizzontale significa che lo scarto tra il massimo e il
minimo della VelocitàVerticale, all'interno della lettura, sia tra -1
e +1 m/s
- volare a circa 2000 metri significa che lo scarto max-min della
quota sia tra -100 e +100 metri
(Ora forse si capisce il perchè della domanda iniziale: fare la
differenza tra due tabelle)
Correggimi se sbaglio, ma basta che, nel caso del formato (1), ricavo
gli IDLettura (distinti) per cui sono rispettate le condizioni che
cerco e poi li uso per prendere i record dei parametri che mi servono
relativi a quelle letture; il tutto in una sola query.
Nel caso del formato (2) basta che seguo la macro che mi avevi
indicato all'inizio.
In sostanza la soluzione ce l'ho in entrmbi i casi :)
Mi rimane solo un cruccio: diciamo che dopo ogni volo importo in
access il file di testo formato (1), con una macro VBA che accoda i
dati sempre in una sola tabella, per quanto potrò andare avanti? La
settimanda scorsa un collega si è divertito a caricare 300 parametri
per tutti i voli usando il formato(1) (non so che sistema abbia usato)
e il risultato è un file access di 1.5 GB. Visto che siamo solo a metà
dell'attività, non è che poi è troppa roba per un solo file?
Grazie per la pazienza,
ciao,
Leonardo
Post by Tarima
Ciao Leonardo,
comincio dalla fine: alle ultime due domande non so proprio darti una
risposta, perché non ho esperienza al riguardo.
Per quanto riguarda il problema principale, premesso che non sono sicuro di
aver capito bene il tuo problema, io partirei dai dati di base (se
IDLettura, IDSensore, Tempo, Valore
nella quale il campo IDSensore rappresenta il collegamento (chiave esterna)
IDSensore, Nome, Posizione, ecc.
Ti puoi ritrovare facilmente con diverse centinaia di migliaia di record in
poco tempo, ma non è certo un problema.
A quel punto, sarai tu ad aggregre i dati come meglio ti aggrada,
eventualmente con tabelle e grafici pivot.
Il problema è com'è fatto il file di testo che hai a disposizione!
Potresti dover fare un programma che, analizzando il file riga per riga,
popoli le due tabelle,
separando la parte "anagrafica" dei sensori dalla parte "dinamica" delle
letture.
Access 2007 Bible - Wiley Publishing, Inc. - ISBN-10: 0-470-04673-2
978-0-470-04703-3
Ciao
Giovanni
Post by LeonardoTT
Grazie Giovanni,
i suggerimenti sono sempre ben accetti, specie da chi ha giusto
qualche anno di esperienza in più...
La mia conoscenza dei database è una semplice infarinatura tratta da
appunti di università e lettura dell'help di mysql.
Per la tesi avevo fatto un programma in visual basic che usava access
come base dati (giusto due o tre tabelle correlate tra loro), quindi
un po' di VBA lo digerisco senza grossi problemi.
I libri in inglese vanno benissimo.
Le esigenze che ho adesso, in termini di codice da scrivere sono
mooolto più semplici e peraltro dovranno rimanere tali, quindi
qualsiasi macro farò in futuro dovrà stare dentro un migliaio di righe
al massimo)
Scrivere software non è il mio mestiere ma saper fare qualche
programmino che mi semplifichi la vita farà sempre comodo, e poi,
sapere le potenzialità di certi strumenti può essere utile per
chiedere a qualcun altro di farlo per me :)
Mille grazie,
Leonardo
Se hai la curiosità di sapere che cosa ho tra le mani, ti ho scritto
due righe qui sotto (non posso entrare in dettagli, dato che si tratta
ho un certo numero di sensori su un aereo, ognuno di questi fornisce
un segnale che viene campionato ad una certa frequenza e di tutto
quanto viene fatto una specie di indice che riporta i valori medio,
minimo e massimo all'interno di intervalli di tempo definiti durante
il volo.
Nella mia mente, la trasposizione in tabella era semplice nel caso del
il valore del campo i al record j è il valore medio del parametro i-
esimo nell'intervallo di tempo j-esimo.
Quando servono tutti e tre, si potrebbero
- triplicare i campi
- usare solo tre campi (min,med,max) e "trasporre" i dati avendo, i
record saranno [Numero Parametri] x [Numero intervalli di tempo]
- avere tre tabelle.
Ora, esiste già un sistema officiale di gestione molto efficiente (non
ho idea di che DB ci sia dietro), ma non è molto interattivo.
La mia intenzione era solo provare a sfruttare i grafici pivot di
access, con i quali si possono fare facilmente grafici scatter con una
certa libertà, per dare un'occhiata ai dati prima di usare il sistema
ufficiale.
Attualmente, mi faccio restituire un file di testo con i parametri e i
record che mi servono, lo importo in access e faccio i grafici.
Avevo già una specie di query che mi produceva un file di testo con
256 parametri e avevo cominciato ad usare quella.
La differenza tra tabelle mi serviva per avere la differenza tra
massimo e minimo di circa un centinaio di parametri per tutti i record
che avevo nel file di testo (cioè tanti).
La domanda sull'intestazione era legata al fatto che nel file di testo
ha tre righe di intestazione prima dell'inizio dei dati.
Guarda, già che ci sono, ne apprifitto per farti un altro paio di
domande un po' fuori tema access, magari sono fortunato
- non è che per caso conosci qualche bel programma (gratuito o meno)
per plottare i dati? tipo 2D, 3D + linee di livello, grafici scatter
il cui colore cambia con il valore di un parametro (chessò, immagina
la traiettoria dell'aereo colorata in base alla velocità...)
- mi avevano suggerito matlab, ma alla fine ho scoperto che per
gestire tali quantità di dati, dovevo comprare un apposito toolbox,
oppure usare una libreria di interfaccia con mysql. questa soluzione
non ho mai avuto il tempo di implementarla e testarla: per caso
conosci qualcuno che l'abbia mai provata?
Grazie ancora!
Post by Tarima
Ciao Leonardo,
anzitutto, capisco che la mole di dati che hai davanti sia, per così dire,
imbarazzante.
Tuttavia, pur non conoscendo il campo di applicazione a cui i tuoi dati si
riferiscono, stento a credere che debbano risiedere tutti in una sola tabella.
Access (come il fratello maggiore SQL Server), è un database relazionale..
Ed il primo passo per gestire efficacemente una base dati relazionale è di
normalizzare i dati.
Scusami se ti faccio la predica. Probabilmente queste cose le sai già.
Ma, sono più di vent'anni che lavoro con le basi di dati e rarissimamente mi
è capitato di avere una tabella con più di 50 campi.
Inoltre, la scelta se gestire i dati con Access o SQL Server dipende da
diverse considerazioni, fra le quali la mole è soltanto una di esse.
Per quanto riguarda i libri da consigliarti, ce n'è davvero tanti.
Dovresti dirmi se leggi in inglese, oppure solo in italiano e inoltre, se
vuoi approfondire la programmazione (VBA), oppure no.
Giovanni
Post by LeonardoTT
Mi sono inbattuto in questo limite giusto questa mattina infatti :)
In realtà i campi potrebbero essere ben più di 256, ma non mi resta
altro che rigirare tutto quanto, convertendo 255 campi in 255
...
leggi tutto
Loading...