Formatierte Suche in SAP Business One (FMS): Syntax $[$38.1.0], 7 Praxisbeispiele und automatische Aktualisierung
Von Zain Abbas, Kodenova · Aktualisiert am
Was eine formatierte Suche ist
Eine formatierte Suche, meist FMS (Formatted Search) genannt, ist eine gespeicherte Abfrage, die mit einem Feld in einem Formular verknüpft ist. Wenn sie läuft, schreibt SAP Business One das Ergebnis entweder direkt in das Feld oder zeigt eine Liste an, aus der der Benutzer auswählt.
Anwender schätzen formatierte Suchen, weil sie Tipparbeit sparen. Entwickler mögen sie, weil kein Add-on nötig ist. Sie können ein benutzerdefiniertes Feld (UDF) in der Position mit dem Fremdnamen des Artikels füllen, den Bestand im Positionslager anzeigen oder eine Auswahlliste aus einer benutzerdefinierten Tabelle anbieten.
Wenn Sie sich die Syntaxarbeit sparen möchten, schreibt unser Builder für formatierte Suchen die Abfrage für Sie.
Die Syntax
Es gibt zwei Wege, Werte aus dem geöffneten Formular zu lesen.
| Form | Beispiel | Wann verwenden |
|---|---|---|
$[$Item.Column.Type] | $[$38.1.0] | Liest das Feld über seine Position im Formular. Funktioniert über ähnliche Belege hinweg. |
$[TABLE.Field] | $[OINV.CardCode] | Liest über Tabellen- und Feldnamen. Funktioniert nur in Formularen, die auf dieser Tabelle basieren. |
In der ersten Form gilt:
- Item ist der Index des Formularelements. In Verkaufs- und Einkaufsbelegen ist
38die Positionsmatrix und4die Kunden- bzw. Lieferantennummer. - Column ist die Spalte der Matrix. Für Kopffelder verwenden Sie
0. - Type bestimmt, wie der Wert zurückkommt:
0gibt den Wert unverändert zurück. Verwenden Sie ihn für Codes, Text und Belegnummern.NUMBERgibt eine Zahl ohne Währung oder Einheit zurück. Verwenden Sie ihn für Berechnungen.CURRENCYgibt nur das Währungssymbol oder die Mengeneinheit zurück.DATEgibt ein Datum zurück, zu dem Sie Tage addieren können.
Der offizielle Leitfaden von SAP empfiehlt die Index-Form, weil $[$4.0.0] in jedem Marketingbeleg funktioniert, $[OINV.CardCode] dagegen nur in Ausgangsrechnungen.
Bei benutzerdefinierten Feldern steht der Feldname als Spalte: $[$38.U_Discount.NUMBER].
Sie möchten Item- und Spalten-IDs nicht von Hand nachschlagen? Der Builder für formatierte Suchen schreibt die Variable für das ausgewählte Feld.
Kurzreferenz
| Variable | Was sie zurückgibt |
|---|---|
$[$38.1.0] | Artikelnummer der aktuellen Zeile: Item 38 ist die Positionsmatrix, Spalte 1 die Artikelnummer, und 0 bedeutet, dass das Feld einen einzelnen Wert enthält. |
$[$38.17.NUMBER] | Die Zahl eines Preis- oder Summenfelds ohne Währungssymbol, bereit für Berechnungen. |
$[$38.17.CURRENCY] | Nur das Währungssymbol (oder die Mengeneinheit) dieses Feldes. |
$[$10.0.DATE] | Ein Datum aus dem Belegkopf, mit dem Sie rechnen können, zum Beispiel $[$10.0.DATE] + 20. Kopffelder verwenden Spalte 0. |
$[$4.0.0] | Die Kunden- oder Lieferantennummer in jedem Verkaufs- oder Einkaufsbeleg. |
$[ORDR.CardCode], $[RDR1.ItemCode] | Tabellen- und Feldname. Funktioniert nur im Fenster, das auf dieser Tabelle basiert (hier der Kundenauftrag). |
$[$38.U_Discount.NUMBER] | Ein benutzerdefiniertes Feld in der Position: Schreiben Sie immer das Präfix U_, sonst liefert SAP B1 den Fehler -1003. |
Item- und Spaltennummern können sich je nach Version und Formular unterscheiden. Prüfen Sie sie über Ansicht → Systeminformationen, bevor Sie sich auf eine Nummer verlassen.
So finden Sie Item- und Spalten-IDs
- Aktivieren Sie in SAP Business One Ansicht > Systeminformationen.
- Öffnen Sie das Formular und fahren Sie mit der Maus über das Feld.
- Lesen Sie die Statusleiste am unteren Rand. Sie zeigt Item, Spalte und bei Datenbankfeldern auch Tabellen- und Feldnamen.
Prüfen Sie jede ID in Ihrer eigenen Version und Ihrem eigenen Formular. Spaltennummern können zwischen Belegarten und Lokalisierungen abweichen. Bei Tabellen- und Feldnamen hilft unsere SAP-B1-Tabellenreferenz.
So hinterlegen Sie eine formatierte Suche
- Speichern Sie Ihre Abfrage im Abfrage-Manager, am besten in einer Kategorie namens „FMS“.
- Öffnen Sie das Zielformular und klicken Sie in das Feld.
- Drücken Sie Alt+Umschalt+F2. Das Fenster für die formatierte Suche öffnet sich.
- Wählen Sie In vorhandenen benutzerdefinierten Werten gemäß gespeicherter Abfrage suchen (englisch: Search in Existing User-Defined Values according to Saved Query) und wählen Sie Ihre Abfrage aus.
- Legen Sie fest, wann sie läuft:
- Ohne automatische Aktualisierung: Der Benutzer drückt Umschalt+F2 oder klickt auf die Lupe.
- Automatisch aktualisieren bei Feldänderung (Auto Refresh When Field Changes): Wählen Sie das auslösende Feld, zum Beispiel die Artikelnummer. Die Abfrage läuft, sobald der Benutzer dieses Feld verlässt.
- Gespeicherte Werte anzeigen (Display Saved Values): behält den im Beleg gespeicherten Wert, statt die Abfrage bei jedem Öffnen des Belegs erneut auszuführen.
- Klicken Sie auf Aktualisieren und testen Sie mit einem neuen Beleg.
Der Leitfaden von SAP nennt außerdem die Option „Regelmäßig aktualisieren“ (Refresh Regularly). Er rät, sie sparsam einzusetzen, weil sie Formulare verlangsamen und gespeicherte Belege beim Durchblättern verändern kann.
7 Praxisbeispiele
Alle Beispiele verwenden SQL-Server-Syntax. Die Hinweise zu HANA folgen danach.
1. Artikelfeld in einer Position. Fremdname des Positionsartikels in ein UDF der Position schreiben (Tabelle OITM).
SELECT T0.FrgnName
FROM OITM T0
WHERE T0.ItemCode = $[$38.1.0]
2. Geschäftspartnerfeld im Belegkopf. Verfügbarer Kreditrahmen des ausgewählten Kunden (Tabelle OCRD).
SELECT T0.CreditLine - T0.Balance
FROM OCRD T0
WHERE T0.CardCode = $[$4.0.0]
3. Bestand im Positionslager. Spalte 24 ist in vielen Belegformularen das Lager. Prüfen Sie das mit den Systeminformationen. Der Bestand pro Lager steht in OITW.
SELECT T0.OnHand
FROM OITW T0
WHERE T0.ItemCode = $[$38.1.0]
AND T0.WhsCode = $[$38.24.0]
4. Letzter Verkaufspreis an diesen Kunden. Nützlich als Kontrolle neben der Preisspalte (Ausgangsrechnungen in OINV).
SELECT TOP 1 T1.Price
FROM OINV T0
INNER JOIN INV1 T1 ON T0.DocEntry = T1.DocEntry
WHERE T0.CardCode = $[$4.0.0]
AND T1.ItemCode = $[$38.1.0]
AND T0.CANCELED = 'N'
ORDER BY T0.DocDate DESC, T0.DocEntry DESC
5. Positionsgewicht. Verkaufsgewicht pro Einheit mal Positionsmenge (Spalte 11).
SELECT T0.SWeight1 * $[$38.11.NUMBER]
FROM OITM T0
WHERE T0.ItemCode = $[$38.1.0]
6. Auswahlliste aus einer benutzerdefinierten Tabelle. Gibt die Abfrage zwei Spalten zurück, erhält der Benutzer eine Liste zur Auswahl.
SELECT T0.Code, T0.Name
FROM [@REGIONS] T0
ORDER BY T0.Name
7. Heutiges Datum. Füllt ein Datums-UDF, wenn der Beleg angelegt wird.
SELECT GETDATE()
Unterschiede bei HANA
In SAP Business One für HANA bleibt die Logik gleich, aber das SQL ändert sich:
- Setzen Sie Tabellen- und Spaltennamen in doppelte Anführungszeichen:
T0."ItemCode","@REGIONS". - Auch UDF-Namen innerhalb der Variable brauchen Anführungszeichen:
$[$38."U_Discount".NUMBER]. - Ein
SELECTohne Tabelle brauchtFROM DUMMY. - Ersetzen Sie SQL-Server-Funktionen: Aus
GETDATE()wirdCURRENT_DATE, ausISNULLwirdIFNULL.
Beispiel 7 in HANA:
SELECT CURRENT_DATE FROM DUMMY
Beispiel 1 in HANA:
SELECT T0."FrgnName"
FROM OITM T0
WHERE T0."ItemCode" = $[$38.1.0]
Wenn Sie viele Abfragen umstellen, fügen Sie sie in unseren SQL-zu-HANA-Konverter ein und testen Sie anschließend jede einzelne.
Häufige Fehler bei formatierten Suchen und ihre Lösung
| Symptom | Übliche Ursache | Lösung |
|---|---|---|
| Internal error (-1003) occurred, sobald die Suche läuft | Das SQL ist fehlgeschlagen, als SAP Business One es ausgeführt hat: ein Syntaxfehler, eine fehlende Klammer oder ein Feldbezug, der sich nicht auflösen lässt | Führen Sie die Abfrage im Abfrage-Manager aus oder lassen Sie das übersetzte SQL im SQL Server Management Studio laufen und beheben Sie den gemeldeten Fehler. Prüfen Sie dann jeden $[...]-Bezug über Ansicht > Systeminformationen. |
| Die Abfrage funktioniert auf SQL Server, scheitert aber auf HANA | Spaltennamen in gemischter Groß-/Kleinschreibung ohne Anführungszeichen oder ein SELECT ohne Tabelle | Setzen Sie Tabellen- und Spaltennamen in doppelte Anführungszeichen und ergänzen Sie FROM DUMMY. Siehe Unterschiede bei HANA. |
| Ein benutzerdefiniertes Feld wird nicht gefunden | Das Feld wurde ohne sein Präfix U_ geschrieben | Schreiben Sie immer den vollständigen Namen, zum Beispiel $[$38.U_Discount.NUMBER]. |
| Der Wert ändert sich nicht, wenn sich das auslösende Feld ändert | Automatisch aktualisieren bei Feldänderung ist deaktiviert oder zeigt auf das falsche Feld | Aktivieren Sie die automatische Aktualisierung und wählen Sie das Feld, das die Abfrage auslösen soll. Ohne diese Einstellung läuft die Abfrage nur über Umschalt+F2. |
| Der Wert wird beim erneuten Öffnen eines alten Belegs neu berechnet oder aktualisiert sich nie | Die falsche Aktualisierungsoption ist gewählt | Gespeicherte Werte anzeigen zeigt, was mit dem Beleg gespeichert wurde. Regelmäßig aktualisieren führt die Abfrage bei jedem Aufruf des Belegs erneut aus, und SAP warnt, dass dies Belege verlangsamen und Werte ändern kann, die Sie gar nicht ändern wollten. |
Die automatische Aktualisierung hat außerdem keine Wirkung auf Felder, die nicht mehr geändert werden können, etwa die Artikelnummer in einer bereits angelegten Lieferung.
Tipps zur Performance
- Suchen auf Positionsebene vervielfachen sich. Eine Suche, die sich bei der Artikelnummer automatisch aktualisiert, läuft einmal pro Zeile. Bei einem Auftrag mit 200 Zeilen sind das 200 Abfragen. Kommen drei solcher Suchen zusammen, spüren das die Anwender.
- Filtern Sie nach Schlüsseln. Fragen Sie über
ItemCode,CardCodeoderDocEntryab. Vermeiden SieLIKE '%x%'und Funktionen auf Spalten in derWHERE-Klausel. - Vermeiden Sie schwere Joins auf Belegtabellen. Beispiel 4 durchsucht die Rechnungshistorie. Bei einigen hunderttausend Zeilen ist das in Ordnung, bei Millionen wird es langsam. Ziehen Sie einen Index oder eine Summentabelle in Betracht.
- Bevorzugen Sie den Abruf bei seltenem Bedarf. Brauchen Anwender einen Wert nur ab und zu, lassen Sie die automatische Aktualisierung aus und überlassen Sie ihnen Umschalt+F2.
- Verwenden Sie „Gespeicherte Werte anzeigen“ für alles, was sich nach dem Speichern des Belegs nicht mehr ändern soll.
Wann Sie etwas anderes verwenden sollten
Eine formatierte Suche füllt Felder. Regeln setzt sie nicht durch. Ein Benutzer kann den Wert überschreiben, und Importe über die DI API oder den Service Layer führen sie nicht aus.
- Verwenden Sie die Stored Procedure für die Transaktionsbenachrichtigung (
SBO_SP_TransactionNotification), wenn eine Regel immer gelten muss, zum Beispiel „keine Rechnung ohne Kostenstelle“ oder „Preis darf nicht unter dem Einstandspreis liegen“. Sie blockiert das Speichern, ganz gleich, woher der Beleg kommt. - Verwenden Sie ein Add-on, wenn Sie neue Masken, Schaltflächen, Aufrufe externer APIs oder Logik benötigen, die von vielen Feldern gleichzeitig abhängt.
- Behalten Sie FMS für Vorschlagswerte, Nachschlagefunktionen und Auswahllisten, die dem Benutzer Tipparbeit ersparen.
Formatierte Suchen füllen Felder, während Ihre Mitarbeiter tippen. Wie Sie dieselben Daten auswerten, lesen Sie in unserem Beitrag zum SAP-Business-One-Dashboard ohne Power BI.
Bereit für Ihre eigene Suche? Öffnen Sie den Builder für formatierte Suchen, wählen Sie Formular und Feld und kopieren Sie die Abfrage. Wenn Ihre Belege langsam sind oder Sie Regeln brauchen, die FMS nicht durchsetzen kann, kontaktieren Sie uns – wir sehen uns Ihre Einrichtung an.
Quellen
- SAP: How to Define and Use Formatted Search (SAP Business One how-to guide, PDF)
- SAP: How to Define and Use Formatted Searches (hosted by Vision33)
- SAP Community: Formatted search to calculate discount on SAP B1 HANA
- SAP Community archive: formatted search field references and System Information
- SAP Community: Internal error (-1003) occurred [Message 131-183] when executing a formatted search
- Packt: Working with User-Defined Values in SAP Business One
Passende Leistungen
Häufige Fragen
Was bedeutet $[$38.1.0] in SAP Business One?
Der Ausdruck liest einen Wert aus dem geöffneten Formular. 38 ist der Item-Index der Positionsmatrix des Belegs, 1 ist die Spalte (Artikelnummer) und 0 ist der Typ, der den reinen Wert zurückgibt. $[$38.1.0] ist also die Artikelnummer in der aktuellen Zeile.
Was ist der Unterschied zwischen 0, NUMBER und DATE in einer formatierten Suche?
0 gibt den Feldwert unverändert zurück, das passt für Codes und Text. NUMBER liefert einen Zahlenwert ohne Währung oder Einheit, mit dem Sie rechnen können. DATE liefert ein Datum, das Sie für Datumsberechnungen verwenden können.
Wie finde ich die Item- und Spaltennummer eines Feldes?
Aktivieren Sie Ansicht > Systeminformationen und fahren Sie dann mit der Maus über das Feld. Die Statusleiste zeigt die Item-Nummer, die Spalte und bei Datenbankfeldern auch Tabellen- und Feldnamen.
Funktionieren formatierte Suchen in SAP Business One für HANA?
Ja, aber das SQL muss den HANA-Regeln folgen. Setzen Sie Tabellen- und Spaltennamen in doppelte Anführungszeichen, verwenden Sie FROM DUMMY, wenn Sie einen Wert ohne Tabelle abfragen, und ersetzen Sie SQL-Server-Funktionen wie GETDATE() durch HANA-Funktionen wie CURRENT_DATE.
Warum meldet meine formatierte Suche Internal error (-1003)?
In der Praxis bedeutet das, dass das SQL fehlgeschlagen ist, als SAP Business One es ausgeführt hat: ein Syntaxfehler, ein falscher Feldbezug oder ein benutzerdefiniertes Feld ohne U_. Führen Sie dieselbe Abfrage im Abfrage-Manager aus oder lassen Sie das übersetzte SQL im SQL Server Management Studio laufen, lesen Sie den tatsächlichen Fehler und beheben Sie ihn dort. Prüfen Sie anschließend jeden $[...]-Bezug über Ansicht > Systeminformationen.
Warum sind meine Belege langsam, seit ich formatierte Suchen hinzugefügt habe?
Jede formatierte Suche führt eine Abfrage aus. Eine Suche, die sich in jeder Zeile automatisch aktualisiert oder regelmäßig aktualisiert wird, läuft pro Beleg viele Male. Halten Sie Suchen auf Positionsebene gering an der Zahl, indexfreundlich und wo möglich auf Abruf.
Bereit für den Start?
Sagen Sie uns, was Sie brauchen. Sie erhalten eine klare technische Antwort, einen festen Leistungsumfang und einen Preis, in der Regel innerhalb von 24 Stunden.
