RAP - Suche
In diesem Artikel beschäftigen wir uns mit der generischen Suche auf RAP Objekten und wie wir damit auch Fehleingaben interpretieren können.
Inhaltsverzeichnis
Bisher haben wir in der RAP-Serie vor allem Suchhilfen behandelt, die direkt an Felder geknüpft sind und es erlauben Werthilfen dafür zu erzeugen. Doch hier muss der User wissen, in welchem Feld er eigentlich nach Informationen suchen muss, und sollte die Abgrenzung einigermaßen kennen.
Einleitung
In RAP Objekten können wir aber auch die generische Suche aktivieren. Hierbei handelt es sich um ein Suchfeld, welches 1-n Spalten nach der eingegebenen Information durchsuchen kann. Mit diesem Suchfeld stehen verschiedene Möglichkeiten zur Verfügung, wie wir effizient Suchen gestalten können:
Aktivieren
Aktiviert kann die generische Suche mit Hilfe einer Kopf-Annotation im entsprechenden Consumption View des RAP Objekts, damit steht die Funktion in der UI zur Verfügung. Dafür muss irgendwo über der Definition die folgende Annotation eingefügt werden:
@Search.searchable: true
Die Annotation kann aber nicht allein im CDS View stehen, der Compiler wird eine entsprechende Fehlermeldung ausgeben, dass mindestens ein Element als durchsuchbar gekennzeichnet werden muss. In diesem Fall kennzeichnen wir die Rechnungsnummer und den Partner als durchsuchbar. Dazu ergänzen wir an den Feldern die entsprechenden Annotationen:
@Search.defaultSearchElement: true
key Document,
...
@Search.defaultSearchElement: true
Partner,
Die entsprechende Suche ist nun definiert und wir können sie einmal in der Anwendung probieren. Im ersten Fall geben wir einmal eine Belegnummer ein und erhalten das folgende Ergebnis:
Im zweiten Testfall geben wir einmal eine Partnernummer ein und erhalten alle Belege mit der entsprechenden Partnernummer, in diesem Fall 35 Stück:
Fuzziness
Was in der aktuellen Version der Suche nicht funktioniert, ist die Suche nach Pattern oder Fehleingaben. Nicht immer sind die Informationen, genau wie gesucht, in der Spalte vorhanden. Manchmal weichen sie um kleine Nuancen ab und werden damit nicht im Suchergebnis angezeigt. Dafür gibt es die Fuzziness in der Suche, diese bestimmt, wieviel Fehlertoleranz bei der Suche angewandt wird. Definieren wir einmal die Rate an den beiden Feldern:
@Search.defaultSearchElement: true
@Search.fuzzinessThreshold: 1.0
key Document,
...
@Search.defaultSearchElement: true
@Search.fuzzinessThreshold: 0.9
Partner,
Der "Threshold" bestimmt, wie ungenau die Werte in der Spalte sein können. Bei 1.0 muss der Wert zu 100% übereinstimmen, umso niedriger die Rate, desto breiter wird gesucht und desto mehr Treffer kommen auf die Suche zurück. Das zweite Feld stellen wir auf 0.9, damit können wir eine grobe Suche über den Partner starten. Geben wir nun den Wert "1234" ein, dann erhalten wir einen Treffer:
Wenn wir allerdings den Wert "12347" suchen, erhalten wir keinen Treffer. Hier wurde absichtlich in die Zeichenfolge ein Fehler eingebaut. Stellen wir nun einmal den Threshold auf 0.8 und versuchen die Suche erneut:
Die Fuzziness ist nun ungenauer und wir erhalten auch Treffer, die eigentlich nur so ähnlich sind, wie was wir gesucht haben. So können auch Rechnungen gefunden werden, die vielleicht einen Fehler bei der Erfassung erhalten haben und nicht mehr über die gesuchten Informationen verfügen.
Consumption View
Allein mit der Anpassung der Annotationen im Consumption View konnten wir eine generische Suche implementieren, die auch noch Abweichungen finden kann. Den gesamten Core Data Service findest du hier mit den entsprechenden neuen Annotationen:
@EndUserText.label: 'Consumption for ZBS_R_RAPCINVOICE'
@AccessControl.authorizationCheck: #NOT_REQUIRED
@Metadata.allowExtensions: true
@Search.searchable: true
define root view entity ZBS_C_RAPCInvoice
provider contract transactional_query
as projection on ZBS_R_RAPCInvoice as Invoice
{
@Search.defaultSearchElement: true
@Search.fuzzinessThreshold: 1.0
key Document,
DocDate,
DocTime,
@Search.defaultSearchElement: true
@Search.fuzzinessThreshold: 0.8
Partner,
@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZCL_BS_DEMO_CRAP_VE_EXIT'
virtual NumberOfPositions : abap.int4,
_Position : redirected to composition child ZBS_C_RAPCPosition
}
Fazit
Die Implementierung einer generischen Suche in Fiori Elements ist sehr leicht und benötigt nur wenige Annotationen und keine großartige Entwicklung. Die Umsetzung sollte damit für dich kein Problem sein und so benötigst du nicht für jedes Feld eine eigene Suche.