Data Types, Operators & Expressions
Introduction
The primary focus of this topic is to understand the various data types and operators available in TDL and how valid expressions are constructed. Any information stored on computer system is commonly referred as data. Based on the value the data is classified into different types called as data types.
For example, if the value is 123, then the data type is Number. Data type specifies the type of value and the validity constraint of each data type.
Data Types
The data is the lowest element of information. It exists in different forms as number, date etc. A data type is a set of data with values having predefined characteristics.
Data types supported by computer languages vary from one language to another. The language usually specifies the range of values for a given data type, how the values are processed by the computer, and how they are stored.
The data types in TDL are used to specify the type of data stored in the field or a variable. As discussed, TDL is a business language and it requires the support for various business data types like amount, quantity, rate apart from the other basic types. Refer to the below image to identify all the TDL data types.
TDL Data Types
Based on the requirements of the business the data types in TDL are classified in two categories: Simple and Compound.
Simple Data Types
The data types which can hold the data for a specific type only are referred to as Simple Data Types. These cannot be further divided into sub types. Mentioned are the simple data types available in TDL.
String
The string data type accepts alpha numeric characters as well as special symbols. There is no restriction on the number of characters which can be accepted for this data type. If the restrictions are required, they can be applied at the field level as per the scenario.
Example:
The name of the company ABC Company Ltd. can be stored in the string data type.
Number
A number data type is used to store a numeric data only. The valid range acceptable in TDL is from 92233720368547.7580 to +92233720368547.7580.
Example:
The phone number ‘98450 98450’ can be entered in a number type field.
Date
This data type is used to store dates. The valid range acceptable in TDL is from 1-1-1901 to 31-12-2098.
Example:
The date of purchase or payment can be displayed only in a field of type Date.
Logical
This data type is used to specify a logical value. It accepts Yes/ No, True/ False, On /Off and 0/1.
Example:
The logical data type is mostly used in the configuration settings. The value of Explode flag is No by default. It must be set to Yes in order to display exploded data.
Compound Data Type
In a business scenario the data may be a combination of multiple components. TDL provides a comprehensive set of compound data types which consists of further subtypes.
Compound data types in TDL are: Amount, Quantity, Rate, Rate of Exchange, Due Date.
Amount
This data type is a combination of subtype of Base/Direct Base, Forex, Rate and DrCr.
Base/Direct Base – This subtype is used to specify the amount in the base currency applicable for the particular company.
Forex – This subtype is used to specify the value of the amount in a foreign currency, as specified by the user.
Rate – This subtype will be used to specify the Forex rate.
DrCr – This subtype is used to specify a Dr & Cr based on whether it is a Debit/Credit amount.
The valid range acceptable in TDL is from -92233720368547.7580 to 92233720368547.7580 and the four decimal places are applicable for base amount and forex based on the number of decimal specified in the currency master. Whereas for Forex, the decimal places can go to the maximum of four decimal places which are independent of the number of decimals mentioned in the respective currency master.
Example:
The opening balance of a ledger from group Sundry Debtor is $1000. The base currency of the company is Rupees and the Rate of Exchange is specified as $1/ Rs. 42.50. Now this information is stored in the respective sub-types as follows:
Base : Rs. 42,500 ($1000 * 42.50)
Forex : $1000
Rate : Rs. 42.50/$
DrCr : Dr
Quantity
This data type comprises of the subtype base units/primary units, alternate units/ secondary units and unit symbol.
Base Units/Primary Units – The quantity along with the base unit is specified using this data type.
Alternate Unit/ Secondary Units –The quantity in alternate units is specified using the sub type as Alternate units
Unit symbol – The unit symbol for the quantity is specified using this subtype. The valid range acceptable in TDL for the quantity data is from –92233720368547.7580 to +92233720368547.7580 and number of decimal places depends on the number of decimal specified in the Unit master.
Example:
For a Stock item Rice the quantity is 10 Bags and 2 kgs. The unit of measurement is 1 bag of 10 kgs. The alternate unit is specified as Grm and 1000gms = 1 kg.
Base Unit: 10 bags 2 kgs
Alternate Unit: 102000 gms
Unit Symbol: bag of 10 kgs
Rate – A rate data type is a combination of sub-types price, quantity & units symbol.
Price – The price of the item is specified using this sub-type.
Quantity – This specifies the quantity for which the price is specified.
Units/Unit Symbol – This specifies the unit for which the price is specified. The valid range acceptable in TDL for the rate is from 2233720368547.7580 to 92233720368547.7580. The number of decimal places for price depends on the number of decimal specified in the currency master and for quantity it depends on the number of decimal specified in the unit master.
Example:
The rate for a Stock Item is entered as Rs. 100/5 nos
Price : 100
Quantity : 5 nos
Unit symbol: 5 nos
Rate of Exchange
This data type is used to specify the conversion rate between currencies. Acceptable range for Rate of Exchange is from – 92233720368547. 7580 to 92233720368547. 7580 and the decimal places can go to the maximum of four which are independent of the number of the decimals mentioned in the respective currency master.
Example:
If the conversion rate for $1 is Rs. 45
Rate of Exchange: Rs 45/$
Due Date – This data type is used to store a date range. It stores two date values From Date and To Date. Only the To Date value is entered and the value of from date is determined by the system.
Example:
While entering a voucher in the credit period either number of days is entered or to date is entered and from date is internally considered to be billed date.
Even though the data types Rate of Exchange and Due Date are compound data types, they don’t have any sub-types .i.e. for these data types sub-types can’t be specified explicitly.
The Field Attribute Type
The type for the field definition is specified using the Type attribute.
Syntax
[Field: <Field Name>]
Type : <Data Type> : <Sub-type>
Where,
<Data Type> is primary data type name,
<Sub–type> is name of sub-type belonging to the specified primary data type
Example:
[Field: Qty Secondary Field]
Type : Quantity: Secondary Units
The Field Attribute Format
The type for the field definition is specified using the Type attribute.
Syntax
[Field: <Field Name>]
Type : <Data type>
Format : <List of Formats>
Where,
<Data Type> is primary data type name,
<List of Formats> is comma separated list of formats applicable for the <primary data type>
Example:
The code to specify format for number ‘85.49’ to be displayed as (44.5%) is as follows:
[Field: NumField]
Type : Number
Format : Decimal: 1, Percentage, Bracketed
In Tally, quantity of a Stock item can be expressed using a Simple or Compound Unit of Measure.
Simple Unit – Unit of measure used to express the quantity of an Item. for example, kgs, nos, pcs, etc.
Compound Unit – The unit of measure which is a combination of Simple units related to each other by a conversion factor, is termed as a Compound Unit. Examples of compound units are kg of 1000 gms, dozen of 12 nos, etc.
In case of compound unit, the highest unit is referred to as the Base/Primary unit and the sub units thereafter, are referred to as the Tail units. The quantity is always expressed in terms of the Primary unit. A compound unit can be nested further to contain another compound unit as a Tail unit, up to any number of levels. For example., Bag of 10 kgs of 1000 gms.
If the unit of measure used for a Stock item “Grains” is Bag of 10kgs of 1000 gms and the closing balance is 12-5-250 bags, it means that the quantity of items is 12 bags 5 kgs 250 gms. Whenever the tail unit quantity crosses the conversion factor, it adds up to the bigger unit. If the gms part exceeds 1000 in this example and the value is 12-5-1250 bags, then it will be converted to 12-6-250 bags.
In TDL, the data type to support representation & storage of data of the above type is Quantity. It comprises of subtypes Number, Base/Primary units, Alternate/Secondary units and unit symbol.
We know that when a method of type ‘Quantity’ is retrieved in a report, it is always expressed in terms of primary units. In case the Unit of Measure is a nested compound unit, the user may require the quantity in terms of any of the units in the entire Compound unit chain. The ‘Format’ attribute of Field has been enhanced to specify the Tail unit, in which the quantity value needs to be extracted.
Syntax
[Field: <Field Name>]
Type : Quantity
Set As : $<Method Name>
Format: “Tail Units:” + <String Expression>
Where,
<String Expression> must evaluate to any Tail Unit Name used in the Item.
Example:
As per the previous example, the unit of measure used for the Stock item “Grains” is Bag of 10kgs of 1000 gms and the closing balance is 12-5-250 bags. In a field, we may require to retrieve the value in kgs or gms instead on bags. For this, the following specification can be used:
[Field: Qty Format Enhancement]
Use : Qty Primary Field
Set As: $ClosingBalance
Format: “Tail Units:” + “kgs”
If Format is “Tail Units:kgs”, value returned is 125 kgs 250 gms=12X10 kgs+5kgs & 250 gms
If the Format is “Tail Units:gms”, the value returned would be 125250 gms = 12X10X1000 gms+ 5X1000 gms +250 gms.
Appropriate conversions take place as per the conversion factors set in the nested Compound unit chain.
Data Type Formats
In TDL various formats are used are available to represent the data. Some formats are applicable only to a specific data type. The field attribute format is used to specify the format based on the data type specified in the type attribute of the field.
The formats applicable for data types Number, Amount, Quantity, Rate and Rate Of Exchange are as follows:
Number Data Type and its Formats
The following table shows formats applicable for data type Number with example:
Format |
Value of Field |
Value Returned |
Comma |
1000 (Default) |
1,000 |
No Comma |
1,000 |
1,000 |
Positive/Signed |
1000 (positive number by default) |
(+) 1000 |
Decimal: no of decimals |
1000.19 |
1000.2 (Round off) |
No Zero |
0.00 |
(Blank field) |
Percentage |
1.00 |
1 % |
Bracketed |
1.00 |
(1.00) |
Amount Data Type and its Formats
The following table shows formats applicable for data type Amount along with example:
Format |
Value of Field |
Value Returned |
Comma |
1000 (Default) |
1,000 |
No Comma |
1,000 |
1,000 |
Positive/Signed |
1000 (+ve number by default) |
(+) 1000 |
Decimal: no of decimals |
1000.19 |
1000.2 (Round off) |
DrCr/CrDr |
1000.00 |
1000 Cr |
Symbol/Currency |
1000 |
Rs.1000 |
Show Base Currency |
1000 |
Rs.1000 |
Forex |
1200 |
$1200 if the amount is in foreign |
All Symbols |
1260 |
If the amount is converted to base currency from other currency then value |
No Zero |
0.00 |
(Blank field) |
No Symbol |
1000.00 |
1000.00 |
Bracketed: For Negative |
-100 |
(100) |
Quantity Data Type and its Formats
The following table shows formats applicable for data type Quantity with example:
Format |
Value of Field |
Value Returned |
Comma |
1000 (Default setting of Number Type) |
1,000 |
No Comma |
1,000 |
1,000 |
SDF |
1000 |
1000 for Cr Side -1000 for Dr Side |
Positive/Signed |
1000 (Denotes a positive number by default in Tally) |
+(1000) |
Decimal: No. of Decimals |
1000.19 |
1000.2 (Rounded off) |
DrCr/CrDr |
1000 |
1000.00 Dr 1000.00 Cr |
Units |
750 |
750 kgs, 750 nos depending on the units in which the entries have been passed |
TailUnits |
10 Crtn 5 Box 3 Pcs |
1253 Pcs. Here it shows the least unit(Pcs). All the cartons and boxes get converted into Pcs |
TailUnits:Box |
10 Crtn 5 Box 3 Pcs |
125 Box. All the cartons and pieces get converted to Boxes |
Shortform |
10 Crtn 5 box 3 Pcs |
10-5-3 |
No Compact |
10Crtn 5 box 3 Pcs |
10- 5-3 |
No Zero |
0.00 |
(Blank Field) |
The field format No compact has to be used along with Shortform. Assuming the units of measure are set as 1 Carton = 12 Box and 1Box =10 Nos
Rate and Rate of Exchange Data Type and its Formats
The following table shows formats applicable for data type Rate and Rate of Exchange with example:
Format |
Value of Field |
Value Returned |
Comma |
1000 (Default setting of Number Type) |
1,000 |
No Comma |
1,000 |
1,000 |
Positive/Signed |
1000 (Denotes a positive number by default in Tally) |
+(1000) |
Decimal: No of Decimals |
1000.19 |
1000.2 (Rounded off) |
DrCr |
1000 |
1000.00 Dr/Nos 1000.00 Cr/Nos |
Units |
750 |
750 kgs, 750 Nos |
TailUnits |
10 Crtn 5 Box 3 Pcs |
1253 pcs. Here it shows the least unit(Pcs). All the cartons and boxes get converted into Pcs |
TailUnits:Box |
10 Crtn 5 Box 3 Pcs |
125 Box. All the cartons and pieces get converted to Boxes |
Shortform |
10 crtn 5 box 3 Pcs |
10-5-3 |
No Compact |
10Crtn 5 box 3 Pcs |
10-5-3 |
No Zero |
0.00 |
(Blank Field) |
Calendar Data Type and its Formats
The formats applicable for data types date and Due Date are as follows:
Format |
Value Set in the Field |
Value Displayed after applying Format |
Short Date |
22-Dec-1999 16-Mar-2000 |
22-12-99 16-03-2000 |
Long Date |
22-Dec-1999 |
Wednesday, 22 Dec, 1999 |
Universal Date |
22-12-1999 |
22-Dec-1999 |
Month Beginning |
01-12-1999 04-12-1999 |
Dec – 99 04-Dec-99 |
Month Ending |
31-12-1999 14-12-1999 |
Dec – 99 14-Dec-99 |
All the data types pertaining to date and time are now collectively referred to as Calendar data types, which are as follows:
- Date
- Time
- DateTime
- Duration
- Due Date
Various business functionalities like capturing Date and Time of entering a voucher, calculating the weekly average clock-in time of employees, etc., will be possible in Tally.ERP9.
Apart from the new data types, a few supporting Functions, Formats, Input Keywords and Qualifiers have also given for each. Formats can be specified to indicate the format in which the value has to be displayed.
The concept of Input Keywords and Qualifiers has given to assist the Tally user in data entry operations, as well as to minimize the effort of the programmer in setting the values of any particular calendar data type within a Field.
For example, in a Field of data type ‘Date’, specifying the Input keyword ‘Week’ as the value, will lead to setting of the current week’s beginning date as the value.
Also, Qualifiers like ‘This’, ‘Next’, etc., if specified along with the Input Keywords, will lead to storing and displaying of values determined by the ‘Input Keyword-Qualifier’ combination.
For example, specifying ‘Next Week’ will return the beginning date of the following week as the value.
All of these have been discussed in detail in the following sections.
Date
Specifying the data type as Date indicates that the data container can only hold Date values. The data container can be a UDF, a Variable or a Field. The date values can range from January 1, 1901 to December 31, 9999.
The default separator character within a Date is ‘Hyphen’, e.g., 22-12- 2011.
Example:
[System: UDF]
DateOfPurchase : Date : 1107
/* A new System UDF DateofPurchase of Type Date is declared. */
[Field: Date of Purchase]
Type : Date
Storage : DateOfPurchase
/* A Field DateofPurchase of Type Date is defined for updating values in the UDF DateOfPurchase */
The prefix century behavior has been introduced (when a 2 digit year value is entered by the user) in the Date field.
The century value prefixed by the system will depend upon
- The 2-digit year value passed by the user
- The system year
Thus, the different cases that are possible as follows
Format Keywords
Apart from specifying the Type as Date, one of the various available Formats can also be specified, using the attribute ‘Format’. The various Formatting Keywords for the data type ‘Date’ are listed in the following table. If no Format is specified, the default format ‘Universal Date’ is assumed.
Example
[Field: Date of Purchase]
Type : Date
Storage : DateOfPurchase
Format : “Short Date”
/* The Format specified within the Field DateofPurchase is Short Date, and hence, the date is returned in dd-mm-yyyy format. */
Input Keyword
There are certain Input keywords, which can be specified instead of the date itself. This increases the ease of data entry. The Input Keywords available for the data type Date are as follows:
Example
[Field: Date of Purchase]
Type : Date
Storage : DateOfPurchase
Format : “Short Date”
Set As : TODAY
/* The input keyword Today sets today’s date as the value within the Field Date of Purchase. */
Date Qualifiers
There are also some date qualifiers, which can be used in combination with input keywords, to return the required date value. Qualifiers cannot be used independently, but they can be provided as additional specification for the input keyword.
The various date qualifiers are as follows:
Example
[Field: Date of Purchase]
Type : Date
Storage : DateOfPurchase
Format : “Short Date”
Set As :Last Financial Year
/* In Last Financial Year, ‘Last’ and ‘Financial’ are qualifiers, while ‘Year’ is an Input Keyword. It sets the field value as the 1st day of the last/previous financial year. */
Note: Week is assumed to begin on Sunday. For example, on 20th August, 2013, the value of the Field set as ‘Prev Week’ is returned as 11th August, 2013, which is the Sunday of the week prior to the current week.
Time
A new Data Type Time represents an absolute time of the day. Specifying the Data Type as ‘Time’ indicates that the data container can hold only the Time values. The data container can be a UDF, a Variable or a Field. A value of this data type describes the time, with milliseconds precision, i.e., using the subparts HOURS, MINUTES, SECONDS, and MILLI SECONDS. Thus, the format is hh:mm:ss:MMM
By default, Colon is the separator between the sub-parts of the time value, which can also be altered by the user. For example, 16:35:12:348
Example:
[System: UDF]
TimeOfPurchase : Time : 1108
/* A new System UDF TimeofPurchase of Type Time is declared. */
[Field: Time of Purchase]
Type : Time
Storage : TimeOfPurchase
/* A Field Time of Purchase of Type Time is defined for updating values in the UDF TimeOfPurchase */
Format Keywords
Just as in the case of Date data type, various Formatting Keywords have also been introduced for the Time data type, to render the Time in various formats. The formats are listed in the following table.
Input Keywords
The input Keywords available for the data type Time are as shown in the following table:
DateTime
A new Data Type DateTime has also been introduced. Specifying the Data Type as DateTime indicates that the data container can hold only the values of type DateTime. The data container can be a UDF, a Variable or a Field. A value of data type DateTime represents a date, along with the absolute time of the day. The date and the time are described using the sub-parts DAY, MONTH, YEAR, HOUR, MINUTE, SECOND, and MILLISECONDS. Thus, the format is dd-mm- yy hh:mm:ss:MMM
By default, the separator for the Date part is Hyphen (-) and for the Time part is Colon (:). However, the same can be altered by the user. The date-time combination values can range from January 1,1901 00:00:00:000 to December 31, 2098 23:59:59:999
Example:
[System: UDF]
DateTimeOfPurchase : DateTime : 1109
/* A new System UDF DateTimeofPurchase of Type DateTime is declared. */ [Field: Date and Time of Purchase]
Type : DateTime
Storage : DateTimeOfPurchase
/* A Field DateandTimeofPurchase of Type DateTime is defined for updating values in the UDF DateTimeOfPurchase */
Input Format
Date Only
This Format is specified to accept both Date and Time values in the Field, but display only Date. In other words, if this Format is specified within a field of type DateTime, then the field can accept both Date and Time values, but will display only Date.
For example, consider a Field of Type DateTime, where the Format is specified as ‘Date Only’. If the Input keyword ‘Today’ is entered in this Field, then instead of displaying the current date and time, the field will display only the current date.
Example:
[Field: Date of Purchase]
Type : DateTime
Storage : DateTimeOfPurchase Format : “Long Date, Date Only”
/* Both Date and Time values will be accepted as input in the Field DateofPurchase, but only the Date value will be displayed. */
Time Only
This Format is specified to accept both Date and Time values in the Field, but display only Time. In other words, if this Format is specified within a field of type DateTime, then the field can accept both Date and Time values, but will display only Time.
For example, consider a Field of type DateTime, where the Format is specified as ‘Time Only’. If the Input keyword ‘Now’ is entered in this Field, then instead of displaying the current date and time, the field will display only the current time.
Example:
[Field: Time of Purchase]
Type : DateTime
Storage : DateTimeOfPurchase
Format : “12 hour, Time Only”
/* Both Date and Time values will be accepted as input in the Field
TimeofPurchase, but only the Time value will be displayed. */
Input Keywords
Input Keywords available for the date type DateTime are as shown in the following table:
For the keywords ‘Tomorrow’, ‘Yesterday’, ‘Month’, ‘Week’ and ‘Year’, the time already available in the Field, i.e., the ‘Time’ Part of the DateTime value, is set as the time. If the ‘Time’ value is not available, then it will be set to 0:00.
Date Qualifiers
All the qualifiers for the data type Date are applicable for the data type DateTime as well.
Sub Types for the Data Type ‘DateTime’
Two subtypes have also been introduced for the data type DateTime:
Date
This Subtype is specified to accept both Date and Time values in the Field, but display only Date. In other words, if this SubType is specified within a field of type DateTime, then the field can accept both Date and Time values, but will display only Date.
For example, consider a Field of type DateTime, where the sub-type is specified as ‘Date’. If the Input keyword ‘Today’ is entered in this Field, then instead of displaying the current date and time, the field will display only the current date.
Example:
[Field: Date and Time of Purchase Date]
Type : DateTime : Date
Storage : DateTimeOfPurchase
Time
This SubType is specified to accept both Date and Time values in the Field, but display only Time. In other words, if this SubType is specified within a field of type DateTime, then the field can accept both Date and Time values, but will display only Time.
For example, consider a Field of type DateTime, where the sub-type is specified as ‘Time’. If the Input keyword ‘Now’ is entered in this Field, then instead of displaying the current date and time, the field will display only the current time.
Example:
[Field: Date and Time of Purchase Time]
Type : DateTime : Time
Storage : DateTimeOfPurchase
Here, both Date and Time will be accepted but only the ‘Time’ part of the DateTime value is displayed in the field. Manipulation can be done on date as well as time.
Two fields with subtypes as Date and Time can have the same storage and the changes from one field will be reflected in the other field.
Duration
Values of this data type will represent the interval between two Date and/or Time values (two DateTime values), measured in years, months, weeks, days, hours, minutes, and seconds.
Example:
[System: UDF]
TenureOfService : Duration : 1110 [Field: Tenure Of Service]
Type : Duration
Storage : TenureOfService
/* A Field TenureOfService of Type Duration is defined for updating values in the UDF TenureOfService */
Formats
The format options available for the Duration data type are:
Example:
[Field: Tenure Of Service]
Type : Duration
Storage : TenureOfService
Format : “Months, Days”
Points to Remember
- Any combination of the formats can be provided. However, Week is an independent format and cannot be clubbed with any other. Let’s see the following examples:
-
- In the above example, if the value entered by the user in the Field is 100, then the lowest (in terms of duration) of the formats specified will be considered as the input format, e. 100 will be considered as 100 days and then, the same will be displayed as output in terms of months and days, i.e., 3 months and 10 days.
- If the Format is specified as ‘Weeks, Days’, then the value returned will be in Days, as ‘Weeks’ is an independent entity and cannot be clubbed with any other
- If the value entered is less than the lowest value (in terms of duration) among the format specified, then the value returned will be For example,
- If 6 days is entered and the format is weeks, then the value returned will be 0 weeks.
- If 8 days is entered and the format is weeks, then 1 week will be displayed.
Due Date
The values of Data Type Due Date are used to represent the Due Date in cases like Purchase Order, Bill Credit Period, etc., in TallyPrime. These values actually comprise of two date values, e., the From Date and the last date by which honoring of the commitment is due (i.e., the due date). A flexible range of values can be specified. The value can be a Date (the ‘due date’) or the Duration, in terms of Days, Weeks, Months and Years, from the starting date (‘From’ date). The acceptable duration values used to specify the due date range from 0 to 89 years.
Input Formats
Four input formats can be specified for values of data type Due Date. If no input format is specified, then the default format Days is considered.
As the default format is ‘Days’, on entering only the number 30, 30 days will be considered. The value is displayed in the same format in which it has been entered.
Compatibility of data type ‘DateTime’ with data types ‘Date’ and ‘Time’
- Setting a data container (Field, UDF or Method) of type Date OR Time with a value of data type DateTime is possible. For example, if the value of a field of type Date or Time is set by referring to another field of type DateTime, the particular date value OR time value is taken, respectively, and the same is displayed in the Field.
Example:
[Field: Date of Purchase]
Type : Date
Storage : DateOfPurchase Format : “Long Date”
Set as : #DateandTimeOfPurchase
In this example, Date and TimeOfPurchase is a Field containing a value of type DateTime.
When this field is being referred to in the Field Date of Purchase of type Date, the ‘Date’ part of the value is extracted and set as the value of the field.
- Date and Time functions can be used on a value of type DateTime. The vice versa is also true, e., DateTime functions can also be used on a value of type Date or Time.
Example:
$$DayOfWeek:$DateTimeOfPurchase
/* Date function is used on method value of type DateTime */
$$DayOfDate:#DateandTimeOfPurchase
/* Date function is used on field value of type DateTime */
$$Time:#DateandTimeOfPurchase
/* Time function is used on field value of type DateTime */
$$DateTime:#DateOfPurchase
/* DateTime function is used on field value of type Date */
Constraints and Assumptions for Calendar data types TIME
- Data Type Time currently does not support time
- Data Type Date is independent of the Data Type Time. This means that if the time is changed from PM to AM, or vice versa, the Date does not
- Time is cyclic in nature, e., if 12 hours are subtracted from 1 am, it results in 1 pm.
DATETIME
- In a field of type DateTime, for entering the time value, date must be entered first.
-
When a value of type Date is converted to type DateTime, then default value of time is taken as 0:00.
- When a value of type Time is converted to type DateTime, then the default value of Date is assumed as the current date.
DURATION
- In Duration data type, if no unit is specified, then it is by default taken as days. For example, in a Field of type ‘Duration’, if the value entered is 10, then it is considered as 10 days.
- Negative Duration is not
COM Support to Calendar Data Types
COM support has been extended for two other data types, viz., Time and DateTime.
Data Conversion (Type Casting)
Data conversion refers to changing one data type to the other. Converting the data of a given type into another type is known as type-casting. Type casting is required when an expression data is a combination of different data types. Each programming language has its own rules on how types can be converted. Data conversion can be Implicit or Explicit.
Implicit Data Conversion
Implicit data conversion is done automatically by the language compiler. In a mixed-type expression, data of one or more subtypes can be converted to a super type as needed at runtime so that the program will run correctly. Implicit conversion can occur from all data types to string data type.
Consider following Examples:
Example:
[Field: Field1]
Type : String
Set As : 12345
The number is implicitly converted to String and will be displayed.
Example:
[Field: Clg Bal]
Type : Number
Set As : “1000”
In the above case the string 1000 will be automatically converted to number.
The following table shows the implicit conversion for simple data types based on the value specified in the field using Set As attribute and the data type of the field specified using Type attribute.
Set As Type |
Number |
Amount |
Rate of Exchange |
Quantity |
Rate |
Date |
Due- Date |
String |
Logical |
String |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Number |
Yes |
Yes |
Yes |
Yes |
Yes |
No |
Yes |
Yes |
No |
Date |
No |
No |
No |
No |
No |
Yes |
Yes |
Yes |
No |
Logical |
Yes |
No |
No |
No |
No |
No |
No |
Yes |
Yes |
- Implicit conversion happens from Amount, Rate Of Exchange, Quantity and Rate to Number data type when a method returning value in respective data type is used in Set As Otherwise an empty field is displayed.
Example:
[Field: NoToAmt]
Type : Number
Set As : $ClosingBalance
- When the string specified in a Date field is in date format acceptable by TallyPrime like “06/06/2011”, “6-Jun-2011” etc. then implicit conversion is done.
Example:
[Field: StrToDate]
Type : Date
Set As : “6-Jun-2011”
- In the Logical field, ONLY the number 0/1 are acceptable for No/Yes respectively. If any other number is specified as value for a Logical field then an empty field is displayed.
Example:
[Field: NoToLogical]
Type : Logical
Set As : 0
- When the string specified in a Logical field is any one of these True, False, On, Off, Yes, No then implicit conversion is done.
Example
[Field: StrToLogical]
Type : Logical
Set As : “True”
Explicit Data Conversion
Explicit data conversion is required when the data types can not be converted implicitly. For example, converting string type to Amount needs explicit conversion. TDL provides different functions to support data conversion e.g., $$AsAmount, $$AsQty, $$AsRate, $$Inwords, $$Number, $$String etc. The function $$Date is used to convert string data to date.
Syntax
<Conversion Function> : <Value>
Example:
[Field: Clg Bal]
Type : Amount
Set As : $$AsAmount:“Rs.1000”
1,000.00 is displayed in the field as a result of above code assuming that rupees is a valid currency in the current company. By default for the data types Amount and Rate the conversion is done based on the Base currency and currencies set for the selected company; whereas for Quantity data type conversion depends on the unit of measure of the selected stock item.
Example:
[Field: Clg Bal]
Type : Amount
Set As : $$AsAmount:“1000”
1,000.00 is displayed in the field as a result of above code and by default the currency is considered as base currency of the current company.
Operators in TDL
Operators are special symbols or keywords that perform specific operations on one, two or three operands and then return a result.
The types of operators in TDL are as follows:
- Unary Operators
- Arithmetic Operators
- Logical Operators
- Comparison Operators
- String Operators
Unary Operators
The two unary operators supported by TDL are: – and %. % is used to specify the dimension in percentage of page or screen. It is also used as pattern matching character.
Syntax
<operand 1> %Screen/Page
Example:
[Part: Title]
Width : 20 %Screen
This will allocate 20% of the screen space as width to the given Title part. ‘%’ as pattern matching character means any character any number of times.
Syntax
%<String Value>
Example:
[Field: Test Fld]
Set As : If @@CMPMailName LIKE “%Ltd.” Then “Limited Company” + Else “Public Company”
–: It negates the value of its operand. The data type of the result is same as its operand.
Syntax
– <Operand>
Example:
[Field: Test Fld]
Use : Number Field
Set As : -100
Arithmetic Operators
The arithmetic operators supported by TDL are + (Addition), – (Subtraction), / (Division) and* (Multiplication).
+ Addition
_ Subtraction
/ Division
* Multiplication
+ : The addition operator is used to add the two operands on either side of the operator.
Syntax
<operand 1> + <operand 2>
Example:
12345 + 6789
This will give the result as 19134.
–: The subtraction operator is used to subtract the second operand from the first operand.
Syntax
<operand 1> – <operand 2>
Example:
12345 – 6789
This will give the result as 5556.
* : The Multiplication operator is used to multiply the two operands on either side of the operator.
Syntax
<operand 1> * <operand 2>
Example:
12345 * 6789
This will give the result as 83810205.
/ : The Division operator is used to divide the first operand by the second operand.
Syntax
<operand 1> / <operand 2>
Example:
12345/6789
This will give the result as 1.89.
Logical Operators
The logical operators used are:
OR Returns True if either of the operand is True
AND Returns True when both the operands are True
NOT Returns True if the operand value is False and False when operand value is True
TRUE/ON/YES Can be used to check if the value of the operand is True.
FALSE/OFF/NO Can be used to check if the value of the operand is False.
OR : Evaluates <operand1> and returns true if the operand evaluates to true. If <operand1> evaluates to false, <operand2> is evaluated. If
<operand2> evaluates to false, the final result is false; otherwise, it is true.
The result is true if either or both operands evaluate to true; the result is false only if both operands evaluate to false. The OR operator can be used with any number of operands; if any operand evaluates to true, the result is true.
The final value can be evaluated based on the following Table:
<Operand 1> |
<Operand 2> |
OR |
False |
False |
False |
True |
False |
True |
False |
True |
True |
True |
True |
True |
Example:
[System: Formula]
Explodable : $$KeyExplode OR @@FlagExplode
The value of Explodable is TRUE is any of the two argument returns the value as TRUE otherwise the value is FALSE.
AND : Performs an operation on the values of one or both of the operands. Evaluates <operand1> and returns false if the operand evaluates to false. If <operand1> evaluates to true, <operand2> is evaluated. If <operand2> evaluates to true, the final result is true; otherwise, it is false. And operator can be used with any number of operands; the result is true only if all the operands are true else it is false.
<Operand 1> |
<Operand 2> |
OR |
False |
False |
False |
True |
False |
False |
False |
True |
False |
True |
True |
True |
Syntax
<Operand 1> AND <Operand 2>
Example:
[System: Formula]
IsBatchWiseOn : $IsBatchWiseOn AND $$IsBatchWiseOn
The value of the formula IsBatchwiseOn is set to true only if the values of method $IsBatchWiseOn and function $$IsBatchWiseOn both are true otherwise false is set.
! / Not : the Not operator reverses the value of the operand. If operand is a value is true, the value of !<operand> is false. In short NOT TRUE returns false and NOT FALSE returns true.
The final value can be evaluated based on the following Table:
<Operand> |
NOT |
False |
True |
True |
False |
Syntax
NOT <operand> / !<operand>
Example:
[System: Formula]
SimpleCompany : NOT $IsAggregate
The value of the formula SimpleCompany is true if the value of Method $IsAggregate is false.
True/On/Yes: Any of the keyword True/ On /Yes can be used in the conditional operands as it is or for comparing values.
Syntax
TRUE/On/Yes
Example:
[Field: MyField]
Type :Amount
Set As : If True Then $$AsAmount:“Rs.1000” Else $$AsAmount:”500”
The 1,000.00 is displayed in the field as a result of above code.
False/ Off/ No: Any of the keyword False/ Off / No can be used in the conditional operands as it is or for comparing values.
Syntax
FALSE/Off/No
Example:
[Field: MyField]
Type : Amount
Set As : If False Then $$AsAmount:”Rs.1000” Else $$AsAmount:”500”
The 500.00 is displayed in the field as a result of above code.
Comparison Operators
A comparison operator compares its operands and returns a logical value based on whether the comparison is true. The comparison operator returns value as true or false. TDL supports following comparison operators:
= /Equal/ Equals
Checks if the values of both the operands are equal.
< / Less Than / Lesser
Checks if the value of the <operand 1> is less than the value of <operand 2>
> / Greater Than/ More
Checks if the value of the <operand 1> is greater than the value of <operand 2>
In
Checks if the value is in the List of comma separated values
Null
Checks whether the operand is Empty
Between…And
Checks if the operand value is in the range
= /Equal/ Equals
The value TRUE is returned if both the operands are equal.
Syntax
<operand 1> =/Equals/Equal <operand2>
Example:
Break On : $$Line = 1
My Formula : $BasicTypeOfDuty:Ledger:$LedgerName Equals +
$$LocaleString:“Sales Tax”
< / Less Than / Lesser Than / Lesser
The value TRUE is returned if the <operand1> is less than the <operand2>.
Syntax
<operand 1> </Less Than/Lesser <operand2>
Example:
$$Line < $$NumItems:AllLedgerEntries
>/ Greater Than/ More
The value TRUE is returned if the <operand1> is greater than the <operand2>.
Syntax
<operand 1> >/Greater Than/More <operand2>
Example:
$$Line > $$NumItems:AllLedgerEntries
In
The value TRUE is returned if the <operand1> is in the List of comma separated values, otherwise FALSE is returned.
Syntax
<operand 1> In (<list of values>)
Example:
Set As: If #Myfield IN (100,200,300) then 200 else 500
Null:
The value TRUE is returned if the <operand1> is empty, otherwise false is returned.
Syntax
<operand 1> Null
Example:
Set As: If #Myfield Null Then 200 Else 500
Between …. And:
The Between … And operator returns True, if the value of <operand> is between <Lower limit> and <Upper Limit> (inclusive); otherwise, it returns False. The Not logical operator can be included to evaluate the opposite condition.
Syntax
<operand> Between <Lower limit> And <Upper Limit>
Example:
If #Myfield Between 50 And 150 Then 200 Else 500
String Operators
A string operator allows comparing two strings. The following are the string operators:
Contains/ Containing
Checks if the operand contains given string
Starting With/ Starting
Checks if the operand starts with the given string Beginning With/ Starting
Ending With/ Ending
Checks if the operand ends with given string
Like
Checks if the operand matches with the given string pattern
Contains/ Containing
The string operator Contains alias Containing returns Yes if the <operand1> string has a string <operand2> else No is returned.
Syntax
<operand1> Contains/Containing <operand2>
Example:
Set As: “Hello TDL” Contains “TDL”
Starting With/ Beginning With/ Starting
The string operator Starting with alias Beginning With returns Yes if the <operand2> starts with <operand1> string else No is returned.
Syntax
<operand1> Starting With/Starting/Begins <operand 2>
Example
Set As: If “TDL World” Starting with “TDL” Then “TDL” Else “World”
Set As: If “TDL World” Beginning “TDL” Then “TDL” Else “World”
Ending With/ Ending
The string operator Ending With alias Ending returns Yes if the <operand2> ends with <operand1> string else No is returned.
Syntax
<operand1> Ending With/Ending <operand 2>
Example:
Set As: If “World TDL” Ending with “TDL” Then “TDL” Else “World”
Like
Like operator uses % as a pattern matching character. % means zero or more characters.
Syntax
<operand1> Like <%operand 2>
Example
Set As: If $Name Like “%Party” Then “Debtors” Else “Creditor”
The operator = is a comparison operator, not assignment operator. There is no assignment operator in TDL.
Operator Precedence
The expression value is evaluated based on the following operator precedence:
- Arithmetic Operator
- Division or Multiplication
- Addition or Subtraction
- Logical Operators
- NOT
- AND
- OR
- Comparison Operators
The precedence is in the order of their appearance in the expression.
4. String Operators
- The precedence is in the order of their appearance in the expression.
- The default operator precedence can be overridden by enclosing the expression in Brackets/parenthesis.
- The expression in parenthesis is evaluated first.
Data Types Supported by Arithmetic Operators
The arithmetic operators + (Addition), – (Subtraction), / (Division) and * (Multiplication) are applicable to all Data Types.
The following table specifies the data types of two operands and whether arithmetic operations can be performed or not:
Operand 1 Operand 2 |
Number |
Amount |
Rate of Exchange |
Quantity |
Rate |
Date |
Due- Date |
Number |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Yes |
Amount |
Yes |
Yes |
Yes |
Yes |
Yes |
No |
No |
RateEx |
Yes |
Yes |
Yes |
No |
No |
No |
No |
Qty |
Yes |
Yes |
No |
Yes |
Yes |
No |
No |
Rate |
Yes |
Yes |
No |
Yes |
Yes |
No |
No |
Date |
Yes |
No |
No |
No |
No |
No |
Yes |
Due Date |
Yes |
No |
No |
No |
No |
Yes |
Yes |
- For data type Date, ONLY addition and subtraction is supported.
- For the data type String, ONLY addition is supported
Expressions in TDL
A TDL expression is a combination of an operand and operator, where an operand can be either a field/variable value, method/function/formula evaluation result, constant/keyword/identifier. In the expression a constant can be of type String, Logical or Number. The compound data types i.e., Date, Quantity, Amount and Rate are not supported as Constants. The keywords used in the expression can be any of the pre-defined values and the identifier always accepts a name of the definition which can be in turn derived from an expression. The detailed explanation on expressions is available in the topic Symbols and Prefixes.