Recordset.Filter -> wie kann man das in VB.net nachbilden

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Superuse.

    Recordset.Filter -> wie kann man das in VB.net nachbilden

    Hallo Community

    Ich habe folgende Problemstellung:

    Ich habe eine große Tabelle mit einem Artikelstamm die ich mit einem Datareader auslesen. Den kann ich ja von oben nach unten durchlaufen... Zu diesen Artikeln möchte ich jetzt aus einer anderen Tabelle aus einer anderen Datenbank (deshalb kann ich hier keinen Join anwenden) die dazu passenden Bestellungen suchen. Mit VB6 hätte ich jetzt hier einen Recordset genommen und dort alle offenen Bestellungen einfach reingeladen und den Datareader von oben bis unten durchlaufen lassen und den Recordset mittels Filter einfach auf die gleiche Artikelnummer runtergefiltert.
    Aktuell wüßte ich jetzt keine Lösung in VB.net, die mit Datareader oder ähnlichem das in kurzer Laufzeit machen kann. Ansonsten müßte ich 100.000 Anfragen an die zweite Datenbank abschicken, die prüfen, ob es eine Bestellung gibt. Das führt dann zu 99800 sinnlosen Abfragen...

    Zur Verdeutlichung...
    Ich habe einen Artikelstamm von 100.000 Artikeln und vielleicht 200 offene Bestellungen in der zweiten Tabelle.
    Ich möchte letztendlich die 200 offenen Bestellungen (es können auch mehrere den gleichen Artikel betreffen) den 100.000 Artikeln zuordnen...

    Wie würdet ihr das lösen?
    Willst du nur die Artikel laden, auf die von den Bestellungen aus verwiesen wird?
    Dazu müsste man die Bestellungen laden, von denen die ArtikelIDs extrahieren, und in einer Parametrisierten Abfrage mit hunderten von Parametern die entsprechenden Artikel laden.

    SQL-Abfrage

    1. select * from Artikel Where Artikel.ID in (?,?,?,?,?,....,?,?)
    So in der Art.

    Beide Tabellen kann man dann in ein typisiertes Dataset laden, von wo man aus weiter-verarbeiten kann - oder datengebunden anzeigen.
    Nein, ich brauche leider Artikel.

    Was ich da mache ist ein Abgleich eine Artikeldatenbank. Jeder Artikel hat einen Lagerbestand X. Von diesem Lagerbestand müssen die offenen Bestellung abgezogen werden. Diese kommen aus einem komplett anderen System.
    Danach wird der korrigierte Lagerbestande exportiert.
    eine Tabelle kann doch nur in einer Datenbank sein.
    Also wenn die Article-Tabelle in der einen Datenbank ist, dann updatest du - wie angedeutet - die eine Datenbank.
    Ist sie aber in der anderen Datenbank, so update halt die andere Datenbank - ebenfalls wie angedeutet.

    (ich bezweifel, die Frage richtig verstanden zu haben, denn so wie ich sie verstanden habe, ists eine echt dumme Frage, oder?)
    Ist das Problem so schwer zu verstehen?
    Ich habe 2 Datenbanken (nicht Tabellen). Deswegen kann ich keinen Join machen (mir wäre nicht bekannt, das ich einen Join über verschiedene Datenbanken geht).

    Abfrage aus der Artikeltabelle aus Datenbank 1:
    Ergebnis wäre dann:
    ArtNr. Lagerbestand
    123 5
    234 6
    235 1
    236 2
    ...

    Mit VB6 hätte ich das über einen Recordset gelöst:
    sql = "Select * from Bestellungen"
    cmd.CommandText = sql
    If rs.State = adStateOpen Then rs.Close
    rs.CursorLocation = adUseClient
    rs.Open cmd, , adOpenStatic, adLockBatchOptimistic
    rs1.Filter = "ArtNr = '" & gesuchteNr & "'"

    und dann einfach über einen Reader die erste Tabelle durchlaufen lassen und innerhalb der Schleife den Recordset immer auf die gesuchte Artikelnummer filtern. Wenn kein Ergebnis, dann ist eben keiner da.

    Jetzt müßte ich 100.000 mal eine Abfrage an die zweite Datenbank schicken, was sicher Ewigkeiten dauert... ... ist Laufzeittechnisch ein totaler Rückschritt
    tja - wenn man Nach-Fragen klar beantworten könnte...
    ZB in Post#2 frug ich:

    ErfinderDesRades schrieb:

    Willst du nur die Artikel laden, auf die von den Bestellungen aus verwiesen wird?
    Ein einfaches "Ja" hätte alle Unklarheiten beseitigen können.

    Wobei, du willst sie ja nicht eigentlich abfragen, sondern du willst sie updaten.
    Dafür das Sql gab ich dir bereits in Post#4.

    Und hier gilt mal wieder: Wenn man etwas nicht versteht, ist es besser, nachzufragen, statt zu ignorieren.
    Welche Datenbanken? MS SQL?
    Ich kan mich dunkel erinnern, dass man damit auch über mehrere Datenbanken hinweg verknüpfen kann.
    Nachtrag:
    Das Sind Verbindungsserver
    msdn.microsoft.com/de-de/library/ms188279.aspx
    und verwende Transaktionen !
    Pass auf, damit deine Bestände stimmen! Ich spreche aus Erfahrung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Coldfire“ ()

    Habs jetzt selbst gelöst... zwar über den Umweg über ein Grid, aber es läuft in ca. 10 Sekunden durch...

    VB.NET-Quellcode

    1. cmd = New MySqlCommand("Select sku, Quantitypurchased from Bestellungen where Status = 0 and Mandant = 'xxx'", cn)
    2. Dim ada = New MySqlDataAdapter(cmd)
    3. ada.Fill(ds, "Bestellungen")
    4. Do Until x = Me.DataGridView2.Rows.Count
    5. Suchbegriff = "sku='" & Me.DataGridView2.Rows(x).Cells(0).Value & "'"
    6. ds.Tables("Bestellungen").DefaultView.RowFilter = Suchbegriff
    7. DataGridView3.DataSource = ds.Tables("Bestellungen")
    8. If DataGridView3.Rows.Count > 1 Then
    9. me.Bestellungenabziehen()
    10. End If
    11. x = x + 1
    12. Loop