Skip to main content
Skip table of contents

Schweizer QR Vorgaben ab November 2025

(Verfügbar ab Pre-Release v2.0.2509.x)

Anpassen von Bestandsreports (Hybrid Kundenanlagen) an die neuen Schweizer QR Vorgaben ab November 2025

Dieses Hilfe dient als Unterstützung zum bereitgestellten Praxisvideo, wo alle Änderungen Step by Step mitverfolgt werden können.

Ab dem 21. November 2025 treten in der Schweiz neue Vorgaben für die QR-Rechnung in Kraft. Diese erfordern, dass sämtliche Adressangaben im QR-Code zwingend in strukturierter Form angegeben werden müssen. Der bisher zulässige Adresstyp „K“ entfällt vollständig. Damit müssen Straße, Hausnummer, Postleitzahl und Ort künftig stets als separate Felder erfasst und im QR-Code abgebildet werden.

Ziel dieses Whitepapers ist es, Ihnen eine praxisorientierte Anleitung an die Hand zu geben, wie Sie Ihre bestehenden Hybrid Kundenanlagen Reports ab Version 23.x an die neuen Anforderungen anpassen können. Dadurch ist es nicht erforderlich, auf einen komplett neuen Report zu wechseln. Ihr Vorteil: Individuelle CI-Designeinstellungen bleiben erhalten und müssen nicht erneut eingestellt und in einen neuen Report übertragen werden.

Sollten in Ihrem bestehenden Report keine oder nur wenige CI-Anpassungen enthalten sein, können Sie alternativ die aktuelle Reportversion aus dem Reportportal laden und einsetzen. Damit haben Sie beide Möglichkeiten – entweder die Anpassung des bestehenden Reports oder die Verwendung der neuesten Standardversion.

Weitere Informationen zu Reports mit Version 22.x und früher

Bitte beachten Sie: Reports mit einer Version älter als 23.x (z.b. 22.x, oder früher) können mit diesem Whitepaper nicht berücksichtigt werden. In diesen Versionen sind die erforderlichen Änderungen und Funktionen noch nicht enthalten, sodass eine Anpassung an die neuen Vorgaben nicht möglich ist.

Für eine gesetzeskonforme Darstellung des QR-Codes ist es daher unumgänglich, dass Sie auf eine neuere Version des Hybrid-Reports umstellen.

ÜBERSICHT DER BETROFFENEN BEREICHE

Um die gesetzlichen Anforderungen zur strukturierten Adressdarstellung in der QR-Rechnung umzusetzen, sind Anpassungen an mehreren Stellen erforderlich. Diese betreffen sowohl den technischen Bereich (Abfragen und Code) als auch den Report selbst. Im Einzelnen sind folgende Bereiche betroffen:

  1. Zusätzliche Abfrage (SQL-Query)

    • Erweiterung des Reports um eine neue Datenbankabfrage

    • Ziel ist es, die benötigten Felder (Straße, Hausnummer, Postleitzahl, Ort) strukturiert bereitzustellen

  2. Anpassungen im Codebereich

    • Ergänzung neuer Variablen für die strukturierte Adressverarbeitung

    • Hinzufügen von Code an verschiedenen Stellen, um die Übergabe und Verarbeitung der neuen Felder sicherzustellen

  3. Änderungen auf der Reportseite „pgQR“

    • Austausch der bisherigen Variablen durch die neuen strukturierten Adressvariablen

    • Anpassung des Inhalts des QR-Codes entsprechend der neuen gesetzlichen Vorgaben

DETAILBESCHREIBUNG DER ÄNDERUNGEN

In den folgenden Kapiteln werden die erforderlichen Anpassungen im Detail erläutert. Dabei wird Schritt für Schritt aufgezeigt, welche Änderungen an den Abfragen, im Code sowie im Report selbst notwendig sind, um die strukturierte Adressdarstellung in der QR-Rechnung korrekt umzusetzen.

Bitte erstellen Sie vor Beginn der Arbeiten eine Sicherheitskopie Ihres aktuellen Reports. So stellen Sie sicher, dass bei Bedarf jederzeit auf die bestehende Version zurückgegriffen werden kann.

ÄNDERUNGEN IN DEN ABFRAGEN

Damit die strukturierten Adressangaben in den QR-Code übernommen werden können, muss der Report um eine zusätzliche SQL-Abfrage erweitert werden. Gehen Sie dabei wie folgt vor:

  1. Öffnen Sie den gewünschten Report über die Reportverwaltung (Doppelklick).

  2. Wählen Sie in der Menüleiste den Punkt Neu.

    image-20251010-050029.png
  3. Fügen Sie eine neue Query ein und benennen Sie diese qry_QR_Kunde.

  4. Tragen Sie anschließend folgenden SQL-Code in die Abfrage ein und speichern danach die Abfrage:

SQL
DECLARE
	@Art varchar(30),
	@I3dArt VARCHAR(10),       
	@sql1 nvarchar(4000),   
	@BuildNumber int,     
	@I3D NVARCHAR(300);     


SET @I3dArt = 'Beleg';

IF @I3dArt = 'Beleg'
BEGIN
    SET @Art = '@Anlagenart';   
    SET @I3D = '@1';            
END

SET @BuildNumber = (select top 1 cast(PARSENAME(CurrentVersion, 2) as int) as BuildNumber
			from ApplicationVersions
			order by lastLogin desc)

IF @Art = 'Rechnung'

IF @BuildNumber >= 2509 BEGIN
    SET @sql1 =  '                                                                                                  
    SELECT 
	[centronBuildNumber] = (select top 1 cast(PARSENAME(CurrentVersion, 2) as int) as BuildNumber
                                from ApplicationVersions order by lastLogin desc)

	, [centronVersion] = (select top 1 CurrentVersion from ApplicationVersions order by lastLogin desc)

        -- Belegempfänger
      , [BelegempfaengerStrasse]       = ISNULL(rc.Street, '''')
      , [BelegempfaengerHausnummer]    = ISNULL(rc.HouseNumber, '''')
      , [BelegempfaengerPostfachAktiv] = ISNULL(rc.IsPOBoxActive, 0)
      , [BelegempfaengerPostfach]      = ISNULL(rc.POBox, '''')

        -- Rechnungsempfänger
      , [RechnungsempfaengerStrasse]       = ISNULL(rcI.Street, '''')
      , [RechnungsempfaengerHausnummer]    = ISNULL(rcI.HouseNumber, '''')
      , [RechnungsempfaengerPostfachAktiv] = ISNULL(rcI.IsPOBoxActive, 0)
      , [RechnungsempfaengerPostfach]      = ISNULL(rcI.POBox, '''')

        -- Lieferempfänger
      , [LieferempfaengerStrasse]       = ISNULL(rcD.Street, '''')
      , [LieferempfaengerHausnummer]    = ISNULL(rcD.HouseNumber, '''')
      , [LieferempfaengerPostfachAktiv] = ISNULL(rcD.IsPOBoxActive, 0)
      , [LieferempfaengerPostfach]      = ISNULL(rcD.POBox, '''')

        -- Lizenzempfänger
      , [LizenzempfaengerStrasse]       = ISNULL(rcL.Street, '''')
      , [LizenzempfaengerHausnummer]    = ISNULL(rcL.HouseNumber, '''')
      , [LizenzempfaengerPostfachAktiv] = ISNULL(rcL.IsPOBoxActive, 0)
      , [LizenzempfaengerPostfach]      = ISNULL(rcL.POBox, '''')


    FROM Invoices i
    LEFT JOIN ReceiptReceivers rc  ON rc.i3d  = i.ReceiptReceiverI3D
    LEFT JOIN ReceiptReceivers rcI ON rcI.i3d = i.ReceiptReceiverInvoiceI3D
    LEFT JOIN ReceiptReceivers rcD ON rcD.i3d = i.ReceiptReceiverDeliveryI3D
    LEFT JOIN ReceiptReceivers rcL ON rcL.i3d = i.ReceiptReceiverLicenseI3D
    WHERE i.i3d = '+@I3D+';
    ';
    END
ELSE BEGIN
    SET @sql1 =  '                                                                                                  
    SELECT 
	[centronBuildNumber] = (select top 1 cast(PARSENAME(CurrentVersion, 2) as int) as BuildNumber
                                from ApplicationVersions order by lastLogin desc)

	, [centronVersion] = (select top 1 CurrentVersion from ApplicationVersions order by lastLogin desc)

        -- Belegempfänger
      , [BelegempfaengerStrasse]       = ''''
      , [BelegempfaengerHausnummer]    = ''''
      , [BelegempfaengerPostfachAktiv] = 0
      , [BelegempfaengerPostfach]      = ''''

        -- Rechnungsempfänger
      , [RechnungsempfaengerStrasse]       = ''''
      , [RechnungsempfaengerHausnummer]    = ''''
      , [RechnungsempfaengerPostfachAktiv] = 0
      , [RechnungsempfaengerPostfach]      = ''''

        -- Lieferempfänger
      , [LieferempfaengerStrasse]       = ''''
      , [LieferempfaengerHausnummer]    = ''''
      , [LieferempfaengerPostfachAktiv] = 0
      , [LieferempfaengerPostfach]      = ''''

        -- Lizenzempfänger
      , [LizenzempfaengerStrasse]       = ''''
      , [LizenzempfaengerHausnummer]    = ''''
      , [LizenzempfaengerPostfachAktiv] = 0
      , [LizenzempfaengerPostfach]      = ''''

    ';
END

EXEC(@sql1)

Diese Abfrage stellt sicher, dass die relevanten Adressinformationen (Straße, Hausnummer, Postfach) für alle Empfängerarten (Beleg-, Rechnungs-, Liefer- und Lizenzempfänger) strukturiert zur Verfügung stehen.

Änderungen im Report

Nachdem die neue Abfrage qry_QR_Kunde angelegt wurde, muss diese im Report selbst eingebunden werden. Gehen Sie dazu wie folgt vor:

  1. Öffnen Sie den Report im Reportdesigner:

    image-20251010-050416.png
  2. Wechseln Sie im geöffneten Report auf den Tab Report.

  3. Wählen Sie im Bereich Choose Report Data die neu erstellte Abfrage qry_QR_Kunde aus.

  4. Bestätigen Sie die Auswahl mit OK.

Damit steht die Abfrage als Datenquelle im Report zur Verfügung und kann für Variablen und den QR- Code genutzt werden.

Änderungen im Code

Damit die strukturierten Adressfelder im QR-Code korrekt verarbeitet werden, müssen im Code zusätzliche Variablen ergänzt werden. Da sich die Stellen je nach Reportversion unterscheiden können, gehen Sie bitte wie folgt vor:

  1. Der Report ist im Reportdesigner noch geöffnet.

  2. Wechseln Sie auf den Reiter Home und klicken Sie auf die Lupe Find.

  3. Geben Sie nun im Suchfeld den folgenden Suchparameter ein, um die Kundenvariablen für den Schweizer QR-Code zu finden:

Kunden-PLZ + Ort für QR-Code in QR-Rechnung (Schweiz)

Dadurch gelangen Sie zu der entsprechenden Code-Stelle und finden folgenden Code:

Direkt unterhalb dieser Zeile fügen Sie diesen Code ein:

C#
 // Ergänzung ESR-Strukturierte Daten 
private string strKunde_Strasse_QR = ""; // Kunden-Strasse ohne Hausnummer für QR Code der strukturierten QR-Rechnung (Schweiz) 
private string strKunde_Hausnummer_QR = ""; // Kunden-Hausnummer ohne Straße für QR Code der strukturierten QR-Rechnung (Schweiz)
private string strKunde_PLZ_QR = ""; // Kunden-Postleitzahl für QR Code der strukturierten QR-Rechnung (Schweiz)
private string strKunde_Ort_QR = ""; // Kunden-Ort für QR Code der strukturierten QR-Rechnung (Schweiz)

Weiter geht es mit der Suche nach den Firmenvariablen. Gehen Sie dazu wie folgt vor:

Geben Sie nun im Suchfeld den folgenden Suchparameter ein, um die Firmenvariablen für den Schweizer QR-Code zu finden (Sie finden den Bereich direkt 3 Zeilen unter dem eingefügten Code):

Firma-PLZ + Ort für QR-Code in QR-Rechnung (Schweiz)

Dadurch gelangen Sie zu der entsprechenden Code-Stelle und finden folgenden Code:

Direkt unterhalb dieser Zeile fügen Sie diesen Code ein:

C#
// Ergänzung ESR-Strukturierte Daten 
 private string strFirma_Strasse_QR = ""; // Firmen-Strasse ohne Hausnummer für QR Code der strukturierten QR-Rechnung (Schweiz) 
 private string strFirma_Hausnummer_QR = ""; // Firmen-Hausnummer ohne Straße für QR Code der strukturierten QR-Rechnung (Schweiz)
 private string strFirma_PLZ_QR = ""; // Firmen-PLZ für QR Code der strukturierten QR-Rechnung (Schweiz)
 private string strFirma_Ort_QR = ""; // Firmen-Ort für QR Code der strukturierten QR-Rechnung (Schweiz)

Als nächstes werden die Firmenvariablen ergänzt. Nutzen Sie erneut die Suchfunktion, um zur relevanten Stelle im Code zu gelangen.

Suchen Sie dazu nach folgendem Ausdruck:

strFirma_PLZOrt_QR = ((String)Report.GetColumnValue("qryFirma.PLZ")) + " " + ((String)Report.GetColumnValue("qryFirma.Ort"));

C#
      // Ergänzung ESR-Strukturierte Daten 
      int centronBuildNumberStrAdr = 2509;
      string strMeldungSoftwareVersion = string.Format(culture, "Falsche Software-Version ({0:s}).{1}Strukturierte Adressen erst ab Build {2:d}.{1}Software-Update erforderlich.", (String)Report.GetColumnValue("qry_QR_Kunde.centronVersion"), Environment.NewLine, centronBuildNumberStrAdr);
      string strMeldungFehlerAdresse = "Fehlerhafte strukturierte Adresse gefunden";
      string adr = (Report.GetColumnValue("qryFirma.Strasse") as string) ?? "";
      string strAdressformat_QR = "S";

      strFirma_Strasse_QR = adr;
      strFirma_Hausnummer_QR = "";

      // Postfach-Erkennung
      if (Regex.IsMatch(adr, @"^\s*(Postfach|Case postale|Casella postale|P\.?O\.?\s*Box)", RegexOptions.IgnoreCase))
      {
        strFirma_Strasse_QR = adr.Trim();
        strFirma_Hausnummer_QR = "";
      }
      else
      {
        // Hausnummern-Muster für CH inkl. bis/ter/quater/Brüche
        string hausnummerPattern = @"\d+\s*(?:[A-Za-z]+|bis|ter|quater|½)?(?:\s*[/-–]\s*\d+(?:[A-Za-z]+)?)?(?:\s+(?:Eingang|Eing\.|Hinterhaus|HH)\s*[A-Z])?";

        // Straße vor Hausnummer
        var m = Regex.Match(adr, @"^\s*(?<street>.*?)\s+(?<hno>" + hausnummerPattern + @")\s*$", RegexOptions.IgnoreCase);

        if (!m.Success)
        {
          // Hausnummer vor Straße
          m = Regex.Match(adr, @"^\s*(?<hno>" + hausnummerPattern + @")\s+(?<street>.+?)\s*$", RegexOptions.IgnoreCase);
        }

        if (m.Success)
        {
          strFirma_Strasse_QR = Regex.Replace(m.Groups["street"].Value, @"\s{2,}", " ").Trim();
          strFirma_Hausnummer_QR = m.Groups["hno"].Value.Trim();
        }

        //Zeilenumbrüche ersetzen mit Leerzeichen und begrenzen auf die max. erlaubten Zeichen
        strFirma_Hausnummer_QR = strFirma_Hausnummer_QR.Replace(Environment.NewLine, " ");
        if (strFirma_Hausnummer_QR.Length > 16) {
          strFirma_Hausnummer_QR = strFirma_Hausnummer_QR.Substring(0,16);
        }

        if (strFirma_Hausnummer_QR == "") {
          pgQR_bcQR.Visible = false;
          pgQR_txtZE.TextColor = pgQR_dEmpfangsschein_txtZE.TextColor = Color.Red;
          if ((Int32)Report.GetColumnValue("qry_QR_Kunde.centronBuildNumber") < centronBuildNumberStrAdr) {
            pgQR_txtZE.Text = strMeldungSoftwareVersion;
          } else {
            pgQR_txtZE.Text = string.Format(culture, "{0}{1}(Hausnummer fehlt).", strMeldungFehlerAdresse, Environment.NewLine);
          }
        }
      }

      // Zuordnung der Daten
      strFirma_PLZ_QR = ((String)Report.GetColumnValue("qryFirma.PLZ"));   
      strFirma_Ort_QR = ((String)Report.GetColumnValue("qryFirma.Ort")); 

      //Zeilenumbrüche ersetzen mit Leerzeichen und begrenzen auf die max. erlaubten Zeichen
      strFirma_Strasse_QR = strFirma_Strasse_QR.Replace(Environment.NewLine, " ");
      if (strFirma_Strasse_QR.Length > 70) {
        strFirma_Strasse_QR = strFirma_Strasse_QR.Substring(0,70);
      }
      strFirma_PLZ_QR = strFirma_PLZ_QR.Replace(Environment.NewLine, " ");
      if (strFirma_PLZ_QR.Length > 16) {
        strFirma_PLZ_QR = strFirma_PLZ_QR.Substring(0,16);
      }
      strFirma_Ort_QR = strFirma_Ort_QR.Replace(Environment.NewLine, " ");
      if (strFirma_Ort_QR.Length > 35) {
        strFirma_Ort_QR = strFirma_Ort_QR.Substring(0,35);
      }

      if ( (strFirma_Strasse_QR == "") || (strFirma_PLZ_QR == "") || (strFirma_Ort_QR == "") ) {
        pgQR_bcQR.Visible = false;
        pgQR_txtZE.TextColor = pgQR_dEmpfangsschein_txtZE.TextColor = Color.Red;
        if ((Int32)Report.GetColumnValue("qry_QR_Kunde.centronBuildNumber") < centronBuildNumberStrAdr) {
          pgQR_txtZE.Text = strMeldungSoftwareVersion;
        } else {
          pgQR_txtZE.Text = string.Format(culture, "{0}{1}", strMeldungFehlerAdresse, Environment.NewLine);
        }
      }

Im nächsten Schritt wird eine bereits bestehende if-else-Verzweigung erweitert.

Suchen Sie bitte nach folgendem Code:

strKunde_PLZOrt_QR = ((String)Report.GetColumnValue("qryKopfdaten.RechKundPLZ"))

Der Codebereich sieht ohne Änderungen wie folgt aus:

Platzieren Sie im If-Zweig, also direkt in der nächsten Zeile hinter dem gefundenen Suchtext, die folgende Codeergänzung:

C#
        // Ergänzung ESR-Strukturierte Daten  
        if ((Int32)Report.GetColumnValue("qry_QR_Kunde.RechnungsempfaengerPostfachAktiv") == 1) {
          strKunde_Strasse_QR = ((String)Report.GetColumnValue("qry_QR_Kunde.RechnungsempfaengerPostfach"));
          strKunde_Hausnummer_QR = "";
        } else {
          strKunde_Strasse_QR = ((String)Report.GetColumnValue("qry_QR_Kunde.RechnungsempfaengerStrasse"));
          strKunde_Hausnummer_QR = ((String)Report.GetColumnValue("qry_QR_Kunde.RechnungsempfaengerHausnummer"));

          //Zeilenumbrüche ersetzen mit Leerzeichen und begrenzen auf die max. erlaubten Zeichen
          strKunde_Hausnummer_QR = strKunde_Hausnummer_QR.Replace(Environment.NewLine, " ");
          if (strKunde_Hausnummer_QR.Length > 16) {
            strKunde_Hausnummer_QR = strKunde_Hausnummer_QR.Substring(0,16);
          }
          if (strKunde_Hausnummer_QR == "") {
            pgQR_bcQR.Visible = false;
            pgQR_txtEZP.TextColor = pgQR_dEmpfangsschein_txtEZP.TextColor = Color.Red;
            if ((Int32)Report.GetColumnValue("qry_QR_Kunde.centronBuildNumber") < centronBuildNumberStrAdr) {
              pgQR_txtEZP.Text = strMeldungSoftwareVersion;
            } else {
              pgQR_txtEZP.Text = string.Format(culture, "{0}{1}(Hausnummer fehlt).", strMeldungFehlerAdresse, Environment.NewLine);
            }
          }
        }
        strKunde_PLZ_QR = ((String)Report.GetColumnValue("qryKopfdaten.Kunde_PLZ"));
        strKunde_Ort_QR =  ((String)Report.GetColumnValue("qryKopfdaten.Kunde_Ort"));

Nachdem der If-Zweig angepasst wurde, muss nun auch der Else-Zweig erweitert werden.

1. Sie können entweder direkt im Code an die entsprechende Stelle scrollen oder erneut die Suchfunktion (Home Find) verwenden, um schneller dorthin zu gelangen. Sie finden den

Bereich wie folgt:

strKunde_PLZOrt_QR = ((String)Report.GetColumnValue("qryKopfdaten.Kunde_PLZ"))

Sie ergänzen diesen Else-Fall mit folgendem Code:

C#
        // Ergänzung ESR-Strukturierte Daten   
        if ((Int32)Report.GetColumnValue("qry_QR_Kunde.BelegempfaengerPostfachAktiv") == 1) {
          strKunde_Strasse_QR = ((String)Report.GetColumnValue("qry_QR_Kunde.BelegempfaengerPostfach"));
          strKunde_Hausnummer_QR = "";
        } else {
          strKunde_Strasse_QR = ((String)Report.GetColumnValue("qry_QR_Kunde.BelegempfaengerStrasse"));
          strKunde_Hausnummer_QR = ((String)Report.GetColumnValue("qry_QR_Kunde.BelegempfaengerHausnummer"));

          //Zeilenumbrüche ersetzen mit Leerzeichen und begrenzen auf die max. erlaubten Zeichen
          strKunde_Hausnummer_QR = strKunde_Hausnummer_QR.Replace(Environment.NewLine, " ");
          if (strKunde_Hausnummer_QR.Length > 16) {
            strKunde_Hausnummer_QR = strKunde_Hausnummer_QR.Substring(0,16);
          }
          if (strKunde_Hausnummer_QR == "") {
            pgQR_bcQR.Visible = false;
            pgQR_txtEZP.TextColor = pgQR_dEmpfangsschein_txtEZP.TextColor = Color.Red;
            if ((Int32)Report.GetColumnValue("qry_QR_Kunde.centronBuildNumber") < centronBuildNumberStrAdr) {
              pgQR_txtEZP.Text = strMeldungSoftwareVersion;
            } else {
              pgQR_txtEZP.Text = string.Format(culture, "{0}{1}(Hausnummer fehlt).", strMeldungFehlerAdresse, Environment.NewLine);
            }
          }
        }
        strKunde_PLZ_QR = ((String)Report.GetColumnValue("qryKopfdaten.Kunde_PLZ"));
        strKunde_Ort_QR = ((String)Report.GetColumnValue("qryKopfdaten.Kunde_Ort"));

Nach den beschriebenen Anpassungen sollte die If-Else-Verzweigung im Code wie folgt aussehen:

Anpassung_Hybrid_Kundenanlagen_25_2_2_SP.png

Direkt im Anschluss wird ebenfalls folgendes direkt nach dem IF / ELSE eingefügt:

CODE
      //Zeilenumbrüche ersetzen mit Leerzeichen und begrenzen auf die max. erlaubte Zeichen
      strKunde_Strasse_QR = strKunde_Strasse_QR.Replace(Environment.NewLine, " ");
      if (strKunde_Strasse_QR.Length > 70) {
        strKunde_Strasse_QR = strKunde_Strasse_QR.Substring(0,70);
      }
      strKunde_PLZ_QR = strKunde_PLZ_QR.Replace(Environment.NewLine, " ");
      if (strKunde_PLZ_QR.Length > 16) {
        strKunde_PLZ_QR = strKunde_PLZ_QR.Substring(0,16);
      }
      strKunde_Ort_QR = strKunde_Ort_QR.Replace(Environment.NewLine, " ");
      if (strKunde_Ort_QR.Length > 35) {
        strKunde_Ort_QR = strKunde_Ort_QR.Substring(0,35);
      }

      if ( (strKunde_Strasse_QR == "") || (strKunde_PLZ_QR == "") || (strKunde_Ort_QR == "") ) {
        pgQR_bcQR.Visible = false;
        pgQR_txtEZP.TextColor = pgQR_dEmpfangsschein_txtEZP.TextColor = Color.Red;
        if ((Int32)Report.GetColumnValue("qry_QR_Kunde.centronBuildNumber") < centronBuildNumberStrAdr) {
          pgQR_txtEZP.Text = strMeldungSoftwareVersion;
        } else {
          pgQR_txtEZP.Text = string.Format(culture, "{0}{1}.", strMeldungFehlerAdresse, Environment.NewLine);
        }
      }

ANPASSUNGEN QR CODE

Nachdem alle erforderlichen Codeänderungen durchgeführt wurden, muss nun der QR-Code selbst an die neuen strukturierten Adressvorgaben angepasst werden.

  1. Wechseln Sie im Report auf die Seite pgQR. Diese erkennen Sie in den unteren Tabs des Reportdesigners.

  2. Auf dieser Seite finden Sie mehrere Textfelder, die für die Ausgabe der QR-Rechnung zuständig sind.

  3. In diesen Textfeldern müssen die bisherigen Variablen durch die neu angelegten Variablen (Straße, Hausnummer, Postleitzahl, Ort) ersetzt werden.

Sie finden zwei Textfelder die Daten für "Konto / Zahlbar an" enthalten, wie hier gelb umrandet.

Diese Textfelder öffnen Sie per Doppelklick und fügen folgenden Text ein:

Zahlbar_an.txt

Achten Sie besonders auf die gleiche Formatierung der Daten.

In unseren Tests kam es teilweise vor, dass sich die Daten durch das Kopieren des Textes in den Zeilen verschoben haben. Bitte überprüfen Sie daher sorgfältig, ob das vorgegebene Format vollständig eingehalten wird.
Die Darstellung sollte wie im folgenden Beispiel aussehen. Es empfiehlt sich, das Textfeld bei Bedarf durch Ziehen etwas zu vergrößern, um die Übersicht zu verbessern.

image-20251010-090959.png

Den selben Vorgang wird in den Textfeldern für "Zahlbar durch" wiederholt:

Zahlbar_durch.txt

Im nächsten Schritt muss der Inhalt des QR-Codes an die neuen Vorgaben angepasst werden. Dazu wird ein vorbereiteter Textbaustein hinterlegt, der hier zu finden ist:

QR_Code.txt

Achten Sie dabei unbedingt auf die exakte Formatierung:

  • Alle Leerzeilen müssen korrekt übernommen werden.

  • Nach dem Eintrag EPD ist zwingend ein Zeilenumbruch einzufügen.

image-20251107-135928.png

Die Leerzeilen sind für die korrekte Validierung und Erzeugung des QR-Codes erforderlich.

Speichern des Reports

REPORT SPEICHERN

Nachdem alle Anpassungen durchgeführt wurden, speichern Sie bitte den Report:

  1. Gehen Sie im Menü auf File → Save.

  2. Beim Schließen des Reports kann es vorkommen, dass Sie zusätzlich gefragt werden, ob die Änderungen gespeichert werden sollen. Bestätigen Sie dies bitte ebenfalls mit Ja.

Damit sind alle Änderungen am Report erfolgreich übernommen und der QR-Code entspricht den neuen Schweizer Vorgaben.

VALIDIERUNG

Nachdem die Anpassungen am Report und QR-Code abgeschlossen sind, sollten Sie die Umsetzung unbedingt testen. Gehen Sie dabei wie folgt vor:

  1. Generieren Sie eine neue Rechnung.

  2. Sobald die Rechnung erzeugt wurde, können Sie den Zahlschein mit dem offiziellen Online- Validator überprüfen: https://swiss-qr-invoice.org/validator/?lang=de

  3. Laden Sie den erzeugten QR-Zahlschein hoch oder scannen Sie ihn.

    • Achten Sie darauf, dass alle Adressdaten korrekt in strukturierter Form dargestellt werden.

    • Der Validator zeigt Ihnen sofort an, ob der QR-Code den gesetzlichen Vorgaben entspricht.

  4. Alternativ können Sie auch einfach den QR-Zahlschein über Ihre eigene Banking-App scannen und erhalten sofort die entsprechende Rückmeldung.

ZUSAMMENFASSUNG UND AUSBLICK

Mit den in diesem Whitepaper beschriebenen Schritten haben Sie Ihren Report erfolgreich an die neuen gesetzlichen Vorgaben zur strukturierten Adressdarstellung in der Schweizer QR-Rechnung angepasst. Damit sind Sie bestens vorbereitet für die Umstellung ab dem 21. November 2025.

Sollten bei der Umsetzung an einer Stelle Unklarheiten oder Schwierigkeiten aufgetreten sein, wenden Sie sich bitte an unsere Orga.

Video

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.