Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

PLZ-Suche per VBA

Begonnen von AccessMakesMeInsane, März 27, 2012, 16:36:10

⏪ vorheriges - nächstes ⏩

AccessMakesMeInsane

Hallo zusammen,
ich habe ein paar  Probleme, die ich nicht wirklich lösen kann.Vielleicht habt ihr ja ein paar Tips?!?

Ich will einen VBA-Code programmieren, mit dem ich nach Postleitzahlen/zuständigen Behörden suchen kann.
Die Daten sind in einer Tabelle mit folgendem Aufbau hinterlegt:
PK, PLZ, Stadt, Landkreis, Bundesland und eine für das Bundesland zuständige Behörde.

Fangen wir mal mit dem Einfachen an:
Ich will über eine InputBox die zu suchende PLZ eingeben, in dem Formular erscheint dann der zur PLZ gehörige Datensatz. Ich habe dann den Vorschlag von NoFear23m übernommen

http://www.access-o-mania.de/forum/index.php?topic=7449.0

und wie folgt adaptiert:


Private Sub cmd_LBSuche_Click()
Dim suche As String, datensatz As Long
Dim rs As Recordset
suche = InputBox("Bitte wählen Sie die PLZ", "Suche")
datensatz = Nz(DLookup("[id]", "tbl_LBPLZ", "[PLZ] = '" & suche & "'"), 1)


DoCmd.GoToRecord , "frm_LBSuche", acGoTo, datensatz
End Sub


Die Suche funktioniert auch, allerdings werden mir nicht die zur PLZ zugehörigen Datensätze ausgegeben.
Woran könnte das liegen?

Problem 2 ist schon etwas komplexer.In einem Bundesland gibt es die Besonderheit, dass unter Umständen eine andere Behörde zuständig ist. Es müsste also eine MsgBox erscheinen, die dies erfragt.Wenn dann "Nein" geantwortet wird muss die Standardadresse, bei "Ja" als Antwort in der muss eine andere Adresse ausgegeben werden.

Ich freue mich auf eure Tips.
Viele Grüße
Phil

DF6GL

Hallo,

wenn nicht de richtige Datensatz ausgegeben wird, funktioniert die Suche doch nicht ... ?


Der kann auch nicht so gefunden werden, weil bei GotoRecord der (relative) Recordset-Eintrag "angesprungen" wird und nicht derjenige bei dem der PK-Wert mit dem von der Dlookup-Funktion gelieferten Wert übereinstimmt.


Mach es besser so:
http://www.donkarl.com/?FAQ4


oder filtere das Formular-Recordset:

.
.
.
Me.Filter = "PLZ = '" & suche & "'"
Me.FilterOn =true
.
.


bzw. mit der Recordsource:

.
.
.
Me.Recordsource =" Select * from tbl_LBPLZ Where PLZ ='" & suche & "'"
.
.



zu 2)

wodran erkennt man denn, dass es eine weitere Behörde gibt oder geben könnte? Wenn es sich dabei nur um ein bestimmtes Bundesland handelt, dann könnte ja eine Überprüfung auch mit Dlookup bei den Datensätzen erfolgen, die dem bestimmten Bundesland entsprechen...




AccessMakesMeInsane

Hi DF6GL,
wieder mal vielen Dank für deinen Input.Ich werde es gleich ausprobieren.

Zu Zwei: Ob die zweite Behörde zuständig ist, weiß im Grunde nur der Computer oder eben ein Mastermind.;-)
Es hängt aber davon ab, ob die zu überwachende Firma, ihren Hauptsitz in einem bestimmten Regierungsbezirk hat. Wenn der Hauptsitz nicht dort liegt, ist auch die allgemeine Adresse zuständig.Liegt der Sitz aber da, wird die zweite Adresse ausgegeben. Das ist auch nur für 3 Regierungsbezirke so, alle anderen sind unproblematisch.

DF6GL

Hallo,

"weiß im Grunde nur der Computer "

nee, der weiß das doch nicht...  Damit er das wissen kann, mußt Du in einer Tabelle diese Informationen (vorher) hinterlegen...


"oder eben ein Mastermind"

ok, wenn der das nur weiß, (woher eigentlich=?),  dann muss eben bei JEDER Suche gefragt werden, ob eine zweite Behörde in Betracht kommt.

Im Grunde hört sich das Ganze nach einem unvollständigen Tabellen- und Beziehungskonzept an...

Beaker s.a.

Hallo Phil,
ZitatPrivate Sub cmd_LBSuche_Click()
  Dim suche As String, datensatz As Long
  Dim rs As Recordset

  suche = InputBox("Bitte wählen Sie die PLZ", "Suche")
  datensatz = Nz(DLookup("[id]", "tbl_LBPLZ", "[PLZ] = '" & suche & "'"), 1)
  DoCmd.GoToRecord , "frm_LBSuche", acGoTo, datensatz
End Sub
1. rs wird nicht verwendet
2. Franz meinte http://www.donkarl.com?FAQ4.4
3. mache ich das auch so (also per Bookmark)
Diese Vorgehensweise lässt sich auch ganz prima in einer öffentlichen Sub kapseln, und ist dann in allen Formularen mit allen Datentypen verwendbar.
Etwa so:
Public Sub Bookmarken( _
        ByVal frm As Form, _
        ByVal varID As Variant, _
        ByVal edFeld As String)
   
    Dim strKrit As String
    Dim rst As DAO.Recordset
   
    Set rst = frm.RecordsetClone
   
    strKrit = BuildCriteria(edFeld, rst.Fields(edFeld).Type, "=" & varID)
    rst.FindFirst strKrit
   
    frm.Bookmark = rst.Bookmark

Ende_CleanUp:
    On Error Resume Next
    rst.Close
    Set rst = Nothing
    Exit Sub

Fehler:
    Select Case Err.Number
    Case 3021
    ' = kein aktueller Datensatz
    'passiert beim Öffnen von Formularen, die diese Sub in den Ereignissen Open und/oder
    'Current aufrufen, wenn die Datenherkunft leer ist oder
    'kein passender DS gefunden wurde
'ToDo: -> Meldung an Benutzer
        Err.Clear
        Resume Next
    Case Else
    End Select

End Sub

Aufruf    : Bookmarken(AufrufendesForm, SuchWert, FeldInDemGesuchtWird)
hth
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

AccessMakesMeInsane

Hallo zusammen,
danke für die Infos.Ich werde sie heute einbauen.

@Franz: Das der Computer es nicht weiß ist mir klar, deswegen habe ich hinter die PLZ ein Kürzel hinterlegt.In den meisten Fällen reicht ein Kürzel (BW, BAY...), da es nur eine zuständige Landesbehehörde gibt. In einem Fall ist es jedoch so, dass eigentlich die oberste Behörde zuständig ist.In einem Regbezirk besteht die Behörde des RegBezirks jedoch darauf, dass sie informiert wird, wenn der Sitz der Firma in ihrem RegBezirk ist. Für die PLZ's in diesem RegBezirk habe ich ein zweites Kürzel hinterlegt. Über die Kürzel, die als FK definiert sind, erfolgt die Verknüpfung mit der Tabelle, in der die Adressen der Behörden hinterlegt sind.

Das Ganze müsste dann wahrscheinlich über zwei if-then-Geschichten im VBA-Skript ablaufen.
Also zum Ablauf wie ich es mir vorstelle:

Normalfall: Klick auf Search-Button im Frm ->Inputbox "Eingabe PLZ"->Suche->Ausgabe Behörde

Sonderfall: Klick auf Search-Button im Frm ->Inputbox "Eingabe PLZ" ->Suche->If Kürzel = "Kürzel2" ->Then MsgBox "Ist der Hauptsitz an der eingegebenen PLZ?" ->If MsgBox ="yes" -> then Ausgabe Behörde mit Kürzel 2 -> If MsgBox ="No" -> then Ausgabe Behörde mit Kürzel 1.

NB: Wenn hinter einem Satz ein ;-) steht, wie z.B. in meinem letzten Post hier
Zitatweiß im Grunde nur der Computer oder eben ein Mastermind.;-)
, dann ist der ironisch gemeint...

Stapi

Hallo

Ich würde in deinem Fall das wie @Franz das schon angerissen hat über die Filter Funktion machen, per Kombifelder Bundesland auswählen , im zweiten den Landkreis, im dritten die Postleitzahl. Mehrstufiger Filter über die Kombifelder.
Grüße aus dem schönen NRW
Stefan

AccessMakesMeInsane

Hallo zusammen,
ich würde gern noch mal das Thema aufgreifen.
Die Ausgabe des Datensatzes nach Eingabe der PLZ klappt inzwischen sehr gut.Ich habe das Formular aufgebaut, indem ich einen Query eingebaut habe.Dieser Query wird nach der Eingabe in das PLZ erneut ausgeführt und gibt den richtigen Wert aus.

Probleme bereitet mir nach wie vor der Spezialfall, in dem für bestimmte PLZ's eine andere Behörde zuständig sein kann.
Ich habe bei allen PLZ's die richtige Behörde hinterlegt, indem ich den Behördenschlüssel als Fremdschlüssel definiert und in die andere Tabelle verbunden habe.Bei dem Spezialfall gibt es dabei natürlich auch einen anderen Schlüssel. Nun muss, wenn dieser Schlüssel im Formular ist ein Dialog ausgeführt werden und zwar ungefähr so:

If "FK = Spezial" Then
MsgBox " Ist die Einrichtung hier ansäßig?" vbYesNo...
If vbNo then [Ausgabe normale Behörde where PK = Normal] ElseIf
vbYes then [ Ausgabe mit Behörde where PK = Spezial]

Es soll also die zuständige Behörde im Formular ausgegeben werden, abhängig davon, ob die Firma unter der PLZ ihren Hauptsitz hat (der Spezialfall) oder nur eine Zweigstelle.

Danke für eure Hilfe!

AccessMakesMeInsane

Habe das Problem heute dank meines fantastischen Kollegen gelöst:



Private Sub txt_PLZEingabe_AfterUpdate()

Dim spezial As Integer
Dim altePLZ As String

Me.Requery

If Me.txt_behoerdencode = "Sonderfall" Then
spezial = MsgBox("Ist die Firma hier ansäßig", vbYesNo, "Toller Titel")
     
   If spezial = vbNo Then
    altePLZ = Me.txt_PLZEingabe

' Die PLZ "40210" verweist auf die Behörde, die im Normalfall zuständig ist
    Me.txt_PLZEingabe = "40210"
    Me.Requery

'Die PLZ wird wieder zurück überschrieben, damit der User nicht verwirrt wird.
    Me.txt_PLZEingabe = altePLZ
    End If
   
    End If
   
End Sub