BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Eing-Formular: Werte aus Tabelle inTabelle

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
sandstrahl
Beiträge: 3
Registriert: Mi 22. Aug 2012, 19:59

Eing-Formular: Werte aus Tabelle inTabelle

Beitrag von sandstrahl » Mi 22. Aug 2012, 20:24

Hallo,
(vorweg: ja, ich habe bereits gesucht, aber keinen passenden/hilfreichen Beitrag gefunden).

Mein "Problem" ist folgendes:

Ich möchte, daß als Default-Wert für ein Feld ein Inkrement verwendet wird.
(Achtung: nicht Auto-Wert; d.h. es muß noch von Hand änderbar sein).

Ich bin bisher soweit, daß ich dafür ein Makro brauche?
Welches ich über ein Ereignis ins Eingabe-Formular einbinden muß? (Falls das anders geht, wär auch gut; so wirklich toll finde ich die Liste der Ereignisse nämlich nicht -obwohl 'Fokuserhalt' schon paßt).

Nun muß ich dem Makro irgendwie sagen, daß es bitte
1.) den vorangegangenen/größten bisherigen Wert aus der Tabellenspalte nimmt (und dann +1 rechnet)
2.) den ermittelten Wert eingibt.

Kann mir jemand sagen, wie die entsprechenden BASIC-Befehle dafür lauten?

Ich habe etliche Basic-tutorials und -vokabellisten durchgeblättert, aber nichts passendes entdeckt.

(Genauegenommen ist es kein echtes Inkrement, sondern soll nur so lange hochzählen, wie ein Wert in einem anderen Feld sich nciht verändert, und dann wieder bei 1 anfangen... aber den Befehl für diese Berechnung kriege ich dann hoffentlich selber zusammengeschachtelt. Nur: deshalb kann ich nicht ein ggf. vorhandenes Inkrement-Makro verwenden).

Also, was mir erstmal fehlt sind die Befehle für: nimm aus der Tabelle und schreib(speicher) in das Feld
(Falls ich dafür dem Makro erstmal sagen muß, daß es die tabelle öffnen soll, bevor es sie lesen kann, oder so, wäre ich für einen Hinweis dankbar).

Da ich ziemlicher DB-Neuling bin und auch keine Ahnung von BASIC habe, würde ich mich über eine einfache Erklärung ganz besonders freuen! ;-)
Sollte ich etwas unklar formuliert haben, fragt bitte nach)

Vielen Dank schonmal!

sandstrahl

_____
P.S.: Bisher ist der Feldtyp 'ZAHL', da ich nur ganze Zahlen von 1-37 brauche. Falls es aus irgendeinem Grund 'INT' sein muß, kann ich das aber auch noch ändern.

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Eing-Formular: Werte aus Tabelle inTabelle

Beitrag von RobertG » Mi 22. Aug 2012, 21:35

Hallo Sandstrahl,

genau genommen musst Du zuerst eine Datenbankabfrage starten. Ich nehme nach der Schilderung jedenfalls an, dass Du in einem Feld lediglich wissen willst: Was ist die nächst höhere Zahl.
Solche Abfragen kannst Du über Makros realisieren. Die Verbindung zu einer Datenbank ist dabei eigentlich zu schaffen. Schau Dir vielleicht auch einmal das Handbuch Base, besonders das Kapitel zu den Makros in Base an: http://wiki.documentfoundation.org/imag ... os_V35.pdf
Dort steht an mehreren Stellen der Code drin, wie die Verbindung zur Datenbank erzeugt sowie eine Abfrage erstellt wird.
Der SQL-Code für so eine Abfrage müsste z.B. so lauten: SELECT MAX("Nummer") FROM "Tabelle"
Soll diese Nummer abhängig von einer anderen Eingabe sein, so wäre stattdessen zu schreiben: SELECT MAX("Nummer") FROM "Tabelle" WHERE "AndereNummer" = '...'
Die andere Eingabe müsste dann aus einem Formularfeld ausgelesen werden. Auch wie Werte aus einem Formularfeld ausgelesen werden können steht in dem Handbuch.
Schließlich musst Du den ermittelten Wert wieder in das Feld Deines Formulars und die darunterliegende Tabelle eintragen. Auch hier wieder der Verweis auf das Handbuch (oFeld.boundField.updateInt('Neue Zahl')) ...

Du siehst, so kurz zu erklären ist das nicht - vor allem, wenn eben erst aus einer Tabelle etwas ermittelt werden muss, denn schließlich ist in dem Formular keine Eingabe sichtbar, die jetzt nur um 1 erhöht werden muss.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

sandstrahl
Beiträge: 3
Registriert: Mi 22. Aug 2012, 19:59

Re: Eing-Formular: Werte aus Tabelle inTabelle

Beitrag von sandstrahl » Mi 22. Aug 2012, 22:19

Hallo Robert,

danke für die schnelle Antwort.

Naja, ich will nicht nur wissen, was die nächsthöhere Zahl ist -ich will auch, daß er diese eingibt. Also als Wert in die Tabelle speichert.
(Das ganze passiert ja in einem Eingabe-Formular).

Und genau das habe ich mit einer Abfrage wie aus Deinem Vorschlag (hatte mir schonmal wer geraten) eben nicht hinbekommen.
Es wurde zwar einmal ein 'Inkrement' erzeugt und angezeigt, aber nicht eingespeichert -so daß das Feld in der Tabelle keinen Wert erhält (und der Wert infolge natürlich auch nciht weiter hochzählt).
Außerdem gab es damit dann keine Möglichkeit mehr, den Wert ggf. von Hand zu ändern (wenn z.B. mal eine Nummer übersprungen werden soll).

Oder... kann ein Makro nicht direkt auf die Tabelle zugreifen?? Muß ich deswegen eine Abfrage zwischenschalten?
Wär verständlich... aber dann fehlen mir halt die Befehle, wie ich den Abfrage-Wert ins Makro kriege, sozusagen, und immer noch, daß das Makro diesen Wert(+1) in die Tabelle speichern soll.

Das andere, WHERE etc., sollte ich hinbekommen. (Die entsprechenden Befehle konnte ich in der Literatur finden, und ein wenig logischen Verstand habe ich ja schon ;) )

Das Handbuch habe ich (quergelesen), aber auch nichts gefunden, das mir helfen würde -mag sein, weil ich mich da schon auf Makros eingeschossen hatte, und dazu nicht viel im DB-Teil drinsteht -und im Makro-Kapitel sind keine Befehle, die mir helfen würden*. Werde aber morgen Deine konkreten Themenvorschläge nochmal genauer unter die Lupe nehmen.

Ein Bekannter (dessen Basic-Kenntnisse jedoch ein wenig eingerostet waren), sagte, es müsse diese Befehle geben.
Letztendlich könnte ich auch alles mögliche wie READ, WRITE, FIND, ENTER, INSERT, PRINT, SAVE ... munter durchprobieren (oer besser: raten) -aber ich befürchte, da spielt meine Geduld nicht mit. :lol:

___________-
*) Nachtrag: Konnte es natürlich doch nicht lassen und hab noch schnell reingeguckt... ich hatte überhaupt nicht das Handbuch, sondern die Getting-Startet-Version... :oops: -Ergo: danke für den link, ich werde mich dann erstmal daran abarbeiten. Aber das wirklich nicht mehr heute.

F3K Total
Beiträge: 2412
Registriert: So 10. Apr 2011, 10:10

Re: Eing-Formular: Werte aus Tabelle inTabelle

Beitrag von F3K Total » Do 23. Aug 2012, 20:45

Hallo,
habe etwas ähnliches vor kurzem gebaut, hier der Code:

Code: Alles auswählen

sub S_restart_ID
    oform = ThisComponent.drawpage.forms.MainForm
    oConnection = oform.activeconnection
    Sql_Statement = oConnection.createStatement
    sSql = "Select MAX( ""ID"") from ""Tabelle1"""
    Sql_Result = Sql_Statement.executeQuery(sSql)
    if Sql_Result.next then nMaxID = Sql_Result.getint(1)
    sSql = "Alter table ""Tabelle1"" alter column ""ID"" restart with "+(nMaxID + 1)
    Sql_Statement.executeupdate(sSql)
end sub 
Damit wird in einer Autowert-Spalte mit dem Namen "ID" aus der Tabelle "Tabelle1" der aktuell höchste Wert ermittelt und die Datenbank so vorbereitet, dass beim nächsten Speichern eines neuen Datensatzes die nächst höhere ID eingetragen wird, nicht vorher.

Viel Erfolg Gruß R
Windows 10: AOO, LO Linux Mint: AOO, LO

sandstrahl
Beiträge: 3
Registriert: Mi 22. Aug 2012, 19:59

Re: Eing-Formular: Werte aus Tabelle inTabelle

Beitrag von sandstrahl » Mo 27. Aug 2012, 15:34

Hallo,

habe zunächst das Handbuch durchgelesen, bin aber leider nicht schlauer als vorher, da dort zwar viele Beispiele vorgemacht, aber nirgendwo erklärt werden.

@ R (F3K):
Danke!
Allerdings habe ich dazu die gleiche Frage wie zu den Beispielen im Handbuch:

Was sind diese
ThisComponent.Drawpage.dingsda
??

(Könnte man statt der punktgetrennten Wortschlangen auch verschachtelte Befehle nehmen, wo ich die Chance habe, sie zu verstehen?)
--> ich verstehe einfach nicht, was da eingegeben wurde, weiß also nicht, wann/wo ich 'meine' Bezeichnungen einzugeben habe etc, wäre daher nichtmals in der Lage, es unverändert zu übernehmen... :cry:
Was ist Deine 'aktive Verbindung'?

Ansonsten: Den eigentlichen Ablauf habe ich wohl verstanden... vor allem, wie ich ein SQL-statement reinbringe! :D ... Danke!!
Sollte hoffentlich in der Lage sein, es auch für meine Bedürfnisse anzupassen. (Will ja eben keinen Auto-Wert, sondern nur einen Vorschlag etc.).

kann man DIM einfach weglassen?

JA, ich habe NULL Ahnung von Basic. (Bisher nur mal mit Fortran was gemacht).

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Eing-Formular: Werte aus Tabelle inTabelle

Beitrag von RobertG » Mo 27. Aug 2012, 17:53

Hallo Sandstrahl,

Du wirst schon mit den punktgetrennten Wortungetümen zurechtkommen müssen. Ohne die kommst Du nicht bis zu Deinem Formular durch. Auch wenn Du es mit dem Handbuch nicht verstanden hast kommt jetzt hier eine kurze Erklärung mit Hilfe des Handbuchs:

Code: Alles auswählen

oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("Anzeige")
Nachdem zu Beginn die Variablen erstellt wurden ("DIM oDoc AS OBJECT" usw.) wird hier schritt für Schritt auf das Formular zugegriffen. "thisComponent" ist ein feststehender Begriff für das Dokument, aus dem heraus das Makro aufgerufen wird. Willst Du also auf Dein aktuelles Formular zugreifen, so ist der Startpunkt bei "thisComponent". Auf ein anderes Formular zuzugreifen erfordert da noch mehr "punktgetrennte Wortungetümer". oDoc bedeutet jetzt Makrointern für die Routine "thisComponent" - dieses Programmteil.
In der nächsten Zeile wird das dann direkt weiter verwendet. Die neue Variable oDrawpage soll auf die Zeichenoberfläche zugreifen, in der das Formular abgelegt ist. Auch diese Oberfläche hat eine festgelegte Bezeichnung: "drawpage". Dabei ist es für Makros unerheblich, ob das Ganze klein oder groß oder auch gemischt geschrieben wird. Wenn also jetzt oDrawpage = oDoc.drawpage dort formuliert ist, so ist die Benennung der Variablen nur dem Zufall oder der Übersichtlichkeitsliebe der programmierenden Person überlassen. Das kann auch oOberflaeche = oDoc.drawpage heißen. Oder, wenn die erste Variable umgangen werden soll, kann oDoc ganz wegfallen und stattdessen oOberflaeche = thisComponent.drawpage dort stehen. Die Punkte trennen die einzelnen Bestandteile von der obersten Ebene an abwärts. Je näher Du der einzelnen Komponente kommst, desto weitere rechts in der Punkthierarchie steht es.
In der dritten Zeile wird auf die 2. Variable Bezug genommen:
oForm = oDrawpage.forms.getByName("Anzeige")
Es geht also weiter in der Hierachie abwärts bis zum Formular. Am Ziel ist dies immer noch nicht, weil Du meist den Bezug zu einer Formularfeld brauchst. Auch diese zeile bezieht sich wieder auf eine Variable, die direkt davor geklärt wird. Du könntest also komplett ohne die beiden vorhergehenden Variablen auch schreiben:
oForm = thisComponent.drawpage.forms.getByName("Anzeige")
So kommen also die Wortungetümer zustande, die ein Kennzeichen des Zugriffs auf die Systemkomponenten sind. Du kannst sie nicht umgehen, aber einfacher fassen. Das Formular, auf das mit den drei Zeilen zugegriffen wurde, hat (im Formularnavigator sichtbar) den Namen "Anzeige". Es kann also ohne weiteres mehrere Formulare nebeneinander auf der einen "drawpage" geben. Zwischen diesen Formularen kannst Du per Namen oder per Index (Nummerierung) auswählen. Sicherer und übersichtlicher für mich ist die Wahl des Namens.
Ob "oform = ThisComponent.drawpage.forms.MainForm", wie von R angeführt, auch so zum Ziel führt kann ich nicht sagen. Die ersten 3 Bestandteile sind identisch zu dem oberen Code (Groß- oder Kleinschreibung egal). "MainForm" ist eigentlich der Name, den der Assistent dem ersten Formular zuweist. Ich würde da also getByName("MainForm") stehen haben.
Jetzt wieder der Hinweis auf das Handbuch:

Code: Alles auswählen

oDatenquelle = ThisComponent.Parent.DataSource
oVerbindung = oDatenquelle.GetConnection("","")
oSQL_Anweisung = oVerbindung.createStatement()
Das ist der Code, mit dem der Zugriff auf die gerade aktuelle Datenbankverbindung geregelt wird. Wieder taucht "ThisComponent" auf. Wieder jeder Punkt eine Ebene. Hier heißt die Variable "oSQL_Anweisung", in R's Beispiel "Sql_Statement" → Variablen, denen ein Wert zugewiesen werden, stehen links. Variablen, die nicht mit DIM vorher definiert werden, werden bei entsprechenden Makroeinstellungen ("strict") nicht berücksichtigt. Es kann dann nicht eine Variable mitten im Code plötzlich auftauchen - das Makro stoppt dann mit einer Fehlermeldung.
Eine Anmerkung noch zum Code von R: Der Code setzt ein Autoincrement-Feld auf den niedrigstmöglichen Wert zurück. Das macht Sinn, wenn viele Datensätze, vor allem am Ende einer Tabelle, gelöscht wurden. Das findest Du im Handbuch unter der Überschrift "Tabellenindex heruntersetzen bei Autowert-Feldern" in allgemeiner Form. Du möchtest aber nicht den Autoincrement-Wert bearbeiten. Bei Dir müsste also der in der SQL-Anweisung stehende Befehl nicht
"Alter table ""Tabelle1"" alter column ""ID"" restart with "+(nMaxID + 1)
lauten. Du möchtest von einem beliebigen Wert aus Deiner Tabelle den nächst höheren Wert unter bestimmten Bedingungen ermittelt haben. Außerdem willst Du diesen Wert in dem Formular sehen und in der Tabelle abspeichern. Im Formular arbeitetst Du da nicht mit einem SQL-Update-Befehl, sondern weist diesen Wert sichtbar dem Formular und dem Datensatz zu. Endgültig abgespeichert wird er nur, wenn Du den gesamten Datensatz abspeicherst.
Du musst also
- auf das Feld zugreifen, das den einen Wert enhält
- den Wert des neuen Feldes ermitteln (Siehe das Makro von R.)
- das neue Feld mit dem Wert füttern
---------------------
oForm war oben definiert
stFeld = oForm.getByName("Ausgangswert"). CurrentValue()
....jetzt wird damit nMaxID ermittelt wie im vorherigen Formular, entsprechender SQL-Code ist zu wählen, der unter Berücksichtigung von stFeld das Maximum für Dein Zielfeld ermittelt
oFeld = oForm.getByName("Zielwert")
oFeld.BoundField.updateInt(nMaxID+1)
→ Dann hast Du den Wert, den Du ermittelt hast, in Deinem Feld und auch zum Abspeichern bereit in Deinem Formular.
---------------------
Wenn Du mir sagst, an welcher Stelle Du konkret Verbesserungen bei dem Base-Teil des Handbuches sehen würdest, dann kann ich auch versuchen, das umzusetzen.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten