Formatierte Suche in SAP Business One (FMS): Syntax $[$38.1.0], 7 Praxisbeispiele und automatische Aktualisierung

Von Zain Abbas, Kodenova · Aktualisiert am

Kurz gesagtEine formatierte Suche (FMS) ist eine gespeicherte Abfrage, die in SAP Business One an ein Feld gebunden ist und dieses Feld füllt oder eine Auswahlliste anzeigt. In der Abfrage lesen Sie Werte aus dem geöffneten Formular mit $[$Item.Column.Type], zum Beispiel $[$38.1.0] für die Artikelnummer in einer Belegposition. Sie hinterlegen sie mit Alt+Umschalt+F2 und legen fest, ob sie auf Abruf läuft, wenn sich ein anderes Feld ändert, oder jedes Mal.

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.

FormBeispielWann 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 38 die Positionsmatrix und 4 die Kunden- bzw. Lieferantennummer.
  • Column ist die Spalte der Matrix. Für Kopffelder verwenden Sie 0.
  • Type bestimmt, wie der Wert zurückkommt:
    • 0 gibt den Wert unverändert zurück. Verwenden Sie ihn für Codes, Text und Belegnummern.
    • NUMBER gibt eine Zahl ohne Währung oder Einheit zurück. Verwenden Sie ihn für Berechnungen.
    • CURRENCY gibt nur das Währungssymbol oder die Mengeneinheit zurück.
    • DATE gibt 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

VariableWas 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

  1. Aktivieren Sie in SAP Business One Ansicht > Systeminformationen.
  2. Öffnen Sie das Formular und fahren Sie mit der Maus über das Feld.
  3. 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

  1. Speichern Sie Ihre Abfrage im Abfrage-Manager, am besten in einer Kategorie namens „FMS“.
  2. Öffnen Sie das Zielformular und klicken Sie in das Feld.
  3. Drücken Sie Alt+Umschalt+F2. Das Fenster für die formatierte Suche öffnet sich.
  4. 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.
  5. 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.
  6. 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 SELECT ohne Tabelle braucht FROM DUMMY.
  • Ersetzen Sie SQL-Server-Funktionen: Aus GETDATE() wird CURRENT_DATE, aus ISNULL wird IFNULL.

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 UrsacheLösung
Internal error (-1003) occurred, sobald die Suche läuftDas 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ässtFü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 HANASpaltennamen in gemischter Groß-/Kleinschreibung ohne Anführungszeichen oder ein SELECT ohne TabelleSetzen Sie Tabellen- und Spaltennamen in doppelte Anführungszeichen und ergänzen Sie FROM DUMMY. Siehe Unterschiede bei HANA.
Ein benutzerdefiniertes Feld wird nicht gefundenDas Feld wurde ohne sein Präfix U_ geschriebenSchreiben Sie immer den vollständigen Namen, zum Beispiel $[$38.U_Discount.NUMBER].
Der Wert ändert sich nicht, wenn sich das auslösende Feld ändertAutomatisch aktualisieren bei Feldänderung ist deaktiviert oder zeigt auf das falsche FeldAktivieren 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 nieDie falsche Aktualisierungsoption ist gewähltGespeicherte 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, CardCode oder DocEntry ab. Vermeiden Sie LIKE '%x%' und Funktionen auf Spalten in der WHERE-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

Passende Leistungen

FAQ

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.