Änderungen einer Tabelle protokollieren

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Änderungen einer Tabelle protokollieren

Re: Änderungen einer Tabelle protokollieren

von turtle47 » So, 28.03.2010 16:56

Hallo Alex,
AFritz hat geschrieben:Aktuell hab ich das Problem, das immer nur ein Tabellenblatt in der Prokollierung auftaucht,
Das liegt daran, dass Du den Listener für ein bestimmtes Tabellenblatt aktivierst.

Code: Alles auswählen

   oModListener = CreateUnoListener("MyList3_", "com.sun.star.util.XModifyListener")
   oZellen = thisComponent.sheets().getByName("Bestandsaenderung")'<<<<<<<
AFritz hat geschrieben:zum anderen werden die Einträge immer mehr, auch wenn ich den Listener stoppe hat das keine Auswirkung. Der Eintrag wird geschrieben, und dies auch mal doppelt, dreifach, vierfach....
Nuja, die Listener sind mit einer Menge Bugs behaftet. In Deinem Fall ist es so, dass dieser Listener nicht korrekt beendet wurde auch wenn Du folgendes auslöst:

Code: Alles auswählen

sub RemoveModListener
   on error resume next
   oZellen.removeModifyListener(oModListener)
   on error goto 0
end sub
Wenn Du ihn wie folgt beenden möchtest,

Code: Alles auswählen

sub RemoveModListener
   oZellen.removeModifyListener(oModListener)
end sub
bekommst Du eine Fehlermeldung.
Also, beim oberen Code wird der Fehler einfach übersprungen und Du startest dann teilweise den Listener neu, so dass dieser dann mehrfach vorhanden ist.

Zu dem gibt es ja folgenden Hinweis:
onidarbe hat geschrieben: ---------------------------------------------- XModifyListener ---------------------------------------------------------
ooBUGG: ..._disposing doesnt get called. So one cant know when listener is suddenly gone !!!
ooBUGG: No way to now what range has changed when using drag-fill, nothing in oEvent nor is it selected jet !!!
Triggers before changing the selection of a drag-fill and before moving the active-cell.
Doesnt stop with a print-preview. It keeps running as far as I know...
To be able to stop it, you need to put the range in an object, because ThisComponent.Sheets(0) doesnt seem to stay the same when using it to remove the listener !!!???
Starts every time an other listener up! So never start it twice.
Darau bin ich nie richtig schlau geworden. :(

Jürgen

Änderungen einer Tabelle protokollieren

von AFritz » So, 28.03.2010 15:45

Hallo Zusammen,

ich arbeite nun seit geraumer Zeit an einem Makro und häng da nun ein bisschen in der Luft...

Folgendes Szenario:
Ein Tabellendokument mit 5 Tabellenblättern.
Auf zwei Tabelleblättern werden Daten eingetragen.
Ein Tabellenblatt macht Auswertungen und ist vor Änderungen geschützt (nur schauen, nichts anfassen).
Ein Tabellenblatt zieht aus den eingegebenen Daten bestimmt Inhalte, die später als CSV exportiert werden sollen, auch kein Eingriff manuell erforderlich.
Das letzte Tabellenblatt soll nun Änderungen an den Daten aufzeichnen. => Wer (Username), Wann (Datum + Uhrzeit), Tabellenblatt, Zelle, Wert (leer wenn der Inhalt gelöscht wurde, bzw. eben das was reingeschrieben wurde. Das Blatt wird durch das Makro vor Änderungen geschützt (vor Eintragung der Änderungen erfolgt eine Entsperrung, danach wieder eine Sperrung).

Mein Code sieht bisher so aus:

Code: Alles auswählen

REM  *****  BASIC  *****
Option Explicit
private oModListener as Object
private oZellen as Object
private oZelle as Object
private oZielTab as Object
private oDoc as Object
private oCur as Object
private a as Object
private sZellAdr as string

sub AddModListener
	on Error resume next
	RemoveModListener
	oModListener = CreateUnoListener("MyList3_", "com.sun.star.util.XModifyListener")
	oZellen = thisComponent.sheets().getByName("Bestandsaenderung")
	oZellen.addModifyListener(oModListener)
end sub

sub RemoveModListener
	on error resume next
	oZellen.removeModifyListener(oModListener)
	on error goto 0
end sub

REM Aktion bei Änderung der Zellwerte
sub MyList3_Modified(oEvent)
	oZelle = ThisComponent.currentSelection
	if oZelle.supportsService("com.sun.star.sheet.SheetCell") then
		DatensatzEintragen(oZelle)
	end if

end sub


REM Datensatz eintragen
sub DatensatzEintragen
  dim iZe as long   'letzte Zeile
  
  REM neue Eintragezeile extrahieren
  oDoc = ThisComponent
  oZielTab = thisComponent.sheets.getByName("Protokoll")

  '### REM hier entsperren  
  'oZielTab.unprotect("test")

  oCur = oZielTab.createCursor
  oCur.gotoEndofUsedArea(false)
  iZe = oCur.RangeAddress.EndRow() + 1
  
  REM Zell Adresse extrahieren
  a = split(oZelle.ColumnDescriptions(0), " ")
  sZellAdr = Trim(a(1))
  a = split(oZelle.RowDescriptions(0), " ")
  sZellAdr = sZellAdr & trim(a(1))

  REM Jetzt eintragen
  with oZielTab
    .getCellbyPosition(0, iZe).string =  environ("username")  
    .getCellbyPosition(1, iZe).value = now()
    .getCellbyPosition(2, iZe).string = Time()
    .getCellbyPosition(3, iZe).string = oZelle.SpreadSheet.Name
    .getCellbyPosition(4, iZe).string = sZellAdr
    .getCellbyPosition(5, iZe).string = oZelle.formula
  end with

    '### Tabelle hier wieder sperren
    'oZielTab.protect("test")
   	'oDoc.store()
end sub
Zum testen habe ich mir Buttons gebaut, die das Makro starten und den Listener ausschalten. Wenn ich es fertig bekomme, dann wird das Ereignis das Öffnen und Schließen zum starten und beenden sein.
Aktuell hab ich das Problem, das immer nur ein Tabellenblatt in der Prokollierung auftaucht, zum anderen werden die Einträge immer mehr, auch wenn ich den Listener stoppe hat das keine Auswirkung. Der Eintrag wird geschrieben, und dies auch mal doppelt, dreifach, vierfach....

Hat mir vielleicht jemand eine Idee, oder was ich da übersehe? Bin leider noch nicht ganz so tief in den Makros, wie ich es sein wollen würde...

Vielen Dank schonmal!

Gruß
Alex

Nach oben