VB6: maximaler Wert in einem lokalen Recordset ermitteln

Nix&Alleswisser

Grünschnabel
Hallo,

ich probiere das Forum einfach mal aus - bin ein New-User. Habe mich natürlich mit der Suche bemüht :(

Aufgabenstellung:
Eine Listbox stellt die Feldwerte mehrere Felder da, die z.B. durch Kommata und/oder Klammern getrennt werden. Der Anwender (AW) kann neue Einträge der Listbox hinzufügen, ändern oder löschen (über Textfelder und entsprechende Schaltflächen). Beim Schließen des Formulars werden die Änderungen in eine SQL-Tabelle zurückgeschrieben.

Vorgeschichte:
Ich habe aus der SQL-Tabelle ein Recordset (RS) nach VB6 geladen. Danach habe ich aus diesem RS noch einmal ein weiteres RS "rsListe" per Schleife erzeugt (nicht per Clone, da ich an "rsListe" noch eine weitere Spalte drangehängen musste - die gibt dann die Info, was mit dem Datensatz geschehen ist).

Das RS "rsListe" ist gut angekommen - die Tests für jedes Feld jedes "Datensatzes" des RS belegen dies. Das RS "rsListe" bleibt auch solange bestehen, bis das Formular geschlossen wird. Das ursprüngliche RS von SQL ist jetzt ohne weitere Bedeutung (existiert nicht mehr).

Problembeschreibung:
Im RS "rsListe" gibt es ein Feld "ID" mit Ganzahlwerte. Wenn der AW einen neuen Eintrag in die Listbox erfasst, bekommt gleichzeitig im Hintergrund das RS per rsListe.AddNew einen neuen Datensatz, mit der nächsthöheren ID (und den entsprechenden Eingabewerten in den Feldern).

Ich benötige nun einen Befehl, der mir den bisher höchsten ID-Wert aus diesem RS liefert. ACHTUNG: Ich arbeite nicht mit einer Tabelle, sondern nur mit einem RS, dass ständig erweitert werden kann. Am RecordsetCount kann ich das nicht festmachen, da die ID`s z.B. so lauten: 1, 2, 7, 12.

Man kann das auf 3 Arten lösen:
a) Schon beim Erzeugen des RS lasse ich mir von SQL ein Rückgabeparameter mitgeben, welcher mir die höchste ID angibt [in SQL per Max(Feldname) ermittelt]. Diesen lege ich in einer Variablen (Gültigkeit auf Formularebene) ab und sie wird immer hochaddiert.

b) Ich könnte das RS per Schleife im Feld ID durchlaufen lassen und immer, wenn es eine höhere ID ist, in einer Variablen ablegen. Zum Schluss dann habe ich den höchsten Wert der ID`s herausbekommen und kann damit weitermachen.

c) Ich gehe im RS zum letzten Datensatz und lasse mir die ID anzeigen. Das setzt aber voraus, dass das RS aufsteigend nach der ID erstellt wurde.

Nun a, b, c sind eigentlich Krücken. Gibbet es da nicht sowas ähnliches wie:
Max(rsListe("ID")) ? VB6 kennt den Befehl nicht.

Danke und Gruß
Nix&Alleswisser
 
Hallo,

wieso meinst du denn, dass diese drei Möglichkeiten Krücken sind? Die Ermittlung vom Maximalwert in einer Spalte ist eine Sache, für die die Abfragesprache des jeweiligen DBMS zuständig ist - weder ADO noch VB bieten da zusätzliche Möglichkeiten. Ich würde dir zu Variante a) raten, die dürfte am komfortabelsten sein - du müsstest halt zwischendurch das Recordset neu laden, um evtl. Änderungen zu übernehmen.

Grüße, D.
 
Hallo Dario,

das RS wird durch den Anwender ja ständig verändert, bis seine ListBox passend. Dann verlässt er das Formular und das rsListe wird dann an SQL übergeben. Im rsListe steht dann z.B. in der nachträglich angefügten Spalte "WhatToDo" z.B. ein kürzel für N = Neuer Datensatz in SQL anlegen oder L = Datensatz ist zu löchen in SQL (in der Listbox ist dieser Eintrag ja nicht mehr drin). SQL wertet diesen "WhatToDo"-Parameter dann aus.
Deswegen kann ich nicht ständig das RS neu laden.

Ich wollte ja nur mal fragen, ob es einen speziellen Befehl gibt, wie z.B. Max(rsListe("ID")). Gut, dann setze ich einmal auf Deinen Kenntnisstand und entscheide mich für Variante c, da ich in diesem Fall nur nach ID sortiere und es von daher den geringsten Aufwand macht.

Danke und Gruß (und frohe Ostern)
Nix&Alleswisser
 
Hi,

wie viele Benutzer können denn gleichzeitig auf die zentrale Datenbank zugreifen?

Eine andere Möglichkeit, außer SQL, zum Ermitteln des Maximums kenne ich weder in VB (ADO) noch in anderen Programmiersprachen, aber ich möchte nicht ausschließen, dass es vielleicht Systeme von Drittanbietern gibt, die das anbieten.

Gerade, wenn das Recordset ständig verändert wird, wäre es doch sinnvoller, den Benutzer direkt über Änderungen zu informieren, oder? Sonst bearbeitet er ja einen Datensatz, der zeitgleich von einem anderen gelöscht wurde und die Bearbeitungen gehen verloren. Oder zwei Benutzer fügen gleichzeitig den gleichen Datensatz ein. Ich an deiner Stelle würde nach jedem Einfügen, Löschen, Bearbeiten sofort eine Synchronisation mit der Datenbank ausführen lassen.

Aber ich weiß ja auch nicht genau, was das für Daten sind und wozu das Programm letztlich da ist.

Grüße, D.
 
Hallo Dario,

es ist eine Mehrbenutzerumgebung. Schön, dass Du Dir soviele Gedanken machst, was man beachten muss. Ich habe das z.B. durch entsprechende Sperrungen sicher gestellt, dass andere User erst einmal nicht in der Anwendung arbeiten können.

Es geht ja auch nur um eine Listenbox-Erstellung, wo die Werte dann in den Formularen zur Auswahl stehen. In den Ablagetabellen wird nur die ID hinterlegt, die zum Listeneintrag gehört. Das will ich jetzt nicht weiter vertiefen.

Warum ich nicht sofort nach jeder Listenänderung nach SQL zurückschreibe? Ganz einfach: Es gibt Anwender, die erst spät merken, dass sie ihre soeben erstellte Listbox recht verhauen haben (Einträge lassen sich z.B. auch nach oben oder unten verschieben, also man kann die Rangfolge der Listeneinträge ändern). Dann kann der Anwender einfach den Schalter "Liste zurücksetzen" betätigen, womit dann das RS geschlossen und die Listbox geleert wird und alles wird von SQL neu geladen, als hätte der Anwender gerade das Formular geöffnet.

Gruß
Nix&Alleswisser
 

Neue Beiträge

Zurück