[Sharepoint/CAML] AND-query met meerdere OR's

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Jan_V
  • Registratie: Maart 2002
  • Nu online
Ik ben een query aan met maken voor m'n ListViewByQuery lijst (wat een adreslijst/personenlijst moet gaan worden). In eerste instantie wilde ik een query doen op een lijst waarin de Title niet null is. Dat is behoorlijk eenvoudig.
Ook heb ik al voor elkaar dat ik een soort van LIKE heb ingebouwd, zodat wanneer je op 'hen' zoekt, je de personen 'Hendrik', 'Henk', 'Hendrikssen', etc. terug krijgt. Dit was even puzzelen, maar ook wel te doen.

Nu heb ben ik deze query weer aan het uitbreiden.
Op dit moment moet je namelijk nog steeds bovenstaande zoekacties kunnen doen (dus met die namen), maar ook moeten de personen in 1 of meerdere locaties zitten.
In m'n webpart property geef ik bijvoorbeeld de locaties 'Oost', 'Noord' en 'Zuid' op en in m'n zoekveld 'hen'.
Dan moet ik alleen de personen terug krijgen die aan de conditie 'hen' voldoen en aan de locatie.

Om het voor mezelf simpel te maken heb ik die naam eerst maar gezet op Title is not null, om zo m'n query te versimpelen.

Het probleem zit hem nu in m'n meerdere or's.
M'n query ziet er zo een beetje uit (iets ingekort en met andere namen)
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<Where>
    <And>
        <IsNotNull>
            <FieldRef Name='Title' />
        </IsNotNull>
        <Or>
            <Or>
                <Or>
                    <Or>
                        <Or>
                            <Or>
                                <Or>
                                    <Or>
                                        <Or>
                                            <Or>
                                                <Contains>
                                                    <FieldRef Name='Locatie' />
                                                    <Value Type='Lookup'>Locatie 10</Value>
                                                </Contains>
                                            </Or>
                                            <Contains>
                                                <FieldRef Name='Locatie' />
                                                <Value Type='Lookup'>Locatie 9</Value>
                                            </Contains>
                                        </Or>
                                        <Contains>
                                            <FieldRef Name='Locatie' />
                                            <Value Type='Lookup'>Locatie 8</Value>
                                        </Contains>
                                    </Or>
                                    <Contains>
                                        <FieldRef Name='Locatie' />
                                        <Value Type='Lookup'>Locatie 7</Value>
                                    </Contains>
                                </Or>
                                <Contains>
                                    <FieldRef Name='Locatie' />
                                    <Value Type='Lookup'>Locatie 6</Value>
                                </Contains>
                            </Or>
                            <Contains>
                                <FieldRef Name='Locatie' />
                                <Value Type='Lookup'>Locatie 5</Value>
                            </Contains>
                        </Or>
                        <Contains>
                            <FieldRef Name='Locatie' />
                            <Value Type='Lookup'>Locatie 4</Value>
                        </Contains>
                    </Or>
                    <Contains>
                        <FieldRef Name='Locatie' />
                        <Value Type='Lookup'>Locatie 3</Value>
                    </Contains>
                </Or>
                <Contains>
                    <FieldRef Name='Locatie' />
                    <Value Type='Lookup'>Locatie 2</Value>
                </Contains>
            </Or>
            <Contains>
                <FieldRef Name='Locatie' />
                <Value Type='Lookup'>Locatie 1</Value>
            </Contains>
        </Or>
    </And>
</Where>


Bij het uitvoeren van deze query krijg je de foutmelding:
Een of meer veldtypen is niet goed geïnstalleerd. Ga naar de pagina met instellingen voor de lijst en verwijder deze velden.
terug, wat er normaliter op neer komt dat je je kolom typen niet goed hebt gedefinieerd. In dit geval ligt het echter aan de opbouw van de query, wat ook een oorzaak kan zijn voor deze foutmelding
Google
Technet

Zelf denk ik dat het komt dat de lijst nu ziet dat er maar 1 parameter is in het AND-statement, wat op zich ook zo is. Probleem is dat ik niet zie hoe je anders een dergelijke query moet gaan opbouwen.
De u2u caml query builder kan niet overweg met dit soort nested or's en and's, dus daar heb ik momenteel weinig aan (heb versie 3.1.0.0 geinstalleerd).

Anderen met een idee hierover?

[ Voor 16% gewijzigd door Jan_V op 23-02-2009 16:49 . Reden: De CAML-query gewijzigd naar de echte query ivm fout in de query zoals Huhu aangaf. ]

Battle.net - Jandev#2601 / XBOX: VriesDeJ


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik ben niet bekend met deze materie, maar waarom staat er dan een AND om heen? Kun je die AND niet gewoon eruit mikken op deze manier?

[snip]*hier stond onzin*[/snip]

Anyhow; dit is in 't wilde weg gokken. Je hebt er meer aan je even te verdiepen in de documentatie dan op mij af te gaan op dit moment :P

[ Voor 112% gewijzigd door RobIII op 23-02-2009 16:20 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ik weet het ook niet zeker, maar als ik zo kijk lijkt het alsof je een <or> teveel opent en sluit. Aan het einde doe je namelijk </or></or>, zonder dat daar nog een <contains> in staat. Er kan dus één <or> en </or> weg denk ik.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
HuHu schreef op maandag 23 februari 2009 @ 16:17:
Ik weet het ook niet zeker, maar als ik zo kijk lijkt het alsof je een <or> teveel opent en sluit. Aan het einde doe je namelijk </or></or>, zonder dat daar nog een <contains> in staat. Er kan dus één <or> en </or> weg denk ik.
Dat zou ook nog eens kunnen...
Met mijn 0-kennis van dit onderwerp; is het niet zoiets?
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<Where>
    <And>
        <IsNotNull>
            <FieldRef Name='Title' />
        </IsNotNull>
        <Or>
            <Or>
                <Or>
                    <Contains>
                        <FieldRef Name='Locatie' />
                        <Value Type='Lookup'>Oost</Value>
                    </Contains>
                </Or>
                <Contains>
                    <FieldRef Name='Locatie' />
                    <Value Type='Lookup'>Noord</Value>
                </Contains>
            </Or>
            <Contains>
                <FieldRef Name='Locatie' />
                <Value Type='Lookup'>West</Value>
            </Contains>
        </Or>
    </And>
</Where>

[ Voor 52% gewijzigd door RobIII op 23-02-2009 16:20 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Jan_V
  • Registratie: Maart 2002
  • Nu online
Doh...heb iets te weinig uit het voorbeeld geknipt.
Staat inderdaad 1 Or teveel in. Zal de query even vervangen met de echte query, zodat er niet weer een typo kan ontstaan.

Maar inderdaad, zo'n extra Or-statement had op zich dezelfde fout kunnen geven volgens mij.

Battle.net - Jandev#2601 / XBOX: VriesDeJ


  • Jan_V
  • Registratie: Maart 2002
  • Nu online
Na veel gepuzzel is het uiteindelijk toch gelukt.
De query is inmiddels in het volgende veranderd:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
resultString = string.Format(@" <Where>
                        <And>
                            <IsNotNull>
                                <FieldRef Name='Title' />
                            </IsNotNull>
                            <Or>
                                <Contains>
                                <FieldRef Name='Locatie' />
                                    <Value Type='Lookup'>Locatie 1</Value>
                                </Contains>
                                <Or>
                                    <Contains>
                                    <FieldRef Name='Locatie' />
                                        <Value Type='Lookup'>Locatie 2</Value>
                                    </Contains>
                                    <Contains>
                                        <FieldRef Name='Locatie' />
                                        <Value Type='Lookup'>Locatie 3</Value>
                                    </Contains>
                                </Or>
                            </Or>
                        </And>
                    </Where>"); 

Dus per 2 verpakt in de OR's en als er meer dan 2 zijn, dan die stuk voor stuk onder (of boven) in het OR-gedeelte plaatsen.
Op zich is het heel logisch en eenvoudig, maar het moet maar net lukken. Op zich was m'n bovenste query dus niet helemaal fout, maar moest er in het diepste niveau eigenlijk 2 waarden staan in plaats van 1.
Nou, ook weer opgelost dus.

Battle.net - Jandev#2601 / XBOX: VriesDeJ


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ah... logisch op zich. Tof dat je nog even de oplossing plaatst ^O^.

Acties:
  • 0 Henk 'm!

  • tommyz
  • Registratie: Februari 2005
  • Laatst online: 11:49
Je zal 'm vast kennen, maar wil het toch even noemen: er is een U2U CAML builder, waarmee je eenvoudig query's kan maken en gelijk kan testen. Ik gebruik het zelf heel veel voor de ContentQuery webpart.

Flickr

Pagina: 1