You are reading the article What Are Actions, Events, Buttons And Keys In Tdl? updated in December 2023 on the website Achiashop.com. 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.
Syntax
Where,
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.
Example:
[#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.
Syntax
Where,
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
Example:
[#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.
Example:
[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.
Example:
[#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.
Example:
[#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.
Example:
[#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.
Example:
[#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.
Example
[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.
Example
[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.
Example
[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.
Example
[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.
Example
[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.
Syntax
Where,
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:
Originator
Executor
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.
Originator
Executer
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 executer 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.
Syntax
Where,
Example:
[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.
Syntax
Where,
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.
Syntax
Where,
Example
[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:
Syntax
Where,
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
Example
[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.
Syntax
Where,
Example
[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.
Syntax
Where,
Example
[Function : FuncLed Exp]
05 : Set Target
10 : Log Target : LedgerObj.txt
Syntax
REFRESH DATA
Refresh Data can be used along with Timer Event and every few seconds, the report can be refreshed automatically to display the updated information.
Example
[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.
Syntax
Example
[#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
Syntax
Where,
Example
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.
Syntax
Where,
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.
Syntax
Where,
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
Example:1
To open a URL in browser:
Example:2
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.
Example:3
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.
Example:4
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.
Syntax
Where,
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 : “.Target.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:Target.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.
Syntax
Zip Exclude Path : <Exclude Path
Where,
Example: 3
Start ZIP : “Target.zip” : Yes
Zip Add Path : “tally.ini”
End Zip
Example: 4
Start Zip : “Target.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 : “Target.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.)
Syntax
Where,
Example: 1
Unzip : “.” : “D:Target.zip” : “Tally”
In this example, the file D:Target.zip 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” : “D:Target.zip” : “Tally”
In this example, all the folders/ files within the zip file D:Target.zip 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.
Syntax:
Where,
Example: 3
Start Unzip: “D:Target.zip”
End Unzip : “D:Unzipped” : Yes
These actions will unzip all the folders/ files within D:Target.zip 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 : “D:Target.zip”
Extract Path : “*.txt”
Extract Path : “*.doc”
End Unzip : “.”
In this example, only the *.txt and *.doc files from D:Target.zip will be unzipped to the current Tally application folder.
Example: 5
Start Unzip : “D:Target.zip”
Extract Path : “SamplesSupporting Files”
Unzip Exclude Path : “*.xls”
End Unzip : “.”
In this example, from D:Target.zip , 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.
Syntax
Action 1
Action 2
:
:
Action n
SAVE TARGET
END BATCH POST
Where,
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.
Example
[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
070 : END BATCH POST
Without Actions START BATCH POST
and END BATCH POST
NA
3 Minutes 29 Seconds
With Actions START BATCH POST and
END BATCH POST
100
4 Seconds
500
2 Seconds
1000
1 Second
Table 1. Batch Posting Statistics
Limitation
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.
Syntax
:
End MSG BOX
Where,
Example
[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:
Syntax
Where,
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.
Example
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 SpecificThe 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.
Syntax
Where,
Example
[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.
Syntax
Where,
Example
[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.
Syntax
Where,
Example
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.
Syntax
where,
Example
[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.
Example
Tally application launch.
Object Specific events are performed only if the specific object context is available.
Example
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.
Syntax
[System : Events]
Where,
Example
[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.
Syntax
[System : Event]
Where,
Example
[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 Signature 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.
Syntax
[System : Events]
Where,
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.
Example
[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.
Syntax
[System : Events]
Where,
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.
Example
[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.
Example
Before Print event is specific to ‘Report’ object. The attribute ON is used to specify the object specific events as follows:
Syntax
Where,
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’.
Example
[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.
Example
[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.
Example
[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.
Example
[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.
Syntax
[System : Event]
Where,
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.
Syntax
Where,
This action stops the specified timer, and it accepts the Timer Name as its parameter.
Syntax
Where,
Following is an example of scheduling automatic backups every hour:
Example
[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.
Syntax
Where,
Example
[#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.
Syntax
Where,
Example
[#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.
Syntax
Where,
Example
[#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.
Syntax
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.
Syntax
Example
[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.
Syntax
Example
[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.
Syntax
Example
[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.
Syntax
Example
[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.
Syntax
OR
Where,
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
OR
[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.
Example:
[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.
Example:
[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.
Example
[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.
Example
[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
ActionEx
Action
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
Executed
Ignored
Action, Action List, and ActionEx
Action List
Action and ActionEx
Action List and ActionEx
Action List
ActionEx
Action List and Action
Action List
Action
ActionEx and Action
ActionEx
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/10If 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 keyboardIt 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 driverAlthough 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 TroubleshooterWhen 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 ExcelIf 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 KeyboardRead: 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 ItemsFor 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 ValueSecondly, 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 ProductsHowever, 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 BoxesWhen 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 LowsWith 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 superstarsWithout 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 RegistryWindows 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 RegistryThere 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 valuesEach 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 ValuesCreating 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 Achiashop.com 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!