Feldänderung in Calc oder Base dokumentieren lassen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Reginald
****
Beiträge: 114
Registriert: Fr, 23.07.2010 23:58

Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von Reginald »

Hallo zusammen,

ich will mir eine Änderung einer Zelle / in einem Feld in einer anderen Zelle / einem anderen Feld mit Datum/Uhrzeit dokumentieren lassen.

Ob ich das Gesamtproblem mit Base löse oder mit Calc weiß ich noch nicht.

In Calc: Ich habe beispielsweise in Spalte A Notizen stehen. Wenn ich in A1 etwas eintippe und A1 verlasse und A1 dann anders ist als vorher, soll er in B1 Datum/Uhrzeit , also jetzt() reinschreiben.

In Base würde ich mir das in einem normalen Formular noch zurechtfummeln können, allerdings - sollte ich das Gesamtproblem in Base lösen wollen - müßte sich das auf ein Feld / eine Spalte in einer Detailtabelle beziehen, und da verließen sie ihn dann... Also ich habe ein Formular und in diesem Formular lasse ich mir 1:n verknüpft eine Detailtabelle anzeigen, nicht als Unterformular sondern als Tabelle. Wenn ich dann dort in der Spalte "Notiz" etwas ändere, soll er mir das in der nächsten Spalte, die "ChangeDateNotiz" heißt, mit Zeitstempel dokumentieren.

Kann mir jemand sagen, wie ich das vom Ansatz her löse?

Danke!

Grüße
Reginald
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von komma4 »

Reginald hat geschrieben:ich will mir eine Änderung einer Zelle [...] mit Datum/Uhrzeit dokumentieren lassen.
Ein letzte Änderung kannst Du mit Bearbeiten>Änderungen>Aufzeichnen automatisch dokumentieren lassen.

Hilft Dir das schon?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von F3K Total »

Hallo,
hier zwei kurze Makros für die Calc-Lösung mit einer globalen Variablen:

Code: Alles auswählen

global ocell as object

Sub S_get_right_cell
oselection=thiscomponent.currentselection
osheet=thiscomponent.currentcontroller.activesheet
nRow = oselection.rangeaddress.Endrow
nColumn = oselection.rangeaddress.endcolumn
ocell = osheet.getcellbyposition(nColumn+1,nRow)
End Sub

Sub S_insert_Date_on_modify
ocell.string = now()
end sub
Wenn Du das erste dem Tabellenereignis "Auswahl geändert", das zweite dem Ereignis "Inhalt geändert" zuordnest, geht es.
Ich habe keinen "Fehlerabfang", wenn Du also z.B. mehrere Zellen auswählst gibt es eine Fehlermeldung.
Der aktuelle Timestamp wird in die Zelle rechts von der geänderten Zelle geschrieben.

Viel Erfolg, Gruß R
Reginald
****
Beiträge: 114
Registriert: Fr, 23.07.2010 23:58

Re: Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von Reginald »

Hallo,

@Winfried: Vielen Dank, die Funktion kenne ich, allerdings hilft die nicht wirklich; Ich muß mir in einer großen Tabelle bestimmte Änderungen dokumentieren lassen um dann beispielsweise einmal wöchentlich einen Bericht zu drucken über alles, was geändert worden ist. Da kommt die eingebaute Zelländerungsfunktion nicht mehr mit ...

@F3K Total: Vielen Dank ebenfalls, allerdings klappt das bei mir noch nicht ganz. Also ich habe die Makros angelegt und bei dem Sheet Event (ich arbeite mit der engl. OO Version) hinterlegt. Wenn ich eine Zelle ändere, kommt ne Fehlermeldung in der zweiten Routine bei "ocell.string = now()" "Object variable not set."

Klar, er geht nämlich in die erste Routine gar nicht rein und damit ist oCell leer (so wie ich das verstehe). Habe mir in der ersten Routine einmal eine msgbox eingebaut, die mir die Variablen anzeigen soll, aber da wird nie was angezeigt - deshalb meine Schlußfolgerung, dass die Routine nie aufgerufen wird.

Oder: Unter welchen Umständen sollte sie denn aufgerufen werden, also was bedeutet dieses "Selection changed"?

Grüße
Reginald
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von F3K Total »

Hast Du die oberste Zeile?
F3K Total hat geschrieben:global ocell as object
"Auswahl geändert" heißt du bist mit dem Cursor in eine andere Zelle gesprungen. Beim Öffnen springst Du auch in eine "andere" als keine Zelle, daher wird über dieses Ereignis der Ort der Änderung vor der Änderung ermittelt, und damit die Zielzelle des Zeiteintrages gefunden.
Gruß R
Frieder D.
****
Beiträge: 115
Registriert: Di, 10.01.2012 10:51
Kontaktdaten:

Re: Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von Frieder D. »

Hallo Reginald

Es gibt die Extension DateTime2 Von Winfried

http://extensions.libreoffice.org/exten ... /datetime2
http://www.re-solutions.de/ooo/makros/
http://extensions.services.openoffice.o ... /DateTime2

Sie stellt dir verschiedenen Makros zur Verfügung, die in der Aktiven Zelle einen Zeitstempel oder Das Datum setzen.
(Das Format lässt sich auch leicht anpassen)
Du kannst das gewünschte Makro einfach mit einer Tastenkombination belegen.
Das ist meiner Meinung nach wesentlich sinnvoller,
als nach jeder Änderung einer Zelle ein Makro aufzurufen.
Natürlich könnte man das mit einem Listener relativ einfach voll Automatisieren,
aber ein Makro mit einer Tastenkombination aufzurufen macht wirklich nicht viel Arbeit,
und ist wesentlich weniger Fehler anfällig.

Gruß Frieder
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von Stephan »

Da kommt die eingebaute Zelländerungsfunktion nicht mehr mit ...
Welche konkreten Probleme tauchen auf?


Gruß
Stephan
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von F3K Total »

Hallo Frieder,
Frieder D. hat geschrieben:Das ist meiner Meinung nach wesentlich sinnvoller,
als nach jeder Änderung einer Zelle ein Makro aufzurufen.
Genau, es ist eine Meinung, und die Frage war eine andere, nämlich:
Reginald hat geschrieben:ich will mir eine Änderung einer Zelle / in einem Feld in einer anderen Zelle / einem anderen Feld mit Datum/Uhrzeit dokumentieren lassen.
So, habe die Sache jetzt noch verfeinert.
Das Zeitstempeln reagiert nur auf Zellen im angegebenen Bereich (hier A2:A500).
Das Datum wird nicht als String sondern als Wert übergeben, daher muß die Zielspalte/der Zielbereich entsprechend als Datum/Zeit formatiert sein.
Funzt:

Code: Alles auswählen

global ocell as object, bfound as boolean

Sub S_get_right_cell
bfound=false
oselection=thiscomponent.currentselection
osheet=thiscomponent.currentcontroller.activesheet
oCellRange = oSheet.getCellRangeByName("A2:A500")'aktiver Bereich in dem die Änderungen vorgenommen werden sollen
if oSelection.supportsService("com.sun.star.sheet.SheetCell") then
 oCellsRangeAddress = oSelection.RangeAddress
 if oCellRange.queryIntersection(oCellsRangeAddress).count = 1 then'Die selektierte Celle liegt in dem benannten Bereich
  nRow = oselection.rangeaddress.Endrow
  nColumn = oselection.rangeaddress.Endcolumn
  ocell = osheet.getcellbyposition(nColumn+1,nRow)'nColumn+1 heißt, das Datum wird in der Spalte rechts von der gänderten Zelle eingetragen
  bfound=true
 endif
endif
End Sub

Sub S_insert_Date_on_modify
if bfound=true then ocell.value = now()
end sub
Anbei ein Beispiel

Gruß R
Dateianhänge
insert_Date_on_modify.ods
(11.37 KiB) 181-mal heruntergeladen
craig22
****
Beiträge: 135
Registriert: Mi, 19.08.2020 13:47

Re: Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von craig22 »

Hallo,

ohne Makro geht es so:
Wissensarchiv: Mit der HEUTE()-Funktion in Calc erzeugtes Datum fixieren
Bitte ALLES lesen, denn es sind Bedingungen daran geknüpft, damit diese Methode funktioniert.

ODER
mit Makro
In den Beispielen werden diverse Variable auf Gültigkeit = Global gesetzt, dies würde ich max. auf Public ändern.
Welche Gültigkeit haben Variablen?

Global gesetzte Variable bergen die Gefahr, dass diese nach Beenden eines Moduls immernoch gültig sind!
Ausserdem behalten sie ihre Gültigkeit über alle Bibliotheken hinweg.

Deshalb wird im allgemeinen davon abgeraten die Gültigkeit auf Global zu setzen.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
craig22
****
Beiträge: 135
Registriert: Mi, 19.08.2020 13:47

Re: Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von craig22 »

Hallo,
Ich habe versucht das Makro 1:1 bei mir zu übertragen, bekomme dann aber einen Laufzeitfehler.
Ich weiß echt nicht, was ich falsch mache ...
Tja, weiß ich auch nicht :roll:

Erbitte genauere Beschreibung.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
craig22
****
Beiträge: 135
Registriert: Mi, 19.08.2020 13:47

Re: Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von craig22 »

Hallo,

ich habe den Eindruck, dass Du Dich zwar schon einigermaßen mit der Programmierung auskennst,
aber es sind noch Passagen im Code die daraufhin deuten, dass noch Nachholbedarf ist.

Mitten in Deinem Code steht diese Anweisung:

Code: Alles auswählen

Option Explicit

Global oRange
Global oListener
Dies ist auf keinen Fall korrekt.
"Option Explicit" muss immer an oberster Stelle des Codes stehen. Also noch über Deiner Function!

Viele Programmierer verzichten auf die Anweisung "Option Explicit", aus meiner Sicht ist
diese sehr nützlich, gerade weil man auf Deklarationsfehler hingewiesen wird.
Auch in diesem Buch wird dazu geraten:
http://www.prooo-box.org/live/dokumenta ... eutsch.pdf

Siehe auch hier:
https://wiki.openoffice.org/wiki/DE/Mak ... #Variablen

Der nächste Punkt ist:

Code: Alles auswählen

Global oRange
Global oListener
Man darf global deklarieren, aber es ist nicht ganz ungefährlich, denn eine solch deklarierte
Variable bleibt auch dann noch gültig wenn der eigentliche Code abgearbeitet wurde.
Sie wird erst dann aus dem Speicher gelöscht, wenn Office und die Basic-IDE geschlossen werden!

Deshalb ist es so besser, weil Public nur innerhalb des Moduls gültig ist.

Code: Alles auswählen

Public oRange
Public oListener
Trotzdem war die Deklaration noch nicht perfekt.
Weil keine Angabe zum Datentyp gemacht wurde, sind beide Variablen vom Typ "Variant".
Deshalb:

Code: Alles auswählen

REM  *****  BASIC  *****
Option Explicit

Public oRange as Object
Public oListener as Object
Dies spiegelt exakt die Reihenfolge wieder, wie sie im Modul stehen sollte.
Erst → Option Explicit
Dann → die modulweit gültigen Variablen.

Andere Varablen werden in den Functions und den Sub-Routinen deklariert.
Diese sind dann auch nur dort gültig, wo sie deklariert wurden.

Innerhalb Deiner Routine "Sub Benutzerdaten" verwendest Du z.B.
i
oSheet
oCell
Alle drei sind nicht deklariert. Dieses ist die nächste Fehlerquelle.

Code: Alles auswählen

Sub Benutzerdaten
Dim nutzer as Object 		' Objekt
Dim reg_daten as Object  		' Objekt
Dim oSheet as Object 		' Objekt
Dim oCell as Object 			' Objekt
Dim i as Long				' Integer oder Long. Bei diesem Zähler würde Integer ausreichen.

Dim DATEN(13, 1)			' Arrays verwende ich auch meist den Datentyp VARIANT, weil Arrays unterschiedliche Inhalte haben können
Dim ergebnis 				' STRING ?

Dim profil(0) as new com.sun.star.beans.PropertyValue 
https://wiki.openoffice.org/wiki/DE/Mak ... c_Tutorial

------------------------------------------------------------------
Eine Optimierung liegt noch in der Abarbeitung Deines Arrays "DATEN(13, 1)".

Ein Zellbereich ist im Grunde nichts anderes als ein "Array von Arrays".
Dein Array kann anders dimensioniert und befüllt werden.
Danach läßt es sich in einem Rutsch in das Tabellenblatt schreiben.
Zellbereich referenzieren:

Code: Alles auswählen

Dim oRange as Object
oRange=osheet.getCellRangeByName("A1:A10")
Array dimensionieren und vorhandene Daten aus Zellbereich in Array schreiben:

Code: Alles auswählen

DATEN()=oRange.getDataArray()
Jetzt hast Du ein "Array von Arrays", welches mit weiteren Daten befüllt werden kann, z.B. mit einer Schleife.

Code: Alles auswählen

For i = 0 to uBound(DATEN())	' ZEILEN bzw. Datensätze
	for j = 0 to 9 	' Spalten bzw. Felder
		DATEN(i)(j) = ' irgendwelche Daten
	next j
Next i 
Wie die Schleife gestaltet ist, hängt von den gewünschten Daten ab, so kann man u.U. die innere Schleife weglassen.
Wichtig ist nur die richtige Indexanpassung, ggf. muss ein separater Zähler eingebaut werden.


Array in Tabelle schreiben

Code: Alles auswählen

oRange.setDataArray(DATEN())
Der Zellbereich muss genau so groß sein wie die Array-Dimnsionierung.

Ich hoffe Du kommst mit meine Info's ein Stück weiter.

Wenn Du noch Probleme hast, dann bitte möglichst genau beschreiben. Danke.
Gruß

Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Feldänderung in Calc oder Base dokumentieren lassen

Beitrag von Stephan »

Ich bekomme dauernd gesagt Variable nicht definiert beu --> sTemp = "n/a"
WARUM deklarierst Du die Variable nicht?

z.B. oben ins Modul:

Code: Alles auswählen

Public sTemp
Dir ist ein ganzer Post dazu geschrieben worden! WARUM liest Du ihn nicht?


Gruß
Stephan
Antworten