2016-08-01 37 views
1

Ich habe zwei Tabellen, denen ich bei Vornamenfeldern beitrete, die manchmal einen mittleren Anfangs- oder zweiten Vornamen haben, mit einem Leerzeichen dazwischen. So könnte der Wert Jane M oder Jane Moriarty für die gleiche Person sein.Wie gehe ich mit #func um? Fehler in Zellen, in denen die Funktion nicht gilt?

(Ich bin auch auf Nachnamen und DOB Beitritt, aber das sind nicht Teil dieses Problems)

Zwischen den beiden Listen, hat man in der Regel den ganzen mittleren Namen, während der andere in der Regel die mittlere Initiale hat . Wegen dieser Diskrepanz muss ich den Platz und die Zeichen, die vor dem Beitritt folgen, anpassen.

den Text Ich möchte zu packen, bin ich

mit
LEFT(Patients.FIRST_NAME, Instr(Patients.FIRST_NAME, ' ',) -1) as FIRST_NAME_TRIM 

so weit, so gut. Für die Zellen, die weder einen anfänglichen noch einen zweiten Vornamen haben, z. Jane, Access gibt #func! zurück. Vermutlich weil die Instr keinen Platz finden kann. Wenn ich versuche, die getrimmte Variable zu verknüpfen, gibt Access einen Fehler aus. Wenn ich es auf diese Weise versuchen

SELECT var1, var2, var3, 
    LEFT(Patients.FIRST_NAME, Instr(Patients.FIRST_NAME, ' ') -1) as FIRST_NAME_TRIM, 
    LEFT(Roster.FST_NM, Instr(Roster.FST_NM, ' ') -1) as FST_NM_TRIM 
FROM Patients 
INNER JOIN Roster 
    ON FIRST_NAME_TRIM = FST_NM_TRIM; 

ich JOIN expression not supported

Wenn ich es auf diese Weise versuchen

SELECT var1, var2, var3, 
Patients_mod.FIRST_NAME_TRIM, 
Roster_mod.FST_NM_TRIM 
FROM 
    (
    SELECT var1, var2, var3, 
    LEFT(Patients.FIRST_NAME, Instr(Patients.FIRST_NAME, ' ') -1) as FIRST_NAME_TRIM 
    FROM Patients 
    ) as Patients_mod 
LEFT JOIN 
    (
    SELECT var1, var2, var3, 
    LEFT(Roster.FST_NM, Instr(Roster.FST_NM, ' ',) -1) as FST_NM_TRIM 
    FROM Roster 
    ) as Roster_mod 
ON Roster_mod.FST_NM_TRIM = Patients_mod.FIRST_NAME_TRIM; 

ich Syntax error in FROM clause bekommen, und ich sehe nicht einen Syntaxfehler.

So muss ich entweder das #func! Problem an erster Stelle verhindern, oder finde Code, der die Zellen ignoriert, die #func! haben.

Antwort

2

Zuerst benötigen Sie eine kleine VBA-Funktion, um den getrimmten Vornamen zu erhalten. Split() ist die beste Option, es funktioniert sowohl für Namen mit " " und ohne.

Diese Funktion wird in ein Standardmodul übernommen.

Public Function GetFirstName(vName As Variant) As Variant 

    If Len(vName) > 0 Then 
     GetFirstName = Split(vName, " ")(0) 
    Else 
     GetFirstName = Null 
    End If 

End Function 

Dann können Sie auf den berechneten Felder beitreten:

SELECT Patients.First_Name, Roster.FST_NM 
FROM Patients INNER JOIN Roster 
ON GetFirstName(Patients.First_Name) = GetFirstName(Roster.FST_NM); 

+0

Perfect (es mit LEFT JOIN auch funktioniert). Ich war überrascht, dass der Modulname keine Rolle zu spielen scheint. Könnte ich ein paar Funktionen in ein Modul stecken, oder ist es ein pro? Ich bezweifle, dass das eine gute Idee wäre, aber ich bin neugierig. – Rominus

+0

Sie können beliebig viele Funktionen in ein Modul einfügen (und es ist sehr üblich, mehrere in eins zu setzen). Der Modulname darf nicht der gleiche sein wie ein Sub/Function, ansonsten ist es egal. @ReidMcCamish – Andre

+0

ja, fand das auf die harte Tour! – Rominus