Newsgroup: it.comp.appl.access
Titolo: Come trovo la stringa ??

ciao amici di Ng Access... avevo già postato questo problema qualche
settimana fa ... ma nonostante un paio di suggerimenti ...non sono riuscito
a far funzionare il tutto....
in sostanza a me serve trovare in una tabella in un campo chiamato
N_Protocollo
la parte finale della stringa e cioè...esempio :  567/2000/G3456....
ove il primo numero è un contatore...
il secondo numero è l'anno in corso.....
il terzo è il numero di protocollo effettivo ed a me serve sapere se vi sono
dei doppioni !!
-------
con la query ricerca duplicati purtroppo mi trova solo se trova tutta la
stringa...
Cmq inserisco il cod sql della mia query... se mi dite come si può
modificare...
colgo l'occasione x augurare a tutti un Felice Natale...
--------------
SELECT DISTINCTROW First(Anagrafe.N_Protocollo) AS N_ProtocolloCampo,
Count(Anagrafe.N_Protocollo) AS NumDuplicati
FROM Anagrafe
GROUP BY Anagrafe.N_Protocollo
HAVING (((Count(Anagrafe.N_Protocollo))>1));

 stringa...
Se la stringa č a lunghezza fissa puoi semplicemente farti un campo
calcolato
che ti estragga solo i caratteri che ti interessano e poi lavoraresu quello;
ti basta inserire un colonna del tipo MioCampo: =Mid(Campo_n, dadove,
quanticaratteri ).
Certo a questo modo le prestazioni non saranno esaltanti, hai pensato
seriamente all'ipotesi di farti un nuovo campo (anzi, *campi*) che
contengano i dati che effettivamente utilizzi per le ricerche?
Se si ha modo di lavorare con un certo ordine meglio approfittarne...
Bye, Ste

 stringa...
che c'entra?
[cut]
la funzione che segue e' la stramaledetta token che ti avevo detto di
usare.
Apri un modulo, metticela dentro e salva il modulo con nome
quellochetipare (ma non Token).
Public Function Token(str As String, str1 As String, Num As Integer) As
String
    Dim i As Long
    Dim k As Long
    Dim n As Long
    Dim j As Long
    Dim str0 As String
    k = 0
    str0 = Left(str1, 1) & str & Left(str1, 1)
    For i = 1 To Len(str0)
     If InStr(str1, Mid(str0, i, 1)) > 0 Then
       If InStr(str1, Mid(str0, i + 1, 1)) = 0 Or i = Len(str0) Then
        k = k + 1
        If k = Num + 1 Then
            Token = Mid(str0, j + 1, n - j)
            Exit For
         Else
            j = i
        End If
       End If
     Else
        n = i
     End If
    Next i
End Function
 E poi usa la query che ti avevo descritto in precedenza!
cie' questa!
 SELECT Token(Anagrafe.N_Protocollo,"/",3) AS N_ProtocolloCampo,
Count(Anagrafe.N_Protocollo) AS NumDuplicati
FROM Anagrafe
GROUP BY Token(Anagrafe.N_Protocollo,"/",3)
HAVING (((Count(Anagrafe.N_Protocollo))>1));
-- 
Alessandro Cara

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
grazie Stefano x avermi risposto... come dicevo dal testo del mio
messaggio..sopra-riportato
la lunghezza non è fissa xchè la stinga N_Protocollo parte da
1/2000/F2345..esempio..da uno
che poi come dicevo è un campo contatore... 2000 è l'anno in corso...(poi
sarà 2001)
e l'effettivo valore che mi serve x trovare duplicati è l'ultima... che
questa può iniziare da uno fino al migliaio precedute da lettere F - G - I -
P - M  in pratica il protocollo vero e proprio...
mi serve sapere se vi sono due o + protocolli uguali....
personalmente non mi occorrono  "prestazioni esaltanti"... l'importante che
trovo i doppioni...
come posso fare.. ???
se devi suggerirmi qualche soluzione...ti pregherei di farlo nella maniera +
elementare possibile ...
grazie...


Premessa: il modo più semplice di fare quello che ti occorre è decidersi
ad estrapolare quel benedetto protocollo e sbatterlo in un campo tutto suo,
è assurdo tenere una informazione che ti occorre per delle ricerche
esclusivamente
concatenata ad altre informazioni!
Comunque, in A2000 io mi farei una funzioncina che, ricevendo come
parametro il valore del campo M_Protocollo, ritorni esclusivamente la
parte che mi interessa; qualcosa come:
----------------------------------------
Public Function MioCampo(valore)
'Attenzione, non sono sicuro che la funzione Split()
'sia presente anche nel VBA di Acc97....
arVal = Split(valore, "/")
ulval = arVal(UBound(arVal))
MioCampo = Mid(ulval, 2)
End Function
----------------------------------------
Questa ovviamente devi metterla in un modulo e salvare; a questo
punto potrai farti una query con un campo calcolato definito come:
Protocollo: = MioCampo([N_Protocollo])
Fatto questo su quella query puoi farci tutti i controlli/ordinamenti che ti
occorrono,
sarà sicuramente moooolto lenta poichè l'engine sarà costretta ad estrarsi
*tutti* i valori
di N_Protocollo per calcolarsi il nuovo "Protocollo" e poterci lavorare
sopra, ma tantè...
Se hai tanti record ti consiglio di fare una query di creazione tabella che
ti crei una tabella
(locale) con tutti i campi della tabella principale più il campo
"Protocollo" appena calcolato;
se invece hai la possibilità di variare la struttura della tabella la scelta
migliore è sicuramente
approfittare dell'occasione per aggiungere il campo in questione alla
tabella e farsi una query
da lanciare periodicamente che provveda a ricalcolarselo.
Bye, Ste

 quellochetipare (ma non Token).
-------------
ok Alessandro...non ti incazzare...purtroppo come dicono a Roma.. "sò de
coccio"...
non sono molto pratico di Access..
allora proverò ad aprire un modulo... faccio un copia-incolla con la
funzione Token che mi hai spedito...lo salverò non con il nome Token ...ma
Protoc.... giusto ???
e poi uso la query che mi hai spedito...pari pari... e vediamo se riesco a
far funzionare il tutto...
se non ci sentiamo prima di Natale... colgo l'occasione per farti i miei
migliori auguri a te e famiglia.
Ciao...

 ok Alessandro...non ti incazzare...purtroppo come dicono a Roma..
[cut]
Hai ragione mi sono "incazzato" e si che mi ero ripromesso di non farlo.
Ti chiedo scusa.
Buone Feste
-- 
Alessandro Cara