de-reference operator

The de-reference operator uses the syntax -> and is specific to ClearSCADA. Use the operator to perform either of the following:

You can use the de-reference operator in a SELECT list and/or a WHERE clause.

To reference a database field in SQL, you reference the column that represents that field in the relevant database table. The column reference comprises the data type of the database field that the column represents (see Data Types).

Format

You can use any combination of the following:

reference->ColumnName

aggregate->ColumnName

reference->aggregate->ColumnName

where ColumnName is the name of a field in the database.

Remarks

You can use the de-reference operator to chain reference fields, in the format: reference->reference

You cannot use the de-reference operator to chain aggregates (aggregate->aggregate), as ClearSCADA does not support nested aggregates.

You can chain multiple de-reference operators (taking into account the restriction mentioned above). For example, reference->aggregate->reference->reference->aggregate->ColumnName

You can include multiple de-reference operators in a single query. For example, SELECT aggregate->ColumnName, reference->aggregate->ColumnName WHERE aggregate->ColumnName = value

You can use the de-reference operator to access aggregates without the need for joins. This might result in a faster query, but each operation will incur a database lock while ClearSCADA looks up each database item, aggregate, and column (database field) in each row. As such, we advise that you perform de-reference operations sparingly to avoid potential performance implications.

 

SELECT

PARENTGROUPID->FULLNAME AS "Location in Database", NAME

FROM

CADVMODBUSANALOG

This SELECT clause extracts the 'Full Name' of the Parent Group of each Advanced Modbus analog point in the database. It does this by using the de-reference operator (->) to access each point's Parent Group via the 'ParentGroupId' reference field. This reference field is a configuration field in the CDBObject class, which is a base class of the CAdvModbusAnalog class.

Rather than display the text 'ParentGroupId' in the column heading when the query is displayed in List format, an alias is used so that the column heading displays the text "Location in Database" instead.

The SELECT clause is also used to display a second column; that showing the name of each Advanced Modbus analog point in the database.

 

 

SELECT

GISLOCATION->GEOPOSITION AS "Geographical Location", NAME

FROM

CDBPOINT

This SELECT clause extracts the 'Position' string ('GeoPosition' property) of each point in the database. It does this by using the de-reference operator (->) to access each point's 'Location' aggregate (GISLocation), from which the query extracts the GeoPosition value. GISLocation is an aggregate of the CDBObject class, which is a base class of the CDBPoint class.

Rather than display the text 'GeoPosition' in the column heading when the query is displayed in List format, an alias is used so that the column heading displays the text "Geographical Location" instead.

The SELECT clause is also used to display a second column; that showing the name of each point in the database.

 

 

SELECT

GISLOCATION->GEOPOSITION AS "Geographical Location", NAME

FROM

CDBPOINT

WHERE

PARENTGROUPID->FULLNAME LIKE 'Eastern Region.%'

This query uses a WHERE clause to restrict the results to just those points that are in the 'Eastern Region' Group, or one of its sub-Groups. It does this by using a de-reference operator (->) to access each point's Parent Group via the 'ParentGroupId' reference field, and only extract those entries for which the Parent Group's 'Full Name' property includes the text 'Eastern Region'.

When you use the de-reference operator with the WHERE clause you must use " " correctly. The following example illustrates this issue:

The following query will fail:

SELECT

Name

FROM

CGROUP

WHERE

"NAME"<>"

 

The column alias NAME must be exact. When an alias is not explicitly set, it defaults to the column name. The following query works successfully:

SELECT

NAME

FROM

CGROUP

WHERE

("Name"<>")

 

This issue is not exclusive to the use of an aggregate, but also to the use of a reference column, for example the following will also fail:

SELECT

ParentGroupId->Name

FROM

Cdbobject

WHERE

("PARENTGROUPID->NAME"<>")

 

For information about the SELECT clause, see the example above.

Determine the name of a Reference field

You can use the Database Schema to determine the name of a reference field. In the database Schema, fields that form reference fields are assigned the type 'Reference' (or 'AOI Reference' in the case of Area of Interest Reference fields) (see Fields).

Remember that the name that appears alongside a field on a configuration Form in ViewX is that property's display name—the string that is displayed in the language that is associated with the logged on user's specified Locale. However, you can ascertain a field's name by selecting the field on a configuration Form, then looking at the name that is displayed in the Status Bar at the bottom of the ViewX window. For an example that demonstrates this, see Display a List of Property Changes in the ClearSCADA Guide to Core Configuration.

Determine the name of an Aggregate and its fields

You can use the Database Schema to determine the name of an Aggregate. In the database Schema, display the Class for which the aggregate is an extension, and then scroll down the page to locate the names of the Aggregates associated with that class. To determine the name of a field on an aggregate, select the link to the class that is associated with that aggregate (with multiple-class aggregates, there will be several classes).

Aggregates typically appear as tabs on configuration Forms in ViewX. Again, remember that the name of an aggregate on a configuration Form in ViewX is that aggregate's display name—the string that is displayed in the language that is associated with the logged on user's specified Locale. To determine the aggregate's name, you have to use the database Schema. Likewise, the name that appears alongside a field on an aggregate on a configuration Form in ViewX is that property's display name; however you can ascertain the field's name by selecting the field on the configuration Form and looking at the name that is displayed in the Status Bar at the bottom of the ViewX window.

Further Information

Supported data types: see Operands and Resulting Data Types.

Other examples that demonstrate the use of the de-reference operator: see column-ref and see Expressions.expr-column-ref.


Disclaimer

ClearSCADA 2017 R2