Feldänderung in Calc oder Base dokumentieren lassen
Moderator: Moderatoren
Feldänderung in Calc oder Base dokumentieren lassen
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
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
- 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
Ein letzte Änderung kannst Du mit Bearbeiten>Änderungen>Aufzeichnen automatisch dokumentieren lassen.Reginald hat geschrieben:ich will mir eine Änderung einer Zelle [...] mit Datum/Uhrzeit 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)
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)
Re: Feldänderung in Calc oder Base dokumentieren lassen
Hallo,
hier zwei kurze Makros für die Calc-Lösung mit einer globalen Variablen:
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
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
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
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
Re: Feldänderung in Calc oder Base dokumentieren lassen
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
@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
Re: Feldänderung in Calc oder Base dokumentieren lassen
Hast Du die oberste Zeile?
Gruß R
"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.F3K Total hat geschrieben:global ocell as object
Gruß R
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Feldänderung in Calc oder Base dokumentieren lassen
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
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
Re: Feldänderung in Calc oder Base dokumentieren lassen
Welche konkreten Probleme tauchen auf?Da kommt die eingebaute Zelländerungsfunktion nicht mehr mit ...
Gruß
Stephan
Re: Feldänderung in Calc oder Base dokumentieren lassen
Hallo Frieder,
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:
Anbei ein Beispiel
Gruß R
Genau, es ist eine Meinung, und die Frage war eine andere, nämlich:Frieder D. hat geschrieben:Das ist meiner Meinung nach wesentlich sinnvoller,
als nach jeder Änderung einer Zelle ein Makro aufzurufen.
So, habe die Sache jetzt noch verfeinert.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.
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
Gruß R
- Dateianhänge
-
- insert_Date_on_modify.ods
- (11.37 KiB) 183-mal heruntergeladen
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
Re: Feldänderung in Calc oder Base dokumentieren lassen
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.
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
Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Re: Feldänderung in Calc oder Base dokumentieren lassen
Hallo,
Erbitte genauere Beschreibung.
Tja, weiß ich auch nichtIch habe versucht das Makro 1:1 bei mir zu übertragen, bekomme dann aber einen Laufzeitfehler.
Ich weiß echt nicht, was ich falsch mache ...
Erbitte genauere Beschreibung.
Gruß
Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Re: Feldänderung in Calc oder Base dokumentieren lassen
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:
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:
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.
Trotzdem war die Deklaration noch nicht perfekt.
Weil keine Angabe zum Datentyp gemacht wurde, sind beide Variablen vom Typ "Variant".
Deshalb:
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.
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:
Array dimensionieren und vorhandene Daten aus Zellbereich in Array schreiben:
Jetzt hast Du ein "Array von Arrays", welches mit weiteren Daten befüllt werden kann, z.B. mit einer Schleife.
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
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.
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
"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
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
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
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
------------------------------------------------------------------
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")
Code: Alles auswählen
DATEN()=oRange.getDataArray()
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
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())
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
Craig
_____________________________________________________
WIN 10 Pro 64-Bit • LO 7.1.5.2 (x64) • AOO 4.1.8
Re: Feldänderung in Calc oder Base dokumentieren lassen
WARUM deklarierst Du die Variable nicht?Ich bekomme dauernd gesagt Variable nicht definiert beu --> sTemp = "n/a"
z.B. oben ins Modul:
Code: Alles auswählen
Public sTemp
Gruß
Stephan