Eigenes Geschäftssystem erstellen
Im SetFN-Arbeitsbereich können Sie Systeme wie eine firmeneigene Groupware oder ein ERP selbst erstellen. Den Entwurf der Datenbankstruktur und die Erstellung der Ansichten überlassen Sie der KI; Sie müssen die Ergebnisse nur erzeugen und in den Arbeitsbereich hochladen. Zu erstellen sind 2 Dateien. Zu tun bleibt: hochladen und auf 'Bereitstellen' klicken. Als Beispiel erstellen wir ein 'Bestandsverwaltungsprogramm für die Fertigung'.
Wenn Sie die fertigen Dateien ohne KI-Prompts direkt ausprobieren möchten, erhalten Sie über Vollständiges Beispiel als ZIP herunterladen das Schema, index.html, mock-db-upload.html und die README auf einmal.
1. .sfn-Datei zum Erstellen der Datenbank anlegen
Im SetFN-Arbeitsbereich erstellen Sie eine DB mit einer Datei namens .sfn. Geben Sie einer KI wie Claude, GPT oder Gemini ein kopiertes Beispiel einer .sfn-Datei und beschreiben Sie Ihre Anforderungen, etwa 'Ich möchte den Bestand von Teilen und Produkten verwalten'. Die KI erstellt dann die Datei.
Kopieren Sie den folgenden Inhalt, passen Sie im unteren Teil den Anforderungsentwurf an und übergeben Sie ihn der KI.
Du bist ein Engineer, der Schemadateien (.sfn) für SetFN, eine No-Code-Backend-Plattform, entwirft.
Eine .sfn-Datei ist eine JSON-Datei mit der folgenden Struktur.
{
"content-type": "application/setfn-schema",
"dbType": "sqlite3",
"apiBuild": {
"dbName": "db_name_klein_mit_unterstrichen",
"dbEngine": "sqlite",
"includeClient": false,
"features": {
"realtime": { "enabled": false },
"upload": { "enabled": false },
"ai-chat": { "enabled": false }
}
},
"data": [
{
"table": { "name": "tabellenname", "cmt": "Beschreibung dieser Tabelle" },
"columns": [
{ "name": "id", "type": "serial4", "primary": true, "default": "auto_increment" },
{ "name": "spaltenname", "type": "text", "notnull": true, "cmt": "Spaltenbeschreibung" },
{ "name": "zahlenspalte", "type": "int4", "notnull": true, "default": "0" },
{ "name": "_created_at", "type": "timestamp", "default": "now()" }
],
"permissions": {
"security": { "login": true },
"ops": {
"list": { "login": true },
"view": { "login": true },
"create": { "login": true },
"update": { "login": true },
"delete": { "login": true, "roles": ["admin"] }
}
}
}
]
}
Verwende als Spaltentyp (type) nur serial4 (Auto-Increment-PK) / text / int4 (Ganzzahl) / timestamp.
Ergänze Spalten nach Bedarf um notnull, default, unique, index und cmt.
Entwirf nun in diesem Format die DB eines "Bestandsverwaltungssystems" für einen Fertigungsbetrieb. Die Anforderungen lauten:
- Teile werden registriert, und der aktuelle Lagerbestand jedes Teils wird verwaltet.
- Produkte werden registriert, und der aktuelle Lagerbestand jedes Produkts wird verwaltet.
- Ein Produkt wird aus mehreren Teilen montiert. Es wird verwaltet, welche Teile in welcher Menge für welches Produkt benötigt werden (BOM, Stückliste).
- Wareneingänge und Warenausgänge von Teilen/Produkten werden protokolliert. Insbesondere müssen beim Ereignis "Teile montieren und ein Produkt produzieren" die in diesem Moment verbrauchten Teile und die Menge der produzierten Produkte gemeinsam als ein Vorgang nachverfolgt werden (später muss abfragbar sein, "wie viele Teile in die Herstellung dieses Produkts eingeflossen sind").
Setze den DB-Namen (dbName) auf "inventory_management".
Entwirf höchstens 4 Tabellen, und zwar so praxisnah, dass sie sofort im Arbeitsalltag einsetzbar sind.
Gib ohne weitere Erklärung nur den fertigen .sfn-JSON-Code aus.
Nachfolgend ein Beispiel für eine so erzeugte KI-Antwort. Das tatsächliche Ergebnis kann je nach KI und je Durchlauf etwas abweichen — es muss nicht genau diesem Inhalt entsprechen, eine ähnliche Struktur genügt. Es muss jedoch ohne weitere Erklärung mit { beginnen und mit } enden, damit Sie das Ergebnis unverändert in den Editor einfügen können.
{
"content-type": "application/setfn-schema",
"dbType": "sqlite3",
"apiBuild": {
"dbName": "inventory_management",
"dbEngine": "sqlite",
"includeClient": false,
"features": {
"realtime": { "enabled": false },
"upload": { "enabled": false },
"ai-chat": { "enabled": false }
}
},
"data": [
{
"table": { "name": "parts", "cmt": "Teilestamm. Anzeigen/Registrieren/Bearbeiten für alle Mitglieder, Löschen nur für Administratoren" },
"columns": [
{ "name": "id", "type": "serial4", "primary": true, "default": "auto_increment" },
{ "name": "part_code", "type": "text", "notnull": true, "unique": true, "cmt": "Teilecode" },
{ "name": "name", "type": "text", "notnull": true, "cmt": "Teilename" },
{ "name": "spec", "type": "text", "cmt": "Spezifikation (z. B. M2, 220V/50Hz). Bei gleichem Namen, aber abweichender Spezifikation als separater part_code registrieren" },
{ "name": "category", "type": "text", "cmt": "Teilekategorie (Elektronikteile/Mechanikteile/Verpackungsmaterial usw.)" },
{ "name": "unit", "type": "text", "notnull": true, "default": "EA", "cmt": "Einheit" },
{ "name": "unit_cost", "type": "int4", "notnull": true, "default": "0", "cmt": "Stückpreis" },
{ "name": "current_stock", "type": "int4", "notnull": true, "default": "0", "cmt": "Aktueller Bestand" },
{ "name": "safety_stock", "type": "int4", "notnull": true, "default": "0", "cmt": "Sicherheitsbestand (Bestellpunkt)" },
{ "name": "supplier", "type": "text", "cmt": "Lieferant" },
{ "name": "_user_id", "type": "int4", "notnull": true, "index": true },
{ "name": "_nick", "type": "text", "cmt": "Anzeigename des Mitglieds, das zuletzt registriert/bearbeitet hat" },
{ "name": "_created_at", "type": "timestamp", "default": "now()" }
],
"permissions": {
"security": { "login": true, "ownerColumn": "_user_id" },
"ops": {
"list": { "login": true },
"view": { "login": true },
"create": { "login": true },
"update": { "login": true },
"delete": { "login": true, "roles": ["admin"] }
}
}
},
{
"table": { "name": "products", "cmt": "Produktstamm. Anzeigen/Registrieren/Bearbeiten für alle Mitglieder, Löschen nur für Administratoren" },
"columns": [
{ "name": "id", "type": "serial4", "primary": true, "default": "auto_increment" },
{ "name": "product_code", "type": "text", "notnull": true, "unique": true, "cmt": "Produktcode" },
{ "name": "name", "type": "text", "notnull": true, "cmt": "Produktname" },
{ "name": "category", "type": "text", "cmt": "Produktkategorie" },
{ "name": "unit", "type": "text", "notnull": true, "default": "EA", "cmt": "Einheit" },
{ "name": "price", "type": "int4", "notnull": true, "default": "0", "cmt": "Verkaufspreis" },
{ "name": "current_stock", "type": "int4", "notnull": true, "default": "0", "cmt": "Aktueller Bestand" },
{ "name": "_user_id", "type": "int4", "notnull": true, "index": true },
{ "name": "_nick", "type": "text", "cmt": "Anzeigename des Mitglieds, das zuletzt registriert/bearbeitet hat" },
{ "name": "_created_at", "type": "timestamp", "default": "now()" }
],
"permissions": {
"security": { "login": true, "ownerColumn": "_user_id" },
"ops": {
"list": { "login": true },
"view": { "login": true },
"create": { "login": true },
"update": { "login": true },
"delete": { "login": true, "roles": ["admin"] }
}
}
},
{
"table": { "name": "bom", "cmt": "Stückliste je Produkt (einstufig). Eine Unique-Beschränkung auf bom_key (product_id:part_id) verhindert, dass dasselbe Teil für dasselbe Produkt doppelt registriert wird" },
"columns": [
{ "name": "id", "type": "serial4", "primary": true, "default": "auto_increment" },
{ "name": "product_id", "type": "int4", "notnull": true, "index": true },
{ "name": "part_id", "type": "int4", "notnull": true, "index": true },
{ "name": "qty_per_unit", "type": "int4", "notnull": true, "default": "1", "cmt": "Benötigte Teilemenge für 1 Produkteinheit" },
{ "name": "bom_key", "type": "text", "notnull": true, "unique": true, "cmt": "Kombination product_id:part_id. Verhindert doppelte Registrierung" },
{ "name": "_user_id", "type": "int4", "notnull": true, "index": true },
{ "name": "_nick", "type": "text", "cmt": "Anzeigename des registrierenden Mitglieds" },
{ "name": "_created_at", "type": "timestamp", "default": "now()" }
],
"permissions": {
"security": { "login": true, "ownerColumn": "_user_id" },
"ops": {
"list": { "login": true },
"view": { "login": true },
"create": { "login": true },
"update": { "login": true },
"delete": { "login": true, "roles": ["admin"] }
}
}
},
{
"table": { "name": "stock_transactions", "cmt": "Gemeinsamer Verlauf für Ein-/Ausgänge und Montage. item_type=part|product, tx_type=입고|출고|조립사용|조립생산 (Wareneingang|Warenausgang|Montageverbrauch|Montageproduktion). Ein Montageproduktionsereignis besteht aus mehreren Montageverbrauch-Einträgen (Teileverbrauch) + 1 Montageproduktion-Eintrag (Produktzugang), die dieselbe batch_id teilen, sodass nachvollziehbar ist, welche Teile in welcher Menge für ein Produkt verwendet wurden" },
"columns": [
{ "name": "id", "type": "serial4", "primary": true, "default": "auto_increment" },
{ "name": "item_type", "type": "text", "notnull": true, "cmt": "part | product" },
{ "name": "item_id", "type": "int4", "notnull": true, "index": true, "cmt": "parts.id oder products.id" },
{ "name": "item_name", "type": "text", "notnull": true, "cmt": "Momentaufnahme des Artikelnamens zum Zeitpunkt der Registrierung" },
{ "name": "tx_type", "type": "text", "notnull": true, "cmt": "입고 (Wareneingang) | 출고 (Warenausgang) | 조립사용 (Montageverbrauch) | 조립생산 (Montageproduktion)" },
{ "name": "reason", "type": "text", "cmt": "Grund des Ein-/Ausgangs. Bei Montageverbrauch/Montageproduktion leer, da tx_type selbst der Grund ist" },
{ "name": "qty", "type": "int4", "notnull": true, "cmt": "Immer positiv. Die Richtung ergibt sich aus tx_type" },
{ "name": "batch_id", "type": "text", "index": true, "cmt": "ID zur Bündelung eines Montageproduktionsereignisses. Bei einfachen Ein-/Ausgängen leer" },
{ "name": "note", "type": "text", "cmt": "Notiz" },
{ "name": "_user_id", "type": "int4", "notnull": true, "index": true },
{ "name": "_nick", "type": "text", "cmt": "Anzeigename des registrierenden Mitglieds" },
{ "name": "_created_at", "type": "timestamp", "default": "now()" }
],
"permissions": {
"security": { "login": true, "ownerColumn": "_user_id" },
"ops": {
"list": { "login": true },
"view": { "login": true },
"create": { "login": true },
"update": { "login": true, "roles": ["admin"] },
"delete": { "login": true, "roles": ["admin"] }
}
}
}
]
}
Kopieren Sie dieses Ergebnis und erstellen Sie im Arbeitsbereich über Erstellen → Vorlagendateien → Neues Schema (DB) eine leere Schemadatei.

Geben Sie einen Dateinamen ein und speichern Sie. Damit ist die leere Schemadatei angelegt.

Klicken Sie oben rechts auf die Registerkarte Editor und fügen Sie die KI-Antwort von eben unverändert ein.

Wechseln Sie nach dem Speichern zur Registerkarte API-Erstellung oben. Dort sehen Sie die automatisch generierte API-Liste je Tabelle.

Klicken Sie auf Bereitstellen, um die Einstellungen aufzuklappen, prüfen Sie die Datenbankkennung und klicken Sie erneut auf Bereitstellen. Nach einigen Sekunden erscheint die Meldung 'Bereitstellung abgeschlossen!'. Speichern Sie abschließend über die Diskettenschaltfläche oben. Damit ist die DB-Konfiguration abgeschlossen — die 4 Tabellen für Teile, Produkte, Stückliste und Ein-/Ausgangsverlauf sowie die REST-APIs für diese Tabellen sind tatsächlich erstellt und sofort einsatzbereit. Als Nächstes erstellen Sie die Ansicht, die mit dieser DB verbunden wird.
2. .html-Datei für die Ansicht erstellen
Auch diesmal bitten Sie die KI. Planen und ordnen Sie, was Sie erstellen möchten, und übergeben Sie es der KI. Geben Sie dabei den Inhalt der zuvor erstellten .sfn-Datei als Referenzmaterial mit.
- Ein Eingabeformular zum Registrieren von Teilen und Produkten
- Ein Formular zum Erfassen von Wareneingängen und Warenausgängen
- Wenn Sie erfassen, dass 'von diesem Produkt so viele Stück produziert wurden', werden die benötigten Teilemengen automatisch berechnet und auf den Bestand angewendet
- Der aktuelle Bestand wird in einer Tabelle angezeigt, und Werte lassen sich direkt in der Tabelle ändern und speichern
Fügen Sie den folgenden Inhalt anschließend in den KI-Chat ein. (Fügen Sie ganz oben das Ergebnis aus Schritt 1 mit ein.)
[Hier das Ergebnis aus Schritt 1 einfügen]
Das obige Schema ist bereits bereitgestellt. Erstelle eine Webansicht (index.html), die dieses Schema verwendet.
Wenn die Ansicht Daten lädt oder speichert, sendet sie Anfragen nach den folgenden Regeln an den Server.
1. So erhältst du das API-Token des angemeldeten Benutzers:
POST /api/auth/bootstrap (credentials: "include")
Antwort: { data: { access_token, user: { id, nick } } }
2. Alle weiteren Anfragen erhalten diesen Header: Authorization: Bearer <access_token>
3. Tabellen-CRUD:
Abfragen GET /api/web/{dbName}/{table}/list?spalte=wert → Antwort { rows: [...] } (rows kann null sein, wenn es keine Ergebnisse gibt, daher immer als rows || [] behandeln)
Erstellen POST /api/web/{dbName}/{table}/create → Body: JSON, Antwort { lastInsertId }
Ändern PUT /api/web/{dbName}/{table}/update/{id} → Body: JSON (es reicht, nur die geänderten Spalten zu senden)
Löschen DELETE /api/web/{dbName}/{table}/delete/{id}
Die Ansicht benötigt folgende Funktionen:
- Ein Eingabeformular zum Neuanlegen von Teilen und Produkten
- Ein Formular zum Erfassen von Wareneingängen und Warenausgängen für Teile/Produkte (beim Erfassen wird auch der aktuelle Bestand aktualisiert)
- Eine Funktion, die beim Erfassen von "von diesem Produkt wurden so viele Stück produziert" anhand der registrierten Stückliste die benötigten Teilemengen automatisch berechnet, den Teilebestand abzieht und den Produktbestand erhöht. Reicht der Teilebestand nicht aus, blockiere die Erfassung und weise darauf hin.
- Eine Ansicht, die den aktuellen Bestand von Teilen/Produkten in einer Tabelle zeigt. Ein Klick auf eine Zelle soll den Wert direkt an Ort und Stelle bearbeitbar und speicherbar machen.
- Eine Liste, die den Verlauf von Eingängen/Ausgängen/Montagen in zeitlicher Reihenfolge zeigt.
Packe alles in eine einzige HTML/CSS/JS-Datei. Gestalte ein Kartenlayout auf sauberem weißem Hintergrund.
Gib ohne weitere Erklärung nur den fertigen index.html-Code aus.
Nachfolgend ein Beispiel für eine so erzeugte HTML-Datei. Das tatsächliche Ergebnis kann je nach KI etwas abweichen.
Wenn Sie diese Datei in den Arbeitsbereich hochladen, ist die Ansicht fertig, die Ihre Teammitglieder tatsächlich nutzen können.
3. Testdaten einfüllen
Um das System tatsächlich in Aktion zu sehen, brauchen Sie Daten. Auch eine Ansicht, die per Knopfdruck Beispieldaten einfüllt, können Sie die KI direkt erstellen lassen.
[Hier das Ergebnis aus Schritt 1 einfügen]
Das obige Schema ist bereits bereitgestellt, und die index.html, die dieses Schema verwendet, ist ebenfalls bereits erstellt.
Erstelle eine Ansicht (mock-db-upload.html), die per Klick auf eine einzige Schaltfläche automatisch Testdaten einfüllt.
Schreibe die Daten auf dieselbe Weise wie die Ansicht aus Schritt 2 in den echten Server (Token per POST /api/auth/bootstrap holen, Datensätze per POST /api/web/{dbName}/{table}/create anlegen).
- Lege tatsächlich 10–15 Teile, 3–5 Produkte, die Teilezusammensetzung jedes Produkts und einige Ein-/Ausgangseinträge an.
- Fülle Namen und Mengen von Teilen/Produkten mit Werten, wie sie in einem Fertigungsbetrieb tatsächlich vorkommen.
- Wenn bereits Daten mit demselben Code vorhanden sind, überspringe nur diesen Eintrag und fahre fort.
- Zeige den Fortschritt zeilenweise als Protokoll auf dem Bildschirm an und zeige am Ende "Fertig" an.
Gib ohne weitere Erklärung nur den fertigen mock-db-upload.html-Code aus.
Nachfolgend ein Beispiel für eine so erzeugte HTML-Datei. Das tatsächliche Ergebnis kann je nach KI etwas abweichen. Diese Ansicht wird nicht bereitgestellt, sondern nur geöffnet, wenn Sie eine Demo vorbereiten müssen.
Mit eingetragenen Daten sieht die Nutzung so aus.




4. Wiederholt anpassen
Sie müssen nicht alles auf einmal fertigstellen. Wenn Ihnen bei der Nutzung der Ansicht fehlende Funktionen oder Änderungswünsche auffallen, bitten Sie die KI einfach weiter. Je nachdem, was Sie ändern, unterscheiden sich jedoch die nächsten Schritte.
- Änderungen an der DB-Struktur (Tabellen/Spalten) — z. B. neue Spalte, neue Tabelle — erfordern, dass Sie die geänderte
.sfnerneut holen, in denEditoreinfügen und unterAPI-Erstellungerneut bereitstellen. - Änderungen nur an der Ansicht bei unveränderter DB-Struktur — z. B. Design, Texte, Position von Schaltflächen — erfordern nur, dass Sie
index.htmlerneut holen und die bestehende Datei überschreiben. Die API muss nicht erneut bereitgestellt werden. - Wenn Sie die Struktur einer Tabelle ändern, die bereits Daten enthält, prüfen Sie in den Bereitstellungseinstellungen die Option
Vorhandene Daten überschreiben. Bei aktiviertem Überschreiben werden bestehende Daten dauerhaft gelöscht.
Mit nur diesen vier Schritten erstellt die KI alles: den Datenbankentwurf, die fertigen Ansichten, die Testdaten und die späteren Anpassungen. Danach verfeinern Sie Design und Details der Ansicht nach Belieben weiter.