Newsgroup: it.comp.appl.access
Titolo: Aggiornare una tabella confrontando un campo contenente parte di  un'altro campo in un'altra tabella

Ho questo problema:
Ho due tabelle:
- la tabella A composta dai campi: Dati_grezzi (memo), ComuneID
(numerico), Telefono (testo), Fax (testo)
- la tabella B composta dai campi: IDComune (numerico), Comune
(testo), ecc..
Nella tabella A il campo Dati_grezzi è composto dal comune, dal
telefono, dal fax e da altre informazioni in ordine sparso (es.: "ACI
CATENA (CT) - tel 095-7684206 uff elettorale - inviare richiesta a
mezzo fax: 095-7645107 - att sig. Grasso uff elettorale -  ritornano
certificazione a mezzo fax -"), gli altri campi sono vuoti con lo
scopo di riempirli
Nella tabella B i dati sono ordinati e sono composti da un ID numerico
e dal nome del comune.
Voglio inserire nel campo ComuneID della tabella A l'IDComune della
tabella B in base alla corrispondenza tra il campo Comune (Tab. B) e
il comune nel campo Dati_grezzi (Tab. A).
Eventualmente trovare il telefono e il fax ed inserirli nei campi
predisposti.
Grazie


forse ti può essere di aiuto la funzione InStr() per testatre se
esiste una corrispondenza della descrizione comune nel campo memo
Dati_grezzi
ciao
Andrea Papi

 - Mostra testo tra virgolette -
Ho risolto con VB.
Ho creato due maschere, la prima (Confronto) contenente il campo
Dati_puliti e ComuneID, l'altra (TA_Comuni) con IDComune e Comune.
Nella maschera Confronto ho creato un pulsante a cui ho associato il
seguente codice Visual Basic:
[code]
Private Sub Confronta_Click()
    Dim MyComune As String
    Dim MyDatoGrezzo As String
    Dim TotDatiGrezzi As Integer
    Dim TotComuni As Integer
    Dim rsC As Object
    Dim rsD As Object
'imposta l'origine dati e apre la maschera Comuni
On Error Resume Next
    DoCmd.OpenForm "TA_Comuni"
ConfComuni_Loop:
    Form_TA_Comuni.RecordSource = "SELECT IDComune, Comune FROM
Uffici_Elettorali RIGHT JOIN TA_Comuni ON
Uffici_Elettorali.ComuneID=TA_Comuni.IDComune WHERE
(trim(Left([Comune],3))>='" & Trim(Left(Form_Confronto.Dati_Puliti,
3)) & "') AND (ID Is Null) ORDER BY Comune;"
Dati_Grezzi_Loop: 'inizia il loop per ogni dato grezzo
    Set rsC = Form_TA_Comuni.Recordset.Clone
    TotComuni = rsC.RecordCount
    If TotComuni = 0 Then Exit Sub
    Set rsD = Form_Confronto.Recordset.Clone
    TotDatiGrezzi = rsD.RecordCount
    If TotDatiGrezzi = 0 Then Exit Sub
    MyComune = Left(Trim(Form_TA_Comuni.Comune), 5)
    MyDatoGrezzo = Trim(Left(Form_Confronto.Dati_Puliti, 5))
    'se il comune è uguale al dato grezzo allora imposta ComuneID =
IDComune
    If MyDatoGrezzo = MyComune Then
        Form_Confronto.ComuneID = Form_TA_Comuni.IDComune
        GoTo End_Dati_Grezzi_Loop
    End If
    If Left(MyComune, 3) > Left(MyDatoGrezzo, 3) Then 'se le 3
iniziali del Comune sono > di quelle del dato grezzo
        If IsNull(Form_Confronto.ComuneID) Then
Form_Confronto.ComuneID = 0 'se ComuneID è nullo allora impostalo = 0
        GoTo End_Dati_Grezzi_Loop 'vai alla fine del loop Dati_Grezzi
    Else
        DoCmd.GoToRecord acDataForm, "TA_Comuni", acNext 'vai al
comune successivo
        GoTo Dati_Grezzi_Loop 'loop
    End If
End_Dati_Grezzi_Loop:
    Form_Confronto.Requery
    GoTo ConfComuni_Loop
End Sub
[/code]

 - Mostra testo tra virgolette -
Alcuni commenti non sono esatti perchè non li ho corretti prima di
incollarla qui.

 - Mostra testo tra virgolette -
Versione definitiva:
Private Sub Confronto_Click()
    Dim MyComune As String
    Dim MyDatoGrezzo As String
    Dim TotDatiGrezzi As Integer
    Dim rsD As Object
'imposta l'origine dati e apre la maschera Comuni
On Error Resume Next
    DoCmd.OpenForm "TA_Comuni"
ConfComuni_Loop:
    Form_TA_Comuni.RecordSource = "SELECT IDComune, Comune FROM Dati
RIGHT JOIN TA_Comuni ON Dati.ComuneID=TA_Comuni.IDComune WHERE
(trim(Left([Comune],3))>='" & Trim(Left(Form_Confronto.dati, 3)) & "')
AND (ComuneID Is Null) ORDER BY Comune;"
Dati_Grezzi_Loop: 'inizia il loop per ogni dato grezzo
    Set rsD = Form_Confronto.Recordset.Clone
    TotDatiGrezzi = rsD.RecordCount
    If TotDatiGrezzi = 0 Then Exit Sub
    MyComune = Trim(Form_TA_Comuni.Comune) & " "
    MyDatoGrezzo = Left(Trim(Form_Confronto.dati), Len(MyComune))
    'se il comune è uguale al dato grezzo allora imposta ComuneID
=IDComune
    If MyDatoGrezzo = MyComune Then
        Form_Confronto.ComuneID = Form_TA_Comuni.IDComune
        GoTo End_Dati_Grezzi_Loop
    End If
    If Left(MyComune, 3) > Left(MyDatoGrezzo, 3) Then
        If IsNull(Form_Confronto.ComuneID) Then
Form_Confronto.ComuneID = 0
        GoTo End_Dati_Grezzi_Loop
    Else
        DoCmd.GoToRecord acDataForm, "TA_Comuni", acNext
        GoTo Dati_Grezzi_Loop
    End If
End_Dati_Grezzi_Loop:
    Form_Confronto.RecordSource = "SELECT Dati.* FROM Dati WHERE
(((Dati.ComuneID) Is Null));"
    GoTo ConfComuni_Loop
End Sub
Ed in più, una funzione che ricava telefono, fax ed email da un testo:
Option Compare Database
Option Base 1
Function trova_dato_sparso(ByVal Cosa As Integer, ByVal Dove) As
Variant
On Error GoTo GotError
    trova_dato_sparso = Null
    If Cosa = 0 Then
        TestoDaCercare = Array("tel uff. elett.", "tel . uff.",
"tel.", "tel:", "telefono", "tel")
        MyLenght = 15
    ElseIf Cosa = 1 Then
        TestoDaCercare = Array("fax.", "fax:", "fax ufficio
elettorale", "fax uff elettorale", "fax ufficio", "fax")
        MyLenght = 15
    ElseIf Cosa = 2 Then
        TestoDaCercare = Array("email.", "email:", "email", "e-mail.",
"e-mail:", "e-mail", "posta elettronica")
        MyLenght = 100
    End If
    MyArLim1 = UBound(TestoDaCercare)
    For y = 1 To MyArLim1
        On Error Resume Next
        MyStart = InStr(Dove, TestoDaCercare(y))
        If MyStart = 0 Then
            GoTo NextY
        Else
            MyStart = MyStart + Len(TestoDaCercare(y))
            y = MyArLim1
        End If
        MyDove = Mid(Dove, MyStart, 100)
        If Cosa = 2 Then
            MyLenght = InStr(2, MyDove, " ")
            If MyLenght = 0 Then MyLenght = Len(MyDove)
        End If
        trova_dato_sparso = Trim(Left(MyDove, MyLenght))
        If Cosa = 0 Or Cosa = 1 Then
            MyReplace = Array(" ", ".", "-", "/")
        Else
            MyReplace = Array(" ", ":", "/")
        End If
        MyArLim2 = UBound(MyReplace)
        For z = 1 To MyArLim2
            trova_dato_sparso = Replace(trova_dato_sparso,
MyReplace(z), "")
        Next z
            If Cosa = 0 Or Cosa = 1 Then trova_dato_sparso = "0" &
Val(trova_dato_sparso)
            If trova_dato_sparso = "00" Or trova_dato_sparso = "" Then
trova_dato_sparso = Null
NextY:
    Next y
ExitSub:
    Exit Function
GotError:
    MsgBox Err.Description
    Resume ExitSub
End Function