robert_wieser
I'm new here

Speichern eines geänderten Schemas über die Api

Jump to solution

Hallo Community,

wie kann ich über die Api eine Spalte in einer Tabelle hinzufügen und anschließende die Tabelle speichern?

Meinen Kode-Ansatz folgt.

Vielen Dank für eure Beitrage

Robert

        de.espirit.or.schema.Schema orSchema = tableTemplate.getSchema().getOrSchema();

        EntityType entityType = tableTemplate.getEntityType();

        String entityTypeName = entityType.getName();

        Table table = orSchema.getTable(entityTypeName);

        Column col = new ColumnImpl(colName, 64, Column.TypeCode.TYPE_STRING, false);

        Schema templateSchema = tableTemplate.getSchema();

        try {

            templateSchema.setLock(true);

            table.add(col);

            templateSchema.save();

            templateSchema.setLock(false);

        } catch (LockException e) {

            e.printStackTrace();

        } catch (ElementDeletedException e) {

            e.printStackTrace();

        }

0 Kudos
1 Solution

Accepted Solutions

Hallo Robert,

eine Lösung könnte z.B. so aussehen:

    // run as contextscript on tabletemplate

    TableTemplate tableTemplate = (TableTemplate) context.getStoreElement();

    Schema _schema = tableTemplate.getSchema();

    String _entityTypeName = "MyTable";

    String _attributeName = "MyAttribute";

     try {

        _schema.setLock(true, false);

        final Session orSession = _schema.getSession(false);

        final de.espirit.or.schema.Schema orSchema = orSession.getSchema();

        final EntityType entityType = orSchema.getEntityType(_entityTypeName);

        SimpleAttribute _attribute = entityType.createSimpleAttribute(_attributeName, String.class);

        _attribute.setSize(64);

        orSession.syncSchemaWithDB(orSchema, false);

        _schema.setOrSchema(orSchema);

        _schema.save();

    } catch (Exception e) {

        throw new RuntimeException(e);

    } finally {

        try {

            _schema.setLock(false, false);

        } catch (Exception ignore) {

            // catch exception

        }

    }

Was bei dir sicherlich noch fehlte war der Sync des geänderten orSchemas in der aktuellen Session, sowie die Zuweiseung zum Templatestore-Schema.

Viele Grüße

Jörg

View solution in original post

0 Kudos
6 Replies
klein
Crownpeak employee

Hi Robert,

um welche FS-Veersion geht es hier?

In welchem Kontext wird das Skript aufgerufen?

>de.espirit.or.schema.Schema orSchema = tableTemplate.getSchema().getOrSchema();

normalerweise wird das Schema ja so geholt:

schema = context.getUserService().getTemplateStore().getSchemes().getSchemaByName("my_schema");

Gruß,

Walter

0 Kudos

Hallo Walter,

erst mal herzlichen Dank für Deine Antwort.

Version: 4.2.447

Umsetzung derzeit als Executable aus dem Client aufgerufen: => GuiScriptContext

Ich versuche sofort den von Dir vorgeschlagenen Weg und danke Dir erst mal für deine Hilfe.

Viele Grüße

Robert

0 Kudos

Dein Weg das Schema zu holen ist schon korrekt. Du musst nur nicht auf "Table" arbeiten, sondern auf "EntityType":

SimpleAttribute<String> att = schema.getEntityType("name").createSimpleAttribute("attr", String.class);

attr.setSize(64);

Peter
0 Kudos

Hallo Peter,

danke auch Dir für die Hilfestellung.

Das höhrt sich schon mal sehr vielversprechend an. Meine ersten versuche das Schema zu erweitern waren allerdings noch nicht erfolgreich. Was muss ich tun um die veränderung zu speichern?

Vielen Dank im Voraus,

Robert

0 Kudos

Hallo Robert,

eine Lösung könnte z.B. so aussehen:

    // run as contextscript on tabletemplate

    TableTemplate tableTemplate = (TableTemplate) context.getStoreElement();

    Schema _schema = tableTemplate.getSchema();

    String _entityTypeName = "MyTable";

    String _attributeName = "MyAttribute";

     try {

        _schema.setLock(true, false);

        final Session orSession = _schema.getSession(false);

        final de.espirit.or.schema.Schema orSchema = orSession.getSchema();

        final EntityType entityType = orSchema.getEntityType(_entityTypeName);

        SimpleAttribute _attribute = entityType.createSimpleAttribute(_attributeName, String.class);

        _attribute.setSize(64);

        orSession.syncSchemaWithDB(orSchema, false);

        _schema.setOrSchema(orSchema);

        _schema.save();

    } catch (Exception e) {

        throw new RuntimeException(e);

    } finally {

        try {

            _schema.setLock(false, false);

        } catch (Exception ignore) {

            // catch exception

        }

    }

Was bei dir sicherlich noch fehlte war der Sync des geänderten orSchemas in der aktuellen Session, sowie die Zuweiseung zum Templatestore-Schema.

Viele Grüße

Jörg

0 Kudos

Hallo Jörg,

danke für die Musterlösung.

das Or-Schema ins Schema zurückstetzen scheint auch bereits zu funktionieren.

Ich habe mehrere Tage alles mögliche gespeichert, commitet, Code dekompiliert usw. was mir viel Zeit im Bezug auf den Abgabetermin. FS-JavaDoc ist noch ausbaufähig, will ich nebenbei anmerken!

Ich danke Dir nochmal für die Kompletlösung,  mit den Support von eSpirit kann ich allerdings nicht zufrieden sein.

Viele Grüße

Robert 

0 Kudos