# Release ECMind blue Studio 1.0.3

**URL:** <https://ecm.community/t/release-ecmind-blue-studio-1-0-3/890>\
**Category:** enaio®\
**Tags:** release, coding\
**Created:** [2. Oktober 2026 um 09:54 UTC](https://ecm.community/t/release-ecmind-blue-studio-1-0-3/890 "2026-10-02T09:54:34Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![rk](https://ecm.community/user_avatar/ecm.community/rk/32/679_2.png) [@rk](https://ecm.community/u/rk)\
**Post date:** [2. Oktober 2026 um 09:54 UTC](https://ecm.community/t/release-ecmind-blue-studio-1-0-3/890/1 "2026-10-02T09:54:35Z")

</div>

Titel: ECMind blue Studio 1.0.3

* * *

Das _ECMind blue Studio_ ist in Version 1.0.3 auf [PyPI.org](http://PyPI.org) erschienen:

[ECMind blue Studio auf pypi.org](https://pypi.org/project/ecmind-blue-studio/1.0.3/)

Seit dem [Überblick zum Release 1.0.0](https://ecm.community/t/ecmind-blue-studio-1-0-0/868) sind 1.0.1 und 1.0.2 als Wartungsreleases erschienen. 1.0.3 bringt zwei neue Schalter für `upsert`: `insertonly` und `keepfiles`. Die übrigen Änderungen seit 1.0.0 stehen am Ende.

```auto
pip install --upgrade ecmind-blue-studio

```

### upsert

`upsert` sucht das Objekt über die `search`-Felder, wie im Beitrag [Schreiben und Importieren im Detail](https://ecm.community/t/ecmind-blue-studio-schreiben-und-importieren-im-detail/883) beschrieben. Ohne Treffer wird das Objekt angelegt. Bei einem Treffer wird es mit den Werten aus `set` aktualisiert. Mehrere Treffer sind ein Fehler.

Die beiden neuen Schalter sind für Datenvorbereitungen, die mehrfach laufen, wenn ein Update nicht benötigt wird: `insertonly` lässt das gefundene Objekt ganz in Ruhe, `keepfiles` nur seine Datei.

### insertonly

`insertonly` lässt ein gefundenes Objekt unverändert. Es werden weder Indexdaten noch Dateien geschrieben. Ohne Treffer wird das Objekt wie gewohnt angelegt. Technisch ist das `dms.XMLImport` mit `Action1 = NONE`, also ein einziger Aufruf.

```auto
upsert folder Customer
  set CompanyName = 'Alpenblick Treuhand AG', CustomerNo = 'K-10042'
  search CustomerNo
  insertonly as kunde;

upsert register Correspondence into @kunde
  set Subject = 'Rechnungen 2026'
  search Subject
  insertonly as reg

```

Der Server antwortet auch bei einem Treffer mit der ID des gefundenen Objekts. `as` bindet sie, `into @kunde` funktioniert also in beiden Fällen. `@kunde.action` ist `insert` oder `none`. Eine einzelne Anweisung meldet „Kunde 5693 existiert bereits und blieb, wie es war.“, im Batch steht `none` als Marke.

Mehrere Treffer bleiben ein Fehler, weil der Suchschlüssel dann nicht eindeutig ist.

### keepfiles

`keepfiles` aktualisiert die Indexdaten eines gefundenen Dokuments und lässt seine Datei unverändert. Die Datei aus der `file`-Klausel geht nur an ein neues Dokument.

```auto
upsert document Invoice into @reg
  set InvoiceNo = #FILEBASE#, 
      Amount = 2480.75
  search InvoiceNo
  file 'R-2026-1063.pdf' keepfiles as beleg

```

`dms.XMLImport` hat dafür keine Option, denn `REPLACEFILES` wählt nur zwischen Ersetzen und Anhängen. Das Studio macht deshalb zwei Aufrufe:

- Der erste schickt die Datei mit `Action1 = NONE`. Ohne Treffer entsteht das Dokument samt Datei in einem Job. Ein Treffer bleibt unverändert.
- Nur nach einem Treffer folgt der zweite mit derselben Suche und denselben Indexdaten, aber ohne Datei und ohne `REPLACEFILES`, mit `Action0 = ERROR` und `Action1 = UPDATE`.

Wurde das Dokument zwischen den beiden Aufrufen gelöscht, schlägt die Anweisung wegen `Action0 = ERROR` fehl. Es entsteht also kein Dokument ohne Datei. Die Datei wird bei jedem Lauf übertragen, auch wenn sie nicht gebraucht wird. `.action` meldet `update`, das Ergebnis zusätzlich, dass die Datei erhalten blieb.

Hier der Batch aus dem letzten Beitrag, ein zweites Mal ausgeführt. Ordner und Register mit `insertonly` ergeben `none`, die Rechnung mit `keepfiles` ergibt `update` mit erhaltener Datei:

 ![Der zweite Lauf mit insertonly und keepfiles](https://ecm.community/uploads/default/original/1X/2352f8326b09a29af0f312114eda2527f741aaf1.png)

Wichtig: `keepfiles` schützt nur die Datei. Die Indexdaten eines gefundenen Dokuments werden überschrieben. Also wie immer erst mit `select` prüfen, was die `search`-Felder finden.

Beide Schalter lassen sich mit `nomandatory` und `as` kombinieren. `keepfiles` geht auch mit `replacetables` oder `appendtables`, die dann für den zweiten Aufruf gelten.

### Prüfung im Editor

Der Editor prüft die Schalter, bevor etwas zum Server geht:

- Q3135: `insertonly` oder `keepfiles` auf `insert` oder `update`
- Q3136: `keepfiles`, `replacetables` oder `appendtables` neben `insertonly`, weil ein gefundenes Objekt dort nicht geschrieben wird
- Q3137: `keepfiles` ohne `file`-Klausel, weil ein `upsert` ohne Datei die Dateien ohnehin nicht anfasst

 ![keepfiles ohne file-Klausel wird vor dem Ausführen abgelehnt](https://ecm.community/uploads/default/original/1X/266e78cf1a8c8cf7a995912a6e35d1ad6d90c1ed.png)

Die Vervollständigung bietet `insertonly` nach `search` an und `keepfiles` erst nach einer `file`-Klausel.

### Weitere Änderungen seit 1.0.0

- Die Objektdefinition steht allen angemeldeten Benutzern offen. Mit der Systemrolle „DMS: Supervisor“ oder „Editor: Starten“ ist sie vollständig, sonst auf die sichtbaren Schränke und Typen gefiltert. Der Download der `asobjdef.xml` läuft mit den Rechten des Benutzers.
- Die Vervollständigung bietet keine Objekttypen mehr an, die der Benutzer nicht sehen darf. Ein von Hand geschriebener Typ bekommt weiterhin die Warnung.
- Die Tabs werden pro Anmeldung gespeichert und nicht mehr pro Browser.
- Mit `ecmind-blue-client` 1.0.2 wirkt `EBS_RESPONSE_SPILL_MB`. Antworten bis 32 MiB (Voreinstellung) bleiben im Speicher und gehen nicht schon ab 3,2 MiB in eine Datei.
- `select user` zeigt `locked = true` für Benutzer, die nach Fehlanmeldungen gesperrt sind. Ein `update user` ohne `locked` lässt den Sperrgrund des Servers stehen.
- Ab 1.0.2 ist die Abhängigkeit `ecmind-blue-client>=1.0.2` statt `==1.0.2`.

Weiterhin viel Spass mit dem ECMind blue Studio und meldet Euch gerne, wenn ich etwas ergänzen oder erklären darf.
