When retrieving data from Lime CRM Web Service, you must specify a query that describes the data to be returned. A query is given in XML format and specifies the table on which the query is based, the fields from which data should be retrieved, the conditions that the data must meet and how it should be sorted. The result is also returned as an XML document.
Example of a query:
<query distinct="0"> <tables> <table>company</table> </tables> <fields> <field>idcompany</field> <field sortorder="asc" sortindex="1">name</field> <field>responsible.name</field> <field>city</field> <field>category</field> </fields> <conditions> <condition operator="="> <exp type="field">city</exp> <exp type="string">Lund</exp> </condition> <condition operator="in" or="0"> <exp type="field">category</exp> <exp type="string">Customer;Prospect</exp> </condition> </conditions> </query>
Example of a result:
<data> <company idcompany="2001" name="Alfa Laval" responsible.name="Curt Cobain" city="Lund" category="221001" category.text="Prospect"/> <company idcompany="1001" name="Lundalogik AB" responsible.name="Charles Bullit" city="Lund" category="21001" category.text="Customer"/> </data>
If the query is not correct, Lime CRM Web Service throws out an exception.
A query looks as if it will allow more than one table specification, but actually it does not. A query must contain one and only one table. However, it is possible to retrieve data from more than one table - but they must be related and derive from the table specified in the query.
Lime CRM Web Service validates the table specification. In order for a table to be used in a query, the following conditions must be met:
A query must contain at least one field specification that describes the information that is to be returned. The specifying fields do not need to be found in the specified table, but may exist in related tables. At the present time, related tables must be of the “field” type, i.e. from person you can retrieve information from company, but not the reverse. This is on condition that the “person” table can only have one “company” field while the “company” table may have many “person” fields. Related fields are denoted by a full stop.
This example shows how to retrieve the company's address from a person:
<tables> <table>person</table> </tables> <fields> <field>company.address</field> </fields>
The way the results are sorted is specified via attributes for the fields that should be sorted.
Attribute | Value | Description | Example |
---|---|---|---|
sortorder | 1 | Sorts in ascending order. | <field sortorder="asc" sortindex="1">name</field> |
asc | |||
2 | Sorts in descending order. | <field sortorder="desc" sortindex="1">name</field> |
|
desc | |||
sortindex | 1-N | Specifies the order in which fields should be sorted. | <field sortorder="desc" sortindex="2">name</field> <field sortorder="desc" sortindex="1">city</field> |
Certain fields specified in a query automatically generate additional fields for text representation in the result file. These fields are named {fieldname}{suffix}
, where “suffix” can differentiate between the various field types. The following table lists the fields that generate additional fields.
Field type | Suffix | Comments |
---|---|---|
Relation | .descriptive | Entry description for the related entry. |
Alternative | .text | Text of the alternative. |
Quantity | .text | The alternative text representations in the format [Option 1];[Option 2];[n…] |
File | __fileextension | Read more about additional fields for file and document fields here. TODO TODO TODO |
__size | ||
__lockedby | ||
__timestamp | ||
User | .text | The user's username. |
Conditions are read and added in the same order as they are found in the XML document. The relationship between one condition and preceding ones is specified via the or attribute for the condition element. Valid values for the “or” attribute are “1” and “0”, where “1” indicates that the condition's relation to preceding conditions is OR and “0” indicates the “AND” relation, according to reverse Polish notation. This means that the attribute does not fulfil any function for the first condition, and if it is included it is ignored. An example of how the “or” attribute is used can be seen below.
All conditions are validated and Lime CRM Web Service returns errors for invalid conditions along with information about the part that is invalid.
The table below lists how fields, operators and data types that can be combined in a condition.
Left | Right | ||||||
---|---|---|---|---|---|---|---|
Data type | Field type | RHS | F2 | Numerical | String | Date | Query |
Text | Set | No | No | =, !=, IN, NOT IN, ANY, ALL | |||
* | Yes | Yes | =, !=, <, ⇐, >, >=, LIKE | ||||
Numerical | Option | Yes | Yes | =, !=, IN, NOT IN | =, !=, LIKE, NOT LIKE, IN, NOT IN | ||
File | Yes | No | =, !=, IS, IS NOT | ||||
Relation 1) | Yes | Yes | =, !=, IS, IS NOT | =, !=, LIKE, NOT LIKE | IN, NOT IN | ||
* | Yes | Yes | =, !=, <, ⇐, >, >=, IS, IS NOT | ||||
Date | * | Yes | Yes | =, !=, <, ⇐, >, >=, LIKE, NOT LIKE | =, !=, <, ⇐, >, >=, IS, IS NOT |
Note that when “LIKE” and “NOT LIKE” are valid, all other variants are also valid.
With the help of types, we can specify what exists on the relevant side of the operator. If one side consists of a constant value, the type indicates the data type that the value should be interpreted as. When a field is specified, the value is initially interpreted according to the data type for the field. However, certain fields can be represented as several data types; alternative fields, for example, are stored as whole integers but are also represented by text. In this situation, the type is used on the other side of the operator to indicate the data type that applies.
Type | Alternate syntax | Description | Example |
---|---|---|---|
field | 1 | Indicates that the value for “exp” should be interpreted as a field. If the field is found in a different table, the full file path should be specified, with each step separated by a full stop. | <condition operator="="> <exp type="field">responsible.name</exp> <exp type="string">Charles Bullit</exp> </condition> |
string | 2 | Indicates that the value for “exp” should be interpreted as text. | <condition operator="="> <exp type="field">numberofemployees</exp> <exp type="string">100 - 200</exp> </condition> |
numeric | 3 | Indicates that the value for “exp” should be interpreted as a number. | <condition operator="="> <exp type="field">turnover</exp> <exp type="numeric">500000</exp> </condition> |
date | 4 | Indicates that the value for “exp” should be interpreted as a date. | <condition operator="="> <exp type="field">orderdate</exp> <exp type="date">2008-10-10</exp> </condition> |
query | 10 | Indicates that the value for “exp” should be interpreted as a query. | <condition operator="IN"> <exp type="field">responsible</exp> <exp type="query">{urval i xml-format}</exp> </condition> |
Unlike fields from which data is retrieved, relation fields that are used in conditions must be of the type “tab”. For example, it is possible to specify conditions for persons related to the companies that are being queried, although a company may have many persons. However, there is one important difference, because you must specify a field from the related table, even if it is the field entry ID that you want to compare.
The following example involves a company that must be related to a specific person:
<condition operator="="> <exp type="field">person.idperson</> <exp type="numeric">10001</exp> </condition>
When the situation is reversed and the company is a field, you do not need to specify the ID field:
<condition operator="="> <exp type="field">company</> <exp type="numeric">1001</exp> </condition>
An operator specifies how the left side should be compared with the right. The table table lists the operators currently supported by Lime CRM Web Service. To improve legibility, all operators have at least one text representation. An operator can be described in several different ways so as to maintain compatibility with existing software. Note that the left-hand side constitutes the first “exp” element, while the right-hand side constitutes the other one.
Operator | Alternative syntax | Description | Example |
---|---|---|---|
= | 1 | The left-hand side must be equal to the right-hand side. | <condition operator="="> <exp type="field">name</exp> <exp type="string">Lundalogik</exp> </condition> |
Equal | |||
EqualTo | |||
> | 2 | The left-hand side must be greater than the right-hand side. | <condition operator=">"> <exp type="field">turnover</exp> <exp type="numeric">500000</exp> </condition> |
Greater | |||
GreaterThan | |||
< | 3 | The left-hand side must be less than the right-hand side. | <condition operator="<"> <exp type="field">turnover</exp> <exp type="numeric">100000</exp> </condition> |
Less | |||
LessThan | |||
>= | 4 | The left-hand side must be greater than or equal to the right-hand side. | <condition operator=">="> <exp type="field">orderdate</exp> <exp type="date">2008-10-10</exp> </condition> |
GreaterOrEqual | |||
GreaterThanOrEqualTo | |||
⇐ | 5 | The left-hand side must be less than or equal to the right-hand side. | <condition operator="<="> <exp type="field">activeuntil</exp> <exp type="date">2010-12-31</exp> </condition> |
LessOrEqual | |||
LessThanOrEqualTo | |||
!= | 6 | The left-hand side must not be equal to the right-hand side. | <condition operator="!="> <exp type="">active</exp> <exp type="numeric">0</exp> </condition> |
NotEqual | |||
NotEqualTo | |||
LIKE | 13 | The right-hand side must appear on the left. | <condition operator="LIKE"> <exp type="field">companyname</exp> <exp type="string"> AB</exp> </condition> |
%LIKE% | |||
IN | 14 | The left-hand side must contain at least one of the alternatives on the right. | <condition operator="IN"> <exp type="field">category</> <exp type="string">VD;Vice VD;Säljchef</exp> </condition> |
ANY | 16 | The left-hand side must be included in at least one of the alternatives on the right. | <condition operator="ANY"> <exp type="products"></> <exp type="string">Tallrikar;Glas;Bestick</exp> </condition> |
ALL | 17 | The left-hand side must contain all alternatives on the right. | <condition operator="ALL"> <exp type="field">products</exp> <exp type="string">Tallrikar;Glas;Bestick</exp> </condition> |
LIKE% | 18 | The left-hand side must begin with the right-hand side. | <condition operator="LIKE%"> <exp type="field">name</exp> <exp type="string">Rudolf</exp> </condition> |
StartsWith | |||
%LIKE | 19 | The left-hand side must end with the right-hand side. | <condition operator="%LIKE"> <exp type="field">name</exp> <exp type="string">Mulen</exp> </condition> |
EndsWith | |||
NOT LIKE | 20 | The right-hand side must not appear on the left. | <condition operator="NOT LIKE"> <exp type="field">name</exp> <exp type="string">Lundalogik</exp> </condition> |
NotLike | |||
NOT %LIKE% | |||
NOT LIKE% | 21 | The left-hand side must not begin with the right-hand side. | <condition operator="NOT LIKE%"> <exp type="field">name</exp> <exp type="string">Lunda</exp> </condition> |
NotStartsWith | |||
NOT %LIKE | 22 | The left-hand side must not end with the right-hand side. | <condition operator="NOT %LIKE"> <exp type="field">name</exp> <exp type="string">logik</exp> </condition> |
NotEndsWith | |||
NOT IN | 23 | The left-hand side must not be included in any alternatives on the right. | <condition operator="NOT IN"> <exp type="category"></exp> <exp type="string">Kund;Prospekt</exp> </condition> |
NotIn | |||
IS | 25 | The left-hand side must be ZERO. The “Exp” value for the right-hand side is ignored. However, the type for the right-hand side must be valid. | <condition operator="IS"> <exp type="field">turnover</exp> <exp type="numeric"></exp> </condition> |
IsNull | |||
IS NULL | |||
IS NOT | 26 | The left-hand side must not be ZERO. The “Exp” value for the right-hand side is ignored. However, the type for the right-hand side must be valid. | <condition operator="IS NOT"> <exp type="field">orderdate</exp> <exp type="date"></exp> </condition> |
IsNot | |||
IsNotNull | |||
IS NOT |
Most operators are simple to use and understand, but there are a couple that are not particularly obvious, and which require certain formatting in regard to the value to which they are applied.
May be used for alternative fields and quantity fields, and indicate that the field should be compared with a number of alternatives separated by semi-colons. The number of alternatives may consist of either the ID or text, but not a mixture. You specify what the quantity contains via the “type” attribute, where “numeric” means the ID and “string” means text.
When the operator is used for an alternative field, this means that the value of the field must or cannot be found in the specified alternatives. When it is used for a quantity field, this means that the field must contain at least one or none of the specified alternatives.
The following example indicates that the alternative field “personcategory” must have a value within a specific quantity:
<condition operator="IN"> <exp type="field">personcategory</exp> <exp type="string">Sales manager;Consultancy manager;Manager</exp> </condition>
These operators may only be used for quantity fields, and indicate that the field should be compared with a quantity of alternatives. The “ANY” operator works in the same way as the “IN” operator, while “ALL” indicates that the field must contain all alternatives in the specified quantity. However, the field may contain additional alternatives. For exact matching, use the “=” and “!=” operators.
Conditions can be grouped by inserting brackets around the conditions that are to be grouped. The relationship of the grouping to preceding conditions is indicated via the “or” attribute or in the condition element. The table below shows how brackets are inserted into the query.
Type | Alternate syntax | Description | Example |
---|---|---|---|
parenthesis | Indicates that a parenthesis should be inserted. The type of bracket is indicated via the exp value. Possible values: 8, 9, (, ), left, right, leftparenthesis, rightparenthesis | <condition> <exp type="parenthesis">(</exp> </condition> |
|
( | 8 | Indicates that a left parenthesis should be inserted. | <condition> <exp type="("/> </condition> |
left | |||
leftparenthesis | |||
) | 9 | Indicates that a right parenthesis should be inserted. | <condition> <exp type=")"/> </condition> |
right | |||
rightparenthesis |
The following example shows a query that returns companies with a customer status of “Not contacted” when the person responsible is Charles Bullit or nobody at all:
<conditions> <condition operator="="> <exp type="field">customerstatusr</exp> <exp type="string">Ej kontaktad</exp> </condition> <condition or="0"> <exp type="("/> </condition> <condition operator="="> <exp type="field">responsible.name</exp> <exp type="string">Charles Bullit</exp> </condition> <condition operator="IS" or="1"> <exp type="field">responsible</exp> <exp type="numeric"/> </condition> <condition> <exp type=")"/> </condition> </conditions>
The query element here supports a number of attributes that indicate general properties for the query.
The outputformat
attribute accepts “auto” or “raw”, where “auto” is the default value and means that the result is formatted, involving extra fields with suffixes such as {.descriptive}, {.text}. Numerical values are also formatted. The value “raw” means that all data will be returned as it is stored in the database.
The distinct
attribute accepts “1” or “0”, where “1” is the default value and means that all entries in the results must be unique. Imagine that the “entry ID” field is very important to the results of a search, with “distinct” set to “1” because all entries in a table have a unique entry ID. We would normally recommend that you always include the entry ID in a search, but there are situations when you do not wish to include the field and want to do a distinct search.
The following example allows you to retrieve all districts where there are customers. Each district will appear only once in the results. If the entry ID was included for this query, all companies with “customerstatus = Customer” would be included in the results, which would presumably return many more results.
<query distinct="1"> <tables> <table>company</table> </tables> <fields or="0"> <field sortorder="asc" sortindex="1">city</field> </fields> <conditions> <condition operator="="> <exp type="field">customerstatus</exp> <exp type="string">Customer</exp> </condition> <conditions> </query>
The top
attribute indicates the maximum number of entries that are returned. The default value is “0”, which means that all entries are returned; the attribute accepts all values greater than 0. Remember that the sorting can affect the entries that are returned.
You can use the first attribute to offset the starting point from which entries are retrieved. The default value is “1”, which means that retrieval begins with the first entry. All values greater than 0 are accepted. If no sorting has been specified, the results will be sorted on the first specified field. You can retrieve, say, 20 entries at a time in intervals by combining this attribute with top; this can be useful when viewing search results.
The count
attribute indicates whether the number of entries that match the query should be returned. This attribute accepts “0” and “1”, where “0” is the default value, meaning that the entries rather than the number of entries are returned. When you retrieve a number of entries, no field can be specified in the query, since Lime CRM Web Service automatically generates the field that is required.
The following example returns the number of customers.
<query count="1"> <tables> <table>company</table> </tables> <conditions> <condition operator="="> <exp type="field">customerstatus</exp> <exp type="string">Customer</exp> </condition> <conditions> </query>
The result you obtain contains only one data field, which contains the number of entries that match the query. The name of this data field is always count.
<?xml version="1.0" encoding="utf-16"?> <data> <company count="321"/> </data>