Calculation on Ticket

There are two ways to enter information into the field calculation area of a ticket. You can type the information directly into the field calculation area or use the two pop-ups to select from a list of commonly available fields.

Both methods can be used to build a ticket. Available fields are divided into several groups.

Default Data Enables the placement of information about the company contained in the Company Preferences setup. For example, the company name, address, and telephone numbers.
Theatre Information Enables the placement of information about the Theatre pricing Map associated with the play. For example:
  • the theatre name & address
  • the section/row/seat names.
  • entry zones if you are using those

With COVID19, you may want to add an entry zone (per the image to the right) which are set up in the pricing map entry zones
Play Information Enables the placement of information about the Plays and Dates associated with the ticket. For example, the play title, play date and time, and play sponsor.
Ticket Information Enables the placement of information about the ticket sold to the patron. For example, the price paid, price discounts, and the ticket serial number. The ticket serial number is a unique number generated by Theatre Manager for each ticket.

The unique number can be printed on any ticket along with the ticket bar code field in ladder format as shown in the picture or as a QR code if using Microcom printers. All you have to do is select the bar code and make sure it prints clearly and entirely on the ticket (but not on a perforation).

Some interesting ticket calculations:

Pass/GC/Member Data Enables the placement of information about the pass, gift certificate, or membership sold to the patron. For example, purchase date, expiry date, member type, control number, and online redemption password.
  • The control number is a unique sequential number generated by Theatre Manager for each membership used for tracking purposes.
  • The redemption code is a random 15 character string generated when each pass/GC is sold and should be printed on the 'pass' ticket face if the pass is intended to be redeemed online by somebody other than the patron who purchased it. Note: it can also be printed on a form letter if passes are generated on paper documents. The redemption code cannot be seen on any screen for obvious reasons.
In other words:
Order Information Enables the placement of information about the order created when the ticket was sold to the patron. For example, the order date and total order dollar amount outstanding.
Payment Information Enables the placement of information about the payment made by the patron. For example, payment type, total payment value, and the credit card number.
Patron Information Enables the placement of information about the patron. For example, the patron name, address, and telephone numbers.
Donation Information Enables the placement of information about the donation made by the patron. For example, the campaign, donation date, and the total donation amount outstanding.
Donation Receipt Data Enables the placement of information about the donation receipt as it pertains to donation of a patron. For example, the receipt number, date the receipt was issued and the value of the receipt.
Miscellaneous Information Enables the placement of printer created information. For example, drawing boxes, drawing lines, and printing the internal ticket printing counter. The internal ticket printer number is a number generated by the printer every time a ticket is printed. If the same ticket is printed 4 times, each ticket will have an unique number.

Calculation Commands

Quick reference information for Calculation Commands



Calculation commands are great if you know the name of the field and you want to manipulate it.

However, sometimes you may need to add a new field from a pick list in order find the name of what you want.

The third line of the sample screen C_HOME_PHONE has no formatting in the field calculation.

This instructs the printer to left justify the home phone of the patron starting in row 15 and column 1040. To justify the phone number place the field in brackets and prefix it with the letters 'jst'. Follow the field (inside the bracket) with a comma and a single quote to start the formatting instructions, enter the formatting instructions, and close with a single quote.

For example, jst(C_HOME_PHONE,'-8') formats the field calculation to allocate 8 spaces for the home phone number and to right justify when printing.

String Justification

String Description Example
jst ()

jst(string1,number1,string2,number2,string3,number3,...) Returns a string containing the specified string left or tight justified with sufficient spaces added to make a total length specified by number.

The jst() function also includes concatenation. If number is negative the resulting string is right justified, if the number is positive the string is left justified; number must be in the range of 1 to 999.

  • jst('This is left justified',30) gives |This is left justified   |
  • jst('This is right justified',-30) gives |  This is right justified|
^n (caret) Causes the data to be centered in the field n characters wide.
  • jst('This is centered',^30) gives | This is centered |
-n (minus) Causes the data to be right justified in a field n characters wide.
  • jst('This is Right',-20) gives |*******This is Right|where * represents spaces
$ Places a $ sign in front of the data.
  • jst(PS_TOTAL_PAID,'$' gives $12.00 if the ticket price paid was 12.00
Pc Causes the part of the field not filled by the data to be filled by character c.
  • jst(PS_TOTAL_PAID,'-7P*' gives '**12.00' if the ticket price paid was 12.00
X Causes the data to be truncated if its length exceeds the field length. The default is not to truncate.
  • jst('abcdef','4') gives 'abcdef'
  • jst('abcdef','4X') gives 'abcd'
U Causes the data to be converted to upper case.
  • jst('this IS upper Case','U' gives 'THIS IS UPPER CASE'
L Causes the data to be converted to lower case.
  • jst('this IS lower Case','L' gives 'this is lower case'
C Causes the data to be capitalized.
  • jst('this IS Capitalized','C' gives 'This Is Capitalized'
Nnn Causes the data to be treated as a fixed decimal number with nn decimal places.
  • jst(0.235,'N') gives '0.235'
  • jst(0.235,'N2') gives '0.24'
E Applies to numbers only and displays a blank when the number is zero.
  • jst(0,'N2') gives '0.00'
  • jst(0,'N2E') gives ' '
, Applies to numbers only and adds commas as number separators.
  • jst(1234,'N2') gives '1234.00'
  • jst(1234,'N2,') gives '1,234.00'

String Functions

String Description Example

Returns the capitalized representation of a string, that is, the first letter of each and every word in the string is capitalized.

  • cap('tHeATre MANAGER') returns 'Theatre Manager'
con(string1, string2, [,string3] ...)

Returns a string concatenating or combining two or more string values.


Theatre Manager will build concatenations. Simply select more than one field from the available fields list when editing the field calculation. To format the concatenation simply treat the concatenation as one field calculation.


First name, address, and postal code information together on the same line and places a slash between each item. Formatting is limited to the group of fields linked together.

  • jst(con(MS_SECTION,', Row ',MS_ROW_NUMBER,', Seat ',MS_SEAT_NUMBER),'^38x').

Centers section, row, and seat number in a space 38 characters wide. A comma and row precede the row number and separate it from the actual number. A comma and seat precede the seat number and separate it from the actual number.

  • jst(con(dtw(PB_PERFORM_DATE),', ',dtm(PB_PERFORM_DATE),dtd(PB_PERFORM_DATE),dtcy(PB_PERFORM_DATE),' Time: ', jst(PB_PERFORM_TIME,'T:h:N A')),'^50')

Prints 'Saturday, December 21 1998 Time: 8:00 PM'. The printing would be centered in a 50 character space.

len() Returns the length of the string, that is, number of characters.
  • len('abcd') returns '4'
  • len('abcd') + 15 returns '19'
low() Returns the lower case representation of a string. Any non-alphabetic characters in the strings are unaffected by low().
  • low('tHeATre MANAGER') returns 'theatre manager'
  • low('1234') returns '1234'
mid( string, position, length) Returns a substring of a specified length, starting at a specified position, from a larger string. If position is less than 1 it is taken as 1, that is the first character; if it is greater than the length of the string, an empty string is returned. If length is greater than the maximum length of any substring of string starting at position, then the returned substring will be the remainder of string starting at position..
  • mid('Theatre Manager',9,3) returns 'Man'
  • mid('Theatre Manager',9,24) returns 'Manager'
pos(substring, string) Returns the position of a substring within a larger string. The substring must be contained within string in its entirety for the returned value to be non-zero.
  • pos(' ',J. Smith') returns 2 (the position of the space character)
  • pos('Mouse','Mickey Mouse') returns 8
  • pos('mouse','Mickey Mouse') returns 0 - note the case of the substring
upp() Returns the upper case representation of a string. Any non-alphabetic characters in the strings are unaffected by low().
  • upp('tHeATre MANAGER') returns 'THEATRE MANAGER'
  • upp('1234') returns '1234'
  • upp(mid(dtw(PB_PERFORM_DATE),1,3)) returns 'MON'
tStringFields.$splitString( String1, width, segment) Returns the Nth segment from the string string where the string is broken into even word boundaries that are no no longer than width.

CR's LF's, Tabs are converted to spaces and double spaces are then removed from within the string.

example: tStringFields.$splitString(P_PLAY_TITLE,1)

will take a long string like P_PLAY_TITLE and find entire words within the width of 40 characters and return only those.

eg, for a title like:

  • The Curious Incident of the Dog In the Night Time
  • 40 characters is: The Curious Incident of the Dog In the N
  • The last space before the 40th character is the space before the 'N'
  • segment #1 is: The Curious Incident of the Dog In the
  • Segment #2 is: Night Time
this can let you split titles and orient them dynamically on a ticket
tTicket.$getReceipt( Pixels) Prints a Moneris EMV receipt on the ticket printer using the font and rotation indicates. The receipt starts printing at the row and column specified. Each successive line will be separated by the number of DPI in the parameter. This function is best if it is the only thing in the calculation. If the payment was not taken through a Moneris EMV machine, you will want to print regular payment information instead. A sample payment receipt has been created for you that you can import which handles both EMV and internet credit card receipts in one ticket face.

Date/Time Functions

The date/time functions operate on a datestring to return date values or strings representing some part of a date/time. A datestring is a string recognizable as a date using a date format.

String Description Example
dat(datestring| number [,dateformat])

Converts a datestring or number to a date value using a second optional argument, a dateformat string. The date formatting string can be composed of the following symbols:

  • Y Year 98 (no century)
  • y Year 1998 (with century)
  • C Century 19
  • m Month short form (JUN)
  • M Month number (06)
  • n Month long form (June)
  • D Day of month (12)
  • d Day of month (12th)
  • W Day of week (5)
  • w Day of week long form (Friday)
  • V Day of week short form (FRI)
  • E Day of year (between 1 and 366)
  • G Week of Year (between 1 and 52)
  • F Week of Month (between 1 and 6)
  • dat('Dec 21 11','MDY') returns '122111'
  • dat('Dec 21 11','D m Y') returns '21 DEC 11'
  • dat('Dec 21 11','w, d n, y') returns 'Wednesday, 21st December, 1911'
  • dat('Dec 21 98','V m D Y') returns 'WED DEC 21 98'

Increments a datestring by a number of months. Months containing different numbers of days are accounted for.

Jan 31 96 increased by one month gives Feb 29 96, but beware, Feb 29 96 decreased by one month (using a negative number) returns Jan 29 96, not Jan 31 96.

  • dim(dat('Dec 21 98',3)) returns 'Mar 21 99'

Returns the year and century of a datestring as a string.

  • dtcy(dat('Dec 21 98')) returns '1998'
dtd(datestring) Returns the day part of a datestring unless it is part of a calculation when it is returns as a number.
  • dtcy(dat('Dec 21 98')) returns '21st'
  • dtcy(dat('Dec 21 98')) + 0 returns '21'
  • dtcy(dat('Dec 21 98')) + 1 returns '22'
dtm(datestring) Returns the month part of a datestring.
  • dtm(dat('Dec 21 98')) returns 'December'
dtw(datestring) Returns the week part of a datestring.
  • dtw(dat('Dec 21 98')) returns 'Monday'
  • upp(mid(dtw(PB_PERFORM_DATE),1,3)) returns 'MON'
dty(datestring) Returns the year part of a datestring.
  • dtcy(dat('Dec 21 98')) returns '98'

Converts a timestring to a time value using a second optional argument, a timeformat string. The time formattinG string can be composed of the following symbols:

  • H Hour (between 0 and 23)
  • h Hour (between 1 and 12)
  • N Minutes
  • S Seconds
  • s Hundredths
  • A AM/PM
  • tim('13:25:57','h:N A')) returns '1:15 PM'
  • tim('13:25:57','h:N.S A')) returns '1:15.57 PM'

Lookup Functions

The lookup functions provide a method for selecting items from a list of values.

String Description Example

 Returns the maximum value from the list of values. The values should all be numbers when numeric comparison is used or all strings when string comparison is used.

  • max(3,6,2,7) returns '7'
  • max('dagger','dog','digger') returns 'dog'
min(value1[,value2]...) Returns the minimum value from the list of values. The values should all be numbers when numeric comparison is used or all strings when string comparison is used.
  • min(3,6,2,7) returns '2'
  • min('dagger','dog','digger') returns 'dagger'

Selects an item from a list of string or numeric values. The number argument is rounded to an integer and used to select the item. value0 is returned if the result is 0, value1 if the result is 1, value2 if the result is 2, and so on. If the number is less than zero or greater than the number of values in the list, then an empty value is returned. The list of values can be a mixture of string and numeric values.

  • pick(2,'A','B','C','D') returns 'C'
  • pick(2>4,'A','B','C','D') returns 'A', as 2 is not greater than 4, thus it is False, where False equals 0.
  • pick(2<4,'A','B','C','D') returns 'B', as 2 is less than 4, thus it is True, where True equals 1.
  • pick(pos('A','DEF')>0,'Price Not Found','Price Found') returns 'Price Not Found'
  • pick(pos('A','ABC'),'Price Not Found','Price A','Price B','Price C') returns 'Price A'

Number Functions

String Description Example

Returns the magnitude of a real number ignoring its positive or negative sign.

  • abs(1002) returns '1002'
  • abs('-203.45') returns '203.45'
  • abs('12ABC') returns '0'

 Returns the integer part of a number; it does not round to the nearest integer.

  • int(23.1056) returns '23'
  • int('-2.66') returns '-2'
  • abs(int('-2.66')) returns '2'
mod(number1,number2) Returns the remainder of a number division, that is, when number1 is divided by number1 to produce a remainder; it is a true modulus function.
  • mod(6,4) returns '2'
  • mod(6,4) returns '2'
  • mod(9,1.5) returns '0'

Rounds a number to a specified number of decimal places by dp .

  • rnd(2.105693,2) returns '2.11'
  • rnd(0.5,0) returns '1'


Entering a label, or string of characters that will be the same on every ticket, is accomplished by placing the label in single quotes.

Ontario Face Value Requirements for Ticket Price

On July 1, 2018, Ontario (Canada) introduced a law regarding the primary/secondary ticket market. While it has direct applicability to Ontario, it might also be of benefit to other locales.

  • The content of the 'Fave Value' of a ticket is set up in Company Preferences->Ticket Options
  • For e-tickets, the display of the face value is enabled in the Web Options Tab. if set, then print at home tickets and web carts will automatically show the face value along with final price.
  • There is a ticket face calculation (illustrated below) that calculates the Face Value for the ticket face prior to printing it. All you need to do is include it on your ticket faces. where desired

Adding Face Value field to a ticket face

  • add a new calculation to the ticket face
  • Select Ticket Information as the category
  • Select Sale Price (using Face Value calculation) to insert the field into the ticket face
  • Place the face value field where you want it on the ticket and save
  • Make sure to test your ticket
  • Repeat for all affected tickets.

QR Codes and Printer Compatibility

As of September 2021, we are aware of two ticket printers that can print QR codes on the ticket face:
  • Any Microcom ticket printer manufactured 2018 or later. (any purchased from Arts Management will certainly work)
  • Any Boca printer with FGL language version 46 or later. You many need to talk to Boca to make sure - the firmware comparability list is below

Practical Automation does not support QR codes at time of writing and older printers are not field upgradeable.

Sample Ticket with QR code


Inserting QR code into a Ticket Face

To add a QR code to a ticket face, you need to make sure that the area yo want to print it on is big enough and is high contrast.. Usually that means an ALL-WHITE stub area. If the area you chose to print the QR code on has darker coloured background you may find scanning times increased.

The steps are:

  1. Insert a new calculation line in your ticket face.
  2. Select Ticket Information from the Categories field
  3. Select QR code from the Available Fields in the image to the right.
    • That will add the correct calculation to your ticket face as per the image below

      If you are using a Boca printer you will need to update the default QR code with additional characters. Where the default code looks like:


      backets will need to be added to the con statement following the QR references to make the code look like this:


  4. Change the Column to about 890 or so - so that it prints on the stub. The ticket example above uses 890 in the ticket face code shown in the next diagram.
  5. The Row might need to be adjusted a little to move the QR code away from the edge of the ticket and center it across the narrow part of the ticket. The ticket example above uses 100 in the ticket face code shown in the next diagram.
  6. You may need to remove some of the other fields that are on the stub area of the ticket face
  7. Test the ticket face with QR code
    • Do a test print to see that it works
    • Do a test scan of the ticket using your scanners to see that it works. Working only means that the scan is successful and that the ticket will likely be rejected as not being sold, or not for this day, etc
  8. Adjust the ticket face as necessary and reprint and retest


Sample QR Code from the above ticket exmaple


Explaining the QR code format

<QR#,#,#,#>{barcode text}

NOTE: You should not change the parameters in the QR code without talking to AMS support. Only adjust the position of the QR code on the ticket face using the Row and Column settings.

All of the Quick Response (QR) bar code command parameters are optional. If omitted default values will be used. The QR command and the barcode text is all that is required. For example the command {Arts Management} will create a Quick Response 2D barcode for the text “Arts Management” using all default values.

The Parameters, explained in order, are:

  • Point Size - between 3 and 16
  • Apply Tilde - either 0 or 1
  • Encode Mode - either 0,1, or 2
  • Error Correction Level - between 0 and 3
  • {Barcode text}
Point size we have found that '4' to '6' are suitable sizes for a bar code on a ticket stub
Apply Tilde When Apply Tilde is equal to 1, the tilde (~) may be used to recognize some special characters in the input data.
  • If set to 1, you can use the format ~ddd if you want to specify the ASCII code of the character to be encoded. Default is off. For example
    • If you enter the following text in the Data field: ~029AB you will actually be encoding GSAB where GS is a delimiter ASCII 29 character. This can be used in a single string to encode GS and RS characters (GS = ASCII 29 and RS = ASCII 30). Other commonly used ASCII codes are ~009 for a tab and ~013 which is a return function. These are useful when encoding multiple fields in a single symbol.
    • Theatre Manager Linea Pro Scanners use ~010 to represent a new line between data values and this cannot not be changed.

      1 is the default for Theatre Manager and is required

Encode Mode The data represented in the symbol may be compressed by changing the encoding mode, if certain text is being encoded. Valid values are:
  • 0 for Byte (upper and lower case letters)
  • 1 for Alpha-Numeric (upper case letters only) - default for theatre Manager
  • 2 for Numeric
Error Correction The level of Reed Solomon error correction level placed in the symbol. More error correction creates a larger symbol that can withstand more damage. Valid values are:
  • 0 for Level M, 15% recovery capacity
  • 1 for Level L, 7% recovery capacity
  • 2 for Level H, 30% recovery capacity - default for Theatre Manager - may be changed.
  • 3 for Level Q, 25% recovery capacity
{barcode text} Do not change any values in this - otherwise ticket scanning will not work.

QR Code for Scanning Gifted Tickets

Scanning tickets that have been gifted to another patron in the database require the gifted patron number be included in the QR code inserted on the Ticket Face. The existing ticket face with a QR code can be updated to include the gifted patron number:


  1. Open the existing Ticket Face that has a QR code

  2. Locate the line of code in the Ticket Face that looks like this:


  3. Double-click to open this line of code.
  4. Replace the entire code with this updated version:



Any tickets that have previously been Gifted and printed prior to updating the ticket face code can be unprinted and reprinted. This will ensure they can be scanned at the time of entry.