Version 10.2.0 b17 (released June 23, 2021)

This beta release includes a couple of significant changes and numerous bug fixes. Special attention was put to smoothing out wrinkles in database sharing operation.

- Panorama X now has an all new update manager, so hopefully after this there will be no more need to manually download updates! It automatically checks for new available updates, but also allows you to review the descriptions of previous updates (and you can even download older updates). In addition to automatically updating production versions, the new update manager can also automatically update beta versions. See Updating Panorama X to learn more.
- Added two methods for detecting damage to a database: integrity seals and data structure corruption tests. See Database Integrity Checks.
- To ensure good 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). This extra column doesn’t display data and cannot be clicked or tabbed into. See Limiting the Maximum Number of Data Sheet Columns.
- Text List and Matrix objects now update when data in the current record is updated (if the Database Navigator option is enabled.
- When printing the Data Sheet, Panorama now uses the text size selected for the Data Sheet window instead of always printing using 12 point text.
- Fixed multiple problems with the Channels panel of the Settings window.
- The Relations panel now detects if any fields used in a relation have been renamed or deleted, and indicates that to the user so that the problem can be corrected. This change and the steps needed to fix a relation after a field name change have been documented (see the bottom of the Relational Database Management page).
- New blindposixscript( function allows Panorama code to run a UNIX script in the background. The UNIX script can even continue running after Panorama quits (this function is used by the new update manager).
- New functions info(“processname”) and info(“processidentifier”) return information about the running copy of Panorama for use in UNIX scripts.
- New zipuncompress statement, properly unzip’s compressed files created by the Finder and by the zipcompress statement.
- 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.
- New function jsonscriptstring( facilitates the creation of JSON literal strings.
- New ErrorMessage button added to Error wizard, when clicked it displays the full error message.
- New dbinfo(“lockstatus” option, returns LOCKED, BUSY or ERROR. This is designed to be used after the lockcurrentrecord( function if you need to differentiate between an ordinary locked record snd some sort of server error.
- The ImportText statement ADDFIELDS option now defaults to NO when working with shared databases. This also allows the OpenTextFile statement to work with shared databases.
- Client auto-unlock no longer causes hang if Panorama is not the frontmost application when unlock is triggered. In other words, it’s now safe to use the Auto-Unlock option in shared databases.
- The server Auto Lock Timeout feature now works properly even if a client has simultaneously locked records in multiple records (of course only 1 record per database can be locked at a time).
- The Upload Data menu command (and UploadRecord statement) now adds the record back into the server if it has been deleted by another user. So if multiple users are editing a database, and one of them deletes a record, any of the others can upload it back (as long as they do so before synchronizing).
- The Lock Record menu command now displays a proper error message if the record is missing on the server (has been deleted by another user). Also the lockrecord statement now throws an error in this situation.
- The DeleteRecord statement now reports an error if the record can’t be deleted, instead of just beeping. For example if the record can’t be deleted because it is locked by another user, that fact will be reported.
- The objectaction “open” statement now works with shared databases, even if the record has not been locked yet.
- The View and Action menus now update immediately when a database is synchronized (for example if a new form or procedure was added or removed due to the synchronization).
- Better reporting of locked records and/or server errors when using assign statements, as well as the set, gettextdialog, gettextokcancel, importjsonline, importline, joineonerecord, popup, and popupbynumber statements, and the lockcurrentrecord( function.
- Fixed edge case that in the past could sometimes cause newly entered text to be lost if you simultaneously edited with multiple Text Editor objects at once (this is possible if multiple form windows are open for the same database).
- The ImportDatabase statement no longer leaves a “hanging” progress window for small uploads if the toolbar is hidden. Also, the new statement CLOSEALLASYNCPROGRESSWINDOWS makes it easy to close any “stuck” progress windows. Hopefully this will never be needed.
- The PostToRelated statement has improved error reporting if the database isn’t open or if there is no relation to the specified database.
- Fixed the errortext( function – it was leaving the error token on the operand stack so it didn’t work when the value was passed into another function or operator.
- Panorama dates are now restricted to below <10000 A.D. If data was corrupted, random large date values could cause Panorama to rainbow, now they simply are interpreted as 1/1/0000.
- Find & Replace dialog now allows clicking in the Replace text to edit that text.
- The measuretext( function now works when used with font names containing a dash (-).
- The uniqueid( function now correctly produces an error if handed a root defined by a field or variable that does not exist.
- The aggregates( function now reports the database name instead of (null) if the the specified database is not open.
- Recording the importdatabase dialog now produces correct code (the ExistingData option is now “Replace” or “Append” instead of true/false),
- Fixed the stopbonjour statement (it didn’t actually stop Bonjour!).
- Fixed a typo in the label for the Fill Field tool.
- Documented the fact that sometimes the .CurrentRecord procedure will get called more than once for a single operation, for example adding a new record.
- Documentation corrections from Thomas Cooper, David Thompson, Kurt Meyer, Craig McPherson, Mark Sanchez, Laurence Veinott and Robert Ameeti