CSV-Import mit $REF
Author: th_biedermann
Publication Date: 6/21/2022 8:05
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
-
Author: hoebbel - 6/22/2022 13:04
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
Holger0 -
Author: th_biedermann - 6/22/2022 13:55
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
0 -
Author: ncbruckner - 6/23/2022 13:09
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);0 -
Author: th_biedermann - 8/30/2022 7:20
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
0 -
Author: ncbruckner - 8/30/2022 7:44
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.TargetReferences.html
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?0 -
Author: th_biedermann - 8/30/2022 8:23
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
0 -
Author: ncbruckner - 8/30/2022 10:12
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.
0 -
Author: th_biedermann - 8/31/2022 7:51
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 moreIrrgend eine Idee?
DANKE und Grüsse
Thomas
0 -
Author: ncbruckner - 8/31/2022 17:11
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?
0 -
Author: th_biedermann - 8/31/2022 19:16
<CMS_MODULE> <CMS_INPUT_NUMBER name="cs_material_no" hFill="yes" singleLine="no" useLanguages="no"> <LANGINFOS> <LANGINFO lang="*" label="Material Number" format="000"/> </LANGINFOS> </CMS_INPUT_NUMBER> <CMS_INPUT_NUMBER name="cs_head_diameter" type="double" hFill="yes" singleLine="no" useLanguages="no"> <LANGINFOS> <LANGINFO lang="*" label="Head diameter" format="0.00"/> </LANGINFOS> </CMS_INPUT_NUMBER> <FS_REFERENCE name="cs_document_file_reference" hFill="yes" useLanguages="no"> <FILTER> <HIDE type="all"/> <ALLOW type="file"/> </FILTER> <LANGINFOS> <LANGINFO lang="*" label="Document reference"/> </LANGINFOS> <PROJECTS> <LOCAL name="."> <SOURCES> <FOLDER name="PDF" store="mediastore"/> </SOURCES> </LOCAL> </PROJECTS> </FS_REFERENCE> <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> </CMS_MODULE>0 -
Author: th_biedermann - 10/26/2022 14:32
Hallo zusammen
Hat hier jemand einen Tipp wie ich das Problem lösen kann
DANKE und Grüsse
Thomas
0
Vous devez vous connecter pour laisser un commentaire.
Commentaires
11 commentaires