Question

J'utilise un service Web OData avec BCS (test avec Northwind) et j'aimerais définir des filtres lors de l'utilisation du sélecteur de données externes.J'aimerais pouvoir avoir une liste déroulante qui effectue ensuite la recherche en fonction d'un filtre OData, comme filter=substringof("Value",Field_Name).

Le filtre fonctionne lorsque je crée une VUE sur une application LISTE EXTERNE .Cependant, lorsque vous essayez de l'utiliser dans le sélecteur de COLONNE DE DONNÉES EXTERNES , les options de filtre s'affichent dans la liste déroulante, mais ne renvoient aucun résultat.Au lieu de cela, j'obtiens toujours ce message d'erreur :

enter image description here

Les mêmes résultats de la VUE de la liste externe

enter image description here

Le code que j'utilise pour ajouter à ma méthode "ReadAllCustomers" comprend : (1) Le descripteur de filtre

                <!-- ********* this is NOT working *********** -->              
            <FilterDescriptor Name="CustomerIDFilter" FilterField="CustomerID" Type="Wildcard">
              <Properties>
                <Property Name="UsedForDisambiguation" Type="System.Boolean">true</Property>
                <Property Name="IsDefault" Type="System.Boolean">true</Property>
                <Property Name="CaseSensitive" Type="System.Boolean">false</Property>
                <Property Name="LogicalOperatorWithPrevious" Type="System.String">And</Property>
              </Properties>
            </FilterDescriptor> 
            <!-- ********* this is working *********** -->              
            <FilterDescriptor Name="CustomerIDCompare" FilterField="CustomerID" Type="Comparison">
              <Properties>
                <Property Name="IsDefault" Type="System.Boolean">false</Property>
                <Property Name="Comparator" Type="System.String">Equals</Property>
                <Property Name="LogicalOperatorWithPrevious" Type="System.String">Or</Property>
              </Properties>
            </FilterDescriptor> 

(2) Le paramètre d'entrée

                <!-- ********* this is NOT working *********** -->
            <Parameter Name="@CustomerIDFilter" Direction="In">
              <TypeDescriptor Name="CustomerIDFilter" TypeName="System.String" AssociatedFilter="CustomerIDFilter">
                <Properties>
                  <Property Name="ODataFilterUrl" Type="System.String">substringof('@CustomerIDFilter',CustomerID)</Property>
                </Properties>                 
                <DefaultValues>
                  <DefaultValue MethodInstanceName="ReadAllCustomer" Type="System.String"></DefaultValue>
                </DefaultValues>
              </TypeDescriptor>
            </Parameter>    
            <!-- ********* this is working *********** -->
            <Parameter Name="@CustomerIDCompare" Direction="In">
              <TypeDescriptor Name="CustomerIDCompare" TypeName="System.String" AssociatedFilter="CustomerIDCompare">
                <Properties>
                  <Property Name="ODataFilterUrl" Type="System.String">CustomerID%20eq%20'@CustomerIDCompare'</Property>
                  <Property Name="LogicalOperatorWithPrevious" Type="System.String">None</Property>
                </Properties>
                <DefaultValues>
                  <DefaultValue MethodInstanceName="ReadAllCustomer" Type="System.String"></DefaultValue>
                </DefaultValues>
              </TypeDescriptor>
            </Parameter>

(3) L'ODataEntityUrl qui applique le filtre tel que déterminé par l'entrée de paramètre

<Property Name="ODataEntityUrl" Type="System.String">/Customers?$top=@LimitCustomers&amp;$filter=@CustomerIDFilter%20or%20@CustomerIDCompare</Property>

Encore une fois, avec ces extraits de code, les filtres fonctionnent comme un charme lors de la création d'une vue et de la saisie des valeurs, mais je ne peux pas pour la vie de le faire fonctionner avec les listes déroulantes des filtres.

Quelqu'un sait-il comment faire cela ou a-t-il des exemples de travaux à partir desquels je peux copier?

Était-ce utile?

La solution

Donc, après beaucoup d'essais et d'erreurs et en lisant tout ce que j'ai pu, j'ai trouvé le problème général, donc je le partage avec tous ceux qui tombent dessus.Le problème est que le caractère générique ne semble pas être capable de transmettre les fonctions telles que substringof() ou startswith() à l'ODataEntityUrl.Vous devez utiliser une comparaison au lieu d'un caractère générique.

Voici le filtre qui fonctionne :

                <FilterDescriptor Name="CustomerIDFilter" FilterField="CustomerID" Type="Comparison">
              <Properties>
                <Property Name="Comparator" Type="System.String">Equals</Property>
              </Properties>
            </FilterDescriptor> 

Voici le paramètre qui fonctionne :

                <Parameter Name="@CustomerIDFilter" Direction="In">
              <TypeDescriptor Name="CustomerIDFilter" TypeName="System.String" AssociatedFilter="CustomerIDFilter">
                <Properties>
                  <Property Name="ODataFilterUrl" Type="System.String">substringof('@CustomerIDFilter',CustomerID)%20eq%20true</Property>
                  <Property Name="LogicalOperatorWithPrevious" Type="System.String">Or</Property>
                </Properties>   
                <DefaultValues>
                  <DefaultValue MethodInstanceName="ReadAllCustomer" Type="System.String">null</DefaultValue>
                </DefaultValues>
              </TypeDescriptor>
            </Parameter>

Voici l'ODataEntityURL (avec quelques autres filtres inclus) qui fonctionne :

                <Property Name="ODataEntityUrl" Type="System.String">/Customers?$top=@LimitCustomers&amp;$filter=@CustomerIDFilter%20or%20@CompanyNameFilter%20or%20@CountryFilter%20or%20@CustomerIDStartsWith</Property>

Cela fait fonctionner mes filtres déroulants dans le sélecteur (mais interrompt également la vue Liste externe), j'ai donc dû créer une deuxième méthode pour afficher tous les clients sans filtres par défaut.

Autres conseils

Je sais que c'est assez ancien, mais j'ai réussi à faire fonctionner le mien d'une manière beaucoup plus simple et je ne l'ai trouvé nulle part ailleurs sur Internet, donc comme la réponse de Brent était la plus utile que j'ai trouvée, j'ai pensé y ajouter.

Dans mon exportation de modèle BDC, la méthode de liste de lecture est répertoriée avec le SQL visible, donc au lieu d'utiliser oData pour modifier le filtre, je suis allé directement au SQL.

Donc à l'origine ça ressemblait à ça :

<Method IsStatic="false" Name="VW_BRANCH_OFFICESRead Item">
    <Properties>
        <Property Name="BackEndObject" Type="System.String">VW_BRANCH_OFFICES</Property>
        <Property Name="BackEndObjectType" Type="System.String">SqlServerView</Property>
        <Property Name="RdbCommandText" Type="System.String">SELECT [Branch Name] , [Branch Code] , [Country Name] , [Country Code] , [Local Region] , [Area] , [Region] , [Branch S1 Code] FROM [CMD].[VW_BRANCH_OFFICES] WHERE [Branch Code] = @parameter</Property>
        <Property Name="RdbCommandType" Type="System.Data.CommandType, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">Text</Property>
        <Property Name="Schema" Type="System.String">CMD</Property>
    </Properties>

Et j'ai modifié la propriété "RdbCommandText" pour utiliser un LIKE au lieu de = :

<Method IsStatic="false" Name="VW_BRANCH_OFFICES_2Read List">
    <Properties>
        <Property Name="BackEndObject" Type="System.String">VW_BRANCH_OFFICES</Property>
        <Property Name="BackEndObjectType" Type="System.String">SqlServerView</Property>`
        <Property Name="RdbCommandText" Type="System.String">SELECT [Branch Name] , [Branch Code] , [Country Name] , [Country Code] , [Local Region] , [Area] , [Region] , [Branch S1 Code] FROM [CMD].[VW_BRANCH_OFFICES] WHERE ((@parameter IS NULL) OR ((@parameter IS NULL AND [Branch Name] IS NULL) OR [Branch Name] LIKE'%'+@parameter+'%'))</Property>
        <Property Name="RdbCommandType" Type="System.Data.CommandType, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">Text</Property>
        <Property Name="Schema" Type="System.String">CMD</Property>
    </Properties>

A travaillé à la fois pour le sélecteur et la vue de liste externe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top