Standardowo, CAML Queries, obsługują zapytania dot. pobrania elementów przypisanych/stworzonych/zmodyfikowanych przez użytkownika za pomocą jego Display Name. Dzieję się tak, gdyż tak właśnie te pola są domyślnie ustawione w MOSS/WSS.

Więc jeżeli chcemy wykonać zapytanie:

<Where>
  <Eq>
    <FieldRef Name='CreatedBy' />
    <Value Type='User'>{0}</Value>
  </Eq>
</Where>

To w {0} musimy wstawić Display Name użytkownika, którego elementów poszukujemy. Pewnie by to nie sprawiało problemu w firmie 5 osobowej gdzie każdy ma przynajmniej inne imię, jednak im więcej pracowników tym większa szansa wystąpienia Jana Kowalskiego więcej niż raz. Jeżeli tak się stanie, to nasze zapytanie zwróci nam nie tylko dane które nas interesują, ale także dane które nas kompletnie nie interesują (innego Jana Kowalskiego).

Na pomoc przychodzą nam dwa rozwiązania:

1) Modyfikacja typu pola w List Settings.

Jeżeli klikniecie na List Settings a następnie klikniecie na pole Created By, to będziecie mogli zmienić jako własność Show Field na na przykład ID lub Account.

Dzięki temu zabiegowi, teraz w naszym zapytaniu możemy podać albo ID użytkownika albo Account w zależności co zostało wybrane z pola listy wyboru.

Jednakże zmiana ta ma wpływ na sposób wyświetlenia pola. Dziwnie by wyglądał elementCreated By 3251, albo Created By ozon-dom-testmrekas (no chyba, że lubimy łamigłówki).

2) Modyfikacja zapytania CAML

Ta opcja jest duuużo prostsza, i wymaga tylko jednej małej modyfikacji. Mianowicie do TaguFieldRef należy dodać atrybut LookupId=’TRUE’:

<Where>
  <Eq>
    <FieldRef Name='CreatedBy' LookupId='TRUE' />
    <Value Type='User'>{0}</Value>
  </Eq>
</Where>

Teraz możemy wykonać to samo zapytanie podając ID użytkownika jako parametr.

3 KOMENTARZE

  1. Heh nieźle .. oczywiście panowie z MS woleli tą informacje zostawić dla siebie i przezornie nie umieścili żadnej informacji o atrybucie LookupId, LookupValue np tutaj http://msdn.microsoft.com/en-us/library/ms442728.aspx

    Czy gdy atrybut LookupId=’TRUE’ to atrybut Type taga Value nie powinien mieć wartości int? zgodnie z opisem z linka (części community) ?

  2. @woro

    Tez tak myslalem, ale w moich testach w U2U Caml Query Builder oraz w aplikacji dziala z atrybutem User. Co prawda nie sprawdzilem tego z atrybutem int – bo jak dziala to po co :)

    Tak naprawde to polecam ten tool U2U Caml Query Builder. Pomaga w tworzeniu zapytan CAMLowych. Oczywiscie jego modyfikacje w postaci web page gdzie mozna buildowac i podgladac CAML query dla view itp. tez jest ql! :)

  3. Ok. Z moich pobieżnych testów wynika, że w pole Type można wpisać cokolwiek nawet kawałek Pana Tadeusza ;) pewnie MOSS przy zastosowaniu LookupId bierze Id i na Type nie zważa ;)

    A Caml Query Buildera naturalnie używam ;) ale dzięki za info :)

Comments are closed.