Squeeze for Dynamics 365 BC - de-DE
Handbuch zur Administration und Nutzung von SQUEEZE for Microsoft Dynamics 365 Business Central. SQUEEZE ist eine Mandanten-fähige Software-Lösung für Dokumenten-Klassifikation und Inhaltsextraktion. Es ist ein vollständig webbasiertes System zur Verarbeitung von elektronischen Dokumenten, mit wesentlichem Fokus auf die Erkennung und Auslesung von Eingangsdokumenten im B2B Sektor.
- Systemvoraussetzungen
- Installation
- Konfiguration & Administration
- Berechtigungssätze
- DEXPRO Core
- SQUEEZE Einrichtung
- Dokumentenklassen Einrichtung
- Kreditorenbezogene Einrichtung
- Kontierungseinrichtungen
- Feldzuordnung
- Benutzerdefinierte Feldzuordnung
- Benutzerspezifische Einrichtung
- Squeeze Stammdatentabellen
- SQUEEZE
- Validierung
- SQUEEZE Beleg Übersicht
- Mandantenübergreifende Belegansicht
- Importwarteschlange
- SQUEEZE Belegvalidierung
- Lieferantenspezifisches Training
- Dokument Aufteilen
- Bestell- & Wareneingangsabgleich
- Bestell-/ Wareneingangszeilen importieren
- Externer Viewer
- Extension Entwicklung
- Hinzufügen eines Feldes in der Validierung (bis Squeeze BC APP Version 1.*)
- Hinzufügen eines Feldes in der Validierung (ab Version 2.0)
- Hinzufügen eines Feldes in der Validierung (ab Version 2.10)
- Abweichende Verwendung der SQUEEZE Anhänge
- Implementierung eines benutzerdefinierten, automatischen Bestellabgleichs
Systemvoraussetzungen
Systemvoraussetzungen zur Nutzung von SQUEEZE for Dynamics 365 BC
Unterstützte Microsoft Dynamics 365 Business Central Versionen
Die Microsoft Dynamics 365 Business Central Integration ist auf Grund von technischen Mindestvoraussetzungen ab folgender Version möglich:
Unterstützte Microsoft Dynamics 365 Business Central Versionen
Voraussetzung zum Betrieb ist, dass die jeweilige Microsoft Dynamics 365 Business Central Version sich noch im regulären Support befindet. Der erweiterte Support (extended Support) wird ausgeschlossen.
Unterstützte SQUEEZE Versionen
Die Integration von SQUEEZE in Microsoft Dynamics 365 Business Central benötigt für den Betrieb ein lizensiertes SQUEEZE System ab der Version 2.0.0.
Installation
Lizenzen
Microsoft
Informationen zu den Microsoft Business Central Lizenzen.
SQUEEZE
Das DEXPRO SQUEEZE System welches an Business Central angeschlossen werden soll benötigt eine gültige Kunden-Lizenz.
Bezug der DEXPRO Module
Detailliertere Informationen finden Sie hier.
OnPrem
Für OnPrem Installationen wird auf Anfrage eines registrierten Resellers / Partners ein Runtime Package mit den benötigten Apps zur Verfügung gestellt. Diese werden durch den Partner der Kundenlizenz hinzugefügt und im Anschluss in das Microsoft Dynamics Business Central eingespielt.
Cloud
Für Cloud Installationen benötigt man lediglich Zugriff auf den Microsoft AppSource. Hier werden die benötigten DEXPRO Apps heruntergeladen.
Einrichtungsassistent
Wenn die SQUEEZE Einrichtung das erste mal geöffnet wird, wird man von dem SQUEEZE Einrichtungsassistenten begrüßt.
Dieser führt den Anwender Schritt für Schritt durch die unterschiedlichen Einrichtungen des Moduls.
Start
Auswahl SQUEEZE System
In diesem Schritt wird die URL von dem SQUEEZE System hinterlegt.
Beispiel: https://demo.msbc.squeeze.one
Anmeldung am SQUEEZE System
In diesem Schritt geben Sie den Benutzernamen und das Kennwort eines gültigen SQUEEZE Users mit der Admin Rolle an. Diese Daten werden nur für die Einrichtung einmalig verwendet. Im Anschluss erfolgt die Anmeldung am SQUEEZE System per API-Schlüssel.
Nummernserie für die SQUEEZE Belege
In diesem Schritt wähle Sie eine Nummernserie für die Core Belege und eine für die SQUEEZE Belege aus. Sollte noch keine existieren, so können Sie über die Nummernserienauswahl auch einen neuen Eintrag anlegen.
Abschluss
Durch den Klick auf "Fertigstellen" beenden Sie den Einrichtungsassistenten. Im Anschluss wird die SQUEEZE Einrichtung geöffnet. Weitere Konfigurationsmöglichkeiten werden hier beschrieben.
Konfiguration & Administration
Berechtigungssätze
Um die Module nutzen zu können, muss den jeweiligen Anwendern der passende Berechtigungssatz zugewiesen werden.
Folgende werden mit ausgeliefert:
- DXP Core Admin - DEXPRO Core Administrator
- DXP Core User - DEXPRO Core Benutzer
- DXP SQUEEZE Admin - DEXPRO SQUEEZE Administrator
- DXP SQUEEZE User - DEXPRO SQUEEZE Benutzer
DEXPRO Core
Der DEXPRO Core verwaltet die einzelnen DEXPRO Apps und deren Dokumente pro Mandant.
Es werden alle Belege, welche über die unterschiedlichen DEXPRO Module in Microsoft Dynamics 365 Business Central eingelaufen und verarbeitet worden sind, angezeigt. Zur Nachvervolgung von einzelnen Belegen wird auf eine globale Nummernserie, welche über alle DEXPRO Apps genutzt wird, gesetzt. Dies bietet den Vorteil, dass die Anwender mit nur einer Nummernserie pro Beleg arbeiten.
Weitere Informationen finden sie hier.
SQUEEZE Einrichtung
In der SQUEEZE Einrichtung wird sowohl die Anbindung an das SQUEEZE System, als auch die Verarbeitung innerhalb der App eingerichtet.
Menü
Vorgang
Einrichtungsassistent
Hier rüber wird der Einrichtungsassistenz gestartet. Dieser führt den Anwender Schritt für Schritt durch alle Menüpunkte.
API-Schlüssel eingeben
Öffnet einen Dialog, der zur Eingabe eines API-Schlüssels auffordert. Der Schlüssel wird sicher in einem isolierten Speicher abgelegt.
Einrichtung kopieren
Hiermit wird die Einrichtung in andere Mandanten kopiert.
API-Schlüssel holen
Über diese Funktion wird mithilfe von Benutzername und Passwort der erste API-Schlüssel des angeschlossenen SQUEEZE System geholt und im isolierten Speicher abgelegt.
Hintergrundjobs anlegen
Die automatisierte Abholung und Verarbeitung von Dokumenten aus SQUEEZE erfordert die Einrichtung eines Hintergrundjobs. Dies kann in über diese Funktion durchgeführt werden.
Stammdaten
Stammdaten erstmalig hochladen
Über die Funktion "Stammdaten erstmalig hochladen" werden alle Kreditoren und Kreditorenbankkonten, sowie der aktuelle Mandant und die relevanten Bestelldaten erstmalig an SQUEEZE übertragen.
Navigation
SQUEEZE-Verknüpfungen (obsolet)
Über den Menüpunkt SQUEEZE-Verknüpfungen kann man einsehen welcher Kreditor bzw. welches Kreditorenbankkonto welche ID auf der Squeeze Seite hat.
Benutzerspezifische Einrichtung
Über diesen Menüpunkt erreichen Sie die benutzerspezifische Einrichtung. In dieser können abweichende Regeln je Anwender hinterlegt werden.
Importwarteschlange
In diesem Menü wird eine Liste von SQUEEZE Belegen angezeigt, die bereit für den Import in die SQUEEZE for BC App sind. Durch das Ändern des Systemfilters ist es ebenfalls möglich, bereits importierte Belege einzusehen.
Kreditorenbezogene Einrichtung
Über diesen Menüpunkt erreichen Sie die kreditorenbezogene Einrichtung. In dieser können abweichende Regeln pro Kreditor hinterlegt werden.
Dokumentenklassen Einrichtung
Über diesen Menüpunkt erreichen Sie die Einrichtung für die SQUEEZE Dokumentenklassen.
Squeeze Stammdatentabellen
Öffnet eine Übersicht über die Stammdatentabellen, die bei einer Synchronisierung mit Squeeze berücksichtigt werden.
FastTabs
Allgemein
In diesem FastTab kann man die Nutzung dieser App aktivieren/Deaktivieren. Zusätzlich sieht man die Version des angeschlossenem SQUEEZE-Systems.
API
In diesem Fasttab wird die URL des SQUEEZE Systems angegeben. Des Weiteren wird ein API-Name gesetzt und der dazugehörige API-Schlüssel über die Funktion "API-Schlüssel holen" eingetragen. Bei jedem Öffnen der SQUEEZE Einrichtung wird zudem die Verbindung zum verbundenen SQUEEZE Mandanten überprüft.
Stammdaten
Für die Verbesserung der Auslesequalität benötigt SQUEEZE die Kreditoreninformationen aus Microsoft Dynamics 365 Business Central. In diesem Fastab wird die Stammdaten Synchronisierung gen SQUEEZE aktiviert/deaktiviert
Im Feld "Mandanten Stammdaten Tabellen Id" wird die ID der SQUEEZE Company Tabelle angegeben.
Im Feld "Kreditor Stammdaten Tabellen Id" wird die ID der SQUEEZE Creditor Tabelle angegeben.
Nummernserie
Hier wird die Nummernserie für die SQUEEZE Belege angegeben.
Hintergrundjobs
Für die automatisierte Abholung von Belegen aus SQUEEZE sowie deren Verarbeitung und Bereinigung ist die Einrichtung von Hintergrundjobs notwendig. Folgende Codeunits werden automatisch angelegt, sobald die entsprechende Aktion (Hintergrundjobs anlegen) in der SQUEEZE Einrichtung ausgeführt wird:
In der SQUEEZE Einrichtung sind die Aufgabewarteschlangenposten anschließend verknüpft.
Dokumentenklassen Einrichtung
In der SQUEEZE Dokumentenklassen Einrichtung wird die Zuordnung zwischen der jeweiligen Dokumentenklasse und Ihrer Exportschnittstelle vorgenommen. Des Weitern wird hier die Feldzuordnung jeder Dokumentenklasse heruntergeladen und so ein Set an Standard Feldern und deren Verwendung in Microsoft Dynamics 365 Business Central hergestellt.
Die Dokumentenklassen Einrichtung ist App übergreifend und wird über den DEXPRO Core verwaltet.
Vorgang
Feldzuordnung herunterladen
Hiermit wird die Feldstruktur der SQUEEZE Dokumentenklasse heruntergeladen. Diese werden für die Metadaten-Zuordnung benötigt.
Navigation
Feldzuordnung
Über diesen Menüpunkt erreichen Sie die Feldzuordnung. In dieser wird definiert welche Felder aus dem Squeeze-Endpunkt an die definierten Felder in Microsoft Dynamics 365 Business Central übertragen werden. Die Standardfeldzuordnung ist nicht editierbar. Abweichende Zuordnungen können über die Benutzerdefinierte Feldzuordnung realisiert werden.
Kreditorenbezogene Einrichtung
Liste
Dokumentenklassen
In dieser Übersicht werden alle eingerichteten Dokumentenklassen aufgelistet.
Karte
Dokumentenklasse
Hier wird jede Dokumentenklasse individuell eingerichtet.
Allgemein
In diesem FastTab wird der Name der Dokumentenklasse, der nächste Prozessschritt, sowie die automatische Anreicherung der Positionen eingerichtet.
Squeeze
Standardbuchungsdatum
Analog zum BC Standard haben Sie die Möglichkeit, ein Buchungsdatum als Standard zu definieren, sofern anderweitig noch keins eingetragen wurde (z.B. durch die Benutzerdefinierte Feldzuordnung). Sie können zwischen dem Arbeitsdatum, der Standard BC Einrichtung "Kreditoren & Einkauf Einr." und dem heutigen Datum wählen.
Autovervollständigen:
Bei Belegen ohne Bestellbezug kann das System sich die eingelesenen Positionen und die darauf angewandte Kontierung pro Kreditor merken und wieder abrufen. Hierfür gibt es drei Optionen, die gewählt werden können.
- Niemals: Deaktiviert die Funktion und blendet den Button in der Validierungsseite aus
- Manuell: Das Anwenden der Daten für die Autovervollständigung erfolgt manuell per Klick auf den Button "Autovervollständigen". Die Speicherung der Metadaten für die Autovervollständigung wird automatisch beim Abschluss des Validierungsprozesses ausgeführt
- Automatisch: Das Erstellen und Anwenden der Daten für die Autovervollständigung erfolgt automatisch
- Beim Erstellen des SQUEEZE Beleg werden die Einträge angewendet
- Beim Abschluss der Validierung werden die Einträge erstellt/aktualisiert
Automatische Validierung:
Aktivieren Sie diese Option, damit Squeeze for BC eingehende Belege automatisch validiert. Bitte beachten Sie, dass diese Funktion nur im Falle vollkommen plausibler Daten funktioniert.
Anhänge herunterladen:
Aktivieren Sie diesen Schalter, um beim Erstellen eines neuen Belegs automatisch SQUEEZE Anhänge herunterzuladen.
Anhänge in den Zielbereich transferieren:
Hierrüber richten Sie ein, ob die SQUEEZE Anhänge in den Zielbeleg transferiert werden sollen.
Kontierungscode:
Gibt die Kontierungseinrichtung an, die bei der Durchführung der Kontierung im Validierungsprozess verwendet werden soll.
API Einstellungen
An dieser Stelle wird die der Dokumentenklasse entsprechende ID des verbundenen Squeeze Mandanten hinterlegt sowie die ID der Pull-Export-Schnittstelle, als auch die korrekte Line Table ID. Die Standardwerte stimmen nicht zwangsläufig mit der Einrichtung im Squeeze Mandanten überein und sollten gegengeprüft werden.
Bestellabgleich
Der Bestellabgleich dient zur automatisierten Überprüfung der ausgelesenen Positionen mit denen der noch offenen Bestellungen in Microsoft Dynamics 365 Business Central. In diesem FastTab werden die zulässigen Betrags- & Mengentoleranzen für den Abgleich eingerichtet. Zusätzlich kann festgelegt werden, ob der Abgleich gegen Bestellungen oder Lieferungen statt finden soll. Wenn "Daten ersetzen" aktiv ist, werden die Beträge und Beschreibungen der Positionen mit denen der Bestellung/Lieferung nach dem Abgleich ersetzt.
Kreditorenbezogene Einrichtung
In dieser Einrichtung werden pro SQUEEZE Dokumentenklasse kreditorenspezifische Einstellungen vorgenommen. Dies wird für Kreditoren getan, welche vom eingestellten Mandanten-Standard abweichen.
Neben der Autovervollständigung von Positionen können hier auch abweichende Betrags- und Mengentoleranzen eingerichtet werden.
Liste
Karte
Autovervollständigen:
Bei Belegen ohne Bestellbezug kann das System sich die eingelesenen Positionen und die darauf angewandte Kontierung pro Kreditor merken und wieder abrufen. Hierfür gibt es drei Optionen, die gewählt werden können.
- Niemals: Deaktiviert die Funktion und blendet den Button in der Validierungsseite aus
- Manuell: Das Anwenden der Daten für die Autovervollständigung erfolgt manuell per Klick auf den Button "Autovervollständigen". Die Speicherung der Metadaten für die Autovervollständigung wird automatisch beim Abschluss des Validierungsprozesses ausgeführt
- Automatisch: Das Erstellen und Anwenden der Daten für die Autovervollständigung erfolgt automatisch
- Beim Erstellen des SQUEEZE Beleg werden die Einträge angewendet
- Beim Abschluss der Validierung werden die Einträge erstellt/aktualisiert
Automatische Validierung:
Aktivieren Sie diese Option, damit Squeeze for BC eingehende Belege automatisch validiert. Bitte beachten Sie, dass diese Funktion nur im Falle vollkommen plausibler Daten funktioniert.
Kontierungscode:
Gibt die Kontierungseinrichtung an, die bei der Durchführung der Kontierung im Validierungsprozess verwendet werden soll.
Bestellabgleich
Der Bestellabgleich dient zur automatisierten Überprüfung der ausgelesenen Positionen mit denen der noch offenen Bestellungen in Microsoft Dynamics 365 Business Central. In diesem FastTab werden die zulässigen Betrags- & Mengentoleranzen für den Abgleich eingerichtet. Zusätzlich kann festgelegt werden, ob der Abgleich gegen Bestellungen oder Lieferungen statt finden soll. Wenn "Daten ersetzen" aktiv ist, werden die Beträge und Beschreibungen der Positionen mit denen der Bestellung/Lieferung nach dem Abgleich ersetzt.
Kontierungseinrichtungen
Hier finden Sie die Kontierungseinrichtungen. Wenn Sie Standardkontierungen für bestimmte MwSt. Sätze haben, so können Sie die hier hinterlegen.
Sobald eine Kontierungseinrichtung mit Einrichtungszeilen angelegt und in einer Dokumentenklassen oder einer kreditorenbezogene Einrichtung hinterlegt wurde, wird diese automatisch heran gezogen.
Beim Importieren eines Beleges von Squeeze werden die erkannten MwSt. Sätze gegen die Einrichtungszeilen der hinterlegten Kontierungseinrichtung geprüft. Wenn passende Einträge gefunden werden, wird hierzu geprüft, ob Zeilen mit den hinterlegten Kontierungen angelegt werden dürfen. Im Standard Fall wird dies nur durchgeführt, wenn Squeeze keine Positionen liefert.
Zusätzlich kann eingerichtet werden, ob eine Kontierungseinrichtung automatisch für die Validierung angewendet werden soll.
Dies sollte in der Dokumentenklasseneinrichtung nicht als Standard gesetzt sein, da dies dann für alle Kreditoren und Belege gelten würde. Diese Option ergibt für einzelne Kreditoren mehr Sinn (Kreditorenbezogene Einrichtung).
Für die automatische Anwendung kann man zusätzlich aktivieren, dass alle Squeeze-Zeilen eines Dokuments mit den konfigurierten Kontierungseinrichtungszeilen überschrieben werden. ("Squeeze Zeilen überschreiben" anhaken)
Kontierungseinrichtung
Zu jedem Kontierungscode werden die Einrichtungszeilen separat verwaltet.
Hier werden die einzelnen MwSt. Sätze, zu denen Standardkontierungen gesetzt werden sollen, angelegt.
Pro MwSt. Satz setzt man im Anschluss die Kontierungsart.
Kontierungsart "Ein Konto"
Die Auswahl der Kontoart entspricht dem BC Standard:
Die Beschreibung kann nach Auswahl der Nummer beliebig angepasst werden.
Kontierungsart "Standardeinkaufscode"
Hier kann ein Standardeinkaufscode aus den wiederkehrenden Einkaufszeilen ausgewählt werden.
Feldzuordnung
In der Feldzuordnung wird das Standard-Mapping jeder Dokumentenklasse heruntergeladen. Diese feste Zuordnung gewährleistet einen reibungslosen Zuordnungsprozess von der Extraktion der Daten in Squeeze bis zur Erstellung eines Einkaufsbelegs.
Zuweisung von Metadaten
Werden in Squeeze Felder hinzugefügt, haben Sie an dieser Stelle die Möglichkeit, die enthaltenen Informationen direkt an definierte Felder des Einkaufsbelegs zu übertragen. Dieses Informationen sind in der Validierung nicht editierbar, sondern werden quasi "durchgeschleift".
nach Zuweisung:
Benutzerdefinierte Feldzuordnung
Möglicherweise möchten Sie in Ihrem Prozess immer gewisse Informationen abweichend von der Standard-Feldzuordnung in gewisse Felder schreiben. In dem folgenden Beispiel wird das durch Squeeze erkannte Leistungsdatum immer in das Feld "Buchungsdatum" geschrieben - zusätzlich zum Standardverhalten. Das Leistungsdatum bleibt also trotzdem gefüllt.
In der Dokumentenklassen-Einrichtung die Feldzuordnung öffnen:
Anschließend öffnen Sie die "Benutzerdefinierte Feldzuordnung":
Nehmen Sie dann die gewünschte Zuordnung vor:
Benutzerspezifische Einrichtung
In dieser Einrichtung werden benutzerspezifische Einstellungen vorgenommen. So haben Anweder die Möglichkeit die App individuell auf Ihre Arbeitsweise und Peripheriegeräte einzustellen.
Squeeze Stammdatentabellen
Standardtabellen
Diese Stammdaten werden automatisch, sofern nicht deaktiviert, mit dem Squeeze Mandanten synchronisiert. Es ist nach wie vor notwendig, die Stammdaten initial hochzuladen.
Das Feld "Verwendet externe Id" wird ab der Squeeze Version 2.13 unterstützt und bietet die Verwaltung der Squeeze Stammdaten aus einer Drittsoftware. In diesem Fall BC.
Generische Stammdatentabellen
Um weitere Stammdaten gen Squeeze zu übertragen, pflegt man diese in der generischen Stammdaten Tabellen Einrichtung.
Anlage der zu übertragenden Tabelle
Im Feld "BC Tabellennr." wird die zu übertragende Tabelle eingetragen oder über den Drilldown ausgewählt. Im Feld "Squeeze Tabellenname" kann dann die Bezeichnung angepasst werden. Im Feld "Synchronisierung aktiviert" wird festgelegt, ob diese Tabelle derzeit synchronisiert werden soll oder nicht.
Auswahl der zu übertragenden Felder
Über den Menüpunkt "Feldauswahl" erreichen Sie die Einrichtung.
Hier werden die Felder ausgewählt, welche synchronisiert werden sollen.
Erstellung der Squeeze Stammdatentabelle aus BC heraus
Nachdem eine BC Tabelle eingetragen und deren Felder für die Synchronisierung ausgewählt worden sind, kann nun eine neue Squeeze Tabelle aus BC heraus angelegt werden. Hierfür steht die Schaltfläche "Squeeze-Tabelle erstellen" zur Verfügung.
Nach der Erstellung wird in der Übersicht das Feld "Squeeze Tabellen-Id" gesetzt.
Auf der Squeeze Seite steht nun die neue Tabelle zur Verfügung.
Die ausgewählten Felder sind hier nun als Spalten automatisiert angelegt worden.
Synchronisation der Daten
Nach der Erstellung der Squeeze Tabelle wird der User gefragt, ob eine Synchronisierungsaufgabe erstellt werden soll.
Ist diese aktiv, so werden die Stammdaten automatisiert im eingerichteten Rhythmus übertragen. Alternativ können die Stammdaten auch manuell über die Schaltfläche "Jetzt synchronisieren" einmalig übertragen werden.
Löschen der Stammdatentabelle
Beim Löschen eines Listeneintrags wird gefragt, ob auch die Squeeze Stammdatentabelle mit gelöscht werden soll.
Sollte dies bestätigt werden, so wird die aus BC erstelle Squeeze-Tabelle unwiederbringlich entfernt.
SQUEEZE
Grundsätzliche Einrichtung
Die SQUEEZE Seite muss ebenfalls für das Abholen der Dokumente aus Microsoft Dynamics Business Central vorbereitet werden.
Jede Dokumentenklasse welche von Microsoft Dynamics Business Central abgeholt werden soll, benötigt eine eigene Exportschnittstelle vom Typ "Pull". Zudem muss in Microsoft Dynamics Business Central in der Einrichtung für die SQUEEZE Dokumentenklassen die Dokumentenklassen ID, die Export Schnittstellen ID und die Stammdatentabellen ID hinterlegt werden.
Sofern nicht die neuste SQUEEZE for BC Version benutzt wird, müssen noch die folgenden Stapelklasseneigenschafen in dem SQUEEZE Mandanten gesetzt werden:
System Reset
Wird ein Squeeze System zurückgesetzt (z.B. im Rahmen von Tests), müssen folgende Schritte in Business Central berücksichtigt werden:
Importwarteschlange
Die Tabelle muss geleert werden. Dabei ist zu beachten, dass alle Filter entfernt werden, die in der Page gesetzt sind.
Validierung
Sichtkontrolle der ausgelesenen Dokumente
SQUEEZE Beleg Übersicht
In der Belegübersicht werden alle Belege aufgelistet welche durch SQUEEZE ausgelesen worden sind.
Durch einen Doppelklick mit der Maus oder über Bearbeiten/Ansicht wird ein einzelner Beleg in der Validierungsansicht geöffnet.
Start
Belege jetzt herunterladen
Über diese Funktion wird die Belegabholung von SQUEEZE manuell ausgeführt. Wahlweise wird das über den entsprechenden Hintergrundjob gesteuert und durchgeführt.
Belege hochladen
Diese Funktion wird zukünftig nicht mehr verfügbar sein.
Navigation
Importwarteschlange
In diesem Menü wird eine Liste von SQUEEZE Belegen angezeigt, die bereit für den Import in die SQUEEZE for BC App sind. Durch das Ändern des Systemfilters ist es ebenfalls möglich, bereits importierte Belege einzusehen.
Mandanten-Belegübersicht
Öffnet eine mandantenübergreifende Ansicht aller Squeeze Belege.
Warteschlange
Öffnet eine Übersicht, die Ihnen Informationen zu den Belegen in der SQUEEZE Warteschlange des verbundenen Mandanten liefert.
Mandantenübergreifende Belegansicht
Hier wird Ihnen eine mandantenübergreifende Ansicht aller Squeeze Belege dargestellt. Diese aktualisiert sich alle paar Sekunden.
Die unterschiedlichen Spalten dienen als Absprungpunkte um den jeweiligen Mandanten mit dem gewünschten Filter in einem neuen Tab zu öffnen.
Importwarteschlange
Die Importwarteschlage ist eine Mittelschicht, die SQUEEZE Belege in die entsprechenden Zielmandaten importiert - der Zielmandant muss mit dem aktuellen BC Mandanten (wichtig: Der Name (Primärschlüssel) ist ausschlaggebend, nicht der Anzeigename) in dem die Belege heruntergeladen werden, übereinstimmen. Wurde kein Zielmandant erkannt, werden die Belege für die Validierung in dem eingerichteten Fallback Mandanten erstellt.
Navigation
Importwarteschlangen-Einrichtung
Fallback Mandant
Gibt den Wert des Fallback Mandanten an. In diesen Mandanten werden Belege importiert, die in der Importwarteschlange einen leeren Zielmandanten aufweisen.
Zeitspanne für Warnung (Stunden)
Gibt die Zeitspanne an, nach der eine Warnung angezeigt werden soll, wenn es unverarbeitete Einträge gibt.
Start
Unverarbeitete Datensätze verarbeiten
SQUEEZE Belegvalidierung
Die Belegvalidierung ist der Hauptarbeitsbereich der Anwendung. Hier werden die ausgelesenen Belege vom Anwender überprüft, fehlende Informationen ergänzt und bestätigt.
Menü
Start
Feldtraining öffnen
Öffnet das lieferantenspezifische Feldtraining.
Positionstraining öffnen
Öffnet das lieferantenspezifische Positionstraining.
Beleg neu erstellen
Sendet den Beleg erneut in den Extraktionsschritt des verbundenen SQUEEZE Mandanten. Dort wird das Ausleseergebnis anhand der aktuellen Stammdaten und Trainings neu bewertet und im Anschluss erneut zur Abholung bereit gestellt.
Dokument aufteilen
Ruft die die Belegtrennung auf. Diese wird verwendet, falls ein Lieferant mehrere Rechnungen in einer PDF gesandt hat.
Autovervollständigen
Vervollständigt die Kontierung der Positionen automatisch mit den zuletzt validierten Positionsdaten des Kreditoren. Diese Funktion steht nur für Belege ohne Bestellbezug zur Verfügung und muss explizit in der Dokumentenklassen Einrichtung aktiviert werden.
Bestellabgleich
Öffnet den Bestellabgleich.
Validieren
Schließt den Validierungsprozess des Belegs ab.
Doublettenprüfung
Führt eine Doublettenprüfung manuell durch. Diese wird auch beim Abschluss des Validierungsprozesses durchgeführt.
Beleg ablehnen
Diese Aktion erlaubt es Ihnen, einen Beleg abzulehnen. Dieser wird dann, wahlweise mit einem zusätzlichen Kommentar, in einem speziellen Status "Abgelehnt" abgespeichert - nicht jedoch gelöscht.
Im Anschluss kann noch eine e-Mail an den Lieferanten gesandt werden.
Hierfür ist ein Standardkonto in der Einrichtung "E-Mail-Konten" anzulegen und als Standard im "E-Mail-Szenario Einrichtung" zu setzen.
Ist dies eingerichtet, wird das BC E-Mail Modul geöffnet. Hier wird der Bemerkungstext der Ablehnung, die Rechnungsnummer, sowie der Absender/Bearbeiter der Validierung vorausgefüllt.
Navigation
Dimensionen
Hier rüber erreichen Sie das Dimensionsmenü um Dimensionen für den Belegkopf zu hinterlegen.
Viewer
Externen Viewer öffnen
Hier rüber wird der Viewer abgedockt. Dies ermöglicht das Arbeiten auf zwei Monitoren.
Aktionen
Dokument verschieben
Hier rüber wird ein Beleg in einen anderen Mandanten verschoben.
Anhänge herunterladen
Hier rüber laden Sie die Anhänge des Belegs herunter. Sobald das Herunterladen abgeschlossen wurde, werden diese in der Infobox Anhänge angezeigt. Sie haben die Möglichkeit, das Herunterladen der Anhänge automatisch durchführen zu lassen - diese Einstellung nehmen Sie bitte in der Dokumentenklassen Einrichtung vor.
Fasttabs
Beleg
In diesem Bereich werden die Belegkopf-Informationen sowie der SQUEEZE Viewer angezeigt.
Kopffelder
Diese Felder werden mit den Ergebnissen aus der Beleglesung vorbelegt. Der Anweder prüft diese und korrigiert, bzw. reichert sie mit weiteren Daten an und vervollständigt so das Leseergebnis. Über die drei Punkte wird die Fundstelle des jeweiligen Leseergebnisses im Viewer hervorgehoben.
Viewer
Auf der rechten Seite wird der SQUEEZE Viewer angezeigt. Hierbei handelt es sich nicht um ein PDF, sondern um eine eingebundene Webkomponente, welche hier aus der Validierung ferngesteuert wird. Sie dient zur bildlichen Darstellung des Belegs und zum hervorheben von Fundstellen gelesener Werte. Weiterhin wird hier auch das lieferantenspezifische Feldtraining durchgeführt.
Zeilen
In diesem Bereich werden die ausgelesenen Positionen angezeigt. Der Anweder prüft diese und korrigiert, bzw. reichert sie mit weiteren Daten an und vervollständigt so das Leseergebnis.
Sollte das Leseergebnis bei Rechnungen mit Bestellbezug nicht ausreichen, so können die Bestell-/Wareneingangszeilen direkt importiert werden.
Bei Rechnungen ohne Bestellbezug können Positionen aus den MwSt. Raten und Kopfbeträgen generiert werden. Eine Zeile pro MwSt. Rate. Hierfür wird die Kontierungseinrichtung aus der Dokumentenklasse heran gezogen.
Dimensionen
Hier werden die Shortcut Dimensionen 1 & 2 des Belegs angezeigt.
SQUEEZE Details
Hier werden SQUEEZE spezifische Beleginformationen angezeigt.
Infoboxen
Die jeweiligen Infoboxen werden nur situationsbedingt angezeigt.
Plausibilitätseinträge
Hier werden alle zu klärende Themen für eine erfolgreiche Validierung aufgelistet.
Metadatenboxen
Die Metadatenzuordnung wird nur angezeigt, wenn vom Standard abweichende zusätzliche Felder von SQUEEZE übertragen worden sind.
Metadatenzuordnung Kopffelder
Hier werden zusätzliche Felder aus SQUEEZE aufgelistet, welche nicht zu der Standardzuordnung der Kopffelder gehören.
Metadatenzuordnung Positionsfelder
Hier werden zusätzliche Felder aus SQUEEZE aufgelistet, welche nicht zu der Standardzuordnung der Positionen gehören.
Bestellabgleichsboxen
Die Bestellabgleichsboxen werden nur angezeigt, wenn eine oder mehrere Bestellnummern auf dem Beleg erkannt worden sind.
Bestellabgleich-Info (Preise)
Hier wird für die ausgewählte Zeile der Preisvergleich angezeigt. Verglichen werden die Ergebnisse von SQUEEZE, der Lieferung, der Bestellung und der aktuellen Zeile.
Bestellabgleich-Info (Mengen)
Hier wird für die ausgewählte Zeile der Mengenvergleich angezeigt. Verglichen werden die Ergebnisse von SQUEEZE, der Lieferung, der Bestellung und der aktuellen Zeile.
Anhänge
Diese Infobox wird nur angezeigt, wenn die Anhänge zuvor heruntergeladen worden sind (das kann auf Wunsch auch automatisch nach der Belegerstellung passiert - siehe Dokumentenklassen Einrichtung. Über die drei Punkte lassen sich die Anhänge wieder entfernen.
Lieferantenspezifisches Training
Das Training stellt eine wesentliche Optimierungs-Komponente der Verarbeitung dar.
Sofern Daten nicht eindeutig durch das System erkannt werden, können lieferanten-spezifische Trainings angewendet werden, welche den Automatisierungsgrad bei der Erfassung der Rechnungen erhöhen.
Wenn der Trainingsmodus gestartet wird, können alle relevanten Felder für ein Training ausgewählt werden.
Es können beliebig viele Trainings pro Lieferant und pro Rechnungsfeld angelegt werden.
Externe Rechnungsnummern lassen sich in der Regel nicht inhaltlich im System prüfen, da keine Daten zur Überprüfung bestehen. Dieses Feld ist z.B. ideal für Trainings.
Das Trainingsfenster wird innerhalb des Viewers am unteren Bildrand eingeblendet.
Kopffeld Training
Trainieren eines Feldes
Nachdem die Trainingsfunktion gestartet wurde, ist das zu trainierende Feld auszuwählen.
Nachdem das entsprechende Feld ausgewählt wurde, ist der Anker zu definieren.
Mit Anker ist in diesem Fall der Bezugsbegriff gemeint. In diesem Falle der auf der jeweiligen Rechnung angebrachte Begriff für die externe Belegnummer. Der Ankerbegriff ist mit der rechten Maustaste auf dem Dokument im Viewer zu markieren und wird dann gelb hinterlegt.
Anschließend ist das Feld „Wert“ im Aktionsbereich anzuklicken und dann der Wert, der gesucht werden soll. Dieser ist ebenfalls mit der rechten Maustaste zu markieren. Ist der gesuchte Wert kein zusammenhängender Wert, kann auch mit der rechten Maustaste ein beliebig großer Bereich markiert werden, um alle gewünschten Informationen auszulesen. Ist die Information angegeben, kann das Training über „Trainieren“ gespeichert werden.
Das System erzeugt einen „regulären Ausdruck“ – dieser kann von geschultem Fachpersonal oder IT-lern jederzeit noch optimiert werden. Z.B. können Leerzeichen ignoriert werden, da diese selten auch im ERP System / in der Buchung mit angegeben werden.
Testen und Prüfen der vorhandenen Trainings
Mit „Testen“ wird eine Übersicht aller bisherigen Kopffeld-Trainings angezeigt. Die Ergebnisse werden direkt mit ausgegeben. Durch einen Doppelklick auf einen Eintrag wird der Anker und der Wert in dem Viewer hervorgehoben.
Entfernen eines Trainings
Um ein Training wieder zu entfernen wird die Übersicht der vorhandenen Trainings geöffnet und der zu entfernende Eintrag markiert. Mit der Entfernen-Taste "Entf" wird der Eintrag gelöscht.
Positionsfeld Training
Trainieren einer Spalte
Nachdem die Trainingsfunktion gestartet wurde, ist das zu trainierende Feld und die dazugehörige Spalte auszuwählen.
Nachdem dies ausgewählt wurde, ist die Region zu definieren.
Diese ist so zu wählen, dass Sie möglichst die gesamte Spalte eines Feldes abdeckt. Die Region ist mit der rechten Maustaste auf dem Dokument im Viewer zu markieren und wird dann gelb hinterlegt. Hierbei ist zu beachten, dass sich keine Regionen mit bereits trainierten Regionen überschneiden sollten.
Sind die Information angegeben, kann das Training über „Trainieren“ gespeichert werden.
Testen und Prüfen der vorhandenen Trainings
Mit „Testen“ wird eine Übersicht aller bisherigen Positionsfeld-Trainings angezeigt. Durch einen Doppelklick auf einen Eintrag wird der jeweils trainierte Bereich angezeigt.
Entfernen eines Trainings
Um ein Training wieder zu entfernen wird die Übersicht der vorhandenen Trainings geöffnet und der zu entfernende Eintrag markiert. Mit der Entfernen-Taste "Entf" wird der Eintrag gelöscht.
Dokument Aufteilen
Die Trennfunktion ist hauptsächlich für E-Mail-Rechnungen gedacht. Wenn Lieferanten sich nicht an die Vorgabe der E-Mail-Rechnungs-Zustellung halten (pro PDF Datei eine Rechnung).
In dem neuen Fenster wird ein Dialog gestartet, um die Belege voneinander zu trennen und so aus einem Beleg mehrere zu machen.
Auf der linken Seite werden alle Seiten des original PDFs aufgelistet. In der Mitte ist der Bereich für die Neuerstellung und Rechts sieht man die aktuell ausgewählte Seite.
Um einen Beleg aufzuteilen werden die zu einer Rechnung dazugehörigen Seiten einzeln entweder per Maus mit Drag&Drop oder per Pfeil-Taste der Tastatur in den mittleren Bereich übertragen. Dort kann man auch die Reihenfolge der Seiten korrigieren.
Ist das Rechnungsdokument korrekt separiert, kann die Erzeugung eines neuen Einzelbelegs mit „Dokument erzeugen“ gestartet werden. Der neue Beleg wird direkt von SQUEEZE ausgelesen, verarbeitet und sobald er bereit steht auch in der Übersichtsliste bereitgestellt. Dieser Vorgang wird solange wiederholt bis der original Beleg komplett aufgeteilt worden ist.
Bestell- & Wareneingangsabgleich
Der Bestell- & Wareneingangsabgleich prüft die ausgelesenen Belegpositionen und vergleicht diese mit allen Bestell- & Wareneingangszeilen anhand der ausgelesenen Bestellnummern des Belegs.
Der Bestellabgleich kann nur geöffnet werden, wenn SQUEEZE eine oder mehrere Bestellnummern vom Beleg ausgelesen hat oder wenn manuell eine (im System hinterlegte) Bestellnummer in dem Validierungs-Kopffeld eingetragen wurde.
Dieser Vergleich wird nach der Abholung des Belegs aus SQUEEZE automatisch durchgeführt. Der Anwender hat die Möglichkeit diesen Vergleich auch manuell durchzuführen oder zu korrigieren.
Menü
Zuweisen
Zugewiesene Zeilen werden durch einen grünen Haken dargestellt .
Zuweisen
Hiermit wird die ausgewählte Bestell-/Lieferzeile der ausgewählten SQUEEZE Belegzeile zugewiesen.
Automatisch zuweisen
Hiermit wird allen SQUEEZE Belegzeilen die passende Bestell-/Lieferzeile zugewiesen. Hierfür muss im oberen Bereich die Bestellung/Lieferung selbst ausgewählt werden.
Zuweisung entfernen
Nicht zugewiesene Zeilen werden durch ein rotes Ausrufezeichen dargestellt .
Ausgewählte Zuweisung entfernen
Hiermit wird die Zuweisung der ausgewählten Zeile entfernt.
Alle Zuweisungen entfernen
Hiermit werden alle Zuweisungen entfernt.
Anwenden
Ausgewählte Zeile anwenden
Hiermit wird die Zuweisung der ausgewählten Zeile angewendet. Fehlende Informationen werden aus der Bestell-/Lieferzeile ergänzt. Diese Änderung wird hierdurch auch umgehend an die Validierungszeile übertragen.
Zugewiesene Zeilen anwenden
Hiermit wird die Zuweisung aller zugewiesenen Zeilen angewendet. Fehlende Informationen werden aus den zugewiesenen Bestell-/Lieferzeile ergänzt. Diese Änderungen werden hierdurch auch umgehend an die Validierungszeilen übertragen.
Bereiche
Bestellnummer
Hier wird die derzeit zu vergleichende Bestellnummer angezeigt. Sollten mehrere Bestellnummern ausgelesen worden sein, so kann über die drei Punkte die entsprechende Liste geöffnet werden.
Bestell- & Lieferungen
in diesem Bereich werden die Bestellung und alle Ihre Zeilen, sowie alle dazugehörigen Lieferungen und deren Zeilen aufgelistet.
SQUEEZE Belegzeilen
In diesem Bereich werden alle ausgelesenen Positionen des SQUEEZE Belegs aufgelistet.
Bestell-/ Wareneingangszeilen importieren
Holen der Positionen aus Bestellung / Wareneingang
Menü
Hinzufügen zur Importvorschau
Hiermit werden alle ausgewählten Zeilen in die Importvorschau übernommen.
Ausgewählte Zeilen werden durch einen grünen Haken dargestellt .
Ausgewählte Vorschauzeile löschen
Hiermit werden alle ausgewählten Zeilen aus der Importvorschau entfernt.
Importvorschau übernehmen
Hiermit werden alle Zeilen aus der Importvorschau in den zu validierenden Beleg übernommen. Sie haben die Wahl ob diese Zeilen die SQUEEZE Positionen ersetzen oder hinten angehängt werden sollen.
Bereiche
Bestellnummer
Hier wird die ausgelesene Bestellnummer angezeigt. Sollten mehrere Bestellnummern ausgelesen worden sein, so kann über die drei Punkte die entsprechende Liste geöffnet werden.
Bestell- & Lieferungen
in diesem Bereich werden die Bestellung und alle Ihre Zeilen, sowie alle dazugehörigen Lieferungen und deren Zeilen aufgelistet.
Importvorschau
In diesem Bereich werden alle ausgewählten Positionen aufgelistet.
Externer Viewer
Um das Arbeiten mit dem Viewer zu vereinfachen, kann der eingebettete Viewer abgedockt und so auf einem zweiten Bildschirm genutzt werden.
Sämtliche Viewer Funktionen, wie z.B. das Highlighting der Kopf- und Positionsdaten, sowie die Trainingsfunktionen des Viewers werden weiterhin unterstützt.
Damit der abgedockte Viewer auch bei einem Belegwechsel aktiv bleibt und sich selbstständig aktualisiert, muss in der benutzerspezifischen Einrichtung das Feld "Nur externen Viewer verwenden" gesetzt werden.
Extension Entwicklung
In diesem Kapitel werden wichtige Integration Events und Beispiele aufgeführt, die bei der Entwicklung einer Extension für SQUEEZE for BC helfen. Wichtig: Anpassungen dürfen nur durch entsprechend geschulte Berater/Entwickler durchgeführt werden. Diese befinden sich außerdem immer außerhalb des Standard-Supports.
Hinzufügen eines Feldes in der Validierung (bis Squeeze BC APP Version 1.*)
Im Folgenden wird anhand einer Beispielextension dargestellt, wie man als Entwickler Felder in der Validierung hinzufügen kann.
Benötigte Integration Events inkl. beispielhafter Prozeduren:
codeunit 50100 EventSubs
{
//
//Any header field that you want to transfer to the resulting document, has to be added to the source JSON Object
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ Document Mgt.", 'OnBeforeAddLineToDocumentJObj', '', false, false)]
local procedure SQZDocMgtOnBeforeAddLineToDocumentJObj(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
begin
AddCustomHeaderFieldsToJson(DocumentJObj, DocHeader);
end;
//
// Any line field that you want to transfer to the resulting document, has to be added to the source JSON Object
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ Document Mgt.", 'OnBeforeAddLineJObjToLineJArray', '', false, false)]
local procedure SQZDocMgtOnBeforeAddLineJObjToLineJArray(var LineJObj: JsonObject; DocLine: Record "DXP SQZ Document Line")
begin
AddCustomLineFieldsToJson(LineJObj, DocLine);
end;
//
// [If you want to perform plausibility checks on the newly added header field, this is the place]
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ Document Mgt.", 'OnAfterDoHeaderPlausibilityChecks', '', false, false)]
local procedure SQZDocMgtOnBeforeDoHeaderPlausibilityChecks(DocHeader: Record "DXP SQZ Document Header"; var PlausibilityCheck: Codeunit "DXP Plausiblity Check Mgt.")
begin
CheckCustomer(PlausibilityCheck, DocHeader."Customer No.");
end;
//
// [If you want to perform plausibility checks on the newly added line field, this is the place]
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ Document Mgt.", 'OnAfterDoLinePlausibilityChecks', '', false, false)]
local procedure SQZDocMgtOnAfterDoLinePlausibilityChecks(DocHeader: Record "DXP SQZ Document Header"; DocLine: Record "DXP SQZ Document Line"; var PlausibilityCheck: Codeunit "DXP Plausiblity Check Mgt.")
begin
CheckCustomer(PlausibilityCheck, DocLine."Customer No.");
end;
//
// The value of the previously extended JSON Object now has to saved to the corresponding field in the SQUEEZE Document Line
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ Document Mgt.", 'OnBeforeModifySQUEEZEDocumentHeader', '', false, false)]
local procedure SqzDocMgtOnBeforeModifySQUEEZEDocumentHeader(var DocHeader: Record "DXP SQZ Document Header"; RawJson: JsonObject)
var
JSONHelper: Codeunit "DXP Json Helper";
SQZApiTokenMgt: Codeunit "DXP SQZ API Token Mgt.";
TokenMgt: Codeunit TokenMgt;
begin
DocHeader."Customer No." := COPYSTR(JsonHelper.ValAsTxt(RawJson, SQZApiTokenMgt.GetHeaderValueByNameTok(TokenMgt.GetCustomerNoTok()), false), 1, MaxStrLen(DocHeader."Customer No."));
end;
//
// The value of the previously extended JSON Object now has to saved to the corresponding field in the SQUEEZE Document Header
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ Document Mgt.", 'OnBeforeTransferRecognizedValuesOnAfterAssignRecognizedValues', '', false, false)]
local procedure SQZDocMgtOnBeforeTransferRecognizedValuesOnAfterAssignRecognizedValues(RowJTok: JsonToken; var DocLine: Record "DXP SQZ Document Line")
var
JSONHelper: Codeunit "DXP Json Helper";
SQZApiTokenMgt: Codeunit "DXP SQZ API Token Mgt.";
TokenMgt: Codeunit TokenMgt;
begin
DocLine."Customer No." := CopyStr(JsonHelper.ValAsTxt(RowJTok.AsObject(), SQZApiTokenMgt.GetCellValueTok(TokenMgt.GetCustomerNoTok()), false), 1, MaxStrLen(DocLine."Customer No."));
end;
//
// The newly added fields now have to be added to the field mapping
// Otherwise the recognized values will be saved as meta data
// This step is necessary to make sure that the fields can be highlighted in the SQUEEZE Viewer
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ API Mgt.", 'OnAfterInitMapping', '', false, false)]
local procedure SQZApiMgtOnAfterInitMapping(var HeaderMapping: Dictionary of [Text, Integer]; var LineMapping: Dictionary of [Text, Integer]; DocClass: Enum "DXP Document Class")
var
SQZDocHeader: Record "DXP SQZ Document Header";
SQZDocLine: Record "DXP SQZ Document Line";
TokenMgt: Codeunit TokenMgt;
begin
// The standard (without installed extensions) supports one Document Class
case DocClass of
DocClass::"DXP Invoice / Credit Memo":
begin
HeaderMapping.Add(TokenMgt.GetCustomerNoTok(), SQZDocHeader.FieldNo("Customer No."));
LineMapping.Add(TokenMgt.GetCustomerNoTok(), SQZDocLine.FieldNo("Customer No."));
end;
end;
end;
//
// The value in the JSON Object now has to be transferred to the Purchase Header
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP Document Transfer Mgt.", 'OnAfterCreatePurchaseHeader', '', false, false)]
local procedure DocTransferMgtOnAfterCreatePurchaseHeader(var JObject: JsonObject; PurchaseHeader: Record "Purchase Header")
begin
TransferCustomHeaderFieldFromJsonToPurchaseHeader(JObject, PurchaseHeader);
end;
//
// The value in the JSON Object now has to be transferred to the Purchase Line
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP Document Transfer Mgt.", 'OnBeforeInsertPurchaseLine', '', false, false)]
local procedure DocTransferMgtOnAfterInsertPurchaseLineOnBeforeAddDimensions(var JObjectLine: JsonObject; var PurchaseLine: Record "Purchase Line")
begin
TransferCustomHeaderFieldFromJsonToPurchaseLine(JObjectLine, PurchaseLine);
end;
local procedure TransferCustomHeaderFieldFromJsonToPurchaseHeader(var JObject: JsonObject; PurchaseHeader: Record "Purchase Header")
var
JsonHelper: Codeunit "DXP Json Helper";
TokenMgt: Codeunit TokenMgt;
begin
PurchaseHeader.Validate("DXP Customer No.", JsonHelper.ValAsTxt(JObject, TokenMgt.GetCustomerNoTok(), false));
PurchaseHeader.Modify();
end;
local procedure TransferCustomHeaderFieldFromJsonToPurchaseLine(var JObjectLine: JsonObject; var PurchaseLine: Record "Purchase Line")
var
JsonHelper: Codeunit "DXP Json Helper";
TokenMgt: Codeunit TokenMgt;
begin
PurchaseLine.Validate("DXP Customer No.", JsonHelper.ValAsTxt(JObjectLine, TokenMgt.GetCustomerNoTok(), false));
end;
local procedure AddCustomHeaderFieldsToJson(var DocumentJObj: JsonObject; SQZDocumentHeader: Record "DXP SQZ Document Header")
var
TokenMgt: Codeunit TokenMgt;
begin
DocumentJObj.Add(TokenMgt.GetCustomerNoTok(), SQZDocumentHeader."Customer No.");
end;
local procedure AddCustomLineFieldsToJson(var LineJObj: JsonObject; SQZDocumentLine: Record "DXP SQZ Document Line")
var
TokenMgt: Codeunit TokenMgt;
begin
LineJObj.Add(TokenMgt.GetCustomerNoTok(), SQZDocumentLine."Customer No.");
end;
[TryFunction]
local procedure CustomerExists(CustomerNo: Code[20])
var
Customer: Record Customer;
begin
Customer.Get(CustomerNo);
end;
local procedure CheckCustomer(var PlausibilityCheck: Codeunit "DXP Plausiblity Check Mgt."; CustomerNo: Code[20]): Boolean
begin
if CustomerNo = '' then
exit(false);
if not CustomerExists(CustomerNo) then begin
PlausibilityCheck.AddPlausibilityCheckEntry(GetLastErrorText(), Page::"Customer List");
exit(false);
end;
exit(true);
end;
}
Table Extensions:
SQUEEZE 4 BC
tableextension 50100 "SQZ Doc. Header Ext." extends "DXP SQZ Document Header"
{
fields
{
field(50100; "Customer No."; Code[20])
{
TableRelation = Customer;
ValidateTableRelation = false;
Caption = 'Customer No.';
}
}
}
tableextension 50101 "SQZ Doc. Line Ext." extends "DXP SQZ Document Line"
{
fields
{
field(50100; "Customer No."; Code[20])
{
TableRelation = Customer;
ValidateTableRelation = false;
Caption = 'Customer No.';
}
}
}
Zielbeleg (hier: Einkaufsbeleg)
tableextension 50102 "Purchase Header Ext." extends "Purchase Header"
{
fields
{
field(50100; "DXP Customer No."; Code[20])
{
DataClassification = CustomerContent;
TableRelation = Customer;
Caption = 'DEXPRO Customer No.';
}
}
}
Page Extensions:
SQUEEZE 4 BC
pageextension 50100 "SQZ Document Ext." extends "DXP SQZ Document"
{
layout
{
addafter(BuyFromVendorInternal)
{
field("Customer No. Internal"; Rec."Customer No.")
{
ApplicationArea = All;
ToolTip = 'Specifies the value of the Customer No. field.';
trigger OnAssistEdit()
begin
MarkField(Rec.FieldNo("Customer No."), Rec."Customer No.", Rec);
end;
trigger OnValidate()
begin
CheckPlausibility();
end;
}
}
addafter(BuyFromVendor)
{
field("Customer No."; Rec."Customer No.")
{
ApplicationArea = All;
ToolTip = 'Specifies the value of the Customer No. field.';
trigger OnAssistEdit()
var
ApiMgt: Codeunit "DXP SQZ API Mgt.";
ViewerResident: Codeunit "DXP SQUEEZE Viewer Resident";
begin
MarkField(Rec.FieldNo("Customer No."), Rec."Customer No.", Rec);
end;
trigger OnValidate()
begin
CheckPlausibility();
end;
}
}
}
local procedure MarkField(AppFldNo: Integer; FieldVal: Variant; DocHeader: Record "DXP SQZ Document Header")
var
ApiMgt: Codeunit "DXP SQZ API Mgt.";
ViewerResident: Codeunit "DXP SQUEEZE Viewer Resident";
begin
ViewerResident := GetViewerResident();
ApiMgt.MarkField(AppFldNo, FieldVal, ViewerResident, DocHeader);
end;
}
pageextension 50101 "SQZ Document Sf. Ext." extends "DXP SQZ Document Subform"
{
layout
{
addafter("No.")
{
field("Customer No."; Rec."Customer No.")
{
ApplicationArea = All;
ToolTip = 'Specifies the value of the Customer No. field.';
}
}
}
}
Zielbeleg (hier: Einkaufsbeleg)
pageextension 50102 "Purchase Invoice Ext." extends "Purchase Invoice"
{
layout
{
addafter("Buy-from Vendor No.")
{
field("DXP Customer No."; Rec."DXP Customer No.")
{
ToolTip = 'Specifies the value of the DEXPRO Customer No. field.';
ApplicationArea = all;
}
}
}
}
pageextension 50103 "Purchase Inv. Sf Ext." extends "Purch. Invoice Subform"
{
layout
{
addafter("No.")
{
field("DXP Customer No."; Rec."DXP Customer No.")
{
ToolTip = 'Specifies the value of the DEXPRO Customer No. field.';
ApplicationArea = all;
}
}
}
}
Optionale Hilfsobjekte:
codeunit 50101 TokenMgt
{
procedure GetCustomerNoTok(): Text
begin
exit(CustomerNoTok);
end;
var
CustomerNoTok: Label 'customerNo', Locked = true;
}
Hinzufügen eines Feldes in der Validierung (ab Version 2.0)
Im Folgenden wird anhand einer Beispielextension dargestellt, wie man als Entwickler Felder in der Validierung hinzufügen kann (hier: Dokumentenklasse Rechnung/Gutschrift).
Benötigte Integration Events inkl. beispielhafter Prozeduren:
codeunit 50100 EventSubs
{
//
//Any header field that you want to transfer to the resulting document, has to be added to the source JSON Object
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Inv/Crdt Memo Impl.", 'OnBeforeAddLineToDocumentJObj', '', false, false)]
local procedure SQZPInvCrdtMemoImplOnBeforeAddLineToDocumentJObj(var DocumentJObj: JsonObject; DocHeader: Record "DXP SQZ Document Header")
begin
AddCustomHeaderFieldsToJson(DocumentJObj, DocHeader);
end;
//
// Any line field that you want to transfer to the resulting document, has to be added to the source JSON Object
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Inv/Crdt Memo Impl.", 'OnBeforeAddLineJObjToLineJArray', '', false, false)]
local procedure SQZPInvCrdtMemoImplOnBeforeAddLineJObjToLineJArray(var LineJObj: JsonObject; DocLine: Record "DXP SQZ Document Line")
begin
AddCustomLineFieldsToJson(LineJObj, DocLine);
end;
//
// [If you want to perform plausibility checks on the newly added header field, this is the place]
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Inv/Crdt Memo Impl.", 'OnAfterDoHeaderPlausibilityChecks', '', false, false)]
local procedure SQZPInvCrdtMemoImplOnBeforeDoHeaderPlausibilityChecks(DocHeader: Record "DXP SQZ Document Header"; var PlausibilityCheck: Codeunit "DXP Plausiblity Check Mgt.")
begin
CheckCustomer(PlausibilityCheck, DocHeader."Customer No.");
end;
//
// [If you want to perform plausibility checks on the newly added line field, this is the place]
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Inv/Crdt Memo Impl.", 'OnAfterDoLinePlausibilityChecks', '', false, false)]
local procedure SQZPInvCrdtMemoImplOnAfterDoLinePlausibilityChecks(DocHeader: Record "DXP SQZ Document Header"; DocLine: Record "DXP SQZ Document Line"; var PlausibilityCheck: Codeunit "DXP Plausiblity Check Mgt.")
begin
CheckCustomer(PlausibilityCheck, DocLine."Customer No.");
end;
//
// The value of the previously extended JSON Object now has to saved to the corresponding field in the SQUEEZE Document Line
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ Document Mgt.", 'OnBeforeModifySQUEEZEDocumentHeader', '', false, false)]
local procedure SqzDocMgtOnBeforeModifySQUEEZEDocumentHeader(var DocHeader: Record "DXP SQZ Document Header"; RawJson: JsonObject)
var
JSONHelper: Codeunit "DXP Json Helper";
SQZApiTokenMgt: Codeunit "DXP SQZ API Token Mgt.";
TokenMgt: Codeunit TokenMgt;
begin
DocHeader."Customer No." := COPYSTR(JsonHelper.ValAsTxt(RawJson, SQZApiTokenMgt.GetHeaderValueByNameTok(TokenMgt.GetCustomerNoTok()), false), 1, MaxStrLen(DocHeader."Customer No."));
end;
//
// The value of the previously extended JSON Object now has to saved to the corresponding field in the SQUEEZE Document Header
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ Document Mgt.", 'OnBeforeTransferRecognizedValuesOnAfterAssignRecognizedValues', '', false, false)]
local procedure SQZDocMgtOnBeforeTransferRecognizedValuesOnAfterAssignRecognizedValues(RowJTok: JsonToken; var DocLine: Record "DXP SQZ Document Line")
var
JSONHelper: Codeunit "DXP Json Helper";
SQZApiTokenMgt: Codeunit "DXP SQZ API Token Mgt.";
TokenMgt: Codeunit TokenMgt;
begin
DocLine."Customer No." := CopyStr(JsonHelper.ValAsTxt(RowJTok.AsObject(), SQZApiTokenMgt.GetCellValueTok(TokenMgt.GetCustomerNoTok()), false), 1, MaxStrLen(DocLine."Customer No."));
end;
//
// The newly added fields now have to be added to the field mapping
// Otherwise the recognized values will be saved as meta data
// This step is also necessary to make sure that the fields can be highlighted in the SQUEEZE Viewer
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ API Mgt.", 'OnAfterInitMapping', '', false, false)]
local procedure SQZApiMgtOnAfterInitMapping(var HeaderMapping: Dictionary of [Text, Integer]; var LineMapping: Dictionary of [Text, Integer]; DocClass: Enum "DXP Document Class")
var
SQZDocHeader: Record "DXP SQZ Document Header";
SQZDocLine: Record "DXP SQZ Document Line";
TokenMgt: Codeunit TokenMgt;
begin
case DocClass of
DocClass::"DXP Invoice / Credit Memo":
begin
HeaderMapping.Add(TokenMgt.GetCustomerNoTok(), SQZDocHeader.FieldNo("Customer No."));
LineMapping.Add(TokenMgt.GetCustomerNoTok(), SQZDocLine.FieldNo("Customer No."));
end;
end;
end;
//
// The value in the JSON Object now has to be transferred to the Purchase Header
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP Document Transfer Mgt.", 'OnAfterCreatePurchaseHeader', '', false, false)]
local procedure DocTransferMgtOnAfterCreatePurchaseHeader(var JObject: JsonObject; PurchaseHeader: Record "Purchase Header")
begin
TransferCustomHeaderFieldFromJsonToPurchaseHeader(JObject, PurchaseHeader);
end;
//
// The value in the JSON Object now has to be transferred to the Purchase Line
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP Document Transfer Mgt.", 'OnBeforeInsertPurchaseLine', '', false, false)]
local procedure DocTransferMgtOnAfterInsertPurchaseLineOnBeforeAddDimensions(var JObjectLine: JsonObject; var PurchaseLine: Record "Purchase Line")
begin
TransferCustomHeaderFieldFromJsonToPurchaseLine(JObjectLine, PurchaseLine);
end;
local procedure TransferCustomHeaderFieldFromJsonToPurchaseHeader(var JObject: JsonObject; PurchaseHeader: Record "Purchase Header")
var
JsonHelper: Codeunit "DXP Json Helper";
TokenMgt: Codeunit TokenMgt;
begin
PurchaseHeader.Validate("DXP Customer No.", JsonHelper.ValAsTxt(JObject, TokenMgt.GetCustomerNoTok(), false));
PurchaseHeader.Modify();
end;
local procedure TransferCustomHeaderFieldFromJsonToPurchaseLine(var JObjectLine: JsonObject; var PurchaseLine: Record "Purchase Line")
var
JsonHelper: Codeunit "DXP Json Helper";
TokenMgt: Codeunit TokenMgt;
begin
PurchaseLine.Validate("DXP Customer No.", JsonHelper.ValAsTxt(JObjectLine, TokenMgt.GetCustomerNoTok(), false));
end;
local procedure AddCustomHeaderFieldsToJson(var DocumentJObj: JsonObject; SQZDocumentHeader: Record "DXP SQZ Document Header")
var
TokenMgt: Codeunit TokenMgt;
begin
DocumentJObj.Add(TokenMgt.GetCustomerNoTok(), SQZDocumentHeader."Customer No.");
end;
local procedure AddCustomLineFieldsToJson(var LineJObj: JsonObject; SQZDocumentLine: Record "DXP SQZ Document Line")
var
TokenMgt: Codeunit TokenMgt;
begin
LineJObj.Add(TokenMgt.GetCustomerNoTok(), SQZDocumentLine."Customer No.");
end;
[TryFunction]
local procedure CustomerExists(CustomerNo: Code[20])
var
Customer: Record Customer;
begin
Customer.Get(CustomerNo);
end;
local procedure CheckCustomer(var PlausibilityCheck: Codeunit "DXP Plausiblity Check Mgt."; CustomerNo: Code[20]): Boolean
begin
if CustomerNo = '' then
exit(false);
if not CustomerExists(CustomerNo) then begin
PlausibilityCheck.AddPlausibilityCheckEntry(GetLastErrorText(), Page::"Customer List");
exit(false);
end;
exit(true);
end;
}
Table Extensions:
SQUEEZE 4 BC
tableextension 50100 "SQZ Doc. Header Ext." extends "DXP SQZ Document Header"
{
fields
{
field(50100; "Customer No."; Code[20])
{
TableRelation = Customer;
ValidateTableRelation = false;
Caption = 'Customer No.';
}
}
}
tableextension 50101 "SQZ Doc. Line Ext." extends "DXP SQZ Document Line"
{
fields
{
field(50100; "Customer No."; Code[20])
{
TableRelation = Customer;
ValidateTableRelation = false;
Caption = 'Customer No.';
}
}
}
Zielbeleg (hier: Einkaufsbeleg)
tableextension 50102 "Purchase Header Ext." extends "Purchase Header"
{
fields
{
field(50100; "DXP Customer No."; Code[20])
{
DataClassification = CustomerContent;
TableRelation = Customer;
Caption = 'DEXPRO Customer No.';
}
}
}
Page Extensions:
SQUEEZE 4 BC
pageextension 50100 "SQZ Document Ext." extends "DXP SQZ Document v2"
{
layout
{
addafter(BuyFromVendorInternal)
{
field("Customer No. Internal"; Rec."Customer No.")
{
ApplicationArea = All;
ToolTip = 'Specifies the value of the Customer No. field.';
trigger OnAssistEdit()
begin
MarkField(Rec.FieldNo("Customer No."), Rec."Customer No.", Rec);
end;
trigger OnValidate()
begin
CheckPlausibility();
end;
}
}
addafter(BuyFromVendorExternal)
{
field("Customer No."; Rec."Customer No.")
{
ApplicationArea = All;
ToolTip = 'Specifies the value of the Customer No. field.';
trigger OnAssistEdit()
var
ApiMgt: Codeunit "DXP SQZ API Mgt.";
ViewerResident: Codeunit "DXP SQUEEZE Viewer Resident";
begin
MarkField(Rec.FieldNo("Customer No."), Rec."Customer No.", Rec);
end;
trigger OnValidate()
begin
CheckPlausibility();
end;
}
}
}
local procedure MarkField(AppFldNo: Integer; FieldVal: Variant; DocHeader: Record "DXP SQZ Document Header")
var
ApiMgt: Codeunit "DXP SQZ API Mgt.";
ViewerResident: Codeunit "DXP SQUEEZE Viewer Resident";
begin
ViewerResident := GetViewerResident();
ApiMgt.MarkField(AppFldNo, FieldVal, ViewerResident, DocHeader);
end;
}
pageextension 50101 "SQZ Document Sf. Ext." extends "DXP SQZ Document Subform"
{
layout
{
addafter("No.")
{
field("Customer No."; Rec."Customer No.")
{
ApplicationArea = All;
ToolTip = 'Specifies the value of the Customer No. field.';
}
}
}
}
Zielbeleg (hier: Einkaufsbeleg)
pageextension 50102 "Purchase Invoice Ext." extends "Purchase Invoice"
{
layout
{
addafter("Buy-from Vendor No.")
{
field("DXP Customer No."; Rec."DXP Customer No.")
{
ToolTip = 'Specifies the value of the DEXPRO Customer No. field.';
ApplicationArea = all;
}
}
}
}
pageextension 50103 "Purchase Inv. Sf Ext." extends "Purch. Invoice Subform"
{
layout
{
addafter("No.")
{
field("DXP Customer No."; Rec."DXP Customer No.")
{
ToolTip = 'Specifies the value of the DEXPRO Customer No. field.';
ApplicationArea = all;
}
}
}
}
Optionale Hilfsobjekte:
codeunit 50101 TokenMgt
{
procedure GetCustomerNoTok(): Text
begin
exit(CustomerNoTok);
end;
var
CustomerNoTok: Label 'customerNo', Locked = true;
}
Hinzufügen eines Feldes in der Validierung (ab Version 2.10)
Im Folgenden wird anhand einer Beispielextension dargestellt, wie man als Entwickler Felder in der Validierung hinzufügen kann (hier: Dokumentenklasse Rechnung/Gutschrift).
Optionale Integration Events inkl. beispielhafter Prozeduren:
codeunit 50100 EventSubs
{
//
// [If you want to perform plausibility checks on the newly added header field, this is the place]
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Inv/Crdt Memo Impl.", 'OnAfterDoHeaderPlausibilityChecks', '', false, false)]
local procedure SQZPInvCrdtMemoImplOnBeforeDoHeaderPlausibilityChecks(DocHeader: Record "DXP SQZ Document Header"; var PlausibilityCheck: Codeunit "DXP Plausiblity Check Mgt.")
begin
CheckCustomer(PlausibilityCheck, DocHeader."Customer No.");
end;
//
// [If you want to perform plausibility checks on the newly added line field, this is the place]
//
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ P. Inv/Crdt Memo Impl.", 'OnAfterDoLinePlausibilityChecks', '', false, false)]
local procedure SQZPInvCrdtMemoImplOnAfterDoLinePlausibilityChecks(DocHeader: Record "DXP SQZ Document Header"; DocLine: Record "DXP SQZ Document Line"; var PlausibilityCheck: Codeunit "DXP Plausiblity Check Mgt.")
begin
CheckCustomer(PlausibilityCheck, DocLine."Customer No.");
end;
[TryFunction]
local procedure CustomerExists(CustomerNo: Code[20])
var
Customer: Record Customer;
begin
Customer.Get(CustomerNo);
end;
local procedure CheckCustomer(var PlausibilityCheck: Codeunit "DXP Plausiblity Check Mgt."; CustomerNo: Code[20]): Boolean
begin
if CustomerNo = '' then
exit(false);
if not CustomerExists(CustomerNo) then begin
PlausibilityCheck.AddPlausibilityCheckEntry(GetLastErrorText(), Page::"Customer List");
exit(false);
end;
exit(true);
end;
}
Table Extensions:
SQUEEZE 4 BC
tableextension 50100 "SQZ Doc. Header Ext." extends "DXP SQZ Document Header"
{
fields
{
field(50100; "Customer No."; Code[20])
{
TableRelation = Customer;
ValidateTableRelation = false;
Caption = 'Customer No.';
}
}
}
tableextension 50101 "SQZ Doc. Line Ext." extends "DXP SQZ Document Line"
{
fields
{
field(50100; "Customer No."; Code[20])
{
TableRelation = Customer;
ValidateTableRelation = false;
Caption = 'Customer No.';
}
}
}
Zielbeleg (hier: Einkaufsbeleg)
tableextension 50102 "Purchase Header Ext." extends "Purchase Header"
{
fields
{
field(50100; "DXP Customer No."; Code[20])
{
DataClassification = CustomerContent;
TableRelation = Customer;
Caption = 'DEXPRO Customer No.';
}
}
}
Page Extensions:
SQUEEZE 4 BC
pageextension 50100 "SQZ Document Ext." extends "DXP SQZ Document v2"
{
layout
{
addafter(BuyFromVendorInternal)
{
field("Customer No. Internal"; Rec."Customer No.")
{
ApplicationArea = All;
ToolTip = 'Specifies the value of the Customer No. field.';
//The following code is optional. It is used to highlight a recognized value in the Squeeze Viewer
trigger OnAssistEdit()
begin
MarkField(Rec.FieldNo("Customer No."), Rec."Customer No.", Rec);
end;
trigger OnValidate()
begin
CheckPlausibility();
end;
}
}
addafter(BuyFromVendorExternal)
{
field("Customer No."; Rec."Customer No.")
{
ApplicationArea = All;
ToolTip = 'Specifies the value of the Customer No. field.';
//The following code is optional. It is used to highlight a recognized value in the Squeeze Viewer
trigger OnAssistEdit()
var
ApiMgt: Codeunit "DXP SQZ API Mgt.";
ViewerResident: Codeunit "DXP SQUEEZE Viewer Resident";
begin
MarkField(Rec.FieldNo("Customer No."), Rec."Customer No.", Rec);
end;
trigger OnValidate()
begin
CheckPlausibility();
end;
}
}
}
local procedure MarkField(AppFldNo: Integer; FieldVal: Variant; DocHeader: Record "DXP SQZ Document Header")
var
ApiMgt: Codeunit "DXP SQZ API Mgt.";
ViewerResident: Codeunit "DXP SQUEEZE Viewer Resident";
begin
ViewerResident := GetViewerResident();
ApiMgt.MarkField(AppFldNo, FieldVal, ViewerResident, DocHeader);
end;
}
pageextension 50101 "SQZ Document Sf. Ext." extends "DXP SQZ Document Subform"
{
layout
{
addafter("No.")
{
field("Customer No."; Rec."Customer No.")
{
ApplicationArea = All;
ToolTip = 'Specifies the value of the Customer No. field.';
}
}
}
}
Zielbeleg (hier: Einkaufsbeleg)
pageextension 50102 "Purchase Invoice Ext." extends "Purchase Invoice"
{
layout
{
addafter("Buy-from Vendor No.")
{
field("DXP Customer No."; Rec."DXP Customer No.")
{
ToolTip = 'Specifies the value of the DEXPRO Customer No. field.';
ApplicationArea = all;
}
}
}
}
pageextension 50103 "Purchase Inv. Sf Ext." extends "Purch. Invoice Subform"
{
layout
{
addafter("No.")
{
field("DXP Customer No."; Rec."DXP Customer No.")
{
ToolTip = 'Specifies the value of the DEXPRO Customer No. field.';
ApplicationArea = all;
}
}
}
}
Abweichende Verwendung der SQUEEZE Anhänge
Im Folgenden wird kurz erläutert, wie die durch SQUEEZE for BC heruntergeladenen Anhänge für ein Szenario verwendet werden können, das von der vorgesehenen Verwendung abweicht.
Nach der Erstellung des Einkaufsbeleges aus dem validierten SQUEEZE Beleg haben Sie die Möglichkeit, die Anhänge abzugreifen (sofern diese im Vorfeld heruntergeladen wurden).
// Set IsHandled to true and implement your code
// Do not forget to deactivate "Transfer attachments to target document" in the Document Class Setup
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP Document Mgt.", 'OnBeforeTransferCoreAttachmentsToStandardDocument', '', false, false)]
local procedure DXPDocMgtOnBeforeTransferCoreAttachmentsToStandardDocument(Document: Record "DXP Document"; var IsHandled: Boolean)
begin
IsHandled := true;
HandleCoreAttachmentsAccordingToYourNeeds(Document, IsHandled);
end;
procedure HandleCoreAttachmentsAccordingToYourNeeds(Document: Record "DXP Document"; var IsHandled: Boolean)
var
CoreAttachments: Record "DXP Document Attachment";
InStr: InStream;
begin
CoreAttachments.SetRange("Document No.", Document."No.");
CoreAttachments.IsEmpty() then
exit;
CoreAttachments.FindSet();
repeat
CoreAttachments.Calcfields(Attachment);
CoreAttachments.Attachment.CreateInStream(InStr);
// Here you can handle the file stream according to your needs
[...]
until CoreAttachments.Next() = 0;
end;
Implementierung eines benutzerdefinierten, automatischen Bestellabgleichs
Einführung
Der automatische Bestellabgleich ist ein wichtiger Bestandteil der Dokumentenverarbeitung in Squeeze for Business Central. Im Standard vergleicht das System eingehende Belege mit vorhandenen Bestellungen und Wareneingängen. Diese Dokumentation zeigt Ihnen, wie Sie diesen Abgleichsprozess um Ihre eigenen Belegarten erweitern können.
Die Standardimplementierung verwendet einen dreistufigen Prozess:
- Sammeln relevanter Belegnummern basierend auf Geschäftsregeln
- Für jede gefundene Belegnummer wird ein detaillierter Abgleich durchgeführt
- Im Anschluss werden die von Squeeze ausgelesenen Positionen um die gefundenen Daten angereichert
Diesen bewährten Ansatz werden wir in der folgenden, beispielhaften Implementierung beibehalten.
Integrationspunkt
Der zentrale Integrationspunkt ist das OnBeforePerformAutomaticOrdermatch
-Event in Codeunit 70954632 "DXP SQZ Document Mgt.". Dieses Event wird nach der Erstellung von Kopf- und Positionsdaten aufgerufen.
[IntegrationEvent(false, false)]
local procedure OnBeforePerformAutomaticOrdermatch(
DocHeader: Record "DXP SQZ Document Header";
var OrderNoList: List of [Code[20]];
var IsHandled: Boolean)
Parameter
DocHeader
: Der Dokumentenkopf mit den zu vergleichenden DatenOrderNoList
: Eine Liste von Belegnummern für den AbgleichIsHandled
: Steuert, ob die Standardverarbeitung übersprungen werden soll
Implementierungsbeispiel
Technische Umsetzung
1. Erweiterung des Dokumententyp-Enums
Zunächst erweitern wir die möglichen Dokumententypen um unseren eigenen Typ:
enumextension 50100 "Custom Order Match Doc. Type" extends "DXP Order Match Document Type"
{
value(50000; "Custom")
{
Caption = 'Custom Document';
}
}
2. Implementierung der Abgleichslogik
Der zentrale Punkt unserer Implementierung ist eine Codeunit, die den Abgleichsprozess steuert. Integrationspunkt ist :
//codeunit 50100 "Custom Document Matching"
//{
[EventSubscriber(ObjectType::Codeunit, Codeunit::"DXP SQZ Document Mgt.", 'OnBeforePerformAutomaticOrdermatch', '', false, false)]
local procedure OnBeforePerformAutomaticOrdermatch(
DocHeader: Record "DXP SQZ Document Header";
var OrderNoList: List of [Code[20]];
var IsHandled: Boolean)
var
CustomSourceDoc: Record "Custom Source Document";
CustomDocNo: Code[20];
begin
// Take control of the matching process and prevent standard processing
IsHandled := true;
// Find potential matching documents
CustomSourceDoc.SetRange("Vendor No.", DocHeader."Buy-from Vendor No.");
// Add your specific document status or type filters
CustomSourceDoc.SetRange("Document Type", CustomSourceDoc."Document Type"::Order);
CustomSourceDoc.SetRange(Status, CustomSourceDoc.Status::Released);
// Add matching document numbers to the list
if CustomSourceDoc.FindSet() then
repeat
CustomDocNo := CustomSourceDoc."No.";
if IsDocumentEligibleForMatching(CustomSourceDoc, DocHeader) then
if not OrderNoList.Contains(CustomDocNo) then
OrderNoList.Add(CustomDocNo);
until CustomSourceDoc.Next() = 0;
// Process all collected documents
ProcessMatchingDocuments(DocHeader, OrderNoList);
end;
local procedure IsDocumentEligibleForMatching(
CustomSourceDoc: Record "Custom Source Document";
DocHeader: Record "DXP SQZ Document Header"): Boolean
begin
// Implement business rules for document selection
// For example:
if CustomSourceDoc."Document Date" > DocHeader."Document Date" then
exit(false);
if CustomSourceDoc."Currency Code" <> DocHeader."Currency Code" then
exit(false);
// Check for open lines that can be matched
if not HasOpenLinesToMatch(CustomSourceDoc) then
exit(false);
exit(true);
end;
local procedure HasOpenLinesToMatch(CustomSourceDoc: Record "Custom Source Document"): Boolean
var
CustomSourceLine: Record "Custom Source Line";
begin
CustomSourceLine.SetRange("Document No.", CustomSourceDoc."No.");
CustomSourceLine.SetFilter("Outstanding Quantity", '>0');
exit(not CustomSourceLine.IsEmpty());
end;
//}
3. Verarbeitung der gefundenen Belege
Nach dem Sammeln der relevanten Belegnummern erfolgt der eigentliche Abgleich:
local procedure ProcessMatchingDocuments(
DocHeader: Record "DXP SQZ Document Header";
OrderNoList: List of [Code[20]])
var
TempMatchEntry: Record "DXP SQZ Order Match Entry" temporary;
OrderNo: Code[20];
begin
foreach OrderNo in OrderNoList do begin
// Get matching entries for current document
GetMatchEntries(OrderNo, TempMatchEntry, DocHeader);
if not TempMatchEntry.IsEmpty() then
// Try to find and assign matching lines
TryMatchDocumentLines(TempMatchEntry, DocHeader);
end;
end;
local procedure GetMatchEntries(
DocumentNo: Code[20];
var TempMatchEntry: Record "DXP SQZ Order Match Entry" temporary;
DocHeader: Record "DXP SQZ Document Header")
var
CustomSourceLine: Record "Custom Source Line";
begin
TempMatchEntry.Reset();
TempMatchEntry.DeleteAll();
// Get lines from custom document
CustomSourceLine.SetRange("Document No.", DocumentNo);
if CustomSourceLine.FindSet() then
repeat
// Create match entry for each relevant line
CreateMatchEntry(CustomSourceLine, TempMatchEntry);
until CustomSourceLine.Next() = 0;
end;
local procedure CreateMatchEntry(
CustomSourceLine: Record "Custom Source Line";
var TempMatchEntry: Record "DXP SQZ Order Match Entry" temporary)
begin
TempMatchEntry.Init();
TempMatchEntry."Document Type" := "DXP Order Match Document Type"::Custom;
TempMatchEntry."Document No." := CustomSourceLine."Document No.";
TempMatchEntry."Document Line No." := CustomSourceLine."Line No.";
TempMatchEntry."No." := CustomSourceLine."Item No.";
TempMatchEntry.Quantity := CustomSourceLine.Quantity;
TempMatchEntry."Direct Unit Cost" := CustomSourceLine."Unit Price";
TempMatchEntry."Line Amount" := CustomSourceLine.Amount;
TempMatchEntry.Insert();
end;
Die Matching-Logik im Detail
Der eigentliche Abgleich der Belegzeilen erfolgt nach definierten Geschäftsregeln:
local procedure TryMatchDocumentLines(
var TempMatchEntry: Record "DXP SQZ Order Match Entry" temporary;
DocHeader: Record "DXP SQZ Document Header")
var
DocLine: Record "DXP SQZ Document Line";
MatchSetup: Record "Custom Match Setup";
HasCustomSetup: Boolean;
begin
// Get configuration
MatchSetup.Get();
// Process each potential match entry
if TempMatchEntry.FindSet() then
repeat
DocLine.Reset();
DocLine.SetRange("Document No.", DocHeader."No.");
DocLine.SetRange("Buy-from Vendor No.", TempMatchEntry."Buy-from Vendor No.");
DocLine.SetFilter("Allocated Document Line No.", '%1', 0); // Only unallocated lines
// Try matching strategies in order of precision
if TryExactMatch(DocLine, TempMatchEntry) then
CheckTolerancesAndAllocate(TempMatchEntry, DocLine, MatchSetup)
else
if TryItemReferenceMatch(DocLine, TempMatchEntry) then
CheckTolerancesAndAllocate(TempMatchEntry, DocLine, MatchSetup)
else
if TryDescriptionMatch(DocLine, TempMatchEntry) then
CheckTolerancesAndAllocate(TempMatchEntry, DocLine, MatchSetup)
else
if TryBasicValuesMatch(DocLine, TempMatchEntry) then
CheckTolerancesAndAllocate(TempMatchEntry, DocLine, MatchSetup);
until TempMatchEntry.Next() = 0;
end;
local procedure TryExactMatch(
var DocLine: Record "DXP SQZ Document Line";
TempMatchEntry: Record "DXP SQZ Order Match Entry" temporary): Boolean
begin
DocLine.SetRange(Type, TempMatchEntry.Type);
DocLine.SetFilter("No.", '%1|%2', TempMatchEntry."No.", TempMatchEntry."Item Reference No.");
DocLine.SetRange("SQZ Quantity", TempMatchEntry.Quantity);
exit(not DocLine.IsEmpty());
end;
local procedure TryItemReferenceMatch(
var DocLine: Record "DXP SQZ Document Line";
TempMatchEntry: Record "DXP SQZ Order Match Entry" temporary): Boolean
begin
DocLine.SetRange(Type); // Clear previous filters
DocLine.SetRange("Item Reference No.", TempMatchEntry."Item Reference No.");
exit(not DocLine.IsEmpty());
end;
local procedure TryDescriptionMatch(
var DocLine: Record "DXP SQZ Document Line";
TempMatchEntry: Record "DXP SQZ Order Match Entry" temporary): Boolean
begin
DocLine.SetRange("Item Reference No."); // Clear previous filter
DocLine.SetFilter("SQZ Description", '@*' + TempMatchEntry.Description + '*');
exit(not DocLine.IsEmpty());
end;
local procedure TryBasicValuesMatch(
var DocLine: Record "DXP SQZ Document Line";
TempMatchEntry: Record "DXP SQZ Order Match Entry" temporary): Boolean
begin
DocLine.SetRange("SQZ Description"); // Clear previous filter
DocLine.SetRange("SQZ Quantity", TempMatchEntry.Quantity);
DocLine.SetRange("SQZ Unit Price", TempMatchEntry."Direct Unit Cost");
exit(not DocLine.IsEmpty());
end;
local procedure CheckTolerancesAndAllocate(
TempMatchEntry: Record "DXP SQZ Order Match Entry" temporary;
var DocLine: Record "DXP SQZ Document Line";
MatchSetup: Record "Custom Match Setup")
begin
DocLine.FindFirst(); // We know there is at least one line
if IsMatchWithinTolerances(DocLine, TempMatchEntry, MatchSetup) then
AssignMatchData(DocLine, TempMatchEntry);
end;
local procedure IsMatchWithinTolerances(
DocLine: Record "DXP SQZ Document Line";
TempMatchEntry: Record "DXP SQZ Order Match Entry" temporary;
MatchSetup: Record "Custom Match Setup"): Boolean
var
QtyTolerance: Decimal;
AmountTolerance: Decimal;
begin
QtyTolerance := MatchSetup."Quantity Tolerance";
AmountTolerance := MatchSetup."Amount Tolerance";
if Abs(DocLine."SQZ Quantity" - TempMatchEntry.Quantity) > QtyTolerance then
exit(false);
if Abs(DocLine."SQZ Unit Price" - TempMatchEntry."Direct Unit Cost") > AmountTolerance then
exit(false);
exit(true);
end;
local procedure AssignMatchData(
var DocLine: Record "DXP SQZ Document Line";
TempMatchEntry: Record "DXP SQZ Order Match Entry" temporary)
begin
// Assign the matched data to the document line
DocLine.Validate("Allocated Document Type", "DXP Order Match Document Type"::Custom);
DocLine.Validate("Allocated Document No.", TempMatchEntry."Document No.");
DocLine.Validate("Allocated Document Line No.", TempMatchEntry."Document Line No.");
DocLine.Validate("Allocated Quantity", TempMatchEntry.Quantity);
DocLine.Validate("Allocated Unit Price", TempMatchEntry."Direct Unit Cost");
DocLine.Validate("Allocated Line Amount", TempMatchEntry."Line Amount");
DocLine.Validate("Allocated Line Discount %", TempMatchEntry."Line Discount %");
DocLine.Modify(true);
end;
Bei Fragen zur Implementierung stehen wir Ihnen gerne zur Verfügung.