CodeDataProvider
Der CodeDataProvider liefert die Daten eines Object bzw. einer ObjectCollection über ein JavaScript-Snippet, anstatt sie aus einer externen Quelle (CSV, Excel, SQL, HTTP) zu laden. Er eignet sich, um Einträge berechnet, aus den eingegebenen Suchparametern oder aus dem Connect-Datenkontext bereitzustellen.
Der CodeDataProvider nutzt denselben Mechanismus wie die übrigen DataProvider und steht sowohl im primedocs Desktop Client als auch in primedocs Web zur Verfügung.
Konfiguration
<ObjectCollection Id="Positions" Label="Positionen">
<Schema>
<Text Id="Article" Label="Artikel" />
<Text Id="Amount" Label="Betrag" />
</Schema>
<DataProviders>
<CodeDataProvider DisplayName="Aus Connect-Daten">
<SearchParameters>
<Text Id="Category" Label="Kategorie" field-Value="Data.Category" />
</SearchParameters>
<Code>
var category = $("Category");
[
{ Article: "Beispiel " + category, Amount: "100.00" }
]
</Code>
</CodeDataProvider>
</DataProviders>
</ObjectCollection>
Im Gegensatz zu den dateibasierten oder HTTP-Providern benötigt der CodeDataProvider kein Mapping: Die Eigenschaften der vom Snippet zurückgegebenen Objekte werden direkt anhand ihres Namens den Schema-Feldern zugeordnet. Verschachtelte Objekte werden mit Punktnotation abgeflacht (z.B. Address.City).
Attribute
| Attribut | Beschreibung |
|---|---|
DisplayName / translate-DisplayName (optional) | Anzeigename des Providers in der Oberfläche. |
ReadOnly (optional) | Wenn true: Die über diesen Provider geladenen Felder sind schreibgeschützt. |
AutoAddAllEntries (optional) | Wenn true: Alle vom Snippet gelieferten Einträge werden automatisch zur Sammlung hinzugefügt. |
Elemente
| Element | Beschreibung |
|---|---|
Code (erforderlich) | JavaScript-Ausdruck, dessen Wert die Einträge liefert: ein Array von Objekten (bei ObjectCollection) bzw. ein einzelnes Objekt (bei Object). Jedes Objekt entspricht einem Eintrag; seine Eigenschaften werden zu Feldern. Der Ausdruck darf mehrzeilig sein (vorangestellte var-Deklarationen usw.), massgebend ist der Wert des letzten Ausdrucks. Kein main()- oder return-Rahmen nötig. |
SearchParameters (optional) | Suchmaske mit Text, Date, YesNo, Choice (wie in Forms). Mit field-Value (Wert aus dem Connect-Datenkontext) bzw. parent-Value (Feld des übergeordneten Objekts) lassen sich Parameter vorbelegen. |
JavaScript-API
Innerhalb des Code-Snippets steht das $-Objekt zur Verfügung:
| Aufruf | Beschreibung |
|---|---|
$.parameter("Id") bzw. $("Id") | Wert eines konfigurierten Suchparameters. |
$("Data.Key") | Wert aus dem Connect-Datenkontext. |
$.parent("FeldId") | Wert eines Feldes des übergeordneten Objekts (in verschachtelten Object-/ObjectCollection-Strukturen). |
Der CodeDataProvider nimmt nicht am Loading-Pfad der ProviderPipeline teil, da er keinen flachen Such-Schritt besitzt, der beim Laden neu zugeordnet werden könnte.
Beispiel: Suche in mitgelieferten Connect-Daten
Dieses Beispiel durchsucht Daten, die mit dem Connect-Aufruf mitgeliefert werden, und stellt sie als gefilterte Auswahlliste bereit. Die Datenquelle bleibt massgebend: ReadOnly="true" setzt die übernommenen Felder schreibgeschützt und DisableManualCreate="true" verhindert das manuelle Anlegen eigener Einträge.
<FormsConfiguration>
<Elements>
<ObjectCollection Id="SelectedLocations" Label="Standorte">
<Schema>
<Text Id="Company" Label="Firma" />
<Text Id="Street" Label="Strasse" />
<Text Id="PostalCode" Label="PLZ" />
<Text Id="City" Label="Ort" />
<Text Id="Country" Label="Land" />
</Schema>
<DataProviders DisableManualCreate="true">
<CodeDataProvider DisplayName="Standort suchen" ReadOnly="true" AutoAddAllEntries="false">
<SearchParameters>
<Text Id="query" Label="Firma, Ort oder PLZ" />
<Text Id="country" Label="Ländercode" field-Value="Data.DefaultCountry" />
</SearchParameters>
<Code><![CDATA[
$('Data.Locations')
.filter(function (location) {
var query = $('query').toLowerCase();
var country = $('country').toUpperCase();
var text = (
location.Company + ' ' +
location.PostalCode + ' ' +
location.City
).toLowerCase();
return (query === '' || text.indexOf(query) >= 0)
&& (country === '' || location.Country === country);
})
]]></Code>
</CodeDataProvider>
</DataProviders>
</ObjectCollection>
</Elements>
</FormsConfiguration>
Der Code-Ausdruck steht in einem <![CDATA[ … ]]>-Block, damit Zeichen wie <, > und & (z.B. in >= oder &&) nicht als XML interpretiert werden.
Der Suchparameter country wird über field-Value="Data.DefaultCountry" aus dem Connect-Datenkontext vorbelegt. Über $('Data.Locations') liest das Snippet die mitgelieferte Objektsammlung, filtert sie anhand der eingegebenen Suchparameter ($('query'), $('country')) und gibt die gefilterten Objekte direkt zurück. Deren Eigenschaften (Company, Street usw.) werden anhand ihres Namens den Schema-Feldern zugeordnet — ein manuelles Ummappen ist nicht nötig.
Ein passender Connect-Aufruf, der DefaultCountry und die Sammlung Locations mitliefert:
<primedocsConnect>
<Data>
<Value Key="DefaultCountry">CH</Value>
<ObjectCollection Key="Locations">
<Item>
<Value Key="Company">PrimeSoft AG</Value>
<Value Key="Street">Bahnhofstrasse 4</Value>
<Value Key="PostalCode">8630</Value>
<Value Key="City">Baar</Value>
<Value Key="Country">CH</Value>
</Item>
<Item>
<Value Key="Company">Alpine Legal AG</Value>
<Value Key="Street">Bundesplatz 1</Value>
<Value Key="PostalCode">3011</Value>
<Value Key="City">Bern</Value>
<Value Key="Country">CH</Value>
</Item>
<Item>
<Value Key="Company">Acme Deutschland GmbH</Value>
<Value Key="Street">Leopoldstrasse 10</Value>
<Value Key="PostalCode">80802</Value>
<Value Key="City">München</Value>
<Value Key="Country">DE</Value>
</Item>
</ObjectCollection>
</Data>
</primedocsConnect>
Eine Suche nach Prime liefert damit genau einen Treffer:

Suche nach «Prime» in den mitgelieferten Connect-Standortdaten — ein Treffer, schreibgeschützt übernommen.