Seite 2 von 2

Re: DB-Update über Formulare

Verfasst: Do, 17.03.2011 20:37
von F3K Total
Hallo DPunch, hallo Maddin,

da ich Autodidakt bin, ist mir die Verwendung einiger der Methoden und Properies, die ich über XRay sehen kann, nicht klar. Ich benutze sie zwar, weiß aber manchmal nicht genau was passiert, muß daher insbesondere bei der Reihenfolge oft herumprobieren.

Besonders über die Datenbeeinflussenden möchte ich gerne mehr wissen:
Was ist z.B der Unterschied zwischen SetString und UpdateString?
Wann und in welcher Reihenfolge führt man z.B. UpdateBoolean, UpdateRow, InsertRow, RefreshRow, Reload aus?

Kann mir vielleicht einer von Euch einen Tip geben, wo ich eine verständliche (Klartext, deutsch) Beschreibung der Properties und Methoden herbekomme? Und vielleicht einfache Beispiele, wie meines, für die Anwendung?
Darum bedeutet der Befehl:

Code: Alles auswählen

 oform.updateString(3,oKostenstelle)
eigentlich nicht weiter als: Trage den eben aus dem Listenfeld ausgelesenen String "oKostenstelle" in die Spalte "3" der an das Formular gebundenen Tabelle ein.
Danke Rik

Re: DB-Update über Formulare

Verfasst: So, 20.03.2011 14:21
von DPunch
Aloha
F3K Total hat geschrieben:Kann mir vielleicht einer von Euch einen Tip geben, wo ich eine verständliche (Klartext, deutsch) Beschreibung der Properties und Methoden herbekomme? Und vielleicht einfache Beispiele, wie meines, für die Anwendung?
Dafür wüsste ich keine Quelle.
XRay bietet aber einen Knopf "SDK documentation", der direkt die entsprechende Seite der API im Browser öffnet - dort findet sich die Beschreibung zu der ausgewählten Methode / Eigenschaft - allerdings auf englisch und nur selten mit Beispielen.

Re: DB-Update über Formulare

Verfasst: So, 20.03.2011 20:01
von F3K Total
Hallo, ja, das ist schade, ich habe auch noch keine Dokumentation dazu gefunden.

Mich würde vor allem interessieren, wann und in welcher Reihenfolge man die folgenden Befehle verwendet:

Code: Alles auswählen

.UpdateInt(), .UpdateBoolean(),.UpdateString ...
.UpdateRow()
.RefreshRow()
.Reload()
.isnew
Kannst Du vielleicht in wenigen Worten beschreiben, was die machen?
Was genau ist der Unterschied zwischen UpdateRow und RefreshRow?

Danke
Gruß Rik

Re: DB-Update über Formulare

Verfasst: Di, 22.03.2011 18:17
von DPunch
Aloha

Code: Alles auswählen

oform.updateString(3,"neuerString")
Aktualisiert das gebundene Feld der Spalte 3 mit dem String "neuerString". updateInt, updateBoolean etc funktionieren analog dazu.
Dabei ist zu beachten, dass z.B. ein Text (bzw Char/Varchar)-Feld in der Datenbank auch entsprechend mit updateString angesprochen werden sollte.
Intern passiert dies bei jedem Tastendruck in einem gebundenen Feld automatisch, in einem Makro muss zwingend dafür gesorgt werden, dass tatsächlich das gebundene Feld geändert wird, nicht nur z.B. der angezeigte Text in einer TextBox. Ansonsten "weiss die Datenbank nicht", dass überhaupt Änderungen vorgenommen wurden. Alternative Möglichkeiten zum updateX hatte ich ja bereits etwas weiter oben genannt.

Code: Alles auswählen

oform.UpdateRow()
Schreibt die aktuellen Daten aller gebundenen Felder in die Datenbank zurück. Im normalen Formularnavigator passiert dies z.B. durch einen Wechsel des Datensatzes.

Code: Alles auswählen

oform.RefreshRow()
Liest die aktuellen Daten des Datensatzes aus der Datenbank aus. Vergleichbar mit der Navigator-Funktion "Änderungen rückgängig". Änderungen am aktuellen Datensatz gehen verloren, wenn sie nicht vor in die Datenbank geschrieben wurden.

Code: Alles auswählen

oform..Reload()
Lädt das Formular neu. Ist z.B. notwendig nach dem Setzen von Filtern per Makro.

Code: Alles auswählen

oform.isNew
Überprüft, ob ein neuer Datensatz angelegt wurde.
So kannst Du z.B. mit der Abfrage

Code: Alles auswählen

If oForm.isNew Then
  oForm.insertRow
ElseIf oForm.isModified Then
  oForm.updateRow
End If
einen Datensatz ändern oder anlegen, je nachdem, wo sich der Cursor gerade befindet.
oForm.isNew wird immer dann als True ausgewertet, wenn sich der Cursor auf InsertRow befindet (also Datensatz anlegen) und ein Eintrag in mind. einem gebundenen Feld stattgefunden hat - s.o., das kann z.B. durch einen Tastendruck oder durch die updateX-Methode geschehen.
oForm.isModified wird entsprechend als True ausgewertet, wenn Änderungen an mind. einem gebundenen Datenfeld eines bestehenden Datensatzes stattgefunden haben.
Das Aufrufen von .updateRow bei einem neuen Datensatz führt zu einem Fehler, andersherum genauso.

Code: Alles auswählen

oForm.setString
Wird benötigt zur Arbeit mit Parametern.
z.B. wäre folgendes möglich:

Code: Alles auswählen

	oDoc = thisComponent
	oForm = oDoc.Drawpage.Forms(0)
	oForm.Command = "SELECT * FROM ""meineTabelle"" WHERE ""ID"" = ?"
	oForm.CommandType = 2
	oForm.setInt(1,2)
	oForm.execute
Das Fragezeichen steht dabei als Platzhalter für einen Parameter, per .setInt(1,5) wird beim Ausführen der Abfrage (.execute) das 1. gefundene Fragezeichen durch eine 5 ersetzt.
Anstatt direkt mit Filtern o.Ä. zu arbeiten und jedes Mal einen neuen Filtertext setzen zu müssen, kannst Du einfach nur entsprechend einmal die Abfrage festlegen (.Command) und beim Setzen der Filter brauchst Du dann lediglich den Paramter anzupassen (.setInt(1,x)) - analog dazu bei setString etc.
Der Unterschied zum Filter ist, dass per Filter nur die darauf zutreffenden Datensätze des ResultSets im Formular angezeigt werden und durch einfaches Deaktivieren alle Daten wieder sichtbar werden, whrend bei dieser Methode das ResultSet, und somit quasi das Formular selber, nur die zutreffenden Datensätze enthält.

Re: DB-Update über Formulare

Verfasst: Di, 22.03.2011 19:59
von F3K Total
Hallo DPunch,

vielen, vielen Dank für die ausführliche Beschreibung und dafür, dass Du Dir die Mühe gemacht hast.
Selbstverständlich ist das nicht.

Mir und vielen anderen werden Deine guten Erklärungen definitiv helfen, gute Formulare zu gestalten.

Klasse !!!

Beste Grüsse von Rik

PS:
habe die Nummer mit dem .Command:

Code: Alles auswählen

        oForm.Command = sql
        oForm.CommandType = 2
        oForm.execute
        oForm.reload
gerade ausprobiert um verschiedene "Filter" zu setzen, klappt prima!
Dabei habe ich festgestellt, dass man den CommandType auf 0 setzen muß wenn man den "Filter" wieder entfernen will.