Variablenname der Referenz-ID im Makro-Syntax (Makro CIM007)

Paul S. hinzugefügt 4 Monaten her
beantwortet

Hallo miteinander,

ich bin ein sehr großer Fan des Citavi-Makros CIM007. Es erlaubt mir Informationen von Referenzen (in Textform) außerhalb Citavis zu verarbeiten und dann wieder einzuspeisen.

(Fiktives Beispiel: Ich exportiere die Tabellenansicht eines Citavi-Projekts als Excel-Datei, führe irgendeine Formatierung aller Abstracts durch und speichere das Ergebnis in eine neue Spalte der Excel-Datei. Dann nutze ich das CIM007-Makro um die formatierten Abstracts in das Citavi-Projekt zu importieren und die alten zu ersetzen.)

Die Möglichkeiten, die durch dieses Makro entstehen sind sehr groß, da der Excel-Zwischenschritt im Endeffekt eine Schnittstelle zu Software wie auch R herstellt.

Die Limitierung mit der ich aktuell hadere ist, dass sich das Makro zwar prinzipiell flexibel umschreiben lässt, was das targetField angeht - also in welches Zielfeld die neue Information eingetragen werden soll (z.B. Abstract, Freies Feld, Inhaltsverzeichnis usw.),

aber nicht bzgl. der Variable anhand der die einzelnen Referenzen identifiziert und die Daten korrekt eingefügt (= merge/join) werden. Die aktuelle Fassung des Makros ist darauf ausgelegt, dass der Kurztitel dafür genutzt wird:

Reference parentReference = GetReferenceWithShortTitle(shortTitle);
Das ist an sich nicht verkehrt, allerdings werden in meiner Arbeitsgruppe alle Duplikate einer Referenz immer im Projekt behalten. Demnach gibt es mehrere Referenzen mit demselben Kurztitel, was das Makro ungeeignet für unsere Citavi-Projekte macht, da es keine eindeutigen Zuordnungen zu den Referenzen mehr gibt.

Nun also meine Frage:

Wie könnte ich das Makro so abändern, dass als Verbund-Variable die ID statt des Kurztitels nutzt? Diese ist nämlich auch bei Duplikaten eindeutig. Ich bin nicht so bewandert in C# wie ich es gern wäre, aber wenn ich das richtig sehe fehlt mir generell der Variablenname mit dem ich die ID-Spalte überhaupt ansprechen könnte. Ich konnte den Namen leider auch nicht im Handbuch bei den "Intern verwendeten Feldbezeichnungen" finden.

Ich würde mich wirklich sehr über Hilfe bei diesem Problem freuen.

Beste Grüße

Paul

Beste Antwort
Foto

Hier meine Lösung als abgewandelte Form des CIM007 Makros (siehe Anhang).

Viele Dank nochmal an SirPounce! Die Frage ist beantwortet und das Anliegen geklärt.

Kommentare (6)

Foto
2

Erst einmal vielen Dank dafür, dass Du meine Aufmerksamkeit auf dieses schöne Makro gelenkt hast.


C# kann ich auch nicht, aber ich habe es mir zur Angewohnheit gemacht, einfach alles mögliche wild auszuprobieren, bis es klappt. Ich glaube, ich habe in der Dekade Citavi-Nutzung es auch nur ein paar Mal geschafft, aus Versehen alle Daten zu überschreiben…


Naja, jedenfalls hat der Makro-Editor AutoComplete. Da sehe ich dann, dass ein Objekt der Klasse Reference die Eigenschaft Id und die Eigenschaft StaticIds hat.

/7f63ed99d5ad483d11e519b46e7fdd59

Letztere, und das ist Halbwissen meinerseits, und zwar verifizierbar, aber nicht durch mich empirisch getestet, ist besser, weil die StaticIds eines Titels gleich bleiben sollte, wenn der Titel in ein anderes Projekt verschoben wird.

Wenn man das ausprobiert, stellt man aber fest, dass die Eigenschaft StaticIds, wie der Name eigentlich schon sagt, eine Liste ist. Man kann also nicht einfach per

if (reference.StaticIds == staticID) return reference;
testen, ob die StaticID dem der Excel-Tabelle entnommenen String entspricht. Das mit der Liste ist zwar etwas merkwürdig, weil ich mal gerade geguckt habe, und bei keinem Titel hat die Liste mehr als einen Eintrag. Sei es drum. Die saubere Lehre verlangt, dass wir überprüfen, ob irgendein Eintrag in der Liste StaticIds mit dem Wert staticID, welcher als Input in die Methode reingeht, und letzten Endes aus Excel kommt, übereinstimmt. Das machen wir am einfachsten per Linq. Also schreiben wir ganz oben in das Makro

using System.Linq;
damit wir Linq nutzen können, und dann können wir per

if (reference.StaticIds.Any(s => s.ToString() == staticID)) return reference;
in der Methode

private static Reference GetReferenceWithStaticID(string staticID)
(sinnvollerweise benennt man die dann ja um) testen, ob StaticIds einen Eintrag enthält, welcher mit dem Input-String identisch ist.

Foto
2

Mir stellt sich jetzt, nach der Antwort, aber die Frage, wie denn eigentlich die Spalte ID in der Excel-Tabelle bevölkert wird. Wenn da nämlich die Id statt der StaticId drin ist, muss man das natürlich im Makro auch so nutzen, also per


if (reference.Id.ToString() == Id) return reference;


testen. Zumindest die normale Tabellenansicht in Citavi scheint in der Tat Id statt StaticId zu nehmen. Dann braucht man auch Linq nicht, wenn man sich an der foreach-Schleife nicht stört.

Foto
1

Hallo SirPounce!

Vielen Dank schon mal für diese Starthilfe! Ich hatte nie probiert den Code direkt im Makro-Editor zu bearbeiten, sodass mir die AutoComplete-Funktion entgangen ist. Ich stürze mich jetzt nochmal in das Ganze und im Idealfall kann ich die Frage danach als beantwortet markieren.

Foto
1

Update:

Es funktioniert!!! Ich verifiziere noch ein wenig und poste dann die Lösung hier.

Foto
2

Die Methode GetReferenceWithShortTitle() wird im Makro selber definiert, relativ weit unten. Im Prinzip muss man die nur ändern, aber besser ist es, sie auch umzubenennen.

Foto
2

Hier meine Lösung als abgewandelte Form des CIM007 Makros (siehe Anhang).

Viele Dank nochmal an SirPounce! Die Frage ist beantwortet und das Anliegen geklärt.