Marcus: Suchabfrage von mehreren DB !

Hallo Brettgemeinde !

Bei mir läuft der IIS + ASP + Access im Intranet.
Nun habe ich eine Accessdatenbank mit 3 Tabellen.

Ich habe eine Suchmaske erstellt, wobei das
gesuchte Wort in einer der 3 Datenbanken ist.

Meine Abfrage soll erst die 1. Datenbank durchsuchen
und wenn da kein Ergebnis vorhanden ist zur nächsten
DB springen...etc.

mein Quellcode sieht wie folgt aus:

<%
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "tsmail","",""
Set Session("tsmail_conn") = conn
SQL = "Select * From Posteingang where subject Like '" & Request.Querystring("betreff") & "%'"
SQL = SQL & "And from Like '" & Request.Querystring("mailadresse") & "%'"
Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open sql, conn, 3, 3
IF rs.BOF AND rs.EOF Then GOTO Postbearbeitung
Else
%>

*** DARSTELLUNG von posteingang****

Postbearbeitung:
SQL = "Select * From postbearbeitung where subject Like '" & Request.Querystring("betreff") & "%'"
SQL = SQL & "And from Like '" & Request.Querystring("mailadresse") & "%'"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql, conn, 3, 3
IF rs.BOF AND rs.EOF Then GOTO Postausgang

Ich möchte das erst in der Tabelle POSTEINGANG nach
dem gesuchten Wort gesucht wird, falls es nicht gefunden
wird soll in der Tabelle POSTAUSGANG gesucht werden.

Ich wollte das mit GOTO ... lösen leider funktioniert
das nicht.
Hat jemand einen andere Lösung ?

cu

Marcus

  1. Hallo Marcus,

    Nimm doch verschachtelte If - Anweisungen.

    If in Posteingang Then Darstellung Posteingang
    Else If in Postbearbeitung Then Darstellung Postbearbeitung
           Else If in Postausgang Then Darstellung Postausgang
                  Else nicht gefunden.

    Ich hoffe, damit ist Dir geholfen.
    Gruß, Kess

  2. Ich möchte das erst in der Tabelle POSTEINGANG nach
    dem gesuchten Wort gesucht wird, falls es nicht gefunden
    wird soll in der Tabelle POSTAUSGANG gesucht werden.

    Ich wollte das mit GOTO ... lösen leider funktioniert
    das nicht.
    Hat jemand einen andere Lösung ?

    Hallo,

    probiers doch einfach mal einer Funktion:

    <%
    Private Function Search(strTablename)
    strSQL = "Select * FROM " & strTablename    rs.open strSQL, conn, 3, 3
        If Not rs.EOF Then
            Search = True
            Else
                Search = False
        End if
        rs.Close
    End Function
    %>

    Du rufst nun einfach die Funktion mehrfach mit den gewünschten Tabellennamen auf:
    <%
    Dim blnSearch
        blnSearch = False
    Dim aryTables(3)
        aryTables(0) = "Tabelle1"
        aryTables(1) = "Tabelle2"
        aryTables(2) = "Tabelle3"

    Do While Not blnSearch And i <= UBound(aryTables)
        blnSearch = Search(aryTables(i))
        i = i + 1
    Loop

    If blnSearch Then
        Call PrintRecords(aryTables(i - 1))
    End if

    Private Sub PrintRecords(strTablename)
       rs.open "SELECT * FROM " & strTablename
       Do while Not rs.EOF
          ...
          rs.Move Next
       Loop
       rs.Close
    End Sub

    ...
    %>

    Ich hoffe, daß ich jetzt auf die schnelle keinen Tippfehler drinhabe, aber das sollte so eigentlich gehen.

    Tscjau, Stefan

    1. Ich möchte das erst in der Tabelle POSTEINGANG nach
      dem gesuchten Wort gesucht wird, falls es nicht gefunden
      wird soll in der Tabelle POSTAUSGANG gesucht werden.

      Ich wollte das mit GOTO ... lösen leider funktioniert
      das nicht.
      Hat jemand einen andere Lösung ?

      Hallo,

      probiers doch einfach mal einer Funktion:

      <%
      Private Function Search(strTablename)
      strSQL = "Select * FROM " & strTablename    rs.open strSQL, conn, 3, 3
          If Not rs.EOF Then
              Search = True
              Else
                  Search = False
          End if
          rs.Close
      End Function
      %>

      Du rufst nun einfach die Funktion mehrfach mit den gewünschten Tabellennamen auf:
      <%
      Dim blnSearch
          blnSearch = False
      Dim aryTables(3)
          aryTables(0) = "Tabelle1"
          aryTables(1) = "Tabelle2"
          aryTables(2) = "Tabelle3"

      Do While Not blnSearch And i <= UBound(aryTables)
          blnSearch = Search(aryTables(i))
          i = i + 1
      Loop

      If blnSearch Then
          Call PrintRecords(aryTables(i - 1))
      End if

      Private Sub PrintRecords(strTablename)
         rs.open "SELECT * FROM " & strTablename
         Do while Not rs.EOF
            ...
            rs.Move Next
         Loop
         rs.Close
      End Sub

      ...
      %>

      Ich hoffe, daß ich jetzt auf die schnelle keinen Tippfehler drinhabe, aber das sollte so eigentlich gehen.

      Tscjau, Stefan

      Hi !

      Danke für die schnelle Antwort, jedoch
      habe ich probleme mit dem lesen deines Sourcecodes.

      Irgendwie schnalle ich das nicht :)

      cu
      Marcus

      1. <%
        ' --- Suche in verschiedenen Tabellen (strTablename)
        Private Function Search(strTablename)
        strSQL = "Select * FROM " & strTablename    rs.open strSQL, conn, 3, 3
        ' --- Rückgabewert True, wenn Ergebnisse gefunden wurden, False, wenn kein Ergebnis vorhanden ist.
            If Not rs.EOF Then
                Search = True
                Else
                    Search = False
            End if
            rs.Close
        End Function
        %>

        Du rufst nun einfach die Funktion mehrfach mit den gewünschten Tabellennamen auf:
        <%
        ' --- Boolescher Wert, um den Rückgabewert der Funktion Search abzufangen.
        Dim blnSearch
            blnSearch = False
        ' --- Array von 3 oder mehr ??? Tabellen anzugeben, die nacheinander abgefragt werden sollen.
        Dim aryTables(3)
            aryTables(0) = "Tabelle1"
            aryTables(1) = "Tabelle2"
            aryTables(2) = "Tabelle3"

        ' --- Wiederhole, solange der Wert von blnSearch = False und der Index von aryTables nicht überschritten ist.
        Do While Not blnSearch And i <= UBound(aryTables)
        ' --- Aufruf der Funktion Search.
            blnSearch = Search(aryTables(i))
            i = i + 1
        Loop

        If blnSearch Then
        ' --- Wenn blnSearch = True (DAtensätze gefunden), dann gib diese Sätze mit der Prozedur PrintRecords(Tabellenname) aus.
            Call PrintRecords(aryTables(i - 1))
        End if

        Private Sub PrintRecords(strTablename)
        ' --- Ausgabe der Datensätze aus der ermittelten Tabelle, die als erstes mind. 1 Satz zurückgibt.
           rs.open "SELECT * FROM " & strTablename
           Do while Not rs.EOF
        »»    ' --- Ausgabe des Datensatzes.
              ...
              rs.Move Next
           Loop
           rs.Close
        End Sub

        ...
        %>

        Hi !

        Danke für die schnelle Antwort, jedoch
        habe ich probleme mit dem lesen deines Sourcecodes.

        Irgendwie schnalle ich das nicht :)

        cu
        Marcus

        Hallo Marcus,

        ich probier mal, Kommentare in den Quelltxet einzufügen. Hoffe, damit kommst Du klar.

  3. Nun habe ich eine Accessdatenbank mit 3 Tabellen.
    Ich habe eine Suchmaske erstellt, wobei das
    gesuchte Wort in einer der 3 Datenbanken ist.

    Drei Tabellen sind nicht drei Datenbanken! (Eine Suche in mehreren Datenbanken wäre in der Tat ein anspruchsvolles Problem.)

    Meine Abfrage soll erst die 1. Datenbank durchsuchen
    und wenn da kein Ergebnis vorhanden ist zur nächsten
    DB springen...etc.

    Hat jemand einen andere Lösung ?

    Ich weiß zu wenig über Deine Tabellen und über Deine Aufgabenstellung.
    Ist es beispielsweise wichtig, wo der Treffer gefunden wurde? Sind die Tabellen gleich oder wenigstens kompatibel formatiert?

    In "richtigem" SQL könnte man die Suche ein einer UNION aus den drei Tabellen (oder geeigneten Projektionen derselben) durchführen.
    Wenn man dies statisch als View abspeichert, dann nimmt das Programm gar nicht mehr wahr, daß es mehr als eine Tabelle durchsucht ...
    Aber was Access angeht, bin ich da eher skeptisch, daß so etwas dort möglich ist.

    1. In "richtigem" SQL könnte man die Suche ein einer UNION aus den drei Tabellen (oder geeigneten Projektionen derselben) durchführen.
      Wenn man dies statisch als View abspeichert, dann nimmt das Programm gar nicht mehr wahr, daß es mehr als eine Tabelle durchsucht ...
      Aber was Access angeht, bin ich da eher skeptisch, daß so etwas dort möglich ist.

      Hallo Michael,

      auch in Access sind UNION-Abfragen gar kein Problem. Funktioniert hervorragend. Am einfachsten ist es natürlich, wenn man den SQL-Cose direkt eingibt. Dann kann man auch ohne Probleme DDL-Statements absetzen ,nur keine DCL-Anweisungen, :(
      Naja, aber ansonsten ist Access im Internet eigentlich gut zu gebrauchen, da die meisten ISP's keinen SQL-Server bereitstellen (außer gegen richtig Asche).

      Tschau, Stefan