Seite 1 von 1
Base: Formulardaten per Basic abspeichern
Verfasst: Sa, 18.06.2011 22:40
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
Re: Formulardaten per Basic abspeichern
Verfasst: Sa, 18.06.2011 23:49
von F3K Total
Hallo,
ohne genau zu wissen wie das Makro arbeitet, hier ein Versuch:
nimm statt
Code: Alles auswählen
if oform.isnew then
oform.insertrow()
oform.updaterow()
else
oform.updaterow()
endif
Gruß R
Re: Formulardaten per Basic abspeichern
Verfasst: So, 19.06.2011 00:18
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.
Re: Formulardaten per Basic abspeichern
Verfasst: So, 19.06.2011 00:52
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.
Re: Formulardaten per Basic abspeichern
Verfasst: So, 19.06.2011 01:12
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?
Re: Formulardaten per Basic abspeichern
Verfasst: So, 19.06.2011 08:42
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
Re: Formulardaten per Basic abspeichern
Verfasst: So, 19.06.2011 09:38
von Noebian
Hi, ich habe es probiert, aber leider ohne Erfolg. Dieses Kontrollfeld scheint ohne Funktion zu sein - der Cursor bleibt wo er ist.
Re: Base: Formulardaten per Basic abspeichern
Verfasst: So, 19.06.2011 10:32
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
Re: Base: Formulardaten per Basic abspeichern
Verfasst: So, 19.06.2011 16:31
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?
Re: Base: Formulardaten per Basic abspeichern
Verfasst: So, 19.06.2011 19:16
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
viewtopic.php?f=18&t=44201
Gruß R
Re: Base: Formulardaten per Basic abspeichern
Verfasst: So, 19.06.2011 22:10
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"?
Re: Base: Formulardaten per Basic abspeichern
Verfasst: Mo, 20.06.2011 12:24
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.
Re: Base: Formulardaten per Basic abspeichern
Verfasst: Mo, 20.06.2011 22:52
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?
Re: Base: Formulardaten per Basic abspeichern
Verfasst: Mo, 20.06.2011 23:10
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.