Build nested WHERE conditions with sub-queries, OR blocks, date comparisons, and range filters.
Key Objects Used
ISSelectQueryBuilder
finBL.TimeZoneFunctions
Code
Dim sqb As ISSelectQueryBuilder = finBL.Database.CreateSelectQueryBuilder()
Dim sqbAddresses As ISSelectQueryBuilder = finBL.Database.CreateSelectQueryBuilder()
' Main queryWith sqb
.Table = "Client"
.Fields.AddList("Pk,ClientId,Name,DateOfBirth,Status")
With .SqlWhere
' Sub-query: find clients with matching addressesWith sqbAddresses
.Table = "ClientContactAddress"
.Fields.Add("ClientPk")
With .SqlWhere
.AppendComparisonField("ClientContactAddress.ClientPk", "=", "Client.Pk")
' OR block: match City or Suburb
.BlockBegin(iseSqlWhereBuilderNestedBlockType.OrBlock)
.AppendRange("City", citiesRange)
.AppendRange("Suburb", citiesRange)
.BlockEnd()
' Current addresses only
.AppendComparisonIntegerBoolean("Historic", "=", False)
.BlockBegin(iseSqlWhereBuilderNestedBlockType.OrBlock)
.AppendComparisonNull("DateStop")
.AppendComparisonDate("DateStop", "<", finBL.TimeZoneFunctions.GetCurrentDatabaseDate().AddDays(1), False)
.BlockEnd()
End WithEnd With
.AppendInSubQuery("Pk", sqbAddresses)
' Always apply user filters
.Append(finBL.CurrentUserInformation.FilterClientSqlWhere)
End With
.OrderByFields.Add("ClientId")
End With' Execute into a DataTableDim dt As DataTable
sqb.ExecuteDataTable(dt)
Source:
Sample Scripts / Script_ClientsListTutorial.xml (Summary Page / Smart List pattern)