Skip to main content

CSV-Daten in Datenquelle importieren

Comments

8 comments

  • Zendesk API User
    Author: oboeck - 3/21/2017 16:29

    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

    0
  • Zendesk API User
    Author: riessh - 3/22/2017 7:55

    Danke für die Info.

    0
  • Zendesk API User
    Author: felix_reinhold - 3/22/2017 8:25

    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

    0
  • Zendesk API User
    Author: riessh - 3/27/2017 9:57

    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

    0
  • Zendesk API User
    Author: felix_reinhold - 3/28/2017 10:45

    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

    0
  • Zendesk API User
    Author: riessh - 3/28/2017 12:04

    Danke Felix, es funktioniert.

    Es können zwar Text-Felder und kein Datums-Felder eingelesen werden. Aber Anfang ist erst einmal gemacht.

    VG Holger

    0
  • Zendesk API User
    Author: felix_reinhold - 3/28/2017 12:23

    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

    0
  • Zendesk API User
    Author: riessh - 3/28/2017 12:27

    Danke, das bringt mich weiter. :-)

    0

Please sign in to leave a comment.