[{"data":1,"prerenderedAt":94},["ShallowReactive",2],{"content:blog:dashboard-mit-luecke":3,"content:blog":33},{"slug":4,"title":5,"subtitle":6,"date":7,"metaTitle":8,"metaDescription":9,"excerpt":10,"readingMinutes":11,"tags":12,"toc":16,"body":32},"dashboard-mit-luecke","Ein Dashboard, dem der Inhaber nicht glaubte: 13 618 bezahlte Bestellungen fehlten","Warum eine Zahl ohne Angabe, was sie enthält, schlimmer ist als keine Zahl – und was wir beim Umbau bewusst weggelassen haben","2026-08-06","Dashboard mit Lücke: 13 618 Bestellungen sichtbar gemacht","Ein Dashboard zeigte nur Großhandelsbestellungen, die Onlineshops fehlten. Wie wir es umgebaut haben und warum jede Zahl sagt, was sie enthält und was nicht.","Eine Unternehmensgruppe aus der Lebensmittelbranche sah auf ihrem Dashboard eine Umsatzzahl, die der Inhaber selbst für unvollständig hielt. Er hatte recht: Die Bestellungen zweier Onlineshops fehlten ganz. Der Umbau zeigt, warum ein Bildschirm mit Zahlen eine Anwendung ist und keine hübschere Tabelle.",4,[13,14,15],"App-Entwicklung","Datenqualität","Projektpraxis",[17,20,23,26,29],{"id":18,"text":19},"ausgangslage","Das Dashboard und die Zahl, die nicht stimmte",{"id":21,"text":22},"ursache","Warum die Lücke niemandem auffiel",{"id":24,"text":25},"umbau","Was wir am Dashboard geändert haben",{"id":27,"text":28},"weggelassen","Was wir bewusst nicht gebaut haben",{"id":30,"text":31},"lehre","Was daraus für jede interne Anwendung folgt","\u003Cp>Ein Dashboard ist nur so viel wert wie das Vertrauen in seine Zahlen. Bei einer Unternehmensgruppe aus Lebensmittelproduktion und Filialhandel sah der Inhaber eine Zahl, die er selbst als zu niedrig erkannte. Die Prüfung ergab: Die Bestellungen der beiden Onlineshops wurden überhaupt nicht gezählt, für einen Geschäftsbereich blieb der Bildschirm sogar leer.\u003C\u002Fp>\u003Ch2 id=\"ausgangslage\">Das Dashboard und die Zahl, die nicht stimmte\u003C\u002Fh2>\u003Cp>Die Übersicht war dafür gedacht, dem Inhaber jeden Morgen zu zeigen, wie die Geschäftsbereiche laufen. Sie las ihre Zahlen aus dem Bestelljournal, in dem die Großhandelsaufträge erfasst werden. Das war zu dem Zeitpunkt, als die Übersicht entstand, eine vernünftige Quelle, denn der Großhandel war das Hauptgeschäft.\u003C\u002Fp>\u003Cp>Inzwischen verkaufte die Gruppe aber auch über zwei eigene Onlineshops, und diese Bestellungen landeten nicht im Journal, sondern in den Datenbanken der Shops. Die Übersicht wusste davon nichts. Es zeigte 3 936 bezahlte Online-Bestellungen, obwohl in den Shops insgesamt 17 554 bezahlte Warenkörbe lagen. Die Differenz, 13 618 Bestellungen, war auf keinem Bildschirm sichtbar.\u003C\u002Fp>\u003Cp>Das Bemerkenswerte ist nicht die Lücke selbst, sondern wie sie auffiel. Kein Test schlug an, keine Fehlermeldung erschien. Der Inhaber kannte sein Geschäft und merkte, dass die Zahl zu klein war. Ohne dieses Gefühl hätte der Bildschirm weiter eine falsche Wirklichkeit gezeigt, mit sauberem Layout und sicher wirkenden Diagrammen.\u003C\u002Fp>\u003Ch2 id=\"ursache\">Warum die Lücke niemandem auffiel\u003C\u002Fh2>\u003Cp>Die Ursache war kein Programmierfehler im engeren Sinn. Der Code tat genau, was er sollte: Er zählte das Journal. Das Problem lag darin, dass nirgends stand, was gezählt wird. Die Überschrift lautete sinngemäß »Bestellungen«, nicht »Großhandelsbestellungen aus dem Journal«. Wer den Bildschirm ansah, musste annehmen, alle Verkäufe zu sehen.\u003C\u002Fp>\u003Cp>Solche Lücken entstehen in fast jedem Unternehmen, das wächst. Ein neuer Vertriebsweg kommt hinzu, ein Geschäftsbereich wird ausgegründet, eine zweite Währung taucht auf. Die Auswertung wird nicht mitgezogen, weil niemand sie als Anwendung mit eigener Pflege betrachtet, sondern als fertigen Bildschirm.\u003C\u002Fp>\u003Ch2 id=\"umbau\">Was wir am Dashboard geändert haben\u003C\u002Fh2>\u003Cp>Der Umbau hatte drei Teile, und nur einer davon war die eigentliche Datenanbindung.\u003C\u002Fp>\u003Cp>\u003Cstrong>Erstens die Quellen.\u003C\u002Fstrong> Die Übersicht liest jetzt zusätzlich die bezahlten Bestellungen beider Onlineshops. Welche Bestellstatus als bezahlt gelten, ist festgelegt und nicht dem Zufall überlassen.\u003C\u002Fp>\u003Cp>\u003Cstrong>Zweitens die Sichtbarkeit.\u003C\u002Fstrong> Der Bildschirm hat zwei Bereiche mit getrenntem Sichtbarkeitsumfang. Die Produktionsblöcke bleiben dem jeweiligen Geschäftsbereich vorbehalten, die Website-Verkäufe folgen der gewählten Sparte. Ein Mitarbeiter, der nur für eine Sparte zuständig ist, sieht weiterhin ausschließlich seine eigenen Zahlen. Gerade bei einem Umbau, der mehr Daten auf einen Bildschirm bringt, ist diese Grenze leicht zu verletzen; sie ist deshalb mit 319 Prüfungen und einem Mutations-Prüfstand abgesichert, der alle 16 absichtlich eingebauten Fehler erkannt hat.\u003C\u002Fp>\u003Cp>\u003Cstrong>Drittens die Beschriftung.\u003C\u002Fstrong> Unter der Tabelle steht, welche Shops und welche Bestellstatus enthalten sind. Das klingt nach einer Kleinigkeit und war der wichtigste Teil. Die nächste Lücke, etwa ein dritter Shop, wird dadurch nicht verhindert, aber sie wird sichtbar, weil die Beschriftung ihn nicht nennt.\u003C\u002Fp>\u003Cp>Das Ergebnis: Der Inhaber sieht jetzt 17 554 bezahlte Online-Bestellungen statt 3 936, aufgeschlüsselt nach Geschäft und Währung. Wie ein solcher Umbau als Projekt beschrieben und geprüft wird, erklärt die Seite \u003Ca href=\"\u002Fleistungen\u002Fapp-entwicklung\">App-Entwicklung\u003C\u002Fa>.\u003C\u002Fp>\u003Ch2 id=\"weggelassen\">Was wir bewusst nicht gebaut haben\u003C\u002Fh2>\u003Cp>Die naheliegende Erweiterung wäre eine Gesamtsumme über alle Shops gewesen, umgerechnet in eine Währung. Wir haben sie nicht gebaut. Die Shops verkaufen in unterschiedlichen Währungen, und der Inhaber gleicht die Zahlen regelmäßig mit den Verwaltungsoberflächen der Shops ab. Eine umgerechnete Summe hätte bei jedem Abgleich eine zweite Rechnung verlangt: Welcher Kurs, von welchem Tag, und warum weicht das vom Shop ab?\u003C\u002Fp>\u003Cp>Deshalb steht jede Zeile für sich, in ihrer eigenen Währung und ohne Umrechnung. Das ist weniger elegant als eine große Zahl oben rechts. Es ist aber die Form, in der der Inhaber die Zahlen tatsächlich prüfen kann. Die Einschränkung hat einen Preis: Wer die Gesamtlage in einer Zahl sehen will, muss selbst addieren. Diese Entscheidung haben wir mit ihm getroffen und nicht für ihn.\u003C\u002Fp>\u003Ch2 id=\"lehre\">Was daraus für jede interne Anwendung folgt\u003C\u002Fh2>\u003Cp>Aus dem Fall lassen sich drei Regeln ableiten, die wir seither bei jeder Auswertung anwenden. Jede Zahl sagt, was sie enthält und was nicht. Jede neue Datenquelle im Unternehmen löst die Frage aus, welche Übersichten davon betroffen sind. Und wer auf einem Bildschirm etwas sieht, sieht nur, was er sehen darf, auch nachdem der Bildschirm erweitert wurde.\u003C\u002Fp>\u003Cp>Die dritte Regel gehört vor den Entwurf, nicht in die Nacharbeit. Welche Rollen was sehen, steht bei uns im \u003Ca href=\"\u002Flexikon\u002Flastenheft\">Lastenheft\u003C\u002Fa> oder im Angebot und wird bei der \u003Ca href=\"\u002Flexikon\u002Fabnahme\">Abnahme\u003C\u002Fa> geprüft, zusammen mit der Frage, woher jede Zahl kommt. Eine solche Übersicht ist damit keine Grafik, sondern eine Anwendung mit Datenmodell, Rechten und Pflege, und genau so bauen wir es.\u003C\u002Fp>",[34,59,86],{"slug":35,"title":36,"subtitle":37,"date":38,"metaTitle":39,"metaDescription":40,"excerpt":41,"readingMinutes":11,"tags":42,"toc":46},"vertraulichkeit-vor-der-ersten-zeile-code","Vertraulichkeit vor der ersten Zeile Code: was ein Sprachmodell sehen darf","Fünf Schritte vom ersten Termin bis zum Betrieb – und der Satz über amerikanische Anbieter, den wir lieber vorher sagen als hinterher","2026-09-10","Vertraulichkeit im KI- und App-Projekt: fünf Schritte","Vertraulichkeit im App- oder KI-Projekt: Geheimhaltung vor dem Termin, Beispieldaten, AVV und was ein Sprachmodell sehen darf – Schritt für Schritt.","Die meisten Fragen zu Daten und Geheimhaltung werden in Projekten zu spät gestellt, meist dann, wenn das erste Muster schon mit echten Kundendaten läuft. Wir beschreiben die Reihenfolge, in der wir diese Fragen klären, und wo die Grenzen dessen liegen, was wir zusagen können.",[43,44,45],"Arbeitsweise","Datenschutz","KI",[47,50,53,56],{"id":48,"text":49},"zu-spaet","Warum Vertraulichkeit meist zu spät kommt",{"id":51,"text":52},"schritte","Fünf Schritte vom ersten Termin bis zum Betrieb",{"id":54,"text":55},"modellanbieter","Der Satz über Modellanbieter",{"id":57,"text":58},"grenzen","Vertraulichkeit: was wir zusagen und was nicht",{"slug":60,"title":61,"subtitle":62,"date":63,"metaTitle":64,"metaDescription":65,"excerpt":66,"readingMinutes":67,"tags":68,"toc":70},"regeln-in-den-code-nicht-ins-modell","Was ins Sprachmodell gehört und was in den Code: zwei Abläufe aus einer KI-Beratung","Warum die ehrliche Antwort oft lautet, dass ein Sprachmodell nur einen Teil der Arbeit übernehmen sollte – und woran man diesen Teil erkennt","2026-08-27","Sprachmodell oder Code: was eine KI-Beratung klären sollte","Zwei echte Abläufe: warum Zahlungsdaten und feste Regeln in den Code gehören, freie Sprache ins Sprachmodell – und wo ein Blick aufs Formular mehr bringt.","Wer eine KI-Beratung beauftragt, erwartet oft eine Liste von Stellen, an denen ein Sprachmodell eingesetzt wird. An zwei Abläufen eines Lebensmittelbetriebs zeigen wir, warum die nützlichere Antwort eine Trennlinie ist: was das Modell tun soll, was fester Code tun muss und wo nicht die Technik, sondern ein Blick auf das Formular die Lösung war.",5,[45,69,43],"Beratung",[71,74,77,80,83],{"id":72,"text":73},"frage","Die falsche Frage: wo passt ein Sprachmodell?",{"id":75,"text":76},"bestellungen","Ablauf eins: Antworten auf Bestellanfragen",{"id":78,"text":79},"stundenzettel","Ablauf zwei: handschriftliche Stundenzettel",{"id":81,"text":82},"trennlinie","Was ins Sprachmodell gehört: drei Fragen",{"id":84,"text":85},"grenze","Was wir dabei nicht leisten konnten",{"slug":4,"title":5,"subtitle":6,"date":7,"metaTitle":8,"metaDescription":9,"excerpt":10,"readingMinutes":11,"tags":87,"toc":88},[13,14,15],[89,90,91,92,93],{"id":18,"text":19},{"id":21,"text":22},{"id":24,"text":25},{"id":27,"text":28},{"id":30,"text":31},1789379025152]