Drucken "von Datum bis Datum" Makro

Alles zur Programmierung im OpenOffice.org
mikele
Beiträge: 499
Registriert: Sa 23. Jul 2011, 22:09

Re: Drucken "von Datum bis Datum" Makro

Beitrag von mikele » Do 14. Jun 2018, 22:54

Hallo Pretender,
bei mir klappt das nicht. Die Eingabe wird nicht übernommen.
Was heißt "bei dir"? Ich vermute jetzt mal ins Blaue, das du eine eigene (neue) Datei hast, mit der du loslegen willst (tu dir bitte nicht an, die Exceldatei umstricken zu wollen). Da ich nicht weiß, wie du die Datei angelegt hast, ist es müßig zu raten. Da wäre es sinnvoller, wenn du uns an deinem Entwurf teilhaben lässt.
Den Fehler in der Zuordnung habe ich korrigiert. Nun ein kleiner Crashkurs zu meinem Makro.

Code: Alles auswählen

Sub Daten_Uebernehmen

	'Test, ob alle erforderlichen Daten vorhanden sind
	oNachricht=oHptDialog.getControl("Label14")
	aFelder=array("DateField1","PatternField1","TextField6","TextField4","TextField5")
	Dim aEingaben(6)
	for i=0 to 4
		octrl=oHptDialog.getControl(aFelder(i))
		
		if octrl.text="" then
			oNachricht.text="Bitte alle Felder ausfüllen!"
			wait 2000
			oNachricht.text=""
			octrl.setfocus
			exit sub
		end if
		aEingaben(i+1)=octrl.text
	next
	'Daten übertragen
	oNachricht.text="Aktenplannummer wird gesucht ..."
	'letzte Zeile finden
	n=oVerfuegen.columns(0).queryEmptyCells.rangeaddresses(0).startrow
	oBereich=oVerfuegen.getCellRangeByPosition(0,1,6,n-1)
	aDaten()=oBereich.getDataArray
	neueNr=1
	for i=ubound(aDaten()) to 0 step -1
		if aDaten(i)(2)=aEingaben(2) then
			neueNr=aDaten(i)(0)+1
			i=0
		end if
	next
	'Ordnungsnummer eintragen
	aEingaben(0)=neueNr
	'Formatumwandlung der Datumsangabe
	aEingaben(1)=int(cdate(aEingaben(1))
	aEingaben(6)=""
	'neuen datensatz schreiben
	oVerfuegen.getCellRangeByPosition(0,n,6,n).setDataArray(array(aEingaben()))
	oNachricht.text="Verfügung wurde unter der Ordnungsnummer " & neueNr & " gespeichert"
	wait 2000
	oNachricht.text=""
	Eingaben_Loeschen
End Sub
Ganz wichtig: Das Makro funktioniert nur sinnvoll, wenn die Daten auf dem Tabellenblatt "Verfügungen" in den Spalten A bis G liegen. In der ersten Zeile die Überschriften und dann (ohne Leerzeilen) die Datensätze (jede Zeile eine Verfügung, fortlaufend)
Zunächst lege ich ein Array an (aFelder) in dem ich die Dialogfelder in der Reihenfolge benenne in der ich sie auslesen will (da steckte mein Fehler) und ein weiteres Array (aEingaben) in die die Werte kommen sollen. Danach durchlaufe ich die 5 Dialogfelder, teste ob sie leer sind (wenn ja wird die Sub abgebrochen) und lese sonst ihren Wert in aEingaben ein.
Bevor nun die Daten übertragen werden, muss noch die Ordnungsnummer festgelegt werden.
Mit der Zeile

Code: Alles auswählen

n=oVerfuegen.columns(0).queryEmptyCells.rangeaddresses(0).startrow
bestimme ich die erste leere Zeile in der ersten Spalte (also die Zeile in die die neue Verfügung kommt). Es sei n also zum Beispiel 3997.
Anschließend lese ich den gesamten Bereich A1:G3996 in das Array aDaten. Der Bereich A1:G3996 geht von Spalte 0 und Zeile 1 bis Spalte 6 und Zeile 3996. Daher .getCellRangeByPosition(0,1,6,n-1).
Diesen Bereich durchlaufe ich jetzt rückwärts und schaue, ob die Aktenplannumer schon mal auftauchte und wenn ja welche Ordnungsnummer (zuletzt) vergeben wurde. Dann wird die Schleife sofort beendet. Wenn nichts gefunden wurde, ist die neue Ordnungsnummer halt die 1.
Die Ordnungsnummer wird nun in das erste Element des Array aEingaben geschrieben. Das Verfügungsdatum wird erst einmal leer gelassen.
Mit der Zeile

Code: Alles auswählen

oVerfuegen.getCellRangeByPosition(0,n,6,n).setDataArray(array(aEingaben()))
werden nun alle 7 Einträge in einem Rutsch in die Zeile n (also z. B. 3997) der Tabellenblattes "Verfügungen" (hinterlegt in der Objektvariable oVerfuegen) geschrieben. Dieses Tabellenblatt muss nicht extra aktiviert werden.
Gruß,
mikele

balu
Beiträge: 150
Registriert: Di 12. Okt 2010, 11:35

Re: Drucken "von Datum bis Datum" Makro

Beitrag von balu » Do 14. Jun 2018, 22:58

Yipi-ya-ya-yipi-yipi-yeeeeee.
Bild Bild Bild

Ich habe tatsächlich mein gesetztes Ziel erreicht, wegen der Externen Datei.
Jetzt kann man den Dialog starten, eine Datei öffnen, und anschließend den Dialog beenden.
Die zu öffnende Datei wird versteckt im Hintergrund geladen, wie schon gesagt sieht man sie nicht.
Und beim erneuten Aufruf des Dialogs wird zuvor ein anderer (neuer zusätzlicher) Dialog angezeigt der etwas mitteilt, und in dem man eine Wahl treffen kann. Der erscheint aber nur dann, wenn man zuvor eine Datei geöffnet hat, und den Hauptdialog beendet hat ohne die andere Datei vorher zu schließen. Ist keine zusätzliche Datei geöffnet worden, erscheint der neue Dialog nicht.

Ich hatte doch tatsächlich noch etwas in meiner Grabbelkischte gefunden, was mir mein Ziel ermöglichte. :D

Einfach mal selber testen.



Gruß
balu
Dateianhänge
NEU_mit_TESTDATEN_ohne-EXCEL-Kontakt_0.4.ods
(22.02 KiB) 18-mal heruntergeladen

mikele
Beiträge: 499
Registriert: Sa 23. Jul 2011, 22:09

Re: Drucken "von Datum bis Datum" Makro

Beitrag von mikele » Do 14. Jun 2018, 23:09

Hallo Balu,
Glückwunsch! Es ist doch immer wieder schön, wenn etwas klappt.
Ich möchte dir nicht die Freude verderben, aber: wäre es nicht einfacher (und im Kontext - alles läuft über den Dialog - auch sinnvoller), wenn die externe Datei beim Schließen des Dialogs automatisch geschlossen wird. Da sie für den Nutzer ja unsichtbar ist, würde sie spätestens beim Herunterfahren des Rechners eh' geschlossen.
Gruß,
mikele

balu
Beiträge: 150
Registriert: Di 12. Okt 2010, 11:35

Re: Drucken "von Datum bis Datum" Makro

Beitrag von balu » Fr 15. Jun 2018, 00:14

Hallo Mikele
Ich möchte dir nicht die Freude verderben, aber:
Nö! Tust du nicht!

wäre es nicht einfacher (und im Kontext - alles läuft über den Dialog - auch sinnvoller), wenn die externe Datei beim Schließen des Dialogs automatisch geschlossen wird.
Tja, das kann man wohl so machen. Jedoch rechne ich bis jetzt damit das ein Anwender aus versehen den Dialog schliesst. Bei einem wirklich gewollten Dialog beenden sieht das wohl recht einfach aus. Aber bei einem versehentlichem steht man dann Dumm da; "Nanu!? Warum kann ich nicht mehr auf die externe Datei zugreifen? Das ging doch noch vor der Kaffeepause. Und wie hieß die Datei gleich nochmal?".

... würde sie spätestens beim Herunterfahren des Rechners eh' geschlossen.
Momento mal bitte!
Das würde ja bedeuten, das OO nicht ordnungsgemäß beendet wurde, sondern durch das Runterfahren zwangsweise ausm Arbeitsspeicher gekillt wurde. Und das bekommt jeder geöffneten Datei wohl nicht wirklich gut, bittere Erfahrung damit gemacht.

Und außerdem wird sie eben NICHT geschlossen, sondern ausm Speicher gekillt.
Schliessen heisst für mich, das ich eine Datei ordnungsgemäß über das Programm beende. Dadurch vermeidet man ja auch, das eine Lock-Datei (.~lock.dateiname.ods#) übrigt bliebt.

Klar kann man jetzt noch über diverse Dinge bezüglich des Speicherns lang und breit diskutieren, aber warten wir doch mal ab wie Groß der Endgültige Dialog von Pretender sein wird, wie groß er ihn gestalten will. Vielleicht war meine Arbeit auch teilweise umsonst, weil es dann kein versehentliches beenden mehr gibt. Ich bin auf jeden Fall mit meinem Ergebnis zufrieden. Denn ich habe jetzt auch schon einen Grundstein gelegt, der später verhindern kann das man eine falsche und nicht zugelassene Datei öffnen will. Und so nebenbei macht jetzt Pretender schon mal bekanntschaft mit einer nicht sichtbar geöffneten Dateie.

So, und nun ist Schlafenszeit. :D



Gruß
balu

balu
Beiträge: 150
Registriert: Di 12. Okt 2010, 11:35

Re: Drucken "von Datum bis Datum" Makro

Beitrag von balu » Fr 15. Jun 2018, 11:09

Moin moin.

Ich glaube ich muss mein System doch mal genauer beschreiben und erklären, damit man den Sinn richtig versteht.

Als passenden Bildlichen vergleich ziehe ich OpenOffice heran (egal ob OO.o, AOO oder LO).

Starten von OO. => Hauptdialog ausführen.
In OO ohne eine Datei zu öffnen z.B in den Einstellungen etwas ändern. => Daten kontrollieren.
OO beenden. => Hauptdialog beenden.
OO erneut starten um die Einstellungen zu kontrollieren. => Hauptdialog ausführen andere Daten vergleichen.
In OO eine Datei öffnen um irgendetwas mit ihr zu machen. => Durch den Hauptdialog eine Datei öffnen um ein PDF zu erzeugen.
Datei in OO schliessen, und z.B. die Einstellungen anzupassen. => Datei durch den Dialog beenden und Daten erfassen.

So weit so gut, so weit klar.
Aber nun wirds "schlimm".

OO mit geöffneter Datei crasht, stürzt ab. => Hauptdialog wird mit geöffneter Datei beendet.
Beim erneuten Start von OO kommt das Wiederherstellungs-Fenster. => Es erscheint jetzt der blaue Dialog.
In OO kann nun die Datei wieder hergestellt werden um mit ihr weiter zu arbeiten. => Im blauem Dialog auf "Nein" klicken um die Datei nicht zu schliessen. Es kann mit ihr weitergearbeitet werden.
Oder.
In OO den Wiederherstellungsprozess abbrechen und OO ohne Datei starten. => Im blauem Dialog auf "Ja" klicken um die Datei zu schliessen. Es wird dann der Hauptdialog ausgeführt.

Das war jetzt nur vom Grundprinzip her ein passender Vergleich zwischen OO und dem Hauptdialog.
Es hat also schon seinen tieferen Sinn warum ich das so gemacht hatte wie ich es gemacht habe.

Und es tut mir ja auch ein klein wenig leid, das ich den Blauen Dialog gestern nicht genauer erklärt habe, was ich jetzt aber hiermit im groben nachgeholt habe. Es kann später noch immer eine genauere Erklärung im Blauem Dialog eingebaut werden, warum er erscheint und was das für Folgen hat, wenn man entweder auf den einen oder anderen Button klickt. Aber das muss jetzt nicht sofort sein.


Gruß
balu

Pretender1970
Beiträge: 57
Registriert: Do 30. Nov 2017, 08:34

Re: Drucken "von Datum bis Datum" Makro

Beitrag von Pretender1970 » Fr 15. Jun 2018, 11:11

Guten Morgen ihr Beiden,

wow, ich komm schon gar nicht mehr so hinterher. Das ist eine Flut an neuen
Überlegungen und der Gestaltung der Makros, dass ich erst einmal mir alles Stück für Stück angucken muss, um
etwas zu verstehen.
Ich habe jetzt mal ein paar Dialoge angelegt, so wie sich meine Damen das vom alten Ablauf gewöhnt waren. Ich
hoffe ihr seid mir nicht Böse.
Da wir im Haus alle das gleiche System verwenden (Bildschirmgröße, OO-Version etc. habe ich die Dialoggröße auf
1000 x 1000 angesetzt.
Um einen Dialog zu schließen, habe ich die CommandButton geändert von Standard auf "Abbrechen".

Ich habe auch versucht eine Suchfunktion einzubauen, der das gewünschte Suchergebnis in einem eigenem Tabelleblatt
anzeigt, allerdings wäre es mir lieber, dass er durch das erzeugte Tabellenblatt, dass Ergebnis mir im Textfield anzeigt und
ich dann auf Wunsch, das Tabellenblatt ausdrucken kann.

Also ihr seid beide echt der Hammer, wie kann ich mir das OO beibringen? Habt ihr Buchvorschläge? oder Fernstudium..etc?

Hallo Mikele,

dass mit der Datenübernahme habe ich jetzt verstanden, echt toll erklärt....aber wo liegt mein Denkfehler? Dass es nicht funktioniert.
Ich lege mal meine Datei bei und seit mir nicht böse, wenn es anders gestaltet ist, aber meine Damen brauchen eine einfache Gestaltung,
damit sie nicht durcheinander kommen.

und Balu,

dass mit der externen Datei ist echt cool. Ich frage mich, wie lange ich brauche, um einigermaßen deinem und Mikeles Niveau ansatzweise
zu erreichen....

Gruß Pretender
Dateianhänge
test 15.06.2018.ods
(13.96 KiB) 16-mal heruntergeladen

mikele
Beiträge: 499
Registriert: Sa 23. Jul 2011, 22:09

Re: Drucken "von Datum bis Datum" Makro

Beitrag von mikele » Fr 15. Jun 2018, 12:36

Hallo,
in der Datei sind keine Makros, sodass es schwierig wird, den Fehler zu finden.
Ich lege mal meine Datei bei und seit mir nicht böse, wenn es anders gestaltet ist,
Du bist derjenige, der die Gestaltung letztendlich festlegt. Aber: Nach den Ansatz, dass alles über Dialoge geregelt wird, auf die Daten also nie direkt zugegriffen wird (von deinen Damen), spielt die Gestaltung der Tabellenblätter gar keine Rolle. Die könnten auch komplett ausgeblendet sein und man könnte trotzdem per Makro darauf zugreifen.
Zur Literatur: guckst du hier http://de.openoffice.info/viewtopic.php?f=18&t=1553
Gruß,
mikele

balu
Beiträge: 150
Registriert: Di 12. Okt 2010, 11:35

Re: Drucken "von Datum bis Datum" Makro

Beitrag von balu » Fr 15. Jun 2018, 12:47

Mahlzeit Pretender,

die schlechte Nachricht vorweg.
Deine Datei hat weder ein Makro, noch einen Dialog.
Du hast anscheind das alles in dem OO Ordner *Meine Makros* gespeichert, anstatt das IN der Datei zu speichern. Dadurch hast Du das alles vor Ort, jedoch die Datei geht dabei leer aus, und das im wahrsten Sinne des Wortes.

Du musst also ALLES in die Datei packen, denn sonst haben deine Kolleginen auch nichts davon.
Dazu auch gleich passend zu diesem hier.
wie kann ich mir das OO beibringen? Habt ihr Buchvorschläge?
Ich hatte dir schon gleich so ziemlich am Anfang in diesem Beitrag dir einen Link zu "OOo/LO Volker Lenhardt" gezeigt. Bitte Beitrag noch mal lesen um zu verstehen was ich damit meine.
Eine weitere Adresse hatte ich dir noch früher gezeigt, die ich jetzt noch mal verlinke, jedoch die Startseite:Dannenhöfer
Und in beiden Links findest Du auch Informationen darüber wie man Basic-Module und Basic-Dialoge verschieben und kopieren kann, damit sie in der Datei landen, und nicht bei dir. Du musst dich halt damt schon etwas intensiver befassen.

Ich und Fernstudium?
Jaeinen!
Dies ist ein Forum, klar. Aber es gibt noch ein anderes, älteres Forum wo ich auch noch tätig bin. Und dort gibt es bedeutend viel mehr Informationen, als hier. Und wenn man ein Forum als Studienort bezeichnen kann, so habe ich in dem anderen Forum mein "Fernstudiumsplatz" dauerhaft belegt. :lol:

Und glaub mir, mein damaliges Großprojekt hatte mit einer ganz verrückten Idee sehr sehr sehr sehr klein angefangen. Und ich hatte nicht wirklich Ahnung von Makros und Programmierung. Aber nach gut 3 Jahren hatten wir, der ungewollte Auftragsgeber und ich, eine Datei (genauer gesagt ein System) auf die Beine gestellt was sich ganz gut sehen lässt. Dies geschah aber immer im stetigen Austausch mit dem anfänglich ungewollten Auftraggeber, damit auch Fehler und sonstige Probleme rasch beseitigt werden konnten. Und dabei war mir das andere Forum eine extrem große Hilfe. Ohne dies wär ich über so manche Probleme nicht hinweg gekommen. Aber auch das eben verlinkte war und ist mir noch immer eine Hilfe. Denn ich bin kein Profi, sondern noch immer ein bescheidener Anfänger, mit etwas mehr Ahnung und Erfahrung. Und in meinem Großprojekt steckt sehr vieles drin, was ich hier auch verwenden kann. Ich bin so gesehen ein "Fauler Hund", der Recycling betreibt :lol:. Na ja fast, denn was ich aktuell abgeliefert habe, bereitete mir doch so einiges Kopfschmerzen, die jetzt aber wech sind.


Das du natürlich Zeit brauchst ist verständlich und nachvollziehbar. Und wir sind dir bestimmt nicht böse wenn dein Dialog anders aussieht als unsere Vorschläge, denn das sind sie ja, nur Voschläge.


Gruß
balu

balu
Beiträge: 150
Registriert: Di 12. Okt 2010, 11:35

Re: Drucken "von Datum bis Datum" Makro

Beitrag von balu » Sa 16. Jun 2018, 14:42

Hallo zusammen,

auch wenn es nicht viel ist, so habe ich noch ein paar kleine Änderungen an meiner letzten Datei vorgenommen. Dies kann man aber immer irgendwann mal wo gebrauchen.

Um was gehts?
Ganz einfach!
Der "Datei öffnen"-Dialog funktioniert wohl, aber bisher durfte man nicht auf den "Abbrechen" Button klicken, da dies zu einer Makro Fehlermeldung führte. Und das Problem ist jetzt beseitigt.

Der alte Code dafür sah ja so aus.

Code: Alles auswählen

Sub DateiAuswahl
[...]
'
	oBTN_DateiOeffnen.Enable = True
	
	fExDatei = FileOpenDialog ("Bitte eine Datei auswählen.")
'
'-----------------------------------------------------------------
[...]
End sub
Und die dazugehörige Function.

Code: Alles auswählen

function FileOpenDialog(title as String) as String
    Filepicker1 = createUnoService("com.sun.star.ui.dialogs.FilePicker")
    Filepicker1.Title = title
    Filepicker1.execute()
    Files = Filepicker1.getFiles()
    FileOpenDialog = Files(0)
End function
Und nun 2 Zeilen in der Sub hinzu.

Code: Alles auswählen

Sub DateiAuswahl
[...]
'
		bBreak = False

	oBTN_DateiOeffnen.Enable = True
	
	fExDatei = FileOpenDialog ("Bitte eine Datei auswählen.")

	    if bBreak = True then EXIT SUB	 
'
'-----------------------------------------------------------------
[...]
bBreak ist eine Variable vom Typ Boolean, die nur die Wahrheitswerte True oder False kennt.
Beim Aufruf der Sub wird ihr der Wahrheitswert False zugewiesen.
Und beim verlassen der Function FileOpenDialog wird überprüft ob sich das geändert hat. Sollte das der Fall sein, so wird die Sub verlassen.
ABER!
Da diese Sub per Button aus dem Dialog aufgerufen wurde, wird die Sub nicht wirklich verlassen. Und so verschwindet nur der Dialog zum Datei öffnen, und man gelangt wieder auf der dementsprechenden Dialogseite.

Das war noch nicht alles, denn die Function FileOpenDialog musste ich auch noch ein klein wenig abändern, damit sie beim drücken des Buttons "Abbrechen", einen Wahrheitswert übergibt.
Und das sieht wie folgt aus.

Code: Alles auswählen

function FileOpenDialog(title as String) as String
    Filepicker1 = createUnoService("com.sun.star.ui.dialogs.FilePicker")
    Filepicker1.Title = title  
    
		if Filepicker1.execute() = 0 then
	    	bBreak = True
	    end if

    Files = Filepicker1.getFiles()
    FileOpenDialog = Files(0)
End function
Wenn man jetzt also auf den Button "Abbrechen" drückt, dann ergibt das den Wert 0. Diesen Wert kann man nicht ändern, da er vom System fest vorgegeben ist, aber man kann ihn abfragen. Und wenn die Abfrage diesen Wert erkennt, dann wird der Variablen der Wahrheitswert True zugewiesen. Und die aufrufende Sub DateiAuswahl wertet das dann wie eben beschrieben aus.


Okay, da wir je jetzt eine Datei öffnen können, wollen wir auch einen Speicherpfad auswählen können, aber auch mit einem dementsprechendem Dialog.
Dazu habe ich mir heute aber keine besonders große Mühe gegeben, und nur einen zusätzlichen Button in dem Hauptdialog eingebaut. Und der Dialog zum Speicherpfad auswählen hat auch einen Button "Abbrechen". Und da dieser Dialog einfacher zu Programmieren ist, habe ich auch gleich wieder eine Abfrage eingebaut die den "Abbrechen" Button abfragt.
Und hier ist der gesamte Code dafür.

Code: Alles auswählen

Sub SpeicherPfadAuswaehlen

	FolderDialog = createunoservice("com.sun.star.ui.dialogs.FolderPicker")

		if FolderDialog.execute = 0 then exit sub

		oBTN_ZielPfad.Model.Label = "Speicherpfad ist gewählt"
		oBTN_ZielPfad.Enable = False
		
End Sub
Mehr brauchts nicht.
Und wenn man einen Pfad ausgewählt hat, dann wird das auch anschließend auf dem Button vermerkt.
Erst wenn man den Hauptdialog beendet und ihn wieder erneut aufruft, dann wird dieser Button wieder aktiv.

Ach ja!
Noch ne kleine Ergänzung!
Das was für den "Abbrechen"-Button gilt, gilt genau so für das das Rote X rechts oben in den dementsprechenden Dialogen. Eigentlich ist es ja das Weiße X auf rotem Hintergrund ;)

Für heute habe ich keine Lust mehr. :D



Gruß
balu
Dateianhänge
NEU_mit_TESTDATEN_ohne-EXCEL-Kontakt_0.4.4.ods
(22.25 KiB) 18-mal heruntergeladen

mikele
Beiträge: 499
Registriert: Sa 23. Jul 2011, 22:09

Re: Drucken "von Datum bis Datum" Makro

Beitrag von mikele » Sa 16. Jun 2018, 17:09

Hallo Balu,
Der "Datei öffnen"-Dialog funktioniert wohl, aber bisher durfte man nicht auf den "Abbrechen" Button klicken, da dies zu einer Makro Fehlermeldung führte. Und das Problem ist jetzt beseitigt.
Du könntest auch einfach testen, ob die Sub FileOpenDialog einen leeren String zurückgibt.
Anstelle von

Code: Alles auswählen

if bBreak = True then EXIT SUB
nur

Code: Alles auswählen

if fExDatei="" then EXIT SUB
Gruß,
mikele

Antworten