Makro - Finde best. Wert in Subformular und kopiere in Feld

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Makro - Finde best. Wert in Subformular und kopiere in Feld

Re: Makro - Finde best. Wert in Subformular und kopiere in F

von gogo » Mo, 31.01.2011 12:38

So da hab ich ja Blödsinn getextet...
gogo hat geschrieben:...
Zum reinen Update der Textfelder nach den SQL-Statements ersetzt Du einfach den Filterteil des Makros durch:

Code: Alles auswählen

dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Refresh", "", 0, Array())
...
Die Anzeige zu aktualisieren ohne Reload und ohne zu einem anderen Datensatz zu springen geht so:

Code: Alles auswählen

oForm.isModified = TRUE
oForm.refreshRow
(sieht auch eleganter aus ;) )

g

Re: Makro - Finde best. Wert in Subformular und kopiere in Feld

von gogo » Mi, 15.12.2010 02:53

Primär ging ich davon aus, dass die auszufüllenden Felder statische Daten darstellen, die buchhalterisch notwendig sind, oder die die Kontrolle der Eingaben möglich machen. Ein aktueller Datenstatus wie z.B. für einen Mahnbrief oä soll natürlich immer per aktueller Abfrage wiedergegeben werden.

... nachdem da ein Teilbetrag angegeben war nahm ich an, dass Teilzahlungen von Raten auch in der Ratentabelle gebucht werden. (Und nicht in einer untergeordneten "Teilzahlungstabelle"). Wenn das der Fall ist, kannst Du das 2. Update-Statement einfach auf

"Update ""Kunden"" set ""zuletztbezahlt"" = (SELECT SUM(""bezahlterBetrag"") FROM ...

ändern, dann wird auch bei gleichem Buchungsdatum die volle Summe des gesamten Buchungstages ermittelt.



Den Filter kannst Du in der Entwurfsansicht des Formulars löschen: Formular-Eigenschaften / Daten /Filter .... und da dann den String "IDKunde =2" oder was auch immer drinsteht rauslöschen. Formular speichern - fertig

Zum reinen Update der Textfelder nach den SQL-Statements ersetzt Du einfach den Filterteil des Makros durch:

Code: Alles auswählen

dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Refresh", "", 0, Array())
@DPunch:
meine letzte Änderung war:
Zuletzt geändert von gogo am Di, 14.12.2010 15:07, insgesamt 2-mal geändert.
und Dein Post um 15:26... *confused*

... und rausgenommen hab ich den schlauen Satz der mich schon so oft überrascht hat weil ich auf die Schnelle keine Zeit hatte clipnotics Post vom merkwürdigen Sortierverhalten beim Datum nachzugehen. Selbstverständlich hätte ich den Originalzustand wiederhergestellt, aber leider leider leider geht das aus beweistechnischen Gründen jetzt nicht mehr :lol:

g

Re: Makro - Finde best. Wert in Subformular und kopiere in Feld

von DPunch » Di, 14.12.2010 15:26

clipnotic hat geschrieben:Ich glaub das liegt daran - das der MAX Wert nur aus den ersten 2 Stellen des Buchungsdatums erzeugt wird
Das liegt ganz einfach daran, dass ein bei Strings ein lexikographischer Vergleich gemacht wird. Und da wird von vorne nach hinten durchgegangen.
Vorschlag: definiere das Feld "bezahltam" als Datum. ;)
(Ausserdem die Felder "bezahlterBetrag" und "FaelligerBetrag" noch mit Nachkommastellen versehen)
clipnotic hat geschrieben:Gibt es vielleicht auch die Möglichkeit irgendwie zu coden - "nehme den letzten Eintrag der Spalte "bezahlterBetrag"
Nicht direkt - was für Dich der "letzte Eintrag" ist, ergibt sich nur aus der momentanen Sortierung.
clipnotic hat geschrieben:(siehe Bilder unten: Abfrage die Summe anzeigt funktioniert - Abfrage um dann Name und Summe für Serienbrief zu erstellen erzeugt Syntax Fehler)
Vermutlich, weil Du das Feld "IDKunde" nicht in einer GROUP BY-Klausel verwendest, was aber aufgrund der Verwendung vom SUM (Aggregatfunktion) zwingend notwendig ist.

Als SQL würde Deine Abfrage in etwa so aussehen (Abfragen -> Abfrage in SQL-Ansicht erstellen -> Code copy-pasten):

Code: Alles auswählen

SELECT 
	"K"."IDKunde", 
	"K"."Name",
	(SELECT SUM("bezahlterBetrag") FROM "Raten" WHERE "IDKunde" = "K"."IDKunde") AS "bisherbezahlt",
	(SELECT "bezahlterBetrag" FROM "Raten" "R" WHERE "IDKunde" = "K"."IDKunde" AND "bezahltam" = 
		(SELECT MAX("bezahltam") FROM "Raten" WHERE "IDKunde" = "R"."IDKunde" AND "bezahlterBetrag" > 0)) AS "zuletztbezahlt"
FROM "Kunden" "K"
Als View oder Abfrage angelegt kannst Du daraus dann Serienbriefe erstellen... und brauchst die Daten nicht redundant und potenziell fehlerbehaftet in der Datenbank zu speichern
gogo hat geschrieben:Wenn SQL Abfragen einmal richtig geproggt sind, dann sind sie immer richtig - sagt die Logik ;)
Und der Changelog sagt, dass Du Dein Posting nach meinem nochmal geändert hast 8)

Re: Makro - Finde best. Wert in Subformular und kopiere in Feld

von gogo » Di, 14.12.2010 14:36

Gibt es vielleicht auch die Möglichkeit irgendwie zu coden - "nehme den letzten Eintrag der Spalte "bezahlterBetrag" Dann wäre nämlich auch noch eine Fehlerquelle mehr ausgeschlossen ??

gibt es, es muss sowieso eine SUM Funktion werden, denn was ist, wenn der Kunde an diesem Tag mehrere Raten bezahlt hat, dann hast Du garantiert eine falsche Zahl drin stehen...

g

Re: Makro - Finde best. Wert in Subformular und kopiere in Feld

von gogo » Di, 14.12.2010 13:39

(...)Dort wird anstatt 30,00 der Wert 50,00 eingetragen(...)
Wenn ich mir Dein Schaubild anschaue, macht das doch auch Sinn, die 30 sind ja auch nicht als bezahlt markiert.
Ein weiterer Stolperstein, nur einen Haken vergessen und es entstehen Fehler in Deiner Haupttabelle
nein, das hat schon seine Richtigkeit - der 'Fehler' dürfte in einem falschen Buchungsdatum liegen. Wenn Du genau hinsiehst, dann wirst Du feststellen, dass der zuletzt bezahlte Betrag am 29.10.2010 50 Euronen sind, die 30€ wurden schon am 27.9.2010 bezahlt 8)


g

Re: Makro - Finde best. Wert in Subformular und kopiere in Feld

von DPunch » Di, 14.12.2010 11:47

Aloha
Ja und mein Problem ist, dass ich z. B. die verschiedenen Ergebnisse aus den Unterformularen (Summe ... ) nicht zusammen in eine Abfrage mit den Standarddaten aus der Haupttabelle kriege.
Warum kriegst Du die Daten nicht in eine Abfrage, wenn Du sie doch auch per Abfrage auslesen kannst, um sie in die Haupttabelle zu schreiben? Das kann ich nicht nachvollziehen.
Nimms mir nicht übel, ich will Dir nicht zu nahe treten oder hier Klugscheissen, aber die momentane Struktur Deiner Datenbank ist redundant und fehleranfällig (z.B. wenn jemand eine Rate als bezahlt einträgt, aber, aus welchem Grund auch immer, vergisst, Deine Haupttabelle zu aktualisieren... dann geht ein netter Brief an einen Kunden raus, der eigentlich schon längst gezahlt hat. Kommt selten gut an.) - da Du hier gefragt hast, nehme ich einfach mal an, dass Du auch an Hilfe oder eher Ratschlägen in diesem Fall interessiert bist ;)
(...)Dort wird anstatt 30,00 der Wert 50,00 eingetragen(...)
Wenn ich mir Dein Schaubild anschaue, macht das doch auch Sinn, die 30 sind ja auch nicht als bezahlt markiert.
Ein weiterer Stolperstein, nur einen Haken vergessen und es entstehen Fehler in Deiner Haupttabelle ;)
Es gibt noch einen kleinen Haken(...)
Wenn Du schon auf Formularebene arbeitest, musst Du keine direkten Updates an die Datenbank absetzen - Du kannst die Werte auch in die entsprechenden Textfelder des Formulars schreiben und von dort aus in die Tabelle. Dann erübrigen sich Filter etc.

Code: Alles auswählen

	oDoc = thisComponent
	oDrawpage = oDoc.Drawpage
	oForm = oDrawpage.Forms(0)
	
	txtIDKunde = oForm.getByName("fmtIDKunde")
	txtBisher = oForm.getByName("fmtbisherbezahlt")

	sIDKunde = txtIDKunde.Text

	oConnection = oForm.ActiveConnection
	oStatement = oConnection.createStatement
	sSQL = "SELECT SUM(""bezahlterBetrag"") FROM ""Raten"" WHERE ""IDKunde"" = " & sIDKunde
	
	oResult = oStatement.executeQuery(sSQL)
	If oResult.Next Then
		txtBisher.BoundField.updateInt(oResult.getInt(1))
	End If

Re: Makro - Finde best. Wert in Subformular und kopiere in Feld

von DPunch » Di, 14.12.2010 07:06

Aloha

Darf man nachhaken, warum das unbedingt per Makro umgesetzt werden soll?
Meinem Verständnis nach sollte das komplett ohne Makros per Views und Subformularen ebenso möglich sein, dazu müsstest Du allerdings möglicherweise Deine Datenbank vorher normalisieren.

Re: Makro - Finde best. Wert in Subformular und kopiere in Feld

von gogo » Di, 14.12.2010 01:02

Werte "suchen und finden" ist vielleicht nicht der richtige Weg. Versuch mal das:

Button im Formular anlegen und mit folgendem Makro verknüpfen:

Code: Alles auswählen

Sub RatenStatus_Updaten()

oDoc = StarDesktop.CurrentComponent
oForm = oDoc.DrawPage.Forms.GetByIndex(0)

'Ermittelt die aktuelle KundenID
oFeld = oForm.getByName("fmtIDKunde")
sIDKunde = oFeld.text

' SQL-Statements
oStatement = ThisDatabaseDocument.CurrentController.ActiveConnection.createStatement

oResultSet = oStatement.executeQuery( "Update ""Kunden"" set ""bisherbezahlt"" = (SELECT SUM( ""bezahlterBetrag"" ) FROM ""Raten"" WHERE ""IDKunde"" = " + sIDKunde + ") where ""IDKunde"" =  " + sIDKunde)

oResultSet = oStatement.executeQuery( "Update ""Kunden"" set ""zuletztbezahlt"" = (SELECT ""bezahlterBetrag"" FROM ""Raten"" WHERE ""bezahltam"" in (SELECT MAX( ""bezahltam"" ) FROM ""Raten"" WHERE ""IDKunde"" = " + sIDKunde + ") AND ""IDKunde"" = " + sIDKunde + ") where ""IDKunde"" = " + sIDKunde )

oResultSet = oStatement.executeQuery( "Update ""Kunden"" set ""naechstefaelligam"" = (SELECT MIN( ""Faelligam"" ) FROM ""Raten"" WHERE ""bezahlt"" = False AND ""IDKunde"" = " + sIDKunde + ") where ""IDKunde"" = " + sIDKunde )

'legt einen Filter an und laed das Formular mit den aktualisierten Daten neu
oForm.filter = "IDKunde = " + sIDKunde
oForm.ApplyFilter=true
oForm.reload

end Sub
Wenn Du das Zeug mit "sIDKunde" in eine Beziehung auf Kunden-ID-Basis umformst, dann kann Deine Datenbank komplett aktualisiert werden (alle Kunden mit einem Klick)

g

Nach oben