Search the FirstSpirit Knowledge Base
Hallo zusammen,
hier ist in mehreren Beiträgen die Rede von einem Basis-Script für den Import in eine Datenquelle. Kann mir hier jemand dies zur Verfügung stellen, oder bekommt man dies nur über den Helpdesk? Ich möchte eine CSV-Datei in eine vorhandene Datenquelle importieren.
Viele Grüße Holger
Hallo Holger,
die Infos die hier in der Community über ein Basis Script kursieren beziehen sich auf ein Script für die FS Version 3 welches man am HelpDesk erfragen kann.
Die Antwort vom HelpDesk (Stand 21.03.2017) ist allerdings dass dieses wie gesagt für die Version 3 ausgelegt ist und bei der Version 5.x nicht wirklich viel bringt.
Ansonsten existieren meines Wissens nach nur eigene Entwicklungen der jeweiligen Partnerfirmen. Und noch dieses Abstimmung dass solch ein Import über den Hersteller eingebaut werden soll. Allerdings kann ich nichts zum Stand sagen und ob e-Spirit diesen Wunsch in naher Zukunft berücksichtigen wird.
Generic CSV/XML Import/Export Script
Viele Grüße
Oliver Böck
Hallo Holger,
die Infos die hier in der Community über ein Basis Script kursieren beziehen sich auf ein Script für die FS Version 3 welches man am HelpDesk erfragen kann.
Die Antwort vom HelpDesk (Stand 21.03.2017) ist allerdings dass dieses wie gesagt für die Version 3 ausgelegt ist und bei der Version 5.x nicht wirklich viel bringt.
Ansonsten existieren meines Wissens nach nur eigene Entwicklungen der jeweiligen Partnerfirmen. Und noch dieses Abstimmung dass solch ein Import über den Hersteller eingebaut werden soll. Allerdings kann ich nichts zum Stand sagen und ob e-Spirit diesen Wunsch in naher Zukunft berücksichtigen wird.
Generic CSV/XML Import/Export Script
Viele Grüße
Oliver Böck
Danke für die Info.
Hallo Holger,
das besondere am GenericCSVImporter war damals, dass er "Generic" war. Wenn du aber eh nur einen bestimmten Anwendungsfall hast, dann ist es vermutlich sowieso sinnvoll schnell ein eigenes kleines Skript zu schreiben, da ein CSV Import ja recht simpel ist. So ungefähr sollte das passen:
final String SCHEMA_NAME = "dein_schema_referenzname";
final String TABLE_NAME = "dein_tabellenname";
//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 = "";
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
while ((line = reader.readLine()) != null) {
// Datensatz erzeugen
Entity ent = session.createEntity(tableName);
String[] fields = line.split(";"); //Semikolon ggf. durch dein CSV-Trennzeichen ersetzen
// Datensatz befüllen
ent.setValue("spalte_1", fields[0]);
ent.setValue("spalte_2", fields[1]);
//usw...
}
session.commit();
} catch (IOException e) {
//Fehler beim auslesen der Datei
} finally {
//Reader schließen
}
context.logInfo("Fertig");
} else {
context.logInfo("Keine Datei gewählt");
}
Gruß
Felix
Hallo Felix,
erst mal vielen Dank für das Script. HTML und CSS ist meine Welt. Firstspirit klappt mittlerweile auch ganz gut, aber JAVA - auweia. Deshalb kann ich auch mit der Fehlermeldung nicht so viel anfangen. Vielleicht kannst Du mir da weiter helfen.
Also ich habe jetzt folgendes getan.
- für Testzwecke eine neue Datenquelle angelegt,
- In der Vorlagenverwaltung unter Scripte ein neues Skript erstellt,
- Geltungsbereich: Menu
- und im jsp-Ausgabekanal Dein Scipt angepasst eingefügt.
Es scheint übrigens egal zu sein ob ich "//! Beanshell" in die erste Zeile schreibe oder nicht.
Wie macht man hier eigentlich Code aus den Zeilen?
final String SCHEMA_NAME = "sanacorp";
final String TABLE_NAME = "meatest";
//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 = "";
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
while ((line = reader.readLine()) != null) {
// Datensatz erzeugen
Entity ent = session.createEntity(tableName);
String[] fields = line.split(";"); //Semikolon ggf. durch dein CSV-Trennzeichen ersetzen
// Datensatz befüllen
ent.setValue("name1", fields[0]);
ent.setValue("datum1", fields[1]);
ent.setValue("zahl1", fields[2]);
//usw...
}
session.commit();
} catch (IOException e) {
//Fehler beim auslesen der Datei
} finally {
//Reader schließen
}
context.logInfo("Fertig");
} else {
context.logInfo("Keine Datei gewählt");
}
Fehlermeldung: erscheint nach dem ich die zu importierende Datei ausgewählt habe.
Client Version: 5.1.605.72781
Java Version: 1.8.0_91 Oracle Corporation
FSVersion=5.1.605.72781#4692;JDK=1.8.0_91 32bit Oracle Corporation;OS=Windows 7 6.1 x86;Date=27.03.2017 10:30:45
de.espirit.firstspirit.access.script.ExecutionException: Typed variable declaration : Class: UserService not found in namespace : at Line: 14 : in file: inline evaluation of: ``__execute() { final String SCHEMA_NAME = "sanacorp"; final String TABLE_NAME = " . . . '' : UserService
at line 14
at de.espirit.firstspirit.server.script.BeanshellScriptEngine$BeanshellExecutable.execute(BeanshellScriptEngine.java:111)
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:161)
at de.espirit.firstspirit.common.ScriptUtil.access$000(ScriptUtil.java:31)
at de.espirit.firstspirit.common.ScriptUtil$2.run(ScriptUtil.java:148)
at de.espirit.firstspirit.client.gui.util.GuiUtil$RunnableWrapper.run(GuiUtil.java:1958)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: bsh.EvalError: Typed variable declaration : Class: UserService not found in namespace : at Line: 14 : in file: inline evaluation of: ``__execute() { final String SCHEMA_NAME = "sanacorp"; final String TABLE_NAME = " . . . '' : UserService
at bsh.BSHAmbiguousName.toClass(BSHAmbiguousName.java:73)
at bsh.BSHType.getType(BSHType.java:154)
at bsh.BSHTypedVariableDeclaration.eval(BSHTypedVariableDeclaration.java:75)
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)
... 9 more
Caused by: java.lang.ClassNotFoundException: Class: UserService not found in namespace
at bsh.Name.toClass(Name.java:664)
at bsh.BSHAmbiguousName.toClass(BSHAmbiguousName.java:71)
... 22 more
VG Holger
Hallo Holger,
der Code war nur direkt hier runtergeschrieben und somit nicht direkt lauffähig.
Z.B. fehlen die Imports. Diese müssen dem Code vorangestellt werden.
Keine Garantie auf Vollständigkeit:
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;
Ein paar Java Grundkenntnisse sind für die Lösung leider erforderlich 😕
Beste Grüße
Felix
Danke Felix, es funktioniert.
Es können zwar Text-Felder und kein Datums-Felder eingelesen werden. Aber Anfang ist erst einmal gemacht.
VG Holger
Hallo Holger,
freut mich, dass es geht 🙂
Für Datumsfelder muss man das Ganze vorher in ein Datum umwandeln.
Das ginge bspw. so:
import java.text.SimpleDateFormat;
import java.text.ParseException;
SimpleDateFormatsdf = new SimpleDateFormat("dd.MM.yyyy"); //Durch dein Datumsformat ersetzen
und dann beim Einlesen:
try {
ent.setValue("datum1", sdf.parse(fields[1]));
catch(ParseException e){
// Fehler loggen. Das Datum ist nicht parseable
}
Gruß
Felix
Danke, das bringt mich weiter. 🙂