❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️
Unterstützen Sie das LibreOffice-Forum und helfen Sie uns, unser Ziel für 2025 zu erreichen!

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱


❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Artikelnr. bei Eingabe automatisch anlegen u. Bestand zählen

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
StefanONE
Beiträge: 9
Registriert: Mi 22. Mai 2013, 22:31

Artikelnr. bei Eingabe automatisch anlegen u. Bestand zählen

Beitrag von StefanONE » Do 23. Mai 2013, 00:05

Hallo,
Ich möchte mir eine Datenbank erstellen, um meine Modellbahn bestandstechnisch zu erfassen. Hierzu möchte ich ein Eingabeformular verwenden bei dem ich einfach die Artikelnr. eingebe und das Programm dann selbständig entscheidet ob diese Artikelnr angelegt werden muß und dann als Menge 1 gezählt wird oder wenn diese Artikelnr schon vorhanden ist einfach bei der Menge einer dazugezählt wird. Habe das Handbuch schon mehrmals durchgeblättert aber bei diesem Punkt werde ich nicht so ganz schlau daraus. Die Artikel werden nach Spurweite (Maßstab) unterteilt. Die Tabellen kann zu dem Artikel auch Zusatzinformationen enthalten, welche bei einer späteren Abfrage benötigt werden.

Gruß
StefanONE

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Artikelnr. bei Eingabe automatisch anlegen u. Bestand zä

Beitrag von RobertG » Do 23. Mai 2013, 07:36

Hallo StefanONE,
StefanONE hat geschrieben:Hierzu möchte ich ein Eingabeformular verwenden bei dem ich einfach die Artikelnr. eingebe und das Programm dann selbständig entscheidet ob diese Artikelnr angelegt werden muß und dann als Menge 1 gezählt wird oder wenn diese Artikelnr schon vorhanden ist einfach bei der Menge einer dazugezählt wird.
Du brauchst zuerst einmal ein Eingabefeld für die entsprechende Nummer (Suchbegriff). Von diesem Suchbegriff aus wird Deine Datenbank durchforstet. Kann ja nur ein Datensatz sein, wenn Du lediglich mit Nummerierungen arbeitest.
Anschließend geht der Rest nur mit Makros:
Der Feldinhalt muss ausgelesen werden - siehe Handbuch, Einstieg Makros, ...currentValue ...
Danach eine Abfrage, ob die Nummer schon vorhanden ist:
SELECT COUNT("Artikelnummer") FROM "Tabelle" WHERE "Artikelnummer" = Feldinhalt
Ergebnis auslesen, wenn 1, dann erfolgt ein Update, wenn 0, dann erfolgt ein Insert.
Wenn 1:
UPDATE "Tabelle" SET "Anzahl" = "Anzahl"+1 WHERE "Artikelnummer" = Feldinhalt
Wenn 0:
INSERT INTO "Tabelle" ("Artikelnummer", "Anzahl") VALUES (Feldinhalt, 1)

Sobald Du automatisch irgendetwas hochzählen willst wirst Du an Makros nicht vorbeikommen. Ansonsten schau Dir zur Suche und Filterung die entsprechenden Kapitel im Handbuch an (S. 240 ff)

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

StefanONE
Beiträge: 9
Registriert: Mi 22. Mai 2013, 22:31

Re: Artikelnr. bei Eingabe automatisch anlegen u. Bestand zä

Beitrag von StefanONE » Mi 29. Mai 2013, 19:50

Hallo Robert,
Vielen Dank für Deine Antwort. Ich habe mal einen solchen Makro angelegt und den Basic-Text einfach übernommen. Dieses Makro habe ich mit dem Eingabeformular verknüpft. Wenn ich das Eingabeformular öffne kommt die Fehlermeldung (siehe Anhang):

BASIC-Syntaxfehler.
Erwartet: Case.

Wenn ich das das Wort Case einfüge kommt die Fehlermeldung:

BASIC-Syntaxfehler.
Erwartet: CRLF.

Was muß an der Syntax geändert werden

Gruß
Stefan
Dateianhänge
BASIC-Syntaxfehler.<br />Erwartet: Case.
BASIC-Syntaxfehler.
Erwartet: Case.
Base Makrofehlermeldung 1.jpg (395.23 KiB) 5857 mal betrachtet

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Artikelnr. bei Eingabe automatisch anlegen u. Bestand zä

Beitrag von RobertG » Mi 29. Mai 2013, 21:37

Hallo Stefan,

mit den Makros scheinst Du Dir das recht einfach vorgestellt zu haben. Das beginnt schon damit, dass Du wohl gar keinen SQL-Befehlt zum Absetzen vorbereitest und dann auch noch die SQL-Formulierung so darstellst, dass dies von Basic überhaupt nicht interpretierbar ist. Mir scheint, dass Du mit Makros noch nicht gearbeitet hast ...

Schau Dir das Kapitel zu den Makros im Handbuch an. Dort steht, wie zu der Datenbank Kontakt aufgenommen wird, wie ein SQL-Befehl definiert wird usw. Gegebenenfalls kannst Du Dir auch die entsprechende Beispieldatenbank (Medien_mit_Makros) herunterladen. Da wird sehr häufig auf Tabellen der Datenbank zugegriffen und in Tabellen geschrieben.

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

StefanONE
Beiträge: 9
Registriert: Mi 22. Mai 2013, 22:31

Re: Artikelnr. bei Eingabe automatisch anlegen u. Bestand zä

Beitrag von StefanONE » Do 30. Mai 2013, 23:23

Hallo Robert,
Du hast Recht. Ich habe mir das Erstellen einer Datenbank einfacher vorgestellt. Nun habe ich nochmal im handbuch geblättert und den Makro nach Deinen Anmerkungen abgeändert. Ich erhalte aber immer noch die bekannten Fehlermeldungen. Als Anhang habe ich einen Sreenshot der aktuellen Version des Makros hochgeladen. Die Abfrage habe ich um ein Kontrollfeld mit AND erweitert. Ich hoffe das ist richt so.
Base Makrofehlermeldung 2.jpg
Base Makrofehlermeldung 2.jpg (221.64 KiB) 5843 mal betrachtet
Gruß
Stefan

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Artikelnr. bei Eingabe automatisch anlegen u. Bestand zä

Beitrag von RobertG » Fr 31. Mai 2013, 08:39

Hallo Stefan,

leider kann ich bei einem Screenshot nicht entsprechende Anmerkungen machen.
Du startest korrekt bis einschl. oForm, um eventuell den Inhalt eines Formularfeldes auszulesen. Jetzt müsste es weiter gehen zu
oFeld = ...
Anschließend müsste der Wert diese Feldes abgefragt werden. Eine Artikelnummer ist sich eine Zahl oder ein String. Wenn es eine Ganzzahl ist, dann könnte also der Artikelnummer z.B. die Variableneigenschaft Integer zugewiesen werden. Da Du später diese Variable als "Feldinhalt" bezeichnest:

Code: Alles auswählen

DIM Feldinhalt AS INTEGER
Anschließend wird der Wert der Artikelnummer aus dem Formularfeld ausgelesen:

Code: Alles auswählen

Feldinhalt = oFeld.getCurrentValue()
Du musst den SQL-Code formulieren. Dies mache ich der besseren Übersicht wegen mit der Zuweisung zur Variablen stSQL:

Code: Alles auswählen

stSql = "SELECT COUNT(""Artikelnummer"") FROM ""Tabelle"" WHERE ""Artikelnummer"" = '"+Feldinhalt+"'"
Jetzt muss festgestellt werden, welchen Wert Diese Abfrage ergibt:

Code: Alles auswählen

oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)
WHILE oAbfrageergebnis.next
iResult = oAbfrageergebnis.getInt(1)
WEND
Jetzt musst ein Datensatz eingefügt werden, falls iResult größer als 0 ist. Ich habe hier jetzt einmal ohne Umweg den SQL-Code direkt mit dem Befehl zusammen aufgeschrieben:

Code: Alles auswählen

IF iResult > 0 THEN
oSQL_Anweisung.executeUpdate("Update ""Tabelle"" SET ""Anzahl"" = ""Anzahl""+1 WHERE ""Artikelnummer"" = '"+Feldinhalt+"'"
ELSE
oSQL_Anweisung.executeUpdate("INSERT INTO ""Tabelle"" (""Artikelnummer"",""Anzahl"") VALUES ( '"+Feldinhalt+"', 1)"
END IF
Wenn es nicht klappt, dann schicke doch neben dem Screenshot auch den Code mit, damit ich dort Änderungen eintragen kann.
Bei der Formulierung von SQL-Befehlen ist es wichtig, dass Basic das Ganze als Text versteht. Alles, was im Makroeditor grün erscheint, ist für Basic kein Text, sondern eine Variable, Funktion o.ä. Deshalb ist diese Kombination von doppelten Anführungszeichen direkt hintereinander notwendig. Damit werden einzelne Anführungszeichen für die Formulierung des SQL-Codes an die Datenbank weiter gegeben.

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

StefanONE
Beiträge: 9
Registriert: Mi 22. Mai 2013, 22:31

Re: Artikelnr. bei Eingabe automatisch anlegen u. Bestand zä

Beitrag von StefanONE » Mo 3. Jun 2013, 18:28

Hallo Robert,
Ich hoffe ich habe oFeld richtig definiert. Warum muß immer ein "o" vor der Variable stehen? Hier der Code und ein Screenshot mit einer neuen Fehlermeldung:

REM ***** BASIC *****

Sub Main
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oForm AS OBJECT
oDoc = thisComponent
oDrawpage = oDoc.Drawpage
oForm = oDrawpage.forms.getByName("Eingabe")
oFeld = oforms.getByName("Artikelnummer").getByName("Bemerkung")

DIM Artikelnummer AS OBJECT
DIM Bemerkung AS OBJECT
DIM Feldinhalt AS STRING
Feldinhalt = oFeld.getCurrentValue()

DIM oConnection AS OBJECT
oConnection.oForm.activeConnection()

DIM oSQL_Statement AS OBJECT
DIM stSql AS STRING
DIM oResult AS OBJECT
DIM iResult AS INTEGER
oSQL_Statement = oConnection.createStatement()

stSql = "SELECT COUNT(""Artikelnummer"") FROM ""Tabelle"" WHERE ""Artikelnummer"" AND ""Bemerkung"" = '"+Feldinhalt+"'"
oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)
WHILE oAbfrageergebnis.next
iResult = oAbfrageergebnis.getInt(1)
WEND
IF iResult > 0 THEN
oSQL_Anweisung.executeUpdate("Update ""Tabelle"" SET ""Anzahl"" = ""Anzahl""+1 WHERE ""Artikelnummer"" = '"+Feldinhalt+"'"
ELSE
oSQL_Anweisung.executeUpdate("INSERT INTO ""Tabelle"" (""Artikelnummer"",""Anzahl"") VALUES ( '"+Feldinhalt+"', 1)"
END IF
End Sub
Base Makrofehlermeldung 3.jpg
Base Makrofehlermeldung 3.jpg (257.98 KiB) 5802 mal betrachtet
Gruß
Stefan

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Artikelnr. bei Eingabe automatisch anlegen u. Bestand zä

Beitrag von RobertG » Di 4. Jun 2013, 08:13

Hallo Stefan,
StefanONE hat geschrieben:Hallo Robert,
Ich hoffe ich habe oFeld richtig definiert. Warum muß immer ein "o" vor der Variable stehen?
Das mit dem "o" ist so etwas wie eine stille Vereinbarung bei vielen Leuten, die mit Makros etwas erstellen.
"o" soll nur anzeigen, dass das eine Variable ist, die als Objekt definiert wurde. Die Bezeichnung ist sonst egal - Du darfst nur nicht Bezeichnungen verwenden, die bereits vorgegebenen Funktionen entsprechen.
Ich benenne in der Regel die Variablen so, dass z.B. bei Strings "st" steht, bei Integer-Werte "in", bei boolschen Werten "bo", bei Arrays "ar" usw.

Die Fehlermeldung in Deinem Makro "NoSuchElement" ("NichtSoEinElement") - es gibt das Formular "Eingabe" in Deinem Formular nicht. Öffne das Formular zum Bearbeiten, öffne den Formularnavigator und wirf einen Blick auf die Bezeichnung des Formulars. Wenn Du irgendetwas mit dem Assistenten erstellt hast, dann steht als erstes Formular in der höchsten Ebene "MainForm". Die Bezeichnungen im Formular und im Makro müssen übereinstimmen ...

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

StefanONE
Beiträge: 9
Registriert: Mi 22. Mai 2013, 22:31

Re: Artikelnr. bei Eingabe automatisch anlegen u. Bestand zä

Beitrag von StefanONE » Do 6. Jun 2013, 00:02

Hallo Robert,
Ich weis nicht ob ich die Variable oFeld richt definiert habe. Ich dachte ich müßte dem Programm sagen welches die Felder sind und wo es sie finden kann. Was muss mit oFeld definiert werden und wie muß der Befehl eingebene werden. Momentan ist mir nicht klar was mit oFeld definiert werden soll. Hier die entsprechende Fehlermeldung:
Base Makrofehlermeldung 4.jpg
Base Makrofehlermeldung 4.jpg (248.69 KiB) 5778 mal betrachtet
Gruß
Stefan

F3K Total
* LO-Experte *
Beiträge: 2501
Registriert: So 10. Apr 2011, 10:10

Re: Artikelnr. bei Eingabe automatisch anlegen u. Bestand zä

Beitrag von F3K Total » Do 6. Jun 2013, 06:41

Hi,
ein Schuss ins Blaue:

Code: Alles auswählen

oForm = oDrawpage.forms.getByName("Eingabe")
oFeld = oform.getByName("Bemerkung")
oder gleichbedeutend:

Code: Alles auswählen

oFeld = oDrawpage.forms.getByName("Eingabe").getByName("Bemerkung")
Gruß R
Windows 11: AOO, LO Linux Mint: AOO, LO


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten