Confronto record di un campo access

venerdì 20 luglio 2007 - 16.47

Anonimo Profilo | Senior Member



ciao
non riesco a risolvere un problema in access. Ho necessità di poter confrontare i record di un campo (es. campo1) presenti in una tabella access. I dati sono numerici ed ordinati in modo crescente. Nel campo2, voglio inserire, tramite una query di aggiornamento, il valore 1, se i due record consecutivi del campo 1 sono identici, il valore 0 (zero) se i due record consecutivi presenti nel campo1 sono diversi.
In excel la cosa si risolve facilemte con la funzione Se(a1=a2;0;1), ma il limite di excel è la limitatezza delle righe.
qualcuno mi può iutare?


grazie
Pietro

SSUPERPIPPO Profilo | Guru

Non credo che tu possa risolvere la cosa senza scrivere del codice VB.
Dovresti aprire la Tabella (Recordset) e verificare manualmente i record.

Se hai bisogno di help in tal senso fammi sapere.

Ciao

Ale

alx_81 Profilo | Guru

>ciao
Ciao

>non riesco a risolvere un problema in access. Ho necessità di
>poter confrontare i record di un campo (es. campo1) presenti
>in una tabella access. I dati sono numerici ed ordinati in modo
>crescente. Nel campo2, voglio inserire, tramite una query di
>aggiornamento, il valore 1, se i due record consecutivi del campo
>1 sono identici, il valore 0 (zero) se i due record consecutivi
>presenti nel campo1 sono diversi.
>In excel la cosa si risolve facilemte con la funzione Se(a1=a2;0;1),
>ma il limite di excel è la limitatezza delle righe.
>qualcuno mi può iutare?
Puoi fare un esempio concreto?
Mi serve per capire se lo devi fare anche per più di due consecutivi identici..
mi spiego
se hai
1
1
2
2
3
3
4
5
6

avrai che per il valore 1 il campo2 sarà 1
avrai che per il valore 2 il campo2 sarà 1
avrai che per il valore 3 il campo2 sarà 1
avrai che per il valore 4 il campo2 sarà 0
avrai che per il valore 5 il campo2 sarà 0
avrai che per il valore 6 il campo2 sarà 0

giusto?
ma se hai ad esempio:

1
1
1
2
2
2
3
3
4
5
5
5

come ti devi comportare? ti servono a due a due? oppure ti basta sapere se ce n'è più di uno?
e poi, l'inserimento nel campo2, deve essere per ogni ocorrenza?
tipo (primo esempio)

1 1
1 1
2 1
2 1
3 1
3 1
4 0
5 0
6 0

oppure ti serve un risultato del tipo

1 1
2 1
3 1
4 0
5 0
6 0


facci sapere.. perchè potrebbe essere possibile fare tutto con una sola query
>
>
>grazie
>Pietro

Alx81 =)

http://blogs.dotnethell.it/suxstellino

Anonimo Profilo | Senior Member

Ciao, possono esservi anche anche per più di due consecutivi identici, ad esempio:
11
20
21
31
40
40
40
40
41
51
61
71
80
80
8
etc
se riesci a trovare una soluzione, mi risolvi un problema per me enorme.
grazie

Pietro

alx_81 Profilo | Guru

>Ciao, possono esservi anche anche per più di due consecutivi
>identici, ad esempio:
>11
>20
>21
>31
>40
>40
>40
>40
>41
>51
>61
>71
>80
>80
>8

nel caso dei 40 cosa vuoi ottenere? Fammi un esempio del risultato finale che ti serve..
l'8 è un errore o è effettivamente lì? dopo l'80?
Alx81 =)

http://blogs.dotnethell.it/suxstellino

Anonimo Profilo | Senior Member

provo a spiegarmi meglio.
Sono 2 campi presenti nella TABELLA_DATI. Campo1 corrisponde contiene informazioni numeriche ed ordinate in modo crescente.
Il campo2 corrisponde al risultato che vorrei ottenere attraverso la query di aggirnamento. Desidero confrontare i record consecutivi (sono dati numerici ed ordianati in modo crescente) presenti nel campo 1. Se i due record sono identici il valore del campo2 deve essere 0, mentre se i valori del campo1 sono diversi il risultatto nel campo 2 deve essere 1. Ad esempio, se nel campo1 i due valori consecutivi sono 5 e 6, nel campo2, in corrispondenza del record in cui è memorizzato il numero 5 mi aspetto il risultato "1".
In excel, nel campo2, uso: =se(a1=a2;0;1)

ma non so se e come si riesca. Con il VBA forse?

Grazie

campo1 campo2 (risultato che vorrei ottenere)
1 1
2 0
2 1
3 1
4 0
4 0
4 0
4 0
4 1
5 1
6 1
7 1
8 0
8 0
8 1




Pietro

alx_81 Profilo | Guru

Ok, chiaro ..
Credo di essere riuscito ad ottenere quello che ti serve..
però ci sarebbe un'aggiunta da effettuare sul tuo mdb..

prendiamo una tabella simile alla tua, ma fatta in quest'altro modo:

id --> contatore autoincrementante
campo1 --> numero ordinato crescente
campo2 --> valore da aggiornare

In poche parole dovresti aggiungere l'id autoincrementante..
A questo punto, con la seguente query ricavi il risultato voluto (in sola lettura):
SELECT T1.id, T1.campo1, T2.campo1, IIf(T1.campo1=T2.campo1,0,1) AS Risultato FROM TABELLA_DATI AS T1 LEFT JOIN TABELLA_DATI AS T2 ON T1.id+1=T2.id;

Per aggiornare il campo due, basta utilizzare una UPDATE JOIN:

UPDATE TABELLA_DATI AS T1 LEFT JOIN TABELLA_DATI AS T2 ON T1.id+1=T2.id SET T1.campo2 = IIf(T1.campo1=T2.campo1,0,1);

Questo dovrebbe aggiornarti la tabella correttamente..
Ora provo a spiegare quello che ho fatto..
Come puoi vedere dalla prima SELECT, tramite l'id posso mettere in SELF JOIN (una join da una tabella a se stessa) la TABELLA_DATI. La relazione non è una join basata sulla semplcie uguaglianza di campi, ma è fondata sul legame tra l'id della seconda e l'id+1 della prima. In questo modo, pongo il record di una in relazione col successivo della stessa. La funzione IIF mi serve per controllare se i due campi, ora disposti sulla stessa riga, sono uguali ed in caso positivo, metto lo 0.
Con l'update aggiorno il campo "campo2" utilizzando la UPDATE JOIN, con la relazione indicata nella select (che ho scritto solo per farti cogliere la relazione e ciò che otterrai).
Fammi sapere se è quello che volevi..
ciao!

Alx81 =)

http://blogs.dotnethell.it/suxstellino

Anonimo Profilo | Senior Member

grazie mille

era quello che volevo. Mi hai risolto un grosso problema

ciao


Pietro
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5