plamka
I'm new here

FS_CATALOG copy Funktion

Hallo Community,

wir würden gerne in der Komponente FS_CATALOG eine copy Funktion nutzen.

Also den vorher eingepflegten Datensatz kopieren und einfügen um auf dem alten Datenbestand aufzusetzen.

Geht das überhaupt und wenn Ja wie?

Gruß und  Danke

David

12 Replies
MichaelaReydt
Community Manager

Hallo David,

soweit ich weiß, bietet die FS_CATALOG-Komponente nur die Möglichkeit, Einträge neu zu erstellen, zu bearbeiten und zu löschen, aber nicht zu kopieren. Auch eine Erweiterung der Komponente ist meines Wissens nach nicht möglich.

Evtl. besteht über einen FS_BUTTON und die Verwendung der API ein Weg, der Komponente eine Kopie eines Eintrags hinzuzufügen. Das weiß ich aber nicht und wäre lediglich eine Idee.

Viele Grüße
Michaela

0 Kudos
sebastianc
Crownpeak employee

Hallo David,

ist diese Frage noch offen? Benötigst du noch weitere Hilfe oder konnte Michaela dir bereits weiterhelfen?
In diesem Fall wäre es super, wenn du ihre "richtige Antwort" entsprechend markierst.

Solltest du selbst eine Lösung gefunden haben, wäre es toll, wenn du sie hier bereitstellst.

Viele Grüße,

Sebastian

0 Kudos

Hi,

offen ist die Frage zwar nicht, ganz glücklich bin ich allerdings mit der Antwort auch nicht.

Die FS_CATALOG Komponente soll ja zukünftig anstatt der FS_LIST Komponente verwendet werden.

Wieso wird eine neue Komponente implementiert und vom Funktionsumfang komplett beschnitten?

Mfg

0 Kudos

Hallo David,

der FS_CATALOG ersetzt zukünftig die FS_LIST vom Typ Inline. Laut dem ODFS war es für diesen FS_LIST-Typ auch bisher nicht möglich, Einträge zu kopieren. Demnach scheint keine Einschränkung des Funktionsumfangs mit der Neuimplementierung zu erfolgen.

Viele Grüße

Michaela

0 Kudos

Hi Michaela,

Danke für das Feedback. Die FS_INDEX Komponente soll doch die FS_LIST Komponente vom Typ Database ersetzte?
ISt das richtig? Diese hat alledings auch keine copy Funktion mehr oder übersehe ich etwas?

Gruß und Danke

David

0 Kudos

Hallo David,

vielleicht solltest Du uns den Anwendungsfall näher erläutern. Warum muss etwas kopiert werden und wie?

In dem Fall von Beziehungen zwischen Datensätzen (oder Objekten) sollte man die Kopierfunktion selbst implementieren, da man einen Deep-Copy implementieren muss, um nicht via Referenzen dann bestimmte Inhalte gemeinsam zu nutzen, wo das nicht ggf. gewollt ist oder auch aus Gründen der Datensicherheit nicht passieren darf (Datenschutz lasse ich jetzt mal weg). Bei flachen Strukturen mit Basistypen wie Zeichenketten, numerische Werte sowie Wahrheitswerten ist das natürlich kein Problem. Auch 1:N ist kein Problem, aber bei 1:1 und M:N fängt es schon an. Es muss also nicht nur der ausgewählte Datensatz kopiert werden, sondern eine ganze Beziehungsstruktur darunter.

Ich halte die o.g. Lösung mittels FS_BUTTON und eigner Executable mit Implementierung einer Kopierfunktion des konkreten Anwendungsfalls für die beste in dem Zusammenhang. Eine allgemeine, automatische Kopierfunktion ist wie oben beschrieben gefährlich, da die den Einzelfall nicht betrachtet und kann im schlimmsten Fall zu Datenverlust führen (vor allem beim Löschen, aber ist eigentlich noch ein weiteres Thema). Sollten die alten Kopierfunktionen nicht mehr existieren, dann könnten diese Überlegungen im Hintergrund stehen. Das ist kein FS-Problem, sondern eine allgemeine Problematik bei Beziehungen von Datenbanken und Objekten untereinander.

Ich hoffe ich konnte etwas zum Verständnis beitragen.

Grüße

Marian

0 Kudos

Hallo David,

ja, laut dem ODFS soll die FS_INDEX-Komponente weitgehend die FS_LIST vom Typ Database ersetzen. In den ReleaseNotes ist dazu der Hinweis zu finden, dass die neuen Eingabekomponenten bewusst nicht funktionsäquivalent zur FS_LIST sind.

Nach einem Blick auf die Beschreibung der FS_LIST im ODFS für FS 5.1 scheint die Copy-Funktion tatsächlich entfallen zu sein. Ob dies bewusst geschehen ist oder es sich potentiell um einen Bug handeln könnte, kann ich aktuell leider nicht beurteilen. Ich würde dich daher bitten, dich diesbzgl. an unseren Technical Support zu wenden.

Viele Grüße

Michaela

0 Kudos
boersteken
Crownpeak employee

Hallo David,

benötigst Du noch weitere Hilfe oder haben Dir die Antworten von Michaela und Marian bereits geholfen?

In diesem Fall wäre es super, wenn Du die "richtige Antwort" entsprechend markierst, damit auch andere

Community-Teilnehmer diese auf den ersten Blick finden. Solltest Du zwischenzeitlich eine eigene Lösung

gefunden haben, wäre es nett, wenn Du diese hier bereitstellst.

Viele Grüße,

Philipp

0 Kudos

Hey,

also ich habe genau diese Funktion mittels FS_BUTTON realisiert, wobei ich zusätzlich noch die Möglichkeit biete auf einer anderen Seite ein Absatzelement (bzw. die Referenz-ID) aus einem FS_CATALOG in die Zwischenablage (Clipboard) zu kopieren und dann an anderer Stelle genau solch ein Element  einzufügen/neu zu erstellen.

In meinem Fall haben alle Absätze einen Titel "st_headline" den ich für das Auswahlfeld benötige.

Hier der Quelltext für die Kopierfunktion. Wer ebenfalls das Script zum Einfügen braucht, kann sich hier wieder melden.

//! Beanshell

// ### Imports ###

import de.espirit.firstspirit.access.Language;

import de.espirit.firstspirit.access.script.Executable;

import de.espirit.firstspirit.access.script.ExecutionException;

import de.espirit.firstspirit.client.access.editor.lists.CatalogImpl;

import de.espirit.firstspirit.forms.FormData;

import de.espirit.or.schema.Entity;

import de.espirit.or.Session;

import java.awt.datatransfer.StringSelection;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

import javax.swing.JOptionPane;

// ### Methoden ###

// Dialog zur Auswahl des zu erstellenden Inhaltselements

String selectContentElementDialog(String[] options) {

        return response = (String) JOptionPane.showInputDialog(null, "Inhaltselement wählen:", "Kopieren", JOptionPane.QUESTION_MESSAGE, null, options, options[0]);

}

// Daten in die Zwischenablage speichern

void copyElementToClipboard(String elementUid) {

    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(

             new StringSelection(elementUid), null

         );

}

// ### Variables ###

ArrayList log = new ArrayList<String>();

StringBuffer message = new StringBuffer();

CatalogImpl elements = elements.get(); // FS_CATALOG "st_elements"

// ### Start ###

Map<String> elementList = new HashMap<String>();

for(element : elements) {

    elementList.put(element.getItem().get(language, "st_headline").get(), element.getId().toString());

    //message.append("\nElement: " + element.getItem().get(language, "st_headline").get() + " -> UID: " + element.getId());

}

String[] values = new String[elementList.size()];

int index = 0;

for(mapEntry : elementList.entrySet()) {

    values[index] = mapEntry.getKey();

    index++;

    //message.append("\nKey: " + mapEntry.getKey() + "\nValue: " + mapEntry.getValue());

}

// Dialog zur Auswahl des Inhaltselements mit den aktuellen FS_CATALOG "st_elements" Elementen

String selectedElement = selectContentElementDialog(values);

// Referenz-ID (UID) des Elements holen

String elementUid = elementList.get(selectedElement);

// Referenz-ID (UID) des ausgewählten Inhaltselement in die Zwischenablage kopieren

if(elementUid != null && !"".equals(elementUid.toString())) {

    message.append("\nElement befindet sich in der Zwischenablage: \n\"" + selectedElement + "\""); // \nUID [" + elementUid + "]");

     

    copyElementToClipboard(elementUid.toString());

}

// Erfolgsmeldung

if(!"".equals(message.toString())) {

    JOptionPane.showMessageDialog(null, message.toString(), "Kopieren", JOptionPane.INFORMATION_MESSAGE);

} else { // Fehlermeldung

    JOptionPane.showMessageDialog(null, message.toString(), "Kopieren", JOptionPane.ERROR_MESSAGE);

}

Zur Info: BeanShell "button_copy_element_to_clipboard" als Script anlegen und dann via FS_BUTTON aufrufen.

Hier nun die beiden Felder samt Einfügen Button mit gesondertem Script:

<FS_CATALOG name="st_elements" height="10" useLanguages="no">

        <LANGINFOS>

          <LANGINFO lang="*" label="Inhaltselemente" description="Inhaltselemente"/>

        </LANGINFOS>

        <TEMPLATES type="section">

          <TEMPLATE uid="contentarea"/>

          <TEMPLATE uid="content_element_headline"/>

          <TEMPLATE uid="content_element_text"/>

          <TEMPLATE uid="content_element_image"/>

        </TEMPLATES>

      </FS_CATALOG>

      <FS_BUTTON

        name="st_copy_element"

        alwaysEnabled="yes"

        hFill="yes"

        icon="fs:edit"

        noBreak="no"

        onClick="script:button_copy_element_to_clipboard"

        style="button"

        useLanguages="no">

        <LANGINFOS>

          <LANGINFO lang="*" label="Element kopieren" description="Element kopieren"/>

        </LANGINFOS>

        <PARAMS>

          <PARAM name="elements">#field.st_elements</PARAM>

        </PARAMS>

      </FS_BUTTON>

      <FS_BUTTON

        name="st_add_element"

        alwaysEnabled="yes"

        hFill="yes"

        icon="fs:new"

        noBreak="no"

        onClick="script:button_add_contentelement"

        style="button"

        useLanguages="no">

        <LANGINFOS>

          <LANGINFO lang="*" label="Erweitertes Element hinzufügen" description="Erweitertes Element hinzufügen"/>

        </LANGINFOS>

        <PARAMS>

          <PARAM name="elements">#field.st_elements</PARAM>

          <PARAM name="name">#field.st_headline</PARAM>

        </PARAMS>

      </FS_BUTTON>