Verknüpfungen automatisch beim Speichern löschen

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

Moderator: Moderatoren

KingEisbaer
**
Beiträge: 31
Registriert: Mi, 02.01.2013 18:46

Verknüpfungen automatisch beim Speichern löschen

Beitrag von KingEisbaer »

Halloo miteinander,

folgendes Problem besitze ich und habe keinen Ansatzpunkt.
Ich habe eine Write-Datei was als Vorlage dient, über DDE-Felder mit einer Calc-Datei Verknüpft ist. Diese Write-Datei wird über die Calc-Datei mittels eines Makros per Ausführung dieses Makros selbstständig aktualisiert und unter einen anderen Namen abgespeichert. Nun ist mein Problem:

* wenn man die abgespeicherte Write-Datei, die mit dem Makro erzeugt wurde öffnet, aktualisiert sich ja die Datei gleich automatisch.

Dies soll aber nicht geschehen, da sich nur die eine Write-Datei (die als Vorlage dient) immer wieder aktualisieren darf, und nicht die abgespeicherte Datei.

Daher meine Frage: Ist es möglich per Makro die Verknüpfungen zu löschen bzw. zu deaktivieren und dan abzuspeichern, so das sich die Write-Datei, die als Vorlage dient noch aktualisieren lässt, aber nicht die Datei die unter ein anderen Namen abgespeichert wird.

Hoffe es findet sich eine Lösung. Ist zwar nicht einfach aber schonmal Danke
Gruß
KingEisbaer

Zum besseren Verstehen hier der Macro-Code

Code: Alles auswählen

REM  *****  BASIC  *****

sub S_open_linked_Writer
    thisComponent.store
    dim args(0) as  new com.sun.star.beans.PropertyValue
    args(0).Name = "UpdateDocMode"
    args(0).Value = 1
    sFile = "E:\Arbeitsplan_VORLAGE.odt" ' Windows
    sURL = ConvertToURL(sFile)
    oDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, args)

Dim sFileName1 as String
Dim sFileName2 as String
Dim sDatum as String
Dim sDatum2 as String
Dim sNeuerName as String
dim dummy()

   sFileName1 = "Wochenarbeitsplan von "
   sFileName2 = " bis "
   sDatum = DateValue(thisComponent.Sheets(0).getCellRangeByName("C8").String)
   sDatum2 = DateValue(thisComponent.Sheets(0).getCellRangeByName("E8").String)
   sNeuerName = "E:\" & sFileName1 & sDatum & sFileName2 & sDatum2 & ".odt"

      print sNeuerName

   dateiurl = converttourl(sNeuerName)
   odoc.storeAsURL(dateiurl,dummy())

oDoc.close (true)

End Sub
Systeminformationen
Betriebssystem: Windows 7 Ultimative
OpenOffice Version: 3.4.1
KingEisbaer
**
Beiträge: 31
Registriert: Mi, 02.01.2013 18:46

Re: Verknüpfungen automatisch beim Speichern löschen

Beitrag von KingEisbaer »

Haool,

Hat keiner einen Lösungsansatz parat??? :(
Systeminformationen
Betriebssystem: Windows 7 Ultimative
OpenOffice Version: 3.4.1
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Verknüpfungen automatisch beim Speichern löschen

Beitrag von balu »

Hallo KingEisbaer,

sorry, aber ich bin selber noch ein Anfänger wenn es um solch spezielle Dinge geht. Ich hatte mich wohl mit XRAY wegen der Problematik befasst, konnte aber bis jetzt noch nicht den richtigen Dreh herausfinden wie diese Verknüpfung gelöscht/gelöst werden kann. Und die SuFu hatte mir auch noch nicht den richtigen Wink gegeben :(.

Vielleicht sieht ja jetzt jemand anderer deinen Beitrag und kann dir helfen.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
KingEisbaer
**
Beiträge: 31
Registriert: Mi, 02.01.2013 18:46

Re: Verknüpfungen automatisch beim Speichern löschen

Beitrag von KingEisbaer »

Hallo,

ich habe folgendes Makro gefunden

Code: Alles auswählen

REM  *****  BASIC  *****
'Entfernt alle Bereiche eines Writerdokuments,
'wenn das dokument nicht als Vorlage(*.*.ott) abgespeichert ist. 
'Dabei bleibt der Inhalt der Bereiche  erhalten, 
'aber er ist somit nicht mehr in den Bereiche, 
'und die Verknüpfungen sind auch gelöscht.
Sub bereiche_entfernen
dim oDoc as Object
dim oBereiche as Object
dim i As Integer
Dim sExtension As String
dim aNames() As String
'die Bibliothek "Tools" wird für die Funktion " GetFileNameExtension(oDoc.Title)" benötigt
GlobalScope.BasicLibraries.LoadLibrary("Tools")'Bibliothek "Tools" ladem
  oDoc=thisComponent 'Aktuelles Dokument
  If oDoc.haslocation()Then 'ünerprüfen, ob es schon abgespeichert wurde
  sExtension = GetFileNameExtension( oDoc.Title) 'Endung herausfinden
    if sExtension <> "ott" Then 'Wenn es die Vorlagen-Eendung ist abbrechen
      oBereiche =oDoc.getLinks().getByName("Bereiche") 'alle Bereiche
      aNames()= obereiche.getElementNames 'Namen aller Bereiche
      for i=0 To UBound(aNames()) 'Schleife über alle Bereiche
        oBereiche.getByName(aNames(i)).dispose 'Alle Bereiche löschen.
        ' Dabei wird der Inhalt der Bereiche nicht gelöscht.
      Next
    end if 
  end if
End Sub
Ich wollte nun wissen, ob ich es einfach nur in mein Makro mit einfügen muss oder noch was verändern muss???
Also ich glaube nur einfügen klappt nicht weil dan der Fehler "Variable oDoc schon difiniert" erscheint
Systeminformationen
Betriebssystem: Windows 7 Ultimative
OpenOffice Version: 3.4.1
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Verknüpfungen automatisch beim Speichern löschen

Beitrag von balu »

Hallo

das gleiche Makro hatte ich auch gefunden, jedoch kann das so nicht verwendet werden, unanhängig von deiner Fehlermeldung. Begründung folgt.

Es gibt ja die beiden Tools Xray und Mri. Und ich hatte mit Xray eine Writer-Datei untersucht. Und dabei hatte ich festgestellt, dass es 7 Verlinkungen gibt:

"Tabellen"
"Textrahmen"
"Grafiken"
"OLE-Objekte"
"Bereiche"
"Überschriften
"Textmarken"

Das Makro von Frieder ist für Bereiche ausgelegt, was aber nicht bei dir zutrifft da es sich um Tabellen handelt.

Ich hatte schon Erfolglos versucht das Makro leicht geändert anzupassen und ans laufen zu kriegen.

Code: Alles auswählen

Sub bereiche_entfernen
    dim oDoc as Object, oBereiche as Object
    dim i As Integer
    dim aNames() As String
      oDoc = thisComponent 'Aktuelles Dokument

          oBereiche = oDoc.getLinks().getByName("Tabellen")
          aNames() = obereiche.getElementNames
          
          for i = 0 To UBound(aNames())
            oBereiche.getByName(aNames(i)).dispose
          Next
End Sub
Auch dieser Hinweis
Frieder hat geschrieben: Kopiere den Code in ein Modul der Standard Bibliothek des ott -Dokument, und verknüpfe das
Makro "bereiche_entfernen" wie oben geschildert mit dem Ereignis "Dokument wurde gesichert als"
hat nicht zum Erfolg geführt. :(


weil dan der Fehler "Variable oDoc schon difiniert" erscheint
Wenn Du das Makro im gleichen Modul an das erste hier gepostete Makro dransetzt, dann ist das ja auch klar. Denn dort wird ja schon oDoc wie folgt defeniert.

Code: Alles auswählen

oDoc = StarDesktop.loadComponentFromURL(sURL, "_blank", 0, args)
Und dabei handeltes sich ja schon um eine Writer-Datei. Theoretisch könntest Du jetzt die Zeile

Code: Alles auswählen

  oDoc=thisComponent 'Aktuelles Dokument
ersatzlos löschen. Theoretisch deshalb, weil ja das Makro von Frieder momentan nicht für unsere Zwecke umgeschrieben werden kann.


Es tut mir wirklich leid das ich dir noch nicht weiter helfen kann, und das sich keiner von unseren wirklichen Spezialisten zu Wort meldet. Wo seid ihr denn alle, steckt ihr im Fasching fest? :wink:



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
KingEisbaer
**
Beiträge: 31
Registriert: Mi, 02.01.2013 18:46

Re: Verknüpfungen automatisch beim Speichern löschen

Beitrag von KingEisbaer »

Danke erstmal für deine Antwort und deren Unterstützung.
Systeminformationen
Betriebssystem: Windows 7 Ultimative
OpenOffice Version: 3.4.1
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Verknüpfungen automatisch beim Speichern löschen

Beitrag von balu »

Hallo KingEisbaer,

oh mannn! Wat fürn Theater! Ich hab mir nen Wolf gesucht! Und das nicht nur mittels Xray, nein, auch via google. Ich weiß ja nicht wie es dir, beziehungsweise anderen ergeht, aber ich kann momentan keine Verbindung zu dem englischen Forum http://www.oooforum.org aufbauen. Auch wenn mein englisch nicht wirklich geeignet ist um alles zu verstehen was dort geschrieben wird, so hatte ich doch zumindest die Hoffnung einen Code-schnipsel zu finden.

Und jetzt hatte ich doch noch mal google angeschmissen, und nach einem geeigneten Thread in dem genannten Forum gesucht. Und da ja google die Möglichkeit bietet in derem Cache zu suchen, hatte ich das auch gemacht. Das Ergebnis:

Trommelwirbel
Bild


Ich hab einen passenden Thread gefunden!
Guckst Du hier: Closing DDE links with a macro
Das ist ein google Cache-link.


Dort hatte ich mir den folgenden Code rauskopiert.

Code: Alles auswählen

Sub Main
'xray thisComponent
oLinks = thisComponent.Links
'xray oLinks
REM OK, no index-access
aCategories() = oLinks.getElementNames()
for i = 0 to uBound(aCategories())
   xray oLinks.getByName(aCategories(i))
next
'exit sub
REM links seem to be unrelated to DDE, try the text-fields:
oMasters = thiscomponent.getTextFieldMasters()
'xray oMasters
REM no index-access neither
aNames() = oMasters.getElementNames()
for i = 0 to uBound(aNames())
   oMaster = oMasters.getByName(aNames(i)
   if oMaster.supportsService("com.sun.star.text.fieldmaster.DDE")then
      xray oMaster
      aFields() = oMaster.DependentTextFields()
      for j = 0 to uBound(aFields())
         xray aFields(j)
      next
   endif
next
End Sub 
Dieser Code bietet mehr als wir wirklich brauchen. Aber beim abarbeiten des Codes wurde mir vor Augen gehalten, dass ich an der falschen Stelle gesucht hatte. Denn ich hatte mich zu sehr in diese Richtung verbissen:
balu hat geschrieben: Und dabei hatte ich festgestellt, dass es 7 Verlinkungen gibt:

"Tabellen"
Das ist einerseits wohl nicht ganz korrekt, und anderseits die Falsche Eigenschaft, oder wie auch immer. Denn der richtige Weg geht nämlich über getTextFieldMasters, und nicht über getLinks. Aber das wusste ich ja noch nicht, woher denn auch?

Also hatte ich mir via Xray mal den Code etwas genauer angeschaut, zumindest so weit wie ich das verstehen konnte, und ihn auf das hier gestuzt und geändert.

Code: Alles auswählen

sub Verknuepfung_loesen
	oMasters = thiscomponent.getTextFieldMasters()
	aNames() = oMasters.getElementNames()

		for i = 0 to uBound(aNames())
			oMaster = oMasters.getByName(aNames(i)
			if oMaster.supportsService("com.sun.star.text.fieldmaster.DDE")then
			'	xray oMaster ' <= Das kann gelöscht werden.
				oMaster.dispose
			endif
		next
end sub
Zum testen ob er bei dir auch funktioniert, schlage ich folgendes vor.
Nimm deine "Arbeitsplan_VORLAGE.odt" und lege dort ein neues Modul an. Und in dieses neue Modul fügst Du den Code ein, und speicherst die Datei. Danach kannst Du das Makro ausführen.

Beachte aber unbedingt folgendes!!
Falls die Datei "Arbeitsplan_VORLAGE.odt" mehr als nur eine DDE-Verknüpfung zu Calc hat, so werden diese alle gelöst.

Ich weiss aber auch noch nicht ob das an meinem rumgeteste lag, oder an dem von mir geänderten Code selber, auf jedenfall hatte sich bei mir OOo 3.3.0 nach Ausführung des Codes verabschiedet. Sprich, es war abgestürzt, wohl nicht sofort, aber es passierte. Also nicht wundern wenn es bei dir auch passiert.


Und nun mach ich Feierabend.


Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
KingEisbaer
**
Beiträge: 31
Registriert: Mi, 02.01.2013 18:46

Re: Verknüpfungen automatisch beim Speichern löschen

Beitrag von KingEisbaer »

Hallo Balu,

Danke für deine große Mühe, ich werde es heute Abend testen.

Leider hatte ich die Letzten Wochen vorher keine Zeit hier reinzuschauen, deswegen erst heute.

Ich werde heute Abend dan berichten, ob es geklappt hat.

Gruß

KingEisbaer
Systeminformationen
Betriebssystem: Windows 7 Ultimative
OpenOffice Version: 3.4.1
KingEisbaer
**
Beiträge: 31
Registriert: Mi, 02.01.2013 18:46

Re: Verknüpfungen automatisch beim Speichern löschen

Beitrag von KingEisbaer »

Hallo Balu,

leider löscht das Macro bei mir DDE-Verknüpfung komplett mit dem Inhalt.
Also wenn in der DDE-Verknüpfung "12.00-20:30", was aus der Verknüpfung erstellt wird, wird nicht nur die Verknüpfung gelöst sondern auch der Inhalt "12.00-20.30" gelöscht,das sozusagen das Feld leer ist nach dem ausführen des Macros.
Systeminformationen
Betriebssystem: Windows 7 Ultimative
OpenOffice Version: 3.4.1
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Verknüpfungen automatisch beim Speichern löschen

Beitrag von balu »

Hallo KingEisbaer,

so kann ich nicht helfen, das wär ein rumstochern im Nebel. Häng mal bitte deine Datei(en) hier an.


Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
KingEisbaer
**
Beiträge: 31
Registriert: Mi, 02.01.2013 18:46

Re: Verknüpfungen automatisch beim Speichern löschen

Beitrag von KingEisbaer »

Also gut,

hier wie gewollt die Datei "Arbgeitsplan_2013".

In der Datei sind die Verknüpfungen, die mit dem Calc-Dokument verknüpft sind. Diese Verknüpfungen sollen nun per Makro gelöst werden.
Die Calc-Datei wäre zu Groß um die hier mit anzuhängen.

Abendlichen Gruß

KingEisbaer
Dateianhänge
Arbeitsplan_2013.odt
(63.19 KiB) 118-mal heruntergeladen
Systeminformationen
Betriebssystem: Windows 7 Ultimative
OpenOffice Version: 3.4.1
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Verknüpfungen automatisch beim Speichern löschen

Beitrag von balu »

Hallo KingEisbaer,
über DDE-Felder mit einer Calc-Datei Verknüpft ist
Wann arbeite ich denn schon mal mit dem Writer? Denn dann wäre mir dieser besondere Umstand früher aufgefallen, dass Du die DDE-Verknüpfungen anders eingearbeitet hast als ich dachte. Falls ich das nicht falsch sehe, hast Du wohl jede benötigte Zelle (B12) einzeln als DDE-Verknüpfung eingefügt. Ich jedoch hatte in meinen Versuchen einfach einen ganzen Bereich (B12:K12) in einer Calc-Datei kopiert und diesen dann als DDE-Verknüpfung eingefügt.

So auf den ersten Blick denkt man das dies wohl egal ist, ob einzeln oder als Bereich einfügen. Jedoch nach meinem momentanigen Wissensstand kann ich dazu nur sagen:
"Weit gefehlt! Das ist nicht egal! Zumindest was das Makro betrifft."
leider löscht das Macro bei mir DDE-Verknüpfung komplett mit dem Inhalt.
Diese Aussage kann ich bestätigen, wenn ich deine Datei nehme und dort dann die von mir zuletzt zitierte Sub Verknuepfung_loesen anwende.
Wenn ich jedoch nicht wie Du einzelne Zell-DDE-Verknüpfungen (B12), sondern ZellBereich-DDE-Verknüpfungen (B12:K12) vornehme, dann kann ich anschließend Gefahrlos die Sub Verknuepfung_loesen anwenden, die Daten bleiben bestehen und die Verknüpfungen werden gelöst.

Mir ist das aber alles ein Rätsel, warum durch das Makro einzelne DDEs komplett gelöscht werden, aber bei Bereich-DDEs nur die Verknüpfung aufgehoben wird? :roll:

Kurz und gut: Ich kann dir momentan mit meinem Anfängerwissen leider nicht weiterhelfen. Tut mir leid. :(



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Antworten