Base: Formulardaten per Basic abspeichern

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Noebian
****
Beiträge: 158
Registriert: Sa, 03.10.2009 18:00

Base: Formulardaten per Basic abspeichern

Beitrag von Noebian »

Hi,
ich habe ein Formular in Writer, das mit einer Tabelle in Base verbunden ist.
Im Formular existiert ein Button, der das ausgefüllte Formular ausdruckt und die eingegebenen Daten in eine Archiv-Tabelle einfügt. Das funktioniert soweit auch ganz gut - die Sache hat nur einen Schönheitsfehler: Das Feld, in dem der Cursor sich befindet, wird mit updateRow() nicht in die Tabelle geschrieben. Der Click auf den Button belässt aber leider den Cursor im letzten Feld. Was kann ich tun?



Moderation,4: bitte alle BASIC-Fragen im zuständigen Unterforum stellen; verschoben
Xubuntu 12.04 / AOO 4.0 / MySQL 5.2.40

herzliche Grüße aus Deutschlands Norden
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Formulardaten per Basic abspeichern

Beitrag von F3K Total »

Hallo,
ohne genau zu wissen wie das Makro arbeitet, hier ein Versuch:
nimm statt

Code: Alles auswählen

oform.updaterow()

Code: Alles auswählen

if oform.isnew then
oform.insertrow()
oform.updaterow()
else
oform.updaterow()
endif
Gruß R
Noebian
****
Beiträge: 158
Registriert: Sa, 03.10.2009 18:00

Re: Formulardaten per Basic abspeichern

Beitrag von Noebian »

Hallo, danke für deine Antwort.
Dein Vorschlag ändert aber leider nichts. Das Feld, in dem der Cursor sich befindet, wird ignoriert. Es funktioniert, wenn zuvor "Enter" gedrückt wurde. Dies war aber auch schon vorher so, denn dann springt der Cursor ja in ein anderes Feld. Im Grunde geht es also darum, einen Bedienerfehler abzufangen.
Das Makro führt einen SQL UPDATE der einen auf die andere Tabelle aus. Da das Formular aber in das entsprechende Feld (noch) nichts geschrieben hat, bleibt das Feld leer.
Xubuntu 12.04 / AOO 4.0 / MySQL 5.2.40

herzliche Grüße aus Deutschlands Norden
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Formulardaten per Basic abspeichern

Beitrag von turtle47 »

Hallo,
Noebian hat geschrieben:Das Feld, in dem der Cursor sich befindet, wird mit updateRow() nicht in die Tabelle geschrieben.
Sende vor dem Update ein Commit auf das Feld.
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Noebian
****
Beiträge: 158
Registriert: Sa, 03.10.2009 18:00

Re: Formulardaten per Basic abspeichern

Beitrag von Noebian »

Hmm, das hört sich gut an...
Das Problem ist jetzt noch, dass nicht klar ist, in welchem Feld der Cursor steht, wenn der Button gedrückt wird. Kann man das irgendwie abfragen?
Xubuntu 12.04 / AOO 4.0 / MySQL 5.2.40

herzliche Grüße aus Deutschlands Norden
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Formulardaten per Basic abspeichern

Beitrag von F3K Total »

Hallo,
irgendwie konnte ich den Fehler nicht nachstellen, bei mir wurde der Datensatz immer abgespeichert, und der Cursor war nicht mehr im Feld.
Auch nicht, wenn ich den Button auf ein anderes Formular gelegt habe.
Dann habe ich "Fokkusieren bei Klick" abgestellt, der Cursor bliebt wo er war, die Daten wurden nicht abgespeichert.
Schau doch mal nach ob bei deinem Button "Fokkusieren bei Klick" an oder aus ist, und schalte es ggf. mal ein.
Dann sollte der Cursor beim Druck auf den Button automatisch aus dem letzten Feld springen.

Gruß R
Noebian
****
Beiträge: 158
Registriert: Sa, 03.10.2009 18:00

Re: Formulardaten per Basic abspeichern

Beitrag von Noebian »

Hi, ich habe es probiert, aber leider ohne Erfolg. Dieses Kontrollfeld scheint ohne Funktion zu sein - der Cursor bleibt wo er ist.
Xubuntu 12.04 / AOO 4.0 / MySQL 5.2.40

herzliche Grüße aus Deutschlands Norden
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Base: Formulardaten per Basic abspeichern

Beitrag von F3K Total »

Hi,
hast Du wirklich beim "Ausdruck-Button" "Fokkusieren bei Klick" an?
Wenn ja, solltest Du vielleicht doch die .commit methode, evtl. mit event.source.model verwenden, oder hier mehr Informationen bereitstellen, z.b. die Dateien hochladen.
Gruß R
Noebian
****
Beiträge: 158
Registriert: Sa, 03.10.2009 18:00

Re: Base: Formulardaten per Basic abspeichern

Beitrag von Noebian »

Hi, danke für deine Geduld :-)
Ja, ich habe "Fokussieren bei Klick" an und aus gemacht - aber ohne erkennbaren Unterschied. Merkwürdig...
event.source.model - ich habe mir den Wolf gegoogelt, aber nicht so recht etwas darüber gefunden, was mich weiterbringt. Hast du vielleicht mal einen Link für mich?
Xubuntu 12.04 / AOO 4.0 / MySQL 5.2.40

herzliche Grüße aus Deutschlands Norden
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Base: Formulardaten per Basic abspeichern

Beitrag von F3K Total »

Hallo,
mir kommt das Verhalten Deines Formulares buggy vor, wie gesagt, ich kann den Fehler mit einem Formular, was an eine Datenbank angebunden ist, nicht nachvollziehen.
Daher wäre es vermutlich zielführender, wenn Du die Dateien hochlädtst, natürlich verfremdet, aber man muß schon auf folgende Dinge schauen:
- Welche Felder sind wie mit der DB verbunden?
- Welchen Einfluß hat Dein "Druck-Makro", wie arbeitet es?
- Wie werden Die Daten in die zweite Tabelle geschieben, und warum gibt es sie überhaupt? Wäre es nicht einfacher der ersten Tabelle, die mit dem Formular verbunden ist, eine weitere Spalte, Boolean, "gedruckt" zu geben, und diese mit dem Druckauftrag auf "true" zu setzen?

Hier ein Beispiel von

Code: Alles auswählen

event.source.model
viewtopic.php?f=18&t=44201

Gruß R
Noebian
****
Beiträge: 158
Registriert: Sa, 03.10.2009 18:00

Re: Base: Formulardaten per Basic abspeichern

Beitrag von Noebian »

Hi - vorweg: ich habe jetzt das commit auf alle relevanten Felder gesetzt - damit funktioniert es.
Die Anwendung ist ein Bank-Überweisungs-formular. Ich habe die Lösung mit den zwei Tabellen gewählt, weil es mir als der einfachste Weg schien - Base unterstützt ja keine Kombinationsfeld mit mehreren gebunden Spalten.
Das Formular ist mit der Tabelle "tbl_Ueberweisung" verbunden. Bei der Eingabe eines Name in das Kombinationsfeld "Empfänger" wird ein Makro ausgelöst, das in der zweiten Tabelle "tbl_Archiv" nach dem Namen fahndet. Wird es fündig, dann füllt es die Spalten Bank, BLZ und Kontonummer der ersten Tabelle aus. Und zwar tut es dies, indem es per INSERT INTO direkt in die Tabelle "tbl_Ueberweisung" schreibt. Wenn der Name nicht bekannt ist, besteht eine zweite Abfrage bei der BLZ, diese fahndet nach bekannten Banken und trägt diese ggf ein.
Wenn die Überweisung fertig ausgefüllt ist, kann man sie ausdrucken und per Button die Daten ins Archiv übernehmen. Die Ursprungstabelle wird dabei geleert, so dass jedesmal mit einem leeren Überweisungsformular gestartet wird. Ich war eigentlich ganz stolz auf diese Lösung. (Ja ich weiß, ist anachronistisch in Zeiten von Online-Überweisungen, aber das hat schon seine Gründe...)
An einer Stelle hängt es nun allerdings noch - ganz kurios. Beim Eingeben des Betrages soll das Datumsfeld automatisch auf das Tagesdatum gesetzt werden. Also wird nach dem Aktualisieren des Betragsfeldes folgendes Makro ausgelöst:

Code: Alles auswählen

Dim strDBName, strSQL as String
Dim bTF as Boolean
objForm.updaterow()
strSQL = "UPDATE ""tbl_Ueberweisung"" SET ""Datum"" = "  & "'" & date() & "'" & "WHERE ""ID"" = " & "'0'"
bTF = objStatement.execute(strSQL)
MsgBox bTF
objForm.reload
Die Messagebox habe ich zu Debugzwecken eingesetzt: das Datum wird nämlich vom Formular nicht angezeigt. bTF steht auf "false" - es gibt aber keine Fehlermeldung und wenn ich die Datenbank öffne, steht das Datum in der Tabelle, wo es hingehört (warum dann also false??)
Auch ein manuelles Reload des Formulares bringt nichts - aktiviere ich allerdings den "Formular bearbeiten Modus" und gehe anschließend wieder in die Datenansicht, wird das Datum im entsprechenden Feld angezeigt. Merkwürdig, oder?
Vielleicht habe ich schon zuviel mit dem Formular herumexperimentiert, Datenbank-Anbindungen verändert etc....
Es sind halt meine ersten Gehversuche mit Base. Mit Access war ich schon deutlich weiter.

Nochmal: hast du vielleicht einen Link bzgl. "event.source.model"?
Xubuntu 12.04 / AOO 4.0 / MySQL 5.2.40

herzliche Grüße aus Deutschlands Norden
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Base: Formulardaten per Basic abspeichern

Beitrag von DPunch »

Aloha
Noebian hat geschrieben:es gibt aber keine Fehlermeldung und wenn ich die Datenbank öffne, steht das Datum in der Tabelle, wo es hingehört
Warum genau das so passiert, kann ich Dir ohne Testen zwar nicht erklären, aber
Noebian hat geschrieben:warum dann also false??
ergibt sich durch die Verwendung von ".execute". (API: Interface XStatement)
Returns
true if the next result is a ResultSet; false if it is an update count or there are no more results
Ein ".executeUpdate" würde Dir direkt die Anzahl der betroffenen Zeilen zurückliefern, das erscheint mir sinnvoller.

Davon abgesehen würde ich nicht mit "harten" Inserts arbeiten, wenn Du das auch über das Formular regeln kannst.
Wenn Du z.B. Deine "nach dem Aktualisieren"-Prozedur statt des Inserts so aufbauen würdest:

Code: Alles auswählen

	Dim myDate as new com.sun.star.util.Date
	myDate.Day = DAY(Date)
	myDate.Year = YEAR(Date)
	myDate.Month = MONTH(Date)
	objForm.updateDate(objForm.findColumn("Datum"),myDate)
erhältst Du ebenfalls das Tagesdatum, schreibst die Daten aber nur in die Datenbank, wenn Du den gesamten Datensatz speicherst.
Noebian
****
Beiträge: 158
Registriert: Sa, 03.10.2009 18:00

Re: Base: Formulardaten per Basic abspeichern

Beitrag von Noebian »

Ah, danke, das erklärt zumindest das "false".
Verstanden habe ich aber nicht, was du dagegen hast, direkt in die Tabelle zu schreiben? und warum so umständlich das Datum zusammenstoppeln? date() liefert doch das gewünschte Ergebnis?
Xubuntu 12.04 / AOO 4.0 / MySQL 5.2.40

herzliche Grüße aus Deutschlands Norden
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Base: Formulardaten per Basic abspeichern

Beitrag von DPunch »

Aloha
Noebian hat geschrieben:Verstanden habe ich aber nicht, was du dagegen hast, direkt in die Tabelle zu schreiben?
Nun, aus meiner persönlichen Sicht kann ich nur sagen, dass das keine saubere Arbeit ist und auf professioneller Ebene mehr als ein Problem verursachen würde.
Noebian hat geschrieben:date() liefert doch das gewünschte Ergebnis?
Tut es das?
Ich hatte den Eindruck, dass das genau dieses Thema der Ursprung Deines zuletzt geschilderten Problems war, ansonsten hätte ich ja gar nichts dazu gesagt.
Antworten