Nightly Build Notes for Alpha Anywhere

IMPORTANT: The nightly builds (previously called the 'pre-release' builds) are only available to customers with a valid Alpha Anywhere subscription. If your subscription has expired you will not be able to use the nightly build.

If your subscription is valid and you download and use the nightly build please keep in mind that if you do not renew your subscription after it expires your eligibility to use nightly builds will end.

 

Build 7800- 5602 26 JUL 2021 - 8:32 AM

 

 

The Features and Bugs Listed Below are for the current nightly build. These features/fixes will be included in the next official Update. These notes are for users who are testing the nightly build.
 

This is not an official patch, so you should not deploy this update to a production environment.

 

This nightly build is our internal, development build and it is made available to you for the sole purpose of testing the new features that have been added and the bug fixes that have been made since the last official release. We are making this nightly build available to you so that you can provide us with feedback on whether the changes we are making are working correctly and have not introduced new issues.

 

If you encounter any type of bug while using this nightly build, please send information about the bug (including full instructions on how to duplicate the issue, and a test case that we can run on our own machines) to a5v12bugs@alphasoftware.com.

 

Please do NOT post bug reports concerning the nightly build on the message board. Alpha Software engineers do NOT routinely monitor the message board and there is a good chance that your posting will be overlooked. Also, since your posting will be referencing unreleased code, it will only serve to confuse other users.

 

This nightly build is not intended to be used in a production environment.

 


 

Downloading the Universal Installer

IMPORTANT: A new installer (called the Universal Installer)  is used to install the nightly builds. To learn more about the Universal Installer, click here.

 

How to Install a Nightly Build

The Nightly build is installed using the Universal Installer. To open the Universal Installer, select the Help, Run Universal Installer menu command.

If you have previously installed a Nightly build (of any of the product variants) using the Universal Installer, the Universal Installer will display the install details on the Installed tab and you can simply click the Update button to install the latest Nightly build of that product variant.


However, if you have not previously installed a Nightly build using the Universal Installer, go to the the Available tab, select the product variant you want to install, click on the Version to Install link, select Nightly build from the Product to Install dropdown and set the install location. Then click the Install button

 

 

Videos

     

 

 

UX Component - List Control - Calendar Layout - (This feature is still under development and requires a Feature Key in order to enable it. We are making an early version of the feature available so we can get feedback from the community). To request a feature key, go to Help, send an email to  enhancementrequests@alphasoftware.com with "List Calendar Feature Key" in the subject.

The Calendar layout is a view of the data in a List See video:

https://www.screencast.com/t/dvLrLJNmhG1

 

Features

bUILD 7800

UX Component - Data Bound - Client-side Events - afterPopulateNewRecord - A new client-side event for data bound UX components has been defined. The afterPopulateNewRecord event fires after the Ajax callback completes when a new record is created.

 

 

UX Component - Integrated Login - Enter Key - If you are using a UX with the integrated login feature enabled, you can now press the Enter key as a shortcut for clicking the Login button.

Build 7796

Global Settings Table - You can now create a Global Settings table in a SQL database that allows you to define settings that can be accessed in any server side code.

Each global setting has a setting name and a setting value. The setting value is a string.

 

Once you have defined your Global Settings table you can use the following Xbasic helper functions.

 

To define the Global Settings table for a project, open the Project Properties dialog.

 

 

SQL Logging - You can now log all SQL executed by a List with a Detail View, a Grid, or a data bound UX component to a table. The SQL Log table contains the sql that got executed, the arguments that were defined, the result of the command, the error message if the SQL failed, the date and time of the command, and how long it took for the SQL to execute.

To enable SQL Logging define properties in the Project Properties dialog.

You can dynamically turn SQL logging on or off by setting a value in the enabled field in the table specified in the Remote enable/disable logging table name property.

For example, assume that you have defined a SQL Log table, but have not specified the Remote enable/disable logging table name property. SQL logging is then enabled.

However, if you have specified a value for the  Remote enable/disable logging table name property then Alpha Anywhere will query the value of the enabled field in this table. If the enabled field value in the first record in the table is true, logging will be enabled. If the value is false, logging is disabled.

 

 

 

 

Xbasic - Running Python Code - You can now run Python code from Xbasic using the xbasic_execute_python() function.

 

Syntax

p pr = xbasic_execute_pyton(c codeToRun)

 

Where pr is an object with these properties: error, errorText, and result

The Python code can execute Print() statements and the output generated by these Print() statements is returned in the result property.

 

Example:

 

dim pythonCode as c

pythonCode = <<%str%

def my_function():
    print("value1")
    print("value2")
my_function()
%str%

dim pr as as p

pr = helper::python::execute(pythonCode)

if pr.error = .f. then

    showvar(pr.result)

end if

 

 

The showvar() window will show:

value1

value2

 

 

 

The Python code that you execute can use Python modules that you have installed.

Python - Installing Python Packages - PIP - You can use PIP to install Python modules into your Web Project. To open the PIP installer, click the More... button on the Web Projects Control Panel and select the Python, Install a Python Package (using PIP) command.

 

 

 

This will open a dialog showing the packages that are already installed and will allow you to install additional packages by clicking the Add Package... button.

 

 

 

Python packages are installed in the Python sub-directory in your Web Project folder.

 
 
Build 7791

ImageMagick - The version of ImageMagick that is included with Alpha Anywhere has been updated to version 7.1.0 which supports the .HEIC file format, allowing these files to be used with all the iIagemagick commands.

 

Example:


dim fileIn as c = "C:\data\img.heic"

dim fileOut as c = "C:\data\img_resize.jpg"

dim result as p

result = a5_runImageMagicCommand(fileIn, fileOut, "-resize 20%")

if (result.hasError) then

    ' an error occurred:
    showvar(result.errorText)

end if
 

 

Import JSON Into SQL Database - A new option allows you to import JSON data into a SQL table. You can either create a new table to match the structure of the JSON data, or you can import the JSON data into an existing table.

To select the import genie, select the Import JSON into SQL Table menu option from the Tools menu when the Web Control Panel has focus.

 

When you select this menu item, the following dialog will be shown:

 

 

 

curl_get() Function - Optional Headers - You can now optionally pass in headers to the curl_get() function.

 

Syntax

c result curl_get(c usl [,c headers])

 

Where

headers - A CRLF delimited list of headers where each item is of the form headername: value

 

 

Bugs

Reports - Exporting as Excel - Fixed an issue where the report filter was not being honored.

Desktop Applications - Import Excel - Skip Columns - Fixed a regression that occurred iff you defined an Import Operation to import an Excel file and you specified that certain columns in the Excel file should be skipped.

UX Component - Action Javascript - Grid - Add a new record to a Grid using a UX - Fixed a regression.

UX Component - List Control - SQL Data Source - Export - Fixed an issue with exporting records in a filtered List.

UX Component - Password Reset Feature - Language Tags - Fixed an issue where language tags were not being honored.

UX Component - Client-side Data Cache - Fixed an issue where an unnecessary ajax callback was being made when a cached item was being read.

UX Component - .saveListEdits() Method - Chunked - The {dialog.object}.saveListEdits() method was performing a chunked update regardless of the setting specified in the method options. Now, if you want to do a chunked submit you must explicitly turn on the option. For example:

 

 

var obj = {
    rows: 'allRows', //can be 'allRows' or 'current' (to synchronized just the current row in the List),
    chunked: { allow: true }, //can be true or false. if chunked is true the 'beforeCrudExecute' event can be used to display sync progress.
    ajax: {
        timeOut: 15000, failed.
        onAjaxFail: function() { } , //javascript to execute if Ajax callback fails
        onDeviceOffline: function() {alert('Device is offline'); }, //javascript to execute if there is no internet connection
        onServerNotAvailable: function() { alert('The server is not available') }, //javascript to exeucte if the server is not available.
        performspeedtest: false, //perform a speed test before synchronizing data. if speed test fails, list will not be synchronized
        amountofdatatosend: '.1MB', //amount of data to send for the speed test
        maxspeedtestduration: 200, //number of milliseconds within which speed test must complete.
        onPoorConnection: function() {

            alert('Internet connection too slow. Please try later'); }

        ,

        checkifserveravailable: true, //check to see if server is available before synchronizing data
        serveravailabletimeout: 500

    }
}
{dialog.object}.synchronizeLists(obj);