Panorama X 10.2.0 b7 Build 3410 Release Notes

This version must be manually downloaded and installed (as I expect for all beta downloads for the forseeable future). Here is the download link.

Once again there is a lot of new documentation – in fact there are 67 new help topics (probably 150-200 new pages). Here are the highlights.

The 10.2 release notes include both this beta and all of the earlier ones.

To learn about what’s new in this b7 release, the detailed changes are described below. As you will see, there are many new features and even more bug fixes.

  • 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.

  • The new View Search wizard facilitates 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.

  • 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 to 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.

  • Instrumentation has been added to some Objective-C code, which can be enabled from the Instrumentation panel. Normally this would only be done following instructions from ProVUE Development technical staff.

  • Added an instrumenation option to control whether logging occurs while Panorama is starting up. The default is no logging during startup.

  • 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.

  • 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 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.

  • The opendatabase statement now works correctly when opening a shared database. Panorama completes all server connection tasks before continuing with the code after the opendatabase statement. Also, the .Initialize procedure (if any) now runs after the server connection is complete but before any code following the opendatabase statement.

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

  • 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). New statements: SetGlobalDictionaryValues, DeleteGlobalDictionaryValues. New functions: GlobalDictionaryValue(, GlobalDictionaryKeys(, GetGlobalDictionary(.

  • 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.

  • 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.

  • 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).

  • 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).

  • 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).

  • 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 is running.

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

  • 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.

  • 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.

  • 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.

  • A new preference option in the Client preferences panel allows customization of the timeout when clients contact the server (previously the default was 60 and could not be changed).

  • Fixed a bug that could sometimes prevent the Wifi icon from appearing in the toolbar of a shared database after synchronizing.

  • Fixed client/server operation when a client database has no visible windows (secret). In particular, synchronizing and opening secret shared databases now works.

  • Any code after a synchronize statement now waits to execute until the synchronization is complete.

  • 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 File menu now includes server commands (connect/disconnect, synchronize, download from server, etc.) even when the user doesn’t have access to standard UI elements.

  • The Server Administration wizard now allows you to force a record to unlock manually.

  • New forceunlockdatabaserecord statement that can unlock any record in any open database on the server.

  • Fixed logic for locking a record when it was already locked but the session that owned the lock is gone (normally would only happen after a crash, force quit, or bug).

  • Improved error handling in the forcelockrecord and forceunlockrecord statements.

  • Fixed problem that could cause saving on the server to fail.

  • Fixed problems that could sometimes occur when downloading a new database generation (during openfile). Also improved the performance of downloading a new generation.

  • Now ensures that correct client database is active after downloading sync information from server.

  • Fixed problem that sometimes caused the server to keep databases open after they were supposed to be closed.

  • When starting or stopping the server, the Start/Stop button is now disabled during the transition, so it can’t be accidentally clicked during this transition.

  • Added the CheckServerConnection statement, which was available in Panorama 6 but had been left out of Panorama X so far.

  • The partialdatabaseupdate statement now updates the view and action menus if the procedures or forms were updates. This also fixes new database generations so that they immediately show any changes to forms and procedures in the menus.

  • The formulamerge statement now handles formula errors properly.

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

  • 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 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.

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

  • 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.

  • 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.

  • Open database (and partial database update) now abort if there is an error decoding the property list (there is no reason to think this has ever happened, but theoretically it could).

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

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

  • 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.

  • 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.

What an impressive list of improvements! Congratulations!

Just starting to go through all the new stuff and noticed this statement in the Debug Instrumentation document regarding the Console setup: " Unfortunately there is no way to automate these steps, you will have to repeat them each time you launch the Console application." Actually you can save those settings so they will be available in the Console’s toolbar.

I have both the PanoramaX Library and All PanoramaX settings in my Console tool bar.

Back in March I posted an Apple Script to automatically open the Console and activate the saved PanoramaX Library settings:

Too involved for inclusion in the Help Documentation but just wanted to make note that it was all possible.

This is an overwhelming list of items. Everything I ever wished for, up to now anyway. Great work, Jim.

I’ll just be keeping my fingers crossed that it works more reliably for you!

Wow, I totally missed that save button, and your very enlightening post from March 9. Let’s see, there was nothing important or distracting going on in the world on March 9, right? :flushed:

I have noted your discovery in BitBucket for possible inclusion either in the documentation, and/or for modification of Panorama itself. And/or maybe a video would be the best way to communicate this.

Gary, you might want to read this bitbucket entry as I did some research and came up with a possible way to do this without relying on an unknown key code. I don’t have time to look into it now, but I’ll bet you might find it entertaining.

I looked at some of the info concerning the Apple Script and came up with a variation that will work if the settings are saved as “PanoramaX”.

tell application "System Events"
	tell process "Console"
		set frontmost to true
		click menu item "PanoramaX" of menu "Action" of menu bar 1
	end tell
end tell

And this script will check the contents of the Console Action menu to see if “PanoramaX” is there:

tell application "System Events"
	tell process "Console"
		name of every menu item of menu "Action" of menu bar 1
	end tell
end tell

I haven’t the time right now to look into the area of enabling Accessibility features. I’ll look a little deeper into that tomorrow.

Cool, that’s more or less what I suspected. I should be able take this code and build it into Panorama so Console can be started up and the filter activated with a single click. Awesome!

I guess that means you got it to work without enabling any Accessibility features. Of course that might depend on what version of macOS you are using.

Wow! Impressive list of features, Jim.
Nicely done. :+1:

@gary : thanks for all those tips – I was going to embark down that path, but you’ve done all the heavy lifting! Thanks! :slight_smile:

You must have done that some time in the past. When I tried to run this code, it said that Accessibility must be turned on. I eventually got it to work, but not with my development version. It appears that it will only work with the copy of Panorama in the /Applications folder.

On my system this doesn’t work reliably. In fact, I can’t choose this reliably from the menu by hand. It gets into a mode where the Action menu is completely disabled, and the only way I’ve found to get out of that mode is to quit and relaunch Console. So I think Console is the problem, not the AppleScript, but it’s kind of discouraging as far as fully automating this.

Yes, sometime in the past I must have turned it on in one of my PanoramaX applescript experiments.

My system is stuck at 10.13.6 High Sierra due to my antiquated equipment. I was going to upgrade to a new computer but decided to put it off until I get a better idea of when the iMac is going to transition to the ARM architecture. Have you received your ARM development machine yet?

I tried moving the PanoramaX toolbar button to the far left (hold down the command key and drag) thinking that might make it the default startup filter. No such luck, it only made it appear first in line of the filters in the Action menu at the command-1 position. “There’s no joy in Mudville” :disappointed:

How cool is that? How did you figure out you could do that? I never would have guessed.

I am actually using 10.12 on my main development computer. The computer could be upgraded, but I haven’t for other reasons.

You know me, I’ll try all kinds of weird things just to see what happens.