Seite 1 von 1

In Base einen bestimmen Datensatz ansteuern

Verfasst: Fr 11. Feb 2022, 15:36
von Welsbach
Ich suche nun sehr lange nach einer Möglichkeit, in Base einen bestimmten Datensatz per Basic anzusteuern. Ich finde einfach keine Information darüber, aber ich kann nicht glauben, dass ich der erste und einzige bin, der auf diese Idee kommt.

Die Lage ist (stark verkürzt die): Ich ändere etwas an einem Datensatz und aktualisiere danach, damit alles seine Ordnung hat, das Formular. Nun ist alles, richtig, der geänderte Datensatz erscheint an der richtigen Stelle, aber der Datensatzcursor steht auf dem ersten Datensatz der Tabelle. Ich möchte aber, dass er weiterhin auf dem Datensatz steht, den ich gerade geändert habe. Nichts leichter als das, dachte ich, es kann ja nicht mehr als zwei Zeilen erfordern: die eindeutige Kennung des Darensatzes speichern, die Aktualisierung vornehmen und wieder zu dem Datensatz springen. Mit irgendwas wie »search (Spalte, ID)« muss da ja machbar sein.

Nun, ja. Bisher habe ich keinen Hinweis darauf finden können, dass ich programmgesteuert einen bestimmten Datensatz suchen und anzeigen kann. (Mit einem SQL-Befehl ist das einfach, aber ich will den Cursor in der Tabelle verschieben, nicht im Ergebnis einer Suche.)

Kann mir jemand sagen, ob das möglich ist? Oder gibt es wirklich nur die Möglichkeit, dass ich in einer Schleife die ganze Tabelle von Anfang bis Ende Datensatz für Datensatz durchsuche, bis der Datensatz gefunden ist?

Re: In Base einen bestimmen Datensatz ansteuern

Verfasst: Fr 11. Feb 2022, 17:03
von gogo
...Ich ändere etwas an einem Datensatz und aktualisiere...der Datensatzcursor steht auf...
wie änderst Du?
wie aktualisierst Du?
wie betrachtest Du Deine Daten?

Re: In Base einen bestimmen Datensatz ansteuern

Verfasst: Fr 11. Feb 2022, 17:11
von F3K Total
Moin,
kein Problem, das geht, allerdings wäre es hilfreich zu wissen, wie du per Makro auf die Datenbank/das Formular zugreifst.
Hier mal ein Beispielcode passend zu einem strukturellen Formular mit dem Namen F_Adressen.

Code: Alles auswählen

Sub Reload
    oForm = thisComponent.Drawpage.Forms.getbyName("F_Adressen")
    nRow =  oForm.Row
    print "Cursor steht in Zeile " & nRow
    oForm.reload
    Print "Formular aktualisiert, Cursor steht am Anfang"
    oForm.absolute(nRow)
    Print "Zurück zu Zeile " & nRow
End Sub
Beispieldatei anbei, einfach im Formular eine Zeile anwählen, dann auf den orangen Button klicken.
Gruß R

Re: In Base einen bestimmen Datensatz ansteuern

Verfasst: Sa 12. Feb 2022, 20:10
von Welsbach
Das hilft leider nichts. Wenn die Tabelle neu sortiert wird, steht der betreffende Datensatz nicht mehr in derselben Zeile. Ich kann also zu der Zeile springen, wo er vorher war, ich will aber bei diesem Satensatz bleiben. Das geht eigentlich ganz einfach: Ich speichere die eindeutige ID des Datensatzes und suche dann den Datensatz, der diese ID hat. Die Frage ist, wie kann ich den suchen? Gibt es dafür wirklich keine Methode, die das effizient erledigt?

Re: In Base einen bestimmen Datensatz ansteuern

Verfasst: Sa 12. Feb 2022, 21:22
von Wanderer
Welsbach hat geschrieben:
Sa 12. Feb 2022, 20:10
... Gibt es dafür wirklich keine Methode, die das effizient erledigt?
Die effektivste Methode dürfte sein, es der Datenbank zu überlassen, wie sie speichert.
Das entsprechende SQL-Kommando wäre ein

Code: Alles auswählen

UPDATE tabelle SET spalte = wert WHERE id-spalte = "gespeicherte id" 
Eine echte Datenbank sortiert normalerweise allenfalls den Index, nicht die gesamte Tabelle. Und einer der Vorteile einer Datenbank ist ja, dass man sich nicht mehr damit beschäftigen muss, wo etwas gespeichert wird.

Mfg, Jörn

Re: In Base einen bestimmen Datensatz ansteuern

Verfasst: So 13. Feb 2022, 09:56
von F3K Total
Moin,
ich glaube zwar nicht, dass es nötig ist, aber man kann das Formular natürlich nach dem Reload durchsuchen.

Code: Alles auswählen

Sub Reload
    dim nRow as long
    oForm = thisComponent.Drawpage.Forms.getbyName("F_Adressen")
    nid = oForm.columns.ID.getint' aktuelle ID speichern
    oForm.reload
    do
        wait 10
    loop until oform.isloaded
    oResultset = oForm.createResultSet
    oResultset.beforefirst
    nCounter = 1
    while oResultset.next
    nIDFound = oResultset.columns.ID.getint
    if nIDFound = nid Then
        nRow = nCounter' Zeile, in der die aktuelle ID gefunden wurde, merken
    endif
    nCounter = nCounter + 1
    wend
    oForm.absolute(nRow)' zur gefundenen Zeile springen
End Sub
Viel Spaß damit
Gruß R