Trending December 2023 # What Are Actions, Events, Buttons And Keys In Tdl? # Suggested January 2024 # Top 21 Popular

You are reading the article What Are Actions, Events, Buttons And Keys In Tdl? updated in December 2023 on the website We hope that the information we have shared is helpful to you. If you find the content interesting and meaningful, please share it with your friends and continue to follow and support us for the latest updates. Suggested January 2024 What Are Actions, Events, Buttons And Keys In Tdl?


In this topic, we will begin our discussion by understanding the meaning of an action and the various types of actions available. As we progress, we will have a detailed conceptual understanding on the usage of various widely used events available in TDL also will discuss the key definition and its various attributes in detail.

Actions are activators of a specific task with a definite result. An action always originates from a User Interface Object like Menu, Form, Line or Field.

Watch the below video to know about basic Actions in TDL.

Watch the below videos to know about Action Attributes and Event Framework.

Actions can be classified into two broad categories, viz

Global Actions

Object Specific Actions  

Global Actions are not specific to any User Interface Object. For example, Display, Create, Execute, Alter, etc., are Global Actions. They perform the action specified, irrespective of the UI Object. Global Actions are performed on a Report or a Menu.

Object Specific Actions are actions which can act only upon specific UI Objects. For example, Line Down is a part-specific action, since part owns multiple lines and an individual Line cannot move the current focus to the subsequent line. Only the part can move the focus to the subsequent line. Object specific actions are performed on relevant user interface objects.

Global Actions

Object Specific Actions

Global Actions are not specific to any User Interface Object

These Actions are specific to a User Interface Object

Can be originated by a Menu, Button/Key or a Field

Can be originated by a Menu, Form, Line or a Field

Performed on a Report or a Menu

Performed on the relevant Interface Object

Example: Create, Display, Alter, Print, Print Report, Modify Object, Display Collection, etc.

Example: Line Up, Line Down, Explode (‘Line’ Object), Form Accept, Form Reject (‘Form’ Object), etc.

As discussed, Global Actions are not specific to any UI Object. Global Action provides an indication to the TDL Interpreter as to which specific task should be executed to fulfill the user requirements. Global Actions are mainly performed on three principal definition types, namely Report, Collection, and Menu. Some frequently used Global Actions are discussed below:

The action Menu acts only on the Menu definition, and vice versa. The value of the Menu action must be a Menu name. This Menu has to be further defined to list the items displaying another Menu or a Report. A Menu definition continues until all the items are used to display Reports, and there are no further Menu actions assigned to the final Menu items.

Example: 1

[#Menu : Gateway of Tally]

Add : Key Item : Sample Item : F : Menu : Sample Final Accounts

[Menu : Sample Final Accounts]

Add : Key Item : Trial Balance : T : Display : Trial Balance

Add : Key Item : Profit & Loss : P : Display : Profit and Loss

Add : Key Item : Balance Sheet : B : Display : Balance Sheet

In this example, the default menu Gateway of Tally is altered to add a new item Sample Item, with the Menu action displaying the Sample Final Accounts sub-menu. It displays all components of Final Accounts, i.e.,

Trial Balance

Profit & Loss

Balance Sheet

All the items used the action Display . Hence, no further Menu definition is required.

As seen in the previous topic Objects, Methods and Collections, the action Display takes the Report name as its parameter, and is used to display the reports, as is specified.

Example: 2

[Button : Final Accounts]

Key       : F5

Action    : Menu : Sample Final Accounts

[#Menu : Gateway of Tally]

Buttons   : Final Accounts

[#Form : Group Summary]

 Buttons  : Final Accounts

[Button : Balance Sheet]

 Key       :   F6

 Action    :  Display : Balance Sheet

[#Form : Group Summary]

 Button   : Balance Sheet

[#Menu : Display Menu]

 Button   : Balance Sheet

In this example:

A new button Final Accounts is added to activate a menu Sample Final Accounts, which is attached to the default menu Gateway of Tally.

The button Final Accounts cannot be attached to a report, since a menu cannot be acted upon in a report. In the example, the button Final Accounts is attached to form Group Summary, which is incorrect since the menu cannot be called from a Report.

Another button Balance Sheet is added to display report Balance Sheet which is enabled in all reports, using form Group Summary, and also in the menu Display menu.

The button Balance Sheet can be attached to a report as well as to a menu, since the report can be acted upon by a report as well as a menu.

This action alters the methods of an object at any level in object hierarchy. It supports modifying multiple values of an object by specifying a comma-separated list of Method: Value pairs.



For more details, refer to the topic Objects and Collections .

A single Modify Object action cannot modify methods of multiple primary objects, but can modify multiple values of an object.

Modify Object is allowed to have primary object specification only once, i.e., for the first value. Further values permissible are optional in the sub-object and method specification only.

From the second value onwards, sub-object specification is optional. If sub-object specification is specified, the context is assumed to be the primary object specified for first value. In the absence of sub-object specification, the previous value specification’s leaf object is considered as the context.

Example: 1

[Key : Alter My Object]

Key    : Ctrl + Z

Action : Modify Object : (Ledger,”MyLedger”).BillAllocations [First, + $Name=”MyBill”].OpeningBalance : 100,Address[Last].Address :”Bangalore”

The existing ledger My Ledger is being altered with new values for the opening balance for the existing bill and Address . The key alter my object can be attached to any menu or form.

Example: 2

[Key : Alter My Object]

    Key        : Ctrl + Z

 Action      : Modify Object :(Ledger,”MyLedger”).BillAllocations[1].OpeningBalance :1000,+

Name: ”My New Bill”,..Address[First].Address :”Hongasandra Bangalore”, Opening Balance:5000

The existing ledger My Ledger is being altered with new values for the opening balance applicable on the existing bill, opening balance of the ledger, and the first line of the address . The key Alter My Object can be attached to any menu or form.

A button bearing the action Modify Object, if associated at menu definition, requires a primary object specification as menu, which is not in the context of any data object.


[#Menu : Gateway of Tally]

Add : Button : Alter My Object

The following points should be considered while associating a key with the action Modify Object:

Since the menu does not have any info objects in context, specifying primary object becomes mandatory.

Since menu cannot work on scopes like selected, unselected, and so on, the scopes specified are ignored.

Any formula specified in the value and evaluated, assumes menu object as requestor.

Even method values pertaining to company objects can be modified.

A button can be added in the menu to specify the action Modify Object at the Menu level.

The action Browse URL is used to provide a link to any web browser, with a URL formula passed as a parameter.



The actions Create and Alter act only upon the report definition. These actions activate the report in create or alter mode. In other words, the report is started in the edit mode. In the case of create action, the user enters the report in order to add values, whereas in the case of alter, the user enters the report to modify the already created values.

These actions help the user to key in the relevant values. The values thus entered may or may not be stored. The treatment of values depends on need. The values thus entered in the report by the user, if required to be retained, can be stored as a part of Tally database or configuration file.

As discussed in the topic on Variables, all the persistent variable values can be stored in a configuration file chúng tôi  for subsequent sessions.

The values entered in the report can also be stored as a part of the Tally database.

To store the values as a part of Tally database, the report must be associated with a data object. For example, group, ledger, voucher, etc., are some of the data objects available in Tally.

For instance, in order to design an interface to create a Ledger:

The object Ledger must be associated to the report using report attribute Object

Values entered by the user in the fields within the report must be stored in relevant methods using field attribute Storage


[#Menu : Gateway of Tally]

Add   : Key Item : Ledger Creation : L : Create : Create Ledger

[Report : Create Ledger]

Form  : Create Ledger Object : Ledger

[Form : Create Ledger]

Parts : Create Ledger

[Part : Create Ledger]

Lines  : Store LedgerName, Store LedgerGroup

[Line : Store LedgerName]

Fields : Short Prompt, Name Field

Local  : Field : Short Prompt : Info : “Name :”

Local  : Field : Name Field : Storage : Name

[Line : Store LedgerGroup]

Fields : Short Prompt, Name Field

Local  : Field : Short Prompt : Info : “Under :”

Local  : Field : Name Field : Storage : Parent

Local  : Field : Name Field : Table : Group

In this example:

The default menu Gateway of Tally has been altered to add a new item Ledger Creation, which allows the user to create a Ledger.

Report create ledger associates the object ledger to it, which indicates that the report is meant for creating an instance of the object Ledger.

Name and group of the ledger are stored in internal methods Name and Parent.


[Button : My Reco Button]

Key    : Alt + F5

Action : Alter : Bank Recon

Title  : “Reconcile”

[Form : My Bank Vouchers]

Button : My Reco Button

In this example:

Button My Reco Button is defined with alter action to alter the report Bank Recon on pressing the Alt + F5 key. It is used for entering dates in the report Bank Reconciliation.

The button My Reco Button is associated with the form My Bank Voucher.


[#Menu : Gateway of Tally]

Add    : Key Item : Ledger Display : L : Display : My Ledger

[Report : My Ledger]

Form   : My Ledger

[Form : My Ledger]

Parts  : My Ledger

Height : 100% Page

Width  : 100% Page

[Part : My Ledger]

Lines  : My Ledger

Repeat : My Ledger: Ledger

Scroll : Vertical

[Line : My Ledger]

Fields : My Ledger

[Field : My Ledger]

 Variable : Ledger Name

Alter  : Create Ledger

In the example,

Two default keys are associated to a line definition, that allows a selection of any of the lines, from the set of repeated lines.

Action associated with these keys is Alter object, which means that on hitting the key, the object associated with the current Line must be altered.

Mode: Display specified in the keys signifies that current report must be in display mode.

Alter action used at the Field definition prompts the report from being activated on the current field, which must be in alter mode.

A menu item can be used to create objects in a collection with the action Create Collection. This action is generally used for creation of masters such as groups, ledgers, stock items, voucher types, etc. Create Collection fetches a report through the defined collection. A report displayed through this action is displayed in create mode.


[#Menu : Gateway of Tally]

Add : Key Item : Ledger : L : Create Collection : Ledger

One can also use the action Create in place of Create Collection, to create objects in a collection. The only difference is that Create explicitly calls a report and Create Collection requires a collection. Create Collection executes the same report through the defined Collection.

A menu item or a button can be used to display a popup of object names in a collection, which in turn, can trigger a report. On choosing an object from the popup, a report in display mode is triggered by the action Display Collection. This action can be used for displaying the masters or reports pertaining to groups, ledgers, stock items, etc.


[#Menu : Gateway of Tally]

Add : Key Item : Ledger : L : Display Collection : Ledger

Though the action name is Display Collection, Display is meant for the subsequent report, which will be displayed on the selection of an object. Here, the report is in display mode.

The action Alter Collection is similar to Display Collection , but it triggers the report in alter mode. This action is generally used to alter the masters such as groups, ledgers, stock items, voucher types and so on.


[#Menu : Gateway of Tally]

Add : Key Item : Ledger : L : Alter Collection : Ledger

Though the action is Alter Collection, Alter is meant for the subsequent report, which will be displayed on the selection of an object. Display Collection, Create Collection and Alter Collection routes the final report through a collection. Let us understand some critical attributes required to achieve these actions.

Some of the Object Specific actions are discussed in this section:

The actions Menu Up, Menu Down, Menu Reject, etc., act upon menu. They are associated to all menus (default as well as user defined TDL) through the declaration.


[Key : Menu Up]

Key    : Up

Action : Menu Up

[Key : Menu Down]

Key    : Down

Action : Menu Down

[Key : Menu Reject]

Key    : Esc

Action : Menu Reject

[System : Menu Keys]

Key    : Menu Down, Menu Up, Menu Reject

[System: Menu Keys] declares a list of keys commonly required for a menu. Since all common menu operations like Scroll Up, Scroll Down, Drill down, etc., are declared here, a new menu added does not require these keys to be associated, as they are inherited from above declaration.

Actions Form Accept, Form Reject, Form End, etc., act upon form. They are associated to all forms (default as well as user defined TDL) through the declaration [ System: Form Keys ].

Action Form Accept saves the current form.

Action Form Reject rejects the current form, i.e., the current form is quit without saving.


[Key : Form Accept]

Key    : Ctrl + A

Action : Form Accept

Mode   : Edit

[Key : Form Display Reject]

Key    : Esc

Action : Form Reject

Mode   : Display

[Key : Form End]

Key    : Ctrl + End

Action : Form End

[System : Form Keys]

Key   : Form Accept, Form Display Reject, Form End

[ System: Form Keys ] declares a list of keys commonly required for a report. Since all common form operations like Save Form, Reject Form, Form End, etc., are declared here, a new form added does not require these keys to be associated, as they are inherited from above declaration.

The actions Part Home, Part End, Part Pg Up, etc., act upon a Part. These keys are associated with all the forms (default TDL codes as well as user defined TDL codes) through the declaration [ System: Form Keys ].

Action Part Home positions the cursor to the beginning of the current part.

Action Part End positions the cursor to the end of the current part.

Action Part PgUp is used to quickly scroll the page to view the previous page.


[Key : Part DisplayHome]

Key     : Home

Action  : Part Home

Mode    : Display

[Key : Part Display End]

Key     : End

Action  : Part End

Mode    : Display

[Key : Part Display PgUp]

Key    : PgUp

Action : Part PgUp

Mode   : Display

[System : Form Keys]

Key : Part Display Home, Part Display End, Part Display PgUp

[System: Form Keys] declares a list of keys commonly required for a part. Since all common like Part Home, Part End, Part PgUp, etc., are declared here, a new part added does not require part operations these keys to be associated, since they are inherited from the above declaration.

Line Actions – Explode, Display Object, Alter Object, etc., act upon a Line.

Action Explode explodes a line further to display all the explode details specified in the line attribute explode.

Action Display Object is used to display the object in context of the current line.

Action Alter Object is used to alter the object in context of the current line.


[Key : Line Explode]

Key    : Shift + Enter

Action : Explode

[Key : Line Object Display]

Key     : Enter

Action  : Display Object

Mode    : Display

[Key : Line Object Alter]

Key     : Ctrl + Enter

Action  : Alter Object

Mode    : Display

[System : Form Keys]

Key     : Line Explode

Key     : Line Object Display, Line Object Alter

[ System: Form Keys ] declares a list of keys commonly required for a Line. Since all common Line operations like Explode, Display Object, Alter Object, etc., are declared here, a new line added does not require these keys to be associated, as they are inherited from the above declaration.

The actions Field Copy, Field Paste, Field Erase, Calculator, etc., act on fields.

Action Field Copy copies the current field (field where the cursor is positioned) contents in the OS clipboard, which will be available later.

Action Field Paste pastes the clipboard contents to the current field.

Action Field Erase is used to erase the contents of the current field at a stretch, without hitting the Backspace or Delete key.

Action Calculator is used for fields that require some computation, the result of which is to be returned to the field. Fields taking amounts/numbers as value require this action.


[Key : Field Copy]

Key    : Ctrl + Alt + C

Action : Field Copy

[Key : Field Paste]

Key    : Ctrl + Alt + V

Action : Field Paste

[Key : Field Erase]

Key    : Esc

Action : Field Erase

Mode   : Edit

[Key : Calculator]

Key    : Alt + C

Action : Calculator

Mode   : Edit

[Field : NumDecimals Field]

Key    : Calculator

[System : Form Keys]

Key    : Field Erase

Key    : Field Copy, Field Paste

[ System: Form Keys ] declares a list of keys that are commonly required for any field. Since all the common field operations like Field Copy, Field Paste, Field Erase, etc., are declared here, a new field added does not require these keys to be associated, since they are inherited from the above declaration. The Action Calculator is not required for all the fields; hence, it has not been declared in form Keys usage List. It has been associated to the fields where it is required. In the above example, NumDecimals field is a numeric field that may require calculations. Therefore, the Calculator key, associating the action Calculator, is attached to the field.

The action Do If which was used only as procedural action has been enhanced to support conditional action execution in other definitions like button. Do If is a system action and it executes the given action when the condition evaluates to True.



Example 1: Do If in function definition

[Function: MastersCount]


001 : Do If: (##MasterType = “Group”):Increment : GroupCount

002 : Do If: (##MasterType = “Ledger”):Increment: LedgerCount

Example 2: Do If in button definition

[Button: CreateMaster]

Title    : $$LocaleString:”Create Master”

Key      : Alt+F4

ActionEx : Group : Do If:(##MasterType = “Group”) : Create : Group

ActionEx : Ledger: Do If:(##MasterType = “Ledger”): Create : Ledger

In this example, if the value of the variable MasterType is group it opens the default group creation screen, otherwise it opens the ledger creation screen.

Prior to Do If, the conditional action execution was possible using Switch/Option in button definition. Using the action Do If, reduces the number of lines in the code.

Example: Conditional action using Option

[!Form: Contra Color]

Local: Button: Print Button: Option: Vch Print: $$InCreateMode

Local: Button: Print Button: Option: Vch Chq Print: $$InAlterMode

[!Button: Vch Print]

Action: Print Report

[!Button: Vch Chq Print]

Action : Call : Voucher Printing

Example: Conditional actions using ActionEx

[!Form: Contra Color]

Local: Button: Print Button: Add: ActionEx: CreateMode:Do If: $$InCreateMode:Print Report

Local: Button: Print Button: Add: ActionEx: AlterMode:Do If: $$InAlterMode:Call:Voucher Printing

Any Action is always executed with respect to two contexts:



The Originator is one that originates the action, viz., menu, form, line, or field, e.g., a Down Arrow key pressed. The event is passed from the current report to the associated form, parts, lines, or fields. keys could be associated in menu, form, line or field. If the activated key is found in form, it searches further for line Association and then continues till field. The lowest level key association gets the highest precedence. If the key is associated at form as well as field, the key association at field level gets executed. In this case, the field is the Originator.

The Executer is one on which the action is executed. For example, form accept key, though attached at field Level, is a form action. Hence, form is the executer of the action. In case of execution, it searches from report to the field for the action to be executed. Line Down is a part level action. Though associated at the form, it will be executed by the part to move the current focus to the subsequent line. Hence, part is an executer of the Action Line Down.



The Originator initiates the action by associating the key or a button

The Executer executes the action associated with the key or button, initiated by originator.

Global Actions can be originated by Menu, Button/ Key or a Field, and Object Specific Actions by a Menu, Form, Line or a Field

Global Actions are executed by the originator object. However, Object Specific Actions can be executed by objects other than originator

The sequence followed to gather all Keys originating within a report is top to bottom, i.e., from report to field definition. The lowest in the hierarchy gets highest precedence, e.g., if the same key is associated at both form and field definitions, the key at field definition is considered for execution.

The sequence followed to consume the keys originated is from bottom to top, i.e., from a field to a report definition. In other words, the lowest in the hierarchy gets the highest preference, e.g., if the same key is relevant for both part and line definitions, the key will be executed in context of the line definition.

Example 1

[Key: Create Ledger]

   Key      : Alt + C

   Action : Create : Ledger

[Field: CST Supplier Ledger]

   Key : Create Ledger

Associating the key with the field, field is the originator as well as exe­cuter here.

Example 2

[Key: Part Display PgUp]

Key     : PgUp

Action : Part PgUp

[System: Form Keys]

 Keys : Part Display PgUp

Key Part Display PgUp is originated by form, but its executer is the part.

Action association at Menu definition is done through the menu item. Every menu item except Quit is associated with an action. If an item is added without any action, then the default action associated is to exit from the current menu.




[Menu: Commonly Used Reports]

Add : Key Item : Trial Balance : T : Display : Trial Balance

Add : Key Item : At Beginning : Outstandings : O : Menu : Outstandings

In this example, a Menu Commonly Used Reports is defined with 2 Items, viz.,

 An Item Trial Balance is added displaying the default report Trial Balance. Here, the action is display, so the Action Value has to be a Report Name.

An Item Outstandings is added at the beginning to activate another Menu Outstandings. The action here is Menu, so the Action Value required is a Menu Name.

Action association at Button/Key definition is done using the attribute Action , followed by the Action Keyword, with the parameters, if required.



Example: Actions with Parameters

[Button : Outstandings]

Key    : F5

Action : Menu: Outstandings

[Button : Trial Balance]

Key    : F6

Action : Display : Trial Balance

Action Menu requires a Menu Name as Parameter and Actions Create, Display,  Alter, etc., require a Report Name.

Example: Actions without Parameters

[Button : Printing Button]

Action : Print Report

[Button : Exporting Button]

Action : Export Report

Action Parameters for the Actions Print Report and Export Report are not mandatory. If the Action Parameter is specified, then it prints the specified Report, else it prints the current Report.

Action association at Field is done using Action keyword with parameters and optional condition.




[Field : My Trial Balance]

Display : Group : $$IsGroup

Display : Ledger : $$IsLedger

In this example, the Field Trial Balance has 2 statements, viz.,

Displaying a Group, if the current object in context is a Group

Displaying a Ledger, if the current object in context is a Ledger

Please note that it is possible to specify the action keyword and action parameters as expressions. This allows the programmer to execute actions based on dynamic evaluation of parameters. The Action keyword can as well be evaluated dynamically. Normally, this would be useful for specifying condition-based action specification in the menu, key/button, etc. In case of functions, as the function inherently supports condition-based actions via IF-ELSE, etc., this would be useful when one required to write a generic function, which takes a parameter and later passes that to an action (as its parameter), which does not allow expressions and expects a constant. This has been achieved with the keyword Action.

The Action keyword allows the programmer to execute actions based on dynamic evaluation of parameters. The syntax for specifying the same is as given below:



We can specify and initiate an Action from the following:

Menu Item

Key Definition

In a User Defined Function

At present, the capability is valid for:

Global Actions like Display, Alter, etc.

Global Actions inside User-Defined Functions


[Button : Test Button]

Key    : F6

Action : Action : Display : @@MyFor

[System : Formula]

MyFor  : if ##SVCurrentCompany CONTAINS “ABC” Then “BalanceSheet” else “TrialBalance”

Observe the usage of Action keyword twice in this example. The first usage is the attribute “Action” for ‘Key’ definition. The second is the keyword “Action” used specifically for executing Dynamic Actions.

[Button : Test Button]

 Key        : F6

 Action     : Call : TestFunc : “Balance Sheet”

[Function : Test Func]

Parameter   : Test Func : String

01 : Action : Display : ##TestFunc

The action Log Object a global action which allows logging the current object context details in a file. It accepts filename as a parameter. In the specified file the current context object, corresponding methods and sub collections are logged.




[Function : FuncLedExp]

Object          : Ledger

10 : Log Object : LedgerObj.txt

The action Log Target is function specific action which allows logging details of the target object in a file. It accepts filename as a parameter in which the log of object, its method and collection is created for the target object.




[Function : FuncLed Exp]

05 : Set Target

10 : Log Target : LedgerObj.txt



Refresh Data can be used along with Timer Event and every few seconds, the report can be refreshed automatically to display the updated information.


[System : Event]

Refresh Timer : TIMER : TRUE : Refresh Data

[#Form : Balance Sheet]

Add : Keys : Enable Refresh

[Key : Enable Refresh]

Key    : Alt + R

Action : Start Timer : Refresh Timer : 300

In this example, Refresh Timer , a Timer event is declared under System Event to invoke the action Refresh Data at periodic intervals. A key Enable Refresh is added in the Balance Sheet Report, which will be used to start the timer Refresh Timer every 5 minutes.

The action Refresh Data is a Company Report – Specific Action. It will always require a Report in memory to Refresh the Data.

Action SLEEP is used to specify time delays during the execution of the code. For few seconds, the system will be dormant or in suspended mode.



[#Menu : Gateway of Tally]

Add : Item : Trial Balance after 10 secs : CALL : TBafterSleep

[Function : TBafterSleep]

00  : SLEEP : 10

10  : DISPLAY : Trial Balance

A new action Copy File is used, which allows:

Copying from one location to another within the same System

Uploading of Files from a given Path to a FTP Site

Downloading of File from FTP Site to the specified location/folder




CopyFile : ##MyDstFilePath : ##MySourceFilePath

If any of the File path is an FTP path, the same can be constructed using functions like $$MakeFTPName. It accepts various parameters like servername, username, password, etc. The following code snippet sets the value of the variable MyDstFilePath using the function $$MakeFTPName.

SET : MyDstFilePath : $$MakeFTPName:##SVFTPServer:##SVFTPUser:##SVFTPPassword:@SCFilePathName

The function $$MakeFTPName uses the various parameters which are System Variables captured from the default configuration reports.

TDL action Execute TDL is used to programmatically load TDL, perform some actions and subsequently, unload the TDL or keep the TDL loaded for the current Tally session.

This can prove to be very useful in cases where the user needs to programmatically associate a TDL on the fly, for performing some operations.



If the action is Call, the Action Parameters contain the Function name along with the Function parameters, if any.

If the action is Display, Alter, etc., then the Parameter should be the Report Name.

Example: 1

[Function : TDL Execution with Keep TDL Loaded enabled]

00 : Execute TDL : “C:TallyPrimeBSTitleChange.TDL” :Yes : Display : Balance Sheet

10 : Display : Balance Sheet

The file  chúng tôi  contains the following lines of code:

[#Report: Balance Sheet]

Title : “TDL Executed Programmatically”

In this example, the TDL  chúng tôi  , which is used to change the Title of the report Balance Sheet, is loaded dynamically by executing the action Execute TDL. The Keep TDL Loaded Flag is set to YES in the above code snippet. Based on the subsequent action Display: Balance Sheet, the Balance Sheet report will be shown with a new Title. The next statement also displays the Balance sheet. The title for this will again be the same, i.e., the changed title, as the dynamic TDL is still loaded, even after the action Execute TDL has completed its execution.

Example: 2

[Function : TDL Execution with Keep TDL Loaded enabled]

00 : Execute TDL : “C:TallyPrimeBSTitleChange.TDL” : No : Display : Balance Sheet

10 : Display : Balance Sheet

Here, the report Balance Sheet would be displayed twice and the title of the first report is “TDL Executed Programmatically”, i.e., the changed title as per BSTitleChange.TDL ; whereas, in the second report, the title is Balance sheet, since the attribute Keep TDL Loaded Flag is set to NO.

As we are aware, there is an action Browse URL/Execute Command used to open a web page or invoke an external application. There may be cases where subsequent actions are dependent on the completion of the previous action, i.e., the closure of external application. For example, the current action is used to execute an external file, which unzips/ extracts various other files. The subsequent actions use these extracted files to process further. In such cases, Browse URL, when used, will trigger the requested application and continue executing the subsequent actions.

Hence, in order to bring sync between the calling and the called application, the action Browse URL Ex/Execute Command Ex is used. The Action Browse URL Ex, when triggered, waits till the external application is closed, and then allows the application to resume with the subsequent action. Similar to ‘Browse URL’, the Action ‘BrowseURLEx’ can be used to:

Open a web Page in the browser

Open an external file with its associated application

Run an executable application

Open a folder in explorer

BrowseURL Ex is useful for URL, folder and executable without extension (for example, tally instead of tally.exe), and it has similar behaviour as Browse URL.



A URL, which can be opened in a browser

A file, which is to be opened with its associated application

An executable file, which is to be run/executed

A folder, which is to be opened in the explorer


To open a URL in browser:


To open a pdf file in pdf reader:

Action : BrowseURL Ex : “C:report.pdf”

In this example, chúng tôi will be opened in default PDF reader of the system. This can be useful while reading a report, which is exported in PDF format.


To open an executable file and wait for it to complete:

Action : BrowseURL Ex: “C:7zip.exe”: “D:software.7z”

In this example, 7zip is opened and the application waits until it finishes, i.e., the running application first waits for chúng tôi to finish decompressing of software.7z, and then it proceeds further.


To open a folder:

Action : BrowseURL Ex : “C:abc”

ZIP is an archive file format that supports compression of data without any loss. A Zipped file may contain one or more files or folders in compressed form. The ZIP file format permits a number of compression algorithms. Originally created in 1989 by Phil Katz, the ZIP format is now supported by a number of software utilities.

The need for supporting this format in TallyPrime  has been felt in various offline Integration projects. Data Exchange takes place between branches and their Head Offices, Distributors and the Principal Companies, etc., where the Head Offices/ Principal Companies having Tally or any other ERP would require the data from Branches/ Distributors for performance visibility. Usually, Principal Companies require the Item-wise Sales Information of the distributors, which helps them in planning their Stocks.

For integration purpose, Head Offices/ Principal Companies generally get TallyPrime installed at Branches/ Distributors’ locations. The day-to-day Transactions like Sales, Purchase Orders, etc., are then exported from TallyPrime and integrated by copying the appropriate XML files to FTP, which is consumed by the Head Offices/ Principal Companies.

At locations where the volume of transactions is large, the XML File becomes too bulky to upload to FTP, and subsequently, downloading from FTP takes a long time, thereby causing performance issues. Hence, zipping the file before uploading to FTP was necessary. This would save time both while uploading the File and while downloading it at the other end. Hence, the concept of Compression, i.e., Zip-Unzip is used.

Along with the actions for Zip/Unzip capability, wildcards * and ? are also supported, as a part of folder/file specification. Asterisk(*) represents zero or more characters in a string of characters. For example, t*.doc considers all files starting with ‘t’, bearing the extension .doc, e.g., chúng tôi chúng tôi etc. Question Mark (?) represents any one character. For example, TDLDebug?.* considers all the files starting with TDLDebug, followed by any variable single character, and bearing any extension, e.g., TDLDebug1.xlsx, TDLDebug2.xlsx, chúng tôi etc.

Zip action can be used to archive a set of folders/ files.

System action Zip is useful when a single File or Folder Source needs to be zipped into a Target file.



Wild Cards * and ? are supported only for the last information in the path. For example, C:Wor?Cust*.txt is invalid whereas C:WorkCust*.txt is valid.

Example: 1

ZIP : “” : “tally.ini”: “Tally” : No

With the above action, the following will be achieved:

The file chúng tôi from the current Tally application/working folder will be zipped to the file chúng tôi in the Tally application folder itself.

The resultant zip file will contain the password Tally.

If the file chúng tôi exists in the current application folder, it will not be overridden.

Example: 2

To Zip all text files in work folder .

ZIP: “”: “D:Work*.txt”: “Tally”: No: Yes: Yes

With the above Action, the following will be achieved:

All the text files from the folder D:Work will be zipped to the file chúng tôi in D:.

The resultant zip file will contain the password Tally.

If the file chúng tôi exists in D:, it will not be overridden as the 4th parameter is set to No.

All the text files within the sub-directories will be included under the folder D:Work, as the 5th Parameter is set to Yes.

The progress bar will be shown during zipping of the files, as the 6th parameter is set to Yes

Procedural Actions Start Zip, Zip Add Path, Zip Exclude Path and End Zip are very useful in cases where multiple folders/files need to be zipped into / excluded from a target file.


Zip Exclude Path : <Exclude Path


Example: 3

Start ZIP    : “” : Yes

Zip Add Path : “tally.ini”

End Zip

Example: 4

Start Zip    : “” : Yes

Zip Add Path : “.Tally.ini”

Zip Add Path : “D:Documents*.doc” : Yes

Zip Add Path : “C:Work”

End Zip

In this example, there are 3 source paths, which are required to be zipped:

First path indicates that the file chúng tôi from the current application folder is to be zipped.

The second path indicates that the PDF files from within the D:Documents folder, including the sub-folders, need to be zipped.

The third path indicates that the entire folder C:Work needs to be zipped.

The above source files would be zipped to the target file chúng tôi which is specified in the action Start Zip.

Example: 5

Start Zip        : “” : Yes

Zip Add Path     : “.Tally.ini”

Zip Add Path     : “D:Documents*.doc” : Yes

Zip Add Path     : “C:Work”

Zip Exclude Path : “*.txt”

End Zip

In this example, apart from using action Zip Add Path to specify the first 3 source paths, the subsequent action Zip Exclude Path is used to specify the exclusion of folders or files with the extension .txt. Thus, all the text files from the above specified source paths will be excluded.

The Unzip action can be used to extract the original files from the zipped files.

System Action Unzip is useful when all the folders/files in the source zip file need to be completely unzipped, as they are. (This action cannot be used in case of partial Unzip.)



Example: 1

Unzip : “.” : “” : “Tally”

 In this example, the file will be unzipped entirely in the current Tally application folder. Since the zip file bears a password Tally, same is being passed as the 3rd Parameter.

Example: 2

Unzip : “Documents” : “” : “Tally”

In this example, all the folders/ files within the zip file will be extracted to the folder documents in the current Tally application folder.

The Procedural actions Start Unzip , Extract Path , Unzip Exclude Path and End Unzip are very useful in case of partial unzip . Using the action Extract Path, one can specify the folder/ file path to be marked for extracting. The action Unzip Exclude Path can help to exclude the specified folders/ files from the zip file and extract the rest. These actions can be used in both the cases, i.e., for partial unzip as well as for total unzip.



Example: 3

Start Unzip: “”

End Unzip  : “D:Unzipped” : Yes

These actions will unzip all the folders/ files within to the folder D:Unzipped and if any file already exists, the same will be overwritten (as the second parameter of the action End Unzip is set to Yes.)

Example: 4

To extract only .txt and .doc files from the zip file.

Start Unzip  : “”

Extract Path : “*.txt”

Extract Path : “*.doc”

End Unzip    : “.”

In this example, only the *.txt and *.doc files from will be unzipped to the current Tally application folder.

Example: 5

Start Unzip        : “”

Extract Path       : “SamplesSupporting Files”

Unzip Exclude Path : “*.xls”

End Unzip          : “.”

In this example, from , all the files and subfolders within the folder ‘Supporting Files’ under ‘Samples’ will be unzipped to the current Tally application folder, as the target folder is specified as a dot (.). Also, all the files with extension .xls will not be zipped.

A file which has been zipped from TallyPrime can be extracted by using any standard third party archiving tools like Winzip, Winrar, etc., and vice-versa.

Limitations of Zip/Unzip in TallyPrime:

In the following cases, Zip/Unzip action will fail:

If the number of files being zipped is greater than 65535

If the size of the zip File is greater than or equal to 4 GB

If the size of any file within the zip file is greater than or equal to 4 GB

Importing of data implicitly follows a Batch Posting approach, wherein the data to be incorporated in the database is updated in batches, thereby improving the performance. This approach has now been extended to data updation through user defined functions, with the introduction of two new Actions, namely START BATCH POST and END BATCH POST . Batch Posting Mode accumulates sets of objects into batches, and pushes a whole batch of data into the database at a time, which optimizes the performance. Batch Posting Mode also requires the size of the batch, which can be set as a parameter to the Action START BATCH POST .

The actions START BATCH POST and END BATCH POST are procedural actions which can only be used within user defined functions. These actions indicate that all the data updation actions falling between the actions START BATCH POST and END BATCH POST must be updated to the database in batches. Instead of the data being directly updated to the database, the data is updated to a temporary file, and once the Batch Size limit is reached, the entire data is flushed from the temporary file into the database.

A batch is a set of objects, wherein the batch size can be specified by the TDL programmer as an optional parameter to the action START BATCH POST. In the absence of this parameter, the default size of the batch is considered as 100 Objects. On encountering the batch size limit, the temporary file posts/flushes the data into the Tally database. On completion of the posting of the previous batch of data, the subsequent batch posting iteration takes place, and this cycle continues till the entire data is updated to the database. The bigger the batch size, the lesser the total number of batches, and the better the performance. The operation will be accomplished faster if the batch size specified is optimal. A very high batch size, beyond a particular point, may also deteriorate the performance. Hence, striking the right balance and specifying the optimal batch size is important to achieve the best performance.


Action 1

Action 2



Action n




 In the absence of Action END BATCH POST , the End of the user defined function is assumed as the end of batch posting. However, it is recommended to specify END BATCH POST , especially in presence of nested loops/ large volume of data.


[Function : Create Ledgers]

Parameter : pNumberofLedgers : Number : 1000

000 : START BATCH POST : 500

010 : For Range : i : Number: 1: ##pNumberofLedgers

020 : New Object : Ledger

030 : Set Value : Name : “Customer ” + $$String:##i

040 : Set Value : Parent : “Sundry Debtors”

050 : Create Target

060 : End For


Without Actions START BATCH POST



3 Minutes 29 Seconds

With Actions START BATCH POST and



4 Seconds


2 Seconds


1 Second

Table 1. Batch Posting Statistics


Points to remember

 Actions START BATCH POST and END BATCH POST are not be used in a nested manner. If used so, only the first instance is considered, while the remaining ones are ignored.

 A batch can only be ended or closed in a function where it is initiated. If the user misses the closing part, the System will END the batch implicitly.

 One must backup the data prior to using the Batch Posting Feature, as incorrect usage of the same may lead to corruption/loss of data.

For import of data also, we have a parameter similar to batch size, i.e., Import Batch Size, which can be used to improve the performance while Importing Data. This parameter can be specified in chúng tôi in the absence of which, it is set to 100 by default. Setting this parameter to a higher value will decrease the time taken for import, but will increase the wait time for other simultaneous data updation operations. Setting it to -1 will disable the batch posting feature for import of data, which means that the data import would consume a longer time, as every object would need to be updated to the database individually.

These are asynchronous message boxes, i.e., the message box continues to appear till the action End Msg Box is encountered or the function is terminated, whichever is earlier. Unlike action ‘Msg Box’, this action is executed asynchronously, i.e., it does not expect a key press from user. When executed, it displays the message box, and continues to execute the subsequent Actions.






[Function : MsgBox Actions]

Variable           : Counter : Number

Variable           : TotalCount : Number : 100

Returns            : Number

Local Formula      : StrTotalCount : ($$String:##TotalCount)

Local Formula      : StCounter : ($$String:##Counter)

00 :StartMsg Box   : Stat u s : “T h is Function creates” + @StrTotalCount + “ Ledgers”

10 :Start Progress : # # TotalCount : ## SVCurrentCompany : “Creating Ledgers” : “Please wait”

20 : While         : # #Count e r < ##TotalCou n t

30 : New Object    : Ledger : “Ledger” + @StrCounter : Y es

40 : Set Value     : Name : ” Ledger” + @St r Counter

50 : Set Value     : Parent : ” Sundry Debtors”

60 : Save Target

70 : Increment     : Count e r

80 : Show Progress : ##Counter

90 : End While

100 : End Progress

110 : End Msg Box

Here, the action ‘Start Msg Box’ invokes the message box and retains it till action ‘End Msg Box’ is encountered. Thus, the message box will continue to appear from label 00 to 110. In absence of ‘End Msg Box’, the msg box is automatically terminated when the function MsgBox Actions ends.

If nested Start Msg Box is executed, then the previous Message box is overwritten. At any time, only one Message Box can be displayed.

 The actions Print , Export , Mail and Upload depend upon various parameters like Printer Name, File Name, Email To, etc. Prior to execution of these actions, the relevant parameters are captured in a Configuration Report. These parameters are persisted as system variables, so that the next time, these can be considered as default settings.

There are situations when multiple reports are being printed or mass mailing is being done in a sequence. Subsequent to each Print or Email Action, if a configuration report is popped up for user inputs, this interrupts the flow, thereby requiring a dedicated person to monitor the process, which is time-consuming too. This issue has been addressed, where the configuration report can be suppressed by specifying an additional logical parameter. Based on the value of the logical parameter, the configuration report is suppressed. Also, the variables can be set prior to invoking the desired action

The syntax of these actions is:



With this syntax, it is possible to configure the values of the report only once and then mail it to the specified e-mail addresses, without repeated display of the configuration report.


10 : MAIL : Ledger Outstandings : TRUE

As the Configuration Report is not displayed, the values of the mail action specific variables like SVPrintFileName , SVOutputName , and so on, must be specified for the successful execution of these actions.

The action MailEx is also used to mail the specified report to recipients. When you use the action MailEx, you can pre-configure the mailing information. It accepts only one parameter.

Following are the action-specific variables and their acceptable values:

The Configuration Variables – Action Specific

The action-specific Variables can be classified into four categories based on their usage.

Common Variables

SVOutputType – The value of this variable is one of the predefined button type keywords like Print Button, Export Button, Upload Button and Mail Button. The variables’ value is used by the functions $$InMailAction , $$InPrintAction , $$InUploadAction and $$InExportAction to determine the execution of the correct option in the form ‘SVPrintConfiguration’. For example, if the value of ‘SVOutputType’ is ‘Print Button’, then the optional form ‘SV PrintConfig’ in the report ‘SVPrintConfiguration’ is executed.

SVPrintFileName – This variable accepts the output location as value. The value of this variable is specific to each action. The usage of each action is explained in detail, along with the action.

SVExportFormat – The value of this variable is the name of the format to be used with the actions Mail, Upload and Export. The values are SDF, ASCII, HTML, EXCEL, XML, AnsiSDF, AnsiASCII, AnsiXML, AnsiHTML and AnsiExcel, which are set using $$SysName.




[Button : Load Dynamic TDL]

Key         : Alt + L

Action      : Load TDL : @@TDLFilePath

[System : Formula]

TDLFilePath : “C:TallyPrimeTDLSamples.tcp”

 Local TDLs will be loaded at the Remote End if ‘Allow Local TDLs’ is enabled to the user logged in.

To unload the TDL dynamically from the current Tally session, the action Unload TDL is used. With this action, the local TDL File(s), including the ones added through chúng tôi and those added dynamically using actions ‘Load TDL’ or ‘Execute TDL’, can be unloaded. However, they would be unloaded only for the current Tally session, and in the subsequent session, all the TDL/TCP files specified in chúng tôi will be loaded once again. Using this action, the files can be unloaded by specifying either the TDL /TCP file name or the GUID of the TCP file.




[Button : Unload Dynamic TDL]

Key         : Alt + U

Action      : Unload TDL : @@TCPFileGU I D

[System : Formula]

TCPFileGUID : “c29 0 1088-3 4 9b-434b – 946c-9 a da601fd 6 b7”

 Account/Remote TDL file(s) cannot be unloaded using Action Unload TDL. Once a TDL is unloaded explicitly, if one attempts to load such TDL file(s) by changing the TDL configuration, the file(s) will not be loaded in that session.

The action Exec Excel Macro invokes the available macros defined in the Excel.




On : After Export : Yes : Exec Excel Macro : MacrotoComputeGraphs : Pie Chart

In the above example, when the macro MacrotoComputeGraphs is executed, it displays the values in Excel as a pie chart.

Action – Format Excel Sheet

Action Format Excel Sheet is used to set the cell properties of Excel sheet. It accepts two parameters.




[Function: FileIOExcel]

Variable : InputFile : String : “D:SampExcel.xls”

010 : Open File: ##InputFile : Excel : Write

020 : Format Excel Sheet: CellTextWrap : 5 : 6 : Yes

030 : Format Excel Sheet: ColumnWidth: 1 : 30

040 : Close Target File

In the above example, CellTextWrap is the PropertyName and “5: 6: Yes” is the parameter required for the CellTextWrap property

When the user does something, an event takes place. Events are actions which are detected by a program and can change the state of system or execution flow. Events can occur based on user actions or can be system-generated. In TDL, the key framework is mainly used to handle user actions like keyboard and mouse events. This can be considered as a part of the Event Framework.

We know that TDL is a definition language which does not have any explicit control on the flow of execution. The programmer has no control over what will happen when a particular event occurs. There are certain attributes like SET/PRINTSET, used to initiate some action on the occurrence of event/change of state (like report construction, and so on.). In this scenario, there is a need of a generic event framework, which allows the programmer to trap the events and initiate an action/set of actions in the state when the event has occurred.

The event framework allows the specification of an Event Handler, where it is possible to specify an event Keyword, a condition to control event handling and the action to be performed. The process of detecting an event and executing the specified action is called as Event Handling.

When the user operates the application, different types of events are generated. The events are classified as System Events or Object-Specific Events, based on their origin.

System events are for which no object context is available when they occur.


Tally application launch.

Object Specific events are performed only if the specific object context is available.


Form Accept is a Form-specific event.

In TDL, Events are used in the System definition. All the system events are defined under this definition. As of now, TDL event framework supports the following four system events, viz. System Start, System End, Load Company and Close Company.


[System : Events]



[System : Events]

AppStart1 : System Start : TRUE : CALL : MyAppStart

The function MyAppstart is called as soon as the Tally application is launched.

As we are already aware, Tally has a natural language processing capability which accepts queries either from the Calculator Pane or from SMS Request. Tally has the intelligence of parsing received/ given commands, in order to process the same. This parsed information is used by the system to process the query and deliver the result. However, in certain cases, queries received might not be understood by the system. There have also been requirements in the market to support data updation queries like Ledger, Voucher Creation, etc.

A system event NatLangQuery used to cater to the above requirements. This event gives complete control in the hands of the TDL Developer, thereby enabling him to process the query received and do the needful. If the query is ignored by TDL, then the System continues to process it and provide the response as usual.


[System : Event]



[System: Event]

Ledger Creation: NatLangQuery: @@IsLedgerinQuery: Call: Create Ledger

Whenever a Query is received, Tally checks the logical condition @@IsLedgerinQuery. If it evaluates to TRUE, then the function ‘Create Ledger’ is invoked.

In order to support the event  NatLangQuery, the following System Variables, along with a Built-in TDL Function $$NatLangInfo , is used.

Example to Demonstrate NatLangQuery event

Create Ledger RadheShyam SundryDebtors

The requirement here is to create a Ledger with the name RadheShyam, under the Group Sundry Debtors.

Firstly, we need to write a system event to trap the query received and perform the necessary action.

[System : Event]

Create Ledger : NatLangQuery : @@IsCreateLedger : Call : Create Ledger

If the Request contains ‘Create Ledger’, then only the above action is to be performed, so the following system formula needs to be declared to check the value of the variable SVNatLangFullRequest.

[System : Formula]

IsCreateLedger : ##SVNatLangFullRequest CONTAINS “Create Ledger”

When the action is being executed, firstly we need to tokenize the words from the string:

[Function : TokenizeQuery]

000 : List Delete Ex : SMSStrings

010 : For Token : TokenVar : ##SVQueryRequest : ” “

020 : List Add Ex : SMSStrings : ##TokenVar

030 : End For

[System : Variable]

List Var : SMSStrings : String

Finally, create the ledger with the Action New Object

[Function : CreateLedger]

000 : Call : TokenizeQuery

010 : New Object : Ledger : ##SMSStrings[3] : Yes

020 : Set Value : Name : ##SMSStrings[3]

030 : Set Value : Parent : ##SMSStrings[4]

040 : Save Target

5. Send the Response to the source of the query.

050 : Set : SVNatLangResponse : “Ledger Created”

060 : Set : SVNatLangRequestProcessed : Yes

Similarly, the NatLangQuery Event can also be used to customize the interpretation of the queries being sent, and act accordingly.

 We have used Space as a delimiter for Tokenizing Query Strings in the given example. One can specify any delimiter like Inverted quotes, comma, etc., to separate different strings.

If customized with the help of Tokens, the Query Signature must be retained exactly in the same order and with the delimiters specified. In the given example, if the Query ‘Create Ledger Keshav under SundryDebtors’ is specified, the code will fail, as the function expects the 4th Word to be a Group Name. Hence, the Programmers must communicate the Query Signa­ture clearly with the end users.

With these events, whenever an Object is subject to Deletion or Cancellation, these events get triggered, which allows the TDL Programmer to take some appropriate action. Only on confirmation of Deletion or Cancellation, these events are triggered. In other words, only when the user confirms the deletion or cancellation of the object by responding with a YES, the relevant events get triggered.

Irrespective of the Source of Deletion or Cancellation, i.e., from an external XML Request, Tally User Interface, Remote Tally User Interface, etc., the appropriate events get triggered. Any Object deletion or cancellation event gets triggered only at the Server end. Let us understand these System Events in detail.

These events get triggered whenever any of the primary Objects defined in Tally Schema is deleted. For example, Object Company, Voucher, Ledger, etc.

As the names suggest, the Events Before Delete Object and After Delete Object are triggered before and after the deletion of the Object, respectively. The Current Object context would be available in both these Events. Triggering of the Event After Delete Object confirms the successful Deletion of the Object.


[System : Events]


Both these event s are mutually exclusive. In other words, the System Event  Before Delete Object  need not be necessarily triggered in order to trigger the System Event  After Delete Object , and vice versa.


[System : Event]

BeforeStockItemDeletion : Before Delete Object : $$IsStockItem:Call:BeforeDeleteObjectFunc

AfterStockItemDeletion  : After Delete Object : $$IsStockItem:Call:AfterDeleteObjectFunc

[Function : BeforeDeleteObjectFunc]

00 : Log : “Before Delete Object Event starts here”

10 : Log : $Name + “under the Stock Group” + $Parent + “is being deleted by ” + $$CmpUserName

20 : Log : $MasterID

30 : Log : “Before Delete Object Event ends here”

[Function : AfterDeleteObjectFunc]

00 : Log : “Stock Item ” + $Name + “ Deleted”

In this example, the events are invoked only when the Stock Item Object is actually being deleted. Since the object context is available both before and after the object deletion, the object details such as Name, MasterID and Parent can be logged in either of the events. The Event After Delete Object confirms the Object Deletion.

Similar to Delete Object Events, two more new System Events are Before Cancel Object and After Cancel Object. Cancellation is applicable only to the Object Voucher. As the names suggest, the Events Before Cancel Object and After Cancel Object are triggered before and after cancellation the of the Voucher object, respectively. The Current Object context would be available in both these Events. Triggering of the Event After Cancel Object confirms the successful Cancellation of the ‘Voucher’ Object.


[System : Events]


Both these System Events are mutually exclusive, i.e., the Event Before Cancel Object need not be necessarily trigged in order to trigger the Event After Cancel Object, and vice versa.


[System : Event]

BeforeVchCancellation: Before Cancel Object : Yes : Call : BeforeCancelObjectFunc

AfterVchCancellation: After Cancel Object : Yes : Call : AfterCancelObjectFunc

[Function : BeforeCancelObjectFunc]

Local Formula : StrMasterID: $$String:$MasterID

00 : Log : “Before Cancel Object Event ” + @StrMasterID + “starts here”

10 : Log : $VoucherNumber

20 : Log : $VoucherTypeName

30 : Log : “Before Cancel Object Event ” + @StrMasterID + “ends here”

[Function : AfterCancelObjectFunc]

Local Formula : StrMasterID : $$String:$MasterID

01 : Log : “Voucher with MasterID ” + @StrMasterID + “ cancelled”

In this example, the System Events Before Cancel Object and After Cancel Object are triggered the moment any voucher is cancelled. Since the object context is available both before and after the cancellation of the object, the details such as Voucher Number, Voucher Type Name, Master ID and Date of the cancelled voucher can be logged through both the user defined functions. The Event After Cancel Object confirms the Voucher Object Cancellation.

Points to remember

The System Events for Object Deletion or Cancellation will be triggered when an Object gets deleted or cancelled from any Source, viz.,from an External Third Party Request, from the Tally User Interface or from Remote Tally.

In case multiple vouchers are selected, and subsequently cancelled or deleted:

The Event is triggered as many times as the number of vouchers selected. For instance, if five Vouchers are selected for Deletion in Daybook, the System Events for Deletion would be triggered five Times, once for each Voucher.

Only the methods fetched in the Collection used in the Report displaying the list of Vouchers would be available in the Deletion or Cancellation Context. For instance, if multiple Vouchers are selected in Daybook, only the methods fetched in the Collection used in Daybook would be available in the current context. However, the entire Voucher Object context (including all the methods) can be associated by using the Object Association Syntax within the User Defined Function, i.e., Object : Voucher : ”ID :” + ($$String:$MasterID), and all the methods will be available in the context.

In case of Remote Login, when the remote user deletes or cancels an object, these events are triggered at the server.

Objects specific events can be specified for the associated object only.


Before Print event is specific to ‘Report’ object. The attribute ON is used to specify the object specific events as follows:



ON is a list type attribute, so a list of actions can be executed when the specific event occurs.

The event Form Accept is specific to ‘Form’ object; hence, can be specified only within Form definition. A list of actions can be executed when the form is accepted, which can also be based on some condition. After executing the action Form Accept, the current object context is retained. So all the actions that are executed further, will have the same object context.

The event Form Accept, when specified by the user, overrides the default action Form Accept. So, when ‘Form Accept’ event is triggered, the form will not be accepted until the user explicitly calls the action ‘Form Accept’.


[Form : TestForm]

On  : FormAccept : Yes : HTTPPost : @@SCURL : ASCII : SCPostNewIssue : SC NewIssueResp

Action HTTP Post is executed when the event Form Accept is encountered. But, the form will not be accepted until the user explicitly calls the action Form Accept on event Form Accept as follows:

On : FormAccept : Yes : Form Accept

Now, after executing the action HTTP Post , Tally will execute the action Form Accept as well.

The event Focus can be specified within the definitions Part, Line and Field. When Part, Line or Field receives focus, a list of actions get executed, which can also be conditionally controlled.


[Part : TestPart2]

On : FOCUS : Yes : CALL : SCSetVariables : $$Line

The event Before Print is specific to ‘Report’ object; so it can be specified only within ‘Report’ definition. The event ‘Before Print’ is triggered when the user executes the ‘Print’ action. The action associated with the event is executed first, and then the report is printed.

A list of actions can be executed before printing the report, based on some condition.


[Report : Test Report]

On : BEFORE PRINT : Yes : CALL : BeforeRepPrint

The function BeforeRepPrint is executed first and then the report Test Report is printed.

The event After Print can be specified for Report, Form, Part and Line definitions. It first prints the current interface object and then executes the specified actions for this event. A list of actions can be executed after printing the report based on some condition. Print is an alias for After Print.


[Line : LV AccTitle]

On : After Print : Yes : CALL : SetIndexLV : #LedgerName

The function SetIndexLV is called after printing the line LV AccTitle. So, if there are 10 lines to be printed, the function will be called ten times.

The Timer Event is used to perform the Timer based automated events. System Event Timer is used to perform the required set of operations automatically at periodic intervals.


[System : Event]


We can have multiple Event Handlers with unique names which can invoke specific actions at different intervals. In order to specify the interval for the various Timers and to begin and end the Timers, the associated Actions are ‘Start Timer’ and ‘Stop Timer’.

It starts the specified timer and accepts the Timer Name and Duration in seconds as the action parameters.



This action stops the specified timer, and it accepts the Timer Name as its parameter.



Following is an example of scheduling automatic backups every hour:


[System : Event]

Auto Backup     : TIMER : TRUE : CALL : Take Backup Function

Schedule Backup : System Start : TRUE : START TIMER : Auto Backup          : 3600

[#Menu : Company Info.]

Add : Keys : Stop Backup Timer

[Key : Stop Backup Timer]

Key    : Alt + S

Action : Stop Timer : Auto Backup

Title  : “Stop Backup”

In this example, following is done:

Auto Backup, a Timer event is declared under System Event to invoke the function

Take Backup function at periodic intervals, as specified within the action Start Timer .

Schedule Backup, a System Start event is declared under System Event to Start the above Timer ‘Auto Backup’ and execute the specified action every 3600 Seconds, i.e., every hour.

A corresponding Key to stop the Timer is associated to Menu Company Info, which is defined to stop the Timer. User can stop the timer if he chooses not to continue taking automatic backups any further.

Timer events can be very useful in many cases like displaying Exception Reports , Negative Balances intimation, Inventory Status below Minimum or Reorder Level, Outstanding Reminders , Auto Sync at regular intervals, and many more.

The Event Load is used at the Report Definition. This event is triggered before the Report is displayed to the user. In other words, when this event is triggered, the Report is constructed and updated with variables, object context and the data. The Event ‘Load’ provides control to the TDL Layer, before Tally gets into wait loop, where the user will start operating on the Report. It may allow storing of the current state, etc.




[#Report: ProfitandLoss]

On : Load : @@IsLossIncurred : CALL : ShowMsgifLossEncountered

The Event Reject is used at the Form Definition. This event gets executed in the Edit Mode, when the user quits the current Form without accepting or saving it. It allows the Programmer to perform the desired action on rejection of the Form. Once the Event ‘Reject’ is used at the Form Definition, the default Action ‘Form Reject’ is overridden, as a result of which, the action Form Reject has to be explicitly specified.




[#Form : Accounting Voucher]

On : Reject : Yes : Call : TDLRejectFunc

On : Reject : Yes : Form Reject

[Function : TDLRejectFunc]

00 : Msg Box : Status : “The form is rejected”

In this example, when the form is rejected, the Function TDLRejectFunc is invoked, which displays the message “The form is rejected”. Once the execution of the function is over, the form gets rejected due to the explicit Action Form Reject.

The Event Accept is used at the Field Definition. This event gets executed the moment an editable Field is accepted. Once the Event ‘Accept’ is used at the Field Definition, the default Action ‘Field Accept’ is overridden, as a result of which, the action ‘Field Accept’ to accept the Field contents, has to be explicitly specified.

When a Field is accepted, the event sequence runs in the following order:

The Field value is validated through the ‘Validate’ attribute

The ‘Modifies’ Variable is modified/updated.

The Event ‘Accept’ is executed

The Sub-Form is invoked

Note: If the validation fails, then this event will not be executed, as it will result in an error to the user.




[#Field : Qty Primary Field]

On : Accept : @@IsNegativeClosQty : Call : MsgBoxforNegative

On : Accept : @@IsNegativeClosQty : Field Accept

Here, the event Accept is triggered on accepting the Field Qty Primary Field, which in turn, invokes the function MsgBoxforNegative . Once the function terminates, the field is accepted.

This allows the TDL Programmer to take any desired action every time an Object is imported. This Event will help the user to create appropriate logs after Importing of each Object, terminate the Import Process based on some condition, track/record changes that can be used for preparing the response (for SOAP requests), etc.


The actions in TDL can be delivered in three ways – by activating a Menu Item, by pressing a Key or by activating a Button. The definition of both Buttons and Keys are the same, but at the time of deployment, Keys differ from Buttons.

The Title attribute can be used to give a meaningful Title to the Button being displayed on the Button Bar. This attribute is optional.



[Button : NonColumnar]

Title : “No Columns”

This attribute is used to give a unique key combination, which can be activated by pressing the same from any Report or Menu. This attribute is mandatory if action is specified in this definition.



[Button: NonColumnar]

Key : Alt + F5

The Action attribute is used to associate an Action with the button. Every button or key is defined for the purpose of executing certain predefined actions.



[Button : NonColumnar]

Action : Set : ColumnarDayBook : NOT ##ColumnarDayBook

The Inactive attribute is used to activate the button, based on some condition. If the condition is FALSE, the button will be displayed, but it cannot be activated.



[Button: Close Company]

Inactive : $$SelectedCmps < 1

The attribute ActionEx is used to enhance the multi-action support at button or key level. It allows you to specify multiple actions for executions when you invoke a key or button. ActionEx is a triple list attribute.




If the labels are unique, every ActionEx statements are executed in the order of their specifications.

If the labels are same, the last action within the same label is executed.

Example: 1

[Button: Show Final Accounts]

Key       : Ctrl + F

ActionEx  : TB : Display : Trial Balance

ActionEx  : PL : Display : Profit and Loss

ActionEx  : BS : Display : Balance Sheet


[Button: Show Final Accounts]

Key : Ctrl + F

TB  : Display : Trial Balance

PL  : Display : Profit and Loss

BS  : Display : Balance Sheet

Example: 2

Modify the code in example 1 to display the modified final accounts as given below:

Delete the action to display TrialBalance using the attribute Delete: TB.

Add the action to set the attribute ExplodeFlag as yes, after the label PL.

Modify BS label to display the report ‘MyBalanceSheet’.

[Button: Modified Final Accounts]

Use     : Show Final Accounts

Delete  : TB

Add     : ActionEx: After:PL: ExplodeFlagNo: Set: ExplodeFlag: No

Replace : ActionEx: BS :BS: Display : My Balance Sheet

[Report: My Balance Sheet]


Example: 3

Use the button Show Final Accounts mentioned in Example 1, in the report MyReport and modify it locally to delete the display of Trial Balance using ActionEx.

[Report: My Report]


Form  : My Report

[Form: My Report]


Button: Show Final Accounts

Local : Button: Show Final Accounts: Delete: ActionEx: TB

You can use the attribute ActionEx to achieve multi-action support which reduces the code size, instead of the attribute Action List with additional key definitions.

To display the final accounts using a button you need to write the following code using the attribute Action List.


[Button: Show Final Accounts]

Key         : Ctrl + F

Action List : Show Trial Balance, Show Profit and Loss, Show Balance Sheet

[Button: Show Trial Balance]

Key         : Ctrl + F

Action      : Display : Trial Balance

[Button: Show Profit and Loss]

Key         : Ctrl + F

Action      : Display : Profit and Loss

[Button: Show Balance sheet]

Key         : Ctrl + F

Action      : Display : Balance Sheet

Whereas when you use the attribute ActionEx, it reduces the code size.


[Button: Show Final Accounts]

Key     : Ctrl + F

ActionEx: TrialBalance : Display : Trial Balance

ActionEx: ProfitandLoss : Display : Profit and Loss

ActionEx: BalanceSheet : Display : Balance Sheet

When ActionEx is specified with unique labels, the order of execution is same as the order of specification.


[Button: Show Final Accounts]

Key     : Ctrl + F

Title   : Final Accounts

ActionEx: TB : Display : Trial Balance

ActionEx: PL : Display : Profit and Loss

ActionEx: BS : Display : Balance Sheet

In the above example, the button Final Accounts displays the reports in the given order Trial Balance, Profit and Loss, and Balance Sheet.

When multiple instances of ActionEx are specified with the same label name, then only the action specified in the last label occurrence will get executed.


[Button: Show Final Accounts]

Key     : Ctrl + F

Title   : Final Accounts

ActionEx: TB: Display : Trial Balance

ActionEx: PL: Display : Profit and Loss

ActionEx: TB: Display : Balance Sheet

In the above example, the button Final Accounts displays the report Balance Sheet first and then the report Profit and Loss. It ignores the report Trial Balance.

When you use these attributes Action List, Action, and ActionEx together in your button definition, in any combination, the order of priority for actions is as given below:

Action List



It executes only the highest priority action statement and other action statements are ignored. Refer the following table to understand more about the order of execution.

Attributes Specified



Action, Action List, and ActionEx

Action List

Action and ActionEx

Action List and ActionEx

Action List


Action List and Action

Action List


ActionEx and Action



You're reading What Are Actions, Events, Buttons And Keys In Tdl?

Arrow Keys Are Not Working In Windows 11/10 Laptop Keyboard

At times, the Arrow keys might not be working in Windows 11 or Windows 10 PC. If this problem is appearing on your computer, you can follow these suggestions mentioned in the article. Whether one or all the four arrows on your laptop keyboard are not working, the guide would be the same.

Fix Arrow keys are not working in Windows 11/10

If the Left. Right, Up, Down Arrow keys are not working on Windows 11/10 PC keyboard, follow these suggestions:

Verify keyboard

Re-install keyboard driver

Run Keyboard Troubleshooter

Disable Scroll Lock for Excel

Use On-Screen Keyboard

Before you begin, make sure that the space around the keys is physically clean.

1] Verify the keyboard

It is the very first and the most important thing you need to do when arrow keys are not working. Whether you have a new, old, wired, or wireless keyboard, you must check a few things in order to fix this issue. At times, it could be a hardware issue, and as a result, the arrow keys might not be working as usual. Therefore, follow these points to get into the troubleshooting process:

If you have an old keyboard, try to connect it to another computer and check if it is working properly or not.

If your keyboard attracts a lot of dust, it is recommended to clean the keyboard. Whether you have an external keyboard or an internal keyboard for a laptop, you need to clean your keyboard properly.

If you have a wired keyboard, make sure that the ports and plug of the keyboard are working correctly. For that, you can plugin the keyboard to another computer to verify.

If you have a wireless keyboard, make sure the batteries are charged. If you have a rechargeable battery, you can try charging it before trying again.

2] Re-install the keyboard driver

Although a wired keyboard might not need a driver, sometimes, wireless keyboard users need to download and install the driver in order to use the hardware. Therefore, follow these steps to uninstall the existing driver:

Press Win+X to open the WinX menu.

Select Device Manager from the menu.

Expand the Keyboards section.

Then, download the driver from the official website or insert the given CD to re-install the driver.

3] Run Keyboard Troubleshooter

When your keyboard is not functioning correctly, you can try running the Keyboard Troubleshooter. For your information, you do not need to download anything since Windows 11 comes with an in-built troubleshooter for this purpose.

To run Keyboard Troubleshooter, follow these steps:

Press Win+I to open Windows Settings.

Find the Keyboard Troubleshooter.

Then, you need to follow the screen instructions to get the job done.

4] Disable Scroll Lock for Excel

If you are not able to use the arrow keys in Excel, you need to disable the Scroll Lock. Scroll Lock helps you stop the scrolling when you press the arrow keys in Microsoft Excel and some other similar programs. Therefore, you can disable the Scroll Lock on your keyboard and check if it resolves the issue or not.

Read: Arrows keys not working in Microsoft Excel

5] Use On-Screen Keyboard

Read: How to reset Keyboard settings to default in Windows.

Why are my arrow keys not working in Windows 11/10?

There could be several reasons why the arrow keys are not working in Windows 11 or Windows 10 computers. However, you can go through the above-mentioned steps to get rid of this issue. First, try to verify the keyboard in all possible ways. Then, you can use the Keyboard Troubleshooter and disable the Scroll Lock.

Read: Cant scroll, Arrow keys not working in Chrome browser

How do I fix my keyboard arrow keys not working?

To fix the keyboard arrow keys not working issue on Windows 11/10, the above-mentioned suggestions could be handy for you. You must check the connection, port, USB plug, etc., first. Then, you can re-install the driver, run the troubleshooter, or use the On-Screen Keyboard.

Read: Fix Arrow keys are not working in Teams.

What Are “Loot Boxes” In Games, And Why Are They Controversial?

Recently, there’s been a big spike in people talking about “loot boxes” in video games. Several countries are calling for their removal, and Belgium is currently on the road to banning them altogether.

With people throwing around words such as “gambling” and “addiction,” it can be worrying if you have younger members of the family that enjoy video games.

So what are loot boxes in games, how did they start, and why are they causing a ruckus?

What Is a Loot Box?

Before we talk about why they’re causing so much trouble, we must first understand what they are. Loot boxes follow their namesake: boxes or crates that are full of items. These items have a range of rarities, from basic common items to rare, highly sought-after items. The key is you can’t tell what’s inside the box until it’s opened. Part of the appeal of loot boxes is the mystery behind opening them. Will they contain bog-standard items, or will something extremely rare be inside?

Of course, loot boxes aren’t without their costs. Some games will offer loot boxes in their store, and you can buy them with money. Some games will give you loot boxes for free as you play, but you need to purchase a key to open them. There are some that will give free unlocked boxes as a “taster,” with the ability to buy more in the shop. Some games will be free to play, with their operating costs covered via loot box purchases. Other games will cost full price but still make additional income through loot boxes.

The types of items available also changes between games. Overwatch, for instance, offers items that change the visual look of your character, known as “cosmetic items,” which don’t affect gameplay at all. Team Fortress 2 has cosmetic items but also offers alternative weapons for each character. Some games are quite nefarious and offer strictly improved items in their boxes, forcing players to open them if they want better items.

Where Did Loot Boxes in Games Come From?

Loot boxes originated in China, in a game called ZT Online that was released in 2007. People weren’t willing to pay full price for a video game, so the company behind ZT Online, Zhengtu Network, made the game free and added loot boxes as a way to pay for in-game items. Within the first year, Zhengtu Network reported a monthly revenue of $15 million, which caused a lot of developers to take note.

Three years after the ZT Online success story, loot boxes made their way into the west. The early adopters of this model were EA with their FIFA series, and Valve with their hit game Team Fortress 2. In the case of Team Fortress 2, Valve made the game free to play for everyone, choosing to maximise profits with loot boxes instead. Since then, loot boxes have made their way into games such as Overwatch, Middle-earth: Shadow of War. and even the Twitch streaming website.

Do They Count as Gambling?

This is the million dollar question, and it’s what’s causing so much debate. As loot boxes make their way more and more into video games, people are growing concerned over their prevalence. The main topic at the moment is whether or not purchasing a box full of random items is considered “gambling,” taking into account multiple aspects of the loot box. If they are considered gambling, then they’ll come under the full laws and regulations associated with them. So, what are the arguments?

Guaranteed Items

For one, does the fact that you’re guaranteed items with a loot box stop it from being gambling? Some methods of gambling (such as slot machines) have an outcome where you’re left with nothing. Loot boxes, however, always guarantee items with every opening. These items may be duplicates of ones that you already own, but it still technically counts as a gain. Some games also have ways to exchange or craft the duplicates for more in-game items.

No Real-World Value

Secondly, most games don’t allow loot box openings to transfer into a real world gain. For instance, if you get a very rare skin from a loot box in Overwatch, you cannot officially sell the skin for real money. This element of loot boxes caused the UK Gambling Commission to announce that loot boxes aren’t gambling.

Randomised Products

However, at the end of the day, it’s still paying real money for a random percentage chance of a specific item. In some people’s eyes this element alone is enough to class loot boxes as gambling. Add to that the fact that they can be highly addictive and aggressively pushed by the developers, and you can see why people are calling for regulations.

These topics are being debated, with different regulators coming to different conclusions. As such, the future of loot boxes looks somewhat shaky as the debates move forward.

Staying Safe from Loot Boxes

When you’re worried about your children becoming addicted to loot boxes, remember that buying them requires an online purchase. If they’re quite young, they’ll have no means of buying loot boxes without your aid, allowing you to investigate when they ask for a purchase and take control of their spending.

If they’re old enough for a credit/debit card or PayPal account, it’s tricky to know if they’re buying loot boxes without demanding their bank account information. Keep tabs on the games they play and check if they have loot boxes. If they do, be sure to warn them of the effects and symptoms of addiction.

Loot Box Lows

With loot boxes becoming an integral part of video gaming, people are debating whether or not they’re gambling. Now you know what they are, how they work, and some arguments for and against them being classed as gambling.

What do you think? Are loot boxes in games considered gambling, or should they be treated like regular products? Let us know below!

Simon Batt

Simon Batt is a Computer Science graduate with a passion for cybersecurity.

Subscribe to our newsletter!

Our latest tutorials delivered straight to your inbox

Sign up for all newsletters.

By signing up, you agree to our Privacy Policy and European users agree to the data transfer policy. We will not share your data and you can unsubscribe at any time.

What Are Exploits And Exploit Kits?

We have seen what is meant by Security Vulnerabilities in computer parlance. Today we will see what is an Exploit and what are Exploit Kits. When a vulnerability is detected, an exploit follows, until a patch is issued to address the vulnerability. This is the basic difference in vulnerabilities and exploits. Now let us see them in a bit more detail – what are exploits and exploit kits.

A patch in time helps in preventing exploits. At the time of writing this article, the POODLE vulnerability was the biggest vulnerability known to people which made SSL 3.0 prone to exploits.

What are Exploits?

Exploits are based on vulnerabilities – before they are patched. They allow hackers and attackers to run malicious code on your computer, without you even bing aware of it. The common Exploits our in Java, Doc & PDF documents, JavaScript and HTML.

One can define exploits as:

Thus, it is clear that “exploits” follow “vulnerabilities”. If a web criminal detects a vulnerability in any of the products on the Internet or elsewhere, she or he may attack the system containing the vulnerability to gain something or to deprive authorized users of using the product properly. Zero-day vulnerability is a hole in software, firmware or hardware that is not yet known to the user, vendor or developer, and is exploited by hackers, before a patch for it is issued. Such attacks are called Zero-day exploits.

What are Exploit Kits?

Exploit Kits are malicious toolkits that can be used to exploit vulnerabilities or security holes found in software and services. In short, they help you exploit vulnerabilities. These exploit kits contain a good GUI interface to help even average users of the computer and Internet to target different vulnerabilities. Such kits are these days available freely on the Internet and come with Help documents so that the buyers of the service can use the kits effectively. They are illegal but are yet available and security agencies cannot do much about it, as the buyers and sellers go anonymous.

Commercial exploit kits have existed since at least 2006 in various forms, but early versions required a considerable amount of technical expertise to use, which limited their appeal among prospective attackers. This requirement changed in 2010 with the initial release of the Blackhole exploit kit, which was designed to be usable by novice attackers with limited technical skills—in short, anyone who wanted to be a cybercriminal and could afford to pay for the kit, says Microsoft.

Exploit kits are readily available on the Internet. You need not go into the Darknet or Deepnet to purchase an exploit kit as standalone software or as a SaaS (software as a service). Though it is much available in the Darknet, payments are to be made in an electronic currency such as the Bitcoins. There are many malicious hacker forums on the normal Internet that sell the exploit kits as a whole or as a service.

According to Microsoft,

“In addition to one-on-one transactions in which buyers purchase exclusive access to exploits, exploits are also monetized through exploit kits—collections of exploits bundled together and sold as commercial software or as a service.”

Apart from keeping your operating system and installed software up-to-date at all times and installing a good Internet security software, tools like SecPod Saner Free can help you identify and patch vulnerabilities and protect yourself against such attacks.

What Are “Super Apps,” And Which Companies Are Building Them?

If you want to book an Airbnb, get some food delivered, pay a bill, chat with your friends, and get a personal masseuse sent to your apartment, how many apps will you need? If you live in a decently-sized Asian city, odds are you’ll only need one – a “super app.”

Though most haven’t spread out of Asia yet, apps like WeChat, Alipay, Grab, Go-Jek, Paytm, Kakao, and Line are becoming an essential part of life in many places. Most started with a few functions, like chatting with friends, making payments, or hailing rides, but have essentially turned into miniature operating systems for life.

The super app model makes sense: it’s an easy way to get access to many different services, saves phone space, and frees users from having to hunt down lots of different apps. There are significant downsides as well, though, particularly when it comes to privacy and competition.

The trend is also catching on in Latin America – another mobile-first culture. North American and European companies like Facebook, Uber, and Amazon are eying the possibility of becoming regional super apps as well. But with a lot of super-app services already dominated by individual companies, it won’t be easy for even these tech giants to become anything close to a western WeChat.

Super app superstars

Without a doubt, the current king of super apps is Tencent’s WeChat – an app that more than two-thirds of the Chinese population uses, many of them for an average of several hours a day. WeChat and its competitor app, Alipay, are so frequently used for mobile payments that paying for things by cash or card is actually becoming a challenge.

Some of the biggest drawbacks of super apps are also evident in things here, though. The sheer scale of WeChat and Alipay is effectively suppressing competition, as anyone who wants to bring a new service to users typically does it through one of those apps. Privacy is also a major concern, as the more things users can do in a single app, the more that app can learn about them, and that’s more than a little concerning in a country that is working on implementing a social credit score for its citizens.

Pretty much every other super app is a “light” version of WeChat. They aggregate services in the same way, but you’re unlikely to open one until it’s time to order food or get a ride. They’re handy, but most users wouldn’t place them in the same category as electricity and Internet. That said, they still do a lot, and all of the below apps bear watching:

Go-Jek (Indonesia and Southeast Asia): Over 20 services ranging from mobile payment to mobile massage therapists.

Grab (Singapore and Southeast Asia): One of Southeast Asia’s most successful startups, they started with ride-hailing and are now used for e-payments, food delivery, and several other features.

Paytm (India): Backed by Alibaba (of Alipay), Paytm provides e-payments, financial services, ride-hailing, shopping, and lots of other services to India’s population.

Rappi (Colombia and Latin America): It started out as an app that connected users to couriers that could pick up and deliver pretty much anything, but it is moving into areas like e-payments, scooter sharing, and financial services.

Super apps: coming to an app store near you?

Currently, Europe, Australia, Africa, and the U.S and Canada don’t have any apps that could be described as “super.” Particularly in the US, this is the result of digital goods and services evolving somewhat gradually, with innovative companies staking out and defending different territories. Japan and Korea are in a similar boat. Though Line and Kakao are super apps, the more gradual development of their digital services meant that there were more limited opportunities for any one company to come in and grab large parts of multiple markets.

Of course, every company still wants to be that super app, so they’re trying nonetheless. Facebook Messenger’s leader, David Marcus, has described WeChat as “inspiring” in the past, and if you’ve been keeping track of the app’s developments over the past few years, you’ll notice some parallel developments. Their move towards payments with Libra is an especially big step in the “super app” direction, but the amount of pushback they’ve gotten on that illustrates the uphill battle they’re facing.

Uber has also declared its intent to become an “operating system for everyday life.” They’ve started by combining Uber and Uber Eats into one app and have expanded the transportation options you can find. They even have a freight company now – Uber Freight, in case you didn’t know.

Then there’s Amazon, which is already pursuing super app status in India, where it offers e-payments, flight bookings, ride-hailing, food delivery, and more, either directly or through companies it has acquired.

Do we even want/need a super app?

Super apps are undeniably convenient and make life a bit simpler, but bundling those services together under one corporate umbrella might not turn out to be the best idea for the digital ecosystem in the long run. Competition helps drive innovation, and it prevents any one company from having too much power.

The most likely scenario is that we’ll end up with several different ecosystems with super app characteristics. Messenger and Uber might not become America’s WeChat and Grab, but they’ll probably add some useful features in their efforts to get there.

Image credits: The screenshot of WeChat, Grab, GoJek, Uber, Paytm

Andrew Braun

Subscribe to our newsletter!

Our latest tutorials delivered straight to your inbox

Sign up for all newsletters.

By signing up, you agree to our Privacy Policy and European users agree to the data transfer policy. We will not share your data and you can unsubscribe at any time.

Understanding Windows Registry, Creating Keys And Values

Windows Registry is one of the mysterious parts of the Windows operating system that allows us to tweak and modify almost all the sections of Windows. Even though we work with the registry all the time, most people have only a little understanding of what it really is and are not sure of how to create custom keys and values. So let’s find out a thing or two about Windows Registry and its components.

What is Windows Registry

Windows Registry is nothing but a collection of different configurations and settings related to the operating system, programs, and users. You can think of it like a database that virtually stores all the important information. This information includes anything related to system hardware, application settings, installed programs, user profiles, etc. Since all the important information is stored in a single place, Windows refers to the Registry all the time, and it is actually easier and faster for Windows to manage different parts of the operating system without messing with tons of individual configuration files located in different locations.

Components of Windows Registry

There are five different Root level keys which have their own specific purpose in the registry. Here is a gist of these root keys.

HKEY_CLASSES_ROOT (HKCR): This Root key is used by Windows to manage Object Linking and Embedding (OLE) and file type associations. This is the key where Windows links all your files to their relevant programs so that you can open and interact with them.

HKEY_CURRENT_USER(HKCU): This section of Windows Registry hosts all the data, user-level settings and configurations associated with the currently logged in user. Not only the Windows operating system, but other programs also store data relevant to the current user.

HKEY_LOCAL_MACHINE (HKLM): Regardless of the user status, this section contains all the system related keys including any hardware settings, software settings, etc. Since this key hosts most of the system-wide information, HKLM is one of the most accessed root keys of Windows Registry.

HKEY_USERS (HKU): As you can see from the name, this root key hosts all the settings of all the users including any logged in and logged off users on the system. As you can find settings regarding other users, don’t confuse this root key with HKCU.

HKEY_CURRENT_CONFIG (HKCC): Simply put, you can call this a pseudo root key as it is just a direct link to the Current Hardware Profile Settings in the HKLM root key.

Key values

Each of the above Root Keys has their own Keys, and each Key has its own values. For each Key, you can create six different values, and those values depend entirely upon the target program and/or the configuration requirements.

String Value: String Values are mostly human readable and only have a single line of textual information, like file paths. String Values are one of the most commonly used values in the Windows Registry.

Binary Value: As the name implies, these values only contain binary data (0, 1). Often these values are used to turn on or off a particular setting.

DWORD Value (32-bit): DWORD values are similar to Binary values but are also capable of storing any integer in the range of 32-bit. DWORD values are designed to work with 32-bit systems, but are also used in 64-bit systems for backward compatibility.

QWORD Value (64-bit): QWORD values are just like DWORD values but are capable of holding any integer within the range of 64-bits. You can say these are designed to work with 64-bit systems.

Multi-String Value: If String values are used to store single line strings, Multi-String values are used to store multi-line strings or textual information.

Expandable String Value: Expandable String values are similar to normal String values but contain the environmental variables.

Creating New Keys and Values

Creating Keys and Values in Windows Registry is relatively easy and straightforward. But before doing anything, please back up your Windows Registry as any misconfigurations or unwanted deletions may cause critical errors.

That’s all there is to do, and hopefully this helps you to understand the Windows Registry and its components better and to create new keys and values as required.

Vamsi Krishna

Vamsi is a tech and WordPress geek who enjoys writing how-to guides and messing with his computer and software in general. When not writing for MTE, he writes for he shares tips, tricks, and lifehacks on his own blog Stugon.

Subscribe to our newsletter!

Our latest tutorials delivered straight to your inbox

Sign up for all newsletters.

By signing up, you agree to our Privacy Policy and European users agree to the data transfer policy. We will not share your data and you can unsubscribe at any time.

Update the detailed information about What Are Actions, Events, Buttons And Keys In Tdl? on the website. We hope the article's content will meet your needs, and we will regularly update the information to provide you with the fastest and most accurate information. Have a great day!