<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:version="2.0"><channel><title>🪢 Sven Sieverding</title><description>365 Knoten...im Kopf</description><link>https://www.365konten.de/</link><language>de</language><item><title>Digitale Analogien – Wie Bürogegenstände helfen, Microsoft 365 besser zu verstehen</title><link>https://www.365konten.de/blog/2026-03-19/</link><guid isPermaLink="true">https://www.365konten.de/blog/2026-03-19/</guid><description>Habt ihr euch schonmal gefragt, wann ihr wo Dateien im M365 abspeichern solltet? Ich erkläre euch das mal mit ein paar Analogien.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2026-03-19/&quot;&gt;https://www.365konten.de/blog/2026-03-19/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import { Image } from &amp;#39;astro:assets&amp;#39;;
import egg from &amp;#39;./1774005477577.png&amp;#39;;&lt;/p&gt;
&lt;p&gt;Die digitale Arbeitswelt kann manchmal verwirrend sein – besonders, wenn es um die richtige Ablage von Dateien in Microsoft 365 geht. Viele Nutzer stehen vor der Frage: Wo speichere ich was? Teams, SharePoint, OneDrive – und was ist eigentlich ein privater Kanal? Um das verständlich zu machen, nutze ich fünf Analogien aus dem Büroalltag. Sie helfen, die Funktionen und Einsatzbereiche der verschiedenen Tools greifbar zu machen.&lt;/p&gt;
&lt;p&gt;Diese Analogie will ich euch heute im Rahmen der Serie &amp;quot;Eggs of Knowledge&amp;quot; vom &lt;a href=&quot;https://www.mvptreff.de/&quot;&gt;MVP-Treff&lt;/a&gt; nahebringen. Schaut da mal vorbei, es da könnt ihr noch viele weitere spannende EInblicke zu Projekten, Best Practices und Perspektiven rund um Microsoft 365, Copilot und Modern Work finden.&lt;/p&gt;
&lt;a href=&quot;https://www.mvptreff.de/&quot;&gt;
  &lt;Image src={egg} alt=&quot;Egg of Knowledge&quot;  width=&quot;120&quot;   /&gt;
&lt;/a&gt;


&lt;h1&gt;Rollcontainer – Dein persönlicher Speicher: OneDrive&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/image.png&quot; alt=&quot;Rollcontainer&quot;&gt;
Stell dir deinen Rollcontainer unter dem Schreibtisch vor: Er gehört nur dir, du kannst ihn abschließen und alles darin ablegen – von Akten bis zur Banane. Es gibt keine vorgeschriebene Ordnung, und niemand außer dir hat Zugriff. 
In der digitalen Welt entspricht das dem OneDrive: Dein persönlicher Speicherplatz, in dem du alles ablegen kannst, was du möchtest. Wichtig: Wenn du das Unternehmen verlässt, wird der Rollcontainer geleert und die Inhalte vernichtet – genauso wird dein OneDrive gelöscht und die Dateien gehen verloren. Für langfristige Unternehmensdaten ist OneDrive daher nicht geeignet.&lt;/p&gt;
&lt;h1&gt;Aktenschrank – Gemeinsame Ordnung: SharePoint&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/image-1.png&quot; alt=&quot;Aktenschrank&quot;&gt;
Der Aktenschrank steht im Flur und ist für alle zugänglich. Hier gibt es eine klare Ordnung, auf die sich das Team geeinigt hat – zum Beispiel nach Jahren sortiert. Die Akten bleiben auch nach deinem Ausscheiden im Unternehmen erhalten. 
SharePoint ist das digitale Pendant: Thematisch geordnete Speicherorte, auf die mehrere Personen zugreifen können. Die Inhalte sind nicht an einzelne Nutzer gebunden und überdauern deren Zeit im Unternehmen. SharePoint eignet sich für langfristige, teamübergreifende Dokumentenablage.&lt;/p&gt;
&lt;h1&gt;Projektraum – Zusammenarbeit auf Zeit: Microsoft Teams Team&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/image-2.png&quot; alt=&quot;Projektraum&quot;&gt;
Ein Projektraum ist ein temporärer Raum, in dem ein Projektteam zusammenkommt, gemeinsam arbeitet und kollaboriert. Hier können Aktenschränke, Kalender und Aufgabenlisten aufgestellt werden – alles, was für das Projekt relevant ist. Die Tür ist abschließbar, nur das Projektteam hat Zugang. 
Microsoft Teams bildet diesen Projektraum digital ab: Ein Team kann gemeinsam auf Ressourcen wie SharePoint, Planner und Kalender zugreifen und jedes Teammitglied hat automatisch Zugriff auf alle Ressourcen im Team. Die Zusammenarbeit ist effizient und auf das Projekt zugeschnitten.&lt;/p&gt;
&lt;h1&gt;Abgeschlossene Ecke im Projektraum – Private Kanäle in Teams&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/image-3.png&quot; alt=&quot;Abgeschlossene Ecke&quot;&gt;
Im Projektraum größerer Projekte gibt es manchmal eine kleine, abgeschlossene Ecke – zum Beispiel für die Projektleitung. Hier sind bestimmte Akten und Informationen nur für ausgewählte Personen zugänglich. Um dorthin zu gelangen, muss man aber grundsätzlich immer zuerst durch den Projektraum. In den den privaten Raum zu gelangen, ohne den Projektraum zu durchqueren, ist unmöglich.
Private Kanäle in Teams funktionieren genauso: Sie sind abgetrennte Bereiche innerhalb eines Teams, zugänglich nur für bestimmte Mitglieder. Man kann niemanden nur in den privaten Kanal einladen, man muss immer durch das Team dorthin gelangen.
Auch stehen dort einige Funktionen wie etwa der Microsoft Planner nicht zur Verfügung – So wie auch die kleine abgeschlossene Ecke im Projektraum kein vollwertiger Raum ist und man dort auch nicht alles machen kann, da man dort ggf. keine echten Wände hat, sondern vielleicht nur Glasscheiben, die die Ecke vom Projektraum trennen.&lt;/p&gt;
&lt;h1&gt;Meetingraum – Temporärer Austausch: Microsoft Teams Meetings&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/image-4.png&quot; alt=&quot;Meeting&quot;&gt;
Ein Meetingraum wird für Besprechungen genutzt. Die Teilnehmer bringen ihre Unterlagen mit, tauschen sich aus und nehmen die Akten danach wieder mit zurück ins Büro. Im Meetingraum bleibt nichts dauerhaft liegen. 
Microsoft Teams Meetings sind das digitale Äquivalent: Dateien können während des Meetings geteilt und bearbeitet werden, sind aber nicht für die dauerhafte Ablage gedacht. Nach dem Meeting sollten die Dateien wieder in den richtigen Aktenschrank (SharePoint) oder Rollcontainer (OneDrive) zurückgelegt werden. 
Den analogen Meetingraum solltet ihr ja auch in dem Zustand hinterlassen, in dem ihr ihn vorgefunden habt. Spätestens bei der Säuberung des Raumes werden dort dann ja auch dann alle Gegenstände entfernt, die da nicht hingehören.&lt;/p&gt;
&lt;h1&gt;Kurzgesagt&lt;/h1&gt;
&lt;p&gt;Ich hoffe, die Analogien haben euch ein wenig geholfen und ihr habt nun ein besseres Verständnis, wann man wo in M365 Dateien ablegen sollte. Ich fasse hier nochmal kurz zusammen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OneDrive für persönliche, temporäre Dateien&lt;/li&gt;
&lt;li&gt;SharePoint für teamübergreifende, langfristige Dokumente&lt;/li&gt;
&lt;li&gt;Teams für projektbezogene Zusammenarbeit&lt;/li&gt;
&lt;li&gt;Private Kanäle für vertrauliche Bereiche im Team&lt;/li&gt;
&lt;li&gt;Meetings für den kurzfristigen Austausch&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate></item><item><title>Hoste eine Webseite in Azure</title><link>https://www.365konten.de/blog/2025-08-12/</link><guid isPermaLink="true">https://www.365konten.de/blog/2025-08-12/</guid><description>Wenn du eine reine HTML basierte Webseite hast, dann kannst du die einfach in Azure hosten.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2025-08-12/&quot;&gt;https://www.365konten.de/blog/2025-08-12/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Ich hatte neulich einen Kunden, der eine interne HTML-basierte Webseite mit PDF Berichten hostet. Diese Seite war mal auf einem Webserver im internen Unternehmensnetz gespeichert, soll aber nun aus dem Internet erreichbar sein, damit per Smartphone darauf zugegriffen werden kann.&lt;/p&gt;
&lt;p&gt;Die HTML-Seiten der Webseite selber werden übrigens mittels Excel und vieler Makros generiert. Das ist auch ein spannendes Konstrukt, aber von dem erzähle ich euch ein anders Mal.&lt;/p&gt;
&lt;p&gt;Es gibt an das Hosting der Webseite einige Anforderungen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sie soll nur für Mitarbeiter des Unternehmens sichtbar sein&lt;/li&gt;
&lt;li&gt;Der bestehende Erzeugungsmechanismus soll bestehen bleiben. Nur der bisherige &amp;quot;Kopier&amp;quot; Mechanismus auf den lokalen Webserver soll durch einen ebenso einfachen anderen Mechanismus ersetzt werden.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das können wir mittels Azure und einer kleinen &amp;quot;nodejs&amp;quot; Anwendung abbilden&lt;/p&gt;
&lt;h2&gt;Eine Webapp im Azure anlegen&lt;/h2&gt;
&lt;p&gt;Legen wir zunächst die Webseite im Azure an. Dazu öffnen wir zuerst die Azure Startseite&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://portal.azure.com/&quot;&gt;https://portal.azure.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;und suchen dann oben in der Suchleiste nach &amp;quot;App Services&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild1.png&quot; alt=&quot;App Services&quot;&gt;&lt;/p&gt;
&lt;p&gt;Dann wählen wir oben links &amp;quot;Create&amp;quot; und erstellen eine neue Web App.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild2.png&quot; alt=&quot;Create Webapp&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nun gelangen wir auf den Erstellungsformular einer neuen Webapp. Hier müssen wir zunächst eine ResourceGroup anlegen. Das ist eine Art Ordner, der verschiedene inhaltlich zusammengehörende Azure Dienste bündelt. Ich wähle hier &amp;quot;HTMLFileHosting&amp;quot;. Der Name ist aber im Prinzip egal.
&lt;img src=&quot;https://www.365konten.de/Bild3.png&quot; alt=&quot;Resource Group&quot;&gt;&lt;/p&gt;
&lt;p&gt;Danach müssen wir die Programmiersprache auswählen, in der unsere App geschrieben ist. Im Moment haben wir zwar noch keine App, sondern nur ein paar HTML-Dateien, aber wir werden im Folgenden eine &amp;quot;nodejs&amp;quot; Applikation erstellen, mit der wir die HTML-Dateien hosten. Daher wählen wir &amp;quot;Node 22. LTS&amp;quot; aus. Die Region (Das Rechenzentrum), in dem wir die WebApp hosten wollen, setze ich auf &amp;quot;Germany West Central&amp;quot; (Das im Moment mir nächste Rechenzentrum)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild4.png&quot; alt=&quot;Hosting und Runtime&quot;&gt;&lt;/p&gt;
&lt;p&gt;Danach klicke ich unten auf den &amp;quot;Review &amp;amp; Create&amp;quot; Button und auf dem nächsten Screen auf den &amp;quot;Create&amp;quot; Button. Nun wird die Webapp erstellt. Ich warte nun, bis mir mitgeteilt wird, dass das Deployment beendet wurde. Danach klicke ich auf &amp;quot;Go to resource&amp;quot;, um auf den Konfigurationsbildschirm der Webapp zu kommen.
&lt;img src=&quot;https://www.365konten.de/Bild6.png&quot; alt=&quot;Deplyoment Complete&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Konfiguration und Sicherheit&lt;/h2&gt;
&lt;p&gt;Gut, nun haben wir eine leere Webapp erzeugt. Bei der Webapp müssen wir nun zwei Dinge einstellen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;einen einfachen Deployment Mechanismus&lt;/li&gt;
&lt;li&gt;Authentifizierung. Wir wollen, dass nur Mitarbeiter des Unternehmens diese Seite sehen dürfen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wir befinden uns nun erstmal auf der Haupt-Konfigurationsseite der Webapp.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild7.png&quot; alt=&quot;Konfigurationseite&quot;&gt;&lt;/p&gt;
&lt;p&gt;Auf der rechten Seite sehen wir die URL der App. Wir können sie im Browser öffnen und sehen einen Platzhalter-Text. Die URL sieht etwas kryptisch aus, aber dem Kunden war das erstmal egal. Wir können unsere eigene URL für diese App definieren, aber das tue ich nicht im Rahmen dieses Beitrags.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild8.png&quot; alt=&quot;App Url&quot;&gt;&lt;/p&gt;
&lt;p&gt;Wir beginnen mit der Konfiguration, indem wir links im Menu auf &amp;quot;Settings&amp;quot;-&amp;gt; &amp;quot;Configuration&amp;quot; klicken
&lt;img src=&quot;https://www.365konten.de/Bild9.png&quot; alt=&quot;Configuration Screen&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hier müssen wir zwei Schalter auf &amp;quot;On&amp;quot; setzten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;SCM Basic Auth Publishing enabled&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;FTP Basic Auth Publishing enabled&amp;quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mit diesen beiden Schaltern aktiviere wir später auf dem &amp;quot;Deployment&amp;quot; Bildschirm die Möglichkeit, dass wir per Git und unserem eigenen Passwort deployen können.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild10.png&quot; alt=&quot;Plattform Settings&quot;&gt;&lt;/p&gt;
&lt;p&gt;Zunächst sichern wir die App aber erstmal ab. Dazu wechseln wir auf den &amp;quot;Authentication&amp;quot; Bildschirm.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild11.png&quot; alt=&quot;Authentication&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hier ist noch kein Identity Provider installiert. Das bedeutet, dass die App für jeden aus dem Internet zugreifbar ist. Das ändern wir, indem wir auf &amp;quot;Add Identity Provider&amp;quot; klicken
&lt;img src=&quot;https://www.365konten.de/Bild12.png&quot; alt=&quot;Add Identity Provider&quot;&gt;&lt;/p&gt;
&lt;p&gt;Wir wählen den Provider &amp;quot;Microsoft&amp;quot; aus und lassen alle anderen Einstellungen so, wie sie sind. Der Effekt ist nun, dass nur noch Benutzer auf die Seite zugreifen können, die im Microsoft Entra des Unternehmens aufgelistet sind. Damit ist schonmal eine der Anforderungen erfüllt.
&lt;img src=&quot;https://www.365konten.de/Bild13.png&quot; alt=&quot;App Registration&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Deployment Einstellungen&lt;/h2&gt;
&lt;p&gt;Nun müssen wir die App noch einfach deployen können. Dazu wechseln wir ins &amp;quot;Deployment Center&amp;quot;.
&lt;img src=&quot;https://www.365konten.de/Bild14.png&quot; alt=&quot;Deployment Center&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hier können wir uns als Quelle für das Deployment verschiedene Versionsverwaltungssysteme auswählen. Danach könnten wir definieren, dass die App automatisch neu deployt werden soll, sobald sich in dem Versionsverwaltungssystem etwas ändern.&lt;/p&gt;
&lt;p&gt;In diesem Szenario hat der Kunde aber keines, sondern nur automatisch erzeugte HTML-Dateien. Daher wählen wir hier zur Einfachheit die Variante &amp;quot;Local Git&amp;quot;. Damit wird uns in der WebApp ein Git Zugang bereitgestellt. Wenn wir dorthin Dateien per Git pushen, dann werden diese automatisch in die Webapp deployt. Wunderbar, das lässt sich einfach lokal skripten. Dazu aber später mehr.&lt;/p&gt;
&lt;p&gt;Zunächst wählen wir hier &amp;quot;Local Git&amp;quot; und klicken auf &amp;quot;Save&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild15.png&quot; alt=&quot;Local Git Url&quot;&gt;&lt;/p&gt;
&lt;p&gt;Danach ändert sich der Bildschirm und wir können uns die &amp;quot;Git Clone URL&amp;quot; kopieren. Das ist die Adresse, an die wir später per Git unsere Webseite pushen können&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild16.png&quot; alt=&quot;Git push Url&quot;&gt;&lt;/p&gt;
&lt;p&gt;Dazu brauchen wir aber Benutzername und Passwort. Die können wir uns unter dem Reiter &amp;quot;Local Git/FTPS Credentials&amp;quot; im Bereich &amp;quot;User Scope&amp;quot; selber setzen&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild17.png&quot; alt=&quot;Local Git/FTPS Credentials&quot;&gt;
&lt;img src=&quot;https://www.365konten.de/Bild18.png&quot; alt=&quot;User Scope&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Eine nodejs App als Webserver&lt;/h2&gt;
&lt;p&gt;Nun müssen wir in einem lokalen Verzeichnis unsere Webapplikation erstellen. Das klingt schlimmer als es ist - sie besteht nur aus zwei Textdateien und einem Ordner. &lt;/p&gt;
&lt;p&gt;Legen wir zunächst den leeren Ordner &amp;quot;public&amp;quot; an. In diesem Ordnet legen wir dann später die HTML-Dateien ab, die wir später hosten wollen.&lt;/p&gt;
&lt;p&gt;Dann legen wir eine leere Datei namens &amp;quot;package.json&amp;quot; and und fügen diesen Inhalt ein:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;	  
{
  &amp;quot;scripts&amp;quot;: {
    &amp;quot;start&amp;quot;: &amp;quot;node server.js&amp;quot;
  },
  &amp;quot;dependencies&amp;quot;: {
    &amp;quot;express&amp;quot;: &amp;quot;^5.1.0&amp;quot;
  }
}

	
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das ist die Haupt-Projektdatei unseres Webservers. Sie enthält eigentlich nur zwei Einträge: Die Definition, wie der Server zu starten ist und die Information, dass der Server die Bibliothek &amp;quot;Express&amp;quot; braucht. Das reicht der Webapp erstmal.&lt;/p&gt;
&lt;p&gt;Nun legen wir eine weitere Textdatei namens &amp;quot;server.js&amp;quot; an.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;	  
const express = require(&amp;#39;express&amp;#39;)
const app = express()
const port = process.env.PORT


app.use(express.static(&amp;#39;public&amp;#39;))

app.listen(port, () =&amp;gt; {
  console.log(`App Listening ${port}`)
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die paar Zeilen Code definieren einen Webserver, der alle Dateien aus dem Verzeichnis &amp;quot;public&amp;quot; hosted.
Fügt nun noch die HTML und CSS Dateien in das public Verzeichnis ein und dann war es das mit der Erstellung des Servers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild19.png&quot; alt=&quot;lokaler Server&quot;&gt;&lt;/p&gt;
&lt;p&gt;Jetzt müssen wir dieses Verzeichnis nur noch automatisch per Skript in unsre Webapp deployen.&lt;/p&gt;
&lt;h2&gt;Deployment per Git&lt;/h2&gt;
&lt;p&gt;Das machen wir, wie oben schon angedeutet, über das Git-Tool. Das ist eigentlich ein Tool zur Versionskontrolle von Quellcode, es lässt sich aber auch anderes anwenden. Zunächst müssen wir das Tool installieren, falls es noch nicht geschehen ist.&lt;/p&gt;
&lt;p&gt;Ladet euch dazu den Installer von &lt;a href=&quot;https://git-scm.com/downloads&quot;&gt;dieser Webseite&lt;/a&gt; herunter und führt ihn aus.&lt;/p&gt;
&lt;p&gt;Öffnet danach eine Windows Kommandozeile oder Powershell und navigiert in das Verzeichnis, was wir eben erstellt haben. Ich klicke eigentlich immer mit der rechten Maustaste irgendwo in das Verzeichnis und wähle &amp;quot;In Terminal öffnen&amp;quot;, aber das könnt ihr machen, wie ihr wollt.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild20.png&quot; alt=&quot;Im Terminal öffnen&quot;&gt;&lt;/p&gt;
&lt;p&gt;Wichtig ist nur, dass ihr für die nächsten Schritte in dem Verzeichnis seid, das wir vorhin angelegt haben.&lt;/p&gt;
&lt;p&gt;Führt nun nacheinander die folgenden Kommandos aus:&lt;/p&gt;
&lt;p&gt;Zunächst initialisieren wir ein leere Git-Repository in dem Ordner&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;	  git init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dann fügen wir alle Dateien in dem Ordner zum Repository hinzu und checken sie mit dem Kommentar &amp;quot;Initiales Einchecken&amp;quot; ein&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    git add *
    git commit -m &amp;quot;Initiales Einchecken&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt definieren wir ein neues Remote-Repository namens &amp;quot;azure&amp;quot; mit der Git-URL, die wir in einem der Schritte oben definiert haben.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    git remote add azure &amp;lt;GITURL&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Also zum Beispiel in meinem Fall. Kopiert das aber nicht, benutzt in jedem Fall eure eigene URL.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    git remote add azure https://htmlfilehosting-b8hcakgbeffggsad.scm.germanywestcentral-01.azurewebsites.net:443/HTMLFileHosting.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wunderbar. Nun führen wir als letztes den folgenden Befehl aus&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    git push azure main:master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Damit weisen wir Git an, unser lokales Repository an das Deployment Repository im Azure zu verschicken. Anders ausgedrückt: Wir weisen Git an, das Deployment zu starten.&lt;/p&gt;
&lt;p&gt;Ihr werdet nun noch auf die eine oder andere Art nach einem Benutzernamen und Passwort gefragt werden. Gebt hier die Credentials ein, die wir oben als User Credentials vergeben haben. Git speichert die Daten für zukünftige Deployments.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild21.png&quot; alt=&quot;Username und Password&quot;&gt;&lt;/p&gt;
&lt;p&gt;Die Webseite deployt nun und ist nach ein paar Sekunden unter der App URL verfügbar.&lt;/p&gt;
&lt;p&gt;Beim ersten Login müsst ihr wahrscheinlich noch einmal der Berechtigungsanfrage von Microsoft Entra zustimmen, aber danach läuft die App per Password abgesichert. &lt;/p&gt;
&lt;p&gt;Wir sind nun mit dem initialen Deployment fertig.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Bild22.png&quot; alt=&quot;App Permissions requested&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Und nun?&lt;/h2&gt;
&lt;p&gt;Super, jetzt ist die Seite deployt und per Entra Authentifizierung abgesichert. Vielleicht denkt ihr nun, dass das alles ein wenig kompliziert war und dass ihr das noch bei jeder Änderung der HTML-Dateien wiederholen wollt.&lt;/p&gt;
&lt;p&gt;Das braucht ihr aber auch glücklicherweise nicht.&lt;/p&gt;
&lt;p&gt;Falls sich in Zukunft etwas an den HTML-Dateien ändert, dann braucht ihr nur in dem Verzeichnis diese drei folgenden Befehle ausführen&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    git add *
    git commit -m &amp;quot;Neue Version der Dateien&amp;quot;
    git push azure main:master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Git wird dann alle geänderten Dateien einchecken und deployen. Wenn ihr diese drei Befehle nun in z.B. in den Windows Scheduler einträgt und sie jeden Tag ausgeführt werden, dann werden immer alle im Laufe des Tages erzeugten Dateien im Verzeichnis &amp;quot;public&amp;quot; deployt. 
Sollte es keine Änderungen gegeben haben, führen die drei Kommandos ansonsten auch kein weiteres Deployment durch.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Tue, 12 Aug 2025 00:00:00 GMT</pubDate></item><item><title>MCP, Agenten und LLMS: Science Fiction oder Realität? </title><link>https://www.365konten.de/blog/2025-06-03/</link><guid isPermaLink="true">https://www.365konten.de/blog/2025-06-03/</guid><description>Der Film &quot;Tron&quot; und moderne Künstliche Intelligenz</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2025-06-03/&quot;&gt;https://www.365konten.de/blog/2025-06-03/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;Tron&lt;/h2&gt;
&lt;p&gt;Im Film „Tron“ aus dem Jahr 1982 wird der von Jeff Bridges gespielte Kevin Flynn in eine digitale Computerwelt transportiert. Dort kämpft er gemeinsam mit dem Programm Tron (gespielt von Bruce Boxleitner) gegen den menschlichen Gegenspieler Ed Dillinger (David Warner) und das sogenannte MCP – das Master Control Program. Ursprünglich als KI-Schachprogramm entwickelt, hat sich das MCP im Laufe der Zeit immer mehr Rechte angeeignet und herrscht schließlich als düstere Kontrollinstanz über die gesamte digitale Welt.  &lt;/p&gt;
&lt;p&gt;Danach wurde es mehr als vierzig Jahre lang recht still bezüglich der Kombination der Begriffe Künstliche Intelligenz (KI), Programme und MCP.  Das hat sich aber in den letzten Monaten mit der Verbreitung generativer KI (Copilot, ChatGPT und Co.) geändert.  &lt;/p&gt;
&lt;p&gt;Aber keine Angst: Die Möglichkeiten von heute lassen nicht befürchten, dass eine KI seine Reichweite vergrößern will und andere Programme übernimmt... Obwohl, wenn ich so darüber nachdenke... irgendwie schon, aber anders. &lt;/p&gt;
&lt;p&gt;Damit ihr die im Moment im Internet herumgeisternden Begriffe Large Language Models (LLM), Agenten und MCP einordnen könnt, werde ich euch erst einmal erzählen, worum es dabei geht. &lt;/p&gt;
&lt;h2&gt;Large Language Models: Die Basis für moderne Chatbots&lt;/h2&gt;
&lt;p&gt;Beginnen wir mit den sogenannten Large Language Models (LLM), großen Sprachmodellen, wie sie in ChatGPT oder Microsoft Copilot zum Einsatz kommen. Diese Technologie ist ein zentraler Bestandteil der KI-Revolution, die vor etwa drei Jahren richtig Fahrt aufgenommen hat. &lt;/p&gt;
&lt;p&gt;Dank dieser Modelle können wir in natürlicher Sprache mit einem Chatbot kommunizieren, der uns versteht und auf ein enormes Wissensreservoir zugreifen kann. Technisch basieren LLMs auf komplexen statistischen Verfahren, die Eingaben (Prompts) analysieren und daraus die wahrscheinlich passendste Antwort generieren: als Text, als Bild oder sogar als Video. &lt;/p&gt;
&lt;p&gt;Warum sind die Chatbots so beliebt? Das ist einfach zu erklären. Mit so einer generativen KI kann ich mit natürlicher Sprache kommunizieren und bekomme Antworten mit auf den ersten Blick sehr vernünftigen Texten. &lt;/p&gt;
&lt;p&gt;Aus Sicht vieler Menschen trifft diese Technologie daher genau den Sweetspot zwischen &amp;quot;gefühlter Einfachheit&amp;quot; und &amp;quot;gefühlter Nützlichkeit”. Das ist ein Effekt, den im Verlauf der Menschheit nur wenige Technologien erzielt haben. &lt;/p&gt;
&lt;h2&gt;Agenten automatisieren Aufgaben&lt;/h2&gt;
&lt;p&gt;Die Leistung von Chatbots ist schon beeindruckend. Aber im Arbeitsalltag möchten wir nicht immer mit einem neuen Prompt bei Null anfangen. Hilfreicher ist es, wenn die KI direkt mit unternehmensspezifischen Daten arbeiten und bestimmte Aufgaben automatisch übernehmen kann. &lt;/p&gt;
&lt;p&gt;Hier kommen sogenannte Agenten ins Spiel (bei ChatGPT heißen sie Custom GPTs, bei anderen Herstellern können sie auch andere Namen haben). Diese lassen sich mit speziellem Wissen und klaren Anweisungen ausstatten, um definierte Aufgaben zu erfüllen. &lt;/p&gt;
&lt;p&gt;Ein Beispiel: Ein Chatbot für den Bereich Human Ressources (HR) kann so konfiguriert werden, dass er ausschließlich auf Informationen aus dem Intranet zugreift und nur Fragen zu Karriere und Bewerbung beantwortet. Sobald seine Informationen nicht mehr ausreichen, verweist er an eine zuständige Kollegin oder einen Kollegen. So entlastet er das HR-Team bei Routinefragen.  &lt;/p&gt;
&lt;h2&gt;Autonome Agenten arbeiten automatisch&lt;/h2&gt;
&lt;p&gt;Bis hierhin läuft die Interaktion noch über einen klassischen Chat: Die Benutzer:innen stellen Fragen – der Agent antwortet. Doch was, wenn die KI von sich aus aktiv wird? &lt;/p&gt;
&lt;p&gt;Genau das leisten autonome Agenten: Sie reagieren auf Auslöser und führen anschließend eigenständig Aktionen aus. &lt;/p&gt;
&lt;p&gt;Ein autonomer Agent erkennt beispielsweise automatisch eingehende Rechnungen in E-Mails, extrahiert Kundennamen, Rechnungsnummer und Betrag und leitet die Nachricht je nach Kunde an den:die zuständige Sachbearbeiter:in weiter.  &lt;/p&gt;
&lt;p&gt;Ein anderer Agent erstellt uns jeden Morgen automatisch eine Zusammenfassung der wichtigsten E-Mails vom Vortag und schickt sie uns. Mit ein wenig Kreativität sind hier die Möglichkeiten riesig. &lt;/p&gt;
&lt;h2&gt;Model Context Protocol: Werkzeuge in der Hand der KI&lt;/h2&gt;
&lt;p&gt;Das Model Context Protocol (MCP) ermöglicht Agenten die Ausführung noch komplexerer Aufgaben: Es handelt sich um eine standardisierte und herstellerunabhängige Schnittstelle, mit der Agenten eigenständig Informationen aus anderen Systemen abrufen oder dort Aktionen ausführen können. &lt;/p&gt;
&lt;p&gt;Ein Beispiel: Ein Agent greift über MCP auf ein SAP-System zu, liest bestimmte Daten aus, analysiert diese aufgrund seines Prompts und führt für jeden Datensatz eine definierte Transaktion im SAP aus. Es arbeitet also genauso wie ein Softwareprogramm, nur dass dieses in natürlicher Sprache formuliert ist. &lt;/p&gt;
&lt;p&gt;Solche Integrationen sind keine Zukunftsmusik: SAP integriert MCP bereits aktiv in seine Produkte. &lt;/p&gt;
&lt;p&gt;Zum Beispiel auch die 3D-Software Blender bietet eine MCP-Schnittstelle. Damit können Anwender:innen per Chat ihre lokale Blender-Instanz steuern: zur Vereinfachung, wenn sie nicht alle Blender Befehle und Shortcuts kennen, oder zur Effektivitätssteigerung, wenn sie dem Programm direkte fachliche Anweisungen geben wollen (z.B. „Vergrößere die Ohren bei dem 3D-Modell eines Hasen, das ich gerade bearbeite.“). &lt;/p&gt;
&lt;p&gt;Immer mehr Hersteller entwickeln solche Schnittstellen – nicht nur für große Cloud-Anwendungen, sondern auch für lokale Programme. So können Agenten künftig mit nahezu jeder Software interagieren und Aufgaben für uns übernehmen. &lt;/p&gt;
&lt;h2&gt;Die nahe Zukunft: Agenten vs. Werbetreibende&lt;/h2&gt;
&lt;p&gt;Das alles muss man erst einmal sacken lassen, denn die Auswirkungen sind enorm. Wir können Prozesse in natürlicher Sprache definieren, automatisieren und Software fernsteuern. Richtig eingesetzt, können Agenten unsere Arbeit deutlich effizienter machen. &lt;/p&gt;
&lt;p&gt;Und es geht noch weiter: Stellen wir uns einmal vor, ich sage einem Einkaufsagenten, dass ich neue T-Shirts brauche. Der Agent sucht selbstständig passende Angebote im Web, legt sie in den Warenkorb und fordert mich nur noch auf, den Kauf abzuschließen. &lt;/p&gt;
&lt;p&gt;Zukunftsmusik? Keineswegs. Ich habe solche Prototypen Ende Mai live auf dem European Collaboration Summit gesehen. &lt;/p&gt;
&lt;p&gt;Autonome Agenten wie der T-Shirt-Einkäufer haben nun aber auch weitreichende Folgen: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ich war als Nutzer selbst nicht mehr auf der Webseite eines Unternehmens. Das bedeutet: Ich habe dort keine Werbung gesehen. &lt;/li&gt;
&lt;li&gt;Ich habe selbst nicht entschieden, wo gekauft wird. Das hat der Agent für mich übernommen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Webseitenbetreiber müssen sich darum fragen, wie sie mit dieser Entwicklung umgehen: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wenn ich auf meiner Seite Werbung schalten und die Agenten blockieren würde, damit Nutzer:innen die Anzeige sehen, verlöre ich potenzielle Kunden. Sie würden von ihrem Agenten schlicht nie mehr auf meine Seite geschickt. So platziere ich mich quasi selbst auf die zweite Seite der Suchergebnisse bei Google. &lt;/li&gt;
&lt;li&gt;Wenn meine Seite zwar hübsch aussieht, aber für Agenten schwer lesbar ist, dann werden diese meine Services nicht an ihre Benutzer weiterleiten. Als Webseitenbetreiber muss ich mir daher Gedanken über eine barrierefreie Gestaltung meiner Seite machen (die übrigens jetzt schon für viele digitale Produkte und Services gesetzlich vorgeschrieben ist).Diese fördert u.a. mit strukturierten Daten die Lesbarkeit der Seite. &lt;/li&gt;
&lt;li&gt;Als Konsequenz wird auch SEO an Bedeutung verlieren. Es wird stattdessen wichtiger, die Inhalte und Daten meiner Website so zu optimieren, dass sowohl Menschen als auch KI-Agenten sie leicht verstehen. So lenke ich mehr Agenten auf meine Seite und damit mehr Benutzer auf meine Webseite.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Der letzte Akt unserer Geschichte&lt;/h2&gt;
&lt;p&gt;Dies ist nur der Anfang und nur ein Bereich, in dem Agenten in den nächsten Monaten und Jahre gewaltige Auswirkungen haben werden. Sie werden immer mehr Fähigkeiten gewinnen und uns in noch nicht bekanntem Maß Aufgaben abnehmen können. &lt;/p&gt;
&lt;p&gt;Es ist jedoch eher unwahrscheinlich, dass ein Szenario wie das in &amp;quot;Tron&amp;quot; wahr wird, in dem ein Schachprogramm sich selbstständig alle anderen Programme untertan macht und danach als &amp;quot;Master Control Program&amp;quot; die digitale Welt beherrscht. &lt;/p&gt;
&lt;p&gt;So etwas wie das Programm Tron hingegen halte ich für sehr realistisch. Im Film wurden ihm nämlich von seinem Programmierer die Fähigkeiten und der Auftrag übergeben, die Macht des MCP zu brechen und Ordnung in der digitalen Welt wiederherzustellen. Tron ist ein gutes Beispiel für einen Agenten, der in der Lage ist, den ihm erteilten Auftrag eigenständig und mithilfe der ihm zur Verfügung gestellten Werkzeuge auszuführen.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Tue, 03 Jun 2025 00:00:00 GMT</pubDate></item><item><title>Die Homepage einer SharePoint Site per PowerAutomate setzten</title><link>https://www.365konten.de/blog/2025-04-01/setsphomepage/</link><guid isPermaLink="true">https://www.365konten.de/blog/2025-04-01/setsphomepage/</guid><description>Die Homepage einer SharePoint Site per PowerAutomate setzten</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2025-04-01/setsphomepage/&quot;&gt;https://www.365konten.de/blog/2025-04-01/setsphomepage/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import SPRestAPI from &amp;quot;../../../components/RestComponents/SPRestAPI.jsx&amp;quot;&lt;/p&gt;
&lt;p&gt;Ihr könnt in der &amp;quot;WebsiteSeiten&amp;quot; Bibliothek eine beliebige Datei markieren und diese dann über das Menu als Homepage/Startseite der aktuellen SharePoint Site setzen.&lt;/p&gt;
&lt;p&gt;Was ihr über die Oberfläche aber zum Beispiel nicht machen könnt, ist eine Ansicht einer Liste als Homepage zu definieren. Das gilt auch für diverse andere Systemseiten.&lt;/p&gt;
&lt;p&gt;Wenn ihr das trotzdem machen wollt oder einfach nur die Homepage automatisch per PowerAutomate Flow setzen wollt, dann könnt ihr das mittels der SharePoint REST API und der Aktion “HTTP Anforderung an SharePoint senden” erreichen.&lt;/p&gt;
&lt;h2&gt;Die Aktionen&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;SPRestAPI client:load
    site=&amp;quot;#siteUrl#&amp;quot;
    url=&amp;quot;_api/web/RootFolder&amp;quot;
    method=&amp;quot;POST&amp;quot;
    headers={{
      &amp;quot;Accept&amp;quot;:&amp;quot;application/json&amp;quot;,
      &amp;quot;Content-Type&amp;quot;:&amp;quot;application/json&amp;quot;,
      &amp;quot;X-HTTP-Method&amp;quot;:&amp;quot;MERGE&amp;quot;
    }}
    params={[
      {name: &amp;quot;Site Collection URL&amp;quot;, key: &amp;quot;siteUrl&amp;quot;, type: &amp;quot;text&amp;quot; ,&amp;quot;description&amp;quot;:&amp;quot;Die Adresse der SharePoint Site, auf der wir die Aktion ausführen wollen&amp;quot;,default:&amp;quot;https://contoso.sharepoint.com/sites/mysite&amp;quot;},
      {name: &amp;quot;relative HomePage URL &amp;quot;, key: &amp;quot;hpURL&amp;quot;, type: &amp;quot;text&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Die Relative Url zu der Seite, die die Homepage werden soll.&amp;quot; ,default:&amp;quot;SitePages/Department-Homepage.aspx&amp;quot;}          
    ]}

    body=&amp;#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;  {&amp;quot;__metadata&amp;quot;: {
    &amp;quot;type&amp;quot;: &amp;quot;SP.Folder&amp;quot;
  },
  &amp;quot;WelcomePage&amp;quot;: &amp;quot;#hpURL#&amp;quot;
}
&amp;#39;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;gt;&amp;lt;/SPRestAPI&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Tue, 01 Apr 2025 00:00:00 GMT</pubDate></item><item><title>Auswahlmöglichkeiten einer SharePoint &quot;Auswahl&quot; Spalte per PowerAutomate setzten</title><link>https://www.365konten.de/blog/2025-03-25/</link><guid isPermaLink="true">https://www.365konten.de/blog/2025-03-25/</guid><description>Auswahlmöglichkeiten einer SharePoint &quot;Auswahl&quot; Spalte per PowerAutomate setzten.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2025-03-25/&quot;&gt;https://www.365konten.de/blog/2025-03-25/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import SPRestAPI from &amp;quot;../../../components/RestComponents/SPRestAPI.jsx&amp;quot;&lt;/p&gt;
&lt;p&gt;Ihr könnt in einer SharePoint Liste eine Spalte vom Typ &amp;quot;Auswahl&amp;quot; definieren. Das ist praktisch, dass ihr damit euren Benutzern die Auswahlmöglichkeiten in der Spalte vorgeben könnt.&lt;/p&gt;
&lt;p&gt;Leider gibt es im PowerAutomate aber keine Standard-Aktion, um die möglichen Auswahlwerte per Flow zu setzen. Das ist aber kein Problem, da wir hierfür die SharePoint REST API und die Aktion &amp;quot;HTTP Anforderung an SharePoint senden&amp;quot; verwenden können.&lt;/p&gt;
&lt;h2&gt;Die Aktionen&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;SPRestAPI client:load
    site=&amp;quot;#siteUrl#&amp;quot;
    url=&amp;quot;_api/web/lists/getbytitle(&amp;#39;#listtitle#&amp;#39;)/fields/getbytitle(&amp;#39;#columntitle#&amp;#39;)&amp;quot;
    method=&amp;quot;POST&amp;quot;
    headers={{
      &amp;quot;Accept&amp;quot;:&amp;quot;application/json&amp;quot;,
      &amp;quot;Content-Type&amp;quot;:&amp;quot;application/json&amp;quot;
    }}
    params={[
      {name: &amp;quot;Site Collection URL&amp;quot;, key: &amp;quot;siteUrl&amp;quot;, type: &amp;quot;text&amp;quot; ,&amp;quot;description&amp;quot;:&amp;quot;Die Adresse der SharePoint Site, auf der wir die Aktion ausführen wollen&amp;quot;,default:&amp;quot;https://contoso.sharepoint.com/sites/mysite&amp;quot;},
      {name: &amp;quot;List Title&amp;quot;, key: &amp;quot;listtitle&amp;quot;, type: &amp;quot;text&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Der Titel der Liste, in dem die zu ändernde Spalte enthalten ist (Displayname)&amp;quot; ,default:&amp;quot;&amp;lt;listTitle&amp;gt;&amp;quot;},
      {name: &amp;quot;Column Title&amp;quot;, key: &amp;quot;columntitle&amp;quot;, type: &amp;quot;text&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Der Name der zu ändernden Spalte (Displayname)&amp;quot; ,default:&amp;quot;&amp;lt;columnTitle&amp;gt;&amp;quot;}          
    ]}

    body=&amp;#39;{&amp;quot;Choices&amp;quot;:[&amp;quot;Choice 1&amp;quot;,&amp;quot;Choice 2&amp;quot;,&amp;quot;Choice 3&amp;quot;],&amp;quot;DefaultValue&amp;quot;:&amp;quot;Choice 1&amp;quot;}&amp;#39;

  &amp;gt;&amp;lt;/SPRestAPI&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Tue, 25 Mar 2025 00:00:00 GMT</pubDate></item><item><title>Eine SiteCollection per PowerAutomate erstellen</title><link>https://www.365konten.de/blog/2025-03-17/</link><guid isPermaLink="true">https://www.365konten.de/blog/2025-03-17/</guid><description>Eine SiteCollection per PowerAutomate erstellen.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2025-03-17/&quot;&gt;https://www.365konten.de/blog/2025-03-17/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import SPRestAPI from &amp;quot;../../../components/RestComponents/SPRestAPI.jsx&amp;quot;
import ParseJsonAction from &amp;quot;../../../components/RestComponents/ParseJsonAction.jsx&amp;quot;&lt;/p&gt;
&lt;p&gt;Manchmal wollt ihr vielleicht eine SharePoint Site automatisch per PowerAutomate erstellen.&lt;/p&gt;
&lt;p&gt;Das geht im Standard nicht, wir können das aber mittelt der &amp;quot;HTTP Anforderung an SharePoint senden&amp;quot; Aktion und der SharePoint REST API erreichen.&lt;/p&gt;
&lt;p&gt;Das Setup ist hier aber ein wenig komplizierter: Statt einfach die Aktion zu benutzen, müssen wir hier sicherstellen, dass der ausführende User auch die Rechte hat, um eine Site zu erstellen.
Bei vielen Tenants ist das nur durch einen SharePoint Administrator möglich. In dem Fall müsst ihr eine Connection an der Aktion einstellen, die die entsprechenden Rechet hat.&lt;/p&gt;
&lt;h2&gt;Die Aktionen&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;SPRestAPI client:load
    site=&amp;quot;#adminsiteUrl#&amp;quot;
    url=&amp;quot;_api/SPSiteManager/create&amp;quot;
    method=&amp;quot;POST&amp;quot;
    headers={{
      &amp;quot;Accept&amp;quot;:&amp;quot;application/json&amp;quot;,
      &amp;quot;Content-Type&amp;quot;:&amp;quot;application/json&amp;quot;
    }}
    params={[
      {name: &amp;quot;Admin Site Collection URL&amp;quot;, key: &amp;quot;adminsiteUrl&amp;quot;, type: &amp;quot;text&amp;quot; ,&amp;quot;description&amp;quot;:&amp;quot;Die Adresse der SharePoint Site, auf der wir die Aktion ausführen wollen&amp;quot;,default:&amp;quot;https://contoso-admin.sharepoint.com&amp;quot;},
      {name: &amp;quot;Site Title&amp;quot;, key: &amp;quot;siteTitle&amp;quot;, type: &amp;quot;text&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Der Titel/Displayname der zu erstellenden Seite.&amp;quot; ,default:&amp;quot;MeineSeite&amp;quot;},
      {name: &amp;quot;Description&amp;quot;, key: &amp;quot;description&amp;quot;, type: &amp;quot;text&amp;quot; ,&amp;quot;description&amp;quot;:&amp;quot;Die Beschreibung der zu erstellenden Seite&amp;quot;,default:&amp;quot;Das ist meine neue Seite&amp;quot;},
      {name: &amp;quot;Site Collection URL&amp;quot;, key: &amp;quot;siteUrl&amp;quot;, type: &amp;quot;text&amp;quot; ,&amp;quot;description&amp;quot;:&amp;quot;Die Adresse der zu estellenden Seite&amp;quot;,default:&amp;quot;https://contoso.sharepoint.com/sites/mysite&amp;quot;},
      {name: &amp;quot;Owner&amp;quot;, key: &amp;quot;owner&amp;quot;, type: &amp;quot;text&amp;quot; ,&amp;quot;description&amp;quot;:&amp;quot;Der Besitzer der Seite als Emailadresse.&amp;quot;,default:&amp;quot;vorname.nachname@contoso.com&amp;quot;},
      {name: &amp;quot;Sprache der Seite&amp;quot;, key: &amp;quot;lcid&amp;quot;, type: &amp;quot;choice&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Die Sprache der Seite (1031 für Deutsch, 1033 für English)&amp;quot; ,default:&amp;quot;1031&amp;quot;, &amp;quot;choices&amp;quot;:[
        {&amp;quot;value&amp;quot;:&amp;quot;Deutsch (1031)&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;1031&amp;quot;},
        {&amp;quot;value&amp;quot;:&amp;quot;Niederländisch (1043)&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;1043&amp;quot;},
        {&amp;quot;value&amp;quot;:&amp;quot;Englisch (1033)&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;1033&amp;quot;},
        {&amp;quot;value&amp;quot;:&amp;quot;Französisch (1036)&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;1036&amp;quot;}
        ]},          
      {name: &amp;quot;WebTemplate&amp;quot;, key: &amp;quot;template&amp;quot;, type: &amp;quot;choice&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Das Template der Seite (Team Site/Communication Site)&amp;quot; ,default:&amp;quot;SITEPAGEPUBLISHING#0&amp;quot;, &amp;quot;choices&amp;quot;:[
        {&amp;quot;value&amp;quot;:&amp;quot;Communication Site&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;SITEPAGEPUBLISHING#0&amp;quot;},
        {&amp;quot;value&amp;quot;:&amp;quot;Team Site ohne M365 Gruppe&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;STS#3&amp;quot;},
        {&amp;quot;value&amp;quot;:&amp;quot;Team Site&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;TeamSite&amp;quot;}
        ]},
    ]}

    body=&amp;#39;{
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;quot;request&amp;quot;: {
&amp;quot;Title&amp;quot;: &amp;quot;#siteTitle#&amp;quot;,
&amp;quot;Url&amp;quot;: &amp;quot;#siteUrl#&amp;quot;,
&amp;quot;Description&amp;quot;: &amp;quot;#description#&amp;quot;,
&amp;quot;Owner&amp;quot;: &amp;quot;#owner#&amp;quot;,
&amp;quot;Lcid&amp;quot;: #lcid#,
&amp;quot;WebTemplate&amp;quot;: &amp;quot;#template#&amp;quot;,
&amp;quot;SiteDesignId&amp;quot;: &amp;quot;f6cc5403-0d63-442e-96c0-285923709ffc&amp;quot;,
&amp;quot;ShareByEmailEnabled&amp;quot;: false
}
}&amp;#39;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  &amp;gt;&amp;lt;/SPRestAPI&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
Die Ausgabe der Aktion muss dann noch mittels einer &amp;quot;Parse JSON&amp;quot; (&amp;quot;JSON analysieren&amp;quot;) Aktion umgewandet werden. Daraus erhalten wir dann die Properties &amp;quot;SiteId&amp;quot; und &amp;quot;SiteUrl&amp;quot;, die wir dann im folgenden weiter benutzen können
&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;ParseJsonAction client:load 
 schema=&apos;{
    &quot;type&quot;: &quot;object&quot;,
    &quot;properties&quot;: {
        &quot;d&quot;: {
            &quot;type&quot;: &quot;object&quot;,
            &quot;properties&quot;: {
                &quot;Create&quot;: {
                    &quot;type&quot;: &quot;object&quot;,
                    &quot;properties&quot;: {
                        &quot;SiteId&quot;: {
                            &quot;type&quot;: &quot;string&quot;
                        },                      
                        &quot;SiteUrl&quot;: {
                            &quot;type&quot;: &quot;string&quot;
                        }
                    }
                }
            }
        }
    }
}
&apos;&gt;
&lt;/ParseJsonAction&gt;&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate></item><item><title>Per PowerAutomate einen Benutzer einer SharePoint Gruppe hinzufügen</title><link>https://www.365konten.de/blog/2025-02-22/</link><guid isPermaLink="true">https://www.365konten.de/blog/2025-02-22/</guid><description>Auswahlmöglichkeiten einer SharePoint &quot;Auswahl&quot; Spalte per PowerAutomate setzten.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2025-02-22/&quot;&gt;https://www.365konten.de/blog/2025-02-22/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import SPRestAPI from &amp;quot;../../../components/RestComponents/SPRestAPI.jsx&amp;quot;&lt;/p&gt;
&lt;p&gt;In Powerautomate findet ihr zwar Aktionen, mit denen ihr M365 Gruppen bearbeiten könnt und mit denen ihr einzelne Freigabelinks für Dateien erstellen könnt, aber ihr findet nicht, womit man Mitglieder zu einer SharePoint Gruppe hinzufügen kann.&lt;/p&gt;
&lt;p&gt;Das ist aber kein Problem, da wir hierfür die SharePoint REST API und die Aktion &amp;quot;HTTP Anforderung an SharePoint senden&amp;quot; verwenden können.&lt;/p&gt;
&lt;h2&gt;Die Gruppen&lt;/h2&gt;
&lt;p&gt;Zunächst brauchen wir dafür aber die interne ID der Gruppe, in die wir den User einfügen wollen.
Für die drei Standard-Gruppen sind das die IDs&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3 für die Besitzergruppe, &lt;/li&gt;
&lt;li&gt;4 für die Besuchergruppe und&lt;/li&gt;
&lt;li&gt;5 für die Mitgliedergruppe&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Um die IDs einer anderen Gruppe zu bestimmen, schaut euch &lt;a href=&quot;https://link-url-here.org&quot;&gt;diesen Artikel&lt;/a&gt; an.&lt;/p&gt;
&lt;h2&gt;Die Aktionen&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;SPRestAPI client:load
    site=&amp;quot;#siteUrl#&amp;quot;
    url=&amp;quot;_api/web/sitegroups(#groupid#)/users&amp;quot;
    method=&amp;quot;POST&amp;quot;
    headers={{
      &amp;quot;Accept&amp;quot;:&amp;quot;application/json&amp;quot;,
      &amp;quot;Content-Type&amp;quot;:&amp;quot;application/json&amp;quot;
    }}
    params={[
      {name: &amp;quot;Site Collection URL&amp;quot;, key: &amp;quot;siteUrl&amp;quot;, type: &amp;quot;text&amp;quot; ,&amp;quot;description&amp;quot;:&amp;quot;Die Adresse der SharePoint Site, auf der wir die Aktion ausführen wollen&amp;quot;,default:&amp;quot;https://contoso.sharepoint.com/sites/mysite&amp;quot;},
      {name: &amp;quot;Gruppen ID der SharePoint Gruppe&amp;quot;, key: &amp;quot;groupid&amp;quot;, type: &amp;quot;text&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Die interne GruppenID der SharePoint Gruppe; in die der User eingefügt werden soll.&amp;quot; ,default:&amp;quot;&amp;lt;GruppenID&amp;gt;&amp;quot;},
      {name: &amp;quot;Email Adresse des Users&amp;quot;, key: &amp;quot;userMail&amp;quot;, type: &amp;quot;text&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Der Loginname des hinzuzufügenden Users (als Emailadresse)&amp;quot; ,default:&amp;quot;loginname@domain.com&amp;quot;}          
    ]}

    body=&amp;#39;{&amp;quot;__metadata&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;SP.User&amp;quot;},&amp;quot;LoginName&amp;quot;:&amp;quot;i:0#.f|membership|#userMail#&amp;quot;}&amp;#39;

  &amp;gt;&amp;lt;/SPRestAPI&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sat, 22 Feb 2025 00:00:00 GMT</pubDate></item><item><title>Die Berechtigungsvererbung für ein Listenelement per PowerAutomate aufheben</title><link>https://www.365konten.de/blog/2025-02-17/</link><guid isPermaLink="true">https://www.365konten.de/blog/2025-02-17/</guid><description>Die Berechtigungsvererbung für ein Listenelement per PowerAutomate aufheben</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2025-02-17/&quot;&gt;https://www.365konten.de/blog/2025-02-17/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import SPRestAPI from &amp;quot;../../../components/RestComponents/SPRestAPI.jsx&amp;quot;&lt;/p&gt;
&lt;p&gt;Normalerweise erben Listenelemente und Dateien im SharePoint ihre Berechtigungen vom übergeordneten Ordner oder der Bibliothek/Liste selbst.&lt;/p&gt;
&lt;p&gt;Wenn wir das ändern wollen und einem Element eigene Berechtigungen zuweisen wollen, dann müssen wir diese Berechtigungsvererbung zunächst unterbrechen. Erst danach können wir die Berechtigungen an dem Element wie in diesem &lt;a href=&quot;https://www&quot;&gt;Artikel&lt;/a&gt; beschreiben ändern&lt;/p&gt;
&lt;p&gt;Über die Oberfläche machen wir das, indem wir auf die drei Punkte neben dem Element klicken und dann &amp;quot;Zugriff verwalten&amp;quot; auswählen. Hier klicken wir nun wiederum ganz oben rechts auf die drei kleinen Punkte und wählen &amp;quot;Erweiterte Einstellungen&amp;quot;. Auf dem sich öffnenden Bildschirm wählen wir nun &amp;quot;Berechtigungsvererbung unterbrechen&amp;quot; aus der Ribbon.&lt;/p&gt;
&lt;p&gt;In Powerautomate gibt es daber dazu keine vorgefertigte Aktion und wir müssen sie dort und mittels der “HTTP Anforderung an SharePoint senden” Aktion und der SharePoint RestAPI selber erstellen.&lt;/p&gt;
&lt;h2&gt;Die Aktion&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;  &amp;lt;SPRestAPI client:load
    site=&amp;quot;#siteUrl#&amp;quot;
    url=&amp;quot;_api/lists/getByTitle(&amp;#39;#listtitle#&amp;#39;)/items(#itemid#)/breakroleinheritance(copyRoleAssignments=#copyRoleAssignments#, clearSubscopes=#clearSubscopes#)&amp;quot;
    method=&amp;quot;POST&amp;quot;
    headers={{
      &amp;quot;Accept&amp;quot;:&amp;quot;application/json&amp;quot;,
      &amp;quot;Content-Type&amp;quot;:&amp;quot;application/json&amp;quot;
    }}
    params={[
      {name: &amp;quot;Site Collection URL&amp;quot;, key: &amp;quot;siteUrl&amp;quot;, type: &amp;quot;text&amp;quot; ,&amp;quot;description&amp;quot;:&amp;quot;Die Adresse der SharePoint Site, auf der wir die Aktion ausführen wollen&amp;quot;,default:&amp;quot;https://contoso.sharepoint.com/sites/mysite&amp;quot;},
      {name: &amp;quot;List Title&amp;quot;, key: &amp;quot;listtitle&amp;quot;, type: &amp;quot;text&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Der Titel/Displayname der Liste mit dem Element&amp;quot; ,default:&amp;quot;&amp;lt;listname&amp;gt;&amp;quot;},          
      {name: &amp;quot;Item ID&amp;quot;, key: &amp;quot;itemid&amp;quot;, type: &amp;quot;text&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Die ID des Items, bei dem die Berechtigung unterbrochen werden soll&amp;quot; ,default:&amp;quot;&amp;lt;itemID&amp;gt;&amp;quot;},
       {name: &amp;quot;Bestehende Berechtigungen kopieren&amp;quot;, key: &amp;quot;copyRoleAssignments&amp;quot;, type: &amp;quot;choice&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Sollen die Berechtigungen des übergeordneten Elements an dieses Element kopiert werden oder sollen an diesem Element alle Berechtigungen gelöscht werden?&amp;quot; ,default:&amp;quot;false&amp;quot;, &amp;quot;choices&amp;quot;:[
        {&amp;quot;value&amp;quot;:&amp;quot;Keine Berechtigungen an dieses Element kopieren&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;false&amp;quot;},
        {&amp;quot;value&amp;quot;:&amp;quot;Berechtigungen des übergeordneten Elements an dieses Element kopieren&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;true&amp;quot;}
        ]},
        {name: &amp;quot;Subscopes löschen?&amp;quot;, key: &amp;quot;clearSubscopes&amp;quot;, type: &amp;quot;choice&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;Sollen auch die Berechtigungen von untergrordneten Elementen dieses Elements entfernt werden oder nicht?&amp;quot; ,default:&amp;quot;true&amp;quot;, &amp;quot;choices&amp;quot;:[
        {&amp;quot;value&amp;quot;:&amp;quot;Keine Berechtigungen an dieses Element kopieren&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;false&amp;quot;},
        {&amp;quot;value&amp;quot;:&amp;quot;Berechtigungen des übergeordneten Elements an dieses Element kopieren&amp;quot;,&amp;quot;key&amp;quot;:&amp;quot;true&amp;quot;}
        ]},                  
    ]}

    body=&amp;#39; &amp;#39;

  &amp;gt;&amp;lt;/SPRestAPI&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Fri, 07 Feb 2025 00:00:00 GMT</pubDate></item><item><title>Copilot und das RAG Pattern</title><link>https://www.365konten.de/blog/2024-11-22/</link><guid isPermaLink="true">https://www.365konten.de/blog/2024-11-22/</guid><description>Trainiert Microsoft mit meinen Daten ein Copilot-Modell?</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2024-11-22/&quot;&gt;https://www.365konten.de/blog/2024-11-22/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;In der heutigen digitalen Welt sind KI-gestützte Tools wie Microsoft Copilot unverzichtbar geworden, um die Produktivität zu steigern und komplexe Aufgaben zu vereinfachen. Doch mit der zunehmenden Nutzung solcher Technologien kommen auch Bedenken auf, insbesondere hinsichtlich des Datenschutzes und der Sicherheit. Ein häufig gestelltes Frage ist: &lt;strong&gt;Trainiert Microsoft ein KI-Modell mit meinen Daten?&lt;/strong&gt; In diesem Blogartikel werden wir diese Frage klären und das &lt;strong&gt;RAG Pattern&lt;/strong&gt; (Retrieval Augmented Generation) erläutern, das von Copilot verwendet wird, um diese Bedenken zu zerstreuen.&lt;/p&gt;
&lt;h2&gt;Trainiert Microsoft ein KI-Modell mit meinen Daten?&lt;/h2&gt;
&lt;p&gt;Viele Menschen haben die Befürchtung, dass ihre Daten zum Training von KI-Modellen verwendet werden könnten. Diese Sorge ist verständlich, da persönliche und geschäftliche Daten sensibel sind und geschützt werden müssen. &lt;strong&gt;Dem ist jedoch nicht so.&lt;/strong&gt; Microsoft hat klare Richtlinien und Technologien implementiert, um sicherzustellen, dass die Daten der Benutzer nicht zum Training der KI-Modelle verwendet werden.&lt;/p&gt;
&lt;h2&gt;Warum wäre das schlecht für Microsoft?&lt;/h2&gt;
&lt;p&gt;Es gibt mehrere Gründe, warum es für Microsoft nicht praktikabel wäre, individuelle Kundendaten zum Training der KI-Modelle zu verwenden:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hoher Ressourcenaufwand:&lt;/strong&gt; Das Training eines KI-Modells mit den Daten jedes einzelnen Kunden würde enorme Rechnerkapazitäten erfordern. Diese Daten könnten möglicherweise nie genutzt werden, was zu einer ineffizienten Nutzung der Ressourcen führen würde.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Komplexität der Modellaktualisierung:&lt;/strong&gt; Wenn Microsoft die GPT-Modelle hinter Copilot mit speziellen Kundendaten trainieren würde, wäre es extrem aufwendig, diese Modelle zu aktualisieren. Jedes Mal, wenn ein neues Modell eingeführt wird, müssten die Daten jedes Kunden erneut integriert werden. Dies würde die Verwaltung und Wartung der Modelle erheblich erschweren.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Stattdessen benutzt Copilot das RAG Pattern&lt;/h2&gt;
&lt;p&gt;Um diese Herausforderungen zu umgehen und gleichzeitig die Effizienz und Sicherheit zu gewährleisten, verwendet Microsoft Copilot das &lt;strong&gt;RAG Pattern&lt;/strong&gt;. RAG steht für &lt;strong&gt;Retrieval Augmented Generation&lt;/strong&gt; und ist eine innovative Methode, um KI-gestützte Antworten zu generieren, ohne die Daten der Benutzer zum Training zu verwenden.&lt;/p&gt;
&lt;h2&gt;Wie funktioniert das RAG Pattern?&lt;/h2&gt;
&lt;p&gt;Das RAG Pattern kombiniert die Stärken der semantischen Suche und der generativen KI, um präzise und relevante Antworten zu liefern. Der Prozess lässt sich in folgende Schritte unterteilen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anfrage des Benutzers:&lt;/strong&gt; Ein Benutzer stellt eine Anfrage an Copilot, beispielsweise eine Frage oder eine Aufgabe, die erledigt werden muss.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Semantische Suche:&lt;/strong&gt; Copilot führt eine semantische Suche durch, um alle Dokumente und Informationen zu finden, die mit der Anfrage des Benutzers in Zusammenhang stehen. Diese Suche basiert auf der Bedeutung der Wörter und Phrasen, um die relevantesten Ergebnisse zu identifizieren.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Weiterleitung an das GPT-Modell:&lt;/strong&gt; Die gefundenen Dokumente und die ursprüngliche Anfrage des Benutzers werden an ein schreibgeschütztes GPT-Modell weitergeleitet. Dieses Modell ist darauf spezialisiert, basierend auf den bereitgestellten Informationen eine kohärente und hilfreiche Antwort zu generieren.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Antwortgenerierung:&lt;/strong&gt; Das GPT-Modell erzeugt eine Antwort, die auf den gefundenen Dokumenten und der Anfrage des Benutzers basiert. Diese Antwort wird dann von Copilot an den Benutzer zurückgeschickt.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Vorteile des RAG Patterns&lt;/h2&gt;
&lt;p&gt;Das RAG Pattern bietet mehrere Vorteile, die sowohl die Sicherheit als auch die Effizienz der KI-gestützten Antworten gewährleisten:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Datenschutz und Sicherheit:&lt;/strong&gt; Das GPT-Modell wird von Microsoft innerhalb der Tenant-Grenzen gehostet. Das bedeutet, dass keine Daten aus dem Tenant abfließen oder zum Training verwendet werden. Die Daten bleiben sicher und geschützt innerhalb der Grenzen des jeweiligen Kunden.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexibilität und Aktualisierbarkeit:&lt;/strong&gt; Microsoft kann das GPT-Modell jederzeit durch ein aktuelleres Modell ersetzen, ohne für jeden Kunden nachtrainieren zu müssen. Dies ermöglicht eine schnelle und effiziente Aktualisierung der Modelle, um stets die besten und neuesten Technologien zu nutzen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Effiziente Ressourcennutzung:&lt;/strong&gt; Durch die Verwendung des RAG Patterns werden die Rechnerkapazitäten effizient genutzt, da nur relevante Informationen für die Antwortgenerierung verwendet werden. Dies reduziert den Ressourcenaufwand und erhöht die Effizienz der KI-gestützten Prozesse.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Das RAG Pattern ist eine leistungsstarke Methode, die von Microsoft Copilot verwendet wird, um präzise und relevante Antworten zu generieren, ohne die Daten der Benutzer zum Training der KI-Modelle zu verwenden. Dies gewährleistet sowohl die Sicherheit als auch die Effizienz der KI-gestützten Prozesse und ermöglicht es Microsoft, stets die neuesten Technologien zu nutzen, um die besten Ergebnisse zu liefern.&lt;/p&gt;
&lt;p&gt;Für Softwareentwickler und IT-Entscheider ist es wichtig zu verstehen, wie diese Technologien funktionieren und welche Vorteile sie bieten. Das RAG Pattern ist ein hervorragendes Beispiel dafür, wie innovative Ansätze die Herausforderungen des Datenschutzes und der Effizienz meistern können, um eine sichere und produktive Nutzung von KI-gestützten Tools wie Microsoft Copilot zu gewährleisten.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Fri, 22 Nov 2024 00:00:00 GMT</pubDate></item><item><title>SharePoint Hub Sites statt Unterwebsites</title><link>https://www.365konten.de/blog/2024-10-13/</link><guid isPermaLink="true">https://www.365konten.de/blog/2024-10-13/</guid><description>Warum Unterwebsites schlecht sind und Hub-Sites uns helfen</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2024-10-13/&quot;&gt;https://www.365konten.de/blog/2024-10-13/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;Einleitung&lt;/h2&gt;
&lt;p&gt;In der modernen Welt von SharePoint Online gibt es keine Hierarchie mehr zwischen den Sites. Alle Sites liegen technisch gleichwertig nebeneinander. Dies ist ein bedeutender Unterschied zu den alten On-Premise-Sites, bei denen es die Möglichkeit gab, Unterwebsites anzulegen. Diese Funktion existiert in SharePoint Online nicht mehr.&lt;/p&gt;
&lt;h2&gt;Was war das Problem mit Unterwebsites?&lt;/h2&gt;
&lt;p&gt;Unterwebsites waren technisch in einer SiteCollection enthalten. Daher war das Verschieben einer Site in eine andere Position kompliziert. Teilweise wurden SiteCollections durch Unterwebsites riesig, und Sites mit vielen Unterwebsites konnten schlechter gesichert und wiederhergestellt werden. Einzelne Sites sind hier einfacher zu handhaben. &lt;/p&gt;
&lt;p&gt;Unterwebsites sind auch keine vollständigen Sites. Sie teilen sich verschiedene Kataloge mit allen anderen Subsites innerhalb der Sitecolletion. Zum Beispiel werden Contenttypen zwischen allen Subsites einer Site geteilt, was schnell unübersichtlich werden kann. Und dann stellt sich schnell die Frage: Welcher Contenttype gehört zu welcher Site? Und kann der gelöscht werden oder nicht.&lt;/p&gt;
&lt;p&gt;Außerdem vermischt man mit Subsites Navigation und Datenablage. Warum sollte eine Site überhaupt innerhalb einer anderen Site enthalten sein? Genausogut könnten die auch einfach nebeneinander liegen. Um dann zu einem untergeordneten Thema zu gelangen, ist nur eine leichtgewichtige Navigation nötig, keine physische Ablagestruktur. Das ist &amp;quot;Ordnerdenken&amp;quot; und nicht &amp;quot;Denken in Intranets&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Gleichberechtigte Sites&lt;/h2&gt;
&lt;p&gt;Daher ist in modernen SharePoint die Anlage von Subsites im Standard auch ausgeschaltet. Das neue Konzept sieht vor, dass alle Sites physisch nebeneinander liegen und es keine Hierarchie zwischen ihnen gibt.&lt;/p&gt;
&lt;h2&gt;Aber manchmal brauche ich so eine Art Hierarchie&lt;/h2&gt;
&lt;p&gt;Das ist richtig. Als Besitzer eines Intranets möchtest du zum Beispiel, dass die siteübergreifende Navigation auf allen Sites gleich ist und du sie nicht auf jeder Site doppelt pflegen musst. Ferner willst du vielleicht noch andere Einstellungen von einer Site auf viele Sites übertragen.&lt;/p&gt;
&lt;h2&gt;Die Hub-Site als Verteiler von Einstellungen&lt;/h2&gt;
&lt;p&gt;Dafür gibt es das Konstrukt des &amp;quot;Hubs&amp;quot;. Ein Hub selbst ist auch nur eine Site, aber du kannst verschiedene Sites an den Hub &amp;quot;andocken&amp;quot;. Die Topnavigation, das Theme und je nach Bedarf auch Teile der Berechtigungen werden dann auf die Sites im Hub vererbt. Die Sites liegen aber immer noch nebeneinander und können jederzeit einfach an einen anderen Hub gehängt werden.&lt;/p&gt;
&lt;h2&gt;Die Hub-Site als Aggregator von Informationen&lt;/h2&gt;
&lt;p&gt;Auf der anderen Seite können auf einer Hubsite einfach Informationen von allen Sites im Hub aggregiert werden. So ist es zum Beispiel einfach, alle News und Events von allen Sites einzusammeln und gebündelt auf der Startseite eines Hubs darzustellen. Damit eignet sich die Homepage eines Hubs sehr gut als die Startseite eines Intranets, auf der die neuesten Neuigkeiten und Events der einzelnen Sites dargestellt werden.&lt;/p&gt;
&lt;h2&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Wichtig zu verstehen ist, dass es einen Unterschied zwischen der Ablagestruktur von Sites und der Navigation hin zu einzelnen Sites gibt. Wenn man das einmal verstanden hat, dann ist die Hub-Site ein ganz entscheidender Baustein eines SharePoint-basierten Intranets.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sun, 13 Oct 2024 00:00:00 GMT</pubDate></item><item><title>Quick Tipp: SharePoint List Formatting: Commandbar</title><link>https://www.365konten.de/blog/2024-08-07/</link><guid isPermaLink="true">https://www.365konten.de/blog/2024-08-07/</guid><description>Hier zeige ich euch, wie man die Buttons oben in einer Liste anpasst</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2024-08-07/&quot;&gt;https://www.365konten.de/blog/2024-08-07/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Hattet ihr auch schonmal das Problem, dass ihr einen der Listenknöpfe, also eines der Kommandos, oberhalb der Liste ausblenden wolltet?
Zum Beispiel könnte es sein, dass ihr den &amp;quot;In Rasteransicht bearbeiten&amp;quot; Knopf verstecken wollt, da eure User nur über das Formular die Daten in der Liste  bearbeiten sollen.
Oder vielleicht wollt ihr den &amp;quot;Neu&amp;quot; Knopf auf eurer Liste nach &amp;quot;Neuer Vorgang&amp;quot; umbenennen, damit eure User genauer wissen, was sie beim Klick auf den Button anlegen.
Es gibt viele Dinge, die ihr vielleicht in der Commandbar anpassen wollt. Glücklicherweise ist es nicht wirklich kompliziert, das zu tun.&lt;/p&gt;
&lt;h2&gt;Listenformatierungen und Verstecken von Kommandos&lt;/h2&gt;
&lt;p&gt;Das können wir nämlich mittels einer Listenformatierung tun. Diese Formatierung ist im Grunde eine JSON-Datei in einem bestimmten Format, die wir über die Oberfläche an eine SharePoint Ansicht hängen können.&lt;/p&gt;
&lt;p&gt;Hierzu erstellen wir zunächst eine &amp;quot;template.json&amp;quot; Datei auf unserem Rechner und füllen Sie mit diesem Inhalt&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;
  &amp;quot;$schema&amp;quot;: &amp;quot;https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json&amp;quot;,
  &amp;quot;commandBarProps&amp;quot;: {
    &amp;quot;commands&amp;quot;: [
      {
        &amp;quot;key&amp;quot;: &amp;quot;editInGridView&amp;quot;,
        &amp;quot;hide&amp;quot;: true
      }
    ]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;#39;&amp;#39;&amp;#39;
Danach öffnen wir unsere Liste, klicken oben rechts auf den Namen der Ansicht und wählen dann &amp;quot;Ansicht formatieren&amp;quot;. Jetzt öffnen wir die erweiterte Ansicht und fügen den Inhalt ein und ... Voilà... der Button &amp;quot;In Rasteransicht bearbeiten&amp;quot; ist verschwunden. 
Das Vorgehen, um einen Button auszublenden ist hier immer dasselbe: Wir brauchen den internen Namen des Bittons und setzen dann für diesen Button &amp;quot;hide&amp;quot; auf &amp;quot;true&amp;quot;. &lt;/p&gt;
&lt;h2&gt;Umbenennen von Kommandos&lt;/h2&gt;
&lt;p&gt;Über denselben Weg können wir dann auch Buttons umbenennen. Wenn wir zum Beispiel in einer Liste &amp;quot;Materialanforderungen&amp;quot; nachverfolgen, dann würde es sich anbieten, dass die &amp;quot;Bearbeiten&amp;quot; und &amp;quot;Neu&amp;quot; Knöpfe die Labels &amp;quot;Materialanforderunge bearbeiten&amp;quot; und &amp;quot;Neue Materialanforderung&amp;quot; haben. Das können wir wie oben über das folgende Template regeln.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;{
  &amp;quot;$schema&amp;quot;: &amp;quot;https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json&amp;quot;,
  &amp;quot;commandBarProps&amp;quot;: {
    &amp;quot;commands&amp;quot;: [
  {
        &amp;quot;key&amp;quot;: &amp;quot;edit&amp;quot;,
        &amp;quot;text&amp;quot;: &amp;quot;Materialanforderung bearbeiten&amp;quot;
      },
      {
        &amp;quot;key&amp;quot;: &amp;quot;new&amp;quot;,
        &amp;quot;text&amp;quot;: &amp;quot;Neue Materialanforderung&amp;quot;
      }
  ]
  }
}      
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Andere Icons und Primäre Buttons&lt;/h2&gt;
&lt;p&gt;Schließlich können wir noch zwei weitere Dinge bei den Kommandos anpassen  -  Wir können das Icon eines Buttons ändern und die Butten in der Primärfarbe der Webseite hinterlegen. Beides&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Wed, 07 Aug 2024 00:00:00 GMT</pubDate></item><item><title>Organizational Assets</title><link>https://www.365konten.de/blog/2024-07-13/</link><guid isPermaLink="true">https://www.365konten.de/blog/2024-07-13/</guid><description>Vorlagenverwaltung für Office Dateien und Bilder</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2024-07-13/&quot;&gt;https://www.365konten.de/blog/2024-07-13/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Jedes Unternehmen hat Vorlagen, sei es Briefvorlagen, PowerPoint Masterfolien, Angebotsvorlagen oder auch Bilder und Videos, die im Intranet benutzt werden dürfen. Diese Vorlagen sind häufig auf Netzlaufwerken gespeichert oder im Intranet abgelegt. Doch wie oft kommt es vor, dass Mitarbeiter die benötigten Vorlagen nicht sofort finden und daher alte oder falsche Vorlagen verwenden? Eine bessere Lösung wäre, wenn die Vorlagen direkt in den Office Programmen wie Word oder PowerPoint verfügbar wären.&lt;/p&gt;
&lt;h2&gt;Problem&lt;/h2&gt;
&lt;p&gt;Das Problem ist bekannt: Mitarbeiter finden die Vorlagen nicht sofort und benutzen daher möglicherweise alte Vorlagen weiter. Dies kann zu Inkonsistenzen und ineffizienten Arbeitsabläufen führen. Obwohl es schon lange möglich ist, Vorlagen in Office Programmen zu integrieren, basiert dies häufig auf Netzlaufwerken, die nur per VPN verfügbar sind. Dies erschwert den Zugriff und die Nutzung der Vorlagen erheblich.&lt;/p&gt;
&lt;h2&gt;Lösung&lt;/h2&gt;
&lt;p&gt;Die Lösung für dieses Problem sind &amp;quot;Organizational Asset Bibliotheken&amp;quot;. Dabei handelt es sich um Dokumentenbibliotheken im SharePoint, in die Vorlagen abgelegt werden können. Diese Vorlagen sind dann direkt in den Office Produkten benutzbar, was den Zugriff und die Nutzung erheblich erleichtert.&lt;/p&gt;
&lt;h2&gt;Einrichtung&lt;/h2&gt;
&lt;p&gt;Um Organizational Asset Bibliotheken einzurichten, muss zunächst eine SharePoint Seite definiert werden, auf der die Asset Bibliotheken angelegt werden sollen. Es ist wichtig zu beachten, dass es nicht möglich ist, mehrere SharePoint Seiten mit &amp;quot;Organizational Asset&amp;quot; Bibliotheken zu benutzen. Alle &amp;quot;Organizational Asset&amp;quot; Bibliotheken müssen auf derselben SharePoint Seite sein.&lt;/p&gt;
&lt;h3&gt;Office Vorlagen&lt;/h3&gt;
&lt;p&gt;Nachdem eine leere Bibliothek angelegt wurde, muss sich ein Administrator per SharePoint Management Shell anmelden und das folgende Kommando ausführen:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt; Add-SPOOrgAssetsLibrary -LibraryUrl &amp;lt;URL&amp;gt; -OrgAssetType  OfficeTemplateLibrary -CdnType Public
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dieses Kommando definiert die angegebene Bibliothek als Vorlagenbibliothek. Nun können PowerPoint Vorlagen (.POTX), Word Vorlagen (.dotx) und Excel Vorlagen (.XLTX) dort abgelegt werden. Diese werden dann in jedem PowerPoint, Word und Excel unter &amp;quot;Neu&amp;quot; und dem Namen der Organisation als Vorlage angeboten.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/office.png&quot; alt=&quot;Office Vorlagenauswahl in PowerPoint Online&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Bild Vorlagen&lt;/h3&gt;
&lt;p&gt;Nach Anlage einer leeren Bibliothek und nachdem ein Administrator per SharePoint Management Shell das folgende Kommando ausgeführt hat:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;  Add-SPOOrgAssetsLibrary -LibraryUrl &amp;lt;URL&amp;gt; -OrgAssetType  ImageDocumentLibrary -CdnType Public
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;stehen auch alle Bilder in der Bibliothek allen Redakteuren im Intranet im Dateiauswahldialog für Bilder zur Verfügung.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/teaser.png&quot; alt=&quot;Bildauswahl in einem SharePoint Image Dialog&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Vorteile der Organizational Asset Bibliotheken&lt;/h2&gt;
&lt;p&gt;Die Verwendung von Organizational Asset Bibliotheken bietet zahlreiche Vorteile:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zentralisierte Verwaltung: Alle Vorlagen sind an einem zentralen Ort gespeichert und können leicht aktualisiert und verwaltet werden.&lt;/li&gt;
&lt;li&gt;Einfacher Zugriff: Mitarbeiter können direkt aus den Office Programmen auf die Vorlagen zugreifen, ohne sich durch Netzlaufwerke oder VPN-Verbindungen kämpfen zu müssen.&lt;/li&gt;
&lt;li&gt;Konsistenz: Durch die zentrale Verwaltung und den einfachen Zugriff wird sichergestellt, dass immer die aktuellsten Vorlagen verwendet werden, was zu konsistenteren und professionelleren Dokumenten führt.&lt;/li&gt;
&lt;li&gt;Effizienz: Die Zeit, die Mitarbeiter mit der Suche nach Vorlagen verbringen, wird erheblich reduziert, was zu effizienteren Arbeitsabläufen führt.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Organizational Asset Bibliotheken sind eine hervorragende Lösung für Unternehmen, die ihre Vorlagenverwaltung optimieren möchten. Die Einrichtung ist zwar mit einigen administrativen Schritten verbunden, diese sind aber im Vergleich mit anderen Lösungen nicht so komplex und die Vorteile überwiegen bei weitem die anfänglichen Aufwände. Nutze die Möglichkeiten von SharePoint und Microsoft 365, um deine Vorlagenverwaltung auf das nächste Level zu heben!&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sat, 13 Jul 2024 00:00:00 GMT</pubDate></item><item><title>Sprachwirrwarr.... &quot;Site&quot; vs &quot;Seite&quot;</title><link>https://www.365konten.de/blog/2024-06-10/</link><guid isPermaLink="true">https://www.365konten.de/blog/2024-06-10/</guid><description>&quot;Site&quot; bedeutet nicht &quot;Seite&quot; und &quot;Webseite&quot; daher etwas anderes</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2024-06-10/&quot;&gt;https://www.365konten.de/blog/2024-06-10/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Ich denke, wir haben in den 1990ern kollektiv etwas falsch gemacht. Wer damals auf die Idee gekommen ist, den englischen Ausdruck &amp;quot;Web site&amp;quot; mit dem deuschten Ausdruck &amp;quot;Webseite&amp;quot; zu übersetzten hat nicht bedacht, dass die beiden Ausdrücke zwar ähnlich klingen, aber komplett andere Assoziationen wecken.&lt;/p&gt;
&lt;p&gt;Das sehe ich viel, wenn ich mir die Oberfläche etwa eines modernen SharePoints ansehe. In meiner Erfahrung werden nicht-IT-affine Benutzer häufig von (Fehl-)Übersetzungen irritiert&lt;/p&gt;
&lt;h1&gt;Site&lt;/h1&gt;
&lt;p&gt;Das Problem ist nämlich, dass man den englischen Ausdruck &amp;quot;Site&amp;quot; nicht mit &amp;quot;Seite&amp;quot; übersetzen sollte, sondern eher mit &amp;quot;Bereich&amp;quot; oder &amp;quot;Ding, in dem andere Dinge enthalten sein können&amp;quot;. Zum Beispiel ist eine &amp;quot;Construction Site&amp;quot; keine &amp;quot;Konstruktionsseite&amp;quot; oder sowas ähnliches, sondern ein Bereich oder Areal, in dem gebaut wird.... Also eine &amp;quot;Baustelle&amp;quot;. &lt;/p&gt;
&lt;p&gt;Andere Ausdrücke wie etwa &amp;quot;On site&amp;quot; oder &amp;quot;Off site&amp;quot; meinen schließlich auch nicht &amp;quot;Auf der Seite&amp;quot; oder &amp;quot;Außerhalb der Seite&amp;quot;, sondern &amp;quot;Im Bereich&amp;quot; und &amp;quot;außerhalb des Bereichs&amp;quot;. Im Geschäftskontext meint man damit häufig &amp;quot;im Büro&amp;quot; und &amp;quot;nicht im Büro&amp;quot;&lt;/p&gt;
&lt;h1&gt;Page&lt;/h1&gt;
&lt;p&gt;Auf der anderen &amp;quot;Seite&amp;quot; gibt es da die &amp;quot;Page&amp;quot;. Wenn wir das übersetzen, entspricht das eher der Seite in einem Buch, auf der wir Buchstaben finden und lesen können. Das ist aber eigentlich nicht gemeint, wenn wir von einer &amp;quot;Website&amp;quot; sprechen. Ich tendiere dazu, diese Seiten als &amp;quot;Inhaltsseiten&amp;quot; zu bezeichnen.&lt;/p&gt;
&lt;h1&gt;Website&lt;/h1&gt;
&lt;p&gt;Klassischerweise ist eine &amp;quot;Website&amp;quot; nämlich mehr als nur der Text, der aktuell dargestellt wird. Technisch ist es im Regelfall wenigstens ein &amp;quot;Ordner&amp;quot;, in dem wir mehrere Dateien abspeichern können. Das sind im Regelfall HTML Dateien, aber auch Bilder, Styles, Scripte und ähnliches. Es ist halt ein &amp;quot;Bereich&amp;quot;, in dem wir die ganzen Elemente speichern, die wir darstellen wollen.&lt;/p&gt;
&lt;h1&gt;Homepage&lt;/h1&gt;
&lt;p&gt;Somit kann es in einer &amp;quot;Website&amp;quot; mehrere Inhaltseiten geben, auf die ich vielleicht per Link zugreifen kann. Eine besondere Inhaltsseite ist hier aber die &amp;quot;Homepage&amp;quot;. Das ist die Inhaltsseite, die als Standart aufgerufen wird und von der ich aus alle anderen Inhalte in der Site erreichen kann. Sozusagen das &amp;quot;Gesicht&amp;quot; unserer Website.&lt;/p&gt;
&lt;p&gt;Wenn nun Leute aber von Hompages reden, meinen Sie aber häufig nicht so eine &amp;quot;Hauptseite&amp;quot; einer Website, sondern eher eine Website, die einer einzelnen Person oder Firma zugeordnet ist. Zum Beispiel würden viele Leute sagen, dass diese Website, auf der sich dieser Text befindet, meine Homepage ist ....Eigentlich wieder eine falsche Assoziation.&lt;/p&gt;
&lt;h1&gt;Und nun?&lt;/h1&gt;
&lt;p&gt;Naja, das Kind ist in den Brunnen gefallen und wir können kurzfristig nichts an dem Problem machen.&lt;/p&gt;
&lt;p&gt;Ich persönlich habe mich dazu entschlossen, mich sprachlich klarer auszudrücken. Daher benutze ich eigentlch nur noch diese Ausdrücke im Deutsche.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Webbereich&lt;/strong&gt; für eine &amp;quot;Website&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inhaltsseite&lt;/strong&gt; für eine &amp;quot;Page&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Startseite&lt;/strong&gt; für eine &amp;quot;Homepage&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Homepage&lt;/strong&gt; garnicht&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Mon, 10 Jun 2024 00:00:00 GMT</pubDate></item><item><title>Vortrag bei den Magdeburger Dev Days: Going Serverless mit Azure</title><link>https://www.365konten.de/blog/2024-05-11/</link><guid isPermaLink="true">https://www.365konten.de/blog/2024-05-11/</guid><description>Ich war am 14.05.2024 beiMagdeburger Dev Days und habe einen Vortrag gehalten. Hier sind meine Folien</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2024-05-11/&quot;&gt;https://www.365konten.de/blog/2024-05-11/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Bei den &lt;a href=&quot;https://md-devdays.de/&quot;&gt;Magdeburger Dev Days&lt;/a&gt; in Magdeburg eine der größten Community Entwickler Konferenzen in Deutschland ist eine Veranstaltungsreihe, bei der sich die Webschaffenden des Bremer Umfelds in locker Atmosphere treffen, austauschen und voneinander lernen können.&lt;/p&gt;
&lt;p&gt;Am 14.05.2023 habe ich hier einen Vortrag zum Thema &amp;quot;Going Serverless mit Azure&amp;quot; gehalten.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bei Azure denken viele direkt an riesige Rechenzentren und &amp;quot;Infrastructure as a Service&amp;quot;. Was bringt Azure mir aber als Entwickler und was für einen Einfluss kann das auf meine Architektur haben? Ich erkläre euch am Beispiel einer recht simplen Anwendung, wie man Bausteine Stück für Stück durch Azure Komponenten ersetzten kann.... bis die Applikation komplett &amp;quot;serverless&amp;quot; ist.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/GoingServerlessWithAzure.pdf&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;div width=&quot;width:100%; display: flex; justify-content: center;&quot;&gt;
&lt;div&gt;
&lt;object data=&quot;./GoingServerlessWithAzure.pdf&quot; type=&quot;application/pdf&quot; width=&quot;800&quot; height=&quot;450&quot;&gt;
    &lt;embed src=&quot;https://www.365konten.de/GoingServerlessWithAzure.pdf&quot;&gt;
        &lt;p&gt;This browser does not support PDFs. Please download the PDF to view it: &lt;a href=&quot;./GoingServerlessWithAzure.pdf&quot;&gt;Download PDF&lt;/a&gt;.&lt;/p&gt;
    &lt;/embed&gt;
&lt;/object&gt;
&lt;/div&gt;
&lt;div&gt;</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sat, 11 May 2024 00:00:00 GMT</pubDate></item><item><title>Microsoft Most valued Professional</title><link>https://www.365konten.de/blog/2024-01-16/</link><guid isPermaLink="true">https://www.365konten.de/blog/2024-01-16/</guid><description>Ich bin MVP</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2024-01-16/&quot;&gt;https://www.365konten.de/blog/2024-01-16/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Heute habe ich ein Nominierungsschreiben erhalten, in welchem Microsoft mich zum MVP (Most Valued Professional) auszeichnet
&lt;img src=&quot;https://www.365konten.de/quote.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mvp.microsoft.com/de-DE/MVP/profile/a063f8c2-5844-4d0b-a0fb-7bfadc715f2c&quot;&gt;https://mvp.microsoft.com/de-DE/MVP/profile/a063f8c2-5844-4d0b-a0fb-7bfadc715f2c&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dankeschön :) #SharingIsCaring #communityrocks&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Tue, 16 Jan 2024 00:00:00 GMT</pubDate></item><item><title>Vortrag bei den Collabdays Belgium: SPFX Forms and React Formik: Easily create custom SharePoint list forms</title><link>https://www.365konten.de/blog/2023-09-11/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-09-11/</guid><description>Am Samstag, den 21.10.2023, halte ich in Brüssel einen Vortrag bei den Collabdays.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-09-11/&quot;&gt;https://www.365konten.de/blog/2023-09-11/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Ich bin in diesem Jahr bei den &lt;a href=&quot;https://www.collabdays.org/2023-belgium/&quot;&gt;Collabdays Belgium&lt;/a&gt; als Speaker mit dabei.&lt;/p&gt;
&lt;p&gt;Ich spreche über SPFx FormCustomizer und &lt;a href=&quot;https://formik.org/&quot;&gt;React Formik&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Die Folien werde ich später hier veröffentlichen, bis dahin könnt ihr könnt euch in diesen beiden Artikeln über den Inhalt informieren &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;../SPFxFormik/&quot;&gt;SharePoint Formulare mit React Formik 1/2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;../SPFxFormik2/&quot;&gt;SharePoint Formulare mit React Formik 2/2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Mon, 11 Sep 2023 00:00:00 GMT</pubDate></item><item><title>Was genau bedeutet &quot;Low Code&quot;?</title><link>https://www.365konten.de/blog/2023-09-06/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-09-06/</guid><description>Viele Leute sprechen von vielen verschiedenen Dingen, wenn sie &quot;Low Code&quot; sagen und meinen verschiedene Applikationstypen</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-09-06/&quot;&gt;https://www.365konten.de/blog/2023-09-06/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;a href=&quot;https://de.wikipedia.org/wiki/Low-Code-Plattform&quot;&gt;Wikipedia&lt;/a&gt; definiert &amp;quot;Low Code&amp;quot; bzw. &amp;quot;Low-Code-Plattform&amp;quot; als&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Der Begriff Low-Code-Plattform (auch Low-Code-Entwicklungsplattform) bezeichnet eine Entwicklungsumgebung für Software, die die Entwicklung mit visuellen Applikationsdesign-Werkzeugen und anderen grafischen Modellierungsverfahren ermöglicht, anstatt klassische textbasierte Programmiersprachen zu verwenden. Dadurch soll die Entwicklungs- und Bereitstellungszeit für Software verringert werden. Low-Code-Plattformen sollen außerdem die Kosten für Projektplanung, Mitarbeitertraining und die eigentliche Entwicklung senken.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dem stimme ich generell zu und nehme für mich daraus die folgenden Stichworte mit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grafische Modellierung statt textbasierter Programmiersprachen&lt;/li&gt;
&lt;li&gt;Minimierung von Entwicklungszeit&lt;/li&gt;
&lt;li&gt;Minimierung von Bereitstellungszeit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anhand dieser Stichworte versuche ich im Folgenden in Applikationen in 4 generelle &amp;quot;Low Code&amp;quot; Kategorien einzuteilen. &lt;/p&gt;
&lt;p&gt;Ich denke, dass das wichtig ist, da viele Leute teilweise nur von einer der Kategorien sprechen, wenn sie &amp;quot;Low Code&amp;quot; sagen. Falls in dieser Kategorie dann &amp;quot;Low Code&amp;quot; nur oberflächlich eingesetzt wird, kann das bei manchen ein verzerrtes Bild von der &amp;quot;Low Code&amp;quot; Idee hinterlassen.&lt;/p&gt;
&lt;h2&gt;1) Grafische Entwicklertools&lt;/h2&gt;
&lt;p&gt;Das sind häufig Frameworks, die ich in mein eigenes Projekt integrieren kann und mit dem ich dann grafisch Workflows in meiner Applikation modellieren kann. Der Rest meiner Applikation ist aber klassisch entwickelt und wird damit auch klassisch bereitgestellt. Das bedeutet, dass der Workflow zwar von mir als Entwickler mit Low-Code Mitteln erstellt, er danach aber gebündelt zusammen mit Code Änderungen in einem klassischen Deployment verteilt wird. Die Bereitstellungszeit zwischen zwei Deployments ändert sich hier nicht (Abgesehen von einer vielleicht kleineren Entwicklungszeit).&lt;/p&gt;
&lt;p&gt;Die beiden Vorteile von diesem Vorgehen sind klar. Das Workflow-Framework nimmt mir als Entwickler in dem Workflow-Umfeld viele wiederkehrende Schritte ab, die ich einfach grafisch modellieren kann. Damit spare ich Zeit. Der Workflow ist aber auch gleichzeitig übersichtlicher und ich kann mir mit meinem Kunden zusammen den Workflow grafisch ansehen und schnell ändern.&lt;/p&gt;
&lt;h2&gt;2) Grafisch konfigurierbare Systeme&lt;/h2&gt;
&lt;p&gt;Auf der anderen Seite gibt es viele Applikationen, die ich in einem festgelegten Rahmen fast von Grund auf neu konfigurieren kann. Ein gutes Beispiel dafür aus dem Microsoft Umfeld ist SharePoint. Ich kann leicht über die Oberfläche meine eigenen Listen, Datenstrukturen und Ansichten auf diesen konfigurieren. Es gibt teilweise sogar Automatismen, mit denen ich bestimmte Prozesse und Freigaben zwischen den Elementen definieren kann. Neben SharePoint sprießen aber auch schon seit ein paar Jahren mehrere andere Lösungen dieser Art aus dem Boden. Häufig stehen hier Projektmanagement- und Abrechnungsprozesse im Vordergrund.&lt;/p&gt;
&lt;p&gt;Ich als Entwickler installiere hier nicht die Plattform und entwickele darauf meine Applikation, sondern benutze eine schon bestehende Plattform, die ich dann so anpasse, wie mein Anwendungsfall es verlangt. Ich mir daher viel Zeit und Aufwand, den ich vorher in Dinge wie Datenspeicherung, Berechtigungssysteme oder Oberflächengestaltung hätte stecken müssen. &lt;/p&gt;
&lt;p&gt;Ein Nachteil bei diesen Systemen ist häufig die Transportierbarkeit. Ich kann zwar mir zwar &amp;quot;eben mal kurz&amp;quot; eine Applikation &amp;quot;zusammenklicken&amp;quot; aber was passiert, wenn die Applikation schon genutzt wird? Muss ich dann Anpassungen direkt im Produktivsystem machen oder kann ich ein Testsystem erstellen, dort zuerst Änderungen testen und dann gezielt diese Änderungen deployen? Kann ich meine Anpassungen überhaupt automatisch in eine andere Applikation kopieren?&lt;/p&gt;
&lt;p&gt;Bei vielen dieser Systeme gibt es zu diesen Fragen keine Antworten. Häufig stand bei der Entwicklung und dem Design dieser Plattformen nämlich etwas anderes im Vordergrund und die Idee von Konfigurierbarkeit und Low-Code war eher ein Nachgedanke.&lt;/p&gt;
&lt;p&gt;Diese Art von Plattformen ist auch nichts neues. SharePoint gibt es schon lange und es entstehen im Internet immer mehr Dienste dieser Art. Wenn man die Definition hier etwas weiter fassen möchte, dann kann hierzu durchaus auch durchaus Atlassians Jira und andere zählen.&lt;/p&gt;
&lt;h2&gt;3) Automatisierungslösungen&lt;/h2&gt;
&lt;p&gt;Dann gibt es noch Automatisierungslösungen. Diese gibt es zwar schon lange, aber mit dem Aufkommen der Heimautomatisierung ist ihre Anzahl nochmal rasant gestiegen. Hierbei handelt es sich um einfache Logik-Prozesse, die von einem externen System ausgelöst werden und abhängig von definierten Bedingungen in einem anderen System Aktionen auslösen. Ein einfaches Beispiel aus dem Consumer Bereich ist hier &lt;a href=&quot;https://ifttt.com/&quot;&gt;IFTT&lt;/a&gt; (If-This-Then-That). Ich als Consumer kann hier dem Service meine digitalen Dienste freischalten und diese kann dann für mich dort Aktionen ausführen. Etwa könnte ich mir bei Eingang eines neuen Kalendereintrages automatisch eine Chat-Nachricht schreiben lassen oder ähnliches.&lt;/p&gt;
&lt;p&gt;Im Regelfall können diese Plattformen von Haus aus schon mit vielen anderen Systemen Kontakt aufnehmen. Sie geben mir eine einfache grafische Möglichkeit, um Automatisierungen und Prozesse zu erstellen.&lt;/p&gt;
&lt;p&gt;Das Problem ist hier aber wie bei den grafisch konfigurierbare Systemen aus dem vorherigen Abschnitt die Transportierbarkeit. Selbst wenn ich auf diesen Plattformen meinen Workflow exportieren und in eine andere Instanz einspielen kann (was nicht immer möglich ist), dann habe ich als Entwickler immer noch das Problem, dass ich Änderungen an den anderen Systemen hiermit nicht transportieren kann.&lt;/p&gt;
&lt;p&gt;Wenn ich also eine Änderung an einer &amp;quot;Datenbank&amp;quot; irgendwo habe und zusätzlich eine Änderung an diesem Workflow, dann muss ich als Entwickler beides einzeln im Rahmen eines Changes auf die entsprechenden Produktivsysteme einspielen. Das kann zu mehreren möglichen Fehlerquellen führen und macht eine Entwicklung von komplexen Applikationen hier schwierig.&lt;/p&gt;
&lt;p&gt;Bei diesen Lösungen steht die einfache und schnelle Automatisierung von Teil-Prozessen im Vordergrund, nicht die ganzheitliche Entwicklung von Applikationen.&lt;/p&gt;
&lt;p&gt;Beispiele für solche Automatisierungsplattformen sind wie schon oben erwähnt IFTT, aber auch Nintex Workflow. Wenn wir die Definition hier etwas ausweiten, dann fallen auch diverse &amp;quot;ETL&amp;quot; Tools in diesem Bereich&lt;/p&gt;
&lt;h2&gt;4) Komplette Low Code Plattformen&lt;/h2&gt;
&lt;p&gt;Mit der bisherigen Vorarbeit kommen wir nun zu kompletten Low Code Plattformen. Man kann Sie als Weiterentwicklung der grafisch konfigurierbaren Systeme sehen, die auf der einen Seite schon von Grund auf dafür gedacht und konzipiert sind, um komplette Anwendungsfälle schnell per Low Code grafisch umzusetzen. Auf der anderen Seite sind sie aber auch so erstellt, dass auch das Deployment und das Verteilen der erstellten Applikationen einfach, schnell und zuverlässlich durchgeführt werden kann. Und das im Idealfall auch noch grafisch.&lt;/p&gt;
&lt;p&gt;Diese Plattformen bestehen im Regelfall aus wenigstens vier ineinandergreifenden Komponenten: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Einer Komponente zur Datenspeicherung, in der ich einfach Datenstrukturen anlegen kann&lt;/li&gt;
&lt;li&gt;Einer Komponente zur Erstellung von Prozessen, mit der ich einfach auf den Daten Prozesse definieren kann&lt;/li&gt;
&lt;li&gt;Einer Komponente zur Erstellung von Oberflächen, die es mir möglich machen, mittels Formularen die Daten zu bearbeiten.&lt;/li&gt;
&lt;li&gt;Ein Mechanismus, der die Konfiguration der oberen drei Mechanismen portabel in eine Lösung exportieren kann, die ich als Entwickler ohne viel Aufwand einfach auf einem anderen System einspielen kann. Im Idealfall lässt sich dieser Mechanismus sogar noch automatisieren.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der Unterschied zu den anderen Kategorien besteht hier darin, dass die Idee der schnellen grafische Entwicklung von Applikationen bei der Erstellung der Plattform im Vordergrund gestanden hat, und daher alle Mechanismen ineinander greifen. Damit können mit so einer Plattform komplizierte Applikationen entwickelt werden, die aber auch professionell betrieben und weiterentwickelt werden können.&lt;/p&gt;
&lt;p&gt;Als Beispiele für solche Plattformen kann man &amp;quot;Lotus Notes&amp;quot; heranziehen und auch die PowerPlattform von Microsoft. Letztere besteht aus verschiedenen Komponenten, wie etwa&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dataverse&lt;/strong&gt; zur Datenspeicherung in Tabellen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Power Automate&lt;/strong&gt; zur Erzeugung von Prozessen und&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Power Apps zur&lt;/strong&gt; Erstellung von Oberflächen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;und stellt zusätzlich mit &amp;quot;Solutions&amp;quot; einen einfachen und effektiven Transportmechanismus zur Verfügung.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Wed, 06 Sep 2023 00:00:00 GMT</pubDate></item><item><title>Per PowerAutomate eine Mail an eine SharePoint Gruppe senden</title><link>https://www.365konten.de/blog/2023-08-31/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-08-31/</guid><description>Das sieht auf den ersten Blick vielleicht kompliziert aus, aber wir brauchen dafür nur eine Aktion</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-08-31/&quot;&gt;https://www.365konten.de/blog/2023-08-31/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Benutzt dazu einfach die &amp;quot;Send an HTTP Request to SharePoint&amp;quot; Aktion und den REST-API Endpunkt &amp;quot;/_api/SP.Utilities.Utility.SendEmail&amp;quot;&lt;/p&gt;
&lt;p&gt;In diesem Beispiel schicke ich damit eine Email an alle Mitglieder der SharePoint Gruppe &amp;quot;SharePoint Group&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/powerautomate.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;{
    &amp;#39;properties&amp;#39;: {
      &amp;#39;To&amp;#39;:[&amp;#39;SharePoint Group&amp;#39;],
        &amp;#39;Body&amp;#39;: &amp;#39;&amp;lt;h1&amp;gt;Hello Group&amp;lt;/h1&amp;gt;&amp;#39;,
        &amp;#39;Subject&amp;#39;: &amp;#39;Hello Group&amp;#39;
    }
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Thu, 31 Aug 2023 00:00:00 GMT</pubDate></item><item><title>Vortrag: Going Serverless mit Azure</title><link>https://www.365konten.de/blog/2023-08-21/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-08-21/</guid><description>Ich war am 21.08.2023 beim Bremer Webmontag. Hier sind meine Folien</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-08-21/&quot;&gt;https://www.365konten.de/blog/2023-08-21/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Der &lt;a href=&quot;https://webmontag-bremen.de/&quot;&gt;Webmontag&lt;/a&gt; in Bremen ist eine Veranstaltungsreihe, bei der sich die Webschaffenden des Bremer Umfelds in locker Atmosphere treffen, austauschen und voneinander lernen können.&lt;/p&gt;
&lt;p&gt;Am 21.08.2023 habe ich hier einen Vortrag zum Thema &amp;quot;Going Serverless mit Azure&amp;quot; gehalten.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bei Azure denken viele direkt an riesige Rechenzentren und &amp;quot;Infrastructure as a Service&amp;quot;. Was bringt Azure mir aber als Entwickler und was für einen Einfluss kann das auf meine Architektur haben? Ich erkläre euch am Beispiel einer recht simplen Anwendung, wie man Bausteine Stück für Stück durch Azure Komponenten ersetzten kann.... bis die Applikation komplett &amp;quot;serverless&amp;quot; ist.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div width=&quot;width:100%; display: flex; justify-content: center;&quot;&gt;
&lt;div&gt;
&lt;object data=&quot;/download/GoingServerlessWithAzure.pdf&quot; type=&quot;application/pdf&quot; width=&quot;800&quot; height=&quot;450&quot;&gt;
    &lt;embed src=&quot;https://www.365konten.de/download/GoingServerlessWithAzure.pdf&quot;&gt;
        &lt;p&gt;This browser does not support PDFs. Please download the PDF to view it: &lt;a href=&quot;/download/test.pdf&quot;&gt;Download PDF&lt;/a&gt;.&lt;/p&gt;
    &lt;/embed&gt;
&lt;/object&gt;
&lt;/div&gt;
&lt;div&gt;</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Mon, 21 Aug 2023 00:00:00 GMT</pubDate></item><item><title>Welchen Seitentyp wann?</title><link>https://www.365konten.de/blog/2023-07-26/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-07-26/</guid><description>Was sind Vor- und Nachteile von Team- und Kommunikationswebseiten in SharePoint Online?</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-07-26/&quot;&gt;https://www.365konten.de/blog/2023-07-26/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;Neulich wurde mir die Frage gestellt, warum es in SharePoint denn zwei Seitentypen gibt.&lt;/h2&gt;
&lt;p&gt;Beim Erstellen einer neuen Seite haben wir die Auswahl zwischen den beiden Seitentypen &lt;em&gt;Teamseite&lt;/em&gt; und &lt;em&gt;Kommunikationswebseite&lt;/em&gt;. Die beiden Seiten unterscheiden sich auf den ersten Blick nur darin, dass bei der einen die Navigation auf der linken Seite ist und bei der anderen auf der oberen.
Auf den zweiten Blick scheint es dann so zu sein, dass ich mit einer &lt;em&gt;Teamseite&lt;/em&gt; inhaltlich alles machen könnte, was ich auch mit einer &lt;em&gt;Kommunikationswebseite&lt;/em&gt; machen kann.&lt;/p&gt;
&lt;h2&gt;Also, warum und wofür brauche ich dann diese beiden Seitentypen?&lt;/h2&gt;
&lt;p&gt;Eine &lt;em&gt;Teamseite&lt;/em&gt; ist dafür gedacht, dass du darin mit anderen zusammenarbeiten kannst. Anders ausgedrückt erstellen alle Mitglieder der Site gemeinsam Content und haben dabei mehr oder weniger dieselben Rechte. Du kannst auch recht einfach Dateien mit externen Benutzern teilen.
Um die Zusammenarbeit über das Teilen von Dateien hinaus noch einfacher zu machen, wird dir bei Erstellung einer &lt;em&gt;Teamseite&lt;/em&gt; automatisch eine M365 Gruppe und ein Teampostfach im Exchange erstellt.&lt;/p&gt;
&lt;p&gt;Den Content auf einer &lt;em&gt;Kommunikationswebseite&lt;/em&gt; sollte für eine größere Gruppe von Usern, wenn nicht sogar die gesamte Organisation relevant und sichtbar sein. Hier erstellt eine kleinere Gruppe von Autoren Content und eine große Anzahl von Personen konsumiert ihn. Wenn du eine &lt;em&gt;Kommunikationswebseite&lt;/em&gt; erstellst, dann bekommst du auch nur diese Site, sonst nicht (also bekommst du keine O365 Gruppe)&lt;/p&gt;
&lt;p&gt;In Bezug auf verfügbare Funktionen und Webparts sind auf der &lt;em&gt;Teamseite&lt;/em&gt; mehr Webparts verfügbar. Das vor allen Dingen daran, dass wir bei einer &lt;em&gt;Teamseite&lt;/em&gt; eine M365 Gruppe zur Verfügung steht. Daher machen manche dieser Webparts auch nur hier Sinn.&lt;/p&gt;
&lt;p&gt;Die folgenden Webparts sind nur auf einer &lt;em&gt;Teamseite&lt;/em&gt;, aber nicht auf einer &lt;em&gt;Kommunikationswebseite&lt;/em&gt; verfügbar&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Asana&lt;/li&gt;
&lt;li&gt;Bitbucket (and Bitbucket Server)&lt;/li&gt;
&lt;li&gt;GitHub (and GitHub Enterprise)&lt;/li&gt;
&lt;li&gt;Google Analytics&lt;/li&gt;
&lt;li&gt;Incoming Webhook&lt;/li&gt;
&lt;li&gt;JIRA&lt;/li&gt;
&lt;li&gt;Office 365 Connectors&lt;/li&gt;
&lt;li&gt;Planner&lt;/li&gt;
&lt;li&gt;RSS&lt;/li&gt;
&lt;li&gt;Salesforce&lt;/li&gt;
&lt;li&gt;Stack Overflow&lt;/li&gt;
&lt;li&gt;Trello&lt;/li&gt;
&lt;li&gt;UserVoice&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Falls Du aber ein Intranet bauen und etwa Features wie eine Homesite nutzen willst, dann muss diese Seite eine &lt;em&gt;Kommunikationswebseite&lt;/em&gt; sein.&lt;/p&gt;
&lt;p&gt;Das bedeutet nun alles das Folgende:&lt;/p&gt;
&lt;p&gt;Wenn du jetzt also deinen Fokus nur auf eine einzelne Seite legst, dann hat eine &lt;em&gt;Teamseite&lt;/em&gt; mehr Features als eine Kommunikationswebseite. In dem Sinne bräuchtest du nie &lt;em&gt;Kommunikationswebseiten&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;Aber:&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Teamseiten&lt;/em&gt; sind stark für die direkte Zusammenarbeit angepasst und kommen, wie oben schon erwähnt, fest verwoben mit einer M365 Gruppe und anderen Einstellungen.
Diese machen eine &lt;em&gt;Teamseite&lt;/em&gt; aber schwieriger zu nutzen, wenn du beispielsweise ein Intranet aufbauen möchtest, das aus potenziell hunderten von Seiten besteht. Dann müsstest du nämlich entweder all diese M365 Gruppen mit häufig denselben Berechtigungen synchron halten oder du würdest die Gruppen zugunsten einer anderen Berechtigungslösung gar nicht benutzen. In dem Fall sind die Gruppen nicht nützlich und in der Übersicht sogar eher hinderlich.&lt;/p&gt;
&lt;p&gt;Bei einer &lt;em&gt;Kommunikationsseite&lt;/em&gt; würdest du einfach eine neue &lt;em&gt;Active Directory Gruppe&lt;/em&gt; erstellen und die in den &amp;quot;Besucher&amp;quot; Gruppen auf jeder neuen Intranet Seite hinzufügen. Das ist von der Verwaltung her wesentlich einfacher.&lt;/p&gt;
&lt;p&gt;Wenn du nun also statt auf eine einzelne Seite deinen Fokus auf deinen gesamten Tenant legst, dann nehmen &lt;em&gt;Kommunikationswebseiten&lt;/em&gt; weniger Ressourcen in Anspruch und sind einfacher zu handhaben.&lt;/p&gt;
&lt;p&gt;Insbesondere wenn ich zu einem gegebenen Anwendungsfall keine Zusammenarbeitsfeatures benötige, wähle ich daher meistens eine &lt;em&gt;Kommunikationswebseite&lt;/em&gt; statt einer &lt;em&gt;Teamseite&lt;/em&gt;.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Wed, 26 Jul 2023 00:00:00 GMT</pubDate></item><item><title>Microsoft Forms, mehrere Antworten und SharePoint</title><link>https://www.365konten.de/blog/2023-08-13/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-08-13/</guid><description>Man kann in Microsoft Forms eine Multiple-Choice Frage definieren. Wie schreibe ich alle Antworten in ein SharePoint-Textfeld?</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-08-13/&quot;&gt;https://www.365konten.de/blog/2023-08-13/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Ich kann recht einfach einen PowerAutomate Workflow definieren, der startet, wenn es in einem MS Forms Formular einen neuen Eintrag gegeben hat und der dann einen neuen Eintrag in einer SharePoint Liste erstellt.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/form.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Dafür brauche ich drei Aktionen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Bei Übermitteln einer neuen Antwort&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Antwortdetails abrufen&amp;quot;. Hier setzte ich die &amp;quot;Antwort-ID&amp;quot; auf die &amp;quot;Antwort-ID&amp;quot; aus dem vorherigen Schritt.&lt;/li&gt;
&lt;li&gt;&amp;quot;Element erstellen&amp;quot;. Hier erstelle ich ein neues Element in einer SharePoint Liste und trage die Daten aus dem vorherigen Schritt ein.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/simpleflow.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;So weit so gut, aber wenn ich das Feld &amp;quot;Multiquestion&amp;quot; eine Mehrfachauswahl ist, dann sieht das Ergebnis so aus.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/SharePointResults.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Der Wert im Mehrfachauswahl-Feld wird nämlich im JSON-Format zurückgegeben. Den müssen wir parsen und umformatieren.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;[&amp;quot;Option 1&amp;quot;,&amp;quot;Option 2&amp;quot;,&amp;quot;Option 4&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dazu fügen wir zunächst eine &amp;quot;JSON analysieren&amp;quot; Aktion mit ein. In das Feld &amp;quot;Inhalt&amp;quot; fügen wir den Multichoice-Wert aus dem Formular und das folgende Schema in das &amp;quot;Schema&amp;quot;-Feld ein.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;{
    &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,
    &amp;quot;items&amp;quot;: {
        &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/JSONAnalysieren.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Damit haben wir dann alle gegebenen Antworten aus dem JSON-Format ausgelesen. Sie stehen uns nun in einem Array zur Verfügung. Dieses Array wollen wir aber umformatieren und alle Elemente in einem Textfeld als eigene Zeilen darstellen.&lt;/p&gt;
&lt;p&gt;Dazu benutzen wir nun eine &amp;quot;Verknüpfung&amp;quot; / &amp;quot;Beitreten&amp;quot; Aktion (im Englischen &amp;quot;Join&amp;quot;) und fügen in das &amp;quot;Von&amp;quot;-Feld den &amp;quot;Text&amp;quot; aus der vorherigen Aktion ein.&lt;/p&gt;
&lt;p&gt;In das &amp;quot;Verknüpfen mit&amp;quot; Feld können wir theoretisch nun jedes Zeichen einfügen. Alle Werte der Mehrfachauswahl werden mit diesem Zeichen als Trennzeichen zusammengefügt. &lt;/p&gt;
&lt;p&gt;Wir wollen aber einen Zeilenumbruch haben. Da das ein Sonderzeichen ist, müssen wir den Zeilenumbruch mittels der folgenden Formel darstellen.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;decodeUriComponent(&amp;#39;%0A&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Damit sieht die Aktion dann so aus&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/join.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Die Ausgabe dieses Feldes fügen wir nun in der  &amp;quot;Element erstellen&amp;quot; Aktion in das Textfeld für &amp;quot;MyChoiceField&amp;quot; mit ein. Das ergibt dann insgesamt diesen Flow&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/completeFlow.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Wenn nun ein neuer Eintrag in das Formular geschieht, dann wird in der SharePoint Liste der Wert entsprechend formatiert eingetragen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/formatted.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Wed, 26 Jul 2023 00:00:00 GMT</pubDate></item><item><title>Quick Tipp: Einfach eine publizierte News wieder demoten</title><link>https://www.365konten.de/blog/2023-07-19/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-07-19/</guid><description>Mit einer Json Formatierung auf der Websiteseiten-Bibliothek geht das ganz einfach.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-07-19/&quot;&gt;https://www.365konten.de/blog/2023-07-19/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Eine Neuigkeit im modernen SharePoint zu publizieren ist einfach. Ein Klick auf den &amp;quot;Höher stufen&amp;quot; (oder im Englischen &amp;quot;Promote&amp;quot;) Knopf und schon ist die aktuelle Seite als Neuigkeit geteilt.&lt;/p&gt;
&lt;p&gt;Wie macht man das aber wieder rückgängig? Im Standard über die Oberfläche geht das erst mal nicht.&lt;/p&gt;
&lt;p&gt;Sehen wir uns einmal die Websiteseiten-Bibliothek genauer an. Hier können wir eine versteckte Spalte &amp;quot;Promoted State&amp;quot; finden. Sie kann ganze Zahlen von 1 bis 3 enthalten, wobei&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 für eine normale Seite,&lt;/li&gt;
&lt;li&gt;2 für eine unpublizierte Neuigkeit und&lt;/li&gt;
&lt;li&gt;3 für eine publizierte Neuigkeit&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;steht. Wir müssen also zum &amp;quot;Runterstufen&amp;quot; einer News zu einer &amp;quot;normalen Seite&amp;quot; nur den Wert in dieser Spalte auf &amp;quot;1&amp;quot; anpassen.&lt;/p&gt;
&lt;p&gt;Leider haben wir über die Oberfläche keine Möglichkeit, dies zu tun. Es gibt vielfältige Lösungen, um diesen Wert umzusetzen, die aber im Regelfall Powershell, PowerAutomate oder andere Tools benötigen.&lt;/p&gt;
&lt;p&gt;Mittels einer eigenen Formatierung auf der Spalte können wir diese Funktionalität aber einfach selber der Oberfläche hinzufügen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Öffnen Sie die Ansicht aller Webseiten in Ihrer Websiteseiten-Bibliothek und blenden Sie die Spalte &amp;quot;Promoted State&amp;quot;, indem Sie &amp;quot;Add column&amp;quot;-&amp;gt;&amp;quot;Show or hide columns&amp;quot; auswählen und die Spalte sichtbar machen. &lt;/li&gt;
&lt;li&gt;Klicken Sie dann auf den kleinen Pfeil nach unten neben der Überschrift der Spalte und wählen Sie &amp;quot;Column Settings&amp;quot;-&amp;gt;&amp;quot;Format this column&amp;quot;. &lt;/li&gt;
&lt;li&gt;Wechseln Sie in den &amp;quot;Advanced Mode&amp;quot; und fügen Sie das folgende JSON ein:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
    &amp;quot;elmType&amp;quot;: &amp;quot;div&amp;quot;,
    &amp;quot;children&amp;quot;: [
        {
            &amp;quot;elmType&amp;quot;: &amp;quot;button&amp;quot;,
            &amp;quot;style&amp;quot;: {
                &amp;quot;display&amp;quot;: &amp;quot;=if([$PromotedState] == 1 , &amp;#39;inherit&amp;#39;,&amp;#39;none&amp;#39;)&amp;quot;,
                &amp;quot;background-color&amp;quot;: &amp;quot;transparent&amp;quot;,
                &amp;quot;cursor&amp;quot;: &amp;quot;pointer&amp;quot;,
                &amp;quot;border&amp;quot;: &amp;quot;none&amp;quot;
            },
            &amp;quot;attributes&amp;quot;: {
                &amp;quot;class&amp;quot;: &amp;quot;ms-fontColor-themePrimary ms-fontColor-themeDarker--hover&amp;quot;
            },
            &amp;quot;customRowAction&amp;quot;: {
                &amp;quot;action&amp;quot;: &amp;quot;setValue&amp;quot;,
                &amp;quot;actionInput&amp;quot;: {
                    &amp;quot;PromotedState&amp;quot;: &amp;quot;0&amp;quot;
                }
            },
            &amp;quot;children&amp;quot;: [
                {
                    &amp;quot;elmType&amp;quot;: &amp;quot;span&amp;quot;,
                    &amp;quot;attributes&amp;quot;: {
                        &amp;quot;iconName&amp;quot;: &amp;quot;SortDown&amp;quot;
                    },
                    &amp;quot;style&amp;quot;: {
                        &amp;quot;padding&amp;quot;: &amp;quot;4px&amp;quot;
                    }
                },
                {
                    &amp;quot;elmType&amp;quot;: &amp;quot;span&amp;quot;,
                    &amp;quot;txtContent&amp;quot;: &amp;quot;Demote to site page&amp;quot;
                }
            ]
        },
        {
            &amp;quot;elmType&amp;quot;: &amp;quot;button&amp;quot;,
            &amp;quot;style&amp;quot;: {
                &amp;quot;display&amp;quot;: &amp;quot;=if([$PromotedState] == 2 , &amp;#39;inherit&amp;#39;,&amp;#39;none&amp;#39;)&amp;quot;,
                &amp;quot;background-color&amp;quot;: &amp;quot;transparent&amp;quot;,
                &amp;quot;cursor&amp;quot;: &amp;quot;pointer&amp;quot;,
                &amp;quot;border&amp;quot;: &amp;quot;none&amp;quot;
            },
            &amp;quot;attributes&amp;quot;: {
                &amp;quot;class&amp;quot;: &amp;quot;ms-fontColor-themePrimary ms-fontColor-themeDarker--hover&amp;quot;
            },
            &amp;quot;customRowAction&amp;quot;: {
                &amp;quot;action&amp;quot;: &amp;quot;setValue&amp;quot;,
                &amp;quot;actionInput&amp;quot;: {
                    &amp;quot;PromotedState&amp;quot;: &amp;quot;1&amp;quot;
                }
            },
            &amp;quot;children&amp;quot;: [
                {
                    &amp;quot;elmType&amp;quot;: &amp;quot;span&amp;quot;,
                    &amp;quot;attributes&amp;quot;: {
                        &amp;quot;iconName&amp;quot;: &amp;quot;SortDown&amp;quot;
                    },
                    &amp;quot;style&amp;quot;: {
                        &amp;quot;padding&amp;quot;: &amp;quot;4px&amp;quot;
                    }
                },
                {
                    &amp;quot;elmType&amp;quot;: &amp;quot;span&amp;quot;,
                    &amp;quot;txtContent&amp;quot;: &amp;quot;Demote to unpublished news&amp;quot;
                }
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nun können Sie jede publizierte News wieder zu einer unpublizierten News zurückstufen (&amp;quot;Demote to unpublished news&amp;quot;) oder letztere wieder zu einer &amp;quot;normalen&amp;quot; Websiteseite zurückstufen (&amp;quot;Demote to site page&amp;quot;)&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Wed, 19 Jul 2023 00:00:00 GMT</pubDate></item><item><title>SharePoint Formulare mit React Formik 1/2</title><link>https://www.365konten.de/blog/2023-07-02/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-07-02/</guid><description>Mit der Version 1.15 vom SharePoint Framework können wir Formulare anpassen. Mit React Formix geht das noch einfacher.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-07-02/&quot;&gt;https://www.365konten.de/blog/2023-07-02/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Das ist ein zweiteiliges Tutorial. In diesem Teil beschreibe ich, wie man generell einen Form-Customizer aufsetzen kann und wie man ein sehr einfaches Formular erstellt. Im zweiten Teil erkläre ich, wie man auch komplizierte Formulare mittels dieser Technologie und mittels &lt;a href=&quot;https://formik.org/&quot;&gt;React Formik&lt;/a&gt; umsetzen kann.&lt;/p&gt;
&lt;h2&gt;SharePoint und Formulare&lt;/h2&gt;
&lt;p&gt;Ein häufiger Anpassungwunsch an SharePoint ist die Anpassung der Standard-Listenformulare. Normalerweise kommt man hier mit dem Standard-Listenformatting schon zu beeindruckenden Formularen, aber das stößt auch manchmal an seine Grenzen.&lt;/p&gt;
&lt;p&gt;Dann hatte ich bisher nur die Möglichkeit, dieses Formular per PowerApps zu customizen. Das geht sehr gut und einfach - hat aber ein paar Nachteile. Zum einen kann ich das Formular nicht so einfach transportieren und an eine andere Liste mit denselben Feldern hängen. Das macht ein Szenario mit einem Test- und einem Produktivsystem schwierig, ganz zu schweigen von dem Fall, dass ich mehrere hundert gleiche Listen habe, die die gleichen Formulare haben sollen.&lt;/p&gt;
&lt;p&gt;Mit der Version 1.15 vom SharePoint Framework können wir nun &amp;quot;Form Customizer&amp;quot; erstellen und Formulare in Javascript entwickeln.&lt;/p&gt;
&lt;h2&gt;Erstellen einer Liste&lt;/h2&gt;
&lt;p&gt;Erstmal brauchen wir eine Liste, auf der wir den Form-Customizer entwickeln wollen
Erstellt zunächst auf einer beliebigen SharePoint Site die Liste &amp;quot;FormCustomizer&amp;quot;. Für diesen Teil des Tutorials braucht sie keine weiteren Spalten, wir fügen aber im nächsten Teil neue Spalten mit hinzu. Legt dort aber ein Element an. &lt;/p&gt;
&lt;p&gt;Ich nehme im folgenden an, dass eine solche Liste unter der URL &amp;quot;https://&lt;meintenant&gt;.sharepoint.com/sites/&lt;MeineSite&gt;/Lists/FormCustomizer/&amp;quot; vorhanden ist.&lt;/p&gt;
&lt;h2&gt;Erstellen eines Form-Customizers&lt;/h2&gt;
&lt;p&gt;Öffnet zuerst eine Powershell und führt die folgenden Befehle aus, um ein leeres SharePoint Framework Projekt zu erstellen.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;
md react-formix-form-customizer
cd react-formix-form-customizer

npx -p yo -p @microsoft/generator-sharepoint yo @microsoft/sharepoint
# oder falls ihr @microsoft/sharepoint-spfx und yeoman lokal installiert habt
# yo @microsoft/sharepoint
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Beantwortet die nun folgenden Fragen so:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is your solution name?: react-formix-form-customizer&lt;/li&gt;
&lt;li&gt;Which type of client-side component to create?: Form Customizer&lt;/li&gt;
&lt;li&gt;Which type of client-side extension to create? Formix Form Customizer&lt;/li&gt;
&lt;li&gt;What is your Form Customizer name? FormixCustomizer&lt;/li&gt;
&lt;li&gt;Which template would you like to use?: React&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Führt danach noch das hier aus, um zusätzliche Bibliotheken zu installieren, die wir noch brauchen werden&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Shell&quot;&gt;
npm install @pnp/sp --save
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nachdem der Installationsprozess abgeschlossen ist, müssen wir noch zwei Einstellungen machen, damit die die Erweiterung testen können.&lt;/p&gt;
&lt;p&gt;Öffnet zuerst die Datei config/serve.json und passt dort alle &amp;quot;serveConfigurations&amp;quot; an. Ersetzt dort alle vier Einträge von &amp;quot;https://{tenantDomain}&amp;quot; durch &amp;quot;https://&lt;tenant&gt;.sharepoint.com/sites/&lt;MeineSeite&gt;&amp;quot; und vier Einträge von &amp;quot;/sites/mySite/Lists/MyList&amp;quot; durch &amp;quot;/sites/&lt;MeineSeite&gt;/Lists/FormCustomizer&amp;quot;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;// in serve.json
//...
   {
     &amp;quot;formixCustomizer_EditForm&amp;quot;: {
      &amp;quot;pageUrl&amp;quot;: &amp;quot;https://&amp;lt;tenant&amp;gt;.sharepoint.com/sites/MyAppPage/_layouts/15/SPListForm.aspx&amp;quot;,
      &amp;quot;formCustomizer&amp;quot;: {
        &amp;quot;componentId&amp;quot;: &amp;quot;431c36f6-3901-469f-8af2-3077d6cd39e7&amp;quot;,
        &amp;quot;PageType&amp;quot;: 8,
        &amp;quot;RootFolder&amp;quot;: &amp;quot;/sites/&amp;lt;MeineSeite&amp;gt;/Lists/FormCustomizer&amp;quot;,
        &amp;quot;ID&amp;quot;: 1,
        &amp;quot;properties&amp;quot;: {
          &amp;quot;sampleText&amp;quot;: &amp;quot;Value&amp;quot;
        }
      }
    }
}
//...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das sind die verschiedenen Konfigurationen unserer Test-Einstellungen für die &amp;quot;New&amp;quot;, &amp;quot;Edit&amp;quot; und &amp;quot;Display&amp;quot; Varianten unseres Formulars. In dem Property &amp;quot;ID&amp;quot; gebe ich an, welches ListenElement ich konkret in meinem Formular laden möchte. Unsere Liste hat nur ein Element, deswegen wähle ich hier die &amp;quot;1&amp;quot;.&lt;/p&gt;
&lt;p&gt;Ihr könnt hier aber auch die Adressen von einer existierenden Liste einpflegen und das Formular sogar gegen eine &amp;quot;produktive&amp;quot; Liste entwickeln. Ändert dafür einfach die Listen-Url und die ID des zu bearbeitenden Dokumentes.&lt;/p&gt;
&lt;p&gt;Danach füge ich gerne noch in der package.json Datei neue Scripte hinzu, über die ich den SPFx Development server einfach starten kann&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;// in serve.json
//...
{
  &amp;quot;scripts&amp;quot;: {
    &amp;quot;serve:newform&amp;quot;: &amp;quot;gulp serve --config=formixCustomizer_NewForm&amp;quot;,
    &amp;quot;serve:editform&amp;quot;: &amp;quot;gulp serve --config=formixCustomizer_EditForm&amp;quot;,
    &amp;quot;serve:viewform&amp;quot;: &amp;quot;gulp serve --config=formixCustomizer_NewForm&amp;quot;
  },
}  
//...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nun kann ich das Projekt als &amp;quot;NewForm&amp;quot; schnell mittels des folgenden Kommandos starten&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Powershell&quot;&gt;npm run serve:newform
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mein Browser öffnet sich, ich bestätige einmal das Popup zum akzeptieren der Debug Skripte und dann ich sehe den konfigurieren Form-Customizer.&lt;/p&gt;
&lt;p&gt;Ihr könnt euch den generierten Code für dieses Beispiel &lt;a href=&quot;https://github.com/365knoten/SPFxFormCustomizerReactFormik/tree/main/react-formix-form-customizer-1-AfterGeneration&quot;&gt;hier&lt;/a&gt; ansehen und herunterladen.&lt;/p&gt;
&lt;h2&gt;Anpassen des Customizers&lt;/h2&gt;
&lt;p&gt;Beziehungsweise genaugenommen sehe ich nun nichts, nur einen leeren Bildschirm. Das liegt daran, dass der Form-Customizer im Moment noch nicht mehr kann. Sehen wir uns mal den Code an.&lt;/p&gt;
&lt;p&gt;In der Datei &amp;quot;src\extensions\formixCustomizer&amp;quot; finden wir die Haupteinstiegspunkt des Projektes in der Datei &lt;strong&gt;FormixCustomizerFormCustomizer.ts&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Das Laden und Speichern der Formulardaten finden wir nicht. Das liegt daran, dass wir diese Funktionalitäten selber entwickeln und dem Form-Customizer hinzufügen müssen. Dafür haben wir in einem oberen Schritt schonmal die PnPjs Bibliothek installiert und müssen Sie nun konfigurieren.&lt;/p&gt;
&lt;p&gt;Zunächst öffnen wir die Datei &lt;strong&gt;FormixCustomizerFormCustomizer.ts&lt;/strong&gt; fügen den Import der nötigen Bibliotheken mit hinzu&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt;
import { spfi, SPFI, SPFx } from &amp;quot;@pnp/sp&amp;quot;;
import &amp;quot;@pnp/sp/webs&amp;quot;;
import &amp;quot;@pnp/sp/lists&amp;quot;;
import &amp;quot;@pnp/sp/items&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Danach fügen wir in der Klasse &amp;quot;FormixCustomizerFormCustomizer&amp;quot; oben zwei neue Klassenvariablen mit hinzu. Die eine ist die Instanz für die PnPjs Bibliothek und die andere ist das Listenitem, welches wir geladen haben.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt;
   private _spfi: SPFI;
   private _item: any={};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nun passen wir die &amp;quot;onInit&amp;quot; Methode an. Diese wird beim Start des Customizers ausgeführt. In ihr initiieren wir nun das PnPjs Objekt und laden danach direkt das Listenelement. Letzteres machen wir aber nur, wenn wir eine ListenID haben und damit auf einem Display- oder Edit-Formular sind. Auf einem &amp;quot;New&amp;quot; Formular haben wir offensichtlich kein Element, welches wir beim Start laden müssen.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt;
    public onInit(): Promise&amp;lt;void&amp;gt; {
    // Setup PnPjs
    this._spfi = spfi().using(SPFx( this.context ));

    if (this.context.itemId!==undefined){
      // itemId is set on an Edit and Displayform
      // if it is set load data from SharePoint
      return this._spfi
      .web
      .lists
      .getById(this.context.list.guid.toString())
      .items
      .getById(this.context.itemId)()
      .then((item:any)=&amp;gt;{ 
        // The following fields need to be removed from the item, if we want to save the object again
        delete item[&amp;quot;odata.editLink&amp;quot;];
        delete item[&amp;quot;odata.etag&amp;quot;];
        delete item[&amp;quot;odata.id&amp;quot;];
        delete item[&amp;quot;odata.metadata&amp;quot;];
        delete item[&amp;quot;odata.type&amp;quot;];     
        delete item.odata;
        this._item=item;
        console.log(item);
      })
    }  
    
    return Promise.resolve();
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Aus dem geladenen Objekt entfernen wir ein paar Eigenschaften wie etwa &amp;quot;odata.editLink&amp;quot;. Diese Eigenschaften würden sonst stören, wenn wir dasselbe Objekt wieder speichern werden.&lt;/p&gt;
&lt;p&gt;Jetzt passen wir noch die &amp;quot;_onSave&amp;quot; Methode an. Zum einen ändern wir die Signatur, so dass wir der Methode ein Objekt übergeben können, welches wir speichern wollen. Zum anderen prüfen wir nun, ob wir auf dem &amp;quot;Edit&amp;quot; oder &amp;quot;New&amp;quot; Formular sind und rufen danach die relevanten Methoden aus dem &amp;quot;PnPjs&amp;quot; Framework auf. Wichtig ist hierbei, dass nach dem erfolgreichen Speichern immer die Methode &amp;quot;this.formSaved()&amp;quot; aufgerufen wird. Diese sorgt dafür, dass sich das Formular beendet.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt;
    private _onSave = (item:any): void =&amp;gt; {

    // If we are in Edit Mode: Update the existing item
    if (this.displayMode === FormDisplayMode.Edit  &amp;amp;&amp;amp; this.context.itemId!==undefined) {
      this._spfi
      .web
      .lists
      .getById(this.context.list.guid.toString())
      .items
      .getById(this.context.itemId)
      .update(item)
      .then(()=&amp;gt;{
        this.formSaved();
      })
    };

     // If we are in New Mode: Create a new Item
    if (this.displayMode === FormDisplayMode.New) {
      this._spfi
      .web
      .lists
      .getById(this.context.list.guid.toString())
      .items
      .add(item)
      .then(()=&amp;gt;{
        this.formSaved();
      })
    }   
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Schließlich passen wir noch die &amp;quot;render()&amp;quot; Methode an und übergeben dem neu erstellten React Element zusätzlich noch das geladene Item als Parameter mit&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt;
   public render(): void {
    const formixCustomizer: React.ReactElement&amp;lt;{}&amp;gt; =
      React.createElement(FormixCustomizer, {
        item:this._item, // &amp;lt;-NEW
        context: this.context,
        displayMode: this.displayMode,
        onSave: this._onSave,
        onClose: this._onClose
       } as IFormixCustomizerProps);

    ReactDOM.render(formixCustomizer, this.domElement);
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Damit haben wir alle notwendigen Änderungen an der Datei &lt;strong&gt;FormixCustomizerFormCustomizer.ts&lt;/strong&gt; durchgeführt. Ihr werden in eurer IDE aber wahrscheinlich noch Fehler haben. &lt;/p&gt;
&lt;p&gt;Das liegt neben ein paar weiteren Anpassungen am Code noch daran, dass euer Typescript-Compiler sich über ein paar benutze &amp;quot;any&amp;quot; Ausdrücke und nicht abgefangene Promises beschwert. Denkt daran, dass das hier nur ein Tutorial ist und ich die entsprechende Behandlung dieser not-so-best Practices der Einfachheit halber hier nicht durchführe.&lt;/p&gt;
&lt;p&gt;Um die Warnungen zu entfernen, öffne ich die &amp;quot;.eslintrc.js&amp;quot; Datei und setze die Werte für die beiden Checks auf 0. Macht das aber nicht so in einem echten Projekt.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt;...
  &amp;#39;@typescript-eslint/no-explicit-any&amp;#39;: 0,
  &amp;#39;@typescript-eslint/no-floating-promises&amp;#39;: 0,
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auf der anderen Seite müssen wir noch in der Datei &lt;strong&gt;components/FormixCustomizer.tsx&lt;/strong&gt; das Interface &amp;quot;IFormixCustomizerProps&amp;quot; so anpassen, dass wir das geladene Item mit an die React-Komponente übergeben können.&lt;/p&gt;
&lt;p&gt;Öffnet nun die Datei &lt;strong&gt;components/FormixCustomizer.tsx&lt;/strong&gt; ..... Und löscht allen Inhalt aus ihr. Wir erstellen sie von Grund auf neu.&lt;/p&gt;
&lt;p&gt;Fügt zuerst neue Importe hinzu:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt;import * as React from &amp;#39;react&amp;#39;;
import { FormDisplayMode } from &amp;#39;@microsoft/sp-core-library&amp;#39;;
import { FormCustomizerContext } from &amp;#39;@microsoft/sp-listview-extensibility&amp;#39;;
import { PrimaryButton,DefaultButton } from &amp;quot;office-ui-fabric-react/lib/Button&amp;quot;;
import { TextField } from &amp;quot;office-ui-fabric-react&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wir laden hier neben React Objekte, die wir später brauchen, um zwischen Edit- und Display-Modus zu unterscheiden. Des weiterein laden wir noch Buttons und das TextFeld aus der UI-Fabric Bibliothek.&lt;/p&gt;
&lt;p&gt;Danach fügen wir das Interface für die Properties hinzu, die wir unserer React-Komponente &amp;quot;FormixCustomizer&amp;quot; übergeben können wollen.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt;export interface IFormixCustomizerProps {
  context: FormCustomizerContext;
  displayMode: FormDisplayMode;  
  onSave: (item:any) =&amp;gt; void;
  onClose: () =&amp;gt; void;
  item:any; //&amp;lt;-- New
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das ist praktisch identisch mit dem generierten Interface, wir haben hier nur das Attribut &amp;quot;item&amp;quot; mit hinzugefügt. Darin transportieren wir das vom Webpart geladene Element zur Komponente.&lt;/p&gt;
&lt;p&gt;Dann erstellen wir die Funktionale React Komponente &amp;quot;FormixCustomizer&amp;quot; und exportieren sie als &amp;quot;Standard-Export&amp;quot;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt;export const FormixCustomizer=(props:IFormixCustomizerProps)=&amp;gt;{

  return &amp;lt;div&amp;gt;
   &amp;lt;TextField
        name=&amp;quot;Title&amp;quot;    
        label=&amp;quot;Title&amp;quot;
      /&amp;gt;   
    &amp;lt;PrimaryButton text=&amp;quot;Save&amp;quot;/&amp;gt;
    &amp;lt;DefaultButton text=&amp;quot;Cancel&amp;quot; /&amp;gt;
  &amp;lt;/div&amp;gt;
}
export default FormixCustomizer;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dieses Formular hat nun alle Elemente, die wir verwenden wollen, aber noch keine Logik. Wir fügen daher als erstes einen &amp;quot;onClick&amp;quot;-Handler an den Cancel-Button an, der die &amp;quot;onClose&amp;quot; Methode des Webpart aufruft. Damit können wir das Formular schonmal schließen, wenn wir wollen.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt;...
 &amp;lt;DefaultButton text=&amp;quot;Cancel&amp;quot; onClick={
        ()=&amp;gt;{
          props.onClose()
        }
    }/&amp;gt;
...    
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das Textfeld hat aber noch keine Daten und wir können seine Daten noch nicht auslesen. Dazu fügen wir nun mittels der &amp;quot;React.useState&amp;quot; Methode einen dynamischen Status in der Komponente ein und verbinden diesen mit dem Textfeld.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt; ...
  const [text,setText]=React.useState(props.item.Title)
  return &amp;lt;div&amp;gt;
    &amp;lt;TextField
        name=&amp;quot;Title&amp;quot;
        value={text}
        label=&amp;quot;Title&amp;quot;
        onChange={(e,value) =&amp;gt; {
          setText(value);
        }}
      /&amp;gt;   
...      
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In der Variablen &amp;quot;text&amp;quot; ist nun immer der Wert des Textfeldes gespeichert. Jetzt müssen wir nur noch dazu sorgen, dass beim Klick auf den &amp;quot;Speichern&amp;quot;-Knopf das geladene Element angepasst und danach gespeichert wird.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt; ...
     &amp;lt;PrimaryButton text=&amp;quot;Save&amp;quot; onClick={
        ()=&amp;gt;{
          props.item.Title=text;
          props.onSave(props.item)
        }
    }/&amp;gt;
...      
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Damit sieht unsere gesamte Komponente so aus:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Javascript&quot;&gt;export const FormixCustomizer=(props:IFormixCustomizerProps)=&amp;gt;{
  const [text,setText]=React.useState(props.item.Title)
  return &amp;lt;div&amp;gt;
    &amp;lt;TextField
        name=&amp;quot;Title&amp;quot;
        value={text}
        label=&amp;quot;Title&amp;quot;
        onChange={(e,value) =&amp;gt; {
          setText(value);
        }}
      /&amp;gt;   
    &amp;lt;PrimaryButton text=&amp;quot;Save&amp;quot; onClick={
        ()=&amp;gt;{
          props.item.Title=text;
          props.onSave(props.item)
        }
    }/&amp;gt;
     &amp;lt;DefaultButton text=&amp;quot;Cancel&amp;quot; onClick={
        ()=&amp;gt;{
          props.onClose()
        }
    }/&amp;gt;
  &amp;lt;/div&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ihr könnt euch den gesamten Code für dieses Beispiel &lt;a href=&quot;https://github.com/365knoten/SPFxFormCustomizerReactFormik/tree/main/react-formix-form-customizer-2-MinimalForm&quot;&gt;hier&lt;/a&gt; ansehen und herunterladen.&lt;/p&gt;
&lt;p&gt;Wenn wir mehr Felder in dem Formular bearbeiten wollen, dann müssen wir nur mehr dynamische Status-Variablen über mehr Aufrufe von &amp;quot;React.useState&amp;quot; und diese dann mit neuen Controls verknüpfen.&lt;/p&gt;
&lt;p&gt;Bei dem letzten Satz ist euch vielleicht aufgefallen, dass dieses Vorgehen zwar einfach ist, aber natürlich auf Dauer mit einer Wachsenden Parameteranzahl zu sehr, sehr vielen Variablen und einer sehr unübersichtlichen Komponente führen wird.&lt;/p&gt;
&lt;p&gt;Wir man das mit &lt;a href=&quot;https://formik.org/&quot;&gt;React Formik&lt;/a&gt; sehr einfach halten kann, erzähle ich euch im nächsten Artikel diese Serie.&lt;/p&gt;
&lt;h3&gt;Update 09.07.2023&lt;/h3&gt;
&lt;p&gt;Den nächsten Artikel dieser Serie könnt ihr euch &lt;a href=&quot;../SPFxFormik2/&quot;&gt;hier&lt;/a&gt; ansehen.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sun, 02 Jul 2023 00:00:00 GMT</pubDate></item><item><title>Eine Vorlage für eine moderne SitePage mit Inhaltsverzeichnis</title><link>https://www.365konten.de/blog/2023-06-12/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-06-12/</guid><description>Eine Navigation mit Links innerhalb einer Seite ist praktisch. Wie kriege ich es aber hin, dass diese Links noch korrekt funktionieren, wenn ich eine Kopie dieser Seite erstellt habe?</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-06-12/&quot;&gt;https://www.365konten.de/blog/2023-06-12/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Falls du eine große und lange Seite hast, die aus mehreren Sektionen besteht, dann kennst du bestimmt das Problem: Deine Besucher müssen entweder lange scrollen, bis sie zum relevanten Inhalt kommen oder -viel schlimmer- scrollen gar nicht erst nach unten und finden relevanten Inhalt nicht.&lt;/p&gt;
&lt;p&gt;Ein Inhaltsverzeichnis auf der Seite ist praktisch und einfach gebaut. Füge einfach Text-Webparts zu deiner Seite mit hinzu (falls sie nicht eh schon vorhanden sind) und setze dort eine Überschrift (Benutze dafür die Überschriften-Vorlagen 1-4).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Headline.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Publiziere nun die Seite und bewege dann deine Maus auf die Überschrift. Hier wird nun ein kleines &amp;quot;Ketten&amp;quot; Symbol rechts daneben erscheinen. Klicke mit der rechten Maustaste darauf und wähle &amp;quot;Link kopieren&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/CopyLink.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Du hast nun einen Link zu der Überschrift in deiner Zwischenablage.&lt;/p&gt;
&lt;p&gt;Jetzt könntest oben auf der Seite ein Quick-Links Webpart erstellen und diesen Link dort einfügen. Machst du das mit mehreren Überschriften, dann hast du eine einfaches Inhaltsverzeichnis auf der Seite.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Inhaltsverzeichnis.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h1&gt;Aber&lt;/h1&gt;
&lt;p&gt;Willst du diese Seite nun kopieren oder gar als Seitenvorlage bereitstellen, dann wirst du enttäuscht sein. Die Links zeigen dann nicht auf die Überschriften in deiner Kopie, sondern immer noch auf die Überschriften im Original.&lt;/p&gt;
&lt;p&gt;Das liegt daran, dass du &amp;quot;Absolute&amp;quot; Links kopiert und in das Inhaltsverzeichnis eingefügt hast. Du brauchst hier aber relative Links, die nicht den kompletten Pfad zur Seite enthalten, sondern nur die Information, wie man vom Inhaltsverzeichnis zu den Überschriften kommt.&lt;/p&gt;
&lt;p&gt;Dazu müssen wir die Links bearbeiten, die wir uns kopiert haben.&lt;/p&gt;
&lt;p&gt;Wenn der Link vorher&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Url&quot;&gt;https://&amp;lt;tenant&amp;gt;.sharepoint.com/sites/&amp;lt;meineSite&amp;gt;/SitePages/&amp;lt;meinePage&amp;gt;.aspx#%C3%BCberschrift-1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;war, dann brauchen wir nur den Anteil nach dem HashTag, also nur&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Url&quot;&gt;#%C3%BCberschrift-1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Diesen Link können wir aber leider nicht in das Quicklinks- oder Button- Webpart einfügen. &lt;/p&gt;
&lt;p&gt;Selbst als einfacher Link in einem Text Webpart lässt SharePoint dies nicht zu.&lt;/p&gt;
&lt;p&gt;Der Grund ist, dass aus Sicherheitsgründen SharePoint immer eine komplette URL startend mit &amp;quot;https://&amp;quot; verlangt.&lt;/p&gt;
&lt;h1&gt;Markdown&lt;/h1&gt;
&lt;p&gt;Es gibt aber ein Webpart, mit dem wir das umgehen können. Das ist das &amp;quot;Markdown&amp;quot; Webpart.&lt;/p&gt;
&lt;p&gt;Markdown ist eine textbasierte Dokumentationssprache, mit der man textbasiert sehr einfach formatierte Inhalte und Dokumente erstellen kann.&lt;/p&gt;
&lt;p&gt;Beispielsweise wird aus&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Markdown&quot;&gt;# Das ist eine Überschrift

Das ist einfacher Text.

* Das ist der erste Punkt einer Aufzählung 
* Das ist der zweite Punkt
* Das ist der dritte Punkt

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;das hier&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Markdown.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Man kann auch Links einfügen und das machen wir uns nun zu Nutze. Wir fügen ein Markdown-Webpart zur Seite hinzu und fügen unsere Links in dem folgenden Format ein&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Markdown&quot;&gt;[Überschrift 1](#%C3%BCberschrift)

[Überschrift 2](#%C3%BCberschrift-2)

[Überschrift 3](#%C3%BCberschrift-3)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;![](./Markdown Webpart.png)&lt;/p&gt;
&lt;p&gt;Damit sieht unsere Seite dann so aus.... Und wenn wir sie kopieren zeigen die Überschriften-Links auf die Sektionen der aktuellen Seite&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/teaser.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Mon, 12 Jun 2023 00:00:00 GMT</pubDate></item><item><title>Power Automate: Bessere Logs</title><link>https://www.365konten.de/blog/2023-05-19/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-05-19/</guid><description>Falls man nur einen Flow hat, ist die Überwachung davon recht einfach. Falls man viele Flows hat, die fachlich ineinandergreifen, wird das schwieriger</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-05-19/&quot;&gt;https://www.365konten.de/blog/2023-05-19/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Flows sind mächtig. Ich kann mir einfache Benachrichtigungsflows bauen, aber auch komplexe Prozesse erstellen, die mir im Minutenzyklus aus mehreren Systemen Daten aggregieren und selbst aus mehreren Teilflows bestehen.&lt;/p&gt;
&lt;p&gt;Wie behalte ich aber einen Überblick über alle meine Flow-Läufe? Ich meine das hier nicht technisch. Dass ein einzelner Flow auf einen Fehler läuft ist leicht zu erkennen. Was ist aber, wenn ein Flow, der hätte laufen sollen, nicht gelaufen ist?&lt;/p&gt;
&lt;p&gt;WEnn ich mit einem komplexen Geflecht von Workflows zu tun habe, erstelle ich mir normalerweise noch zusätzlich ein paar Listen im Dataverse, in denen ich dann zusätzliche Informationen zu Flowläufen hinterlege. Das sind normalerweise die drei Tabellen  &amp;quot;Process-Runs&amp;quot;,&amp;quot;Sub-Process-Runs&amp;quot;,&amp;quot;Process-Messages&amp;quot;.&lt;/p&gt;
&lt;p&gt;In der Tabelle &amp;quot;Process-Runs&amp;quot; hinterlege ich beim Start der Hauptprozesses alle relevanten Informationen&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spalte&lt;/th&gt;
&lt;th&gt;Beschreibung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Process-Name&lt;/td&gt;
&lt;td&gt;Der Name des Prozesses, der angestoßen wurde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process-Params&lt;/td&gt;
&lt;td&gt;Die Relevanten Parameter, die dem Prozess übergeben wurden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process-Run-ID&lt;/td&gt;
&lt;td&gt;Eine beim Start zufällig erzeugte guid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process-Start&lt;/td&gt;
&lt;td&gt;Der Zeitpunkt, an dem der Flow gestartet wurde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process-End&lt;/td&gt;
&lt;td&gt;Der Zeitpunkt, an dem der Flow beendet wurde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process-LastModified&lt;/td&gt;
&lt;td&gt;Der Zeitpunkt, an dem aus dem Flow das letzte Mal eine Aktualisierung an diese Liste geschrieben wurde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process-State&lt;/td&gt;
&lt;td&gt;Ein TextFeld, welches von innerhalb des Prozesses aktualisiert wird und mit den aktuellen Status anzeigt (z.B. &amp;quot;Initialisierung&amp;quot;,&amp;quot;Datenanlagephase&amp;quot;,&amp;quot;Ende&amp;quot; etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In diese Liste schreibe ich nun einen neuen Eintrag, sobald der Hauptprozess gestartet wurde und setzte den Status und das Start_Datum. Wann immer der Flow eine bestimmte Phase durchlaufen hat, aktualisiere ich diesen Eintrag in der Tabelle, bis der Flow beendet ist.&lt;/p&gt;
&lt;p&gt;Damit habe ich schon mal eine gute Grundlage zur Dokumentation und Überwachung meines Flows. Mittels dieser Tabelle kann ich nun recht einfach erkennen, ob ein Flow gestartet wurde und sich nicht innerhalb einer halbwegs erwarteten Zeit wieder beendet hat. Das kann ich zum Beispiel durch einen weiteren Flow überprüfen lassen, den ich zeitgesteuert regelmässig ausführe.&lt;/p&gt;
&lt;p&gt;Manchmal macht es Sinn, einzelne Blöcke eines Flows in Child-Flows auszulagern. Oder wir iterieren in einer Schleiße über viele Elemente und wollen jeden einzelnen Schleifenablauf einzeln dokumentieren. Dazu benutze ich dann die Tabelle &amp;quot;Sub-Process-Runs&amp;quot;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spalte&lt;/th&gt;
&lt;th&gt;Beschreibung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Sub-Process-Name&lt;/td&gt;
&lt;td&gt;Der Name des Prozesses, der angestoßen wurde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-Process-Params&lt;/td&gt;
&lt;td&gt;Die Relevanten Parameter, die dem Prozess übergeben wurden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process-Run-ID&lt;/td&gt;
&lt;td&gt;Die Guid des übergeordneten Flows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process-State&lt;/td&gt;
&lt;td&gt;Der Status des übergeordneten Flows, zu dem dieser Childflow gehört&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-Process-Run-ID&lt;/td&gt;
&lt;td&gt;Eine beim Start zufällig erzeugte guid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-Process-Start&lt;/td&gt;
&lt;td&gt;Der Zeitpunkt, an dem der Flow gestartet wurde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-Process-End&lt;/td&gt;
&lt;td&gt;Der Zeitpunkt, an dem der Flow beendet wurde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-Process-LastModified&lt;/td&gt;
&lt;td&gt;Der Zeitpunkt, an dem aus dem Flow das letzte Mal eine Aktualisierung an diese Liste geschrieben wurde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-Process-State&lt;/td&gt;
&lt;td&gt;Ein TextFeld, welches von innerhalb des Prozesses aktualisiert wird und mit den aktuellen Status anzeigt (z.B. &amp;quot;Initialisierung&amp;quot;,&amp;quot;Datenanlagephase&amp;quot;,&amp;quot;Ende&amp;quot; etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Die Tabelle ist analog zur &amp;quot;Process-Run&amp;quot; Tabelle aufgebaut. Hier ist nur das Feld &amp;quot;Process-Run-ID&amp;quot; zusätzlich vorhanden, mit dem ich auf den aufrufenden Flow in der &amp;quot;Process-Run&amp;quot; Tabelle verweise.&lt;/p&gt;
&lt;p&gt;Wenn ich nun einen Childflow starte oder in einer Schleife Elemente bearbeite, erstelle ich immer einen Eintrag in dieser Tabelle und setzte entsprechend Statuswerte und Zeitstempel um, wenn es erforderlich wird.&lt;/p&gt;
&lt;p&gt;Schließlich erstelle ich noch die letzte Tabelle &amp;quot;Process-Messages&amp;quot;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Spalte&lt;/th&gt;
&lt;th&gt;Beschreibung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Process-Run-ID&lt;/td&gt;
&lt;td&gt;Die Guid des übergeordneten Flows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sub-Process-Run-ID&lt;/td&gt;
&lt;td&gt;Die Guid des übergeordneten Child Flows (leer, wenn die Nachricht aus dem Hauptflow geschrieben wird)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process-Message-Date&lt;/td&gt;
&lt;td&gt;Der Zeitpunkt, an dem die Nachricht geschrieben wurde&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process-Message-Type&lt;/td&gt;
&lt;td&gt;Der Typ der Nachricht, zum Beispiel  &amp;quot;PROCESSING_ITEM&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Process-Message-Params&lt;/td&gt;
&lt;td&gt;Die Parameter der Nachricht, zum Beispiel eine Item ID&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In diese Liste schreibe ich nun Nachrichten, wenn ich bestimmte Phasen in meinen Workflows durchlaufe. Im Prinzip resultiert das ganze dann in einer Log-Datei über mehrere Flow Aufrufe nur für meinen aktuellen Process-Run.&lt;/p&gt;
&lt;p&gt;Die ganzen Daten stehen dann als Werte im Dataverse und ich könnte Sie da auswerten. Das ist aber ein wenig mühselig, weswegen ich mir normalerweise nun eine kleine PowerApp baue, in der ich mir die Daten visualisiere.&lt;/p&gt;
&lt;p&gt;Zunächst erstelle ich einen Screen, in auf dem ich alle &amp;quot;Process-Runs&amp;quot; zu einem komplexen Workflow darstelle:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/processruns.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Wenn ich auf einen konkreten Run klicke gelange ich auf einen Detailscreen zu diesem Run. Darauf stelle ich von links nach rechts alle möglichen Phasen des Workflows dar. Zu jeder Phase liste ich die durchlaufenden Childflows aus der Tabelle &amp;quot;Sub-Process-Runs&amp;quot; zu diesem Flow auf.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/teaser.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Über einen Klick auf einen der Pfleile nach rechts gelangt man auf eine Ansicht, in der ich alle Log-Einträge aus der Tabelle &amp;quot;Process-Messages&amp;quot; darstelle.&lt;/p&gt;
&lt;p&gt;Über diese App kann ich mir nun einfach den Status meines Workflows live anzeigen.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Fri, 19 May 2023 00:00:00 GMT</pubDate></item><item><title>Quick Tipp: Das Site Logo einer Site entfernen</title><link>https://www.365konten.de/blog/2023-05-06/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-05-06/</guid><description>Es gibt keine Option auf der Oberfläche, um das Logo zu entfernen, falls du es nicht haben möchtest.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-05-06/&quot;&gt;https://www.365konten.de/blog/2023-05-06/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Es ist aber sehr einfach, das Logo zu &amp;quot;entfernen&amp;quot;&lt;/p&gt;
&lt;p&gt;Erstelle dir einfach eine PNG Datei, die aus einem transparenten Hintergrund besteht und füge diese als Logo ein.&lt;/p&gt;
&lt;p&gt;Hier ist ein Beispiel für eine solche Datei (&lt;a href=&quot;/download/emptyimage.png&quot;&gt;Download&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Das ganze sieht dann so aus&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/resultat.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Fri, 05 May 2023 00:00:00 GMT</pubDate></item><item><title>Quick Tipp: Alle Elemente in einer Liste per Powershell löschen </title><link>https://www.365konten.de/blog/2023-04-05/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-04-05/</guid><description>Falls das zu viele Elemente für die Oberfläche sind</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-04-05/&quot;&gt;https://www.365konten.de/blog/2023-04-05/&lt;/a&gt;&lt;/blockquote&gt; &lt;pre&gt;&lt;code class=&quot;language-Powershell&quot;&gt;Connect-PnPOnline &amp;quot;https://tenant.sharepoint.com/sites/meineseite&amp;quot; -Interactive

$listname=&amp;quot;meinlistenname&amp;quot;

Get-PnPListItem -List $listname -PageSize 500 |foreach-object {Remove-PnPListItem -List $listname -Identity $_.Id -Force}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Wed, 05 Apr 2023 00:00:00 GMT</pubDate></item><item><title>Maximale Anzahl von Elementen in einer Liste? 5.000 vs 30.000.000</title><link>https://www.365konten.de/blog/2023-03-16/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-03-16/</guid><description>Im Internet findet man dazu gegenläufige Informationen. Was ist denn nun richtig?</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-03-16/&quot;&gt;https://www.365konten.de/blog/2023-03-16/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Wenn wir uns &lt;a href=&quot;https://learn.microsoft.com/de-de/office365/servicedescriptions/sharepoint-online-service-description/sharepoint-online-limits#items-in-lists-and-libraries&quot;&gt;diese &amp;quot;Microsoft Learn&amp;quot;&lt;/a&gt; Seite anschauen, dann steht da, dass ich 30 Millionen Elemente in einer Liste, bzw. 30 Millionen Dateien in einer Bibliothek speichern kann. &lt;/p&gt;
&lt;p&gt;&lt;em&gt;Super, also kann ich problemlos meine ca. 50.000 Elemente in meiner Liste speichern und damit arbeiten.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So einfach ist das leider nicht, sondern sogar recht kompliziert. Dieses 30-Millionen-Elemente ist wirklich das theoretische maximale Limit für Elemente in einer Liste. Du wirst aber in der Praxis vorher schon an andere Limits stoßen.&lt;/p&gt;
&lt;p&gt;Generell solltest du dir den folgenden Satz merken&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;SharePoint ist keine Datenbank&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Auch wenn SharePoint und Datenbanken im ersten Moment vielleicht ein paar oberflächliche Ähnlichkeiten gibt, arbeiten die Systeme im Hintergrund komplett unterschiedlich. &lt;/p&gt;
&lt;p&gt;Datenbanken sind auf große Datenmengen und Verknüpfungen zwischen Tabellen ausgelegt. Dinge wie etwa eine Elementhistorie sind hier nicht vorgesehen.&lt;/p&gt;
&lt;p&gt;SharePoint auf der anderen Seite sind für Zusammenarbeit zwischen Menschen gedacht, also etwa für das Erstellen von Aufgabenlisten. Große Datenmengen waren hier nie im Fokus.&lt;/p&gt;
&lt;p&gt;Aber schauen wir uns das Thema mal genau an und erzeugen zuerst mal eine Liste mit nur 6000 Elementen. Ich mache das hier per Powershell. Ich füge auch noch ein weiteres Feld &amp;quot;Even&amp;quot; mit hinzu, in dem ich speichere, ob das Element mit einer geraden Nummer oder einer ungeraden Nummer eingefügt wurde.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Powershell&quot;&gt;Connect-PnPOnline &amp;quot;https://tenant.sharepoint.com/sites/meineseite&amp;quot; -Interactive
$listTitle=&amp;quot;LargeList&amp;quot;

New-PnPList -Title $listTitle -Template GenericList
Add-PnPField -List $listTitle -DisplayName &amp;quot;Even&amp;quot; -InternalName &amp;quot;Even&amp;quot; -Type Boolean

1..6000 |ForEach-Object {
    Add-PnPListItem -List $listTitle -Values @{&amp;quot;Title&amp;quot; = &amp;quot;Item $($_)&amp;quot;; &amp;quot;Even&amp;quot;=(($_ % 2) -eq 0)}
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das sieht auf den ersten Blick super aus. Auf den zweiten Blick erkennen wir aber schon einige Probleme. Zunächst haben wir eine Warnung in den Listeneinstellungen darüber, dass wir mehr als 5000 Elemente in der Liste haben. Wichtiger ist es aber, dass wir die Liste nicht mehr filtern können. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/teaser.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;5.000 Elemente in einer Ansicht&lt;/h2&gt;
&lt;p&gt;Das Problem liegt in der Art und Weise, wie SharePoint Daten aus der &amp;quot;internen&amp;quot; SharePoint Datenbank lädt. Da man im SharePoint Möglichkeiten hat Daten zu filtern, die es in der unterliegenden Datenbank nicht gibt, macht die SharePoint Applikation dieses selber. Das bedeutet, dass SharePoint zunächst alle Daten aus seiner Datenbank lädt und danach im Hauptspeicher des Servers filtert. Dieses Filtern ist aber aufwändig und daher auf 5000 Elemente beschränkt.&lt;/p&gt;
&lt;p&gt;Daher kommt das erste Limit. Man kann zwar viele Elemente im SharePoint speichern, aber maximal 5000 Elemente auf einen Rutsch aus der Liste ausladen. &lt;/p&gt;
&lt;p&gt;Um mit mehr Daten in der Liste arbeiten zu können müssen wir dafür sorgen, dass unsere erwarteten Ergebnisse schon in den 5000 Elementen sind, die initial vom SharePoint aus der Datenbank ausgeladen werden. Das erreichen wir durch eine geschickte Kombination von Indices und der Formulierung der Abfrage.&lt;/p&gt;
&lt;p&gt;Über einen Index können wir die Elemente schon in der Datenbank des SharePoint filtern, bevor sie in den SharePoint geladen werden. Dazu gehen wir in die Listeneinstellungen, klicken auf &amp;quot;Indizierte Spalten&amp;quot; und fügen eine neue Spalte als Index hinzu. Wir können sogar zwei Spalten in einem Index verbinden.&lt;/p&gt;
&lt;p&gt;Das können wir in unserem Beispiel etwa mit der &amp;quot;Even&amp;quot; Spalte machen. Darin sind 3000 Elemente mit &amp;quot;true&amp;quot; und 3000 Elemente mit &amp;quot;false&amp;quot; enthalten. Jede der Teilsummen ist kleiner als 3000 Elemente. Wenn wir nun zuerst nach &amp;quot;Even&amp;quot; filtern und danach nach einem anderen Wert können wir auch eine Liste mit mehr als 5000 Elementen filtern.&lt;/p&gt;
&lt;p&gt;Das Vorgehen muss aber geplant werden. Wenn wir etwa eine Liste mit 50.000 Elementen haben, dann brauchen einen komplexeren Index. Zum Beispiel können wir ein Feld &amp;quot;Quartal&amp;quot; einführen, in dem wir eine Kombination aus &amp;quot;Quartal&amp;quot; und &amp;quot;Jahr&amp;quot; (z.B. &amp;quot;2023/1&amp;quot;) speichern. Je nach unserem Anwendungsfall haben wir vielleicht weniger als 5000 Elemente pro Quartal. Wenn dieses Feld nun im Index ist, dann können wir zuerst nach den Quartal und dann danach nach unseren anderen Werten filtern.&lt;/p&gt;
&lt;p&gt;Problematischer wird es, wenn wir mehr als 5000 Elemente in einem Rutsch aus einer Liste laden wollen. Ein Anwendungsfall wäre es etwa, wenn ich alle Elemente einer Liste exportieren möchte. Das müssen wir in mehreren Abfragen mittels eines Index machen und dann die Ergebnisse wieder zusammensetzen. Dazu gibt es aber in der Oberfläche keine einfache Möglichkeit und wir müssten etwas programmieren.&lt;/p&gt;
&lt;h2&gt;100.000 Elemente&lt;/h2&gt;
&lt;p&gt;Je mehr Elemente ich in einer Liste habe, desto mehr Funktionalitäten werden out-of-the-box nicht mehr so funktionieren, wie sie mit weniger als 5000 Elementen funktionieren würden. Ein weiteres Beispiel dafür sind Berechtigungen auf einzelnen Elementen.&lt;/p&gt;
&lt;p&gt;Bei wenigen Elementen in einer Liste kann ich problemlos einem einzelnen Element andere Berechtigungen geben, als den anderen. Beispielsweise könnte ich ein einzelnes Element nur für Mitglieder einer Abteilung sichtbar machen.&lt;/p&gt;
&lt;p&gt;Je mehr ich diese Einzel-Element Berechtigungen aber benutze und je mehr Elemente ich in meiner Liste habe, desto weniger gut wird das funktionieren. Zum einen werden mit die Berechtigungen die korrekte Erstellung von Indices schwieriger machen, zum andern wird das Laden von Elementen aus meiner Liste langsamer und langsamer werden, je mehr Einzelberechtigungen ich benutze. Bei 100.000 Elementen in einer Liste funktionieren Einzelberechtigungen gar nicht mehr.&lt;/p&gt;
&lt;p&gt;Ich persönlich empfehle euch, generell wenige Einzelberechtigungen auf Listen zu verwenden. Am besten erstellt ihr mehrere Listen und berechtigt die kompletten Listen für verschiedene Berechtigungsgruppen und verschiebt die Elemente zwischen diesen Listen. Das hilft auch gleichzeitig dabei, die Anzahl der Elemente in den Listen klein zu halten.&lt;/p&gt;
&lt;h2&gt;30.000.000 Elemente&lt;/h2&gt;
&lt;p&gt;Das ist die wirklich theoretische Maximalanzahl von Elementen in einer Liste. Rein praktisch werdet ihr niemals an diesen Wert kommen, sondern schon viel, viel früher an etwas anderem scheitern&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Thu, 16 Mar 2023 00:00:00 GMT</pubDate></item><item><title>Quick Tipp: Alle Elemente mit eigenen Berechtigungen in einer Site auflisten</title><link>https://www.365konten.de/blog/2023-03-05/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-03-05/</guid><description>Manchmal sind irgendwo in einem Unterordner noch Dateien geteilt</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-03-05/&quot;&gt;https://www.365konten.de/blog/2023-03-05/&lt;/a&gt;&lt;/blockquote&gt; &lt;pre&gt;&lt;code class=&quot;language-Powershell&quot;&gt;Connect-PnPOnline &amp;quot;https://tenant.sharepoint.com/sites/meineseite&amp;quot; -Interactive


# Skip these list names
$skipTheseLists = @(
    &amp;quot;Style Library&amp;quot;, 
    &amp;quot;Form Templates&amp;quot;,
    &amp;quot;Site Assets&amp;quot;,
    &amp;quot;Site Pages&amp;quot;
)

# Iterate through all lists
Get-PnPList -Includes HasUniqueRoleAssignments | Where-Object { $_.Hidden -eq $false -And -Not $skipTheseLists.contains($_.Title) } | ForEach-Object {
    
    Write-host &amp;quot;Checking for Items with UniqueRoleAssignments in List $($_.Title)&amp;quot;
    
    #Iterate through all items
    Get-PnPListItem -List $_.Title -PageSize 2000 | ForEach-Object {           
    
        $HasUniquePermissions = Get-PnPProperty -ClientObject $_ -Property &amp;quot;HasUniqueRoleAssignments&amp;quot;
        If ($HasUniquePermissions) {
            Write-Host -f Green &amp;quot;Item($($_.ID)) &amp;#39;$($_[&amp;quot;Title&amp;quot;])&amp;#39; has Unique Permissions&amp;quot;
        }
    
    }
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sun, 05 Mar 2023 00:00:00 GMT</pubDate></item><item><title>Wie entferne ich das &apos;Titel&apos; Feld in meiner SharePoint Liste?</title><link>https://www.365konten.de/blog/2023-02-16/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-02-16/</guid><description>Ich brauche das nicht, wie bekomme ich das weg?</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-02-16/&quot;&gt;https://www.365konten.de/blog/2023-02-16/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Diese Frage habe ich schon häufig gehört. Gerade dann, wenn Benutzer eine neue Liste mit vielen eigenen Spalten erstellt haben, fragen sie sich, wie man diese unnütze Titel Spalte entfernen kann. Nun, darauf gibt es zwei Antworten.&lt;/p&gt;
&lt;h2&gt;1) Die Titelspalte ausblenden&lt;/h2&gt;
&lt;p&gt;Das Entfernen der Spalte ist nicht möglich, sie wird intern benötigt. Man kann sie aber einfach ausblenden. Zunächst muss ich dafür sorgen, dass sie kein Pflichtfeld mehr ist.&lt;/p&gt;
&lt;p&gt;Dazu wähle ich &amp;quot;Rädchen&amp;quot;-&amp;gt;&amp;quot;Listeneinstellungen&amp;quot;,&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/listeneinstellungen.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;dann suche ich die Spalte &amp;quot;Titel&amp;quot; und setze den Haken bei &amp;quot;Diese Spalte muss Informationen enthalten:&amp;quot; auf &amp;quot;Nein&amp;quot;. Danach kehre ich zur Listenansicht zurück.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Informationen.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Um die Titel Spalte in der View zu entfernen klicke ich auf &amp;quot;+ Spalte hinzufügen&amp;quot;,&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/spaltehinzufuegen.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;dann auf &amp;quot;Spalten ein-/ausblenden&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/einausblenden.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;und entferne den Haken bei &amp;quot;Titel&amp;quot;. Das hat aber keine Auswirkungen auf die Formulare. &lt;/p&gt;
&lt;p&gt;Um die Spalte vom Formular zu entfernen muss ich erst auf &amp;quot;+ Neu&amp;quot; klicken, um ein neues Element zu erstellen und dann oben rechts das kleine Menue auswählen und &amp;quot;Spalten bearbeiten&amp;quot; klicken.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Spaltenbearbeiten.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Dort entferne ich den Haken bei &amp;quot;Titel&amp;quot; und speichere. Danach taucht das Feld auch auf den Formularen nicht mehr auf.&lt;/p&gt;
&lt;p&gt;Soweit so gut, aber...&lt;/p&gt;
&lt;h2&gt;2) MACHT DAS NICHT&lt;/h2&gt;
&lt;p&gt;Die Spalte &amp;quot;Titel&amp;quot; ist sehr sinnvoll und ihr braucht sie mit ziemlicher Sicherheit. Sie ist dafür gedacht, dem Leser eine intuitive Zusammenfassung des Listenelements zu geben, damit der Leser auf einen Blick erkennen kann, was das für ein Listenelement ist.&lt;/p&gt;
&lt;p&gt;So eine Spalte werdet ihr sehr, sehr wahrscheinlich in eurem Datenmodell haben. Zum Beispiel könnte das eine Auftrags- oder Bestellnummer sein. Benennt doch die Titelspalte einfach entsprechend um und entfernt diese andere Spalte.&lt;/p&gt;
&lt;p&gt;Die Titelspalte umzubenennen ist ganz einfach. Wählt einfach &amp;quot;Spalteneinstellungen&amp;quot; und dann &amp;quot;Umbenennen&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/umbenennen.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Die Titelspalte ist nämlich wichtig und wird an vielen Stellen der Oberfläche benutzt. Falls ihr Sie nicht benutzt, dann habt ihr an vielen Stellen mehr Aufwand.&lt;/p&gt;
&lt;p&gt;Zum Beispiel ist das Kontextmenue an dieses Titelfeld gebunden, genauso wie die &amp;quot;Teilen&amp;quot;- und &amp;quot;Kommentar&amp;quot; Funktionen&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/kontextmenue.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Wenn das Titelfeld nicht da ist, dann ist auch dieses Kontextmenue nicht da.&lt;/p&gt;
&lt;p&gt;Falls ihr &amp;quot;Nachschlagen&amp;quot;- oder &amp;quot;Lookup&amp;quot;-Felder erstellt, dann zeigen die im Standard auch immer auf das Titelfeld der Liste. Und von solchen Beispielen gibt es sehr, sehr viele.&lt;/p&gt;
&lt;p&gt;Ihr tut euch also selber keinen Gefallen, wenn ihr das Titelfeld ausblendet. Versucht besser, in das Titelfeld andere Daten einzutragen und es dann nach euren Bedürfnissen umzubenennen.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Thu, 16 Feb 2023 00:00:00 GMT</pubDate></item><item><title>Listenelemente oder Dokumente, die nur ich und ein Admin sehen kann</title><link>https://www.365konten.de/blog/2023-02-06/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-02-06/</guid><description>Was muss ich denn machen, wenn ich Elemente in einer Liste brauche, die nur der Ersteller und etwa der Vorgesetzte sehen können sollen?</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-02-06/&quot;&gt;https://www.365konten.de/blog/2023-02-06/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Das ist eine häufig gestellte Anforderung. Ich als Mitarbeiter soll/muss in einer Liste Daten eintragen, die aber außer mir und einem Vorgesetzten/Prozessverantwortlichen niemand sonst sehen soll.&lt;/p&gt;
&lt;p&gt;Das kann ich mittels eines Power Automate Prozesses lösen, der bei jedem Element die Berechtigungen neu setzt. Brauche ich aber nicht.&lt;/p&gt;
&lt;p&gt;Ich kann das nämlich einfach mit SharePoint Bordmitteln lösen. In diesem Beispiel erstelle ich dazu zunächst eine Liste. Mit einer Dokumentenbibliothek geht es aber genauso.&lt;/p&gt;
&lt;p&gt;Bei dieser Liste öffne ich die Listeneinstellungen (&amp;quot;Rädchen&amp;quot;-&amp;gt;&amp;quot;Listeneinstellungen&amp;quot;) und öffne dort &amp;quot;Erweiterte Einstellungen&amp;quot;. Dort ist der Abschnitt &amp;quot;Berechtigungen auf Elementebene&amp;quot; für mich interessant.&lt;/p&gt;
&lt;p&gt;Hier ändere ich den &amp;quot;Lesezugriff auf &amp;quot;Elemente lesen, die vom Benutzer erstellt wurden&amp;quot; und den &amp;quot;Erstellungs- und Bearbeitungszugriff&amp;quot; auf &amp;quot;Elemente erstellen und bearbeiten, die vom Benutzer erstellt wurden&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/teaser.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nun kann ich als Benutzer immer noch Elemente in meiner Liste erstellen und sehen, welche Elemente ich erstellt habe.&lt;/p&gt;
&lt;p&gt;Was ist jetzt mit dem Vorgesetzten? Den mache ich zum Websitesammlungsadministrator.
Geht dazu zu &amp;quot;Rädchen&amp;quot;-&amp;gt;Websiteinformationen-&amp;gt;&amp;quot;Alle Websiteinformationen anzeigen&amp;quot;-&amp;gt;&amp;quot;Websiteberechtigungen&amp;quot; und klickt dann oben auf &amp;quot;Websitesammlungsadministratoren&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/websiteadmistratoren.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Diese Benutzer haben Rechte auf alles in der Site (Tatsächlich ist bei ihnen die Berechtigungsprüfung technisch einfach ausgeschaltet). Damit kann ein Websitesammlungsadministrator auch wiederum alle Elemente in unserer Liste lesen. Also fügen wir den Vorgesetzten hier mit ein.&lt;/p&gt;
&lt;p&gt;Das bedeutet aber auch, dass der Vorgesetzte alles andere auf dieser Website sehen und bearbeiten kann. Was ist, wenn ich das nicht will?&lt;/p&gt;
&lt;p&gt;Das ist eine Frage der Architektur deiner SharePoint Seiten. Ich persönlich tendiere dazu, viele Seiten zu haben, aber in jeder Seiten wenige oder gar nur einen Anwendungsfall abzubilden. Also würde ich eine komplett eigene Webseite haben, in der nur diese eine Liste liegt. Damit gibt es kein weiteres Berechtigungsproblem.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Mon, 06 Feb 2023 00:00:00 GMT</pubDate></item><item><title>Power Automate und SharePoint Location Spalten passen nicht zusammen</title><link>https://www.365konten.de/blog/2023-01-29/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-01-29/</guid><description>Mit den PowerAutomate Standard-Aktionen gibt es Probleme bei SharePoint Location Spalten</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-01-29/&quot;&gt;https://www.365konten.de/blog/2023-01-29/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Wenn ihr im SharePoint eine Liste erstellt, dort eine Spalte vom Typ &amp;quot;Location&amp;quot; hinzufügt und auch noch einstellt, dass sie Informationen enthalten muss, dann funktioniert das in SharePoint sehr gut. Ich kann dann dort nach einer Adresse suchen und bekomme automatisch alle Informationen wie Straße, Postleitzahl etc.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/SpLocation.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Versuche ich dann aber mit PowerAutomate auf diese SharePoint Liste zuzugreifen, dann bekomme ich diese Fehlermeldung:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The dynamic operation request to API &amp;#39;sharepointonline&amp;#39; operation &amp;#39;GetTable&amp;#39; failed with status code &amp;#39;BadRequest&amp;#39;. This may indicate invalid input parameters. Error response: { &amp;quot;status&amp;quot;: 400, &amp;quot;message&amp;quot;: &amp;quot;The required field &amp;quot;Location&amp;quot; data type is not supported clientRequestId: d910e62e-3d24-4c76-90cf-af6075b93ab5 serviceRequestId: d910e62e-3d24-4c76-90cf-af6075b93ab5&amp;quot; }&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mit dem Spaltentyp &amp;quot;Location&amp;quot; scheinen die PowerAutomate Aktionen nicht wirklich gut umgehen zu können.&lt;/p&gt;
&lt;h2&gt;Ein Location Feld auslesen&lt;/h2&gt;
&lt;p&gt;Das ist aber nicht weiter schlimm, dafür haben wir die &amp;quot;Send an HTTP request to SharePoint&amp;quot; Aktion.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/GetItems.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Als Ergebnis bekommen wir für unser Location Feld das hier&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;{
    ...
     &amp;quot;Location&amp;quot;:&amp;quot;{\&amp;quot;EntityType\&amp;quot;:\&amp;quot;LocalBusiness\&amp;quot;,\&amp;quot;LocationSource\&amp;quot;:\&amp;quot;Bing\&amp;quot;,\&amp;quot;LocationUri\&amp;quot;:\&amp;quot;https://www.bingapis.com/api/v6/localbusinesses/YN873x16209519703153017334\&amp;quot;,\&amp;quot;UniqueId\&amp;quot;:\&amp;quot;https://www.bingapis.com/api/v6/localbusinesses/YN873x16209519703153017334\&amp;quot;,\&amp;quot;DisplayName\&amp;quot;: \&amp;quot;Microsoft Corporation\&amp;quot;,\&amp;quot;Address\&amp;quot;:{\&amp;quot;Street\&amp;quot;: \&amp;quot;1 Microsoft Way\&amp;quot;,\&amp;quot;City\&amp;quot;: \&amp;quot;Redmond\&amp;quot;,\&amp;quot;State\&amp;quot;: \&amp;quot;WA\&amp;quot;,\&amp;quot;CountryOrRegion\&amp;quot;: \&amp;quot;US\&amp;quot;,\&amp;quot;PostalCode\&amp;quot;: \&amp;quot;98052\&amp;quot;},\&amp;quot;Coordinates\&amp;quot;: {\&amp;quot;Latitude\&amp;quot;: 47.6398811340332,\&amp;quot;Longitude\&amp;quot;: -122.12833404541016}}&amp;quot;
   ...  
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;was wir nochmal mittels einer &amp;quot;Parse JSON&amp;quot; Aktion parsen können&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;{
    &amp;quot;EntityType&amp;quot;: &amp;quot;LocalBusiness&amp;quot;,
    &amp;quot;LocationSource&amp;quot;: &amp;quot;Bing&amp;quot;,
    &amp;quot;LocationUri&amp;quot;: &amp;quot;https://www.bingapis.com/api/v6/localbusinesses/YN873x16209519703153017334&amp;quot;,
    &amp;quot;UniqueId&amp;quot;: &amp;quot;https://www.bingapis.com/api/v6/localbusinesses/YN873x16209519703153017334&amp;quot;,
    &amp;quot;DisplayName&amp;quot;: &amp;quot;Microsoft Corporation&amp;quot;,
    &amp;quot;Address&amp;quot;: {
        &amp;quot;Street&amp;quot;: &amp;quot;1 Microsoft Way&amp;quot;,
        &amp;quot;City&amp;quot;: &amp;quot;Redmond&amp;quot;,
        &amp;quot;State&amp;quot;: &amp;quot;WA&amp;quot;,
        &amp;quot;CountryOrRegion&amp;quot;: &amp;quot;US&amp;quot;,
        &amp;quot;PostalCode&amp;quot;: &amp;quot;98052&amp;quot;
    },
    &amp;quot;Coordinates&amp;quot;: {
        &amp;quot;Latitude&amp;quot;: 47.6398811340332,
        &amp;quot;Longitude&amp;quot;: -122.12833404541016
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Damit haben wir alle Informationen, die in der Location Spalte gespeichert waren.&lt;/p&gt;
&lt;h2&gt;Ein Location Feld aktualisieren&lt;/h2&gt;
&lt;p&gt;Umgekehrt funktioniert das Updaten eines Listenelements auch mit einer &amp;quot;Send an HTTP request to SharePoint&amp;quot; Aktion.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/UpdateItem.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hierzu müssen wir das JSON wieder in einem String encodieren und dann mittels der SharePoint API speichern.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/LocationMicrosoft.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Falls wir die ganzen Geo-Koordinaten nicht zur Verfügung haben können wir übrigens SharePoint danach suchen lassen. Damit werden die meisten der Daten automatisch aufgelöst. &lt;/p&gt;
&lt;p&gt;Wir können das etwas komplexe JSON oben zu diesem hier vereinfachen. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;{
    &amp;quot;DisplayName&amp;quot;: &amp;quot;Bremen, Hauptbahnhof&amp;quot;,
    &amp;quot;EntityType&amp;quot;: &amp;quot;Custom&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Solange der DisplayName eindeutig ist, wird dieser Wert automatisch in Geo-Koordinaten aufgelöst,&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/UpdateItemSimple.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;und wir bekommen den Eintrag zum Bremer Hauptbahnhof&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/LocationHauptbahnhof.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sun, 29 Jan 2023 00:00:00 GMT</pubDate></item><item><title>Quick Tipp: Ein Theme als SiteCollection Administrator auf einer SharePoint Site setzen</title><link>https://www.365konten.de/blog/2023-01-16/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-01-16/</guid><description>Geht eigentlich ganz einfach, man muss aber anscheinend ein SiteTemplate benutzen</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-01-16/&quot;&gt;https://www.365konten.de/blog/2023-01-16/&lt;/a&gt;&lt;/blockquote&gt; &lt;pre&gt;&lt;code class=&quot;language-XML&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;
&amp;lt;pnp:Provisioning xmlns:pnp=&amp;quot;http://schemas.dev.office.com/PnP/2022/09/ProvisioningSchema&amp;quot;&amp;gt;
  &amp;lt;pnp:Templates ID=&amp;quot;ThemeTemplate&amp;quot;&amp;gt;
    &amp;lt;pnp:ProvisioningTemplate ID=&amp;quot;ThemeProvisioningTemplate&amp;quot; &amp;gt;
      &amp;lt;pnp:Theme Name=&amp;quot;MyColorTheme&amp;quot; IsInverted=&amp;quot;false&amp;quot;&amp;gt;
        {
        &amp;quot;themePrimary&amp;quot;: &amp;quot;#aaaaaa&amp;quot;,
        &amp;quot;themeLighterAlt&amp;quot;: &amp;quot;#fefcf6&amp;quot;,
        &amp;quot;themeLighter&amp;quot;: &amp;quot;#fcf3dd&amp;quot;,
        &amp;quot;themeLight&amp;quot;: &amp;quot;#fae8bf&amp;quot;,
        &amp;quot;themeTertiary&amp;quot;: &amp;quot;#f4d282&amp;quot;,
        &amp;quot;themeSecondary&amp;quot;: &amp;quot;#efbe4b&amp;quot;,
        &amp;quot;themeDarkAlt&amp;quot;: &amp;quot;#d5a32f&amp;quot;,
        &amp;quot;themeDark&amp;quot;: &amp;quot;#b48a28&amp;quot;,
        &amp;quot;themeDarker&amp;quot;: &amp;quot;#85661d&amp;quot;,
        &amp;quot;neutralLighterAlt&amp;quot;: &amp;quot;#f8f8f8&amp;quot;,
        &amp;quot;neutralLighter&amp;quot;: &amp;quot;#f4f4f4&amp;quot;,
        &amp;quot;neutralLight&amp;quot;: &amp;quot;#eaeaea&amp;quot;,
        &amp;quot;neutralQuaternaryAlt&amp;quot;: &amp;quot;#dadada&amp;quot;,
        &amp;quot;neutralQuaternary&amp;quot;: &amp;quot;#d0d0d0&amp;quot;,
        &amp;quot;neutralTertiaryAlt&amp;quot;: &amp;quot;#c8c8c8&amp;quot;,
        &amp;quot;neutralTertiary&amp;quot;: &amp;quot;#a9a9a9&amp;quot;,
        &amp;quot;neutralSecondary&amp;quot;: &amp;quot;#8d8d8d&amp;quot;,
        &amp;quot;neutralPrimaryAlt&amp;quot;: &amp;quot;#727272&amp;quot;,
        &amp;quot;neutralPrimary&amp;quot;: &amp;quot;#020202&amp;quot;,
        &amp;quot;neutralDark&amp;quot;: &amp;quot;#3a3a3a&amp;quot;,
        &amp;quot;black&amp;quot;: &amp;quot;#1e1e1e&amp;quot;,
        &amp;quot;white&amp;quot;: &amp;quot;#ffffff&amp;quot;,
        &amp;quot;bodyBackground&amp;quot;: &amp;quot;#ffffff&amp;quot;,
        &amp;quot;bodyText&amp;quot;: &amp;quot;#020202&amp;quot;
        }
      &amp;lt;/pnp:Theme&amp;gt;
    &amp;lt;/pnp:ProvisioningTemplate&amp;gt;
  &amp;lt;/pnp:Templates&amp;gt;
&amp;lt;/pnp:Provisioning&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-Powershell&quot;&gt;Connect-PnPOnline &amp;quot;https://tenant.sharepoint.com/sites/meineseite&amp;quot; -Interactive

Invoke-PnPSiteTemplate .\theme.xml
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Mon, 16 Jan 2023 00:00:00 GMT</pubDate></item><item><title>Quick Tipp: Die Dokumententemplates an einer Bibliothek per Powershell setzen</title><link>https://www.365konten.de/blog/2023-01-13/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-01-13/</guid><description>Mit diesem kleinen Skript lassen sich die Standard-Vorlagen an einer Biblithek per Powershell setzen</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-01-13/&quot;&gt;https://www.365konten.de/blog/2023-01-13/&lt;/a&gt;&lt;/blockquote&gt; &lt;pre&gt;&lt;code class=&quot;language-Powershell&quot;&gt;
Connect-PnPOnline &amp;quot;https://tenant.sharepoint.com/sites/meineseite&amp;quot; -Interactive

$template=@&amp;quot;
[   
    {
     &amp;quot;templateId&amp;quot;: &amp;quot;NewFolder&amp;quot;,
        &amp;quot;title&amp;quot;: &amp;quot;Folder&amp;quot;,
        &amp;quot;visible&amp;quot;: false
    },
    {
        &amp;quot;templateId&amp;quot;: &amp;quot;NewDOC&amp;quot;,
        &amp;quot;title&amp;quot;: &amp;quot;Word document&amp;quot;,
        &amp;quot;visible&amp;quot;: false
    },
    {
        &amp;quot;templateId&amp;quot;: &amp;quot;NewXSL&amp;quot;,
        &amp;quot;title&amp;quot;: &amp;quot;Excel workbook&amp;quot;,
        &amp;quot;visible&amp;quot;: false
    },
    {
        &amp;quot;templateId&amp;quot;: &amp;quot;NewPPT&amp;quot;,
        &amp;quot;title&amp;quot;: &amp;quot;PowerPoint presentation&amp;quot;,
        &amp;quot;visible&amp;quot;: false
    },
    {
        &amp;quot;templateId&amp;quot;: &amp;quot;NewONE&amp;quot;,
        &amp;quot;title&amp;quot;: &amp;quot;OneNote notebook&amp;quot;,
        &amp;quot;visible&amp;quot;: false
    },
    {
        &amp;quot;templateId&amp;quot;: &amp;quot;NewXSLSurvey&amp;quot;,
        &amp;quot;title&amp;quot;: &amp;quot;Excel survey&amp;quot;,
        &amp;quot;visible&amp;quot;: false
    },
    {
        &amp;quot;templateId&amp;quot;: &amp;quot;NewXSLForm&amp;quot;,
        &amp;quot;title&amp;quot;: &amp;quot;Forms for Excel&amp;quot;,
        &amp;quot;visible&amp;quot;: false
    },
    {
        &amp;quot;templateId&amp;quot;: &amp;quot;NewVSDX&amp;quot;,
        &amp;quot;title&amp;quot;: &amp;quot;Visio drawing&amp;quot;,
        &amp;quot;visible&amp;quot;: false
    },
    {
        &amp;quot;contentTypeId&amp;quot;: &amp;quot;0x0101007083E649E686654AA7A5D0994977BD3E&amp;quot;,
        &amp;quot;isUpload&amp;quot;: true,
        &amp;quot;templateId&amp;quot;: &amp;quot;MyDocumentTemplate&amp;quot;,
        &amp;quot;title&amp;quot;: &amp;quot;my Document Template&amp;quot;,
        &amp;quot;url&amp;quot;: &amp;quot;/sites/meineseite/AnyDocumentLibrary/MyTemplateFile.docx&amp;quot;,
        &amp;quot;visible&amp;quot;: true
    }
]
&amp;quot;@


$view = Get-PnpView -List $listname | Where-Object {$_.DefaultView -eq $true}
$view.NewDocumentTemplates = $template -replace &amp;quot;`n&amp;quot;,&amp;quot;&amp;quot; -replace &amp;quot;`r&amp;quot;,&amp;quot;&amp;quot;
$view.Update()
Invoke-PnPQuery	
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Fri, 13 Jan 2023 00:00:00 GMT</pubDate></item><item><title>SharePoint Virtual Tables</title><link>https://www.365konten.de/blog/2023-01-11/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-01-11/</guid><description>SharePoint Listen als virtuelle Tabellen im Dataverse</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-01-11/&quot;&gt;https://www.365konten.de/blog/2023-01-11/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Man kann seit neuestem SharePoint Listen als virtuelle Tabellen im Dataverse verknüpfen. Das hat den Vorteil, dass auf die Daten im Dataverse über Standardmechanismen zugegriffen werden kann, es aber immer noch im SharePoint Formulare gibt, mit denen ich leicht die Daten bearbeiten kann.&lt;/p&gt;
&lt;h2&gt;Vorbereitung&lt;/h2&gt;
&lt;p&gt;Um die virtuellen SharePoint Tabellen einzurichten, installiert zuerst den &amp;quot;Virtual Connector in Dataverse&amp;quot; von diesem Link&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://appsource.microsoft.com/en/product/dynamics-365/mscrm.connector_provider&quot;&gt;https://appsource.microsoft.com/en/product/dynamics-365/mscrm.connector_provider&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;in euer Zielenvironment im Dataverse.&lt;/p&gt;
&lt;p&gt;Legt euch ansonsten noch eine Liste an. Ich erstelle hier eine Liste mit Geburtstagen.&lt;/p&gt;
&lt;p&gt;![](./Birthdays SharePoint.png)&lt;/p&gt;
&lt;h2&gt;Connection Reference erstellen&lt;/h2&gt;
&lt;p&gt;Danach öffnet das PowerApps Studio und erstellt eine neue Solution. In dieser Solution wählt ihr &amp;quot;New &amp;gt; More &amp;gt; Connection Reference&amp;quot;.&lt;/p&gt;
&lt;p&gt;![](./2 Connection Reference.png)&lt;/p&gt;
&lt;p&gt;Wählt hier nun eine Connection zum SharePoint aus, über die sich die virtuelle Tabelle später verbinden soll. Falls ihr noch keine habt, dann erstellt hier eine.&lt;/p&gt;
&lt;p&gt;![](./3 ConnectionReference.png)&lt;/p&gt;
&lt;p&gt;Klickt nun oben rechts auf das Rädchen und auf &amp;quot;Advanced Settings&amp;quot; um zu den erweiterten Dynamics Einstellungen zu gelangen.&lt;/p&gt;
&lt;h2&gt;Virtuelle Entitätsquelle erstellen&lt;/h2&gt;
&lt;p&gt;![](./4 Advanced Settings.png)&lt;/p&gt;
&lt;p&gt;Wählt dort nun Einstellungen-&amp;gt;System-&amp;gt; Verwaltung&lt;/p&gt;
&lt;p&gt;![](./4 Administration.png)&lt;/p&gt;
&lt;p&gt;und dann &amp;quot;Virtuelle Entitätsquellen&amp;quot;&lt;/p&gt;
&lt;p&gt;![](./6 Virtuelle Entitaetsdatenquellen.png)&lt;/p&gt;
&lt;p&gt;Klickt hier &amp;quot;Neu&amp;quot; und erstellt einen neuen Datenanbieter vom Typ &amp;quot;Virtual Connector Data Provider&amp;quot;&lt;/p&gt;
&lt;p&gt;![](./7 Virtual Connector Data Provider.png)&lt;/p&gt;
&lt;p&gt;Wählt hier für die Verbindungsreferenz die Referenz aus, die wir vorhin erstellt haben und tragt bei &amp;quot;Dataset-Wert&amp;quot; die URL eurer Site Collection ein (Nicht die die Liste).&lt;/p&gt;
&lt;p&gt;![](./8 Virtual Connector Data Provider Config.png)&lt;/p&gt;
&lt;p&gt;Ein Job im Hintergrund erstellt und nun einen Entitätskatalog. Das kann es ein paar Minuten dauern.&lt;/p&gt;
&lt;h2&gt;Die Dataverse Entität erstellen&lt;/h2&gt;
&lt;p&gt;Verlasst nun die erweiterten Dynamics Einstellungen und kehrt zum PowerApps Studio (&lt;a href=&quot;https://make.powerapps.com&quot;&gt;https://make.powerapps.com&lt;/a&gt;) zurück.&lt;/p&gt;
&lt;p&gt;Sucht nun unter &amp;quot;Tables&amp;quot; nach dem neu erstellen Entity Katalog für unsere SharePoint Site.&lt;/p&gt;
&lt;p&gt;![](./9 Entity Catalog.png)&lt;/p&gt;
&lt;p&gt;Hier sollte nun unser Listenname auftauchen. Markiert diesen Eintrag und wählt &amp;quot;Edit using form&amp;quot;&lt;/p&gt;
&lt;p&gt;![](./10 Edit using Form.png)&lt;/p&gt;
&lt;p&gt;Aktiviert nun die Entität, indem ihr &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;quot;Create or Refresh Entity&amp;quot; auf &amp;quot;Yes&amp;quot;&lt;/li&gt;
&lt;li&gt;&amp;quot;Primary key of the Virtual Entity&amp;quot; auf die ID Spalte der Liste und&lt;/li&gt;
&lt;li&gt;&amp;quot;Primary field of the Virtual Entity&amp;quot; auf die Titel Spalte der liste setzt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;![](./11 Create Entity.png)&lt;/p&gt;
&lt;p&gt;Hier passiert nun ein Fehler. Es wird für euch so aussehen, als hättet ihr die Daten nicht gespeichert. Auch wenn ihr den Eintrag ein zweites Mal mittels &amp;quot;Edit using form&amp;quot; bearbeitet, werdet ihr die Änderungen nicht sehen. Sie wurden aber gespeichert.&lt;/p&gt;
&lt;p&gt;Das könnt ihr daran erkennen, dass ein paar Minuten später im PowerApps Studio unter &amp;quot;Tables&amp;quot; eine neue Tabelle auftaucht.&lt;/p&gt;
&lt;p&gt;![](./12 New Table.png)&lt;/p&gt;
&lt;p&gt;Die Tabelle hat dieselben Daten wie unsere Liste. Änderungen werden automatisch von Tabelle zu Liste gespiegelt, egal, ob ich die Daten nun hier bearbeite oder in der Liste.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/BirthdaysDataverse.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Dasselbe funktioniert übrigens nicht nur mit SharePoint Listen sondern mit einer vielzahl anderer Systeme, für die es entsprechende Konnectoren gibt.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Wed, 11 Jan 2023 00:00:00 GMT</pubDate></item><item><title>Quick Tipp: Mit einem Lookup auf den Dokumentennamen verweisen</title><link>https://www.365konten.de/blog/2023-01-09/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-01-09/</guid><description>Über die SharePoint Oberfläche kann man in einem Lookup nicht das Dateinamen auswählen. Dazu kann man aber PowerShell benutzen</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-01-09/&quot;&gt;https://www.365konten.de/blog/2023-01-09/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Hier erstelle ich ein neues Feld &amp;quot;Related Documents&amp;quot; mit dem ich verwandte Dokumente zu einem Dokument angeben kann. Das geht nicht über die Oberfläche (&amp;quot;Name&amp;quot; bzw. &amp;quot;FileLeafRef&amp;quot; ist hier nicht auswählbar), daher lege ich es per Powershell an.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Powershell&quot;&gt;Connect-PnPOnline &amp;quot;https://tenant.sharepoint.com/sites/meineseite&amp;quot; -Interactive

$ListName=&amp;quot;Documents&amp;quot;
$LookupFieldName=&amp;quot;RelatedDocument&amp;quot;

# Add the field to the list
Add-PnPField -List $ListName -Type Lookup -DisplayName $LookupFieldName -InternalName $LookupFieldName -AddToDefaultView

# Set the lookup list for the field and set the lookup field to &amp;quot;FileLeafRef&amp;quot;
Set-PnPField -List $ListName -Identity $LookupFieldName -Values @{LookupList=(Get-PnPList $ListName).Id.ToString(); LookupField=&amp;quot;FileLeafRef&amp;quot;}
	
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Mon, 09 Jan 2023 00:00:00 GMT</pubDate></item><item><title>Quick Tipp: Tage bis zu einem Datum in einer Listenspalte anzeigen</title><link>https://www.365konten.de/blog/2023-01-07/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-01-07/</guid><description>Über eine SharePoint Listenformatierung kann man einfach darstellen, wie viele Tage noch bis zu einem Datenwert verbleiben</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-01-07/&quot;&gt;https://www.365konten.de/blog/2023-01-07/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Wenn ihr darstellen möchtet, wie viele Tage noch bis zu einem bestimmten Datumswert in einer SharePoint Liste sind, dann geht das nicht mittels einer &amp;quot;Calculated Column&amp;quot; (da diese nur beim Speichern eines Elementes aktualisiert wird), sondern mit diesem JSON List formatting. &lt;/p&gt;
&lt;p&gt;Wendet es einfach auf eine beliebige Datumsspalte an. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;{
  &amp;quot;$schema&amp;quot;: &amp;quot;https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json&amp;quot;,
  &amp;quot;elmType&amp;quot;: &amp;quot;div&amp;quot;,
  &amp;quot;txtContent&amp;quot;: &amp;quot;=floor((Number(@currentField)-Number(Date((getMonth(@now)+1)+&amp;#39;.&amp;#39;+getDate(@now)+&amp;#39;.&amp;#39;+getYear(@now))))/(60*60*24*1000))+&amp;#39; day(s) remaining&amp;#39;&amp;quot;
}
	
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sat, 07 Jan 2023 00:00:00 GMT</pubDate></item><item><title>Quick Tipp: Eine Communication Site als Subsite anlegen</title><link>https://www.365konten.de/blog/2023-01-05/</link><guid isPermaLink="true">https://www.365konten.de/blog/2023-01-05/</guid><description>Man kann über die UI keine Communication Site als Subsite anlegen. Per Powershell geht es aber problemlos.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2023-01-05/&quot;&gt;https://www.365konten.de/blog/2023-01-05/&lt;/a&gt;&lt;/blockquote&gt; &lt;pre&gt;&lt;code class=&quot;language-Powershell&quot;&gt;Connect-PnPOnline &amp;quot;https://tenant.sharepoint.com/sites/meineseite&amp;quot; -Interactive

$Locale = 1031 #1033 English /1031 German
$SiteUrl= &amp;quot;MySubsite&amp;quot;
$Template = &amp;quot;SITEPAGEPUBLISHING#0&amp;quot; #Communication Site

New-PnPWeb -Title $SiteUrl -Url $SiteURL  -Locale $Locale -Template $Template 
	
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Thu, 05 Jan 2023 00:00:00 GMT</pubDate></item><item><title>Microsoft Tech Community: Member of the Week</title><link>https://www.365konten.de/blog/2022-12-18/</link><guid isPermaLink="true">https://www.365konten.de/blog/2022-12-18/</guid><description>Ich bin MTC Member of the Week</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2022-12-18/&quot;&gt;https://www.365konten.de/blog/2022-12-18/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Ich war gestern recht überrascht, als ich die Benachrichtigung erhielt, dass ich im MTC Weekly Roundup als &amp;quot;Member of the Week&amp;quot; erwähnt wurde.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/quote.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://techcommunity.microsoft.com/t5/tech-community-blog/mtc-weekly-roundup-december-16/ba-p/3699381&quot;&gt;https://techcommunity.microsoft.com/t5/tech-community-blog/mtc-weekly-roundup-december-16/ba-p/3699381&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dankeschön :) #SharingIsCaring #communityrocks&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sun, 18 Dec 2022 00:00:00 GMT</pubDate></item><item><title>SharePoint Json List Formatting und die nicht existierende WEEKDAY Funktion</title><link>https://www.365konten.de/blog/2022-12-09/</link><guid isPermaLink="true">https://www.365konten.de/blog/2022-12-09/</guid><description>Es gibt keine Funktion beim JSON List Formatting, mit der sich der Wochentag berechnen lässt. Man kann ihn aber selbst berechnen.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2022-12-09/&quot;&gt;https://www.365konten.de/blog/2022-12-09/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;SharePoint Online bietet die Möglichkeit mittels einer einfachen JSON Formatting Datei das Aussehen von Listenansichten komplett zu verändern. 
Zum Beispiel kann das Aussehen und Verhalten eines Feldes in einer Ansicht geändert werden, aber auch die gesamte Ansicht.
Häufig wird diese Funktionalität aber auch einfach dafür verwendet, um bestimmte Zeilen in einer Liste hervorzuheben und auf sie hinzuweisen.&lt;/p&gt;
&lt;p&gt;Zum Beispiel&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Markiere alle Elemente, die in einem bestimmten Status sind.&lt;/li&gt;
&lt;li&gt;Markiere alle Elemente, bei denen ein Wert eine bestimme Summe übersteigt.&lt;/li&gt;
&lt;li&gt;Markiere alle Elemente, bei denen ein Datum in der Vergangenheit liegt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das ist alles einfach zu formulieren und unter &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://pnp.github.io/List-Formatting&quot;&gt;https://pnp.github.io/List-Formatting&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;findet ihr viele Beispiele dafür. Eine komplette Liste der Funktionen, die man zum Berechnen benutzen kann, gibt es bei &lt;a href=&quot;https://learn.microsoft.com/en-us/sharepoint/dev/declarative-customization/formatting-syntax-reference#operators&quot;&gt;Microsoft Learn&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wenn ihr dort aber nach einer &amp;quot;WEEKDAY&amp;quot;-Funktion sucht, also nach einer Funktion, die euch den Wochentag zu einem Datum berechnet, dann werdet ihr da nicht fündig werden. So eine Funktion gibt es nicht.&lt;/p&gt;
&lt;p&gt;Aber wir können sie selbst nachbauen.&lt;/p&gt;
&lt;h2&gt;Hervorheben einer Zeile&lt;/h2&gt;
&lt;p&gt;Zunächst kümmern wir uns aber erstmal um die Grundstruktur der JSON-Datei, die wir im Folgenden benutzen wollen. Als Beispiel werde ich hier eine Zeile in der Listenansicht hervorheben, wenn eine bestimmte Bedingung eintritt.&lt;/p&gt;
&lt;p&gt;Dafür müssen wir nur die &amp;quot;additionalRowClass&amp;quot; abhängig von einer Bedingung setzen.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;
{
  &amp;quot;$schema&amp;quot;: &amp;quot;https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json&amp;quot;,
  &amp;quot;additionalRowClass&amp;quot;: &amp;quot;=if(&amp;lt;irgendwas&amp;gt;==&amp;lt;irgendwas&amp;gt;,&amp;#39;ms-bgColor-themeLighter ms-bgColor-themeLight--hover&amp;#39;,&amp;#39;&amp;#39;)&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Unsere WEEKDAY Funktion&lt;/h2&gt;
&lt;p&gt;Dann können wir die fehlende WEEKDAY Funktion mittels ein wenig Mathematik nachbilden.&lt;/p&gt;
&lt;p&gt;Mit dem Token&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;=@now&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;bekommen wir das aktuelle Datum und darauf aufbauend mit dem Ausdruck&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;=Number(Date(@now))&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;die aktuelle Anzahl von Millisekunden seit Donnerstag, dem 01.01.1970 UTC. &lt;/p&gt;
&lt;p&gt;Indem wir das durch die Anzahl von Millisekunden in einem Tag teilen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;=floor(Number(Date(@now))/ 86400 / 1000)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;erhalten wir die Anzahl der Tage seitdem.&lt;/p&gt;
&lt;p&gt;Der 01.01.1970 UTC war ein Donnerstag, daher müssen wir zu dieser Summe 4 hinzufügen, um den Sonntag als Start der Woche auszuwählen (Wenn ihr den Montag als Start der Woche haben wollt, dann müsst ihr hier 5 hinzufügen).&lt;/p&gt;
&lt;p&gt;Nun können wir diese Summe durch 7 teilen und erhalten die Anzahl der Wochen seit dem 01.01.1970 und einen Rest von Wochentagen. Dieser Rest interessiert uns und wir bekommen ihn mittels der &amp;quot;Modulo&amp;quot; Funktion (&amp;quot;%&amp;quot;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;=(floor(Number(Date(@now))/ 86400 / 1000)+4) % 7&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das gibt uns einen Wert zwischen 0 und 6 für den im Moment aktuellen Wochentag in London.&lt;/p&gt;
&lt;p&gt;Um das nun wiederum an unsere lokale Zeitzone anzupassen, müssen wir den Zeitstempel 01.01.1970 00:00 noch die Verschiebung mitgeben, die wir in unserer lokalen Zeitzone haben.
Ich mach das hier, indem ich die Zeit in Millisekunden vom Zeitstempel 01.02.2020 von 1577836800000 abziehe (Der UTC Zeit in Millisekunden vom &amp;quot;01.01.2020&amp;quot; in London).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;=1577836800000-Number(Date(&amp;#39;01.01.2020&amp;#39;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wenn wir das alles zusammenfügen, erhalten wir die folgende „WEEKDAY“ Funktion zum Berechnen des aktuellen Wochentages.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;=(floor(((Number(Date(@now))+1577836800000-Number(Date(&amp;#39;01.01.2020&amp;#39;)))/ 86400 / 1000)+4) % 7&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;by the way&lt;/h2&gt;
&lt;p&gt;Mittels derselben Berechnung können wir auch unsere lokale Zeitzone als Unterschied in Stunden von UTC berechnen&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;=floor((1577836800001-Number(Date(&amp;#39;01.01.2020&amp;#39;)))/3600 / 1000)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Diese Funktion gibt uns einen Stundenunterscheid zwischen -12 und 12 und sagt uns, um wie viele Stunden uns unsere lokale Zeitzone von UTC unterscheidet
(Ich habe 1 zu 1577836800000 hinzugefügt, um sicherzustellen, dass wir keinen &amp;quot;DIVISION BY ZERO&amp;quot; Fehler bekommen, wenn wir in London sind. Die &amp;quot;floor&amp;quot; Funktion gleicht die 1 dann wieder aus).&lt;/p&gt;
&lt;h2&gt;Alles Zusammen&lt;/h2&gt;
&lt;p&gt;Damit erhalten wir dann das folgende JSON-Template:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-JSON&quot;&gt;
{
  &amp;quot;$schema&amp;quot;: &amp;quot;https://developer.microsoft.com/json-schemas/sp/v2/row-formatting.schema.json&amp;quot;,
  &amp;quot;additionalRowClass&amp;quot;: &amp;quot;=if([$DayOfWeek] == (floor(((Number(Date(@now))+1577836800000-Number(Date(&amp;#39;01.01.2020&amp;#39;)))/ 86400 / 1000)+4) % 7),&amp;#39;ms-bgColor-themeLighter ms-bgColor-themeLight--hover&amp;#39;,&amp;#39;&amp;#39;)&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wenn wir eine Liste mit dieser Spalte erstellen:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Weekday&lt;/td&gt;
&lt;td&gt;Nummer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;und dann die folgenden Werte Eintragen&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Weekday&lt;/th&gt;
&lt;th&gt;Nummer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Sunday&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monday&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tuesday&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wednesday&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thursday&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Friday&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saturday&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Die Ansicht sieht an einem Sonntag dann so aus:
&lt;img src=&quot;https://www.365konten.de/Sunday.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;und an einem Mittwoch so:
&lt;img src=&quot;https://www.365konten.de/Wednesday.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Die Dateien&lt;/h2&gt;
&lt;p&gt;Dieses Beispiel ist im PNP Github Repository verfügbar:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/pnp/List-Formatting/tree/master/view-samples/highlight-rows-current-weekday&quot;&gt;https://github.com/pnp/List-Formatting/tree/master/view-samples/highlight-rows-current-weekday&lt;/a&gt;&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Fri, 09 Dec 2022 00:00:00 GMT</pubDate></item><item><title>Die versteckte SharePoint Benutzerinformationsliste</title><link>https://www.365konten.de/blog/2022-10-20/</link><guid isPermaLink="true">https://www.365konten.de/blog/2022-10-20/</guid><description>In einer versteckten Liste speichert SharePoint Informationen über Benutzer</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2022-10-20/&quot;&gt;https://www.365konten.de/blog/2022-10-20/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Es gibt innerhalb jeder SharePoint Site Collection eine versteckte Liste, die &amp;quot;UserInformationList&amp;quot;. &lt;/p&gt;
&lt;h2&gt;Was ist das?&lt;/h2&gt;
&lt;p&gt;Das ist keine Liste aller User, die es im Verzeichnis gibt, sondern sie hält nur Informationen über die User vor, die in der jeweiligen Site Collection benutzt werden.&lt;/p&gt;
&lt;p&gt;Ihr könnt euch die Einträge in der Liste ansehen, wenn ihr eine der folgenden Urls in eurem Browser eingebt:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-HTTP&quot;&gt;
https:/&amp;lt;Site Collection&amp;gt;/_catalogs/users/simple.aspx
https:/&amp;lt;Site Collection&amp;gt;/_catalogs/users/detail.aspx
https:/&amp;lt;Site Collection&amp;gt;/_layouts/15/people.aspx?MembershipGroupId=0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ein Personenfeld in einer SharePoint Liste ist zum Beispiel technisch nur ein Lookup auf einen Eintrag in dieser Liste. 
Der Displayname des Benutzers wie etwa in den &amp;quot;Geändert&amp;quot;- und &amp;quot;Ertellt&amp;quot;-Spalten ist daher genau der Wert, der für den Benutzer in der Benutzerinformationsliste gespeichert ist. Er wird im klassischen SharePoint bei jeder Darstellung des Datensatzes daher auch nicht &amp;quot;live&amp;quot; aus dem Verzeichnis aufgelöst, sondern aus dieser Liste geladen. &lt;/p&gt;
&lt;h2&gt;Felder&lt;/h2&gt;
&lt;p&gt;Die folgenden Felder sind in dieser Liste enthalten:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Account&lt;/td&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-Mail&lt;/td&gt;
&lt;td&gt;EMail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OtherMail&lt;/td&gt;
&lt;td&gt;OtherMail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User Expiration&lt;/td&gt;
&lt;td&gt;UserExpiration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User Last Deletion Time&lt;/td&gt;
&lt;td&gt;UserLastDeletionTime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile Number&lt;/td&gt;
&lt;td&gt;MobilePhone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;About Me&lt;/td&gt;
&lt;td&gt;Notes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SIP Address&lt;/td&gt;
&lt;td&gt;SipAddress&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locale&lt;/td&gt;
&lt;td&gt;Locale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calendar Type&lt;/td&gt;
&lt;td&gt;CalendarType&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AdjustHijriDays&lt;/td&gt;
&lt;td&gt;AdjustHijriDays&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TimeZone&lt;/td&gt;
&lt;td&gt;TimeZone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time Format&lt;/td&gt;
&lt;td&gt;Time24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alternate Calendar Type&lt;/td&gt;
&lt;td&gt;AltCalendarType&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CalendarView Options&lt;/td&gt;
&lt;td&gt;CalendarViewOptions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WorkDays&lt;/td&gt;
&lt;td&gt;WorkDays&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WorkDay StartHour&lt;/td&gt;
&lt;td&gt;WorkDayStartHour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WorkDay EndHour&lt;/td&gt;
&lt;td&gt;WorkDayEndHour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple UI Languages&lt;/td&gt;
&lt;td&gt;MUILanguages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content Languages&lt;/td&gt;
&lt;td&gt;ContentLanguages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is Site Admin&lt;/td&gt;
&lt;td&gt;IsSiteAdmin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deleted&lt;/td&gt;
&lt;td&gt;Deleted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hidden&lt;/td&gt;
&lt;td&gt;UserInfoHidden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Picture&lt;/td&gt;
&lt;td&gt;Picture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Department&lt;/td&gt;
&lt;td&gt;Department&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Job Title&lt;/td&gt;
&lt;td&gt;JobTitle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Is Active&lt;/td&gt;
&lt;td&gt;IsActive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First name&lt;/td&gt;
&lt;td&gt;FirstName&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last name&lt;/td&gt;
&lt;td&gt;LastName&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Work phone&lt;/td&gt;
&lt;td&gt;WorkPhone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User name&lt;/td&gt;
&lt;td&gt;UserName&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web site&lt;/td&gt;
&lt;td&gt;WebSite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ask Me About&lt;/td&gt;
&lt;td&gt;SPSResponsibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Office&lt;/td&gt;
&lt;td&gt;Office&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Picture Timestamp&lt;/td&gt;
&lt;td&gt;SPSPictureTimestamp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Picture Placeholder State&lt;/td&gt;
&lt;td&gt;SPSPicturePlaceholderState&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Picture Exchange Sync State&lt;/td&gt;
&lt;td&gt;SPSPictureExchangeSyncState&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Picture&lt;/td&gt;
&lt;td&gt;PictureDisp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Picture Only&lt;/td&gt;
&lt;td&gt;PictureOnly_Size_36px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Picture Only&lt;/td&gt;
&lt;td&gt;PictureOnly_Size_48px&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Picture Only&lt;/td&gt;
&lt;td&gt;PictureOnly_Size_72px&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Wann passiert ein neuer Eintrag in der Liste?&lt;/h2&gt;
&lt;p&gt;Du bekommst für einen Benutzer einen neuen Eintrag in der Liste, wenn du&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Einem Benutzer über die UI auf der Seite berechtigst&lt;/li&gt;
&lt;li&gt;Einen Benutzer über die UI in einer Lookup Spalte referenzierst&lt;/li&gt;
&lt;li&gt;Über die API die &amp;quot;ensureUser&amp;quot; Methode für den Benutzer aufrufst&lt;/li&gt;
&lt;li&gt;oder wenn der Benutzer die Seite selbst besucht&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Du bekommst &lt;strong&gt;KEINEN&lt;/strong&gt; neuen Eintrag in dieser Liste, wenn du&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eine AD Gruppe auf der Seite berechtigst, die den Benutzer enthält. (Der Eintrag passiert dann erst, sobald der benutzer die Seite besucht)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wie lösche ich einzelne User aus der Liste?&lt;/h2&gt;
&lt;p&gt;Wenn ihr die Informationen über den User wirklich komplett aus der Liste löschen wollt, dann könnt ihr das über diese URL tun&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-HTTP&quot;&gt;
https:/&amp;lt;Site Collection&amp;gt;/_layouts/15/people.aspx?MembershipGroupId=0
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Thu, 20 Oct 2022 00:00:00 GMT</pubDate></item><item><title>Zwei neue Features in der Powerplattform, die ich wirklich liebe</title><link>https://www.365konten.de/blog/2022-10-01/</link><guid isPermaLink="true">https://www.365konten.de/blog/2022-10-01/</guid><description>Mit den neuen Trigger Outputs und Named Formulas kann man die Wartbar- und Lesbarkeit von PowerPlattform Lösungen steigern</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2022-10-01/&quot;&gt;https://www.365konten.de/blog/2022-10-01/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;In den letzten Monaten sind zwei neue Funktionen zum Power Plattform Funktionsumfang hinzugefügt worden, die dem Low Code Entwickler das Leben stark vereinfachen können.&lt;/p&gt;
&lt;h1&gt;Power Automate: Trigger Outputs&lt;/h1&gt;
&lt;p&gt;Wenn Sie einen Flow erstellt haben, der sehr häufig ausgeführt wird, dann werden Sie dieses Problem wahrscheinlich kennen: &lt;/p&gt;
&lt;p&gt;Die Flow-Historie läuft über und um einen speziellen Flow Run wiederzufinden, müssen Sie jeden einzelnen Run öffnen und die Parameter im Trigger prüfen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/trigger.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Bei vielen Runs kann das recht lange dauern. Glücklicherweise lassen sich mittlerweile die &amp;quot;Trigger Outputs&amp;quot; als neue Spaten mit in die Flow-Run Tabelle aufnehmen. &lt;/p&gt;
&lt;p&gt;Klicken Sie dazu oberhalb der Tabelle auf &amp;quot;Spalten bearbeiten&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/runs.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;und fügen Sie dann die Spalten mit hinzu, die Sie interessieren.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/ausfuehrungsverlauf.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Die tauchen danach dann in der Flow-Run Tabelle auf&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/runsmitneuenSpalten.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hier können wir nun auf einen Blick erkennen, welche Paramater für die Flow Run benutzt wurden und welche der Flow Runs für uns relevant sind.&lt;/p&gt;
&lt;h1&gt;Power Apps: Benannte Formeln&lt;/h1&gt;
&lt;p&gt;Es kann gut sein, dass Sie in einer PowerApp dieselbe Formel immer und immer benutzen. 
Das kann zum Beispiel passieren, falls Sie mehrere Elemente abhängig von dem Wert in einen Formular sichtbar/unsichtbar machen wollen. &lt;/p&gt;
&lt;p&gt;Typischerweise hätten Sie in dem Fall mehrere Einträge der Formel &amp;quot;Visble=myToggle.Value&amp;quot; an verschiedenen Elementen. 
Das ist ein sich wiederholende Formel, was im Bezug auf Wartbarkeit keine richtig gute Idee ist. Falls ich die Formel mal ändern muss, dann muss ich das zum Beispiel an vielen, vielen Stellen tun.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;
// Wiederholend in der Visible-Eigenschaft von vielen,vielen Elementen
=myToggle.Value
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Besser wäre es, wenn wir hier eine Variable definieren würden, die wir im OnChange Elements des Toggles auf einen Wert setzten und diese Variable dann mit den Elementen zu benutzen, also etwa so&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;// im OnChange Event von MyToggle
Set(MyAdditionalFormDataVisible,myToggle.Value)

// In der Visible-Eigenschaft von vielen Elementen
=MyAdditionalFormDataVisible
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das ist dann in Bezug auf Anpassbarkeit der vielen Elemente mit den Visible-Eigenschaften schon viel besser, hat aber auf der OnChange-Seite auch ein paar Nachteile. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zum einen sollte ich die Variable schon bei App.OnStart setzen, damit ich zum Start der App nicht in einem undefinierten Zustand starte. Damit setze ich die Variable schon wenigstens zweimal, mit im schlimmsten Fall sogar mit identischem Code.&lt;/li&gt;
&lt;li&gt;Dann ist dieser Programmierstil imperativ (wenn etwas passiert, dann führe XYZ aus) und nicht deklarativ (Ich deklariere, dass der Wert von Feld X immer A+B ist und meine Applikation stellt das sicher) und entspricht damit nicht so richtig der generellen Struktur von PowerApps.&lt;/li&gt;
&lt;li&gt;Und zum dritten explodiert die Komplexität dieses Ansatzes, sobald ich den Wert der Variablen nicht mehr nur durch ein einzelnes Toggle-Control berechnen kann, sondern sich der fachliche &amp;quot;Visible&amp;quot; Wert aus den Werten mehrerer Controls zusammensetzt. Dann habe ich in den OnChange Methoden jedes Controls die Anweisung zum Setzen der Variablen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Besser wäre es, wenn wir zentral eine deklarative Formel definieren könnten, die wir dann bei vielen Elementen einfach benutzen können. &lt;/p&gt;
&lt;p&gt;Das genau sind die neuen &amp;quot;Benannten Formeln&amp;quot;&lt;/p&gt;
&lt;p&gt;Um diese Funktion zu benutzen zu können, müssen Sie sie aber zunächst in den Einstellungen unter &amp;quot;Bevorstehende Funktionen&amp;quot;/&amp;quot;Experimentelle&amp;quot;/&amp;quot;Benannte Formeln&amp;quot; aktivieren und die App einmal speichern und neu laden.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/BevorstehendeFunktionen.png&quot; alt=&quot;&quot;&gt;&amp;lt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Danach haben wir auf dem App-Element die neue Eigenschaft &amp;quot;Formulas&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Formulas.png&quot; alt=&quot;&quot;&gt;&amp;lt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Hier kann ich nun meine Formeln definieren, indem ich einfach einen beliebigen Namen mit einer Formel gleichsetze.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;// Unter App.Formulas
MyAdditionalFormDataVisible=myToggle.Value

// In der Visible-Eigenschaft von vielen Elementen
=MyAdditionalFormDataVisible
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Diese Formel evaluiert sich nun automatisch zur Laufzeit immer von alleine. Falls sich also mal etwas an myToggle ändert, dann ändert sich sofort automatisch der Wert von &amp;quot;MyAdditionalFormDataVisible&amp;quot;.&lt;/p&gt;
&lt;p&gt;Falls ich später für die Sichtbarkeit ein weiteres Control mit einbeziehen muss, dann muss ich das nur einmal an dieser zentralen Stelle tun.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;// Unter App.Formulas
MyAdditionalFormDataVisible=myToggle.Value &amp;amp;&amp;amp; myOtherToggle.Value

// In der Visible-Eigenschaft von vielen Elementen
=MyAdditionalFormDataVisible
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das erleichtert Wartbarkeit und Lesbarkeit der PowerApp enorm.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sat, 01 Oct 2022 00:00:00 GMT</pubDate></item><item><title>Clean Code für Flows</title><link>https://www.365konten.de/blog/2022-09-17/</link><guid isPermaLink="true">https://www.365konten.de/blog/2022-09-17/</guid><description>Mein Vortrag beim Powerthon 2022</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2022-09-17/&quot;&gt;https://www.365konten.de/blog/2022-09-17/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Auf dem &lt;a href=&quot;https://powerthon.info/&quot;&gt;PowerThon 2022&lt;/a&gt; habe ich einen Vortrag zum Thema &amp;quot;Clean Code für Flows&amp;quot; gehalten.
Hier zeige ich, wie man aus einem unübersichtlichen, komplizierten und nicht wartbarem Flow mit Best Practices eine vernünftige Lösung erstellen kann.&lt;/p&gt;
&lt;iframe width=&quot;949&quot; height=&quot;534&quot; src=&quot;https://www.youtube.de/embed/m3oWRZ0S8uQ?list=PLY3Km2RpLuJM0wABm8RsscRNDrIhRu0db&quot; title=&quot;Day 2 : Sven Sieverding  - Clean Code für Flows&quot; frameborder=&quot;https://www.365konten.de/0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;


&lt;h2&gt;Download&lt;/h2&gt;
&lt;p&gt;Sie können sich die Präsentation und Solution hier &lt;a href=&quot;https://github.com/365knoten/powerthon&quot;&gt;herunterladen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sat, 17 Sep 2022 00:00:00 GMT</pubDate></item><item><title>5 Tricks, die ich bei jeder Powerapp Entwicklung benutze</title><link>https://www.365konten.de/blog/2021-03-18/</link><guid isPermaLink="true">https://www.365konten.de/blog/2021-03-18/</guid><description>Hier sind ein paar Tricks und Einstellungen, die ich eigentlich immer benutze, um mir das Leben bei der Entwicklung einfacher zu machen</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2021-03-18/&quot;&gt;https://www.365konten.de/blog/2021-03-18/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;1) Farben, Schriften etc. als Variablen&lt;/h2&gt;
&lt;p&gt;Es ist in PowerApps wunderbar einfach, einem Element eine neue Farbe zu geben. Einfach daraufklicken und im Farbauswahldialog auf der rechten Seite oder oben in der Formel-Zeile die neue Farbe angeben und schon sind wir fertig. Wenn wir dieselbe Farbe auf einem anderen Element setzen, dann wiederholen wir das einfach.&lt;/p&gt;
&lt;p&gt;Wenn wir diese Farbe aber nun an allen Elementen der PowerApp ändern müssen wird das aber sehr, sehr schnell sehr, sehr aufwändig. Aus dem Grund tendiere ich dazu, diese Einstellungen nur einmal zu machen und in einer Variablen zu speichern und mich später bei allen Komponenten einfach auf diese Variable zu beziehen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/apponstart.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Dazu benutze ich die &amp;quot;App.onStart&amp;quot; Methode. Sie können diese bearbeiten, indem Sie auf der linken Seite in der Baumansicht oben die App auswählen und dann das &amp;quot;On Start&amp;quot; Attribut bearbeiten. Diese Methode wird bei jedem Start der App automatisch ausgeführt und ist ein idealer Platz zum Setzen globaler Variablen. Sie können sie während der Entwicklung aber auch jederzeit händisch ausführen, indem sie bei dem Eintrag &amp;quot;App&amp;quot; auf die drei Punkte klicken und dann &amp;quot;Run OnStart&amp;quot; ausführen. &lt;/p&gt;
&lt;p&gt;Ich setze hier die folgenden zwei Variablen&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;Set(_CompanyColor,RGBA(143, 56, 56, 1));
Set(_CompanyFont,Font.&amp;#39;Segoe UI&amp;#39;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;und beziehe mich im Folgenden beim Styling aller Elemente nur noch auf diese Variablen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/color.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;2) Debug Modus&lt;/h2&gt;
&lt;p&gt;Wenn die PowerApp fertig entwickelt ist und im &amp;quot;echten Leben&amp;quot; von Usern benutzt wird kann es natürlich zu Fehlern kommen. Manchmal wäre es dann gut, wenn wir uns einfach den Wert mancher Variablen oder Eigenschaften darstellen könnten.&lt;/p&gt;
&lt;p&gt;Das kann man wunderbar einfach machen, indem wir auf den entsprechenden Seiten Labels platzieren, die uns diese Werte zeigen. Diese sollten normalerweise für den Benutzer nicht sichtbar sein und wir müssten entscheiden können, ob diese Labels angezeigt werden oder nicht.&lt;/p&gt;
&lt;p&gt;Dazu erstelle ich mir immer eine Variable &amp;quot;_debugMode&amp;quot;, die ich in der „App.onStart“ Methode abhängig vom Wert eines QueryString Parameters setze.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;Set(_DebugMode,Param(&amp;quot;debug&amp;quot;)=&amp;quot;true&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Danach setzte ich die Sichtbarkeit aller entsprechenden Labels und Controls, die ich nur im Debug Modus sehen möchte, auf den Wert von _DebugMode.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Debugmode.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Wenn ich die App nun speichere, im Browser aufrufe und hinten an die URL ein &amp;quot;&amp;amp;debug=true&amp;quot; mit anhänge, werden mir die Debug Informationen in den Labels angezeigt.&lt;/p&gt;
&lt;p&gt;Das ist nur eine rudimentäre Lösung, die man noch durchaus erweitern kann. Normalerweise benutze ich zum Beispiel hier keinen einfachen Labels zur Darstellung der Informationen, sondern erstelle mir eine eigene &amp;quot;Debug Komponente&amp;quot;, die mir die Werte dann gleich auch hübsch formatiert darstellt. Oder ich habe einen eigenen Screen, auf dem all diese Werte gebündelt sind und auf den ich in der App nur über einen Button komme, der abhängig vom Debug Modus versteckt ist. &lt;/p&gt;
&lt;h2&gt;3) Mehrsprachigkeit&lt;/h2&gt;
&lt;p&gt;Die „App.OnStart“ Methode kann man auch noch für viele andere Dinge benutzen. Wenn wir eine App in mehreren Sprachen bereitstellen wollen, dann könnten wir das auch über Variablen tun, die wir abhängig von der gesetzten Browsersprache beim Start setzen. Ich persönlich tendiere hier aber dazu, dieses nicht über einzelne Variablen zu tun, sondern hier dann eine etwas komplexere Datenstruktur aufzubauen &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;Set(_Resources,
        If(Language()=&amp;quot;de-DE&amp;quot; Or Language()=&amp;quot;de-DE&amp;quot;,
            {
               TITLE       : &amp;quot;Meine Applikation&amp;quot;,
               LABEL_SAVE  :&amp;quot;Speichern&amp;quot;,
               LABEL_CANCEL:&amp;quot;Abbrechen&amp;quot;     
            },
            {
                TITLE       :&amp;quot;My Application&amp;quot;,
                LABEL_SAVE  :&amp;quot;Save&amp;quot;,
                LABEL_CANCEL:&amp;quot;Cancel&amp;quot;     
            }
        )
    );
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der Effekt hiervon ist nun, dass wir eine _Ressourcen Variable haben, die verschiedene Attribute enthält. Diese haben in unserem Beispiel normalerweise englische Werte, es sei denn die Browsersprache ist deutsch.
Auf verschiedenen Elementen in der Applikation können wir uns nun statt auf einen fixen Text auf die entsprechenden Werte in der _Ressources Variable beziehen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/multilang.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Denselben Effekt könnten wir auch mit vielen einzelnen Variablen erzielen. Im Regelfall benutzen wir aber bei einer mehrsprachigen Applikation sehr viele Elemente, die lokalisiert werden müssten. Damit ich eine gewisse Übersichtlichkeit bei der IntelliSense im PowerApps Studio behalte, tendiere ich zu dem beschriebenen Vorgehen und benutze die eine _Resources Variable als eine Art Namespace.&lt;/p&gt;
&lt;p&gt;Das Vorgehen lohnt sich auch an anderen Stellen. Wenn Sie etwa recht viele Variablen haben, die das Aussehen ihre Applikation steuern (siehe Abschnitt 1), dann kann es durchaus vernünftig sein, diese etwa in einer &amp;quot;_Styles&amp;quot; Variablen zu kapseln.  &lt;/p&gt;
&lt;h2&gt;4) Variable Navigation&lt;/h2&gt;
&lt;p&gt;Kommen wir nun zur Navigation. Falls ihre Applikation mehr als einen oder zwei Screens benutzt, kann das Handling einer gleichbleibenden Navigation auf allen Seiten schnell aufwändig werden.
Wenn sie auf jedem Screen Buttons platziert haben, über die sie auf alle anderen Screens gelangen können, dann müssen Sie nun jeden einzelnen Screen anpassen und um einen Button erweitern. Neben dem Aufwand kann es hier auch recht schwierig sein, ein über alle Screens einheitliches &amp;quot;Look&amp;amp;Feel&amp;quot; aufrechtzuerhalten.&lt;/p&gt;
&lt;p&gt;Nehmen wir mal an, dass ich 2 Bildschirme namens &amp;quot;MainScreen&amp;quot; und &amp;quot;Screen2&amp;quot; habe.&lt;/p&gt;
&lt;p&gt;Dann definiere ich mir meistens in der App.OnStart Methode eine Collection &amp;quot;_Navigation&amp;quot; mit den zwei Bildschirmen&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;Set(_Navigation, Table(
            { Name:&amp;quot;Haupt Bildschirm&amp;quot;, Screen:MainScreen },
            { Name:&amp;quot;Bildschirm 2&amp;quot;, Screen:Screen2 }
            )       
    );
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Danach erstelle ich eine Galerie, die als Datenquelle diese Collection hat und füge in das Galerie Template einen Button ein. Den Text dieses Buttons setze ich auf &amp;quot;ThisItem.Name&amp;quot; und die &amp;quot;OnSelect&amp;quot; Eigenschaft auf &amp;quot;Navigate(ThisItem.Screen)&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/navigation.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nachdem ich diese Galerie dann grafisch so angepasst habe, wie ich sie haben möchte, kopiere ich Sie auf jeden Bildschirm und habe damit eine einheitliche Navigation. Alternativ kann ich mir dafür auch eine eigene Komponente definieren.&lt;/p&gt;
&lt;p&gt;Wenn ich jetzt einen dritten Bildschirm &amp;quot;Screen3&amp;quot; bekomme, dann kann ich ihn einfach in der App.OnStart Methode mit einfügen. Er taucht nun automatisch in der Navigation aller Seiten auf.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;Set(_Navigation, Table(
            { Name:&amp;quot;Haupt Bildschirm&amp;quot;, Screen:MainScreen },
            { Name:&amp;quot;Bildschirm 2&amp;quot;, Screen:Screen2 },
            { Name:&amp;quot;Bildschirm 3&amp;quot;, Screen:Screen3 },
            )       
    );
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;5) Deeplinks&lt;/h2&gt;
&lt;p&gt;Manchmal wäre es bei der Navigation gut, wenn ich schon beim Aufrufen der App über einen Link direkt auf einen Bildschirm gelangen könnte. Wenn wir die Navigation schon als eine Variable definiert haben, ist das sehr einfach und effizient möglich.&lt;/p&gt;
&lt;p&gt;Hierzu erweitern wir zunächst die Navigations-Variable aus dem letzten Kapitel und fügen bei allen Screens, bei denen ein „Deeplinking“ möglich sein soll, ein neues Attribut &amp;quot;ScreenId&amp;quot; ein.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;Set(_Navigation, Table(
            { Name:&amp;quot;Haupt Bildschirm&amp;quot;, Screen:MainScreen },
            { Name:&amp;quot;Bildschirm 2&amp;quot;,     Screen:Screen2,    ScreenId:&amp;quot;screen2&amp;quot; }
            )       
    );
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Danach fügen wir den folgenden Funktionsaufruf nach der Definition der Navigationsvariable in die „App.StartScreen„ Methode ein.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-PowerFx&quot;&gt;If( 
    !IsBlank(Param(&amp;quot;screen&amp;quot;)),
    With(
        {
            SelectedScreen:LookUp(
                _Navigation,
                !IsBlank(ScreenId) &amp;amp;&amp;amp; ScreenId = Param(&amp;quot;screen&amp;quot;)
            )
        },
        SelectedScreen.Screen
    ),
    NormalerStartScreen
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dieser Aufruf prüft zunächst, ob der QueryString Parameter &amp;quot;screen&amp;quot; beim Aufruf der App mit angegeben wurde. Falls ja, dann setzt er die Variable &amp;quot;SelectedScreen&amp;quot; mit dem Bildschirm aus der Navigationsvariablen, bei dem die ScreenId mit dem übergebenen Parameter übereinstimmt. Danach wird eine Navigation auf den gefundenen Screen durchgeführt.&lt;/p&gt;
&lt;p&gt;Wenn wir in unserem Beispiel an die URL der aufgerufenen PowerApp ein &amp;quot;&amp;amp;screen=screen2&amp;quot; mit anfügen, startet damit die Applikation auf &amp;quot;Bildschirm 2&amp;quot;.&lt;/p&gt;
&lt;h2&gt;Download&lt;/h2&gt;
&lt;p&gt;Sie können sich meine PowerApps Starter App hier &lt;a href=&quot;https://github.com/365knoten/PowerAppsStarter&quot;&gt;herunterladen&lt;/a&gt;.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Thu, 18 Mar 2021 00:00:00 GMT</pubDate></item><item><title>Neue Governance Möglichkeiten für die PowerPlattform</title><link>https://www.365konten.de/blog/2021-03-16/</link><guid isPermaLink="true">https://www.365konten.de/blog/2021-03-16/</guid><description>Auf der Ignite wurden neue Möglichkeiten zur Kontrolle des Datenflusses in PowerApps Konnektoren vorgestellt.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2021-03-16/&quot;&gt;https://www.365konten.de/blog/2021-03-16/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Wussten Sie, dass man mit Microsofts Power Plattform auch auf Ressourcen und Datenbanken im lokalen Firmennetz zugreifen kann? Das ist sogar ganz einfach, denn dazu muss man nur auf einem Windows-Rechner im lokalen Netz das Gateway installieren, dieses bei O365 registrieren und für alle Kollegen freigeben, die dadurch auf lokale Daten zugreifen wollen und fertig.&lt;/p&gt;
&lt;p&gt;Der eine oder andere von Ihnen wird sich aber nun die Frage stellen: &amp;quot;Klingt einfach, aber wo definiere ich denn, auf welche Ressourcen genau (also auf welches Netzlaufwerk und auf welche Datenbank) im lokalen Netz dann zugegriffen werden kann?&amp;quot;.&lt;/p&gt;
&lt;p&gt;Die Frage ist gut, denn im Moment können am Gateway selbst nur die Typen bereitzustellender Ressourcen (etwas Datenbank oder Netzlaufwerk) konfiguriert werden, nicht welche genau dieses sein sollen. Das entscheidet später der Anwender innerhalb der Powerplattform.
Damit könnten ggf. Benutzer auch über das Netz auf Datenbanken zugreifen, auf die sie von außerhalb des lokalen Netzes eigentlich nicht zugreifen können sollten. HR Datenbanken sind häufig ein Beispiel dafür.&lt;/p&gt;
&lt;p&gt;Die einzige Möglichkeit, sich davor zu schützen war bisher, das Gateway nur auf einem Rechner zu installieren, der durch Firewalls vom Rest des Netzes so abgetrennt ist, dass nur Zugriff auf die gewünschten Datenbanken möglich ist. 
Das könnte aber schon ein mittelgroßes Infrastrukturprojekt werden und ist mit Sicherheit weit vom &amp;quot;Low Code&amp;quot; Gedanken entfernt.&lt;/p&gt;
&lt;h3&gt;Twitter als anderes Beispiel&lt;/h3&gt;
&lt;p&gt;Wenn Sie ansonsten etwa verhindern wollen, dass ihre Mitarbeiter Workflows bauen, die Daten automatisiert bei Twitter posten, dann können Sie natürlich problemlos einfach den gesamten Twitter Konnektor deaktivieren. Die Marketing Abteilung kann dann nun aber auch keinen eigenen Flow mehr bauen, der Daten von Twitter ausliest und aus denen dann automatisiert Marketing Informationen gewonnen werden können. Der Konnektor ist als Ganzes deaktiviert und steht für dieses eigentlich sehr sinnvolle Anwendung nicht mehr zur Verfügung.&lt;/p&gt;
&lt;h1&gt;Neues von der Ignite&lt;/h1&gt;
&lt;p&gt;Und genau für diese Anwendungsfälle wurden auf der Ignite endlich neue Lösungsmöglichkeiten vorgestellt. Sie werden in den nächsten Monaten auf alle Tenants ausgerollt.&lt;/p&gt;
&lt;h3&gt;Endpoint Filtering&lt;/h3&gt;
&lt;p&gt;Zum einen haben wir da das &amp;quot;Endpoint Filtering&amp;quot;. Damit kann im PowerPlattform Admin Center zentral für eine Umgebung definiert werden, auf welche Ressourcen/URLs/Datenbanken jeder einzelne Konnektor zugreifen kann oder auch nicht.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/EndPointFiltering.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Die oben beschriebene Herausforderung mit dem Zugriff auf lokale Datenbanken wird damit sicherlich lösbar sein. Wir definieren einfach die Datenbanken, auf die unsere Mitarbeiter im lokalen Netz zugreifen dürfen und die anderen sind gesperrt.&lt;/p&gt;
&lt;p&gt;Damit haben wir dann auch gleich andere, &amp;quot;unautorisierte&amp;quot; Cloud-Datenbanken für unsere Benutzer gesperrt. Deren Adressen führen wir im Admin Center einfach nicht auf.&lt;/p&gt;
&lt;h3&gt;Connector Action Controls&lt;/h3&gt;
&lt;p&gt;Für den &amp;quot;Twitter&amp;quot; Anwendungsfall hilft uns das aber nicht viel. Twitter hat nur eine Adresse, die wir entweder sperren oder nicht sperren können.&lt;/p&gt;
&lt;p&gt;Aber eigentlich würde es uns in diesem Anwendungsfall auch schon reichen, wenn wir über den Konnektor nur Lesen könnten und das Posten von neuen Tweets deaktiviert werden würde.&lt;/p&gt;
&lt;p&gt;Genau dieses erlauben uns nun die neuen &amp;quot;Connector Action Controls&amp;quot;. Hiermit können wir detailliert die Aktionen jedes einzelnen Konnektors für die User in unserer Umgebung aktivieren und deaktivieren und damit sehr granular bestimmen, welche Aktionen durchgeführt werden dürfen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/ConnectorActionControls.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Tenant Isolation&lt;/h3&gt;
&lt;p&gt;Schließlich haben wir da dann noch die &amp;quot;Tenant Isolation&amp;quot;. Hiermit haben wir nun die Möglichkeit, den Zugriff von und zu Tenants etwa der Konkurrenz oder eines Dienstleisters einzuschränken. &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/TenantIsolation.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Mit aktivierter &amp;quot;Tenant Isolation&amp;quot; für eine bestimme Adresse können unsere Benutzer per Power Plattform nicht mehr auf die Ressourcen des anderen Tenants zugreifen. In die andere Richtung gilt das auch, da nun auch Mitarbeiter des anderen Tenants nicht mehr per Power Plattform auf Ressourcen unseres Tenants zugreifen können - selbst wenn Sie über die Oberfläche dafür freigeschaltet sind.&lt;/p&gt;
&lt;p&gt;Damit können wir dann effektiv unterbinden, dass etwa Dienstleister eigene Powerapps auf unseren Ressourcen aufbauen und einfach bestimmte Auswertungen fahren können.&lt;/p&gt;
&lt;h3&gt;Wann kommt das?&lt;/h3&gt;
&lt;p&gt;Im Moment (16.03.2021) sind die drei Einstellungen noch nicht verfügbar, das wird sich aber in den nächsten Wochen ändern.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Tue, 16 Mar 2021 00:00:00 GMT</pubDate></item><item><title>Die aktuelle Seite in Teams teilen</title><link>https://www.365konten.de/blog/2021-02-07/</link><guid isPermaLink="true">https://www.365konten.de/blog/2021-02-07/</guid><description>Wie man Besuchern auf einer Website die einfache Möglichkeit gibt, diese zu teilen.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2021-02-07/&quot;&gt;https://www.365konten.de/blog/2021-02-07/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Es ist ja ganz praktisch, wenn ich einen interessanten Artikel, den ich im Netz gefunden habe, auf einfache Art mit etwa meinen Kollegen teilen kann. Falls seine Website haben und diese Funktionalität für Microsoft Teams anbieten wollen, dann geht dieses zum Glück recht einfach.&lt;/p&gt;
&lt;p&gt;Öffnen Sie einfach die folgende Website und scrollen Sie nach unten&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.microsoft.com/en-us/microsoft-teams/share-to-teams&quot;&gt;https://developer.microsoft.com/en-us/microsoft-teams/share-to-teams&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wählen Sie zunächst den Button-Stil und konfigurieren Sie einige Einstellungen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/buttonstyle.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Danach können Sie sich ein &amp;quot;Code-Schnipsel&amp;quot; runterladen, welches Sie einfach an der entsprechenden Stelle ihrer Website platzieren können.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/copyCode.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Damit wird der Teilen-Knopf dann auf Ihrer Seite eingefügt. Beim Klick darauf wird Teams dann aus den Metadaten ihrer Website automatisch den Titel, ein Bild und die Beschreibung erzeugen. &lt;/p&gt;
&lt;p&gt;Das funktioniert soweit einwandfrei.... In den meisten Fällen.&lt;/p&gt;
&lt;p&gt;Falls Sie den Teilen-Knopf allerdings dynamisch mittels Javascript einfügen oder wie ich innerhalb einer React-Applikation, dann wird das leider nicht so einfach funktionieren. Glücklicherweise gibt es da aber noch einen anderen Weg.&lt;/p&gt;
&lt;p&gt;Das Teilen einer Website in Teams lässt sich nämlich auch dadurch bewerkstelligen, dass der Benutzer eine bestimmte URL von Microsoft aufruft (Das ist das, was das Codeschnipsel im Hintergrund auch tut).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-link&quot;&gt;https://teams.microsoft.com/share?href=&amp;lt;URL&amp;gt;&amp;amp;referrer=&amp;lt;Domäne&amp;gt;
// &amp;lt;URL&amp;gt; Die Url zu der zu verlinkenden Seite
// &amp;lt;Domäne&amp;gt; Die &amp;quot;Domäne&amp;quot; ihre Seite. In meinem Fall ist das &amp;quot;365Knoten.de&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Danach kann der Benutzer dann dort die Seite in Teams teilen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/teilen.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Wenn man dann den Aufruf dieser &amp;quot;Teilen&amp;quot; Seite im Javascript noch mittels &amp;quot;window.open&amp;quot; in einem Popup öffnet, dann kommt man in React zu folgender Implementierung.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;	  
        &amp;lt;button
          onClick={()=&amp;gt;{
            window.open(`https://teams.microsoft.com/share?href=${articleurl}&amp;amp;referrer=365Knoten.de`,&amp;quot;In Teams teilen&amp;quot;,&amp;quot;width=800,height=600,status=yes,scrollbars=yes,resizable=yes&amp;quot;);
          }}
          &amp;lt;svg .... &amp;gt;&amp;lt;/svg&amp;gt;
        &amp;lt;/button&amp;gt;
	
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das funktioniert wunderbar. Probieren Sie es doch gleich unten aus.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sun, 07 Feb 2021 00:00:00 GMT</pubDate></item><item><title>Wie breche ich alle laufenden Runs zu einem Flow ab?</title><link>https://www.365konten.de/blog/2021-01-12/</link><guid isPermaLink="true">https://www.365konten.de/blog/2021-01-12/</guid><description>Ich zeige hier, wie das geht.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2021-01-12/&quot;&gt;https://www.365konten.de/blog/2021-01-12/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Ich kam heute in die Verlegenheit, hunderte Ausführungen eines Flows abbrechen zu müssen. Über die Oberfläche kann man das zwar für jede einzelne Ausführung einzeln machen, das ist aber wenig effizient. Auch per Powershell scheint es keine Möglichkeit zu geben. Daher habe ich das Problem &amp;quot;Mehrere Ausführungen eines Flows auf einmal abbrechen&amp;quot; folgendermaßen gelöst.&lt;/p&gt;
&lt;p&gt;Ich bin auf die Übersichtsseite der Ausführungen des Flows (&amp;quot;All Runs&amp;quot;) gewechselt&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/allruns.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;und habe dann dort oben rechts in dem Dropdown &amp;quot;Running&amp;quot; ausgewählt, um mir alle laufenden Instanzen anzuzeigen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/running.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hier habe ich die Entwicklerkonsole im Browser geöffnet (F12) und die folgenden Befehle eingetragen:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;	  
// JQuery Nachladen
var jq = document.createElement(&amp;#39;script&amp;#39;);
jq.src = &amp;quot;https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js&amp;quot;;
document.getElementsByTagName(&amp;#39;head&amp;#39;)[0].appendChild(jq);
	
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;	  
jQuery.noConflict();
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;	  
// Das Alert Fenster immer automatisch bestätigen	  
confirm = function () {return true;};
	
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;	  
// In einem Intervall von 2 Sekunden immer den obersten Eintrag auswählen und danach auf &amp;quot;Cancel&amp;quot; drücken
setInterval(function () {
	jQuery(&amp;#39;.ms-Button.ms-Button--default:contains(&amp;quot;Show more&amp;quot;)&amp;#39;).last().click();
	jQuery(&amp;quot;.fl-StatusInCell[title=&amp;#39;Running&amp;#39;]&amp;quot;).parent().parent().find(&amp;#39;.ms-DetailsRow-cell&amp;#39;).first().click();
	jQuery(&amp;#39;button[name=&amp;quot;Cancel&amp;quot;]&amp;#39;).click();
},2000);
	
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Danach klickt der Browser in einer Schleife automatisch immer auf das erste Element in der Liste und bricht den Eintrag ab. &lt;/p&gt;
&lt;p&gt;Nach einer halben Stunde war damit mein Problem behoben.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Tue, 12 Jan 2021 00:00:00 GMT</pubDate></item><item><title>Kanal-Kalender in MS Teams</title><link>https://www.365konten.de/blog/2021-01-09/</link><guid isPermaLink="true">https://www.365konten.de/blog/2021-01-09/</guid><description>Wie füge ich in Teams zu einem Kanal einen Kalender hinzu?</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2021-01-09/&quot;&gt;https://www.365konten.de/blog/2021-01-09/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Mir ist schon häufig die Anforderung untergekommen, dass Kunden einen Kalender innerhalb eines Teams Kanal haben wollten. Das macht Sinn. Ein Kanal kann durchaus ein eigenes Thema sein und darin kann es notwendig sein, Termine vorzuhalten.&lt;/p&gt;
&lt;h3&gt;Ein umständlicher Weg: SharePoint Kalender und SPFX Webpart&lt;/h3&gt;
&lt;p&gt;Mangelns einer entsprechenden Registerkarte von Microsoft habe ich in den Fällen dann häufig auf das &lt;a href=&quot;https://github.com/pnp/sp-dev-fx-webparts&quot;&gt;PnP Sample Repository&lt;/a&gt; zugegriffen und eine der bestehenden Kalenderlösungen von dort angepasst.&lt;/p&gt;
&lt;p&gt;Um das zu tun musste ich diverse händische Schritte durchführen, die ich hier mal am Beispiel des &lt;a href=&quot;https://github.com/pnp/sp-dev-fx-webparts/tree/master/samples/js-modern-calendar&quot;&gt;&amp;quot;js-modern-calendars&amp;quot;&lt;/a&gt; bescheibe:&lt;/p&gt;
&lt;p&gt;Zunächst muss das Repository geklont und gebaut werden:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;# Das Sample Repository clonen
git clone https://github.com/pnp/sp-dev-fx-webparts
# In das Verzeichnis eines Samples wechseln.
cd sp-dev-fx-webparts\samples\js-modern-calendar
# Die benötigen Javascript-Libraries installieren
npm install
# Die Lösung bauen, bundeln und paketieren
gulp build --ship
gulp bundle --ship
gulp package-solution --ship
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Danach steht im Ordner &amp;quot;SharePoint/Solution&amp;quot; eine &amp;quot;.sppkg&amp;quot; Datei zur Verfügung, die nun wiederum im &lt;a href=&quot;https://docs.microsoft.com/en-us/sharepoint/use-app-catalog?redirectSourcePath=%252farticle%252fuse-the-app-catalog-to-make-custom-business-apps-available-for-your-sharepoint-online-environment-0b6ab336-8b83-423f-a06b-bcc52861cba0&quot;&gt;SharePoint-App Katalog&lt;/a&gt; des Tenants bereitgestellt werden muss (wenn man die Rechte dafür hat).&lt;/p&gt;
&lt;p&gt;Danach muss das Webpart in der Site Collection des Teams installiert (Site-Contents -&amp;gt; Neu -&amp;gt; App), eine neue Modern Page erstellt und das Webpart dort eingefügt werden. Jetzt kann auf der SharePoint Seite noch eine Kalender-Liste erstellt werden (ebenfalls über Site-Contents -&amp;gt; Neu -&amp;gt; App) und dieser Kalender im Webpart verknüpft werden.&lt;/p&gt;
&lt;p&gt;Schließlich ist es dann möglich, im Teams über eine Registerkarte der Typs &amp;quot;Sharepoints&amp;quot; die gerade erstellte Seite als neue Registerkarte im gewünschten Kanal einzufügen.... und &amp;quot;schon&amp;quot; ist der Kanal-Kalender fertig.&lt;/p&gt;
&lt;h3&gt;Viel einfacher: Die neue Teams Registerkarte von Microsoft&lt;/h3&gt;
&lt;p&gt;Glücklicherweise gibt es da Neuigkeiten von Microsoft. Jeder in einem Team entsprechend berechtige User kann nun in einem Kanal eine Registerkarte des Typs &amp;quot;Kanalkalender&amp;quot; hinzufügen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/RegisterKarte.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Nun steht dem Team in diesem Kanal ein vollwertiger Kalender zur Verfügung. Hier kann ich Termine erstellen und auch weitere Personen einladen, ihre Outlook Terminkalender sehen und Kanal Besprechungen erstellen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Kanalkalender.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Dieser Kalender ist im Gegensatz zur vorherigen Lösung keine simple SharePoint-Liste sondern greift auf den O365 Gruppenkalender zu, der hinter dem Team liegt. Ich stelle also implizit Ereignisse in dem Gruppenkalender, in den verschiedenen Registerkarten der Kanäle werden mir aber nur die Termine angezeigt, die für diesen Kanal relevant sind. 
Wenn man sich also im Outlook den Kalender der Gruppe ansieht, dann wird man dort die Termine alle Kanäle des Teams finden. Das finde ich persönlich aber eigentlich auch garnicht schlecht, da man dadurch einen Überblick bekommt, welche Termine denn generell im Team angesetzt sind.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Sat, 09 Jan 2021 00:00:00 GMT</pubDate></item><item><title>Low-Code-Programmierung: Software selbst bauen</title><link>https://www.365konten.de/blog/2020-11-25/</link><guid isPermaLink="true">https://www.365konten.de/blog/2020-11-25/</guid><description>Was verbirgt sich hinter den Begriffen? Wann kann ich das benutzen und worauf muss ich achten?</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2020-11-25/&quot;&gt;https://www.365konten.de/blog/2020-11-25/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Wenn Sie sich ein wenig mit Program­mie­rung ausken­nen, dann werden Ihnen Begriffe wie IDE (Inte­gra­ted Soft­ware Deve­lop­ment Envi­ron­ment), Compi­ler und Quell­code sicher­lich etwas sagen. Für Nicht-Fach­leute ist wich­tig zu wissen: Um Quell­code zu entwi­ckeln, nutzen Program­mie­rer*in­nen klas­si­scher­weise einen Text­e­di­tor oder Entwick­lungs­um­ge­bun­gen, die ihnen die wich­tigs­ten Werk­zeuge unter einer Ober­flä­che zur Verfü­gung stel­len. Der Code wird mit Hilfe eines Compi­lers aus der verwen­de­ten Program­mier­spra­che in Maschi­nen­code über­setzt. Der Compu­ter kann das Programm dann ausfüh­ren.&lt;/p&gt;
&lt;h2&gt;Klingt einfach? Ist es nicht.&lt;/h2&gt;
&lt;p&gt;Klas­si­sches Program­mie­ren ist anspruchs­voll und braucht Zeit: Ein Soft­ware-Devel­oper muss die Anfor­de­run­gen des Fach­be­reichs verste­hen, die Program­mier­spra­che spre­chen und deren Eigen­hei­ten kennen. Teile des Programms beschäf­ti­gen sich beispiels­weise nur mit dem Spei­chern der Daten auf der Fest­platte, mit der Ober­flä­che an sich oder mit dem Netz­werk. Diese Elemente müssen oft für jede Anfor­de­rung einzeln ange­passt werden. Das Ergeb­nis muss der Entwick­ler testen, einche­cken und auf einem Test­sys­tem deployen, wo es von einem Tester getes­tet wird. Danach kann die Ände­rung auf das Produk­tivsys­tem einge­spielt und vom Fach­be­reich benutzt werden.&lt;/p&gt;
&lt;h2&gt;Alternative: Low-Code und No-Code&lt;/h2&gt;
&lt;p&gt;Es gibt aber eine Alter­na­tive. Ein Fach­be­reich mit ein paar IT-affi­nen Kolle­gen kann für eine konkrete Anfor­de­rung selbst eine kleine Appli­ka­tion entwi­ckeln – und zwar ganz ohne zu program­mie­ren. Zu diesem Zweck gibt es Low-Code- oder No-Code-Platt­for­men. Auf denen kann man ohne große Program­mier­kennt­nisse kleine Appli­ka­ti­o­nen zusam­men­bauen.&lt;/p&gt;
&lt;p&gt;Sie basie­ren häufig auf grafi­schen Elemen­ten, die mit der Maus zu neuen Funk­ti­o­nen ange­ord­net werden können. Viele Neben­funk­ti­o­nen, wie etwa die Logik zum Datei­spei­chern, Netz­werk­zu­griffe oder ähnli­ches, um die sich norma­le­r­weise ein Entwick­ler kümmert, ist häufig für den Benut­zer wegab­s­tra­hiert.&lt;/p&gt;
&lt;p&gt;Nach einer kurzen Einar­bei­tung kann sich damit jeder rela­tiv schnell eigene Appli­ka­ti­o­nen zusam­men­stel­len. Die sind zwar nicht ganz so schnell oder skalier­bar wie eine von Soft­ware-Entwick­lern erstellte Appli­ka­tion. Dafür sind sie schnel­ler erstellt und können – falls nötig – tages­ak­tu­ell vom Fach­be­reich selber ange­passt werden.&lt;/p&gt;
&lt;p&gt;Solche Low-Code-Systeme gibt es schon seit vielen Jahren. Beispiele dafür sind Lotus Notes und Share­Point, aber auch das in vielen Firmen einge­setzte Micro­soft Access. Im Zeit­al­ter der Cloud gibt es mehr und mehr neue Anbie­ter für solche Platt­for­men. Beispiels­weise hat sich Nintex Work­flow von einer reinen Share­Point-Lösung zu einer webba­sier­ten Auto­ma­ti­sie­rungs­platt­form weiter­ent­wi­ckelt. Ähnli­ches gilt für IFTTT (&amp;quot;If This Than That&amp;quot;), einer sehr popu­lä­ren Platt­form, um persön­li­che Prozesse im Inter­net und für das Smart-Home zu auto­ma­ti­sie­ren.&lt;/p&gt;
&lt;h2&gt;Microsofts Power-Plattform: Komplexe Apps leicht umsetzen&lt;/h2&gt;
&lt;p&gt;Micro­soft hat im Rahmen seiner Power-Platt­form eine mäch­tige Basis geschaf­fen, um auch sehr komplexe Appli­ka­ti­o­nen mit der Low-Code-Methode umzu­set­zen. Zum einen gibt es Power Apps. Mit dieser Applikation können grafische Oberflächen und ganze Applikationen zusammengeklickt werden, die sich dann entweder als Webseite, als Applikation auf dem Computer oder auch als Handy-App ausführen lassen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/PApps.png&quot; alt=&quot;PowerApps&quot;&gt;&lt;/p&gt;
&lt;p&gt;Der Citi­zen-Devel­oper – so nennen Fach­leute den Low-Code-Entwick­ler – muss zur Erstel­lung im Wesent­li­chen Excel-Formeln kennen und ein grobes Verständ­nis für Daten­quel­len und den umzu­set­zen­den Prozess haben.&lt;/p&gt;
&lt;p&gt;Mit einer weite­ren Anwen­dung, Power Automate, können Hintergrundprozesse erstellt werden. Mittels eines grafischen Editors kann man den Prozess als Ablaufdiagramm generieren, das Visio ähnelt. Die Anzahl der verwendbaren Aktionen ist hier gewaltig und geht weit über die Microsoft Produkte heraus. Sie können beispielsweise viele weitere webbasierte Dienste wie Salesforce oder Googlemail in Ihre Prozesse einbeziehen, oder auch Ihre hauseigenen Systeme.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/PAutomate.png&quot; alt=&quot;PowerAutomate&quot;&gt;&lt;/p&gt;
&lt;p&gt;Außer­dem enthal­ten ist Power BI, AI Buil­der und Power Virtual Agents, mit denen sich Dash­boards, Künst­li­che Intel­li­gen­zen und Chat­bots erstel­len und in die Appli­ka­ti­o­nen inte­grie­ren lassen.&lt;/p&gt;
&lt;h2&gt;Was könnte ich damit tun?&lt;/h2&gt;
&lt;p&gt;Es gibt zahl­lose mögli­che Anwen­dungs­fälle für die Power Platt­form. Wenn Sie beispiels­weise eine Excel-Datei haben, in die ihre Kolleg*in­nen Daten eintra­gen sollen, dann könn­ten Sie mit Power Apps in weni­ges Klicks eine einfa­che Einga­be­maske dafür erzeu­gen. Die kann sogar als App auf ihrem Handy funk­tio­nie­ren. Wenn Sie darüber benach­rich­tigt werden wollen, dass ein Kollege etwas geän­dert hat, dann können Sie einen Power Auto­mate Flow erzeu­gen, der Ihnen die Ände­run­gen per Mail schickt.&lt;/p&gt;
&lt;p&gt;Über die Power App könn­ten Sie auch Fotos von Bele­gen hoch­la­den. Der AI Buil­der kann Ihnen auto­ma­tisch aus den Bele­gen Infor­ma­ti­o­nen extra­hie­ren und in die Excel-Datei eintra­gen. Oder Sie wagen sich an noch komple­xere Anfor­de­run­gen…&lt;/p&gt;
&lt;h2&gt;Klingt wunderbar. Wo ist der Haken?&lt;/h2&gt;
&lt;p&gt;Low-Code Appli­ka­ti­o­nen bergen aber auch Gefah­ren – dazu eine kleine Anek­dote.&lt;/p&gt;
&lt;p&gt;Ein Logis­tik-Unter­neh­men setzte in seiner Kolla­bo­ra­ti­ons­soft­ware eine No-Code-Work­flow­kom­po­nente ein. Damit konn­ten sich die Mita­r­bei­ten­den für ihre Doku­mente selbst auto­ma­ti­sche Prozesse erstel­len. Das Unter­neh­men hatte einen Haupt­stand­ort, an dem an mehre­ren Toren LKWs rück­wärts andock­ten, die Palet­ten entla­den und just-intime auf andere LKWs verla­den wurden. Alles funk­tio­nierte wunder­bar.&lt;/p&gt;
&lt;p&gt;Nach eini­ger Zeit fuhr die IT nach Abspra­che mit den Fach­be­rei­chen den Server herun­ter, auf dem auch die Kolla­bo­ra­ti­ons­soft­ware lag, um einen Patch einzu­spie­len. Das sei doch kein Problem, denn dort liege ja „nur“ ein System für interne Kommu­ni­ka­tion, das auch mal zwei Stun­den nicht erreich­bar sein könne.&lt;/p&gt;
&lt;p&gt;Als die IT-Kolle­gen wegen eines drin­gen­de­ren Problems von dem Patch abge­zo­gen wurden, brach alles zusam­men: Keines der Tore ließ sich mehr öffnen. Die LKWs konn­ten nicht mehr entla­den werden. Das Unter­neh­men hatte einen großen finan­zi­el­len Scha­den.&lt;/p&gt;
&lt;p&gt;Später wurde die Ursa­che an einer nicht erwar­te­ten Stelle gefun­den: Ein Kollege aus der Fach­ab­tei­lung hatte den Geneh­mi­gungs­pro­zess zum Öffnen der Tore durch dieses Kolla­bo­ra­ti­ons­tool gelei­tet (weil das so schön einfach ging). Davon wusste aber keiner. Dass der Kollege mitt­ler­weile nicht mehr für das Unter­neh­men arbei­tete, machte das Ganze noch kompli­zier­ter.&lt;/p&gt;
&lt;h2&gt;Schatten-IT: Wie vermeide ich sie?&lt;/h2&gt;
&lt;p&gt;Dieses Problem nennt sich Schat­ten-IT und ist eines der größ­ten Probleme bei No-Code- oder Low-Code-Lösun­gen. In den Fach­be­rei­chen können Appli­ka­ti­o­nen entste­hen, von denen die IT zum einen nichts weiß und dement­spre­chend nicht in ihre Betriebs­pla­nung aufneh­men kann. Zum ande­ren hat auch häufig in den Fach­ab­tei­lun­gen niemand den Blick auf erfor­der­li­che, vermeint­lich nicht-funk­ti­o­nale Anfor­de­run­gen an Appli­ka­ti­o­nen wie etwa Doku­men­ta­tion, Daten­schutz oder andere Poli­cies und Neben­be­din­gun­gen. Die gewähr­leis­tet norma­le­r­weise die IT.&lt;/p&gt;
&lt;p&gt;Schat­ten-IT lässt sich durch eine enge Kommu­ni­ka­tion zwischen Fach­be­reich und IT-Abtei­lung vermei­den. Dem Fach­be­reich muss bewusst sein, welche Appli­ka­ti­o­nen er gefahr­los selbst bauen kann, ohne Unter­neh­mens­richt­li­nien oder gar Gesetzte zu verlet­zen. Die IT sollte von allen Appli­ka­ti­o­nen wissen, die der Fach­be­reich entwi­ckelt hat.&lt;/p&gt;
&lt;p&gt;Die Lösung ist häufig eine Key-User-Rege­lung: In den Fach­ab­tei­lun­gen werden bestimmte Kolleg*in­nen gezielt geschult und so in die Lage versetzt, Low-Code-Appli­ka­ti­o­nen unter­neh­mens­kon­form zu erstel­len und zusam­men mit der IT zu betrei­ben. Die IT kann dann auch den Bedarf nach neuen Appli­ka­ti­o­nen von diesen Key-Usern aufneh­men und even­tu­ell in neue, zentrale Systeme über­neh­men.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Wed, 25 Nov 2020 00:00:00 GMT</pubDate></item><item><title>Manchmal sind weniger Straßen mehr</title><link>https://www.365konten.de/blog/2020-07-06/</link><guid isPermaLink="true">https://www.365konten.de/blog/2020-07-06/</guid><description>Was mir im Stau halt so in den Sinn kommt: Spieltheorie, Nash-Gleichgewichte und das Braess-Paradox</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2020-07-06/&quot;&gt;https://www.365konten.de/blog/2020-07-06/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Mittlerweile beginnt das Leben – trotz Corona – wieder gewohnte Wege einzuschlagen. So stand ich neulich abends in der Bremer Überseestadt im Stau und stellte mir aus purer Langeweile einige Fragen: Warum ist das hier immer so – das kann doch nicht nur an der Brücke liegen? Wieso staut sich der Verkehr von einer Ampel zur nächsten? Gibt es einfach zu viele Kreuzungen? Und ginge das vielleicht schneller, wenn da weniger wären? &lt;/p&gt;
&lt;p&gt;Tatsächlich gibt es mit dem &lt;strong&gt;„Braess Paradoxon“&lt;/strong&gt; ein Gedankenspiel aus der Spieltheorie, das – vereinfacht gesagt – zeigt, dass mehr Straßen manchmal zu längeren Reisezeiten führen können. Und das liegt daran, dass alle Verkehrsteilnehmenden immer die Option wählen, die für sie selbst am vorteilhaftesten ist – und nicht die, die für alle am besten wäre. 
Möchten Sie eine der Grundlagen der Spieltheorie am Beispiel „Feierabendverkehr“ kennenlernen?&lt;/p&gt;
&lt;h2&gt;Die Ausgangssituation&lt;/h2&gt;
&lt;p&gt;Stellen Sie sich vor, es gäbe zwei Städte, Stadt A und Stadt D. &lt;/p&gt;
&lt;p&gt;Genau mittig zwischen den beiden Städten gäbe es ein sehr schwer zu überwindendes Hindernis, zum Beispiel einen Berg. Auf beiden Seiten des Hindernisses lägen direkt daneben die beiden Orte B und C. Von der Stadt A kann man nun über zwei mögliche Routen zur Stadt D gelangen. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Von A kann man &lt;strong&gt;über die nördliche Route mit der Autobahn 1 zu Ort C&lt;/strong&gt; kommen, diese Autobahn umfährt das Hindernis sehr großflächig und ist mehrspurig ausgebaut. Danach kommt man von Ort &amp;quot;C&amp;quot; über eine sich windende &lt;strong&gt;schmale Landstraße 1 zu Stadt D&lt;/strong&gt;. Auf der Landstraße gibt es häufig Stau, weil sie teilweise nicht für das Verkehrsaufkommen ausgebaut ist. &lt;/li&gt;
&lt;li&gt;Auf der anderen Seite gelangt man über die &lt;strong&gt;südliche Route über die Landstraße 2 zu Ort B&lt;/strong&gt;. Genauso wie auf der Landstraße 1 kommt es aber auch hier häufig zu Staus. Danach kann man von B über die &lt;strong&gt;Autobahn 2 nach D&lt;/strong&gt; gelangen. Genauso wie Autobahn 1 führt diese großflächig am Hindernis vorbei und ist gut mehrspurig ausgebaut.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Braess1.png&quot; alt=&quot;Alte Landkarte&quot;&gt;&lt;/p&gt;
&lt;p&gt;Bei den &lt;strong&gt;beiden Autobahnen dauert die durchschnittliche Reisezeit immer 45 Minuten&lt;/strong&gt; und ist nicht von der Anzahl der darauf fahrenden Autos abhängig, da das Hindernis großräumig umfahren wird. &lt;/p&gt;
&lt;p&gt;Bei den &lt;strong&gt;beiden Landstraßen ist die Reisezeit abhängig von der Anzahl der darauf fahrenden Autos&lt;/strong&gt;: Die Straßen sind schmal und schlängeln sich mit vielen Kurven durch die Landschaft. Im Durchschnitt errechnet sich die benötigte Zeit aus der &lt;strong&gt;Anzahl der Autos geteilt durch 100&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;Egal ob nördliche oder südliche Route: Man braucht für die gesamte Reise &lt;strong&gt;(𝒙/𝟏𝟎𝟎+𝟒𝟓)𝒎𝒊𝒏…&lt;/strong&gt; also zum Beispiel 50 Minuten bei 500 Autofahrern oder 65 Minuten bei 2000 Fahrern.&lt;/p&gt;
&lt;h2&gt;Zur „Rush Hour“ auf der nördlichen und südlichen Route&lt;/h2&gt;
&lt;p&gt;Stellen Sie sich vor, dass zur abendlichen Rushhour &lt;strong&gt;4000 Autos von Stadt A zurück nach Stadt D&lt;/strong&gt; wollen. Ein Teil der Fahrer wird die nördliche und der andere die südliche Route wählen. Da die Situation auf den Landstraßen die Reisedauer bestimmt, werden entweder die Fahrtzeiten identisch sein, weil jeweils ähnlich viele Fahrzeuge unterwegs sind, oder eine Route ist schneller, da dort weniger fahren. Das spricht sich dann aber mit Sicherheit herum, und am nächsten Tag wechseln einige Fahrer auf die vermeintlich schnellere Route.&lt;/p&gt;
&lt;p&gt;Dieses System wird über eine gewisse Zeit hin- und herschwingen, bis die Anzahl der Fahrzeuge auf beiden Strecken mehr oder weniger identisch ist. Dieses Gleichgewicht ist in diesem System die bestmögliche Variante für alle Teilnehmer. In der Spieltheorie nennt man es das &amp;quot;Nash-Gleichgewicht&amp;quot;. &lt;/p&gt;
&lt;p&gt;In unserem Beispiel fahren also jeweils 2000 Fahrzeuge über die nördliche und ebenso viele über die südliche Route. Alle brauchen im Durchschnitt &lt;strong&gt;65 Minuten&lt;/strong&gt; (𝟐𝟎𝟎𝟎/𝟏𝟎𝟎+𝟒𝟓)𝐦𝐢𝐧 = (𝟐𝟎+𝟒𝟓)𝐦𝐢𝐧=𝟔𝟓 𝒎𝒊𝒏).&lt;/p&gt;
&lt;h2&gt;Eine vermeintliche Verbesserung&lt;/h2&gt;
&lt;p&gt;Um die Zeit zu verkürzen, wird eine direkte Straße durch das Hindernis hindurch gebaut. &lt;/p&gt;
&lt;p&gt;Mal angenommen, es kostet keine Zeit, über diese neue Straße X zu fahren, dann haben alle Fahrzeuge, die von A nach D wollen, auf einen Schlag zwei weitere Routen zur Verfügung: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sie können nun &lt;strong&gt;die komplette Strecke über die beiden Autobahnen A1 und A2&lt;/strong&gt; zurücklegen (A1-X-A2) und brauchen dafür 90 Minuten. (𝟒𝟓𝐦𝐢𝐧+𝟒𝟓𝐦𝐢𝐧=𝟗𝟎 𝒎𝒊𝒏) &lt;/li&gt;
&lt;li&gt;Oder sie können &lt;strong&gt;die ganze Strecke über die beiden Landstraßen L1 und L2&lt;/strong&gt; fahren (L2-X-L1) und benötigen 𝒙𝟏/𝟏𝟎𝟎𝐦𝐢𝐧+𝒙𝟐/𝟏𝟎𝟎𝒎𝒊𝒏 (x1 = Anzahl der Fahrer über die L1; x2 = Anzahl der Fahrer über die L2).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://www.365konten.de/Braess2.png&quot; alt=&quot;Neue Landkarte&quot;&gt;&lt;/p&gt;
&lt;p&gt;Wie werden sich die Pendler verhalten, die vorher die nördliche oder südliche Route gefahren sind und dafür 65 Minuten gebraucht haben? &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Über die Autobahnen A1-X-A2 wird sicherlich niemand fahren, da die Route in jedem Fall &lt;strong&gt;25 Minuten länger&lt;/strong&gt; dauert als die bisherige nördliche oder südliche Route. &lt;/li&gt;
&lt;li&gt;Alle Fahrer könnten wie gehabt in 65 Minuten über die „alte“ nördliche oder südliche Route fahren. Aber das wird eher nicht passieren, denn…&lt;/li&gt;
&lt;li&gt;Sehr viel wahrscheinlicher wird wenigstens ein Fahrer etwa der nördlichen Route begreifen, dass er nun statt über die A1 auch über die L2 und dann wie gehabt die L1 fahren kann und damit nur ca. &lt;strong&gt;40 Minuten&lt;/strong&gt; braucht (𝟐𝟎𝟎𝟎/𝟏𝟎𝟎𝐦𝐢𝐧+𝟐𝟎𝟎𝟏/𝟏𝟎𝟎𝐦𝐢𝐧=𝒄𝒂.𝟒𝟎 𝒎𝒊𝒏).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Ein Zeitgewinn von satten 25 Minuten!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Andere Fahrer auf der nördlichen Route werden das auch schnell begreifen und sehr bald folgen 499 weitere dem Beispiel. Dann dauert die Fahrt schon &lt;strong&gt;45 Minuten&lt;/strong&gt;. (𝟐𝟎𝟎𝟎/𝟏𝟎𝟎𝐦𝐢𝐧+𝟐𝟓𝟎𝟎/𝟏𝟎𝟎𝐦𝐢𝐧=𝟐𝟎 𝒎𝒊𝒏+𝟐𝟓𝒎𝒊𝒏=𝟒𝟓 𝒎𝒊𝒏). &lt;/li&gt;
&lt;li&gt;Je mehr Autofahrer von der nördlichen Route auf die L2 wechseln, desto länger wird aber nun hier die Fahrtzeit: Für die „klassische“ südliche Route werden das &lt;strong&gt;70 Minuten&lt;/strong&gt;, da auf der L2 nun mehr Verkehr ist (𝟐𝟓𝟎𝟎/𝟏𝟎𝟎𝐦𝐢𝐧+𝟒𝟓 𝐦𝐢𝐧=𝟐𝟓 𝒎𝒊𝒏+𝟒𝟓𝒎𝒊𝒏=𝟕𝟎 𝒎𝒊𝒏).&lt;/li&gt;
&lt;li&gt;Durch diesen Zeitverlust werden sicher einige Fahrer von dieser Route auf die L2-X-L1-Route wechseln. Das führt nun wiederum für andere zu einer Verschlechterung der Fahrzeit auf der nördlichen Route, was dort wieder Fahrer veranlasst, auf die L2-X-L1-Route zu wechseln....&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ein Teufelskreis! &lt;/p&gt;
&lt;p&gt;Das Nash-Gleichgewicht in diesem neuen System tritt erst dann auf, wenn alle Fahrer über die Route L2-X-L1 fahren. In unserem Beispiel dauert das &lt;strong&gt;80 Minuten&lt;/strong&gt;! (𝟒𝟎𝟎𝟎/𝟏𝟎𝟎𝐦𝐢𝐧+𝟒𝟎𝟎𝟎/𝟏𝟎𝟎 𝐦𝐢𝐧=𝟒𝟎 𝒎𝒊𝒏+𝟒𝟎𝒎𝒊𝒏=𝟖𝟎 𝒎𝒊𝒏)&lt;/p&gt;
&lt;h2&gt;Das Paradoxe&lt;/h2&gt;
&lt;p&gt;Und hier liegt das „Braess-Paradoxon“: Bevor die neue Straße zwischen B und C gebaut wurde, &lt;strong&gt;lag die durchschnittliche Reisezeit bei 65 Minuten&lt;/strong&gt;. Nach dem Bau der neuen Straße bei &lt;strong&gt;80 Minuten&lt;/strong&gt;. In diesem Beispiel wären alle Verkehrsteilnehmer ohne die neue Straße X schneller am Ziel.&lt;/p&gt;
&lt;p&gt;Menschen wählen eher die Option, die für sie selbst am günstigsten ist – in diesem Fall eine Ersparnis von wenigen Minuten – als sich zum Besten Aller zu verhalten.&lt;/p&gt;
&lt;p&gt;Dieses Gedankenspiel erklärt aber nicht nur die Theorie, sondern auch, warum in der Praxis manchmal nach der Schließung von großen Verkehrsadern das befürchtete Chaos ausblieb:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In Seoul war lange Zeit der „Cheonggyecheon“ Highway eine wichtige Verkehrsader durch das Zentrum der Stadt. Im Jahr 2005 wurde er komplett entfernt und in ein grünes Naherholungsgebiet umgewandelt. Das von manchen befürchtete Verkehrschaos blieb aus, tatsächlich verbesserte sich die Verkehrssituation insgesamt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1990 hat die zeitweilige Schließung der 42. Straße in New York zu einer generellen Verbesserung des Verkehrsflusses geführt.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Stuttgart kam es 1969 nach Ausbau des Straßennetzes rund um den Schlossplatz zu Verkehrsproblemen, die erst wieder durch die Umwandlung eines Teils der Königsstraße in eine Fußgängerzone abgemildert wurden.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Welche Straße muss weg?&lt;/h2&gt;
&lt;p&gt;Mit genügend Computerleistung könnten wir vorausberechnen, wie Autofahrer ihr Verhalten ändern würden, wenn wir aus einem komplexen Straßennetz eine einzelne Straße entfernen. Die Kunst besteht aber darin herausfinden, welche Straße – in meinem Fall in der Überseestadt – überhaupt zu entfernen wäre, damit ich und viele andere nicht weiter im Stau stehen müssen.
Das allerdings würde uns schnell an physische Grenzen bringen: Wir haben zur Berechnung hiervon keinen wirklich effizienten Algorithmus und müssen alles simulieren. Wenn wir alle Kombinationen möglicher Straßensperrungen in einer Stadt einfach durchprobieren wollten, dann wären das bei einem Straßennetz von „nur“ 80 Straßen theoretisch aber schon mehr zu prüfende Kombinationen (2 hoch 80) als es Sterne im Universum gibt (10 hoch 22) – Nicht machbar innerhalb eines Menschenlebens mit heutigen Rechnerkapazitäten.&lt;/p&gt;
&lt;p&gt;Bei der Geschwindigkeit, mit der diese aber im Moment wachsen, ist das vielleicht aber nur eine Frage der Zeit. Vielleicht aber auch nicht.&lt;/p&gt;
&lt;p&gt;Bevor ich also das nächste Mal zum Feierabend im Stau stehe, überlege ich mir also am besten mit gesundem Menschenverstand eine Alternative. Vielleicht fahre ich doch lieber mit dem Rad…&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Mon, 06 Jul 2020 00:00:00 GMT</pubDate></item><item><title>Teams erstellen mit dem PNP Provisioning Schema</title><link>https://www.365konten.de/blog/2020-04-01/</link><guid isPermaLink="true">https://www.365konten.de/blog/2020-04-01/</guid><description>So geht es</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2020-04-01/&quot;&gt;https://www.365konten.de/blog/2020-04-01/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Es ist eigentlich eine gute Idee, neue Microsoft Teams nach einem bewährtem Schema anzulegen, sobald sich in der jeweiligen Organisation ein solches durchgesetzt hat. Ich zum Beispiel bin der Meinung, dass jedes Team einen &amp;quot;Lustiges und Ballons&amp;quot; Kanal braucht, in dem die Teammitglieder sich auch mal zu kurzweiligen anderen Themen (z.B. Geburtstagswünschen) austauschen können, um nicht die anderen Kanäle des Teams damit zu &amp;quot;überfluten&amp;quot;.&lt;/p&gt;
&lt;p&gt;Man könnte natürlich nun diesem Kanal jedes mal händisch anlegen, nachdem ein Team angelegt wurde. Das geht für diesen einen Anwendungsfall noch einigermaßen, sobald aber das Schema zur Teamsanlage komplizierter wird und mehrer Personen Teams anlegen, wird das händisch schnell nicht mehr praktikabel.&lt;/p&gt;
&lt;p&gt;Es gibt mehrere Methoden, um automatisch Teams anzulegen. Hier möchte ich euch aber die Methode vorstellen, dieses über die &lt;a href=&quot;https://docs.microsoft.com/de-de/sharepoint/dev/solution-guidance/introducing-the-pnp-provisioning-engine&quot;&gt;PNP Provisioning Engine&lt;/a&gt; zu tun. Seit der Version 2019-03 der geht das nämlich auch damit.&lt;/p&gt;
&lt;p&gt;Wir können die Engine entweder aus einer C# Anwendung heraus benutzen oder über das &lt;a href=&quot;https://docs.microsoft.com/de-de/powershell/sharepoint/sharepoint-pnp/sharepoint-pnp-cmdlets?view=sharepoint-ps&quot;&gt;PNP Powershell&lt;/a&gt; Modul. Nachdem dieses installiert wurde, brauchen wir nur zwei Befehle auszuführen, um ein Team anhand eines Templates zu erstellen.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;
# Verbindung zur Admin Site herstellen 
Connect-PnPOnline -Url &amp;quot;https://&amp;lt;Dein Tenant&amp;gt;-admin.sharepoint.com&amp;quot; -Scopes &amp;quot;Group.ReadWrite.All&amp;quot;,&amp;quot;User.Read.All&amp;quot;

# Die Datei teamsschema.xml anwenden und das Team erstellen 
Apply-PnPTenantTemplate .\teamsschema.xml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dazu brauchen wir aber natürlich auch noch eine XML Definitionsdatei.
Ein komplettes Beispiel aller Möglichkeiten des Provisioning Schemas findet hier &lt;a href=&quot;https://github.com/SharePoint/PnP-Provisioning-Schema/blob/master/Samples/ProvisioningSchema-2019-03-FullSample-01.xml&quot;&gt;hier&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Die folgende Datei zeigt nur ein kleines Beispiel davon und demonstriert, wie man ein neues Team mit dem Kanal &amp;quot;Lustiges und Ballons&amp;quot; anlegen kann.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;
&amp;lt;pnp:Provisioning xmlns:pnp=&amp;quot;http://schemas.dev.office.com/PnP/2019/03/ProvisioningSchema&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xsi:schemaLocation=&amp;quot;http://schemas.dev.office.com/PnP/2019/03/ProvisioningSchema https://raw.githubusercontent.com/OfficeDev/PnP-Provisioning-Schema/master/OfficeDevPnP.ProvisioningSchema/ProvisioningSchema-2019-03.xsd&amp;quot;&amp;gt;
  &amp;lt;pnp:Teams&amp;gt;
  &amp;lt;!-- Das Team erstellen--&amp;gt;
    &amp;lt;pnp:Team MailNickname=&amp;quot;DemoTeam&amp;quot; DisplayName=&amp;quot;Demo Team&amp;quot; Description=&amp;quot;Das ist neu ein Demo&amp;quot; Visibility=&amp;quot;Public&amp;quot; Archived=&amp;quot;false&amp;quot;&amp;gt;
       &amp;lt;pnp:Channels&amp;gt;
       &amp;lt;!-- Den Kanal &amp;quot;Lustiges und Ballons erstellen&amp;quot;--&amp;gt;
        &amp;lt;pnp:Channel DisplayName=&amp;quot;Lustiges und Ballons&amp;quot;
                     Description=&amp;quot;Benutzt diesen Kanal für alles, was off-topic ist&amp;quot;
                     IsFavoriteByDefault=&amp;quot;true&amp;quot;&amp;gt;
        &amp;lt;pnp:Messages&amp;gt;
        &amp;lt;!-- Zum Schluss noch eine Willkommensnachricht im Kanal posten --&amp;gt;
            &amp;lt;pnp:Message&amp;gt;
              &amp;lt;![CDATA[ 
              {
                &amp;quot;body&amp;quot;: {
                  &amp;quot;contentType&amp;quot;: &amp;quot;html&amp;quot;,
                  &amp;quot;content&amp;quot;: &amp;quot;Benutzt diesen Kanal für alles, was off-topic ist&amp;quot;
                },
                &amp;quot;subject&amp;quot;: &amp;quot;Willkommen im Kanal Lustiges und Ballons&amp;quot;
              }
              ]]&amp;gt;
            &amp;lt;/pnp:Message&amp;gt;
          &amp;lt;/pnp:Messages&amp;gt;
        &amp;lt;/pnp:Channel&amp;gt;
      &amp;lt;/pnp:Channels&amp;gt;
    &amp;lt;/pnp:Team&amp;gt;
  &amp;lt;/pnp:Teams&amp;gt;
&amp;lt;/pnp:Provisioning&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Wed, 01 Apr 2020 00:00:00 GMT</pubDate></item><item><title>Exponentielles Wachstum, Digitalisierung und Pandemien</title><link>https://www.365konten.de/blog/2020-03-10/</link><guid isPermaLink="true">https://www.365konten.de/blog/2020-03-10/</guid><description>Warum es gerade während einer Pandemie so wichtig ist, exponentielles Wachtum zu bereifen.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2020-03-10/&quot;&gt;https://www.365konten.de/blog/2020-03-10/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Menschen können expo­nen­ti­el­les Wachs­tum nicht so rich­tig gut begrei­fen. Wir denken norma­ler­weise eher linear. Nach dem Motto: &amp;quot;Wenn ich doppelt so viel Arbeit in irgen­det­was stecke, bin ich doppelt so schnell fertig.&amp;quot; Kein Wunder, denn das ist auch die Sicht­weise, die uns im alltäg­li­chen Leben weiter­hilft. Expo­nen­ti­el­les Wachs­tum funk­tio­niert aber komplett anders, und ich kenne zwei gute Beispiele, an denen man es sich gut verdeut­li­chen kann.&lt;/p&gt;
&lt;h2&gt;30 Schritte&lt;/h2&gt;
&lt;p&gt;Es gibt zum einen das Beispiel mit den 30 Schrit­ten, das ich einmal von dem Hambur­ger Unter­neh­mer Chri­stoph Magnus­sen gehört habe: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Blicken Sie jetzt einmal um sich und überlegen Sie, wo Sie in 30 Schritten sein könnten. Können Sie sich das gut vorstel­len? Wunder­bar. Mit einer durch­schnitt­li­chen Schritt­länge vom 1,5 Metern sind Sie damit etwa 45 Meter weit gekom­men &lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;((1,5 Meter) * 30 = 45 Meter).
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;Stel­len Sie sich jetzt für ein zwei­tes Gedan­ken­ex­pe­ri­ment vor, dass Sie zwar immer noch 30 Schritte machen, aber dass Sie bei jedem Schritt doppelt so viel Stre­cke zurück­le­gen, wie beim vorhe­ri­gen. Also beim ersten Schritt so in etwa 1,5 Meter, beim zwei­ten drei Meter, beim nächs­ten sechs Meter und so weiter.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Wo denken Sie, dass sie dann nach 30 Schrit­ten ange­kom­men sind? Noch in Deutsch­land? Noch in Europa? Viel­leicht doch schon in den USA?&lt;/p&gt;
&lt;p&gt;Falls Sie die Mathe­ma­tik nicht lang­weilt: &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(1,5 Meter) * (2^29) = 805306368 Meter = 805306,368 Kilo­me­ter
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sie sind also 800000 Kilo­me­ter von hier entfernt... Mehr als doppelt so weit weg, wie der Mond von der Erde entfernt ist. Von da an wird es übri­gens rich­tig span­nend. Nur ein paar Schritte weiter haben Sie das Sonnen­sys­tem verlas­sen!&lt;/p&gt;
&lt;h2&gt;Seerosen&lt;/h2&gt;
&lt;p&gt;Ein ande­res Beispiel, das ich neulich auf YouTube gese­hen habe (Sobald ich die Quelle wieder­finde, gebe ich sie hier mit an), sind die Seero­sen auf einem See.
Stellen Sie sich vor, auf einem See gibt es eine Seerose. An jedem Tag verdoppelt sich die Anzahl der Seerosen. Sagen wir weiter, dass der ganze See nach hundert Tagen komplett mit Seerosen bedeckt ist.&lt;/p&gt;
&lt;p&gt;Wir können uns nun zwei Fragen stel­len, deren Antwort auf den ersten Blick nicht intui­tiv rich­tig erscheint.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;An welchem Tag war der See zu 50 Prozent mit Seero­sen bedeckt?&lt;/li&gt;
&lt;li&gt;An welchem Tag war ein Prozent des Sees mit Seero­sen bedeckt?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Die Antwor­ten auf diese Fragen werden die meis­ten Leute scho­ckie­ren, die es nicht gewohnt sind, mit expo­nen­ti­el­lem Wachs­tum umzu­ge­hen.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Der See war am 99. Tag (also erst am vorletz­ten Tag) zu 50 Prozent mit Seero­sen bedeckt.&lt;/li&gt;
&lt;li&gt;Besorg­nis­er­re­gen­der ist aber die Antwort auf die zweite Frage: Der See war erst am 93. Tag zu einem Prozent mit Seero­sen bedeckt.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Falls ich nicht die tech­ni­sche Möglich­keit habe, pro Tag wenigs­tens ein Prozent des Sees von Seero­sen zu befreien und ich nicht spätes­tens am 93. Tag damit beginne, diese zu entfer­nen, habe ich nun keine Chance mehr.
Das widerspricht sehr stark linearem Denken: Ich hätte mich des Problems schon dann annehmen müssen, als es noch nicht einmal besonders sichtbar aufgetreten ist.&lt;/p&gt;
&lt;p&gt;An diesem Beispiel sieht man aber auch eine natür­li­che Beschrän­kung von expo­nen­ti­el­lem Wachs­tum. Da der See zu 100 Prozent mit Seero­sen bedeckt und alle Fläche aufge­braucht ist, stoppt das Wachs­tum am 101. Tag. Diese Art von Wachs­tum (expo­nen­ti­el­les Wachs­tum, das nicht über eine gewisse Grenze hinaus andau­ern kann) nennt man auch logis­ti­sches Wachs­tum. Dieses ist auch die &amp;quot;Normal­form&amp;quot; von expo­nen­ti­el­lem Wachs­tum in unse­rer Welt.&lt;/p&gt;
&lt;h2&gt;Digitalisierung&lt;/h2&gt;
&lt;p&gt;Aber auch im Digi­ta­len gibt es expo­nen­ti­el­les Wachs­tum. Konkret kann man das zum Beispiel an dem im Jahr 1965 formu­lier­ten Gesetz von Moore erken­nen:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The number of tran­sis­tors in a dense inte­gra­ted circuit doubles about every two years.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Die Tran­sis­tor­dichte in einem Mikro­chip verdop­pelt sich alle zwei Jahre. Extrem verein­facht, aber nicht hundert­pro­zen­tig rich­tig, bedeu­tet das auch, dass sich die Geschwin­dig­keit von neuen Compu­tern alle zwei Jahre verdop­pelt.&lt;/p&gt;
&lt;p&gt;Wenn Sie jetzt gerade beispiels­weise denken, dass etwa die künst­li­che Intel­li­genz die Welt verän­dert, die wir im Moment in der Cloud kennen und span­nende Auswer­tun­gen auf Bigdata-Basis möglich macht, dann soll­ten Sie sich einmal mit Ray Kurzweil (Futu­rist und &amp;quot;Direc­tor of Engi­nee­ring&amp;quot; bei Google) beschäf­ti­gen.&lt;/p&gt;
&lt;p&gt;Er sagt für das Jahr 2029 (rich­tig gele­sen: in nur 9 Jahren) voraus, dass dann ein handels­üb­li­cher, 1.000 Dollar teurer Compu­ter 1000-mal so leis­tungs­fä­hig sein wird, wie das mensch­li­che Gehirn. Kurzweil lag bisher zu 87 Prozent mit seinen ande­ren Vorher­sa­gen rich­tig.&lt;/p&gt;
&lt;p&gt;Was die allge­meine Verfüg­bar­keit solch einer Rechen­leis­tung für die Wirt­schaft und die Gesell­schaft im Allge­mei­nen bedeu­ten wird, ist kaum vorzu­stel­len. Die Welt wird sich aber sicher in zehn Jahren komplett verän­dert haben.&lt;/p&gt;
&lt;p&gt;Mit star­ren Prozes­sen, die Monate oder gar Jahre brau­chen, um sich auf neue Heraus­for­de­run­gen einzu­stel­len, wird man es sehr wahr­schein­lich nicht hinkrie­gen, mit der sich rapide ändern­den Welt Schritt zu halten. Dafür ist ein gewis­ses Umden­ken zu schnel­len, flexiblen und agilen Prozes­sen, Mind­sets und Geschäfts­mo­del­len nötig, welches wir uns jetzt schon ange­wöh­nen müss­ten.&lt;/p&gt;
&lt;h2&gt;Pandemien&lt;/h2&gt;
&lt;p&gt;Viren verbrei­ten sich eben­falls mit expo­nen­ti­el­ler Geschwin­dig­keit und darin besteht auch ihre Gefahr. In den ersten Tagen und Wochen stecken sich nur sehr wenige Menschen mit dem Virus an. Und diese sind meist von einem persön­lich weit entfernt und man fühlt sich sicher. Dann – schlag­ar­tig – hört man von den ersten Fällen im eige­nen Umfeld und ein oder zwei Tage später ist auf einmal jeder krank, den man kennt.&lt;/p&gt;
&lt;p&gt;Das einzige, was wir – gerade in Zeiten des Corona-Virus – dage­gen tun können, ist den expo­nen­ti­el­len Wachs­tums­fak­tor abzu­schwä­chen und damit dafür zu sorgen, dass die tägli­che Stei­ge­rung von Neuan­ste­ckun­gen unter­halb der Grenze der Leis­tungs­fä­hig­keit unse­res Gesund­heits­sys­tems bleibt – und das lange, lange bevor es auch nur den Anschein hat, dass das System über­las­tet sein könnte.&lt;/p&gt;
&lt;p&gt;Um das zu schaf­fen, müssen wir als Gesell­schaft die tägli­che Infek­ti­ons­rate verrin­gern und dafür sorgen, dass die logis­ti­sche Grenze der expo­nen­ti­el­len Neuan­ste­ckun­gen im Ideal­fall klei­ner als 1 wird (im Gegen­satz zu den vorhe­ri­gen Beispie­len, bei denen sie bei 2 lag).&lt;/p&gt;
&lt;p&gt;Die Infek­ti­ons­rate setzt sich hier aus zwei Fakto­ren zusam­men:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Die Anzahl der sozia­len Kontakte, die Perso­nen im Durch­schnitt täglich haben und an die das Virus weiter­ge­ge­ben werden könnte.&lt;/li&gt;
&lt;li&gt;Die Wahr­schein­lich­keit der Über­tra­gung von einer Person zur nächs­ten.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Daraus resul­tie­ren auch die beiden wich­tigs­ten Schritte, die wir im Moment ergrei­fen können:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Jeder von uns muss sich möglichst weit von ande­ren Perso­nen fern­hal­ten und soziale Kontakte massiv einschrän­ken. Dadurch mini­mie­ren wir die Anzahl derer, die sich anste­cken könn­ten.&lt;/li&gt;
&lt;li&gt;Jeder von uns muss einfa­che und eigent­lich auch selbst­ver­ständ­li­che Hygie­ne­re­geln einhal­ten, wie etwa sich regel­mä­ßig die Hände mit Seife zu waschen, immer nur in die Armbeuge zu husten und viele andere sehr einfach einzu­hal­tende Regeln.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Nur so können wir viel­leicht sicher­stel­len, dass die Grenze des logis­ti­schen Wachs­tums in dieser Pande­mie unter­halb der Grenze der Leis­tungs­fä­hig­keit unse­res Gesund­heits­sys­tems bleibt und viel­leicht eine Kata­stro­phe verhin­dern.&lt;/p&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Mon, 23 Mar 2020 00:00:00 GMT</pubDate></item><item><title>XSL Transformation mit Powershell</title><link>https://www.365konten.de/blog/2020-02-28/</link><guid isPermaLink="true">https://www.365konten.de/blog/2020-02-28/</guid><description>Einfach erklärt</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2020-02-28/&quot;&gt;https://www.365konten.de/blog/2020-02-28/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Ich kenne XSL-Transformationen schon lange und benutze Sie gerne. 
XSL steht für &amp;quot;X&amp;quot;tensible &amp;quot;S&amp;quot;tylesheet &amp;quot;L&amp;quot;anguage und ist für eine Methode, mit der man aus den Daten in einer XML Datei und einem Stylesheet eine Textdatei erzeugen kann.&lt;/p&gt;
&lt;p&gt;XSL ist ein wenig aus der Mode gekommen, bietet gegenüber anderen Template Systemen aber ein paar - in meinen Augen sehr interessante - Features, die man sonst nirgendwo findet.&lt;/p&gt;
&lt;p&gt;Aber erstmal ein Beispiel:&lt;/p&gt;
&lt;p&gt;Mit diesem XML (&amp;quot;input.xml&amp;quot;)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;data&amp;gt;
    &amp;lt;row title=&amp;quot;Rot&amp;quot; colorcode=&amp;quot;#F00&amp;quot; /&amp;gt;
    &amp;lt;row title=&amp;quot;Blau&amp;quot; colorcode=&amp;quot;#00F&amp;quot; /&amp;gt;
    &amp;lt;row title=&amp;quot;Gelb&amp;quot; colorcode=&amp;quot;#FF0&amp;quot; /&amp;gt;    
&amp;lt;/data&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;und diesem XSL (&amp;quot;stylesheet.xsl&amp;quot;)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;data&amp;gt;
    &amp;lt;row title=&amp;quot;Rot&amp;quot; colorcode=&amp;quot;#F00&amp;quot; /&amp;gt;
    &amp;lt;row title=&amp;quot;Blau&amp;quot; colorcode=&amp;quot;#00F&amp;quot; /&amp;gt;
    &amp;lt;row title=&amp;quot;Gelb&amp;quot; colorcode=&amp;quot;#FF0&amp;quot; /&amp;gt;    
&amp;lt;/data&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;können wir die folgende HTML Datei erzeugen (&amp;quot;output.html&amp;quot;)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;data&amp;gt;
    &amp;lt;row title=&amp;quot;Rot&amp;quot; colorcode=&amp;quot;#F00&amp;quot; /&amp;gt;
    &amp;lt;row title=&amp;quot;Blau&amp;quot; colorcode=&amp;quot;#00F&amp;quot; /&amp;gt;
    &amp;lt;row title=&amp;quot;Gelb&amp;quot; colorcode=&amp;quot;#FF0&amp;quot; /&amp;gt;    
&amp;lt;/data&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dafür brauchen wir aber ein XSL Transformations Tool.
Glücklicherweise können wir uns da aber recht einfach eine Powershell Function erstellen&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-powershell&quot;&gt;function Transform-XML{
    param ($xml, $xsl, $output)
    {
        # Prepare settings objects
        $xslt_settings = New-Object System.Xml.Xsl.XsltSettings;
        $XmlUrlResolver = New-Object System.Xml.XmlUrlResolver;
        $argslist= New-Object System.Xml.Xsl.XsltArgumentList;
    
        # Prepare stylesheets 
        $xslt = New-Object System.Xml.Xsl.XslCompiledTransform;
        $xslt.Load($xsl,$xslt_settings,$XmlUrlResolver);

        # Prepare outfile
        $outFile= new-object System.IO.FileStream($output,[System.IO.FileMode]::Create,[System.IO.FileAccess]::Write)

        # Transform the file
        $xslt.Transform($xml,$argslist,$outFile);
        $outFile.Close()
    }

# Invoke the function
Transform-XML ./input.xml ./stylesheet.xsl ./output.html
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Fri, 28 Feb 2020 00:00:00 GMT</pubDate></item><item><title>Müssen E-Mails sein?</title><link>https://www.365konten.de/blog/2020-02-06/</link><guid isPermaLink="true">https://www.365konten.de/blog/2020-02-06/</guid><description>Ich glaube das nicht und erzähle Ihnen hier warum.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://www.365konten.de/blog/2020-02-06/&quot;&gt;https://www.365konten.de/blog/2020-02-06/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;Kennen Sie das &amp;quot;verlorene Interview&amp;quot; aus dem Jahr 1990 mit Steve Jobs? &lt;/p&gt;
&lt;p&gt;Falls nicht, dann finden Sie es über eine kurze Suche auf Youtube. Konkret möchte ich aber hier ihr Augenmerk auf den Abschnitt des Interviews lenken, in dem über E-Mails gesprochen wird: Steve Jobs erklärt hier dem Reporter, der im Jahr 1990 noch nie das Internet gesehen hat, wie man mit E-Mails umgeht:
	&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If we want to — if we’re going to be doing a special project let’s say with a company, and we — and let’s say the company is called, what’s your…WGBH. We’re going to be doing a special project with WGBH. 
And what we’ll do is we’ll create a special mailbox, WGBH and we’ll put twenty people on it that are going to be helping on this project. 
Now these twenty people will be from all over our company,&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;And if one sends a message to this mailbox, they’ll all get it like that, instantly.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;And it will be like a beehive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;So I’ll put my own name on this mailbox and I’ll see these thirty mail messages fly by&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Again the thoughts, disagreements and decisions of a company fly by a manager in a way that they never could before. And we have seen it reduce the number of meetings we have at least by fifty percent.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Fällt Ihnen etwas auf? &lt;/p&gt;
&lt;p&gt;Das klingt im ersten Moment gar nicht danach, wie wir E-Mails benutzen. Er spricht hier davon, pro Projekt bzw. Vorgang ein eigenes Postfach anzulegen, in welches sich dann aus allen Teilen des Unternehmens Menschen einwählen können und die Informationen mitlesen oder mitdiskutieren können. 
Von einem persönlichen Postfach, an das viele von uns im ersten Moment bei dem Schlagwort &amp;quot;E-Mails&amp;quot; denken würden, spricht er hier überhaupt nicht.
Das ist eine gänzlich andere Art, mit der digitalen Post umzugehen. Diese Idee kam in den vergangenen Jahren in Form von chatbasierten Applikationen wieder auf, die zurzeit in den Entwickler-Communities eine enorme Popularität erleben. Vertreter davon sind zum Beispiel &amp;quot;Slack&amp;quot;, &amp;quot;HipChat&amp;quot; und Microsofts &amp;quot;Teams&amp;quot;.&lt;/p&gt;
&lt;p&gt;Aber von diesen Tools sind einige Kollegen in vielen Firmen noch weit entfernt und haben da ganz andere Probleme.
Während die einen sich darüber beklagen, dass ihre Archive mit einer Speicherkapazität von 50 GB viel zu klein sind für die Flut von E-Mails, die sie in den letzten Jahren angesammelt haben, beschweren sich die anderen darüber, dass ihr Posteingang viel zu voll ist und sie Tools und Methoden brauchen, um diesen zu organisieren.&lt;/p&gt;
&lt;p&gt;Aber muss das so sein? Ich würde gerne im Folgenden einmal mit Ihnen zusammen all ihre E-Mails in Ihrem Posteingang in verschiedene Kategorien einteilen und zeigen, was je für Alternativen zu E-Mails gibt. 
Sie werden erstaunt sein, wie wenige E-Mails danach noch in ihrem Posteingang übrigbleiben, wenn sie all diese entfernen.&lt;/p&gt;
&lt;h2&gt;E-Mails als Aufgabe&lt;/h2&gt;
&lt;FontAwesomeIcon icon=&quot;tasks&quot;  size=&quot;6x&quot; /&gt;

&lt;p&gt;In vielen Unternehmen ist das der klassischste Anwendungsfall von E-Mails. Ich möchte jemandem einen Arbeitsauftrag zuweisen (&amp;quot;Bitte erledige für mich dieses und jenes&amp;quot;) und möchte über den Fortschritt der Aufgaben informiert werden (&amp;quot;Wie ist denn der Stand bezüglich XYZ?&amp;quot;, &amp;quot;Wann wird XYZ in etwa fertig&amp;quot;)
Das per Mail zu tun ist nahezu verführerisch einfach. Ich muss einfach eben mal kurz eine E-Mail schreiben und dann ist das für mich erledigt.
Das produziert aber erheblichen, aber im ersten Moment noch verdeckten Aufwand. Ich muss mir selbst in einer Art Aufgabeliste merken, welche Aufgaben ich weggeschickt habe und mein Gegenüber muss dies auch tun. Damit wir sichergehen können, dass wir beide denselben Abarbeitungsstand haben müssen wir uns regelmäßig darüber abstimmen, wie dieser Stand nach unseren beiden Meinungen ist (Die typischen &amp;quot;Wie ist denn der aktuelle Stand von XYZ&amp;quot;-E-Mails) Dazu kommt dann noch, dass ich nicht erkennen kann, ob mein Gegenüber komplett überlastet oder sogar gar nicht im Hause ist und selbst dann noch die Aufgabe aktiv weiterdelegieren muss.
Wenn ich E-Mails so benutze, benutze ich meinen Posteingang als eine Aufgabenliste, die jemand anderes als ich pflegt und ich reagiere nur auf Ereignisse und sich permanent ändernden Prioritäten darin. Dadurch werde ich sehr stark durch von meinem Posteingang getrieben.&lt;/p&gt;
&lt;p&gt;Viel einfacher wäre es, wenn ich mir mit meinem Gegenüber eine Aufgabeliste teilen würde, in der alle unsere Aufgaben vorhanden sind und jeweils einer Person mit der Bitte zugewiesen werden, diese Aufgabe zu erledigen, zu kommentieren und den Status entsprechend zu ändern. Damit hat dann später jeder die Übersicht über den Stand aller Aufgaben. Im Idealfall könnte sogar noch jemand alle Aufgaben priorisieren und alle Kollegen die Aufgabeliste einfach von oben nach unten abarbeiten.&lt;/p&gt;
&lt;p&gt;Das kann man zum Beispiel im einfachsten Fall einfach Outlook Aufgaben sein, bessere Auswertungsmöglichkeiten und gar komplette Workflows haben dann aber zum Beispiel Tools wie Atlassians &amp;quot;Jira&amp;quot;. Oder Sie wählen dafür das gute, alte und analoge Kanban Board an der Wand.&lt;/p&gt;
&lt;h2&gt;E-Mailpostfach als Archiv oder Nachschlagewerk&lt;/h2&gt;
&lt;FontAwesomeIcon icon=&quot;boxes&quot;  size=&quot;6x&quot; /&gt;

&lt;p&gt;Eine Sache, die sich schnell bei manchen Mitarbeitern - jenen vom Typus &amp;quot;Jäger und Sammler&amp;quot; - einbürgert, ist eine Sammelwut in Bezug auf E-Mails. 
Beschreibungen und Anleitungen von Prozessen, wichtige Informationen und auch Passwörter werden in mehr oder minder gut geordneten Ordnerstrukturen in den Postfächern gehortet. Die Kollegen sind auch häufig der Meinung, dass Sie sich hier gut zurechtfinden und können tatsächlich nach Aufforderung schnell die richtige E-Mail zu dem Thema aus ihrem &amp;quot;System&amp;quot; hervorzaubern. (&amp;quot;Das hat mit XYZ 2015 mal geschrieben… warte mal… Habe ich dir weitergeleitet&amp;quot;). Dieses Stück Information kann nun das Gegenüber natürlich in der eigenen E-Mail-Ablage-Struktur ablegen und hat sie dann auf Dauer verfügbar.
Wenn dann aber genau der Kollege nicht im Hause ist, dann weiß niemand, wie an diese Information zu gelangen ist. Oder noch viel schlimmer - niemand weiß, dass die Information überhaupt irgendwo vorhanden ist. &lt;/p&gt;
&lt;p&gt;Hier würde eher eine gemeinsame, strukturierte Ablage von Informationen Sinn machen. Sobald ich eine Information erhalten habe und sie aufbewahren möchte, dann trage ich sie in der Ablage ein und jeder meiner Kollegen kann sie sich dort ansehen.
Das hilft dann auch gegen ein weiteres Problem:  Was passiert denn, wenn sich einzelne Informationen in der abgelegten E-Mail nicht mehr aktuell sind? Dann gibt es höchstwahrscheinlich eine zweite E-Mail, in der die neuen Informationen beschrieben sind. Wer die nicht hat, handelt nach veralteten Informationen. Das kann mit einer zentralen Informationsablage, an der immer die aktuelle Information beschrieben ist, nicht passieren.&lt;/p&gt;
&lt;p&gt;Häufig werden für solche Informationssysteme in der Praxis Wikis verwendet. Bei manchen Systemen, wie z.B. Atlassians &amp;quot;Confluence&amp;quot; kann man sogar noch einzelne Informationsartikel &amp;quot;abonnieren&amp;quot; um über spätere Aktualisierungen des Inhalts informiert zu werden.&lt;/p&gt;
&lt;h2&gt;E-Mails als Absicherung&lt;/h2&gt;
&lt;p&gt;Es gibt noch einen weiteren Grund, aus dem sich manche Leute recht anschauliche Mailarchive aufbauen: &amp;quot;Absicherungen&amp;quot;. 
Das sind E-Mails, die ich mir weglege, weil ich später einmal sagen will: &amp;quot;Das habe ich dir doch schon an Datum ABC gesagt&amp;quot;. Typischerweise sind das dann auch E-Mails, bei denen bestimmte Leute im CC mit &amp;quot;ankopiert&amp;quot; werden - aber eigentlich nicht, damit diese Personen etwas tun, sondern nur damit sie jene diese E-Mails auch in ihrem Posteingang haben und am besten auch gleich in ihr persönliches E-Mailarchiv verschieben…. Nur für den Fall.
Dahinter steckt die Angst, dass sich das Gegenüber später an einmal getroffene Aussagen nicht mehr erinnern mag und man das dann doch lieber &amp;quot;schriftlich&amp;quot; hätte. Das ist eine verständliche Angst, aber auch eine die eigentlich in einem modernen, agilen Unternehmen eigentlich entkräftet werden müsste.&lt;/p&gt;
&lt;p&gt;Hier könnten Sie versuchen, wichtige Entscheidungen und Absprachen immer auf einer Wiki-Seite oder innerhalb eines Dokumentes zusammenzufassen, dieses immer allen Teilnehmern zur Verfügung zu stellen und sich bei allen Entscheidungen nur auf diese, für alle sichtbaren Informationen zu berufen.&lt;/p&gt;
&lt;p&gt;Das Vorgehen werden Sie vielleicht kennen: Das ist im Endeffekt einfach sowas wie ein klassisches Protokoll einer Sitzung oder eines Termines&lt;/p&gt;
&lt;h2&gt;E-Mails als Dokumentenaustausch&lt;/h2&gt;
&lt;p&gt;Weiter kommt es in Unternehmen natürlich häufig vor, dass Dokumente von mehreren Personen erstellt werden müssen. Diese werden dann auch häufig der Einfachheit halber direkt per Mail hin- und hergeschickt. Das führt aber nun auch wieder zu Problemen und zu einem erhöhten Aufwand. Wenn ich nun an der – in meinen Augen aktuellen - Datei in meinem Posteingang arbeite weiß ich nicht, ob das wirklich die aktuelle Version der Datei ist oder ob jemand anderes schon an der Datei in seinem Posteingang gearbeitet hat und mir das aktuelle Ergebnis nur noch nicht weitergeleitet hat. Im Schlimmsten Fall habe ich dann mehrere Versionen einer Datei, die ich dann aufwändig wieder zusammenführen muss.
Einfacher wäre es, wenn ich gar keine Dateien mehr per E-Mail verschicken würde, sondern eine zentrale Ablagen Bereich hätte, in dem ich mit allen meinen Kollegen gemeinsam an dem Dokument arbeiten könnte. 
Dann bräuchte ich ihnen nur noch eine Mail mit dem Link zu dem Dokument schicken mit der Aufgabe, dieses zu bearbeiten.... Moment mal, wie wir im Abschnitt &amp;quot;E-Mails als Aufgabe&amp;quot; schon erläutert haben, sollte ich selbst dieses nicht tun, sondern meinen Kollegen in unserem Aufgabenverwaltungssystem den Auftrag zur Bearbeitung dieser Datei zuweisen.&lt;/p&gt;
&lt;p&gt;Beispiele für zentrale Dateiablagen sind klassische Netzwerklaufwerke aber auch erweiterte Dokumentenplattformen wie etwa &amp;quot;SharePoint&amp;quot; und &amp;quot;Teams&amp;quot; von Microsoft oder &amp;quot;Google Docs&amp;quot;. Die erweiterten Plattformen unterstützen dann auch noch gleichzeitige Arbeit an demselben Dokument (ohne die Meldung &amp;quot;Die Datei ist zur Bearbeitung durch den Benutzer XYZ gesperrt&amp;quot;) sowie Kommentare und Kommunikationen in Bezug auf das Dokument, die mit außerhalb des Dokumentes Informationen zur Erstellungsverlauf des Werkes geben.&lt;/p&gt;
&lt;h2&gt;E-Mails als Umfragen&lt;/h2&gt;
&lt;p&gt;Recht häufig gibt es dann auch noch E-Mails mit einem Umfragen-Charakter.  Generell ist das immer so, wenn ich eine größere Gruppe von Kollegen eine Frage stellen möchte und die Ergebnisse schlussendlich in einer Liste zusammenführen möchte. Das könnten zum einen die einfache Erstellung einer Teilnehmerliste für ein Event sein, also etwa &amp;quot;Wer teilnehmen möchte, der kann sich ja kurz per E-Mail bei mir melden&amp;quot;. Zum anderen verbergen sich dahinter auch aber auch komplexere Anforderungen etwa der Art: &amp;quot;Schickt mir bitte zum Monatsende alle eure Aufwände für das Projekt zu, damit ich für den Kunden eine Aufstellung erzeugen kann&amp;quot; oder &amp;quot;Hier ist eine neue Handlungsanweisung, bestätige mir bitte, dass du sie zur Kenntnis genommen hast&amp;quot;.
Das geht natürlich per Mail, sie ist dafür hier aber aus zwei Gründen das falsche Mittel. Zum einen erzeugt so eine Umfrage per E-Mail gleich mehrfach Aufwand, nämlich den nicht vermeidbaren bei dem der die Umfrage beantwortet und gleichzeitig den vermeidbaren bei dem, der die Umfrage auswerten muss. Letzterer muss ja alle E-Mail-Antworten aufnehmen, korrekt interpretieren und in eine zentrale Liste einpflegen. Je nach Anzahl der Antworten kann das eine massiven Aufwand bedeuten.
Zum anderen ist die Auswertung der E-Mails fehleranfällig.  Es kann leicht passieren, dass eine einzelne E-Mail übersehen wird oder dass eine &amp;quot;Korrektur&amp;quot;-E-Mail eines Umfrageteilnehmers nicht korrekt eingetragen wird.
Eine einfache Lösung für das Problem sind formulargestützte Umfragen. Als Ersteller der Umfrage bereite ich ein Formular vor, welches dann alle Teilnehmer ausfüllen können. Die Ergebnisse landen automatisch in einer zentralen Liste
Beispiele für solche Umfragetools gibt es äußerste viele, die sich zumeist im Bedienungskomfort und in diversen Nebenanforderungen (etwa Zielgruppe Kollegen/Kunden/Internet oder Anonymisierung und Datenschutz) unterscheiden. Hier würde ich im generellen Business-Umfeld persönlich auf zwei Lösungen verweisen: Microsofts &amp;quot;Forms&amp;quot; und &amp;quot;Google Forms&amp;quot;. Ansonsten gibt es auch Umfragen, die speziellere Szenarien zugeschnitten sind, wie etwa &amp;quot;Doodle&amp;quot; zur Koordination von Terminen.&lt;/p&gt;
&lt;h2&gt;E-Mails als Neuigkeiten oder Newsletter&lt;/h2&gt;
&lt;p&gt;Schließlich werden auch häufig generelle Neuigkeiten über E-Mails verbreitet. Das könnte dann zum Beispiel der generelle Newsletter des Unternehmens sein oder etwa Neuigkeiten im Produktkatalog eines Zulieferers. Hierzu zählen dann aber auch Statusberichte von Projekten oder die Information über eine neue Handlungsanweisung.
Generell ist es hier immer so, dass eine Einzelperson oder kleinere Gruppe Informationen hat, die sie einer größeren Gruppe von Empfängern bereitstellen will. Der &amp;quot;Sender&amp;quot; der Informationen ist hier aber nicht primär an einer Antwort von allen Empfängern auf die Mail interessiert (Obwohl qualifiziertes &amp;quot;Feedback&amp;quot; häufig gewünscht ist). &lt;/p&gt;
&lt;p&gt;Nun, aus Sicht des Senders ist es hier nicht falsch, mit E-Mails zu arbeiten, da es ein sicherer und einfacher Weg ist, die Information an die gewünschten Adressaten zu verbreiten. Leider ist dies aber auch das digitale Äquivalent einer Postwurfsendung. Als Empfänger kriege ich die Mail, egal ob ich will oder nicht. &lt;/p&gt;
&lt;p&gt;Häufig werden die Informationen aus diesen &amp;quot;Newslettern&amp;quot; dann aber auch nirgendwo anders (etwa dem Intranet) abgelegt. Sie sollten sich dann hier die Frage stellen, ob das nicht einfach reicht. 
Falls Sie Ihre Mitarbeiter nochmal extra auf den &amp;quot;neuen&amp;quot; Newsletter hinweisen wollen, dann können Sie sie natürlich noch einmal kurz per E-Mail darauf hinweisen. Diese E-Mail können die Empfänger nach Kenntnisnahme aber auch sofort löschen, ohne dass ein Informationsverlust auftritt.&lt;/p&gt;
&lt;h2&gt;E-Mails als Berichte&lt;/h2&gt;
&lt;p&gt;In regelmäßigen Abständen bekomme ich einen Bericht, der mir die aktuellen Informationen etwa zu einem Projekt zusammenfasst.
Ist das wirklich von der Idee so anders als der oben diskutierte Newsletter? Informationen werden von jemand anderem aggregiert und ggf. kuratiert und mir dann in einer aufgearbeiteten Form zugeschickt.
Aber vielleicht bekomme ich denselben Bericht zweimal, weil im ersten ein Fehler war. Und dann habe ich den ersten schon weitergeleitet und habe nun Kommunikationsaufwände, um das wieder gerade zu ziehen.&lt;/p&gt;
&lt;p&gt;Den jeweils aktuellen Bericht könnte man besser als ein zentral abgelegtes Dokument oder eine Wiki Seite erstellen. Damit würden wir auch direkt ein - falls gewollt - für andere einsehbares Archiv aufbauen, in dem alle Berichte abgelegt werden.
Aktualisierungen eines Berichtes sind dann auch sehr einfach.&lt;/p&gt;
&lt;p&gt;Gegen eine kurze E-Mail, die mitteilt, dass es an dem definierten Ort einen neuen Bericht gibt, ist hier nichts einzuwenden. Wir beim Newsletter kann diese Benachrichtigung aber auch sofort nach Erhalt wieder gelöscht werden, da die eigentlich wichtige Information im abgelegten Bericht vorgehalten wird.&lt;/p&gt;
&lt;h2&gt;Die ganzen restlichen E-Mails&lt;/h2&gt;
&lt;p&gt;Falls Sie alle oberen Vorschläge berücksichtigt haben, dann sollte sich ihr Postfach schon massiv verkleinert haben.
Sicher, da bleiben noch viele E-Mails über, über die man sich analog zu den Beispielen Gedanken machen muss, aber im Prinzip können wir für jede Intention hinter einer E-Mail einen anderen Kanal finden. Und im Regelfall bieten diese Kanäle sogar Vorteile im Gegensatz zur E-Mail.&lt;/p&gt;
&lt;p&gt;Ich hoffe, dass Sie de folgende Aussage aus diesem Artikel mitgenommen haben&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Eine E-Mail scheint häufig das einfache Mittel zu sein, um eine Aufgabe zu erledigen, sie ist aber selten das Effizienteste.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><dc:creator>Sven Sieverding</dc:creator><pubDate>Thu, 06 Feb 2020 00:00:00 GMT</pubDate></item></channel></rss>