Search the FirstSpirit Knowledge Base
Hallo zusammen
Ich habe einen Scipt der mir ein CVS einliesst und in eine FS Tabelle schreibt. Das klappt alles tip top.
Den Sript habe ich aus diesem Forum.
Ausschnitt:
counter = 0;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
while ((line = reader.readLine()) != null) {
if (counter > 0){
// Datensatz erzeugen
Entity ent = session.createEntity(tableName);
String[] fields = line.split(";"); //Semikolon ggf. durch dein CSV-Trennzeichen ersetzen
// Datensatz befüllen
ent.setValue("MaterialNo", Integer.parseInt(fields[0]));
ent.setValue("HeadDiameter", Double.parseDouble(fields[1]));
ent.setValue("DocReference", fields[2]);
}
counter ++;
}
Jetzt hat aber jeder Datensatz noch eine PDF Referenz. Wir kann ich das per Script tun, damit eine Refernz aus den Medien geschrieben werden kann?
DANKE für euren Input
Grüsse
Thomas
Hallo zusammen
Hat hier jemand einen Tipp wie ich das Problem lösen kann
DANKE und Grüsse
Thomas
Hallo Thomas,
ich bin mir nicht sicher, ob ich "Jetzt hat aber jeder Datensatz noch eine PDF Referenz" richtig verstehe. Ist das ein Link auf eine irgendwo liegende PDF Datei und wenn ja, was soll denn mit dem Link passieren?
Im einfachsten Fall willst du daraus nur einen externen Link machen. Dazu musst Du entweder über das FormData des Datasets (<content2>.getDataset(<entity>)) dir die Ziel-Eingabekomponente holen und die entsprechend befüllen oder Du speicherst den Link einfach als Text in ein Textfeld und machst daraus über den Templatecode den Link (das geht auch problemlos über das Entity wie im jetzigen Skript).
Wahrscheinlich willst Du aber zusätzlich das PDF importieren bzw. dieses liegt bereits im Media-Store. Das musst Du dir holen, in den Mediastore transferieren und dir die UID merken (bzw. die UID anhand der vorliegenden Informationen ermitteln). Mit Hilfe der UID musst Du dann eine (FS_REFERENCE) Eingabekomponente entsprechend füllen.
Ich hoffe, diese allgemeinen Hinweise helfen weiter
Holger
Hallo Holger
Danke für dein Fedback. Ich möchte den ersten Punkt bauen.
Im einfachsten Fall willst du daraus nur einen externen Link machen. Dazu musst Du entweder über das FormData des Datasets (<content2>.getDataset(<entity>)) dir die Ziel-Eingabekomponente holen und die entsprechend befüllen.
Nur wie muss ich das in den Script einbauen?!?
while ((line = reader.readLine()) != null) {
if (counter > 0){
// Datensatz erzeugen
Entity ent = session.createEntity(tableName);
String[] fields = line.split(";"); //Semikolon ggf. durch dein CSV-Trennzeichen ersetzen
// Datensatz befüllen
ent.setValue("MaterialNo", Integer.parseInt(fields[0]));
ent.setValue("HeadDiameter", Double.parseDouble(fields[1]));
ent.setValue("DocReference", fields[2]);
}
counter ++;
Grüsse. Thomas
Ich habe das jetzt noch nicht in eine Entity gesetzt, deshalb keine Garantie, aber eigentlich müsste das so gehen, wenn das ein CMS_INPUT_LINK ist:
TemplateStoreRoot templateStoreRoot = (TemplateStoreRoot) project.getUserService().getStore(Store.Type.TEMPLATESTORE, false);
LinkTemplate externalLink = templateStoreRoot.getLinkTemplates().getTemplate("link_template_name");
Link newLink = externalLink.createLink(language);
FormData linkFormData = newLink.getFormData();
FormField field = linkFormData.get(language, "lt_link");
field.set(fields[2]);
ent.setValue("DocReference", newLink);
Guten Tag Zusammen
Ich nehme das Thema noch einmal auf.
Ich kann das CSV - File einlesen und die Datenbank abfüllen.
Was ich noch nicht hin bekommen habe, ist die Referenzen zu den PDF's und Gif's aus dem Medienstore.
- Alle PDF und Gifs liegen bereits im MEDIASTORE
- Es gibt eine Spalte im CVS die dem Referenznamen der PDF's und GIF's im MEDIASTORE entspricht.
Wie kann ich jetzt eine <FS-REFERENZ> "cs_image_file_reference" erstellen lassen?
import de.espirit.firstspirit.forms.FormData;
import de.espirit.firstspirit.access.UserService;
import de.espirit.firstspirit.access.store.Store;
import de.espirit.firstspirit.access.store.Store.Type;
import de.espirit.firstspirit.access.store.templatestore.Schema;
import java.io.File;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.swing.JFileChooser;
import de.espirit.or.schema.Entity;
import de.espirit.or.Session;
final String SCHEMA_NAME = "sfs_ctf_data";
final String TABLE_NAME = "CSVImporter";
//Auswahl der CSV Datei
JFileChooser fileChooser = new JFileChooser();
fileChooser.setMultiSelectionEnabled(false);
int selection = fileChooser.showOpenDialog(null);
if (selection == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
// Ermitteln der Session, um darüber Entities zu erzeugen
UserService uss = context.getUserService();
Schema schema = uss.getTemplateStore().getSchemes().getSchemaByName(SCHEMA_NAME);
Session session = schema.getSession();
String tableName = schema.getOrSchema().getEntityType(TABLE_NAME).getName();
// Auslesen der CSV Zeile pro Zeile
BufferedReader reader = null;
String line = "";
counter = 0;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
while ((line = reader.readLine()) != null) {
if (counter > 0){
// Datensatz erzeugen
Entity ent = session.createEntity(tableName);
String[] fields = line.split(";"); //Semikolon ggf. durch dein CSV-Trennzeichen ersetzen
// Datensatz befüllen
ent.setValue("MaterialNo", Integer.parseInt(fields[0]));
ent.setValue("HeadDiameter", Double.parseDouble(fields[1]));
/*
TemplateStoreRoot templateStoreRoot = (TemplateStoreRoot) project.getUserService().getStore(Store.Type.TEMPLATESTORE, false);
LinkTemplate externalLink = templateStoreRoot.getLinkTemplates().getTemplate("inline_link");
Link newLink = externalLink.createLink("de");
FormData linkFormData = newLink.getFormData();
FormField field = linkFormData.get("de", "cs_image_file_reference");
field.set(fields[2]);
ent.setValue("DocReference", newLink);
*/
}
counter ++;
}
session.commit();
} catch (IOException e) {
//Fehler beim auslesen der Datei
} finally {
//Reader schließen
}
context.logInfo("Fertig");
} else {
context.logInfo("Keine Datei gewählt");
}
<FS_REFERENCE name="cs_image_file_reference" hFill="yes" useLanguages="no">
<FILTER>
<HIDE type="all"/>
<ALLOW type="picture"/>
</FILTER>
<LANGINFOS>
<LANGINFO lang="*" label="Image reference"/>
</LANGINFOS>
<PROJECTS>
<LOCAL name=".">
<SOURCES>
<FOLDER name="GIF" store="mediastore"/>
</SOURCES>
</LOCAL>
</PROJECTS>
</FS_REFERENCE>
Danke und Grüsse
Thomas
Hi Thomas,
du hast da keinen Link, sondern eine TargetReference.
Also erst einmal über den MediaStore dein Element holen.
Dann eine TargetReference auf dein Media-Element erstellen. https://docs.e-spirit.com/odfs/access/de/espirit/firstspirit/access/editor/value/TargetReference.Tar...
static TargetReference
newInstance(Language language)
Create a new empty TargetReference.
static TargetReference
newInstance(Language language, IDProvider reference, String remoteName)
Create a new TargetReference.
static TargetReference
newInstance(Language language, String uid, IDProvider.UidType uidType, String remoteName)
Create a new TargetReference.
Die TargetReference ist dann das Element, das du in dein field setzen musst.
Hilft das weiter?
Hallo
Danke schon mal für deinen Input. Ich bin Anfänger und tu mich im moment noch schwer damit.
Wie kann ich das Element aus dem MediaStore holen?
Wie setze ich das TargetReference in das Feld?
Sorry 😉 und Grüsse. Thomas
MediaStoreRoot mediaStoreRoot = (MediaStoreRoot) project.getUserService().getStore(Store.Type.MEDIASTORE, false);
Media media = mediaStoreRoot.getMediaByUid(filename);
TargetReference targetReference = TargetReference.TargetReferences.newInstance(null, media, null);
en.set("wasauchimmer", targetReference);
Keine Ahnung, wie das Feld in deiner Entity heißt. Beim Schreiben in die Entity bin ich mir nicht sicher, das mache ich normalerweise nicht.
Ein bisschen weiter sind wir gekommen 🙂
Jetzt stehen wir aber definitiv an. Folgende Fehlermeldung wir geschmissen.
Client Version: 5.2.191006.78608
Java Version: 11.0.4 AdoptOpenJDK
FSVersion=5.2.191006.78608#5484;JDK=11.0.4 64bit AdoptOpenJDK;OS=Windows 10 10.0 amd64;Date=31.08.2022 08:49:54
de.espirit.firstspirit.access.script.ExecutionException: Method Invocation ent.setValue : at Line: 53 : in file: inline evaluation of: ``__execute() { import de.espirit.firstspirit.forms.FormData; import de.espirit.fi . . . '' : ent .setValue ( "DocReference" , targetReference )
Target exception: java.lang.IllegalArgumentException: de.espirit.or.SchemaException: illegal type class de.espirit.firstspirit.access.editor.value.TargetReferenceImpl for attribute 'DocReference' - correct type is class de.espirit.firstspirit.client.editorcomponent.EditorWrapper
at line 53
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:109)
at de.espirit.firstspirit.server.script.PermissionsScriptEngine$PermissionsExecutable.lambda$execute$1(PermissionsScriptEngine.java:83)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at de.espirit.firstspirit.server.script.PermissionsScriptEngine$PermissionsExecutable.execute(PermissionsScriptEngine.java:88)
at de.espirit.firstspirit.server.script.PermissionsScriptEngine$PermissionsExecutable.execute(PermissionsScriptEngine.java:83)
at de.espirit.firstspirit.client.gui.applications.ApplicationTabRegistry$IdentifiableExecutable.execute(ApplicationTabRegistry.java:114)
at de.espirit.firstspirit.common.ScriptUtil.execute(ScriptUtil.java:106)
at de.espirit.firstspirit.common.ScriptUtil.executePrivileged(ScriptUtil.java:158)
at de.espirit.firstspirit.common.ScriptUtil.access$000(ScriptUtil.java:31)
at de.espirit.firstspirit.common.ScriptUtil$2.run(ScriptUtil.java:145)
at de.espirit.firstspirit.client.gui.util.GuiUtil$RunnableWrapper.run(GuiUtil.java:1994)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: de.espirit.or.SchemaException: illegal type class de.espirit.firstspirit.access.editor.value.TargetReferenceImpl for attribute 'DocReference' - correct type is class de.espirit.firstspirit.client.editorcomponent.EditorWrapper
at de.espirit.or.impl.EntityImpl.setValue(EntityImpl.java:891)
at de.espirit.or.impl.EntityImpl.setValue(EntityImpl.java:283)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at bsh.Reflect.invokeMethod(Reflect.java:185)
at bsh.Reflect.invokeObjectMethod(Reflect.java:118)
at bsh.Name.invokeMethod(Name.java:858)
at bsh.BSHMethodInvocation.eval(BSHMethodInvocation.java:75)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:102)
at bsh.BSHPrimaryExpression.eval(BSHPrimaryExpression.java:47)
at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
at bsh.BSHBlock.eval(BSHBlock.java:80)
at bsh.BSHBlock.eval(BSHBlock.java:46)
at bsh.BSHIfStatement.eval(BSHIfStatement.java:48)
at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
at bsh.BSHBlock.eval(BSHBlock.java:80)
at bsh.BSHBlock.eval(BSHBlock.java:46)
at bsh.BSHWhileStatement.eval(BSHWhileStatement.java:78)
at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
at bsh.BSHBlock.eval(BSHBlock.java:80)
at bsh.BSHBlock.eval(BSHBlock.java:46)
at bsh.BSHTryStatement.eval(BSHTryStatement.java:88)
at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
at bsh.BSHBlock.eval(BSHBlock.java:80)
at bsh.BSHBlock.eval(BSHBlock.java:46)
at bsh.BSHIfStatement.eval(BSHIfStatement.java:48)
at bsh.BSHBlock.evalBlock(BSHBlock.java:130)
at bsh.BSHBlock.eval(BSHBlock.java:80)
at bsh.BshMethod.invokeImpl(BshMethod.java:371)
at bsh.BshMethod.invoke(BshMethod.java:267)
at bsh.BshMethod.invoke(BshMethod.java:170)
at bsh.PreparsedScript.invoke(PreparsedScript.java:66)
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:100)
... 13 more
Caused by: de.espirit.or.SchemaException: illegal type class de.espirit.firstspirit.access.editor.value.TargetReferenceImpl for attribute 'DocReference' - correct type is class de.espirit.firstspirit.client.editorcomponent.EditorWrapper
at de.espirit.or.impl.schema.EntityTypeImpl.getAttribute(EntityTypeImpl.java:181)
at de.espirit.or.impl.EntityImpl.setValue(EntityImpl.java:884)
... 47 more
Irrgend eine Idee?
DANKE und Grüsse
Thomas
Kannst du mir mal den Ausschnitt aus dem Formular für die Datenquelle zeigen, aus dem die Entity kommt und da das Feld, wo du die Referenz reinsetzen willst?