Version 10.2 (released October 7th, 2021)
Panorama X 10.2 is currently issued as a preliminary “preview” version. When the final version is released, the special notes about the preliminary preview version will be removed from this page.

Important Note: This preliminary “preview” version is not currently available for general release. At this time it is only available by private invitation. Subscribe to the Panorama Forum to be among the first to know when this release becomes more widely available.

## Installing, Running and Updating the Preview Version

Until the final release, Panorama X 10.2 will not download and update automatically when a new preview version is available. During the preliminary period you must download and update each preview version manually (the link is only available to users with a private invitation). Once downloaded, simply uncompress the software and move it to the Applications folder (or whatever folder you prefer for application software, however we highly recommend that you move it out of the Downloads folder).

If you are using macOS 10.15 Catalina or 10.16 Big Sur, a special step is needed the first time you run the preview version. Because this preliminary version of Panorama X is not notarized, these versions of macOS will refuse to run it if you double click on it. Instead, you must right click on it and choose Open from the pop-up menu. This is only necessary the first time you run it after downloading. After the first time, you can open it normally by double clicking on it or by double clicking on any Panorama database file.

## Panorama X Team Server

The most important major new feature of version 10.2 is the inclusion of Panorama X Team Server, including database sharing and database web publishing. Database sharing allows multiple users to share one or more databases in cooperation. Each user access the data through their own copy of Panorama X on their computer. The server keeps everything organized so that multiple users can view and modify data without interfering with each other and keeping everything up-to-date. Users can share data across a local network or even across the internet.

Database web publishing allows information in a Panorama database to be viewed and modified using a web browser – Safari, Chrome, Firefox, etc. With database web publishing your databases can reach a global audience – anyone with a browser on any type of device and/or operating system.

To learn more, see Panorama Server.

Important Note: During the preliminary “preview” period, access to the server features requires signing up for the early access program. Please visit Panorama X 10.2 Preview Release Frequently Asked Questions if you are interested in signing up for this program.

### Panorama X Team Server vs. Panorama 6 Enterprise Server

If you’ve used Panorama 6 Enterprise Server, you’ll find that many aspects of Panorama X Team Server are very familiar, but there are some significant differences:

- Panorama X Team Server is much simpler to install and configure. You’ll never have to worry about configuring Bonjour Threshold again. Shared database configuration and administration tools are now integrated into Panorama, instead of being stuck into a submenu of the Wizard menu.

- Panorama X Team Server runs completely in the background, with no windows, menus or dock icon. Launching, shutting down, and configuration of the server is performed using the Preference dialog of a standard copy of Panorama running on the same computer (this copy of Panorama only needs to be open when actually configurating the server).

- It’s no longer necessary to upload and then download an entire database just because a single procedure or form has been modified. The New Generation process, which used to work only for database field structure, now makes it easy and fast to distribute any kind of change to all shared users of the database.

- Panorama X Team Server automatically compresses all large data transfers in .zip format (both up and downloads). Uploading a database, downloading, and synchronizing are much faster than before, especially with large databases. When uploading and downloading large amounts of data, Panorama X always shows a progress indicator in the toolbar.

- Database sharing status is always shown in the toolbar.

- Panorama X Team Server includes it’s own built in web server, but also can be used with external web servers. Industry standard TCP/IP is used for all client/server communication, even on the local network, the often troublesome AppleEvent protocol is not used. If you want to use the Apache web server built in to macOS, Panorama X now includes a panel to control Apache (since Apple no longer provides this), and Panorama X can automatically set up permissions and edit httpd.conf as needed to enable CGI (in the past this had to be done manually in a very technnical process).

- By default, Panorama X Team Server is locked to your account for increased security. If necessary access can be granted to specific alternate accounts (for example if you need to give access to a consultant), or security can be disabled.

- Improved server variables (see letservervariable, adjustservervariable).

- A new preference setting in the Client preferences panel controls whether the user is prompted when a new generation of a database is available. The new default is to simply install the new generation without asking for confirmation.

- The various “fill” statements (FormulaFill, Propagate, Unpropagate, PropagateUp, UnpropagateUp, RunningTotal, RunningDifference) now work much faster in most situations when used with shared databases, and only transfer to the server data cells that have actually changed. Also, the serverformulafill statement can now use variables in both the selection and fill formulas.

- Panorama X Team Server does not support modification of shared databases when offline. You can always view any database, but you cannot edit a database unless you are connected to the server.

- Most web code written for Panorama 6 Enterprise Server will run with little or no modification. The modifications needed are usually less than what is needed for regular Panorama code since web code usually doesn’t deal with operating system or user interface changes.

- Web code can now use the save statement, the special websave statement is no longer required (though still allowed).

- The Web Form Converter has been redesigned and now allows you to see a preview of how your form will look on the web without having to use an external web server. The logic of the converter is the same except for Image Display objects, which will require adjustment.

- Panorama X Team Server can be run in conjunction with Terminal.app so that you can view console output from the server in real time, and Panorama X includes new tools for generating console output for debugging.

- There is no CGI Simulator wizard, but it is now much easier to debug web code on a live server (partly because of the previous item).

## Comprehensive New Relational Database Features

Many database applications require multiple database files working together. In previous versions of Panorama this was primarily accomplished with lookup( functions. This could generally get the job done, but was tedious because there was no overall definition of the relationship between the databases. This approach required the application developer to manage all the tedious details of database relations manually – a lot of extra work to set up and very difficult to change if the database structure ever changed. This manual approach could also be prone to errors since all of the details had to be manually managed by the programmer.

Panorama X 10.2 introduces a completely new, systematic approach to relationships between databases. Each relationship is managed in one place, with a comprehensive, easy to use visual dialog panel. This relationship is permanent (saved with the database) and can be quickly applied wherever needed. Many common relational database tasks are now built in, and available automatically once a relation is set up. Other tasks can be accomplished with simple dialogs and/or with far less code than was previously required.

Note: For compatibility with existing database applications, legacy features like lookup( functions are of course still available and will continue to work, but these are now considered obsolete and are completely unecessary for new development.

#### Database Options>Relations Panel

To set up a relational link between the current database and one or more other databases, use the Database Options>Relations dialog sheet. This panel allows you to tell Panorama what the common fields are between two databases.

This panel may look complicated, but if the databases have exactly corresponding fields a relation can be set up in seconds with just a few clicks. See Relational Database Management to learn all the details about configuring a relation with this dialog. If the fields don’t exactly correspond, you can set up formulas to tell Panorama how they do match up.

Once a relation has been established between two databases, you can use that relation to quickly select data that corresponds to the current database, to display related information in a form, to accelerate data entry of related information, to post updated data to a related database, and to perform a full join between two databases.

#### Selecting Data Related to the Current Record

If the current database has one or more databases related to it, additional items are added to the Search menu to allow you to quickly select data related to the current record. These extra items also appear in the menu that appears when you click on the record count in the tool bar. This illustration shows how easy it is to select data related to the current record.

Note: For clarity, the illustration shows the Vendor and PayTo fields as the active fields in the respective databases, but this is not necessary. Unless the relation involves a line item field, it doesn’t matter what field is active when the selection is made.

A relational selection can also be programmed into your own custom code, see selectrelated to learn how to do this.

#### Displaying (or Printing) Related Data in a Form

Panorama has two functions that can be used to display related data on a form. When using these functions the related data is not copied into the current database, but it can be displayed as if it was part of the current database. This example uses the related( function to display the address of the company the check was written to, even though the address is stored in a separate database.

If the formula is constructed properly, the related data display will update automatically as you switch from record to record (see related( to learn how to ensure this happens).

If you expect there to be multiple records related to the current record, use the relatedarray( function. This example uses this function to display a list of all of the checks written to this vendor. Again, the list of checks is being displayed directly from the related Checkbook database, without ever being copied into the Vendors database.

This example uses a Text List Object to display the list of checks, but you can also use a Matrix Object or a Text Display Object.

#### Linking Clairvoyance™ and Data Entry to a Related Database

Panorama’s relational system can be tightly integrated with Clairvoyance™ (auto-complete) and with data entry. To illustrate this, I’ll use two databases set up for a hobby shop – a sales database (order entry) and a customer account database. These databases are related as shown by the arrows in this diagram.

To see how remotely linked Clairvoyance™ works, just start typing into the Name field in the sales database (this diagram shows the form instead of the data sheet, but the underlying data is the same and relations work the same in either view.) The contact information in the order form is linked to the customer database, so Clairvoyance™ kicks in across databases to auto-complete the name.

When the return or tab key is pressed, Panorama uses the pre-defined relation to populate all of the contact information in the new order. Note that this auto join happens completely automatically – there is no coding needed, or even a formula (other than formulas set up in the relation definition).

This order form database is also relationally linked to a catalog (price list) database. When I start typing an item into the order, Clairvoyance™ auto-completes the entry for me from the catalog, even if this item has never been entered into an order before.

When the return or tab key is pressed, Panorama automatically populates the price and calculates all totals.

Simply rinse and repeat to complete the rest of the order.

To learn how to set up Auto Join and Remote Clairvoyance™ see Relational Database Management.

Note: Panorama X 10.2 also includes a new joinonerecord statement works like join, but only for the current record instead of for the entire current database. This new statement is used by the auto-join feature, but you can also use it in your own code in lieu of the lookup( function for data entry.

#### Posting Updated Data to a Related Database

When two databases share common information, a simple one line program using the posttorelated statement can be used to update a related database with changes made in the current database, as shown in this diagram.

The same program will work to add completely new records to the related database.

There’s not much more too it, but see the posttorelated statement for additional details.

#### Joining two Related Databases

The final operation available for related databases is a full relational join. To perform a join, Panorama scans both the current and the related database, identifies all matching records, and updates the current database with information from the matching records in the related database. Optionally, it can also append any non-matching data from the related database into the current database.

This new join capability is much simpler and faster than the old method of using formulafill with a lookup( function – in our tests the join statement was able to join a single field between two 20,000 record databases in 3 seconds, vs. 7 minutes when using formulafill with a lookup(! The join feature can join multiple fields at once (no limit) for even larger performance gains over previous versions, and can is capable of the same types of inner and outer joins available in modern SQL systems.

To perform a join into the current database, choose File>Import>Join Panorama Database with Current Database. This opens the Join Database dialog.

This dialog allows you to select the database you want to join from, and to customize the options for the join. See Join Databases to learn more.

The join operation can also be programmed into your custom code. See the join statement to learn how to do this.

#### Additional Resources

For even more detailed information about the new relational database capabilities, see these pages:

- addrelatedrecord -- The addrelatedrecord statement adds a new record to the related database corresponding to the current database.
- findrelated -- The findrelated statement finds information that matches the current record in a related database.
- Join Databases -- joining another database into the current database (relational join).
- join -- The join statement joins data from another database into the current database.
- joinonerecord -- The joinonerecord statement joins matching data from another database into the current record.
- Linking with Another Database -- techniques for relating multiple database files so that they work together.
- posttorelated -- The posttorelated statement posts data in the current record to the corresponding record in a related database.
- related( -- The related( function searches a database for a record in a related database that matches the current record in the current database based a relational specification (based on one or more key fields or formulas in each database), then uses a formula to return other information from the same record. This is similar to the lookup( function, but instead of using an individual field for the key, a relation is used (see Relational Database Management).
- relatedarray( -- The relatedarray( function builds an Text Array by scanning a database and creating an array element for every record that matches a relational specification (based on one or more key fields or formulas). This is similar to the arraybuild( function, but instead of using an individual field for the key, a relation is used (see Relational Database Management).
- relatedrecordid( -- The relatedrecordid( function returns the record id of a record in a related database that matches the current record in the current database based on a relational specification.
- Relational Database Management -- linking together multiple databases based on common data.
- Relational Workshop -- tool that assists in composing relational lookup(, superlookup(, lookupall( and arraybuild( functions.
- selectrecordsrelatedto -- The selectrecordsrelatedto statement selects records in the current database that are related to any record in another database.
- selectrelated -- The selectrelated statement selects information that matches the current record in a related database.

## Beyond Server and Relational – General Panorama X 10.2 Changes

In addition to the new server and relational capabilities, many other improvements and fixes have been implemented in this new version. Panorama X 10.2 is probably the second biggest leap in Panorama’s 32 year history, only falling short of the jump from Panorama 6 to Panorama X 10.0.

- Panorama X 10.2 includes over a hundred bug and crash fixes, making it much more stable than previous versions.

- Automatic form construction isn’t new, but it has been vastly enhanced in Panorama 10.2, and for many applications a form can now be built entirely automatically without needing any manual “twiddling” – a huge time saver and for users that aren’t graphic design gurus this will also result in more attractive forms as well. New capabilities include the ability to control the position and style of field labels (including color and/or gradient backgrounds), more layout options including the ability to arrange multiple fields on the same row, the ability to “snap” objects into a grid for perfect alignment, custom background colors, the ability to display fields without making them editable, more control over spacing, padding and borders, and control over the editing behavior of form objects (insertion point, focus ring, pop-up editing, etc.) Here are four forms that were created completely automatically (except for the logo at the top). (There are also several automatically generated forms displayed in the relational section above.) The Automatic Form Construction page has been completely updated to reflect these new capabilities.

- In previous versions, Panorama X had no ability to automatically generate line item form objects. Version 10.2 includes a new constructor dialog specifically for this. You have complete control over the layout of the line items, including options like line numbers, non-editable columns, and column title styles. Here is an example of a line item arrangement that was created completely automatically, to learn more, visit Line Item Grid Constructor. (The invoice examples in the relational section earlier on this page were built using this constructor.)

- The Line Item Fields help page has been vastly expanded, now covering all aspects of using line items, including setting up line items, using line items in a form, using line items in formulas, and using line items in database relations.

- For extensive editing of constructor templates, Panorama now allows you to hold down the Option key when opening a constructer to open a separate editor window that can remain open while you’re editing, greatly speeding the ability to incrementally revise an automatically generated form. (There is also a Preference option to make this the default.)

- In addition to showing text, a Text Display Object or Text Editor Object can also now display a background. The background can be a pure color specified by name or HTML color specification, a bezel, or a gradient. No additional objects are required, and an object with a background can still display a border as well as the background.

- Panorama now automatically checks the integrity of the database each time it is opened or saved. See Database Integrity Checks for more information.

- There are new functions htmlcolor( and info(“colornames”). The htmlcolor( function is much faster and smarter than the old getwebcolor( function (the new functions are written in Objective-C instead of Panorama code).

- Added strikeouts, super and subscripts, drop shadows, and vertical baseline adjustment to rich text.

- Added configurable system to warn user if they are about to perform an action that will irrevocably delete or modify something. Normally this warning will only appear if the action cannnot be undone because the database is shared. However, the user can use the Warnings panel of the Preference window to configure warnings so that they will always appear, or never appear even if there is no undo possible (see Confirmation Alerts).

- Now supports checking for duplicate or unique values as data is entered (see Data Input Validation). (Note: Panorama X now imports the No Duplicates/No Unique property from Panorama 6 databases, but Panorama X 10.0 and 10.1 did not do so. If you have already brought over your database from Panorama 6, you will either have to re-import your database, or manually set these options again using Panorama X 10.2.)

- The new Object Value dialog (Graphics Mode) displays the raw text result of formulas embedded in the selected object. This makes it much easier to diagnose formula problems in a graphic object, especially graphic objects that don’t normally display the formula result (Image Display, Web Browser, Popup Menu, etc.). See Diagnosing a Formula embedded in a Form Object to learn how to use this dialog.

- Panorama now validates numeric data input as data is entered (see Data Input Validation).

- Dates are also checked for validity (and yes, Panorama knows all about leap years and the varying length of February).

- Allows the database designer to set up custom validation of data as it is entered (see Data Input Validation).

- Brand new View Search wizard for comprehensive searching of procedures and forms. This is similar to the Open View dialog, but allows search windows to stay open as long as you like, and to perform multiple searches at once.

- New Panorama Live Video Training window facilitates live courses, including displaying the upcoming course schedule in the local time zone. Also the Panorama Video Training window now allows the list of videos to be updated at any time, independently from new Panorama releases, so look for more video content from ProVUE in this window. You can also now purchase video training courses from this window (click the shopping cart icon).

- New Reorder Fields dialog makes it easier to rearrange the fields in databases with lots of fields, and works even if some fields are hidden (see Rearranging Field Order). Special thanks to Gary Yonaites for providing the code for this dialog.

- For improved performance, Panorama now limits the number of visible columns in the data sheet. The default limit is 150, but can be adjusted in the Preferences:Advanced panel. If there are additional undisplayed fields, the last column of the data sheet shows +nn (the number of additional fields). See Limiting the Maximum Number of Data Sheet Columns.

- You can now quickly pull up a favorite summary or crosstab table with a single click on the Summary tool in the toolbar of a data sheet or form. The pop-up menu will list all of the favorite summaries and crosstabs you have set up. Selecting a favorite from this menu will open a new Summary Workshop or Crosstab Workshop window with that favorite displayed.

- The Summary Workshop and Crosstab Workshop now support exporting the analyzed data as tab delimited, comma delimited or JSON text files.

- Many times multiple separate databases are required to accomplish a database task. For example, if you are working with an Invoice database, perhaps you also need to have the Inventory, Customer List and Price List databases open. You can now configure Panorama to open these auxiliary databases automatically with the Auxiliary panel of the File>Database Options dialog sheet. Once this panel is set up the additional databases will open automatically whenever the primary database is opened, no additional code is needed. See Auxiliary Databases to learn more about this new feature.

- When you open a database, Panorama normally opens up the same windows that were open the last time the database was used, so you can get right back to work where you left off. However, you might want to set up a database so that it always opens to certain specific windows, no matter what windows you were using before. You can now use the Database Options “Initial Windows” list to explicitly specify which windows should be opened when the database is opened. You can also now specify “Initial Dimensions” for each form, if specified, the form will open to these dimensions instead of to its previous location. See Newly Opened Database Window Arrangement to learn how to set up the exact arrangement and positions of windows that appear when a database is opened and when a form is opened.

- It’s now possible to abort an endless procedure loop by pressing Command-Shift-Escape (see [Preventing Endless Loops[]). Also, while a procedure is running all menus are disabled and all clicks and keypresses are ignored until the procedure has finished (so that the clicks and/or key presses don’t interfere with the operation of the procedure).

- The new Debug Instrumentation feature enables conditional logging of the internal state of Panorama program code for rapid debugging. The instrumentation control panel (shown below) allows the granularity of logging to be controlled at the level of individual procedures. This means that the code necessary for outputing debug information can be left permanently in production code, but selectively enabled only when trying to diagnose a problem. This granularity lets you keep clutter in the log to a minimum, improving performance and making the log easier to analyze.

- When the Instrumentation panel is enabled, you’ll also see a new Instrumentation menu at the end of the menu bar. This menu is displayed with a microscope icon. The top item in this menu provides quick access to the Instrumentation panel. The other items provide quick, universal access to features in the Instrumentation panel withough having to actually open that panel.

- Panorama has a new diagnostic mode that allows a database to be opened with all implicitly triggered code temporarily disabled (.Initialize, .CurrentRecord, .ModifyRecord, etc.). This allows you to work on the database even if your implicit code has an error or problem that would normally interfere with using the database. See Opening a Database in Diagnostic Mode to learn how to use this mode.

- If you are managing a fleet of computers that needs to run Panorama X, Panorama now provides a mechanism to save a standard configuration and then quickly duplicate that configuration on other computers via a link. You can also include account credentials in the link, so that a new computer can be configured for use with Panorama with a single click! See Deploying Panorama in an Organization to learn more about this option.

- Panorama has a new automatic software update window, see Updating Panorama X. This window gives you the option of installing beta versions, and to install older versions if needed.

- When using the Data Sheet in Big Sur, Panorama now correctly updates the highlighted cell when moving left or right within a row.

- Icons in the toolbar that were vertically misaligned in macOS 10.15 and later are now correctly lined up.

- Fixed problem that could cause Clairvoyance to be unreliable with certain data combinations.

- New menu command Hide Line Item Fields makes it easy to get line items out of the way when working in the data sheet. This command only appears in the Field menu if the database has line items. This command is recordable, and tere is also a new hidelineitemfields statement.

- Panorama now has the ability to work with time zones, including the ability to convert times and superdates from one time zone to another (converttimezone(), to find out the local time zone (info(“localtimezone”)), to find out current and future daylight savings time status (daylightsavingstimeoffset( and nextdaylightsavingstimetransition() and to find out about available time zone regions (info(“timezones”)) and abbreviations (info(“timezoneabbreviations”)). Note that when converting between time zones, the current daylight savings time status in both zones is automatically accounted for.

- You can now use the Preferences dialog to choose the default action in the Find/Select Dialog – either Select (as before) or Find.

- The GetText, GetTextOkCancel, and GetTextDialog statements now activate the text field automatically when the dialog opens (so you can just start typing without having to click in the dialog first).

- The GetTextDialog statement has a new sheets option that causes the dialog to appear as a sheet attached to the current window, instead as a standalone modal dialog.

- All windows now have a unique numeric ID. This allows code to reliably reference a particular window, even if that window has been renamed. For an overview of this new feature, see Window ID Numbers. The window statement and windowinfo( and windowglobalvalue( functions have been updated to allow windows to be specified by ID number. The new functions info(“windownumber”), info(“windownumbers”), info(“datasheetwindownumbers”), info(“formwindownumbers”), info(“procedurewindownumbers”) and listwindownumbers( functions return ID numbers. The getformoption( and getprocedureoption( functions have been updated to optional return window number ID’s. The new function info(“clickedwindownumber”) returns the number of the window the mouse was clicked in (which may be different from the active window). The new info(“dropwindownumber”) function is used to find out what window a drag and drop operation wound up on. Finally, the magicwindow statement now allows a window number to specify the window, as an alternate to the window name.

- If a loop isn’t written correctly, it can continue running endlessly, causing Panorama to freeze. To prevent this problem, you can now set up a preference to specify the maximum time that a loop can run. Choose Preferences from the File menu, then click on the Advanced panel. In this panel you can edit the timeout value directly or you can choose from a set of common timeouts from the popup menu. Choose ∞ if you don’t want a timeout, but rather the option to run endlessly forever (this is the default). See Preventing Endless Loops to learn more about this feature, including how to set up custom timeouts for each different procedure (the timelimit statement and info(“timelimitremaining”) function).

- Added support for x-callback-url interapplication communication. This includes the xcallbackurl statement and the `panoramax://` url scheme with x-callback-url support with two actions – `panoramax://x-callback-url/run/database/procedure/label` and `panoramax://x-callback-url/wizard/wizard+name` (or `wizard%20name`). This enables interopability between Panorama and programs that use the x-callback-url protocol, including Ulysses, Drafts and Bear.

- The new Timer Workshop is a tool for monitoring timers and creating and testing timer configurations. A special thank you to Gary Yonaites for the idea of this workshop, and for writing most of the Create Timer panel in this workshop.

- The Fill and Formula Fill dialogs now have an icon for inserting field names. When you click on this icon (upper left) a popup menu of field names appears. Choosing a name inserts it into the dialog, with chevrons if necessary.

- The new openasyncprogresswindow statement makes it super easy to display a progress window for long running tasks like downloading large files from the internet. It’s designed to be paired with the urltask( function, but can also be used with timers.

- The Customize Toolbar dialog sheet (that appears when you right click on the toolbar) now displays the labels of each tool, not just the icons.

- New alwayskeepopen database option. If enabled, the database won’t close when all its windows are closed, but will stay open secretly in memory. This can be enabled in the Database Options>General panel, or with the setdatabaseinfo statement (and observed with the dbinfo( function).

- Two new tools are available in the data sheet, Copy Record and Paste Record. (Note: These tools are not in the toolbar by default, you must right click on the toolbar to open the Customize Toolbar dialog sheet, then drag these tools into place.) Special thanks to Gary Yonaites for the icon design of these new tools.

- If a database contains an `.Initialize` procedure, that procedure now runs immediately when a database is opened. If a database is opened by code, the code following the opendatabase or openfile statement doesn’t run until after the `.Initialize` procedure is finished (this is different than in versions 10.0 and 10.1, where the `.Initialize` code wouldn’t run until after the code in the original procedure). You can now even put an alert or dialog in the `.Initialize` procedure, though that is still not considered a best practice. If an `.Initialize` procedure encounters a runtime error, a notification will appear, but any code following the opendatabase/openfile statement will still run normally. Finally, the `.Initialize` procedure is now documented in the Custom Database Initialization help page.

- New implicit form actions: `formGRAPHICSMODE:` and `formDATAMODE:` allow custom code to run when switching in and out of graphics mode. See Implicitly Triggered Procedures to learn how to use form actions.

- New menu command Source>Copy Indented Code for procedure windows. This command copies the currently selected code (or the entire procedure if nothing selected) onto the clipboard, but with four leading spaces. The text can then be pasted into the ProVUE Forum for perfect code formatting. Voila!

- Added new _OnErrorCode variable for trapping errors in a specific database or window. This makes it possible to eliminate any chance of the user seeing an error alert in that database or window. See Error Handling to learn more about this new feature.

- If a code error occurs while a dialog is open, Panorama now displays an error alert as it did before, but when this alert is closed, the dialog closes as well. This eliminates the possibility of a dialog getting “stuck” open. In the past you could press the ESC key to close the dialog and continue with normal operation, but few users were aware of this option and most would resort to force quit. If the Enable Advanced Error Dialog option is enabled (in the Advanced panel of the Preferences dialog), the error alert will also offer the option to open the Error Wizard to display more information about the problem.

- When importing a Panorama 6 database into Panorama X, the form preferences for tab order are now imported correctly for the Natural and Back-to-Front options.

- A Popup Menu Button Object now has a choice of data sources, either Field/Variable (like before) or Formula. If the source is Formula, then any formula can be used, not just a field or variable. The choice is placed into a fileglobal variable named PopupMenuResult. This is similar to the Formula mode of a Text Editor Object. This makes it makes it much easier to use a popup editor to edit things that aren’t fields or variables, for example preferences.

- The Open View dialog is now more “keyboard friendly” for fast, keyboard only operation, more like Xcode’s “Open Quickly” dialog. 1) When the dialog initially opens, the search text is automatically highlighted, so you can just type 2) As you type in a search, the first matching view is automatically highlighted, so you can just press Return to open it. 3) You can press Command-Down and Command-Up to move up/down thru the matching items using the keyboard, then press Return to open 4) Press Command-Delete to clear the search text, starting a new search with a single keystroke.

- Text List and Matrix objects now update when data in the current record is updated (when the Database Navigator option is enabled).

- The new measuretext( function returns the height and width (points) of a string of text in a specified font and size.

- New hidefieldsbetween statement makes it easy to look at only the first and last few fields in a database.

- New titlecase( function, which capitalizes first character of each word, but not articles, prepositions, and conjunctions under 5 characters (unless they are the first or last word in the text). This function was suggested by Stan Ulrich and implemented by Gary Yonaites – thank you! In addition to the function itself, a Title Case option has been added to the capitalization pop-up menus in the Morph Field Dialog and the Morph All Fields Dialog.

- New blindposixscript( function allows Panorama code to run a UNIX script in the background.

- New filebookmark( and bookmarkpath( functions allow the name and path of a file to be stored persistently, even if the file is moved or renamed.

- Panorama now includes a new Global Dictionaries feature for high performance dictionary applications. The new global dictionaries are much faster than the existing data dictionary feature (however, they are more inconvenient to use).

- The new procedureexists( function provides a fast an easy way to check to make sure that a procedure exists, as you might want to do before attempting to call it.

- New labelize( function saves double typing of field/variable names when displaying a field or variable in a log or message.

- New editfield statement begins editing of the specified field, as if the user had clicked on that field.

- New BooleanValue( function, which makes it easy for subroutines, custom statements, and custom functions to evaluate boolean parameters in a friendly way.

- Adds six separate new functions for encoding URL components – encodeurlfragment(, encodeurlhost(, encodeurlpassword(, encodeurlpath, encodeurlquery( and encodeurluser(. Because of these new function, the urlencode( function is now considered obsolete. You should not use it in any new applications, and may want to review how it is being used in existing applications.

- New ability for a subroutine to access and modify the local variables of its caller, using the callerslocalvariablevalue( and info(“callerslocalvariables”) functions, and the setcallerslocal statement. Use this new unstructured capability with care.

- New straightquotes( function converts smart quotes into straight quotes.

- New loremipsum( function generates dummy text. Thanks to Gary Yonaites for contributing this code.

- New constant( function generates a formula constant from any expression.

- New formulastrings( function extracts a data array of all text constants in a formula.

- New ConvertVariablesToConstants statement does exactly what it says – takes a formula and replaces any variables with the actual value of the variables.

- New openurlinbackground statement, works like openurl but doesn’t bring the app forward. For example you can open a web page without bringing the web browser forward.

- When importing or exporting CSV text files, Panorama now uses semicolon (`;`) as the default field separator if the system preferences are set to use a comma as the numeric decimal point (for example in much of Europe). See importtext, importline, databaseexportcsv, csvexportline(, csvexportlinevisiblecells(, csvtotsv( and info(“csvseparator”).

- Added two new functions for converting TSV (tab separated) text fields into other formats. The tsvtocsv( function converts the text into comma separated text. The tsvtojson( converts the text into JSON.

- Added new statement StdOut, which sends one or more characters to the terminal console. Unlike the NSLog, no additional time/date stamp is added, giving the programmer complete control over the text to be output.

- Add four new statements and a new function for application management: BringPanoramaForward, HidePanorama, HideOtherApplications, PanoramaAppVisibility, and info(“panoramaisactive”).

- Added the new OpenWithTerminal statement, which will open any application using Terminal.app. This makes it easy to see any console output from the program, which is very handy for debugging.

- Implemented the SavePartialDatabase and PartialDatabaseUpdate statements, which can be used as a pair to transfer procedures, forms, field properties, etc. from one database to another, without disturbing the data.

- New zipcompress function, which works like compress but uses the `ditto` shell tool to do the compression (which makes for much easier extraction of compressed folders). Thanks for the inspiration from Gary Yonaites.

- New zipuncompress statement, properly unzip’s compressed files created by the Finder and by the zipcompress statement.

- Added the progresssync option to the urltask( function. This enables display of progress of multiple asynchronous downloads simultaneously in a Matrix object (as an example, this is used in the Server Administration Wizard.

- The openform statement has a new option, NoVersionButton, that allows you to remove the caret icon just the the right of the window title (at the top of the window), and removes the ability to click on the title to rename the document, or to Command-Click on the title to see the path to this document. This option is now used on all wizard and utility windows (About Panorama, Memory Usage, Formula Workshop, etc.).

- Added new object action to matrix objects – getcelltext. This action gets the current text from a specific cell in the matrix (if the matrix is using a query, there is no other way to get this). The syntax is:

  objectaction “object”,“getcelltext”,cellnumber,variable

- Added three new statements that can customize the banner that appears in the middle of data windows (this banner normally shows the number of selected/total records). The SetBannerProgressBar statement displays progress from 0 to 1 as a background bar in this banner (the URLTask( function has also a new option to display progress in this banner). The SetBannerMessage statement allows you to temporarily customize the message that appears in this banner. The SetBannerIcon statement allows you to add a small icon on the right hand side of the window, for example a lock icon.

- If you write special code to customize the tab order, that code can now cancel the tab operation by returning empty text (`""`) (see Custom Tab Order).

- Fixed multiple problems with group objects, in particular, objects that edited variables now work if included in a group (Text Editor, Checkbox, etc.) and tooltips now work with objects included in a group.

- The Find & Open dialog now excludes any Panorama Server databases on the computer (if the server is running on the same computer), and any databases in the `/Application Support` folder

- Added new serverlookup(, serverlookupall( and serversuperlookup( functions, added these functions to the Relational Workshop wizard, and removed the Use Server for Lookup option from the form preferences panel.

- The copypartialdictionary( function now allows the second parameter to be a carriage return delimited list of key names, making it much easier to generate this list with a formula.

- The database parameter of the formulavalue( function is now optional. If omitted, the current database is assumed.

- Added new functions formulaidentifiers(, formulafields( and formulavariables(. This functions return a list of identifiers (fields and/or variables) referenced in a formula.

- Added new dictionaryfromarray( function and setlocalsfromdictionary statement. These can be combined to easily transfer variables from one context to another.

- Added new posixscript( function, which is similar to shellscript( but uses a native Cocoa API (NSTask) instead of AppleEvents to run the script (in some situations this is much faster).

- New runningappinfo( function returns information about a specific app currently running on the computer, or all running apps. This function is very fast, much faster than using a shell script to perform the same task. The new Instruments panel uses this function to check to see if Console.app is running.

- New usefunctioncallerslocalvariables statement allows code in a call( function to access the local variables of the code that called it.

- New timerexists( function makes it easy to check whether a timer is currently running.

- Timers can now be locked with a password (see starttimer). If the operation of a timer is critical, this can prevent casual users from inadvertently disrupting timer operation.

- The dbinfo( function now has a lockmessage option, so that code can find out the status of the most recent attempt to lock a record. It also includes over a dozen new options for accessing the client/server options associated with a database.

- The views( function has a new option, viewtypes, which restricts the output to specified types of views, either procedures, forms, or data sheet.

- New croptext( function, cuts off text if it is too long, adding ellipsis to indicate that it is cut off.

- New calledby( function allows a procedure to check whether it was called from a specific procedure, a specific database, or both.

- Added PartialDatabaseSaveDialog and PartialDatabaseRevert statements, should be handy for debugging, allowing database to be modified and then reset back to a known state, even if the database is shared (for shared databases, this only works if the client and server are on the same computer).

- New editcellwith statement works like editcell but pre-loads the editor window with any text you want. The database isn’t modified until editing is complete.

- Changed dbinfo(, info( and getfieldproperties( functions to allow formulas to access to field names and field information even when the user cannot change the design of the database (now this information is only restricted if the user is not allowed to use standard UI). This allows the Find/Select, Sort, Morph Field, Summarize & Analyze and Hide/Show Fields dialogs to work properly when the user is not allowed to change database design.

- The dumpdictionaryquoted( function now outputs any binary values in the dictionary as `[[[BINARY DATA]]]` (instead of spewing out a bunch of random looking garbage).

- New function dumpdictionarysource(, useful for building blueprints that contain a dictionary. Also the new dictionaryassignmentscode( function generates executable code from a dictionary, to convert a dictionary into separate fields or variables.

- The setfieldproperties statement now allows the database and field name to be specified, so now any field in any open database can be modified, not just the current field in the current database. If these parameters are omitted, it works exactly as before, maintaining compatibility with existing code.

- Added the DatabaseConsoleDump and ServerDatabaseConsoleDump statements. These statements were developed to assist ProVUE with debugging, but they are available for anyone (as long as you run Panorama under Terminal.app).

- New Advanced tab added to the Preferences dialog.

- The Client panel of the Panorama Preferences now allows you to choose Notification or Alert to appear when a server error occurs.

- Fixed multiple significant bugs in the copyfile statement. 1. It now checks to make sure that the destination folder is writeable. 2. It now creates the destination folder if it doesn’t already exist (as Panorama 6 did). 3. It now replaces the destination file if it already exists (as Panorama 6 did).

- Fixed multiple significant bugs in the copyfolder, copynewerfile and copynewerfolder statements, and added a new copynewerfile( function. The folder copying statements now have the ability to filter the list of files being copied, and to report the progress of the copy back to the calling program.

- Multiple changes have been made to the protocol used by the `..PostSynchronize` procedure (if present, this procedure is called during client synchronization. If you have a database with this procedure, you may need to make adjustments (see synchronize). First of all, `..PostSynchronize` is now always called, even if no records were downloaded. The second change is that `..PostSynchronize` is now called with a dictionary instead of 4 separate parameters. The final change is that synchronization no longer displays a notification if there is a `..PostSynchronize` procedure, in that case, the `..PostSynchronize` procedure must display the notification itself (the default notification message is passed in the dictionary if you want to use it, or you can customize your own message).

- Added new wait and ExecuteASAP statements to facilitate running code with a slight delay. The new info(“runningatomic”) function checks to see whether or not code is using the normal run loop. Code that runs outside of the run loop is now called Atomic Code instead of ..Handler code. There is now an extensive explanation of how Panorama code interacts with the run loop in Understanding the Run Loop.

- The new waitfortask and resumeaftertask statements facilitates coordination between synchronous and asynchronous code. The new setwaitinglocal statement allows asynchronous code to pass data back to the synchronous code that spawned it. The urltask( function now converts any `«taskid»` tags in the source code into the actual task id, for use with the resumaftertask and setwaitingglobal statements.

- In the Panorama Help wizard, the Topic>Copy Topic URL command now actually copies the URL onto the clipboard, instead of just notifying you that it has done so.

- Delete field no longer crashes if you delete the last field and the next to last field is hidden. Also now refuses to delete if there is only one visible field.

- Printing variable height rich text no longer causes a crash. It prints as fixed height text, not variable height, but it doesn’t crash.

- Try/catch now correctly restores local variables after an error. Also normal error handling is restored after an error occurs within a try/catch segment. Up until now, if an error occured in a try/catch segment, that segment remained active (sort of). So if an additional error occured later in the code, that error would not be handled correctly (it would just cause the code to stop, without an error).

- If used in a try/catch block, the stop statement no longer stops - instead it throws an error that will be handled by the catch statement (see Error Handling). This change prevents things from getting mucked up if a stop statement is included in tasks like `.Initialize` or in server code.

- Fixed problems with menu bar updating under Big Sur (and possibly earlier).

- Summary records are now given record ID’s in a unique range that immediately identifies them as unshareable, so that they are kept segregated from regular data records. All summary records are removed when uploading a database to the server (or a new generation). The info(“unsharedrecordid”) returns the minimim value in this range.

- The Group Up and Group Down commands now stop with an error if there are no visible data records (before this fix, this action could cause loss of data). Also the Summarize & Analyze Dialog no longer allows you to add a Group Up step below the Outline step (though you can still drag the actions into the incorrect order).

- When merging a field into a Text Display Object or Web Browser Object, for example `«field»`, Panorama now uses the output pattern for that field, instead of just default str( conversion (if an output pattern has been set up).

- The val( function now works with fractional values even when the system’s decimal point is set to a comma (for example 1,23). Also, the val( function now has an optional second parameter that allows you to explicitly specify the decimal point character.

- When importing text into a floating point field, a standalone dash is now interpreted as zero. Apparently depending on the format chosen Excel sometimes exports empty numbers as dashes.

- When printing Variable Height Records (expand or expand/shrink), Panorama now considers empty text to be zero height (actually not quite zero, still leaves space for vertical padding and descender).

- Fixed floating point fields to allow values with more than one place in front of the decimal point. For example, 12.34 was rejected as invalid, while 1.234 was allowed. Now both are ok.

- The urldecode( function now works when % is double encoded, for example a space is %2520. This was encountered in URL’s passed from the Ulysses x-callback-url feature.

- Fixed the urldecode( function so that it correctly converts %25 to %.

- The asc( function no longer crashes if given empty text, instead it returns zero.

- The OpenFile statement can now be used with the `if error` statement. Also, it no longer creates a new untitled database if it is passed a file that does not exist without an extension.

- No longer displays weird error messages when user uses the escape key to get out of Open File dialog with no windows open.

- The OkCancel, CancelOk, AlertOkCancel and AlertCancelOK statements now have an `OK` button instead of `Ok`. This matches Panorama 6 and also conforms to Apple user interface guidelines.

- The lookup( function now allows a “bare” field or variable to be used as the default value (just as this was allowed in Panorama 6). This also works in the related functions lookuplast(, lookupselected(, lookuplastselected( and table(.

- Fixed the pluralpattern( function so that it works even if a word contains “are” embedded inside it. For example, this formula now works correctly even though “shared” contains “are”: pluralpattern(1,“# shared database~ are open”)

- The onewhitespace( function now correctly converts linefeeds to spaces, in addition to carriage returns, tabs, and multiple spaces.

- The closeactiveobject statement now works in the data sheet, and with pop-up text editing in a form. (Before it only worked with regular Text Editor objects). Als, the CloseActiveObject statement has a new synonym – CloseEditor.

- The Group Up and Group Down statements now update the record counter display, as they should have all along.

- The SetPermanentVariable statement no longer fails if the value parameter is a single token (i.e. a single field or variable).

- The formulamerge statement now handles formula errors properly.

- The rangecontains( function now works correctly.

- The info(“languagecode”) function now will return non-English languages.

- The clipboard() function no longer crashes if the clipboard contains an image instead of text.

- The info(“modifiers”) function now works with keyboard events (it used to only work with mouse clicks).

- The new closeclonewindow statement is an alternate method to close the current window, it will work even if the window doesn’t have a close box.

- New functions info(“panoramaversion”) and info(“panoramabundleversion”) do just what you would think they do.

- New functions info(“processname”) and info(“processidentifier”) return information about the running copy of Panorama for use in UNIX scripts.

- New function info(“panoramauptime”), returns number of seconds since Panorama was launched.

- New function jsonscriptstring( facilitates the creation of JSON strings.

- Panorama’s JSON export functions now use `"` instead of `'` as quote character. According to the spec either are ok, but Apple’s JSON parser doesn’t like the single quotes.

- When displaying a date without using a pattern, Panorama now displays the full 4 digit year if the date is more than 95 years ago or more than 5 years in the future. This also fixes problems when editing a date outside that range, when copying a record that contains a date outside that range, and when importing a database that contain dates outside of that range.

- When the system preferences are set to a region with a date format of mm/dd/yy (most of the world outside of the US), Panorama now allows entry and import of dates in the format dd-mon or dd-mon-yyyy.

- Anywhere a date is entered (date fields, date( and datevalue( functions) now correctly checks for dates past the end of a month, including leap years (before it only checked for number of days past 31). For example, Panorama now knows that April 31 is not a valid date.

- Data entry of days of the week (Sun, Mon, Tue etc.) now respects the system setting for the first day of the week. So if the system settings say the first day of the week is Monday, data entry of “Sunday” will refer to the upcoming Sunday, not the previous one.

- Change default filename extension when exporting HTML from export wizard to .html (otherwise it will be .txt, as before).

- The Print Preview commands now work properly if the database name has a slash (/) in the name.

- Reports generated with the Construct Report feature (see Automatic Report Construction) now default to truncate tail instead of word wrap. This can be controlled in the constructor with the `<linebreakmode>` tag.

- The `<grid:dashed>` (or `<grid:dash>`) tag now works correctly when using the List/Matrix constructor (see Text List Constructor).

- The FirstColumn and LastColumn statements now display a better error message if you try to use them in a form or procedure window.

- The AbortAllDialogs statement now works correctly with dialog sheets (before it only worked with modal dialogs).

- The record counter now updates correctly after a revert to save is performed.

- Command-K (remove summaries) now works immediately after grouping or any operation that adds a summary record (total, count, etc.), without having to actually click on the menu bar.

- Since the single step feature doesn’t work reliably, the single step tool has been removed from the default tool bar configuration.

- The Credentials panel of the Site License window now makes it more difficult to mess up the account email address. Before, it would allow you to edit the email address to anything, even an empty email address. Now it requires you to enter a non-empty email address, and it asks for confirmation before submitting an email address change. (A customer tried to modify their passwords and inadvertently set the email address to empty.)

- In previous versions the Text Editor object was erroneously creating a fileglobal variable when in Formula mode, using the entire formula as the field name!

- The openform statement has a new option, NoVersionButton, that allows you to remove the caret icon just the the right of the window title (at the top of the window), and removes the ability to click on the title to rename the document, or to Command-Click on the title to see the path to this document. This option is now used on all wizard and utility windows (About Panorama, Memory Usage, Formula Workshop, etc.).

- In the Relational Workshop wizard, clicking on the green thumbs up icon in the Lookup Results panel no longer displays a blank alert (or any alert). If there is a red thumbs down icon, it still displays the error message.

- The RemoveAllSummaries statement now checks to see if there actually are any summaries before it bothers to scan all the records. Just a possible slight (but easy) performance enhancement.

- Starting a procedure with the Run button in the procedure window now sets the trigger to “RUN TOOL (procedure window)”.

- Text List Objects now respond to the open action (see objectaction) by acquiring focus, so that they are responsive to keyboard activity (up/down, etc.).

- New info(“eventtype”) function allows code to find out of the most recent event was a mouse click, key press, or something else.

- Added documentation for the info(“loggedinaccountrole”) and info(“loggedinaccountemail”) functions.

- Took out the star from the Find & Open dialog, it didn’t do anything except break Panorama when clicked.

- Data Button objects now properly set up the clicked object id, clicked object name, and button rectangle when they are clicked.

- Clicking the object opacity stepper button no longer appears to increase object opacity from 100% to 101%.

- Browser object now correctly adjusts when flipping between Literal and Formula mode. Before you also had to make a change to the formula after flipping the mode, or close and re-open the window.

- The SuperAlert statement now works correctly when using a SuperAlertDefaultOptions variable, even if the text in that variable doesn’t contain a leading space.

- The jsonimport( function no longer crashes if a null value is supplied in the JSON. Since Panorama has no way to represent null, it is converted to zero bytes of binary data.

- The min and max statements and the aggregate( function now work with 64 bit values outside of the 32 bit range.

- Added a new type of error, a null value. Unlike any other error value, a null value can be stored in a dictionary. A null value can be created with error(“null”) or error(“nil”) (or any error beginning with null/nil). The jsonimport(/jsonexport( functions will convert between JSON null values and the special null error value.

- When displaying literal text, Panorama now adds a parenthesis around each embedded formula. This prevents interaction between the formula and the surrounding text. Consider `{Price-Cost}`. In previous versions, this would produce an error because it was converted to `{}+Price-Cost+{}`. `{}+Price` results in a string, which then produces an error when you try to subtract `Cost`. Now it is converted to `{}+(Price-Cost)+{}` which works.

- The unixshellstring( function no longer escapes a tilde character (~) if it is the first character of the text.

- When an error occurs in building form objects using a constructor template, Panorama now shows you the error, and offers to re-open the template editor dialog so that you can correct the error.

- When constructing a report, the objects would shift over 24 points every time the report was generated, but only IF no left margin was specified. If the left margin was > 0, it worked ok. Now it works either way.

- The SuperChoiceDialog statement font and size tags now work as documented, and fixed display of the caption when using this statement.

- The addlines statement now works correctly when a variable or text constant is supplied for the first parameter, instead of a database field.

- Fixed the randomline( function, it was completely broken.

- Conversion of floating point numbers to text (for example with the str( function) now defaults to 15 digit precision instead of 16 (since IEEE format does not conatain 16 full digits). In addition, there is a new setdefaultfloatformat statement that allows you to change the conversion format, and info(“defaultfloatformat”) that returns the current setting. However, these are considered “unsupported.”

- The Morph Field dialog now displays the result preview using the output pattern for the field being morphed, so it’s much more usable for numeric and date fields.

- Added findselect statement for compatibility with ancient Panorama 1.x code (it does the same thing as the findselectdialog statement, it does not recreate the “classic” find/select dialog).

- The sample data for the checkbook tutorial now contains field names on the top row, so that the data matches the tutorial documentation.

- New writepreference statement. Mostly for the purpose of implementing the new `panoramax://writepreference?name=value` feature that allows arbitrary preference values to be changed with a link.

- Panorama now checks for an error when checking the computer’s MACID for when setting up the account. (This change was made after a user encountered an error due to a bad ethernet port in his Mac Mini, so that he could not log on to Panorama X on that computer.) If there is an error, it now uses the MACID of the alphabetically first network interface. It is also possible to force a specific network interface. There is also a new function that returns the MACID of the network interface that is registered with Panorama, the panoramamacid( function. See the documentation of this function for details on customizing what network interface is used.

- RemoveSummaries now checks to make sure there is at least one visible record after the summaries are removed, and if not, performs a select all. If there are no data records at all (they have been deleted) and the statement would delete all summary records, it stops with an error to make sure that the database cannot be left with zero records (which is disasterous).

- Pressing the tab key no longer inserts tabs into multi-line areas in property panels. This was reported for Choices but actually was possible in about a dozen areas, all of which are now fixed.

- The lineitemarray( function no longer strips out empty elements in the middle of the array (empty elements on the end are still stripped off).

- If used in a try/catch block, the stop statement no longer stops - instead it throws an error that will be handled by the catch statement. This prevents things from getting mucked up if a stop statement is included in tasks like `.Initialize` or in server code.

- The Formula Workshop now displays dates in the appropriate format based on System Preferences settings.

- The Site License window now allows you to create custom plans, making it possible to purchase more than 60 months at a time.

- In the Site License->Computers panel, the Recent Activity column is now a few pixels wider, so that wide dates don’t get cut off.

- Eliminated spurious console warning “.sdef warning for argument ‘FileType’ of command ‘save’ in suite ‘Standard Suite’: ‘saveable file format’ is not a valid type name.”

- Panorama X no longer crashes if you attempt open a damaged Panorama 6 database with no data (zero bytes).

- Several hundred documentation corrections submitted by Robert Ameeti, David Thompson, Michael Kellock, Gary Yonaites, Thomas Cooper, Kurt Meyer and Craig MacPherson.

Brand new features implemented in this release (features that were not included in Panorama X 10.1):

- Panorama Live Video Training -- learn how to access live video training sessions.
- Panorama Server -- sharing a database across multiple computers, or even across the entire internet.
- abortifstructurelocked -- The abortifstructurelocked statement Check if database structure is locked, if it is, notify user and stop program.
- addrelatedrecord -- The addrelatedrecord statement adds a new record to the related database corresponding to the current database.
- addremotehost -- The addremotehost statement makes a remote host available to this computer.
- adjustservervariable -- The adjustservervariable statement adjusts the value of a server variable. This is an "atomic" operation, so it is multi-user friendly.
- Advanced Server Settings -- Panorama X Server settings for advanced users.
- assignservervariable -- The assignservervariable statement assigns a value to a permanent variable on the server. If the server variable does not already exist, it will be created.
- Automatic Record Numbering in a Shared Database -- generating unique numbers across multiple users.
- Auxiliary Databases -- automatically opening multiple databases associated with each other.
- binarydatabuild( -- The binarydatabuild( function builds a binary value by scanning a database and assembling individual binary values for every record (including unselected records) in the database.
- blindposixscript( -- The blindposixscript( function executes a POSIX shell script using NSTask and returns the process id.
- blockkeyboard -- The blockkeyboard statement temporarily suspends/resumes keyboard input.
- bonjourserversenabled( -- The bonjourserversenabled( function returns true if client access to bounjour servers (on local network) is enabled.
- bookmarkpath( -- The bookmarkpath( function converts saved bookmark data (from the filebookmark( function) into a standard file path.
- bookmarkshareddatabase -- The bookmarkshareddatabase statement saves the local location of the current shared database.
- booleanvalue( -- The booleanvalue( function converts a numeric or text value to Boolean (true/false).
- bringpanoramaforward -- The bringpanoramaforward statement brings Panorama forward, making it the active Application.
- Bulk Data Transformations on Shared Databases -- using formulafill, propagate, etc. in a shared environment.
- calledby( -- The calledby( function returns true if this function is in code called by the specified database, the specified procedure, or both.
- callerslocalvariablevalue( -- The callerslocalvariablevalue( function allows a subroutine to access a local variable in the procedure that called it.
- Changing the Design of a Shared Database -- modifying database fields, forms and/or procedures.
- checkserverconnection( -- The checkserverconnection( function checks to see if the specified server is connected.
- checkstructurelock -- The checkstructurelock statement Check if database structure is locked, if it is, notify user and stop program.
- clearglobaldictionaryvalues -- The clearglobaldictionaryvalues statement clears (removes) all the keys and values from the specified global dictionary.
- cleartypeahead -- The cleartypeahead statement clears any typed ahead characters that have been pressed while a procedure is running.
- clearundo -- The clearundo statement clears out the undo stack, eliminating the ability to undo any previous action.
- Client/Server Debug Instrumentation -- using instrumentation with Panorama X server and clients.
- clientimportallocaterecords -- The clientimportallocaterecords statement contacts the server to allocate new records when importing or appending new data.
- clientimportuploaddata -- The clientimportuploaddata statement contacts the server to upload and insert new records to the server when importing or appending new data.
- cloakeddatabasename( -- The cloakeddatabasename( function converts the regular "uncloaked" database name into the internal "mangled" name used on the server.
- closeallasyncprogresswindows -- The closeallasyncprogresswindows statement closes any asynchronous progress windows.
- closeclonewindow -- The closeclonewindow statement is an alternative method to close the current window, works even if the window has no close box.
- closedatabaseactiveobjects -- The closedatabaseactiveobjects statement stops all text editing associated with the current database.
- Confirmation Alerts -- Configuring alerts to confirm sensitive operations (deletions, etc.).
- constant( -- The constant( function converts an expression into a constant value (that can be plugged into a new formula).
- constructlineitems -- The constructlineitems statement creates a grid of line items.
- Controlling and Monitoring the Server Connection -- overriding automatic server connection behavior.
- converttimezone( -- The converttimezone( function converts a time or superdate from one time zone to another.
- convertvariablestoconstants -- The convertvariablestoconstants statement converts all of the variables in a formula into constant values.
- copyindentedcode -- The copyindentedcode statement copies the selected code with 4 space indent (for pasting into the Panorama forum).
- copynewerfile( -- The copynewerfile( function copies a file to another name or location. However, the file is only copied if it is newer than the old file, otherwise the destination is not touched.
- Creating a Shared Database -- convert a single user database into a shared database.
- croptext( -- The croptext( function crops text to a specified length. If the text was already shorter than the specified length, it is left unchanged. If it is longer, the text is cut off and an ellipsis is added on the end.
- Data Input Validation -- validation of data entry (checking for duplicates, etc.)
- Database Integrity Checks -- checking database integrity when opening and saving.
- databaseconsoledump -- The databaseconsoledump statement dumps the raw contents of the specified database to the console in comma delimited format.
- databaseoptionsdialog -- The databaseoptionsdialog statement opens the standard Database Options dialog.
- datavalidationalert -- The datavalidationalert statement displays an alert when invalid data has been input.
- daylightsavingstimeoffset( -- The daylightsavingstimeoffset( function returns the current daylight saving time offset of the specified time zone.
- Debug Instrumentation -- conditional logging of the internal state of Panorama program code.
- defineservervariable -- The defineservervariable statement defines the value of a permanent variable on the server. If the variable already exists, it is not touched.
- deleteglobaldictionaryvalues -- The deleteglobaldictionaryvalues statement deletes one or more global dictionary values.
- Deploying Panorama in an Organization -- transferring preferences and/or account login credentials to multiple computers.
- Diagnosing a Formula embedded in a Form Object -- diagnosing problems with formulas embedded in form objects.
- dictionaryfromvariables( -- The dictionaryfromvariables( function builds a new dictionary and initializes it from a list of variables (carriage return delimited).
- downloaddatabasefromserver -- The downloaddatabasefromserver statement downloads a database file from a Panorama server.
- downloaddatafromserver -- The downloaddatafromserver statement asynchronously downloads pre-calculated binary data from a Panorama server.
- downloadpartialdatabase -- The downloadpartialdatabase statement downloads specified components of the current database from the server. The current database must be shared.
- dumpdictionarysource( -- The dumpdictionarysource( function returns a carriage return separated array of dictionary keys and values (see Data Dictionaries). The keys and values are quoted so that they could be used to re-assemble the dictionary with the initializedictionary( function.
- editcellwith -- The editcellwith statement opens the edit window for the currently active field (or cell), using the supplied alternate text.
- editfield -- The editfield statement begins editing of the specified field.
- emptylineitemnumber( -- The emptylineitemnumber( function returns the numeric suffix of the first matching line item field that is empty (if any).
- encodeurlfragment( -- The encodeurlfragment( function encodes text so that it can be used in the fragment portion of a URL (the portion after the # symbol).
- encodeurlhost( -- The encodeurlhost( function encodes text so that it can be used in the host portion of a URL (for example www.host.com).
- encodeurlpassword( -- The encodeurlpassword( function encodes text so that it can be used in the password portion of a URL.
- encodeurlpath( -- The encodeurlpath( function encodes text so that it can be used in the path portion of a URL (the portion after the host name, but before any ? symbol).
- encodeurlquery( -- The encodeurlquery( function encodes text so that it can be used in the query portion of a URL (the portion after the ? symbol).
- encodeurluser( -- The encodeurluser( function encodes text so that it can be used in the user name portion of a URL.
- executeasap -- The executeasap statement executes the specified code at the first possible opportunity, non-atomically.
- filebookmark( -- The filebookmark( function converts a file or folder path into a binary data value that persistently links to the file, even if it is later moved or renamed.
- findrelated -- The findrelated statement finds information that matches the current record in a related database.
- finishtimecheck -- The finishtimecheck statement finishes a performance monitoring session.
- forceunlockdatabaserecord -- The forceunlockdatabaserecord statement immediately unlocks an arbitrary record in the specified server database.
- formulafields( -- The formulafields( function returns a list of fields used in a formula.
- formulaidentfiers( -- The formulaidentfiers( function returns a list of identifiers (fields and variables) used in a formula.
- formulastrings( -- The formulastrings( function returns a data array of strings (text constants) used in a formula.
- formulavariables( -- The formulavariables( function returns a list of variables used in a formula.
- getglobaldictionary( -- The getglobaldictionary( function converts a global dictionary into a regular dictionary.
- getuploadeddata( -- The getuploadeddata( function is used in server code to access data uploaded with the UploadDataToServer statement.
- Global Dictionaries -- alertnate high performance method to store multiple data items, much faster than regular data dictionaries.
- globaldictionarybuild -- The globaldictionarybuild statement builds a global dictionary by scanning a database.
- globaldictionarykeys( -- The globaldictionarykeys( function returns a cr()-separated array containing the keys in a global dictionary, or the names of all global dictionaries.
- globaldictionaryvalue( -- The globaldictionaryvalue( function returns the value of an item in a global dictionary, given its key (see Global Dictionaries).
- hidefieldsbetween -- The hidefieldsbetween statement shows all fields except those in between specified numbers.
- hidelineitemfields -- The hidelineitemfields statement hides all line item fields.
- hideotherapplications -- The hideotherapplications statement hides all other applications, leaving only Panorama visible.
- hidepanorama -- The hidepanorama statement hides Panorama X, making all windows disappear.
- hostdatabases -- The hostdatabases statement downloads a list of available databases on a Panorama X Server.
- hostdownload -- The hostdownload statement downloads a shared file to this computer, prompting the user for the location.
- htmlcolor( -- The htmlcolor( function converts a color name into a hex HTML color (RRGGBB format).
- importrawdata -- The importrawdata statement imports raw binary data into an existing database.
- info("accessorypanelisopen") -- The info("accessorypanelisopen") function returns the status of the current window's accessory panel, if any.
- info("callerslocalvariables") -- The info("callerslocalvariables") function returns a list of local variables defined in the procedure that called the current procedure.
- info("clickedwindownumber") -- The info("clickedwindownumber") function returns the window number of that was just clicked.
- info("colornames") -- The info("colornames") function returns a list of color names that can be used as a text object background and with the htmlcolor( function.
- info("csvseparator") -- The info("csvseparator") function returns the current CSV field separator character (comma or semicolon).
- info("customfunctions") -- The info("customfunctions") function returns a list of all available custom functions.
- info("datasheetwindownumbers") -- The info("datasheetwindownumbers") function returns the unique ID numbers of all open data sheet windows.
- info("defaultfloatformat") -- The info("defaultfloatformat") function returns the default format for converting floating point numbers to text.
- info("defaultmaxdatasheetcolumns") -- The info("defaultmaxdatasheetcolumns") function default maximum number of allowed data sheet columns.
- info("dialogsheet") -- The info("dialogsheet") function returns true if the currently active window is a dialog sheet.
- info("dropwindownumber") -- The info("dropwindownumber") function returns the number of the window that contains the form data was dropped on.
- info("eventtype") -- The info("eventtype") function returns the type of the last event (mouse click, keyboard press, etc.).
- info("formwindownumbers") -- The info("formwindownumbers") function returns the unique ID numbers of all open form windows.
- info("httprequestinprogress") -- The info("httprequestinprogress") function returns true if this code is running on Panorama X Server, and the server is responding to a web client request.
- info("localtimezone") -- The info("localtimezone") function returns the local time zone for the current location of your computer.
- info("matrixcellrecordid") -- The info("matrixcellrecordid") function returns the record id of the cell in a matrix that was clicked on.
- info("matrixclickinfo") -- The info("matrixclickinfo") function identifies what section and what named object was clicked on in a matrix.
- info("panoramabundleversion") -- The info("panoramabundleversion") function returns the bundle version of Panorama.
- info("panoramaisactive") -- The info("panoramaisactive") function returns true if Panorama is the frontmost application (in other words, if the Panorama menu bar is visible).
- info("panoramauptime") -- The info("panoramauptime") function returns the number of seconds since Panorama launched.
- info("procedurewindownumbers") -- The info("procedurewindownumbers") function returns the unique ID numbers of all open procedure windows.
- info("processidentifier") -- The info("processidentifier") function returns the process id number that Panorama is running under.
- info("processname") -- The info("processname") function returns the process name that Panorama is running under.
- info("rawdatabasedata") -- The info("rawdatabasedata") function returns the binary data of the current database.
- info("rawrecord") -- The info("rawrecord") function returns the binary data of the current record.
- info("rawrecordid") -- The info("rawrecordid") function returns a number that represents the location of the current record within the database.
- info("runningonserver") -- The info("runningonserver") function returns true if code is running on Panorama X Server, false if running on client.
- info("runningunderterminal") -- The info("runningunderterminal") function returns true if Panorama was launched under Terminal.app.
- info("taperecorder") -- The info("taperecorder") function returns information about the current procedure recording (if any).
- info("timelimitremaining") -- The info("timelimitremaining") function returns the amount of time available (in seconds) before a loop will time out.
- info("timezoneabbreviations") -- The info("timezoneabbreviations") function returns a dictionary of time zone abbreviations supported by the system.
- info("timezones") -- The info("timezones") function returns a list of time zone regions recognized by the system.
- info("unsharedrecordid") -- The info("unsharedrecordid") function returns the minimum ID for unshared records.
- info("webclientsessioninprogress") -- The info("webclientsessioninprogress") function returns true if this code is running on Panorama X Server, and the server is responding to a web client request.
- info("windownumber") -- The info("windownumber") function returns the unique ID number of the current window.
- info("windownumbers") -- The info("windownumbers") function returns the unique ID numbers of all open windows.
- Installing and Launching Panorama Server -- instructions for getting Panorama Server up and running, as well as best practices for configuring system settings on a server computer.
- Introduction to Panorama X Team Server -- using a server extends the reach of Panorama beyond a single computer to a network of connected computers, or even across the entire Internet. This topic introduces the concepts needed to understand the operation of the Panorama X Team Server system, including multi-user database sharing and database web publishing.
- Join Databases -- joining another database into the current database (relational join).
- join -- The join statement joins data from another database into the current database.
- joindialog -- The joindialog statement opens the standard Join Database dialog.
- joinonerecord -- The joinonerecord statement joins matching data from another database into the current record.
- jsonscriptstring( -- The jsonscriptstring( function converts text into a JSON string literal
- labelize( -- The labelize( function returns the value of a field or variable along with a label. This saves typing when you need to display fields or variables when logging and debugging.
- labelizeformula( -- The labelizeformula( function returns the value of a formula along with the formula itself as a label.
- labelizeinfo( -- The labelizeinfo( function returns the value of an info( function, along with the function itself as a label.
- labelizepattern( -- The labelizepattern( function formats a text value using a label and a pattern.
- letservervariable -- The letservervariable statement creates a server variable and assigns a value to it.
- Limiting the Maximum Number of Data Sheet Columns -- adjusting the maximum number of columns displayed in data sheet windows.
- Line Item Grid Constructor -- creates a grid of form elements for displaying and editing line item fields.
- listwindownumbers( -- The listwindownumbers( function builds a text array containing a list of window ID numbers for all the open windows associated with a particular file.
- littleendianbinaryvalue( -- The littleendianbinaryvalue( function converts little endian binary data (a byte, word, or longword) into an unsigned number (see Binary Data).
- localpanoramaxserverisrunning( -- The localpanoramaxserverisrunning( function returns true if Panorama X Server is currently running on this computer, false if it is not running.
- localpanoramaxservername( -- The localpanoramaxservername( function returns the name of the Panorama X server on the local computer, if any.
- localpanoramaxservers( -- The localpanoramaxservers( function returns the names of all Panorama X servers that are running on the local network.
- lockcurrentrecord( -- The lockcurrentrecord( function attempts to lock the current record, returns true if successful, false if failed.
- lockedrecordlist -- The lockedrecordlist statement returns a list of records locked in the current database.
- Logging Server Activity -- recording server activities for later analysis.
- Looking up Data Directly from the Server -- local in-memory vs. server lookups.
- loremipsum( -- The loremipsum( function creates one or more paragraph blocks of "lorem ipsum" dummy text.
- Manually Uploading a Quick Patch to the Server -- uploading a procedure or form.
- measuretext( -- The measuretext( function returns the size of a string of text in a particular font and size.
- Newly Opened Database Window Arrangement -- customizing the arrangement and location of windows when a database is opened.
- nextdaylightsavingstimetransition( -- The nextdaylightsavingstimetransition( function returns the next date on which a transition to or from daylight savings time occurs.
- noinstrumentationmenu( -- The noinstrumentationmenu( function supresses the Instrumentation menu.
- openasyncprogresswindow -- The openasyncprogresswindow statement opens a floating progress window for asynchronous operations (urltask(, timers).
- Opening a Database in Diagnostic Mode -- opening a database so that no implicit code is triggered.
- openlivecoursecalendar -- The openlivecoursecalendar statement Opens the Live Course Calendar window.
- openpreferenceswindow -- The openpreferenceswindow statement opens the Panorama Preferences window.
- opensoftwareupdatewindow -- The opensoftwareupdatewindow statement opens the Panorama Software Update window.
- openurlinbackground -- The openurlinbackground statement opens a URL (usually a web page or to create an e-mail message) without bringing forward the app that handles the URL (in other words, Panorama remains the frontmost application).
- openviewsearch -- The openviewsearch statement opens a View Search window.
- openwithterminal -- The openwithterminal statement opens an application in a new Terminal.app window (useful for debugging).
- panoramaappvisibility -- The panoramaappvisibility statement allows the Panorama X dock and menu bar to be hidden.
- panoramamacid( -- The panoramamacid( function returns the MAC address registered with Panorama for this computer.
- partialdatabaseupdate -- The partialdatabaseupdate statement updates one or more components of an existing database.
- Permanently Deleting a Database from the Server -- remove a database from the server.
- Permanently Detaching a Shared Database from the Server -- unshare a shared database.
- posixscript( -- The posixscript( function executes a POSIX shell script using NSTask and returns the result.
- posttorelated -- The posttorelated statement posts data in the current record to the corresponding record in a related database.
- Preventing Endless Loops -- setting up a timeout limit to prevent endless loops.
- procedureexists( -- The procedureexists( function checks to see whether a procedure exists or not.
- provueserverisup( -- The provueserverisup( function checks whether provue.com is online and operating.
- provueserverisup -- The provueserverisup statement checks whether provue.com is online and operating.
- Record Locking and Editing Shared Data -- coordinating data entry across multiple simultaneous users.
- Record Locking in Procedure Code -- implicit and explicit management of record locking.
- recordislocked( -- The recordislocked( function tests whether the current record is locked on this client.
- related( -- The related( function searches a database for a record in a related database that matches the current record in the current database based a relational specification (based on one or more key fields or formulas in each database), then uses a formula to return other information from the same record. This is similar to the lookup( function, but instead of using an individual field for the key, a relation is used (see Relational Database Management).
- relatedarray( -- The relatedarray( function builds an Text Array by scanning a database and creating an array element for every record that matches a relational specification (based on one or more key fields or formulas). This is similar to the arraybuild( function, but instead of using an individual field for the key, a relation is used (see Relational Database Management).
- relatedrecordid( -- The relatedrecordid( function returns the record id of a record in a related database that matches the current record in the current database based on a relational specification.
- Relational Database Management -- linking together multiple databases based on common data.
- remotepanoramaxservers( -- The remotepanoramaxservers( function returns the names of all Panorama X servers that are remotely accessible from this computer.
- removeremotehost -- The removeremotehost statement makes a remote host unavailable to this computer.
- reorderfieldsdialog -- The reorderfieldsdialog statement opens the Reorder Fields dialog.
- resetallrecordidts -- The resetallrecordidts statement resets the internal record id and time stamps for every record in the current database.
- Restricting Server Access -- limiting Panorama X Server access to authorized users.
- resumeaftertask -- The resumeaftertask statement resumes after a waitfortask statement.
- runningappinfo( -- The runningappinfo( function returns information about applications that are currently running on this computer.
- savepartialdatabase -- The savepartialdatabase statement saves specified components of the current database, leaving other components out.
- selectrecordsrelatedto -- The selectrecordsrelatedto statement selects records in the current database that are related to any record in another database.
- selectrelated -- The selectrelated statement selects information that matches the current record in a related database.
- Server Administration Wizard -- this wizard is used to monitor the operation of Panorama servers (both local and remote servers can be monitored), including monitoring server status, checking database status and downloading databases, and monitoring the status of user sessions.
- Server Variables (Shared Variables) -- sharing variable values across multiple users.
- serverdatabaseconsoledump -- The serverdatabaseconsoledump statement dumps the raw contents of the specified database on the server to the console in comma delimited format.
- serverjournalcode -- The serverjournalcode statement writes code to journal file.
- serverjournalcurrentrecord -- The serverjournalcurrentrecord statement writes the current record to journal file.
- serverlookup( -- The serverlookup( function searches a shared database for a value, then returns other information from the same record. Similar to the lookup( function, but the search is performed on the server instead in the local computer's memory.
- serverlookupall( -- The serverlookupall( function builds a text array containing one item for every record in the target database where the data in the keyField matches the keyData. Similar to the lookupall( function but retreives the data directly from the server computer, instead of from the local computer's memory.
- serversuperlookup( -- The serversuperlookup( function searches a database for a record that matches a query formula, then uses a second formula to return other information from the same record. This is identical to the superlookup( function, but instead of searching in the local computer's memory, the search is done on the server to ensure that the most up-to-date information is returned.
- servervariablenames( -- The servervariablenames( function returns the names of all server variables associated with a database.
- servervariables( -- The servervariables( function returns the names and values of all server variables associated with a database. The names and values are returned in a dictionary.
- setbannericon -- The setbannericon statement sets the icon on the right side of the toolbar banner.
- setbannermessage -- The setbannermessage statement sets the text in the toolbar banner to an arbitrary message.
- setbannerprogressbar -- The setbannerprogressbar statement displays progress in the toolbar banner.
- setcallerslocal -- The setcallerslocal statement allows a subroutine to modify a local variable in the procedure that called it.
- setdefaultfloatformat -- The setdefaultfloatformat statement sets the default format for converting floating point values to text (unsupported).
- setglobaldictionaryvalues -- The setglobaldictionaryvalues statement sets one or more key/value pairs in a global dictionary.
- setlocalsfromdictionary -- The setlocalsfromdictionary statement converts a dictionary into a collection of local variables. The names and values of the local variables will be derived from the dictionary contents.
- settimechecklongtime -- The settimechecklongtime statement sets the threshold for a slow task during a performance monitoring session.
- Setting up a Computer as a Panorama X Client -- instructions for setting up a new client computer so that it can access a Panorama X server.
- setwaitinglocal -- The setwaitinglocal statement assigns a value to a local variable in the parent procedure of an asynchronous task, allowing the asynchronouse code to pass a value back to the code that spawned it.
- Shared Database Synchronization -- data synchronization across multiple users.
- shareddatabasebookmarkedpath( -- The shareddatabasebookmarkedpath( function retrieves the local path and filename of a server database (if any).
- standardinstrumentationmenu( -- The standardinstrumentationmenu( function generates a Custom Menu specification for Panorama’s standard Instrumentation menu.
- starttimecheck -- The starttimecheck statement starts a performance monitoring session.
- startupdatecheck -- The startupdatecheck statement starts background check for available Panorama update.
- stdout -- The stdout statement sends one or more characters to standard output.
- straightquotes( -- The straightquotes( function converts any "smart quotes" in the text into straight quotes.
- stripaccents( -- The stripaccents( function removes accents from any characters in the text.
- Synchronizing in Procedure Code -- customizing the data synchronization process.
- Temporarily Disconnecting a Shared Database from the Server -- pause database sharing.
- Text Object Background Color/Gradient -- text object background colors and gradients.
- timecheck -- The timecheck statement identifies an intermediate point in a performance monitoring session.
- timelimit -- The timelimit statement specifies the maximum time a procedure can continue to run after this statement.
- timerexists( -- The timerexists( function checks to see whether a timer exists.
- timezoneabbreviation( -- The timezoneabbreviation( function returns the abbreviation of the specified time zone.
- timezonename( -- The timezonename( function returns the continent and city of the specified time zone.
- titlecase( -- The titlecase( function capitalizes first character of each word, but not articles, prepositions, and conjunctions under 5 characters (unless they are the first or last word in the text).
- tsvtocsv( -- The tsvtocsv( function converts tab separated text into comma separated text.
- tsvtojson( -- The tsvtojson( function converts tab separated text into JSON formatted text.
- uncloakeddatabasename( -- The uncloakeddatabasename( function converts the internal server name of a database to the regular "uncloaked" name.
- undefineservervariable -- The undefineservervariable statement destroys a server variable.
- Updating Panorama X -- checking for and installing newer versions of Panorama X.
- uploaddatatoserver -- The uploaddatatoserver statement uploads binary data to the server.
- uploadfiletoserver -- The uploadfiletoserver statement uploads a file or folder to a Panorama server.
- uploadrecord -- The uploadrecord statement uploads the current record to the server, even if it was not locked (for emergency use only).
- usefunctioncallerslocalvariables -- The usefunctioncallerslocalvariables statement temporarily swaps out a procedures current local variables with the local variables of the procedure that called this the call(, callwithin( or execute( function.
- Using an External Web Server -- instructions for using Panorama Server in conjunction with an external web server (for example Apache, Nginx, etc.).
- View Search -- persistent, comprehensive search of procedures and forms in one or multiple databases.
- wait -- The wait statement pauses the program for a specified period of time.
- waitfortask -- The waitfortask statement temporarily pauses a procedure until the specified task is complete.
- webdatabaseadminpage -- The webdatabaseadminpage statement generates a web admin HTML page for the current database.
- webfontsubstitutes( -- The webfontsubstitutes( function generates an array of standard font substitutions for web browsers.
- webimagedisplay( -- The webimagedisplay( function used within an Image Display Object to specify both a web image (used when the form is displayed in a web browser from Panorama Server) and a local image file (used when the form is displayed within Panorama).
- Window ID Numbers -- ID numbers for identifying windows.
- Working With Summary Records in a Shared Database -- summary records are not shared between users.
- writepreference -- The writepreference statement modifies a preference value.
- xcallbackurl -- The xcallbackurl statement performs an action in another application using the x-callback-url mechanism.
- zipcompress -- The zipcompress statement compresses a file or an entire folder into a zip file (using ditto shell tool).
- zipuncompress -- The zipuncompress statement uncompresses a file or an entire folder from a zip file (using ditto shell tool).
- zlog -- The zlog statement outputs a message to the instrumentation log (if instrumentation is enabled).
- zlogalways -- The zlogalways statement unconditionally outputs a message to the instrumentation log.
- zlogcoverage -- The zlogcoverage statement allows instrumentation coverage to be turned on or off within a procedure.
- zlogdictionary -- The zlogdictionary statement outputs a data dictionary to the instrumentation log (if instrumentation is enabled).
- zlogging( -- The zlogging( function returns true if zlogging is enabled for the current database and procedure, otherwise false.

Features implemented in this release that work differently than they did in Panorama X 10.1.

- adjustservervariable( -- The adjustservervariable( function adjusts the value of a server variable. This is an "atomic" operation, so it is multi-user friendly.
- checkdesignlock -- The checkdesignlock statement checks if field structure can be changed, if not, returns an error.
- checkserverconnection -- The checkserverconnection statement checks to see if the specified server is connected.
- connecttoserver -- The connecttoserver statement reconnects the current database to the server (after the dropserver statment has been used).
- deletewebtemplate -- The deletewebtemplate statement deletes the web template (a dictionary) associated with a form (if any).
- dictionaryassignmentscode( -- The dictionaryassignmentscode( function returns code that can be used to take the values in a dictionary (see Data Dictionaries) and assign them to fields or variables based on the dictionary keys.
- disableabort -- The disableabort statement prevents loops from being stopped early by pressing SHIFT-COMMAND-ESCAPE or by exceeding the maximum allowed loop time.
- downloadrecord -- The downloadrecord statement downloads the current record from the connected server.
- downloadrecordwithwarning -- The downloadrecordwithwarning statement downloads the current record from the connected server, with a warning if the record is currently locked.
- dropallshareddatabases -- The dropallshareddatabases statement drops the connection to all shared databases. Panorama uses this when the client is about to quit, could also be used if you know you are about to go offline.
- dropserver -- The dropserver statement disconnects the current database from the server.
- enableabort -- The enableabort statement allows the SHIFT-COMMAND-ESCAPE key sequence to stop an endless loop.
- enterprisecall -- The enterprisecall statement calls a procedure in a server database, opening and closing the database if necessary.
- getwebtemplate( -- The getwebtemplate( function retrieves the web template (a dictionary) associated with a form (if any).
- getwebtemplate -- The getwebtemplate statement retrieves the web template (a dictionary) associated with a form (if any).
- getwebtemplatetext( -- The getwebtemplatetext( function retrieves the text of the web template (a dictionary) associated with a form (if any).
- getwebtemplatetext -- The getwebtemplatetext statement retrieves the text of the web template (a dictionary) associated with a form (if any).
- info("panoramaversion") -- The info("panoramaversion") function returns the version number of Panorama.
- listwebtemplates( -- The listwebtemplates( function retrieves a list of web templates in the specified database, if any.
- listwebtemplates -- The listwebtemplates statement retrieves a list of web templates in the specified database, if any.
- makeformwebtemplate -- The makeformwebtemplate statement converts a Panorama form into the equivalent HTML/CSS.
- renderwebtable( -- The renderwebtable( function renders a web table using records selected with WebSelect in the current database.
- renderwebtable -- The renderwebtable statement renders a web table using records selected with WebSelect in the current database.
- savewebtemplate -- The savewebtemplate statement saves a web template (a dictionary) associated with a form.
- serverformulafill -- The serverformulafill statement fills a specified subset of records in a shared database.
- serverlog -- The serverlog statement adds a line to one or more server logs.
- servervariable( -- The servervariable( function returns the value of a server variable (a permanent variable on the server).
- synchronize -- The synchronize statement synchronizes the local database with Panorama Server. This is the same as choosing Synchronize from the File menu.
- Understanding the Run Loop -- explanation of how Panorama code interacts with the run loop to respond to mouse clicks, keyboard presses, display updates and other events that require attention.
- webformitem -- The webformitem statement sets a field or variable with the value of a POST web form item (used when processing a web query with Panorama Server).
- webformmerge -- The webformmerge statement fills in an HTML form with database values (fields and variables).
- webmerge -- The webmerge statement merges an external HTML template file with fields and variables from the current record.
- webselect -- The webselect statement select data on web server using a formula.

Features implemented in this release that work exactly the same as they did in Panorama 6.

- dbserverdomain( -- The dbserverdomain( function returns the server domain for the database.
- dbshared( -- The dbshared( function returns true if the current database is shared, otherwise false.
- delay -- The delay statement loops for a specified period of time.
- findselect -- The findselect statement opens the standard Find/Select dialog.
- forcelockrecord -- The forcelockrecord statement immediately locks the current record.
- forcesynchronize -- The forcesynchronize statement force synchronizes the local database with Panorama Server (downloads all records, not just recently modified ones).
- forcesynchronizeall -- The forcesynchronizeall statement force synchronizes all open databases.
- forceunlockallrecords -- The forceunlockallrecords statement immediately unlocks all records in the current database.
- forceunlockrecord -- The forceunlockrecord statement immediately unlocks the current record.
- getwebtabletemplate( -- The getwebtabletemplate( function converts a web table template (created by the Text Export Wizard) into the format compatible with the HTMLDataTable statement.
- getwebtabletemplate -- The getwebtabletemplate statement converts a web table template (created by the Text Export Wizard) into the format compatible with the HTMLDataTable statement.
- grabwebformitems -- The grabwebformitems statement grabs multiple web form items and stuffs the values into fields and/or variables.
- info("runningatomic") -- The info("runningatomic") function returns true if the current procedure is running as a "atomic" procedure.
- info("serverconnection") -- The info("serverconnection") function returns true if the currently active database is connected to the server.
- info("serverupdate") -- The info("serverupdate") function returns true if the server update option is currently turned on (this is the default).
- listwebtables( -- The listwebtables( function returns the list of web tables (generated by the Text Export wizard) in the specified database.
- listwebtables -- The listwebtables statement generates a list of web tables (generated by the Text Export wizard) in the specified database.
- lockorstop -- The lockorstop statement attempts to lock the current record. If the record is currently locked by another user, the procedure stops with an error
- lockrecord -- The lockrecord statement attempts to lock the current record, and waits if it is currently locked by another user.
- openwebmap -- The openwebmap statement opens a web browser window displaying a map of a location.
- renderwebform( -- The renderwebform( function renders a Panorama web form into HTML, merging data into the template as necessary.
- renderwebform -- The renderwebform statement renders a Panorama web form into HTML, merging data into the template as necessary.
- retrywebform -- The retrywebform statement retries a web form that has missing or invalid data.
- serverdatabasename( -- The serverdatabasename( function returns the server database name associated with a shared database.
- servername( -- The servername( function returns the name of the server associated with a shared database.
- serverrunning( -- The serverrunning( function returns true if this code is running on a Panorama server, or false if it is running in single user mode or on a client.
- serverupdate -- The serverupdate statement temporarily disables record locking and server updates when using a shared database.
- sethiddenwebformitem -- The sethiddenwebformitem statement adds a hidden field to a form on a web page.
- sharedusers( -- The sharedusers( function returns a list of users that are currently using the specified database.
- stashwebformitems -- The stashwebformitems statement takes the variables created with the GrabWebFormItems statement and assigns them to fields in the current record.
- synchronizeall -- The synchronizeall statement synchronizes all open databases.
- webdatabasetoform -- The webdatabasetoform statement fills in an HTML form with database field values.
- webfontsubstitutes -- The webfontsubstitutes statement generates an array of standard font substitutions for web browsers.
- webformallitems( -- The webformallitems( function returns a list of POST parameters passed from a form to the web server as a carriage return separated list.
- webformerrors( -- The webformerrors( function returns a list of errors that have been collected with the WebFormItemCheck statement.
- webformhiddenitems( -- The webformhiddenitems( function returns a list of the hidden items in the web form submitted to this web procedure.
- webformitembang( -- The webformitembang( function returns an exclamation point, icon or symbol to indicate an error in a web form for data entry.
- webformitembang -- The webformitembang statement sets the text generated by the webformitembang( function.
- webformitemcheck -- The webformitemcheck statement uses a formula to check the validity of a web form item.
- webformitemerror( -- The webformitemerror( function returns the error for a specific web form item, if any (used when processing a web query with Panorama Server).
- webformitemnames( -- The webformitemnames( function returns a list of POST parameters passed from a form to the web server as a carriage return separated list.
- webformitemnames -- The webformitemnames statement returns a list of POST parameters passed from a form to the web server as a carriage return separated list.
- webformitems( -- The webformitems( function returns a list of POST parameters passed from a form to the web server, including both visible and invisible items (but excluding the special items Panorama generates for its own internal use).
- webformitemvalue( -- The webformitemvalue( function gets the value of a POST web form item (used when processing a web query with Panorama Server).
- webformmissingfields( -- The webformmissingfields( function lists required fields that were not been entered into a web form.
- webformname( -- The webformname( function when processing data input into a web form, this function returns the name of the Panorama form associated with the web form (if any).
- webformrecordid -- The webformrecordid statement adds a RECORD_ID hidden field to the HTML of a web form.
- webformselection -- The webformselection statement selects data based on input from a web form. The web form must have fields that match the database fields.
- webformtodatabase -- The webformtodatabase statement updates the current database with information from the web form that was just submitted.
- webformvisibleitems( -- The webformvisibleitems( function returns a list of the visible items in the web form submitted to this web procedure.
- webtagortext( -- The webtagortext( function prepares text for display in a web page.
- webtext( -- The webtext( function converts a number or regular text into text encoded for display in a web browser.
- webthisrecordkey( -- The webthisrecordkey( function makes a key for use with the WebURLSelect statement to specify the current record.
- webthisrecordkey -- The webthisrecordkey statement makes a key for use with the WebURLSelect statement to specify the current record.
- weburlfind -- The weburlfind statement finds a record based on keys in a URL.
- weburlselect -- The weburlselect statement selects one or more records based on keys in a URL.

ALL features that were added or changed in this release:

- Panorama Live Video Training -- learn how to access live video training sessions.
- Panorama Server -- sharing a database across multiple computers, or even across the entire internet.
- abortifstructurelocked -- The abortifstructurelocked statement Check if database structure is locked, if it is, notify user and stop program.
- addrelatedrecord -- The addrelatedrecord statement adds a new record to the related database corresponding to the current database.
- addremotehost -- The addremotehost statement makes a remote host available to this computer.
- adjustservervariable( -- The adjustservervariable( function adjusts the value of a server variable. This is an "atomic" operation, so it is multi-user friendly.
- adjustservervariable -- The adjustservervariable statement adjusts the value of a server variable. This is an "atomic" operation, so it is multi-user friendly.
- Advanced Server Settings -- Panorama X Server settings for advanced users.
- assignservervariable -- The assignservervariable statement assigns a value to a permanent variable on the server. If the server variable does not already exist, it will be created.
- Automatic Record Numbering in a Shared Database -- generating unique numbers across multiple users.
- Auxiliary Databases -- automatically opening multiple databases associated with each other.
- binarydatabuild( -- The binarydatabuild( function builds a binary value by scanning a database and assembling individual binary values for every record (including unselected records) in the database.
- blindposixscript( -- The blindposixscript( function executes a POSIX shell script using NSTask and returns the process id.
- blockkeyboard -- The blockkeyboard statement temporarily suspends/resumes keyboard input.
- bonjourserversenabled( -- The bonjourserversenabled( function returns true if client access to bounjour servers (on local network) is enabled.
- bookmarkpath( -- The bookmarkpath( function converts saved bookmark data (from the filebookmark( function) into a standard file path.
- bookmarkshareddatabase -- The bookmarkshareddatabase statement saves the local location of the current shared database.
- booleanvalue( -- The booleanvalue( function converts a numeric or text value to Boolean (true/false).
- bringpanoramaforward -- The bringpanoramaforward statement brings Panorama forward, making it the active Application.
- Bulk Data Transformations on Shared Databases -- using formulafill, propagate, etc. in a shared environment.
- calledby( -- The calledby( function returns true if this function is in code called by the specified database, the specified procedure, or both.
- callerslocalvariablevalue( -- The callerslocalvariablevalue( function allows a subroutine to access a local variable in the procedure that called it.
- Changing the Design of a Shared Database -- modifying database fields, forms and/or procedures.
- checkdesignlock -- The checkdesignlock statement checks if field structure can be changed, if not, returns an error.
- checkserverconnection( -- The checkserverconnection( function checks to see if the specified server is connected.
- checkserverconnection -- The checkserverconnection statement checks to see if the specified server is connected.
- checkstructurelock -- The checkstructurelock statement Check if database structure is locked, if it is, notify user and stop program.
- clearglobaldictionaryvalues -- The clearglobaldictionaryvalues statement clears (removes) all the keys and values from the specified global dictionary.
- cleartypeahead -- The cleartypeahead statement clears any typed ahead characters that have been pressed while a procedure is running.
- clearundo -- The clearundo statement clears out the undo stack, eliminating the ability to undo any previous action.
- Client/Server Debug Instrumentation -- using instrumentation with Panorama X server and clients.
- clientimportallocaterecords -- The clientimportallocaterecords statement contacts the server to allocate new records when importing or appending new data.
- clientimportuploaddata -- The clientimportuploaddata statement contacts the server to upload and insert new records to the server when importing or appending new data.
- cloakeddatabasename( -- The cloakeddatabasename( function converts the regular "uncloaked" database name into the internal "mangled" name used on the server.
- closeallasyncprogresswindows -- The closeallasyncprogresswindows statement closes any asynchronous progress windows.
- closeclonewindow -- The closeclonewindow statement is an alternative method to close the current window, works even if the window has no close box.
- closedatabaseactiveobjects -- The closedatabaseactiveobjects statement stops all text editing associated with the current database.
- Confirmation Alerts -- Configuring alerts to confirm sensitive operations (deletions, etc.).
- connecttoserver -- The connecttoserver statement reconnects the current database to the server (after the dropserver statment has been used).
- constant( -- The constant( function converts an expression into a constant value (that can be plugged into a new formula).
- constructlineitems -- The constructlineitems statement creates a grid of line items.
- Controlling and Monitoring the Server Connection -- overriding automatic server connection behavior.
- converttimezone( -- The converttimezone( function converts a time or superdate from one time zone to another.
- convertvariablestoconstants -- The convertvariablestoconstants statement converts all of the variables in a formula into constant values.
- copyfile -- The copyfile statement copies a file (or folder).
- copyfolder -- The copyfolder statement copies an entire folder full of files (and subfolders, if any).
- copyindentedcode -- The copyindentedcode statement copies the selected code with 4 space indent (for pasting into the Panorama forum).
- copynewerfile( -- The copynewerfile( function copies a file to another name or location. However, the file is only copied if it is newer than the old file, otherwise the destination is not touched.
- copypartialdictionary( -- The copypartialdictionary( function partially copies a dictionary (see Data Dictionaries).
- Creating a Shared Database -- convert a single user database into a shared database.
- croptext( -- The croptext( function crops text to a specified length. If the text was already shorter than the specified length, it is left unchanged. If it is longer, the text is cut off and an ellipsis is added on the end.
- csvexportline( -- The csvexportline( function generates a comma delimited line of data containing all the fields in the current record.
- csvexportlinevisiblecells( -- The csvexportlinevisiblecells( function generates a comma delimited line of data containing all the visible (non hidden) fields in the current record.
- csvtotsv( -- The csvtotsv( function converts comma separated text into tab separated text.
- Custom Database Initialization -- using an .Initialize procedure to automatically run custom code when a database opens.
- Data Input Validation -- validation of data entry (checking for duplicates, etc.)
- Database Integrity Checks -- checking database integrity when opening and saving.
- databaseconsoledump -- The databaseconsoledump statement dumps the raw contents of the specified database to the console in comma delimited format.
- databaseoptionsdialog -- The databaseoptionsdialog statement opens the standard Database Options dialog.
- datavalidationalert -- The datavalidationalert statement displays an alert when invalid data has been input.
- daylightsavingstimeoffset( -- The daylightsavingstimeoffset( function returns the current daylight saving time offset of the specified time zone.
- dbserverdomain( -- The dbserverdomain( function returns the server domain for the database.
- dbshared( -- The dbshared( function returns true if the current database is shared, otherwise false.
- Debug Instrumentation -- conditional logging of the internal state of Panorama program code.
- defineservervariable -- The defineservervariable statement defines the value of a permanent variable on the server. If the variable already exists, it is not touched.
- delay -- The delay statement loops for a specified period of time.
- deleteglobaldictionaryvalues -- The deleteglobaldictionaryvalues statement deletes one or more global dictionary values.
- deletewebtemplate -- The deletewebtemplate statement deletes the web template (a dictionary) associated with a form (if any).
- Deploying Panorama in an Organization -- transferring preferences and/or account login credentials to multiple computers.
- Diagnosing a Formula embedded in a Form Object -- diagnosing problems with formulas embedded in form objects.
- dictionaryassignmentscode( -- The dictionaryassignmentscode( function returns code that can be used to take the values in a dictionary (see Data Dictionaries) and assign them to fields or variables based on the dictionary keys.
- dictionaryfromvariables( -- The dictionaryfromvariables( function builds a new dictionary and initializes it from a list of variables (carriage return delimited).
- disableabort -- The disableabort statement prevents loops from being stopped early by pressing SHIFT-COMMAND-ESCAPE or by exceeding the maximum allowed loop time.
- downloaddatabasefromserver -- The downloaddatabasefromserver statement downloads a database file from a Panorama server.
- downloaddatafromserver -- The downloaddatafromserver statement asynchronously downloads pre-calculated binary data from a Panorama server.
- downloadpartialdatabase -- The downloadpartialdatabase statement downloads specified components of the current database from the server. The current database must be shared.
- downloadrecord -- The downloadrecord statement downloads the current record from the connected server.
- downloadrecordwithwarning -- The downloadrecordwithwarning statement downloads the current record from the connected server, with a warning if the record is currently locked.
- dropallshareddatabases -- The dropallshareddatabases statement drops the connection to all shared databases. Panorama uses this when the client is about to quit, could also be used if you know you are about to go offline.
- dropserver -- The dropserver statement disconnects the current database from the server.
- dumpdictionarysource( -- The dumpdictionarysource( function returns a carriage return separated array of dictionary keys and values (see Data Dictionaries). The keys and values are quoted so that they could be used to re-assemble the dictionary with the initializedictionary( function.
- editcellwith -- The editcellwith statement opens the edit window for the currently active field (or cell), using the supplied alternate text.
- editfield -- The editfield statement begins editing of the specified field.
- emptylineitemnumber( -- The emptylineitemnumber( function returns the numeric suffix of the first matching line item field that is empty (if any).
- enableabort -- The enableabort statement allows the SHIFT-COMMAND-ESCAPE key sequence to stop an endless loop.
- encodeurlfragment( -- The encodeurlfragment( function encodes text so that it can be used in the fragment portion of a URL (the portion after the # symbol).
- encodeurlhost( -- The encodeurlhost( function encodes text so that it can be used in the host portion of a URL (for example www.host.com).
- encodeurlpassword( -- The encodeurlpassword( function encodes text so that it can be used in the password portion of a URL.
- encodeurlpath( -- The encodeurlpath( function encodes text so that it can be used in the path portion of a URL (the portion after the host name, but before any ? symbol).
- encodeurlquery( -- The encodeurlquery( function encodes text so that it can be used in the query portion of a URL (the portion after the ? symbol).
- encodeurluser( -- The encodeurluser( function encodes text so that it can be used in the user name portion of a URL.
- enterprisecall -- The enterprisecall statement calls a procedure in a server database, opening and closing the database if necessary.
- executeasap -- The executeasap statement executes the specified code at the first possible opportunity, non-atomically.
- filebookmark( -- The filebookmark( function converts a file or folder path into a binary data value that persistently links to the file, even if it is later moved or renamed.
- findrelated -- The findrelated statement finds information that matches the current record in a related database.
- findselect -- The findselect statement opens the standard Find/Select dialog.
- finishtimecheck -- The finishtimecheck statement finishes a performance monitoring session.
- forcelockrecord -- The forcelockrecord statement immediately locks the current record.
- forcesynchronize -- The forcesynchronize statement force synchronizes the local database with Panorama Server (downloads all records, not just recently modified ones).
- forcesynchronizeall -- The forcesynchronizeall statement force synchronizes all open databases.
- forceunlockallrecords -- The forceunlockallrecords statement immediately unlocks all records in the current database.
- forceunlockdatabaserecord -- The forceunlockdatabaserecord statement immediately unlocks an arbitrary record in the specified server database.
- forceunlockrecord -- The forceunlockrecord statement immediately unlocks the current record.
- formulafields( -- The formulafields( function returns a list of fields used in a formula.
- formulaidentfiers( -- The formulaidentfiers( function returns a list of identifiers (fields and variables) used in a formula.
- formulastrings( -- The formulastrings( function returns a data array of strings (text constants) used in a formula.
- formulavalue( -- The formulavalue( function calculates the result of a formula based on data in the current record of any open database. This is similar to the fieldvalue( function, but allows any formula to be used, rather than just a single field.
- formulavariables( -- The formulavariables( function returns a list of variables used in a formula.
- getformoption( -- The getformoption( function returns information about a form.
- getglobaldictionary( -- The getglobaldictionary( function converts a global dictionary into a regular dictionary.
- getprocedureoption( -- The getprocedureoption( function returns information about a procedure.
- getuploadeddata( -- The getuploadeddata( function is used in server code to access data uploaded with the UploadDataToServer statement.
- getwebtabletemplate( -- The getwebtabletemplate( function converts a web table template (created by the Text Export Wizard) into the format compatible with the HTMLDataTable statement.
- getwebtabletemplate -- The getwebtabletemplate statement converts a web table template (created by the Text Export Wizard) into the format compatible with the HTMLDataTable statement.
- getwebtemplate( -- The getwebtemplate( function retrieves the web template (a dictionary) associated with a form (if any).
- getwebtemplate -- The getwebtemplate statement retrieves the web template (a dictionary) associated with a form (if any).
- getwebtemplatetext( -- The getwebtemplatetext( function retrieves the text of the web template (a dictionary) associated with a form (if any).
- getwebtemplatetext -- The getwebtemplatetext statement retrieves the text of the web template (a dictionary) associated with a form (if any).
- Global Dictionaries -- alertnate high performance method to store multiple data items, much faster than regular data dictionaries.
- globaldictionarybuild -- The globaldictionarybuild statement builds a global dictionary by scanning a database.
- globaldictionarykeys( -- The globaldictionarykeys( function returns a cr()-separated array containing the keys in a global dictionary, or the names of all global dictionaries.
- globaldictionaryvalue( -- The globaldictionaryvalue( function returns the value of an item in a global dictionary, given its key (see Global Dictionaries).
- grabwebformitems -- The grabwebformitems statement grabs multiple web form items and stuffs the values into fields and/or variables.
- hidefieldsbetween -- The hidefieldsbetween statement shows all fields except those in between specified numbers.
- hidelineitemfields -- The hidelineitemfields statement hides all line item fields.
- hideotherapplications -- The hideotherapplications statement hides all other applications, leaving only Panorama visible.
- hidepanorama -- The hidepanorama statement hides Panorama X, making all windows disappear.
- hostdatabases -- The hostdatabases statement downloads a list of available databases on a Panorama X Server.
- hostdownload -- The hostdownload statement downloads a shared file to this computer, prompting the user for the location.
- htmlcolor( -- The htmlcolor( function converts a color name into a hex HTML color (RRGGBB format).
- importrawdata -- The importrawdata statement imports raw binary data into an existing database.
- info("accessorypanelisopen") -- The info("accessorypanelisopen") function returns the status of the current window's accessory panel, if any.
- info("callerslocalvariables") -- The info("callerslocalvariables") function returns a list of local variables defined in the procedure that called the current procedure.
- info("clickedwindownumber") -- The info("clickedwindownumber") function returns the window number of that was just clicked.
- info("colornames") -- The info("colornames") function returns a list of color names that can be used as a text object background and with the htmlcolor( function.
- info("csvseparator") -- The info("csvseparator") function returns the current CSV field separator character (comma or semicolon).
- info("customfunctions") -- The info("customfunctions") function returns a list of all available custom functions.
- info("datasheetwindownumbers") -- The info("datasheetwindownumbers") function returns the unique ID numbers of all open data sheet windows.
- info("defaultfloatformat") -- The info("defaultfloatformat") function returns the default format for converting floating point numbers to text.
- info("defaultmaxdatasheetcolumns") -- The info("defaultmaxdatasheetcolumns") function default maximum number of allowed data sheet columns.
- info("dialogsheet") -- The info("dialogsheet") function returns true if the currently active window is a dialog sheet.
- info("dropwindownumber") -- The info("dropwindownumber") function returns the number of the window that contains the form data was dropped on.
- info("eventtype") -- The info("eventtype") function returns the type of the last event (mouse click, keyboard press, etc.).
- info("formwindownumbers") -- The info("formwindownumbers") function returns the unique ID numbers of all open form windows.
- info("httprequestinprogress") -- The info("httprequestinprogress") function returns true if this code is running on Panorama X Server, and the server is responding to a web client request.
- info("localtimezone") -- The info("localtimezone") function returns the local time zone for the current location of your computer.
- info("loggedinaccountemail") -- The info("loggedinaccountemail") function returns the currently logged in account ID (email address).
- info("loggedinaccountrole") -- The info("loggedinaccountrole") function returns the currently logged in account role.
- info("matrixcellrecordid") -- The info("matrixcellrecordid") function returns the record id of the cell in a matrix that was clicked on.
- info("matrixclickinfo") -- The info("matrixclickinfo") function identifies what section and what named object was clicked on in a matrix.
- info("panoramabundleversion") -- The info("panoramabundleversion") function returns the bundle version of Panorama.
- info("panoramaisactive") -- The info("panoramaisactive") function returns true if Panorama is the frontmost application (in other words, if the Panorama menu bar is visible).
- info("panoramauptime") -- The info("panoramauptime") function returns the number of seconds since Panorama launched.
- info("panoramaversion") -- The info("panoramaversion") function returns the version number of Panorama.
- info("procedurewindownumbers") -- The info("procedurewindownumbers") function returns the unique ID numbers of all open procedure windows.
- info("processidentifier") -- The info("processidentifier") function returns the process id number that Panorama is running under.
- info("processname") -- The info("processname") function returns the process name that Panorama is running under.
- info("rawdatabasedata") -- The info("rawdatabasedata") function returns the binary data of the current database.
- info("rawrecord") -- The info("rawrecord") function returns the binary data of the current record.
- info("rawrecordid") -- The info("rawrecordid") function returns a number that represents the location of the current record within the database.
- info("runningatomic") -- The info("runningatomic") function returns true if the current procedure is running as a "atomic" procedure.
- info("runningonserver") -- The info("runningonserver") function returns true if code is running on Panorama X Server, false if running on client.
- info("runningunderterminal") -- The info("runningunderterminal") function returns true if Panorama was launched under Terminal.app.
- info("serverconnection") -- The info("serverconnection") function returns true if the currently active database is connected to the server.
- info("serverrecordts") -- The info("serverrecordts") function returns the internal time stamp associated with the current record.
- info("serverupdate") -- The info("serverupdate") function returns true if the server update option is currently turned on (this is the default).
- info("taperecorder") -- The info("taperecorder") function returns information about the current procedure recording (if any).
- info("timelimitremaining") -- The info("timelimitremaining") function returns the amount of time available (in seconds) before a loop will time out.
- info("timezoneabbreviations") -- The info("timezoneabbreviations") function returns a dictionary of time zone abbreviations supported by the system.
- info("timezones") -- The info("timezones") function returns a list of time zone regions recognized by the system.
- info("unsharedrecordid") -- The info("unsharedrecordid") function returns the minimum ID for unshared records.
- info("webclientsessioninprogress") -- The info("webclientsessioninprogress") function returns true if this code is running on Panorama X Server, and the server is responding to a web client request.
- info("windownumber") -- The info("windownumber") function returns the unique ID number of the current window.
- info("windownumbers") -- The info("windownumbers") function returns the unique ID numbers of all open windows.
- Installing and Launching Panorama Server -- instructions for getting Panorama Server up and running, as well as best practices for configuring system settings on a server computer.
- Introduction to Panorama X Team Server -- using a server extends the reach of Panorama beyond a single computer to a network of connected computers, or even across the entire Internet. This topic introduces the concepts needed to understand the operation of the Panorama X Team Server system, including multi-user database sharing and database web publishing.
- Join Databases -- joining another database into the current database (relational join).
- join -- The join statement joins data from another database into the current database.
- joindialog -- The joindialog statement opens the standard Join Database dialog.
- joinonerecord -- The joinonerecord statement joins matching data from another database into the current record.
- jsonscriptstring( -- The jsonscriptstring( function converts text into a JSON string literal
- labelize( -- The labelize( function returns the value of a field or variable along with a label. This saves typing when you need to display fields or variables when logging and debugging.
- labelizeformula( -- The labelizeformula( function returns the value of a formula along with the formula itself as a label.
- labelizeinfo( -- The labelizeinfo( function returns the value of an info( function, along with the function itself as a label.
- labelizepattern( -- The labelizepattern( function formats a text value using a label and a pattern.
- letservervariable -- The letservervariable statement creates a server variable and assigns a value to it.
- Limiting the Maximum Number of Data Sheet Columns -- adjusting the maximum number of columns displayed in data sheet windows.
- Line Item Grid Constructor -- creates a grid of form elements for displaying and editing line item fields.
- Linking with Another Database -- techniques for relating multiple database files so that they work together.
- listwebtables( -- The listwebtables( function returns the list of web tables (generated by the Text Export wizard) in the specified database.
- listwebtables -- The listwebtables statement generates a list of web tables (generated by the Text Export wizard) in the specified database.
- listwebtemplates( -- The listwebtemplates( function retrieves a list of web templates in the specified database, if any.
- listwebtemplates -- The listwebtemplates statement retrieves a list of web templates in the specified database, if any.
- listwindownumbers( -- The listwindownumbers( function builds a text array containing a list of window ID numbers for all the open windows associated with a particular file.
- listwindows( -- The listwindows( function builds a text array containing a list of all the open windows associated with a particular file.
- littleendianbinaryvalue( -- The littleendianbinaryvalue( function converts little endian binary data (a byte, word, or longword) into an unsigned number (see Binary Data).
- localpanoramaxserverisrunning( -- The localpanoramaxserverisrunning( function returns true if Panorama X Server is currently running on this computer, false if it is not running.
- localpanoramaxservername( -- The localpanoramaxservername( function returns the name of the Panorama X server on the local computer, if any.
- localpanoramaxservers( -- The localpanoramaxservers( function returns the names of all Panorama X servers that are running on the local network.
- lockcurrentrecord( -- The lockcurrentrecord( function attempts to lock the current record, returns true if successful, false if failed.
- lockedrecordlist -- The lockedrecordlist statement returns a list of records locked in the current database.
- lockorstop -- The lockorstop statement attempts to lock the current record. If the record is currently locked by another user, the procedure stops with an error
- lockrecord -- The lockrecord statement attempts to lock the current record, and waits if it is currently locked by another user.
- Logging Server Activity -- recording server activities for later analysis.
- Looking up Data Directly from the Server -- local in-memory vs. server lookups.
- loremipsum( -- The loremipsum( function creates one or more paragraph blocks of "lorem ipsum" dummy text.
- makeformwebtemplate -- The makeformwebtemplate statement converts a Panorama form into the equivalent HTML/CSS.
- Manually Uploading a Quick Patch to the Server -- uploading a procedure or form.
- measuretext( -- The measuretext( function returns the size of a string of text in a particular font and size.
- Newly Opened Database Window Arrangement -- customizing the arrangement and location of windows when a database is opened.
- nextdaylightsavingstimetransition( -- The nextdaylightsavingstimetransition( function returns the next date on which a transition to or from daylight savings time occurs.
- noinstrumentationmenu( -- The noinstrumentationmenu( function supresses the Instrumentation menu.
- openasyncprogresswindow -- The openasyncprogresswindow statement opens a floating progress window for asynchronous operations (urltask(, timers).
- opendatabase -- The opendatabase statement opens a database file.
- openform -- The openform statement opens a form in the current database in a new window.
- Opening a Database in Diagnostic Mode -- opening a database so that no implicit code is triggered.
- openlivecoursecalendar -- The openlivecoursecalendar statement Opens the Live Course Calendar window.
- openpreferenceswindow -- The openpreferenceswindow statement opens the Panorama Preferences window.
- opensecret -- The opensecret statement opens a database invisibly, without opening its windows.
- opensoftwareupdatewindow -- The opensoftwareupdatewindow statement opens the Panorama Software Update window.
- openurlinbackground -- The openurlinbackground statement opens a URL (usually a web page or to create an e-mail message) without bringing forward the app that handles the URL (in other words, Panorama remains the frontmost application).
- openviewsearch -- The openviewsearch statement opens a View Search window.
- openwebmap -- The openwebmap statement opens a web browser window displaying a map of a location.
- openwithterminal -- The openwithterminal statement opens an application in a new Terminal.app window (useful for debugging).
- panoramaappvisibility -- The panoramaappvisibility statement allows the Panorama X dock and menu bar to be hidden.
- panoramamacid( -- The panoramamacid( function returns the MAC address registered with Panorama for this computer.
- partialdatabaseupdate -- The partialdatabaseupdate statement updates one or more components of an existing database.
- Permanently Deleting a Database from the Server -- remove a database from the server.
- Permanently Detaching a Shared Database from the Server -- unshare a shared database.
- posixscript( -- The posixscript( function executes a POSIX shell script using NSTask and returns the result.
- posttorelated -- The posttorelated statement posts data in the current record to the corresponding record in a related database.
- Preventing Endless Loops -- setting up a timeout limit to prevent endless loops.
- procedureexists( -- The procedureexists( function checks to see whether a procedure exists or not.
- provueserverisup( -- The provueserverisup( function checks whether provue.com is online and operating.
- provueserverisup -- The provueserverisup statement checks whether provue.com is online and operating.
- Record Locking and Editing Shared Data -- coordinating data entry across multiple simultaneous users.
- Record Locking in Procedure Code -- implicit and explicit management of record locking.
- recordislocked( -- The recordislocked( function tests whether the current record is locked on this client.
- related( -- The related( function searches a database for a record in a related database that matches the current record in the current database based a relational specification (based on one or more key fields or formulas in each database), then uses a formula to return other information from the same record. This is similar to the lookup( function, but instead of using an individual field for the key, a relation is used (see Relational Database Management).
- relatedarray( -- The relatedarray( function builds an Text Array by scanning a database and creating an array element for every record that matches a relational specification (based on one or more key fields or formulas). This is similar to the arraybuild( function, but instead of using an individual field for the key, a relation is used (see Relational Database Management).
- relatedrecordid( -- The relatedrecordid( function returns the record id of a record in a related database that matches the current record in the current database based on a relational specification.
- Relational Database Management -- linking together multiple databases based on common data.
- remotepanoramaxservers( -- The remotepanoramaxservers( function returns the names of all Panorama X servers that are remotely accessible from this computer.
- removeremotehost -- The removeremotehost statement makes a remote host unavailable to this computer.
- renderwebform( -- The renderwebform( function renders a Panorama web form into HTML, merging data into the template as necessary.
- renderwebform -- The renderwebform statement renders a Panorama web form into HTML, merging data into the template as necessary.
- renderwebtable( -- The renderwebtable( function renders a web table using records selected with WebSelect in the current database.
- renderwebtable -- The renderwebtable statement renders a web table using records selected with WebSelect in the current database.
- reorderfieldsdialog -- The reorderfieldsdialog statement opens the Reorder Fields dialog.
- resetallrecordidts -- The resetallrecordidts statement resets the internal record id and time stamps for every record in the current database.
- Restricting Server Access -- limiting Panorama X Server access to authorized users.
- resumeaftertask -- The resumeaftertask statement resumes after a waitfortask statement.
- retrywebform -- The retrywebform statement retries a web form that has missing or invalid data.
- runningappinfo( -- The runningappinfo( function returns information about applications that are currently running on this computer.
- savepartialdatabase -- The savepartialdatabase statement saves specified components of the current database, leaving other components out.
- savewebtemplate -- The savewebtemplate statement saves a web template (a dictionary) associated with a form.
- selectrecordsrelatedto -- The selectrecordsrelatedto statement selects records in the current database that are related to any record in another database.
- selectrelated -- The selectrelated statement selects information that matches the current record in a related database.
- Server Administration Wizard -- this wizard is used to monitor the operation of Panorama servers (both local and remote servers can be monitored), including monitoring server status, checking database status and downloading databases, and monitoring the status of user sessions.
- Server Variables (Shared Variables) -- sharing variable values across multiple users.
- Server Variables -- storing permanent, shared values on a Panorama server.
- serverdatabaseconsoledump -- The serverdatabaseconsoledump statement dumps the raw contents of the specified database on the server to the console in comma delimited format.
- serverdatabasename( -- The serverdatabasename( function returns the server database name associated with a shared database.
- serverformulafill -- The serverformulafill statement fills a specified subset of records in a shared database.
- serverjournalcode -- The serverjournalcode statement writes code to journal file.
- serverjournalcurrentrecord -- The serverjournalcurrentrecord statement writes the current record to journal file.
- serverlog -- The serverlog statement adds a line to one or more server logs.
- serverlookup( -- The serverlookup( function searches a shared database for a value, then returns other information from the same record. Similar to the lookup( function, but the search is performed on the server instead in the local computer's memory.
- serverlookupall( -- The serverlookupall( function builds a text array containing one item for every record in the target database where the data in the keyField matches the keyData. Similar to the lookupall( function but retreives the data directly from the server computer, instead of from the local computer's memory.
- servername( -- The servername( function returns the name of the server associated with a shared database.
- serverrunning( -- The serverrunning( function returns true if this code is running on a Panorama server, or false if it is running in single user mode or on a client.
- serversuperlookup( -- The serversuperlookup( function searches a database for a record that matches a query formula, then uses a second formula to return other information from the same record. This is identical to the superlookup( function, but instead of searching in the local computer's memory, the search is done on the server to ensure that the most up-to-date information is returned.
- serverupdate -- The serverupdate statement temporarily disables record locking and server updates when using a shared database.
- servervariable( -- The servervariable( function returns the value of a server variable (a permanent variable on the server).
- servervariablenames( -- The servervariablenames( function returns the names of all server variables associated with a database.
- servervariables( -- The servervariables( function returns the names and values of all server variables associated with a database. The names and values are returned in a dictionary.
- setbannericon -- The setbannericon statement sets the icon on the right side of the toolbar banner.
- setbannermessage -- The setbannermessage statement sets the text in the toolbar banner to an arbitrary message.
- setbannerprogressbar -- The setbannerprogressbar statement displays progress in the toolbar banner.
- setcallerslocal -- The setcallerslocal statement allows a subroutine to modify a local variable in the procedure that called it.
- setdefaultfloatformat -- The setdefaultfloatformat statement sets the default format for converting floating point values to text (unsupported).
- setglobaldictionaryvalues -- The setglobaldictionaryvalues statement sets one or more key/value pairs in a global dictionary.
- sethiddenwebformitem -- The sethiddenwebformitem statement adds a hidden field to a form on a web page.
- setlocalsfromdictionary -- The setlocalsfromdictionary statement converts a dictionary into a collection of local variables. The names and values of the local variables will be derived from the dictionary contents.
- settimechecklongtime -- The settimechecklongtime statement sets the threshold for a slow task during a performance monitoring session.
- Setting up a Computer as a Panorama X Client -- instructions for setting up a new client computer so that it can access a Panorama X server.
- setwaitinglocal -- The setwaitinglocal statement assigns a value to a local variable in the parent procedure of an asynchronous task, allowing the asynchronouse code to pass a value back to the code that spawned it.
- Shared Database Synchronization -- data synchronization across multiple users.
- shareddatabasebookmarkedpath( -- The shareddatabasebookmarkedpath( function retrieves the local path and filename of a server database (if any).
- sharedusers( -- The sharedusers( function returns a list of users that are currently using the specified database.
- standardinstrumentationmenu( -- The standardinstrumentationmenu( function generates a Custom Menu specification for Panorama’s standard Instrumentation menu.
- starttimecheck -- The starttimecheck statement starts a performance monitoring session.
- startupdatecheck -- The startupdatecheck statement starts background check for available Panorama update.
- stashwebformitems -- The stashwebformitems statement takes the variables created with the GrabWebFormItems statement and assigns them to fields in the current record.
- stdout -- The stdout statement sends one or more characters to standard output.
- straightquotes( -- The straightquotes( function converts any "smart quotes" in the text into straight quotes.
- stripaccents( -- The stripaccents( function removes accents from any characters in the text.
- synchronize -- The synchronize statement synchronizes the local database with Panorama Server. This is the same as choosing Synchronize from the File menu.
- synchronizeall -- The synchronizeall statement synchronizes all open databases.
- Synchronizing in Procedure Code -- customizing the data synchronization process.
- Temporarily Disconnecting a Shared Database from the Server -- pause database sharing.
- Text Object Background Color/Gradient -- text object background colors and gradients.
- timecheck -- The timecheck statement identifies an intermediate point in a performance monitoring session.
- timelimit -- The timelimit statement specifies the maximum time a procedure can continue to run after this statement.
- timerexists( -- The timerexists( function checks to see whether a timer exists.
- timezoneabbreviation( -- The timezoneabbreviation( function returns the abbreviation of the specified time zone.
- timezonename( -- The timezonename( function returns the continent and city of the specified time zone.
- titlecase( -- The titlecase( function capitalizes first character of each word, but not articles, prepositions, and conjunctions under 5 characters (unless they are the first or last word in the text).
- tsvtocsv( -- The tsvtocsv( function converts tab separated text into comma separated text.
- tsvtojson( -- The tsvtojson( function converts tab separated text into JSON formatted text.
- uncloakeddatabasename( -- The uncloakeddatabasename( function converts the internal server name of a database to the regular "uncloaked" name.
- undefineservervariable -- The undefineservervariable statement destroys a server variable.
- Understanding the Run Loop -- explanation of how Panorama code interacts with the run loop to respond to mouse clicks, keyboard presses, display updates and other events that require attention.
- Updating Panorama X -- checking for and installing newer versions of Panorama X.
- uploaddatatoserver -- The uploaddatatoserver statement uploads binary data to the server.
- uploadfiletoserver -- The uploadfiletoserver statement uploads a file or folder to a Panorama server.
- uploadrecord -- The uploadrecord statement uploads the current record to the server, even if it was not locked (for emergency use only).
- urltask( -- The urltask( function asynchronously loads a resource from the internet.
- usefunctioncallerslocalvariables -- The usefunctioncallerslocalvariables statement temporarily swaps out a procedures current local variables with the local variables of the procedure that called this the call(, callwithin( or execute( function.
- Using an External Web Server -- instructions for using Panorama Server in conjunction with an external web server (for example Apache, Nginx, etc.).
- Version 10.2 (released October 7th, 2021) -- Summary of Version 10.2 (released 10/7/2021)
- View Search -- persistent, comprehensive search of procedures and forms in one or multiple databases.
- wait -- The wait statement pauses the program for a specified period of time.
- waitfortask -- The waitfortask statement temporarily pauses a procedure until the specified task is complete.
- webdatabaseadminpage -- The webdatabaseadminpage statement generates a web admin HTML page for the current database.
- webdatabasetoform -- The webdatabasetoform statement fills in an HTML form with database field values.
- webfontsubstitutes( -- The webfontsubstitutes( function generates an array of standard font substitutions for web browsers.
- webfontsubstitutes -- The webfontsubstitutes statement generates an array of standard font substitutions for web browsers.
- webformallitems( -- The webformallitems( function returns a list of POST parameters passed from a form to the web server as a carriage return separated list.
- webformerrors( -- The webformerrors( function returns a list of errors that have been collected with the WebFormItemCheck statement.
- webformhiddenitems( -- The webformhiddenitems( function returns a list of the hidden items in the web form submitted to this web procedure.
- webformitem -- The webformitem statement sets a field or variable with the value of a POST web form item (used when processing a web query with Panorama Server).
- webformitembang( -- The webformitembang( function returns an exclamation point, icon or symbol to indicate an error in a web form for data entry.
- webformitembang -- The webformitembang statement sets the text generated by the webformitembang( function.
- webformitemcheck -- The webformitemcheck statement uses a formula to check the validity of a web form item.
- webformitemerror( -- The webformitemerror( function returns the error for a specific web form item, if any (used when processing a web query with Panorama Server).
- webformitemnames( -- The webformitemnames( function returns a list of POST parameters passed from a form to the web server as a carriage return separated list.
- webformitemnames -- The webformitemnames statement returns a list of POST parameters passed from a form to the web server as a carriage return separated list.
- webformitems( -- The webformitems( function returns a list of POST parameters passed from a form to the web server, including both visible and invisible items (but excluding the special items Panorama generates for its own internal use).
- webformitemvalue( -- The webformitemvalue( function gets the value of a POST web form item (used when processing a web query with Panorama Server).
- webformmerge -- The webformmerge statement fills in an HTML form with database values (fields and variables).
- webformmissingfields( -- The webformmissingfields( function lists required fields that were not been entered into a web form.
- webformname( -- The webformname( function when processing data input into a web form, this function returns the name of the Panorama form associated with the web form (if any).
- webformrecordid -- The webformrecordid statement adds a RECORD_ID hidden field to the HTML of a web form.
- webformselection -- The webformselection statement selects data based on input from a web form. The web form must have fields that match the database fields.
- webformtodatabase -- The webformtodatabase statement updates the current database with information from the web form that was just submitted.
- webformvisibleitems( -- The webformvisibleitems( function returns a list of the visible items in the web form submitted to this web procedure.
- webimagedisplay( -- The webimagedisplay( function used within an Image Display Object to specify both a web image (used when the form is displayed in a web browser from Panorama Server) and a local image file (used when the form is displayed within Panorama).
- webmerge -- The webmerge statement merges an external HTML template file with fields and variables from the current record.
- webselect -- The webselect statement select data on web server using a formula.
- webtagortext( -- The webtagortext( function prepares text for display in a web page.
- webtext( -- The webtext( function converts a number or regular text into text encoded for display in a web browser.
- webthisrecordkey( -- The webthisrecordkey( function makes a key for use with the WebURLSelect statement to specify the current record.
- webthisrecordkey -- The webthisrecordkey statement makes a key for use with the WebURLSelect statement to specify the current record.
- weburlfind -- The weburlfind statement finds a record based on keys in a URL.
- weburlselect -- The weburlselect statement selects one or more records based on keys in a URL.
- Window ID Numbers -- ID numbers for identifying windows.
- window -- The window statement brings a Panorama window to the front. It can also open a "secret" invisible window.
- windowglobalvalue( -- The windowglobalvalue( function accesses a windowglobal variable from other windows.
- windowinfo( -- The windowinfo( function returns information about an open window: its name, type, database, location, etc.
- Working With Summary Records in a Shared Database -- summary records are not shared between users.
- writepreference -- The writepreference statement modifies a preference value.
- xcallbackurl -- The xcallbackurl statement performs an action in another application using the x-callback-url mechanism.
- zipcompress -- The zipcompress statement compresses a file or an entire folder into a zip file (using ditto shell tool).
- zipuncompress -- The zipuncompress statement uncompresses a file or an entire folder from a zip file (using ditto shell tool).
- zlog -- The zlog statement outputs a message to the instrumentation log (if instrumentation is enabled).
- zlogalways -- The zlogalways statement unconditionally outputs a message to the instrumentation log.
- zlogcoverage -- The zlogcoverage statement allows instrumentation coverage to be turned on or off within a procedure.
- zlogdictionary -- The zlogdictionary statement outputs a data dictionary to the instrumentation log (if instrumentation is enabled).
- zlogging( -- The zlogging( function returns true if zlogging is enabled for the current database and procedure, otherwise false.

See Also

- Version 0.1.001 (released July 7th, 2012) -- Summary of Version 0.1.001 (released 7/7/2012)
- Version 0.1.002 (released August 12th, 2012) -- Summary of Version 0.1.002 (released 8/12/2012)
- Version 0.1.003 (released December 2nd, 2012) -- Summary of Version 0.1.003 (released 12/2/2012)
- Version 0.1.004 (released December 10th, 2012) -- Summary of Version 0.1.004 (released 12/10/2012)
- Version 0.1.005 (released December 21st, 2012) -- Summary of Version 0.1.005 (released 12/21/2012)
- Version 0.1.006 (released December 26th, 2012) -- Summary of Version 0.1.006 (released 12/26/2012)
- Version 0.1.007 (released May 1st, 2013) -- Summary of Version 0.1.007 (released 5/1/2013)
- Version 0.1.008 (released May 22nd, 2013) -- Summary of Version 0.1.008 (released 5/22/2013)
- Version 0.1.009 (released July 9th, 2013) -- Summary of Version 0.1.009 (released 7/9/2013)
- Version 0.1.010 (released October 14th, 2013) -- Summary of Version 0.1.010 (released 10/14/2013)
- Version 0.1.011 (released December 6th, 2013) -- Summary of Version 0.1.011 (released 12/6/2013)
- Version 0.1.012 (released August 29th, 2015) -- Summary of Version 0.1.012 (released 8/29/2015)
- Version 0.1.013 (released September 6th, 2015) -- Summary of Version 0.1.013 (released 9/6/2015)
- Version 0.1.014 (released September 14th, 2015) -- Summary of Version 0.1.014 (released 9/14/2015)
- Version 0.1.015 (released September 29th, 2015) -- Summary of Version 0.1.015 (released 9/29/2015)
- Version 0.1.016 (released October 12th, 2015) -- Summary of Version 0.1.016 (released 10/12/2015)
- Version 0.1.017 (released November 11th, 2015) -- Summary of Version 0.1.017 (released 11/11/2015)
- Version 0.1.018 (released December 7th, 2015) -- Summary of Version 0.1.018 (released 12/7/2015)
- Version 0.1.019 (released January 28th, 2016) -- Summary of Version 0.1.019 (released 1/28/2016)
- Version 0.1.020 (released February 15th, 2016) -- Summary of Version 0.1.020 (released 2/15/2016)
- Version 0.1.021 (released February 29th, 2016) -- Summary of Version 0.1.021 (released 2/29/2016)
- Version 0.1.022 (released March 1st, 2016) -- Summary of Version 0.1.022 (released 3/1/2016)
- Version 0.1.023 (released May 27th, 2016) -- Summary of Version 0.1.023 (released 5/27/2016)
- Version 0.1.024 (released June 12th, 2016) -- Summary of Version 0.1.024 (released 6/12/2016)
- Version 0.1.025 (released July 21st, 2016) -- Summary of Version 0.1.025 (released 7/21/2016)
- Version 0.1.026 (released August 29th, 2016) -- Summary of Version 0.1.026 (released 8/29/2016)
- Version 0.1.027 (released September 18th, 2016) -- Summary of Version 0.1.027 (released 9/18/2016)
- Version 0.1.028 (released November 9th, 2016) -- Summary of Version 0.1.028 (released 11/9/2016)
- Version 0.1.029 (released December 31st, 2016) -- Summary of Version 0.1.029 (released 12/31/2016)
- Version 0.1.030 (released February 12th, 2017) -- Summary of Version 0.1.030 (released 2/12/2017)
- Version 0.1.031 (released March 3rd, 2017) -- Summary of Version 0.1.031 (released 3/3/2017)
- Version 0.1.032 (released April 3rd, 2017) -- Summary of Version 0.1.032 (released 4/3/2017)
- Version 0.9 (released May 15th, 2017) -- Summary of Version 0.9 (released 5/15/2017)
- Version 0.9.001 (released July 18th, 2017) -- Summary of Version 0.9.001 (released 7/18/2017)
- Version 0.9.002 (released July 27th, 2017) -- Summary of Version 0.9.002 (released 7/27/2017)
- Version 0.9.003 (released September 10th, 2017) -- Summary of Version 0.9.003 (released 9/10/2017)
- Version 0.9.004 (released September 14th, 2017) -- Summary of Version 0.9.004 (released 9/14/2017)
- Version 0.9.005 (released September 19th, 2017) -- Summary of Version 0.9.005 (released 9/19/2017)
- Version 0.9.006 (released September 27th, 2017) -- Summary of Version 0.9.006 (released 9/27/2017)
- Version 0.9.007 (released October 3rd, 2017) -- Summary of Version 0.9.007 (released 10/3/2017)
- Version 0.9.008 (released October 12th, 2017) -- Summary of Version 0.9.008 (released 10/12/2017)
- Version 10.0.0 (released October 18th, 2017) -- Summary of Version 10.0.0 (released 10/18/2017)
- Version 10.0.01 (released December 10th, 2017) -- Summary of Version 10.0.01 (released 12/10/2017)
- Version 10.1 (released August 6th, 2018) -- Summary of Version 10.1 (released 8/6/2018)
- Version 10.1.1 (released August 30th, 2018) -- Summary of Version 10.1.1 (released 8/30/2018)
- Version 10.1.2 (released November 15th, 2018) -- Summary of Version 10.1.2 (released 11/15/2018)