th_biedermann
Occasional Collector

CSV-Import mit $REF

Jump to solution

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

0 Kudos
1 Solution

Accepted Solutions

Hallo zusammen

Hat hier jemand einen Tipp wie ich das Problem lösen kann

DANKE und Grüsse

Thomas

View solution in original post

0 Kudos
11 Replies
hoebbel
Crownpeak employee

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

0 Kudos

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 Kudos

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 Kudos

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 Kudos

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?

0 Kudos

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 Kudos
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 Kudos

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

0 Kudos

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 Kudos