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. 🤗

[gelöst] Datenquelle als Tabelle in einem Formular

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
harald235

Re: Datenquelle als Tabelle in einem Formular

Beitrag von harald235 » Do 5. Jul 2012, 22:08

Hallo Gundo,

der meiste Dank hierbei gebührt Robert. Die für mich kniffligeren Dinge haben er (und F3K Total) gelöst. Von beiden habe ich viel gelernt, obwohl Sie das so gar nicht wissen.

Aber nun zu Dir:
Gundo hat geschrieben:EDIT: Kann ja passieren das man mal unbeabsichtig auf "DB_schliessen" klickt. Da wäre vielleicht ein Bestätigungsdialog vorteilhaft. Kannst du das noch einbauen ?
Füge folgendes in das Makro ein, nach der letzten Zeile die mit "Dim" beginnt:

Code: Alles auswählen

' Frage für MsgBox
 	Frage = "Möchten Sie die Datenbank wirklich schließen "+chr(13)+_
            "und alle Eingaben speichern? "
	
' falls auf Nein geklickt, Sub verlassen	   	 
	If  MsgBox ( Frage,36) = 7 Then
		Exit Sub
	End If
Und dann
Gundo hat geschrieben:Und die Königsaufgabe ist wohl: Wie kann man das Formular als Verknüpfung vom Windows Desktop starten, und zwar so das direkt das Formular geöffnet wird ?
Dafür dieses Makro:

Code: Alles auswählen

Sub BeiOeffnenDB()
' Variable setzen
	Dim oController as Object
' Zugriff auf Controller 
	oController = ThisDatabaseDocument.CurrentController
' falls notwendig Controller verbinden
	If not ( oController.isConnected() ) Then oController.connect() 
' Formular "Formularname" öffnen. Formularname wie er im Base Hauptfenster steht (also nicht "MainForm")
	thiscomponent.Formdocuments.getbyName("Formularname").open
End Sub
Trage es ein im Hauptfenster von Base unter Extras → Anpassen → Ereignisse → Dokument öffnen. Ziehe anschließend eine Verknüpfung Deiner *.odb-Datei auf den Desktop. Dann klappts.
Gundo hat geschrieben:Es geht um das Makro "Symbolleisten_Ausblenden".....
Ich habe Roberts Makro im Formular (nicht im Base Hauptfenster) installiert
Gundo hat geschrieben: (Extras ->Anpassen ->Ereignisse ->Dokument öffen[Symbolleisten_Ausblenden]), aber die Bearbeitung des Formulars ist kaum mehr möglich weil die Symbolleisten fehlen. Das ist auch der Fall wenn ich per Button im Formular "Symbolleisten_Einblenden" ausführe.
Und das funktioniert bei mir einwandfrei: LO 3.5.3.2 openSUSE 12.1, vielleicht hat wer anders da eine Idee?

Gruß harald

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

Re: Datenquelle als Tabelle in einem Formular

Beitrag von RobertG » Fr 6. Jul 2012, 08:40

Nur kurz zu den Symbolleisten:

Es scheint da Unterschiede im Verhalten verschiedener Programmversionen zu geben. Jetzt kommt es natürlich darauf an, welche Version unter welchem System genutzt wird. Ich habe hier, ähnlich wie Harald, OpenSuSE 11.4 und LO 3.5.5.2 zum Testen laufen lassen.

Wie im OpenOffice-Forum darauf hingewiesen wurde handelt es sich bei der ganzen Geschichte ja sowieso nicht um eine Fullscreen-Darstellung. Das Fenster ist ja verkleinerbar und schließbar. Wenn es also mit den Symbolleisten erst einmal nicht so klappt, dann hilft es erst einmal, das Ganze im Fullscreen-Modus zu starten - natürlich ohne Fensterüberschrift, auch ohne die Navigationsleiste:

Code: Alles auswählen

SUB Fullscreen
   DIM oDispatcher As Object, Props(0) As New com.sun.star.beans.PropertyValue
   oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
   Props(0).Name = "FullScreen" : Props(0).Value = true
   oDispatcher.executeDispatch(ThisComponent.CurrentController.Frame, ".uno:FullScreen", "", 0, Props())
End SUB
Beim ersten Start des Fullscreen erscheint so ein kleines Popup (ist auch wohl eine Symbolleiste - aber mit eben nur einem Symbol). Wenn Dieses Popup geschlossen wird taucht es beim erneuten Öffnen wohl auch nicht wieder auf.
Aus dem Fullscreen raus geht es dann nur noch über das entsprechende Tastenkürzel oder die rechte Maustaste.

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

Gundo
Beiträge: 53
Registriert: So 1. Jul 2012, 10:23

Re: Datenquelle als Tabelle in einem Formular

Beitrag von Gundo » Fr 6. Jul 2012, 09:05

Gelöscht ! - versehentlicher Doppelpost.
Zuletzt geändert von Gundo am Fr 6. Jul 2012, 09:13, insgesamt 4-mal geändert.

Gundo
Beiträge: 53
Registriert: So 1. Jul 2012, 10:23

Re: Datenquelle als Tabelle in einem Formular

Beitrag von Gundo » Fr 6. Jul 2012, 09:08

der meiste Dank hierbei gebührt Robert. Die für mich kniffligeren Dinge haben er (und F3K Total) gelöst. Von beiden habe ich viel gelernt, obwohl Sie das so gar nicht wissen.
Hallo,

ja, mir ist natürlich aufgefallen das ihr 3 fleißige Helfer seid. Von F3k Total verwende ich z.B. das search Makro.

Zur Version; Bei mir unter Windows 7 64bit läuft LibreOffice v3.5.4.2 ... ist für Windows die AKtuellste.

@Harald
Da klemmt irgendwas. Das Makro "DB-schliessen" inkl. "Frage für MsgBox", läßt Base ztw. abstürzen. Nicht immer, aber öfters. Beim Beenden durch das Makro erscheint ein Fenster mit weißem Inhalt, und nichts geht mehr. Da hilft dann nur noch der Taskmanager um LO zu entfernen.

Ich poste mal das komplette Makro-Script.:

Code: Alles auswählen

sub Search
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:RecSearch", "", 0, Array())

end sub

rem ######################################################################

Sub Symbolleisten_Ausblenden
   DIM oFrame AS OBJECT
   DIM oWin AS OBJECT
   DIM oLayoutMng AS OBJECT
   DIM aElemente()
   oFrame = StarDesktop.getCurrentFrame()
   oFrame.setTitle "Mein Formular"   ' Titel des Formulars wird gesetzt
   oWin = oFrame.getContainerWindow()
   oWin.IsMaximized = true
   oLayoutMng = oFrame.LayoutManager
   aElemente = oLayoutMng.getElements()
   FOR i = LBound(aElemente) TO UBound(aElemente)
      IF aElemente(i).ResourceURL = "private:resource/toolbar/formsnavigationbar" THEN   
         'Die Navigationsleiste sollte nicht verborgen werden, falls sie eingeblendet wurde.
      ELSE
         oLayoutMng.hideElement(aElemente(i).ResourceURL)
      END IF      
   NEXT
End Sub

rem ######################################################################

Sub Symbolleisten_Einblenden
       DIM oFrame AS OBJECT
       DIM oLayoutMng AS OBJECT
       DIM aElemente()
       oFrame = StarDesktop.getCurrentFrame()
       oLayoutMng = oFrame.LayoutManager
       oLayoutMng = oFrame.LayoutManager
       aElemente = oLayoutMng.getElements()
       FOR i = LBound(aElemente) TO UBound(aElemente)
          oLayoutMng.showElement(aElemente(i).ResourceURL)
          ' eventuell fehlende wichtige Elemente:
          '   "private:resource/toolbar/standardbar"
          '   "private:resource/statusbar/statusbar"
  NEXT
End Sub

rem ######################################################################
    
Sub FokusSetzen
oDoc = ThisComponent
oDocView = oDoc.getCurrentController()
oForm = oDoc.drawpage.forms(0)            ' forms(0) = MainForm (Hauptformular) im Formular-Navigator
oFeld = oForm.getByName("txtAnrede")          ' Feldname im Formular-Navigator
oDocView.getControl(oFeld).setFocus()
End Sub 

rem ######################################################################

' Formularänderungen speichern, aktuellen Datensatz speichern, Formular und Datenbank schließen

Sub DB_schliessen
   Dim Document   as Object
   Dim Dispatcher as Object
   Dim oDoc as Object
   Dim oForm as Object

' Frage für MsgBox
   Frage = "Möchten Sie die Datenbank wirklich schließen "+chr(13)+_
            "und alle Eingaben speichern? "
   
' falls auf Nein geklickt, Sub verlassen         
   If  MsgBox ( Frage,36) = 7 Then
      Exit Sub
   End If

' Zugriff auf Dokument
   Document   = ThisComponent.CurrentController.Frame
   Dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
   
' Änderungen im Formular speichern, nicht im ungespeicherten Datensatz
   Dispatcher.executeDispatch(Document, ".uno:Save", "", 0, Array())
   
' Zugriff auf das Formular und speichern des aktuellen Datensatzes
   oForm = ThisComponent.DrawPage.Forms.getByName("MainForm")  ' geht auch: Forms(0)
   If oForm.IsNew then oForm.InsertRow Else oForm.UpdateRow
   
' Formular schließen
   ThisComponent.CurrentController.Frame.Close(False)

' Datenbank schließen
   oDoc = ThisDatabaseDocument
   oDoc.Store()
   oDoc.Close(True)
End Sub

rem ######################################################################

Sub BeiOeffnenDB()
' Variable setzen
   Dim oController as Object
' Zugriff auf Controller
   oController = ThisDatabaseDocument.CurrentController
' falls notwendig Controller verbinden
   If not ( oController.isConnected() ) Then oController.connect()
' Formular "Formularname" öffnen. Formularname wie er im Base Hauptfenster steht (also nicht "MainForm")
   thiscomponent.Formdocuments.getbyName("Kundenstamm").open
End Sub

rem ######################################################################

Das neue Makro "BeiOeffnenDB" funktioniert bisher einwandfrei. Oder liegt es vielleicht am Zusammenspiel der Makros das Base abschmiert ?

@Robert
Danke, werde ich auch testen.

Heute Abend wird die kleine Datenbank einigen Senioren vorgeführt. Mal sehen was die dazu sagen.

Gruß Gundo

EDIT: Habe es reproduzieren können. Der Crash beim Beenden tritt nur auf wenn ...

Code: Alles auswählen

' Frage für MsgBox
       Frage = "Möchten Sie die Datenbank wirklich schließen "+chr(13)+_
                "und alle Eingaben speichern? "
       
    ' falls auf Nein geklickt, Sub verlassen         
       If  MsgBox ( Frage,36) = 7 Then
          Exit Sub
       End If
... eingefügt wurde.
Zuletzt geändert von Gundo am Fr 6. Jul 2012, 18:37, insgesamt 1-mal geändert.

harald235

Re: Datenquelle als Tabelle in einem Formular

Beitrag von harald235 » Fr 6. Jul 2012, 11:25

Hallo Gundo,

ich habe das bei mir versucht nachzuvollziehen. Ich habe 20 x die DB geöffnet, Daten geändert, Berichte aufgerufen, DB geschlossen: alles läuft. Der Fehler tritt bei mir nicht auf. Das sich Base manchmal aufhängt und ich nicht weiß wieso, damit habe ich mich abgefunden. Es ist ein Programm das beständig weiter wächst und besser wird, aber eben derzeit noch Macken hat.

Ach ja, beim Testen habe ich festgestellt, das die Zeile

Code: Alles auswählen

   oDoc.Store()
im Makro bei mir keinen Effekt hat, ich habe sie auskommentiert und es läuft weiter problemlos. Ich glaube nicht, das es bei Dir die Absturzursache ist, aber raus kann sie.

Mir fällt jetzt nur noch ein, das Du die Datenbank mit verfremdeten Daten mal hier hochladen könntest, damit sie auf anderen Systemen getestet werden kann.

Eine Idee noch: defragmentiere die Datenbank mit dem Befehl

Code: Alles auswählen

CHECKPOINT DEFRAG
Der wird ausgeführt im Hauptfenster von Base, Extras → SQL. Kann sein, das das die Probleme beseitigt. Auf jeden Fall wird die DB von Überflüssigem bereinigt.

Viel Erfolg mit der Präsentation.



Gruß harald

harald235

Re: Datenquelle als Tabelle in einem Formular

Beitrag von harald235 » Fr 6. Jul 2012, 13:28

Hallo Gundo,

zu Deinem EDIT:
evtl ist das die Ursache:

Code: Alles auswählen

Frage = "Möchten Sie die Datenbank wirklich schließen "+chr(13)+_
Das + als vorletztes Zeichen der Zeile. Ersetze es durch "&", das Ampersand-Zeichen:

Code: Alles auswählen

Frage = "Möchten Sie die Datenbank wirklich schließen "+chr(13)&_
Vielleicht ist da Windows weniger tolerant als Linux.

Gruß harald

Gundo
Beiträge: 53
Registriert: So 1. Jul 2012, 10:23

Re: Datenquelle als Tabelle in einem Formular

Beitrag von Gundo » So 8. Jul 2012, 14:58

Eine schönen Sonntag wünsche ich (Hier regnet es leider dauerhaft)

Bei mir ist ein Problem mit dem Primärschlüssel aufgetreten.
Bei der Eingabe der Datensätze sind unerklärliche Sprünge bei der "KundenID" aufgetreten. Diese hat den Primärschlüssel, der Feldtyp ist "INTEGER" mit Autowert.
Es gab einen Sprung von 61 auf 70 und von 77 auf 84. Ich kann mir das nicht erklären. Es wäre schön wenn das korrigierbar wäre. Bei momentan 88 Datensätzen sollte also auch die KundenID fortlaufend 1-88 sein. Ist das möglich ?
Das Löschen dieses Feldes in der Tabelle und das anschleißende Neu-Anlegen hat leider nichts bewirkt.

Gruß Gundo

harald235

Re: Datenquelle als Tabelle in einem Formular

Beitrag von harald235 » So 8. Jul 2012, 19:52

Hallo Gundo,

schau ins LibreOffice Base Handbuch Kapitel 8 Seite 9 "Zeilennummerierung".

Über den Autowert wirst Du immer Schwierigkeiten haben eine durchgehend fortlaufende Nummerierung zu haben, es sei denn Du löschst niemals einen Datensatz. Auch abgebrochene Eingabeversuche die bereits (versehentlich) gespeichert wurden und dann gelöscht werden, schaffen eine Unterbrechung. Das bedeutet Wachsamkeit und Aufwand.

Beim Primärschlüssel-Autowert kommt es halt auf die Eindeutigkeit, nicht auf die fortlaufende Lückenlosigkeit an.

Gruß harald

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

Re: Datenquelle als Tabelle in einem Formular

Beitrag von RobertG » So 8. Jul 2012, 22:25

Hallo Gundo,

Du kannst das mit viel Aufwand gegebenenfalls nachkorrigieren. Base wird aber standardmäßig einfach weiter oben mit der Primärschlüsselzahl fortfahren. Ich nutze das folgende verfahren, wenn ich Datenbanken durchgetestet habe und wieder von vorne beginne:

Code: Alles auswählen

ALTER TABLE "Tabellenname" ALTER COLUMN "Feldname" RESTART WITH <neuer_Feldwert>
Wenn Du also Deine Tabelle händisch bereinigt hast (aus der 70 eine 62 gemacht, aus der 71 eine 63 usw.), so musst Du den obigen Code mit Deinem Tabellennamen und Deinem Feldnamen sowie dem nächsten automatisch zu erstellenden Wert unter
Extras → SQL
eingeben.
Ansonsten stimme ich aber Harald völlig zu: Der Primärschlüssel eignet sich nicht zur Datensatzzählung oder Datensatznummerierung. Und wenn Du unbedingt eine Nummerierung haben willst, die stimmig ist, so musst Du Dir etwas über Abfragen bauen. Ich würde eher das Primärschlüsselfeld und nicht weiter beachten.

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

Gundo
Beiträge: 53
Registriert: So 1. Jul 2012, 10:23

Re: Datenquelle als Tabelle in einem Formular

Beitrag von Gundo » Mo 9. Jul 2012, 10:28

Gut, dann lasse ich das. Ich wollte die Primärschlüsselzahl als eine Art Kundennummer verwenden.

Die kleine Vorführung ist gestern sehr gut angekommen. Die Datenbank kommt heute schon im Verein zum Einsatz. Herzlichen Dank, auch im Namen des Vereins.
Das Ein oder Andere muss ich noch ändern. Die Senioren haben halt gewisse Ansprüche/Vorlieben.

Robert, dein Fullscreen-Makro kommt auch zum Einsatz. Der große Vorteil dabei ist, das die Windows-Taskleiste deaktiviert ist bzw. mit der Maus nicht aktiviert werden kann. Dadurch werden weitere Bedienfehler vermieden. Ist das bei deinem Script ein Feature, oder ein LO-Bug ?
Leider ist auch wieder ein Fehler mit dem Makro "DB_schliessen" aufgetreten. Es öffnete sich dann der Makro-Editor mit einer Fehlermeldung. Ich konnte das aber nicht reproduzieren. Hab es erst mal wieder deaktiviert.

Damit bei Benutzung der Datenbank das altersschwache Notebook nicht immer hochgefahren werden muss, das dauert nämlich ewig, würde ich gerne einen Button mit Abfrage für den Stand-by Modus einfügen. Ich kann zwar über die Windowstaste den Dialog aufrufen, aber bei Nichtausführung entstehen unschöne Grafikfehler.

Wäre es auch möglich das mir jemand ein Makro schreibt, welches aus dem Formular heraus ein Programm starten kann ? Das wäre mir sehr wichtig.



Gruß Gundo

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