I have used below code for the CAML query but empty result returns..actually having values to return based on condition :
below code generate following CAML query.
we have data for "Favorite" Category anf for "All Users" AccessGroup
how to fix it
<View>
<Query>
<Where>
<And>
<Eq>
<FieldRef Name='Category' />
<Value Type='Choice'>Favorite</Value>
</Eq>
<Or>
<Or>
<Eq>
<FieldRef Name='AccessGroup' />
<Value Type='LookupMulti'>All Users</Value>
</Eq>
<Eq>
<FieldRef Name='AccessGroup' />
<Value Type='LookupMulti'>ArgosPlus</Value>
</Eq>
</Or>
<Or>
<Eq>
<FieldRef Name='AccessGroup' />
<Value Type='LookupMulti'>grp1</Value>
</Eq>
<Eq>
<FieldRef Name='AccessGroup' />
<Value Type='LookupMulti'>grp2</Value>
</Eq>
</Or>
</Or>
</And>
</Where>
</Query>
</View>
async buildCamlQuery(values: string[], category: string) {
const fieldRefXml = (value: string) => `
<Eq>
<FieldRef Name='AccessGroup' />
<Value Type='LookupMulti'>${value}</Value>
</Eq>`;
const wrapWithOr = (conditions: string[]) => {
if (conditions.length === 1) {
return conditions[0];
}
return `
<Or>
${conditions.shift()}
${wrapWithOr(conditions)}
</Or>`;
};
const buildOrConditions = (values: string[]): string => {
const conditions = values.map(value => fieldRefXml(value));
const result: string[] = [];
while (conditions.length > 0) {
const batch = conditions.splice(0, 2);
result.push(wrapWithOr(batch));
}
if (result.length === 1) {
return result[0];
}
return wrapWithOr(result);
};
const orConditions = buildOrConditions(values);
return `
<View>
<Query>
<Where>
<And>
<Eq>
<FieldRef Name='Category' />
<Value Type='Choice'>${category}</Value>
</Eq>
${orConditions}
</And>
</Where>
</Query>
</View>`;
}
async filterUsingGroup(category) {
//const userGroups = await this.getUserGroups();
const userGroups = ['All Users', 'ArgosPlus', 'grp1', 'grp2'
//, 'grp3', 'grp4', 'grp5', 'grp6', 'grp7'
]
userGroups.forEach(element => {
console.log(element.replace("'", "").replace("'", ""))
});
let camlQuery = await this.buildCamlQuery(
userGroups
//['All Users', 'ArgosPlus']
, category);
console.log("MERGED : ", camlQuery)
const body = {
query: {
ViewXml: camlQuery,
},
};
const options = {
body: JSON.stringify(body),
};
const tenantUrl = common.getTenantUrl(
this.props.context.pageContext.web.absoluteUrl
);
await this.props.context.spHttpClient
.post(
`${tenantUrl}/sites/Corporate-Technology/sandbox/_api/web/lists/getbytitle('${UrlConstant.businessApp.BUSINESS_APP_LIST}')/GetItems`,
SPHttpClient.configurations.v1,
options
)
.then(async (response: SPHttpClientResponse) => {
console.log("CAML 1 : ", await response.json());
//return response.json();
});
}