Skip to content

Release Notes

Superbase NG v2.10 — Release Notes

CONGRATULATIONS on acquiring the latest Superbase NG product (previously called SIMPOL Professional). This product is the result of years of design and development together with in-house testing and use. In spite of that, no product is perfect, so we look forward to hearing from our customers with suggestions for improvements, and should a bug crop up, about those too. There is a large amount of documentation and example code provided with the product. Please make sure to look through the projects provided, most are well commented and can demonstrate various approaches to using Superbase NG and the SIMPOL programming language. With the release of Superbase NG v2.0, we have archived the old release notes. If you wish to check anything that was previously in them, you will find them hereThere are six handbooks so to get started quickly, it may be useful to read the first chapter of the IDE Tutorial, Chapter 2 in the Programmer’s Guide, and Chapter 3 of the Quick Start Guide, preferably in that order. At that point, the text in Chapter 3 of the Quick Start Guide will suggest various ways forward.

IMPORTANT!

To get access to the updated releases you will need to register on-line at our web site and then register your copy of the product. We will then make the downloads available to you.

As a result of the changes to wxformgrid, the 2.10 release is not binary compatible to the old dataform1 series of types and therefore not compatible to any project that uses those types. It will be necessary to recompile any project with the updated libraries before attempting to run it.

Start Here

  1. Click on Windows Start / All Programs
  2. Find the folder marked: Superbase NG
  3. Click on this and the following will pop out:
    • Register Online on the Web
    • Release Notes (this document)
    • SIMPOL Language Reference
    • Superbase Classic Conversion Tools
    • Superbase NG IDE Quick Start Manual
    • Superbase NG IDE Tutorial (the guide to your first SIMPOL program)
    • Superbase NG IDE User’s Guide
    • Superbase NG IDE
    • Superbase NG Personal User’s Guide
    • Superbase NG Personal (the program for creating items interactively)
    • Superbase NG Programmer’s Guide
    • Superbase NG Quick Start Guide
    • Superbase NG Sample Projects
    • Superbase NG Utilities
    • Superbase NG Uninstall

Contents

V2.10 Release-Specific Notes
V2.06 Release-Specific Notes
V2.05 Release-Specific Notes
V2.02 Release-Specific Notes
V2.01 Release-Specific Notes
V2.0 Release-Specific Notes
Included Files
Superbase NG Documentation in HTML Help format
SIMPOL Language Execution and Components
SIMPOL wxWidgets Components
Superbase NG IDE Components
IDE Color-coding Support
IDE Help Assistant Files
Runtime Files for the Unicode Editor
Runtime Files for Linux
The Rest

Included Files

The distribution contains the following files:

releasenotes.html This file

Superbase NG Documentation in HTML Help format (docs\…)

tutorial.chm The IDE Tutorial Book
ideref.chm The IDE Reference
personal.chm The Superbase NG Personal User Guide
progbook.chm The SIMPOL Programmer’s Guide
langref.chm The SIMPOL Language Reference
quickstart.chm The SIMPOL Quick Start Guide

SIMPOL Language Execution and Components (bin\…)

ICONV.DLL The iconv library from the GNU project — used by the XML DOM Component.
LIBXML2.DLL The libxml2 library from the Apache project — used by the XML DOM Component.
LIBXSLT.DLL The libxslt library from the Apache project — used by the XML DOM Component.
ZLIB1.DLL The zlib1 library was written by Jean-loup Gailly (compression) and Mark Adler (decompression) — see
www.zlib.net for more information. This is used by the libxml2 library and is therefore included here. Used by the XML DOM Component.
FCGD1_32.EXE The debug Fast-CGI wrapper for use in web servers such as Apache, allowing SIMPOL programs to work as high-performance web applications (not for distribution, development use only).
serverclose.exe The program that is called to close the simpolserver.exe multi-user server program
simpolpersonal.exe The SIMPOL Personal program for creating and modifying databases, forms, printable forms, and reports
simpolserver.exe The SIMPOL database multi-user server program
simpolserverclient.exe The client program for controlling the SIMPOL database multi-user server program
SBSORT32.DLL The Win32 sort order support library (can be also used with the 32-bit ODBC driver).
SIMPOL.SMP The compiler (this is a compiled SIMPOL program — not for distribution).
SMCGI32.DLL The CGI support library used by SIMPOL when called from SMPCGI32.EXE.
SMPCGI32.EXE The CGI wrapper for use in web servers such as Apache, allowing SIMPOL programs to work as web applications.
SMDBG32.DLL The SIMPOL debug support library (not for distribution, development use only).
SMEXEC32.DLL This allows the calling of SIMPOL functions from compiled SIMPOL libraries as DLL calls for Win32.
SMFCGI32.EXE The Fast-CGI wrapper for use in web servers such as Apache, allowing SIMPOL programs to work as high-performance web applications.
SMGD1_32.EXE The CGI debug wrapper for use in web servers (not for distribution, development use only).
SMISAP32.DLL ISAPI support for Win32 (allows using SIMPOL programs with IIS as ISAPI web applications).
SMLXML32.DLL The SIMPOL LXML libxml2 Component used by the XML Document Object Model library.
SMODBC32.DLL The SIMPOL ODBC Client Component, which provides access to ODBC data sources for Win32.
SMPCGI32.EXE The CGI wrapper for use in Web servers (see below for details).
SMPD1_32.EXE The SIMPOL debug runtime loader (not for distribution, development use only).
SMPRUN32.EXE The SIMPOL runtime loader for command line programs.
SMPOL32.DLL The SIMPOL library for Win32 (core language).
SMPPCS32.DLL The SIMPOL PPCS support library for Win32 (multi-user database client).
SMPPSR32.DLL The SIMPOL PPSR support library for Win32 (multi-user database server).
SMSBME32.DLL The Superbase Micro Engine Database SBME component library for Win32.
SMSLIB32.DLL The SIMPOL Shared Library SLIB Component library for Win32 (allows SIMPOL language programs to call external DLL functions).
SMSOCK32.DLL The SIMPOL SOCK TCP/IP sockets component library for Win32, providing multi-threaded client and server functionality.
SMSYM32.DLL A SIMPOL debug support library (not for distribution, development use only).
SMUTOS32.DLL The SIMPOL UTOS Operating System Utilities component library for Win32 (provides file and directory support).
SMPW1_32.EXE The SIMPOL debug runtime loader for GUI programs.
SMPWIN32.EXE The SIMPOL runtime loader for GUI programs.
SMWXWN32.DLL The SIMPOL wxWidgets support library for Win32.
svcrunnr.exe The SIMPOL script service program for running the simpolserver.exe as a service

SIMPOL wxWidgets Components (bin\…)

wxbase28u_vc_simpol.dll This contains the base wxWidgets support and is required when using the WXWN component.
wxmsw28u_core_vc_simpol.dll This contains the core GUI components for wxWidgets and is required when using the WXWN component.
wxmsw28u_adv_vc_simpol.dll This is used by advanced GUI components, such as the wxGrid control. It is not currently required or used.

SIMPOL IDE Components (bin\…)

SBNGIDE.EXE The SIMPOL IDE for Win32 for Ansi
SBNGIDE.EXE The SIMPOL Unicode IDE for Win32 (will only install to Windows NT, 2000, XP, Vista, etc.). Only one editor installs, if the Unicode editor can be installed, then it will be selected over the Ansi editor.
SBNGIDEARA.DLL Arabic language support library for the IDE (not 100% translated yet).
SBNGIDECHS.DLL Chinese Simplified language support library for the IDE (not translated yet).
SBNGIDECHT.DLL Chinese Traditional language support library for the IDE (not translated yet).
SBNGIDEDEU.DLL German language support library for the IDE (not 100% translated yet).
SBNGIDEELL.DLL Greek language support library for the IDE (not 100% translated yet).
SBNGIDEENU.DLL English language support library for the IDE.
SBNGIDEESP.DLL Spanish language support library for the IDE (not 100% translated yet).
SBNGIDEFRA.DLL French language support library for the IDE (first French version released with 1.7!).
SBNGIDEITA.DLL Italian language support library for the IDE (not 100% translated yet).
SBNGIDEJPN.DLL Japanese language support library for the IDE (not translated yet).
SBNGIDENLG.DLL Dutch language support library for the IDE (not translated yet).
SBNGIDEPTG.DLL Portuguese language support library for the IDE (not translated yet).
SBNGIDERUS.DLL Russian language support library for the IDE (not translated yet).
SBNGIDESVE.DLL Swedish language support library for the IDE (not translated yet).
SBCODE32.DLL IDE support library.
SBNGIDECALLER.EXE Callback program for interactive web site debugging (NT, 2000, XP, Vista, etc. only).

If you know of a language that you think we should support (or are prepared
to help localize one of the above that is not yet done, then let us know!

IDE Color-coding Support (bin\…)

The following are the INI files that are used to color code the various
languages supported by the IDE.

C#.INI C#
DevStudio.INI C, C++
EditBinary.INI For the editing of binary files
HTML.INI HTML, SMZ (SIMPOL Server Pages)
IDL.INI IDL (Interface Description Language)
JScript.INI JavaScript
ReadBinary.INI For the viewing of binary files
SIMPOL.INI SIMPOL
Superbase.INI SBP programs, tokenized and ASCII
TEXT.INI Basic text files
VB.INI Visual Basic
VBSCRIPT.INI Visual Basic Script
XML.INI XML, XSL

IDE Help Assistant Files (bin\…)

simpol_odbc.api ODBC Component — ODBC Client Database Access
simpol_ppcs.api PPCS Component — PPCS-Based Database Client Access
simpol_ppsr.api PPSR Component — PPCS Type 1 Database Server for SBME
simpol_sbme.api SBME Component — Superbase Micro Engine (Single-user)
simpol_slib.api SLIB Component — Shared library access (DLLs)
simpol_sock.api SOCK Component —  TCP/IP Socket Client and Server support
simpol_utos.api UTOS Component — File System, Directories, Files
simpol_wxwn.api WXWN Component — wxWidgets-based Windows, Forms, Form Controls, Dialogs, …

Runtime Files for the ANSI Editor

OE70AS.DLL
VC6-RE200L.DLL
OT80AS.DLL
RWUXThemeS.dll
SF20AS.DLL
SYSTEM32\MSVCP60.DLL
SYSTEM32\MFC42.DLL
SYSTEM32\MFC42LOC.DLL
SYSTEM32\MSVCRT.DLL
SYSTEM32\MSFLXGRD.OCX

Runtime Files for the Unicode Editor

OE70ASU.DLL
VC6-RE200L.DLL
OT80ASU.DLL
RWUXThemeSU.dll
SF20ASU.DLL
SYSTEM32\MSVCP60.DLL
SYSTEM32\MFC42U.DLL
SYSTEM32\MFC42LOC.DLL
SYSTEM32\MSVCRT.DLL
SYSTEM32\MSFLXGRD.OCX

Runtime Files for Linux (linux\…)

libsbcode.so Utility library used by SIMPOL.
libsbsort01.so Sort library used by various SIMPOL database library components.
libsmdbg.so Debugging library used by the debug versions of the runtime programs.
libsmpol.so SIMPOL main language library.
libsmpolcgi.so SIMPOL CGI library used by the smpcgi program for running web applications.
libsmpollxml.so SIMPOL XML library used by the SIMPOL DOM support library.
libsmpolppcs.so SIMPOL PPCS library for client database access using PPCS type 1.
libsmpolsbme.so SIMPOL SBME database library for single user database access to the new database engine.
libsmpolsock.so SIMPOL SOCK library that provides TCP/IP client and server sockets support.
libsmpolutos.so SIMPOL UTOS file system utilities (directory and directoryentry objects).
libsmpolwxwn.so SIMPOL WXWN GUI components. Requires wxWidgets 2.8.x to be installed on the distribution.
smfcgi SIMPOL Fast-CGI program launcher.
smfd1_ SIMPOL Fast-CGI program launcher with debugging information for handling errors that cause a program to halt.
smprun SIMPOL program launcher.
smpd1_ SIMPOL program launcher with debugging information for handling errors that cause a program to halt.
smpcgi SIMPOL CGI program launcher.
smpd1_ SIMPOL CGI program launcher with debugging information for handling errors that cause a program to halt.

The Linux files will eventually be placed in a Linux installer but for now we haven’t done so. The lib files should all be placed somewhere like /usr/lib or /usr/local/lib. The program launchers: smprun, smpcgi, smpd1_, and smgd1_ should be placed in /usr/bin or /usr/local/bin. They also need to be marked as executable (chmod a+x).

The Rest

The remainder should be self-evident. We haven’t listed the include files, library files, samples, or projects, since this has gradually become so much that it would take far too much effort to maintain in multiple places. For details see the Superbase NG Quick Start Guide.

Superbase NG v2.10 Specific Notes

This release contains repairs for several code defects, a large number of updates to existent libraries, and an altogether new library for interacting with ODBC data sources using the quickreport1 and report1 types. It also contains a new system function !ostype() plus some updates to wxformgrid and a new form control: wxformgauge.

As a result of the changes to wxformgrid, this release is not binary compatible to the old dataform1 series of types and therefore not compatible to any project that uses those types. It will be necessary to recompile any project with the updated libraries before attempting to run it.

New in Superbase NG 2.10

As mentioned earlier, a new library has been added. It’s capabilities will be expanded upon over time.

  • smpol32.dll – A new system function, !ostype(), was added to ensure that the operating system and the operating system architecture can be properly assessed.
  • smwxwn32.dll – The wxformgrid was modified by removing the non-functional onmouse event and adding the following events: oncellleftclick, oncellleftdblclick, oncellrightclick, oncellrightdblclick, onlabelleftdblclick, onlabelrightclick, and onlabelrightdblclick. In addition to the changes to wxformgrid, the new form type: wxformgauge has been added. It has also been used to update the existing gaugelib.sml so that they now use the wxformgauge by default. This control provides the operating system default gauge control for use in your own projects.
  • odbcsql1.sml – This is a new library that is designed to provide a sqlq1 wrapper around an ODBC connection in order to use the SIMPOL report library and wrapper libraries to provide access to their functionality for ODBC data sources. Currently this support only covers report1 and quickreport1 types, and does not yet support the user interface for Quick Reports.

Changes to Libraries in Superbase NG 2.10

We did preparation work in some functions in formlib and graphicreportlib for an eventual change allowing a messages array to be passed around containing the correct (potentially translated) messages to be used in functions that display text to the user. This is a first step towards allowing the localization of Superbase NG libraries and programs such as Superbase NG Personal.

The necessary code, modified from code in Superbase NG Personal, was added to allow the dataform1, printform1, labeldef1, and graphicreport1 objects to resolve missing tables (moved or misspelt), supporting both sbme1 and ppcstype1, as well as missing field names. In the process, the MakeNotNull() function was moved from formlib.smato stringlib.sma and the sprintf() function was added to stringlib.sma, both of which are exported. This affected the binaries of most other projects. Changes were made as required to support the new features for opening forms, print forms, graphic reports, and label definitions.

  • appframework.sml – The gettableformatstrings() function was updated to use the newer getnewfieldinfoarray() instead of the old getfieldinfoarray() version. A correction was done to the duplicaterecord() function when in table view. The field selection code was modified to ensure that the Field Selection menu item is unchecked if there is any failure or user cancellation. The appwindow.openformdirect() function now accepts a new final parameter: type(db1record) r, which allows it to pre-select that record before showing the form to the user, thereby reducing the flicker associated with selecting a record afterwards. The selectrecord() function was updated to ensure that it uses objects that have been instantiated.
  • codepageslib.sml – We added the DOS code page 850 to the library.
  • commonreportgui.sml – The missing implementation of the TRIM functionality was created for calls from the GUI for report filters and calculations.
  • conflib.sml – We fixed a problem that would occur if the ini file were empty, which would result in the file contents eventually being set to .nul and nothing successfully being written back to the ini file.
  • databaseforms.sml
    • A problem was corrected where detail block entries were not being re-read when dataform1.setmasterrecord() was called.
    • Numerous changes were made to support not having a mastertable on a form. Previously the design enforced a mastertable, but there are situations where no mastertable would exist, such as a form used as a dialog, but which in design mode also has a data table as the source for a combo or list box. Another case would be a form with an unlinked detail block and no other bound controls outside the detail block on the form.
    • We added a missing statement that should have set the object to .nul in the case of an error in the .new() method for the dataform1datasource type.
    • The codepage property was added to the dataform1datasource type and everywhere in the functions where it was required for correctly supporting alternate code pages using PPCS.
    • We fixed a bug where under certain conditions, the code to redraw the scroll bar for a detail block region would try to dereference a null object.
    • A range check was added for the backgroundrgb value for dataform1page.new().
    • Code was added to renumber pages when a call to dataform1page.remove() occurs plus a technique for showing a valid page afterwards.
    • The code was modified to assign the new index to dataform1.mastertable.currindex if a call to dataform1.selectkey() passes in a new index.
    • We corrected a problem in dataform1.selectkey() and printform1.selectkey() where an index of type number was not accepting integer input as an alternative. Please note that indexes of type number are strongly discouraged and should be changed to either integer or string if at all possible.
    • We added support for the wxformgauge/dataform1gauge control and also the new events for the wxformgrid/dataform1grid/dataform1datagrid control. The parameter names for the printform1bitmap.setposition() method were corrected so that it also uses printleft, printtop, printwidth, printheight, instead of left, top, width, and height. This is consistent with the other functions.
    • A problem was corrected in the code that is called to save a form as source code. The expression required additional parentheses in order to be more precise and when they were not present that resulted in an error 21.
    • A change was made to printform1.new() to ensure that every printform1.name has a value assigned in the .new() method. This was necessary because recent code updates were dependent on the printform1.name value not being empty.
    • Significant changes and improvements were made to the detail block implementation. There were various issues when removing a detail block that prevented it from being truly removed (still existent references to the detail block that needed to be cleared).
  • db1util.sml
    • We fixed a problem that is caused by a conversion of a Superbase version 1.x file format into Superbase NG when the display format of a string contained an L as a prefix. It is highly recommended that all Superbase files be reorganized in at least a version 2.x Superbase program before they are imported into Superbase NG.
    • We added the functions FCASE() and TCASE() to db1util.sma and changed the string2val() function to use them instead of the fcase() and .tcase() functions. This was done to ensure that the behavior of the functions are consistent with Superbase Classic.
    • Modifications were done to getfieldinfoarray() and getnewfieldinfoarray() to deal with the boolean field type, which will contain a displayformat of 1 and sharetype of LOG (as a string). In these functions it will now return a valid boolean format string. Also fixed the getnewfieldinfoarray() function so that it returns an array that is both numerically indexed as well as indexed by field name. Previously the field name index was lacking.
    • The storerecord() function was added to provide a generic function for saving records that is aware of the differences between sbme1 and ppcstype1.
    • The function create_sbme1table_from_db1table() was improved so that it also produces the extended field information. This can be disabled by passing a new parameter to the function at the end.
      The db1fieldinfo.new() method was modified to ensure that each property has a valid value.
    • We added some code to Superbase NG Personal to try and prevent the pasting of one or more records when a blank or modified record is shown on the screen. It should now produce an error message that the record needs to be saved before pasting records.
  • dbconverter.sml – Support for the extended field attributes for sbm files was added to the appropriate converters, including calculation, validation, read-only, required, default, etc.
  • displayformats.sml – The "." display format was not being correctly handled.
  • drilldown.sml
    • We updated the drilldown() function with two new parameters: caseinsensitive and startvalue. The first is obvious, it forces a case-insensitive comparison, the second allows the passing in of a starting value and if one is passed in, then it will cause a search upon opening the dialog based on the content of the startvalue, as long as the starting value exceeds the value passed for minactivationchars.
    • The drilldown() and tablesearch() functions were modified to use the new left double-click event of the grid to allow the user to double-click on the target row to select and close the dialog.
    • In the drilldown() function a change was introduced that allows the user to show data output as soon as the dialog is displayed. To do this, the user must pass the empty string "", as the startvalue, and 0 as minactivationchars. Please note that because the empty string is passed, the data returned will not necessarily be in any specific order, since the where clause would contain “%” only, which matches all of the records, but the order is not guaranteed.
  • errormsgs_en.sml – We added the text message equivalents for all of the Superbase Classic-era error messages 1000001 through 1000511.
  • filesyslib.sml
    • We improved the filenameparse() and createpath() functions so that they correctly handle a UNC path name. Previously they would consider the server name to be a root file name and end up with just \\ resulting in no path name at all.
    • The iswindows_os() function was modified to use the new !osinfo() system function.
  • filtergui.sml – We modified the code so that the select clause it creates automatically wraps field names in double quotes and does not add fields more often than necessary to the output.
  • formlib.sml
    • An update was done in the opendataform1fromstring() and openprintform1fromstring() (clipboard paste) functions to ensure that the content is converted from UTF-8 to UCS2.
    • We added new functions to the formlib\controls.sma file to allow the correcting of an incorrectly spelled field name in a control source.
    • An incorrect property name was updated in the file formlib.sma in the function xmlsdf1link.getlink().
    • We added the codepage element to the DTDs and ensured it is now saved as part of a PPCS data source, when saving the form. It is also checked for when opening a form and used as part of the code for opening tables on a PPCS host.
    • Changes were made to the functions that merge forms together to ensure that the target form has a master table if it did not have one before. This is primarily used when pasting controls from the clipboard, which are bound to a data source, into the Form Designer.
    • The getnumericvalue() function was moved from formlib.sma into stringlib.sma.
    • Support for the onmouse event was removed from dataform1grid and dataform1datagrid types and added the new events that are supported: oncellleftclick, oncellleftdoubleclick, oncellrightclick, oncellrightdoubleclick, onlabelleftdoubleclick, onlabelrightcick, onlabelrightdoubleclick.
    • Various changes were also made to the code that saves a detail block. Previously, independent of what the original tab order might have been, detail blocks were always output at the start of the page’s controls section. This is no longer the case. The entire code section for the saving of detail blocks has been rewritten.
  • gaugelib.sml – We added support for the new wxformgauge component in the gauge dialogs. A new parameter in the .new() method of the gaugedialog and multigaugedialog types, called usenativegauge, defaults to .true resulting in the operating system native gauge to be used, but passing in .false will revert to the previous behavior.
  • graphicreportlib.sml
    • An update was done in the opengraphicreport1fromstring() (clipboard paste) function to ensure that the content is converted from UTF-8 to UCS2.
    • We added the codepage element to the DTD and ensured it is now saved as part of a PPCS data source, when saving the report. It is also checked for when opening a report and used as part of the code for opening tables on a PPCS host.
    • Alterations were done to the function that merges graphic report forms together to ensure that the target form has a master table if it did not have one before. This is primarily used when pasting controls from the clipboard, which are bound to a data source, into the Graphic Report Designer.
    • Problems that occurred when adding a bitmap that is bound to a field in a table to the body of a report were corrected.
    • Support was added for the VARIANCE aggregate. To get the Standard Deviation (SD) just take the sqrt() of the variance.
  • httpclientlib.sml – We added support for the HEAD, PUT and DELETE methods and also implemented the chunked transfer mechanism for HTTP 1.1 clients.
  • json.sml – Some minor but necessary improvements were done.
  • labelslib.sml
    • Improvements to the line-closing algorithm were done to consider as movable anything that is located at half the height of the control or lower (previously it had to be below), to allow for scenarios where controls overlap slightly. Special handling was added to ensure that the file name of a labeldef is set correctly.
    • We added the codepage element to the DTD and ensured it is now saved as part of a PPCS data source, when saving the label definition. It is also checked for when opening a label definition and used as part of the code for opening tables on a PPCS host.
  • mathlib.sml – There were some odd problems with the round() function, which have since been rectified. We also replaced the sqrt() function implementation with a newer version after reports that sometimes internal untrappable errors were occurring.
  • propertybrowser.sml – We added support for the new oncellleftdoubleclick event of the grid control to allow that to select and view the double-clicked cell value and also fixed a syntax error in the property browser.
  • q1.sml – We modified two functions in the query optimizer (q1) to do case-insensitive comparisons for string data, since string indexes are stored case-insensitively.
  • quickreportlib.sml
    • Added code page support to the quick report storage and loading.
    • The quickreport save file format was bumped to 0.4 and now supports the summarize and distinct options. The getnumericvalue() function was removed as it is now part of a lower level library (stringlib.sml).
    • The quickreport1.new() method was updated to accept a type(sqlq1) query parameter, which is provided to allow the use of the new odbcsql1 wrapper for ODBC-based queries.
    • A new aggregate value was added: the VARIANCE aggregate. To get the standard deviation (SD), take the square root of the variance.
    • Additional sanity checks were made to ensure that every column in the select statement has a matching columninfo entry. This check is done when the run() method is called.
  • recordview.sml
    • A modification to trecordview.setfilter() and trecordview.setinitialrecord() was carried out to prevent the re-selection of the record if it is not yet stored.
    • Code was added to trecordview to allow it to be set to read only.
    • The code for trecordview.getcolinfo() was updated to use the newer getnewfieldinfoarray() instead of the older getfieldinfoarray().
  • repguilib.sml
    • We added GUI support for the concatenate operator “||” and the Summarize functionality.
    • Various fixes were done to the Quick Report GUI including updating the display string when the currently selected column has its heading changed and setting a default string format of "20" instead of "".
    • Code to limit the output types to window and printer was added to the GUI if the Summarize option has been selected (which results in the suppression of row output). Code to initialize the Summarize and Distinct options on the form when opening a quick report has been added.
    • General improvements were done when adding or deleting a column in a quick report.
  • reportlib.sml – An essential fix was done to the report1group.findaggregate() function (never-ending loop) and in the report1 type definition the query property was changed from sqlq1 into a type(sqlq1) declaration to accommodate the support for odbcsql1. Also the report1.new() now takes a type(sqlq1) query parameter to allow an odbcsql1 object to be passed in and the report1.setorderclause() function sends the orderclause through to the odbcsql1 object if there is one. To accommodate the change that sql1 properties are now read only, the report1.run() function now calls the new sqlq1.clearsettings() function. Sorting is not done on the output from the ODBC layer, since the sorting is being passed through to the engine. Support for the VARIANCE aggregate was added. Various improvements were done to the update.sma functionality.
  • SBLDateLib.sml – Changes were made to the DATESTR() function in SBLDateLib.sma to try and cope with invalid date format strings being supplied, such as "M/d/yyyy".
  • sql1.sml – We added a (sqlq1) type tag to the sqlq1 type definition, allowing other code to declare things to be of type(sqlq1), making it possible to be compatible with the new odbcsql1 type, which also has the same type tag. Also many of the properties of the sqlq1 type were changed to be read only since they all had set methods to change them. We added a clearsettings() method that takes 3 parameters, one for each of gotrow, gotallrows, and prepared. The property nulliszero and associated method setnulliszero() were added to the sqlq1 type as well. The default is .false, but setting it to .true will allow numeric fields that have never held data to be treated as containing 0 rather than .nul, which may affect calculations that otherwise would output a value.
  • STR.sml – We optimized the code that handles characters following the decimal point.
  • stringlib.sml – The getnumericvalue() function was moved from formlib.sma into stringlib.sma. A new parameter was added to the formatlinebreaks() function: boolean skipindentonfirstline=.false. This change allows the indent to be skipped on the first line, which allows for the formatting of hanging indents.
  • tableview.sml
    • A modification to ttableview.setfilter() and ttableview.setinitialrecord() was carried out to prevent re-selection of the record if it is not yet stored.
    • Code was added to ttableview to allow it to be set to read only.
  • uisyshelp.sml
    • In the localeinfo.sma the localelanguage type is now included in the localeinfo type, but only includes the languagenameabbrev property. This works in both Windows and Linux. localecalendar.getdayabbrev() and getmonthabbrev() have reverted to their previous style. localeinfo now has a getSBLmonthabbrev() method that returns a string of 3 character month names that are hard-coded and it selects them using the language abbreviation. If it does not find a match, it returns the English ones.
    • The maxlength parameter for the getuserinput() function was not implemented. The necessary implementation was added for that parameter.

Changes to Programs in Superbase NG 2.10

  • addressbook.smp – The Linux version of the address book form was updated to the newer storage format.
  • datelibtest.smp – A new test was added to this program to test the code that was added to the DATESTR() function in SBLDateLib.sml.
  • simpolbusiness.smp
    • A labels sample was added to the SIMPOL Business tutorial project.
    • We added the Quick Report front end, record view and table view to the project.
    • The sbapplication type was updated with the dialogdata property for passing around to various parts.
    • The onnewrecord event handlers for record and table view for the various tables were added.
    • The onsave code was modified so that it has a common function called in form, record, and table view.
    • The View menu was added and also code to correctly manage it. The View menu is disabled if the ORDERMST table is the master table.
    • Some hard-coded paths in the customerlabels.sxl and customerlabels_us.sxl files were changed.

Changes to Utilities in Superbase NG 2.10

  • reorganize.smp – This program was modified to no longer call the code to add in the extended field attributes, since the lower level function create_sbme1table_from_db1table() is already doing that earlier in the process.
  • sbf2sbm.smp (Converter for Superbase Classic database files) – Code was added to remove any prefixed “L” character from the display format for a text field. We added code that reports bad structure in the SBF file as an error.
  • sbv2sxf.smp (Converter for SBV forms into Superbase NG forms) – We added support for DOS code page 850 which is used when converting label and text elements in the form, so that extended ASCII characters do not get lost.

Changes to Superbase NG Personal 2.10

Main Program

Changes were made to accommodate forms not having a mastertable, and dealing with the switch to record and/or table view and back again. The export functionality now uses the correct path name and target when outputting the results. Import of a new CSV file correctly suggests the input file name and path with a .sbm extension for the new file, and suggests the name converted to uppercase for the table name. Adjustments were made in SBNG Personal to ensure that the record selection tool bar icons are optimized and only used if there are records available. The use of reccount() has been removed from the selection code since it would be slow in large tables. Some prep work was done for eventually using the appframework in SBNG Personal.

We added some code to Superbase NG Personal to try and prevent the pasting of one or more records when a blank or modified record is shown on the screen. It should now produce an error message that the record needs to be saved before pasting records.

A change was also made to the code that calls the labels system to ensure that the screen is refreshed when the Label Designer is closed. The reorg table code was modified to take into account that the lower level function create_sbme1table_from_db1table() now transfers all of the system tables automatically, so this no longer needs to be done in addition by this code. Various corrections were made to ensure consistency in the title bar caption depending on which view is currently open.

Additional code was added to uncheck the Field List menu item if the operation fails or is cancelled.

The duplicaterecord() function was modified so that rather than micro-managing the duplication, it now calls the duplicaterecord() method of the dataform1, printform1, trecordview, or ttableview object.

New Status Reports

In addition to the existing table status and system status reports, there are now status reports for: graphic reports, display forms, and print forms. These can be called from the Utility menu or via the Print menu item and selected from the list to be sent to a print preview window.

Table Designer

The createtable() function in the table design area was modified such that the correct current directory is assigned. There was also a change to the OK button code so that it ensures that the window is closed once the work is done. A major change is the ability to create a new table from a template. Existing tables can be saved as templates from the Utilities menu.

Form / Print Form / Graphic Report / Label Designers

Improvements were made to the fdnewform() function to better work with the Graphic Report Designer component. Various code changes were made to improve the handling of labels in the Labels Designer component of the Form Designer. There were additional improvements in the Undo functionality for the Label Designer. We also fixed a number of issues related to designing and saving label definitions. Some additional fixes were done to the code that handles creating a new label definition, including ensuring that the dirty flag is reset, the undo manager is cleared of all entries and the window caption for the Label Designer is updated with the appropriate file name. An important fix was done in the label layout design code that would previously result in an endless two-function mutual recursion if the value in the rows or columns was changed.

Work was done to enable tables to link to other tables properly, both in the libraries and in the UI. This means that a link from a table to another table to yet another table will result in all of the necessary record look ups taking place.

We updated the clearformprep() function in formdesigner.sma and clearprintformprep() function in printformfuncs.sma so that controls that are bound are cleared of their content.

In all of the various designers we added support for the codepage element of a PPCS data source.

We fixed a problem in the Form/Graphic Report Designer where in the case where controls are being pasted onto a form or report that had no controls or data sources, that the data sources that had been passed to the Form/Graphic Report Designer would not be considered during the process. This resulted in the form or report attempting to open data sources again and in the case of sbme1 data sources, this would fail. Code was also added to ensure that tables are only added to the form or report once, by checking for their presence in the code that transfers data sources that is called during paste operations.

We coded in support for undo functionality to detail block creation in the Form Designer.

Code was added to ask the user if they wish to delete the page in the Form Designer or Print Form Designer if they delete the last control on it.

The wxformgauge was added as a control to the control ribbon and the Draw menu plus the new events for the grid controls were added to the relative dialogs for the Form Designer.

We improved the support for adding bound bitmaps to the Graphic Report Designer.

Superbase NG v2.06 Specific Notes

This release contains repairs for several code defects and we also added code page support for various storage formats: form, print form, graphic report, quick report, label definition, and update.

Changes to Superbase NG 2.06

  • We fixed a problem with the setname() function for printform1text and printform1bitmap controls that did not maintain the controls array in the printform1 object to remove the old name and add the new one. This affected primarily the use of the Form Designer when copying and pasting controls on print forms after changing the name of the control that was being copied (label definitions, graphic reports and print forms).
  • In the warning message shown if a label definition had been changed and not saved when exiting Superbase NG Personal, selecting Cancel would not be respected.
  • Code page support was added to forms, print forms, graphic reports, quick reports, updates, and labels, as well as some bug fixes for labels, including a UTF-8 problem in the embedded print form. In the label layout designer a non-terminated two-function recursion was causing a program hang.
  • Modifications were made to the formlib.sml and graphicreport.sml functions that merge forms together to ensure that the target form has a master table if it did not have one before. This is primarily used when pasting controls from the clipboard in the Form/Report/Label Designer.
  • We fixed a problem in the Form/Report/Label Designer where in the case where controls are being pasted onto a form or report that had no controls or data sources, that the data sources that had been passed to the Designer from Superbase NG Personal would not be considered during the process. This resulted in the form or report attempting to open data sources again and in the case of sbme1 data sources, this would fail. Code was also added to ensure that tables are only added to the form or report once, by checking for their presence in the code that transfers data sources that is called during paste operations.
  • Some additional fixes were done to the code that handles creating a new label definition, including ensuring that the dirty flag is reset, the Undo Manager is cleared of all entries and the window caption for the Label Designer is updated with the appropriate file name. An important fix was done in the label layout design code that would previously result in an endless two-function mutual recursion if the value in the rows or columns was changed.
  • We added some code to Superbase NG Personal to try and prevent the pasting of one or more records when a blank or modified record is shown on the screen. It should now produce an error message that the record needs to be saved before pasting records.
  • A change was also made to the code in Superbase NG Personal that calls the labels system to ensure that the screen is refreshed when the Label Designer is closed.

Superbase NG v2.05 Specific Notes

This release contains numerous improvements and a few minor bug fixes.

Changes to Superbase NG 2.05

Documentation Changes

In our tool chain we have a number of programs that help us assemble the Language Reference Manual. We made a change to one of those programs that retrieves the information from the libraries so that it now also retrieves the type tag information for types, so these should start appearing in the reference manual.

Program Changes

  • sbf2sbm.smp – We added code to remove any prefixed “L” character from the display format string for a text field.
  • sbv2sxf.smp – We added support for code page 850 (via the changes to the codepageslib.sml) when processing label and text elements from the form to ensure that extended ASCII characters are correctly converted.

Library Changes

  • codepageslib.sml – Support for DOS code page 850 was added to the library.
  • commonreportgui.sml – Added the missing implementation of the TRIM functionality from the GUI for report filters and calculations. Also provided support for the concatenate operator ||.
  • databaseforms.sml – The dataform1.setmasterrecord() method was not rereading the detail block entries after being called. Also numerous changes were made to this and supporting libraries downstream to allow for a form not having a master table. Prior to this, a form that had no master table, but which had a data source as say the source for a data list in a list or combo box, would set that table as the master table, even though it shouldn’t have been. This change will allow better support in future for unlinked detail blocks. Work was also done to enable tables to link to other tables properly, both in the libraries and in the UI. This means that a link from a table to another table to yet another table will result in all of the necessary record lookups taking place.
  • db1util.sml – Fixed a problem that turned up when converting older Superbase files that had not been reorganized in Superbase 95 or later. The SBD could contain a format that began with the letter “L”, but which was no longer supported in later versions of the file format and would have been removed. We also discovered that there is a discrepancy between the way the Superbase field formats for text, C (capitalize field) and W (capitalize each word), are handled compared with the way it is done in SIMPOL. In Superbase the value appears to be converted to lower case before having the function applied, but not in the SIMPOL versions. This has been resolved by creating two new functions: TCASE() and FCASE() in db1util.sml. Unlike the .tcase() intrinsic function and the fcase() function, the upper case versions first convert the value to lower case and then apply the .tcase()/fcase() functions to the result. These two functions are now used for assigning values to fields where appropriate.
  • displayformats.sml – We fixed a problem where the display format “.” was not being correctly handled by the user-interface.
  • errormsgs_en.sml – The string equivalents for all of the Superbase-era error codes 1000001 through 1000511 were added.
  • filesyslib.sml – We fixed the filenameparse() and createpath() functions to correctly handle UNC path names (the initial part of a UNC path name like \\servername\dir\myfile.txt is \\servername, not \ or "").
  • formlib.sml – A modification was made to the functions opendataform1fromstring() and openprintform1fromstring() to ensure that the content is converted from UTF8 to UCS2 (these functions handle pasting controls from the clipboard in the Form Designer). We also added support for asking the user to replace the data source if it cannot be found when opening a form or print form as well as added the code to ask the user to select a replacement field if, during the opening of the form and trying to resolve the data source for bound controls, the field cannot be found.
  • graphicreportlib.sml – We updated the function opengraphicreport1fromstring() to ensure that the content is converted from UTF8 to UCS2 (this function handles pasting controls from the clipboard in the Graphic Report Designer). We also added support for asking the user to replace the data source if it cannot be found when opening a graphic report. To this we added the code to ask the user to select a replacement field if, during the opening of the report and trying to resolve the data sources for bound controls, the field cannot be found.
  • labelslib.sml – Improved the gap-closing algorithm to consider anything that is located at half the height of the control or lower (previously they had to be below), to allow for scenarios where the controls overlap slightly (in order to size them large enough to show in all resolutions, text controls often need to be sized larger, but they can then be overlapped to allow for a smaller overall line height). Special handling was inserted to ensure that the file name of a label definition is set correctly. We also added support for asking the user to replace the data source if it cannot be found when opening a label definition. To this we added the code to ask the user to select a replacement field if, during the opening of the label definition and trying to resolve the data sources for bound controls, the field cannot be found.
  • q1.sml – This was modified to ensure that in specific circumstances, case-insensitive comparisons are done for string data, since string indexes are stored in a case-insensitive way. Previously, under certain circumstance, not all records might have been retrieved when using a filter condition (WHERE clause) that used an index field with various fields with the same index value but which were not identical (varying in case).
  • recordview.sml – The setfilter() functionality was modified so that it will not re-select the record if the record has not yet been stored.
  • repguilib.sml – Support for the Summarize functionality in a Quick Report was added to the user interface. Also we made various updates to the Quick Report GUI including updating the display string when the currently selected column has its heading changed and setting a default string format of “20” instead of “”.
  • sbldatelib.sml – We made changes to the DATESTR() function to try and cope with invalid date formats that can be supplied by the operating system, such as “M/d/yyyy”. This has resulted in a new test case being added to datelibtest.smp.
  • tableview.sml – The setfilter() functionality was modified so that it will not re-select the record if the record has not yet been stored.
  • uisyshelp.sml – We discovered that the operating system in certain locales was returning a string with more than 3 characters for month and potentially day name abbreviations. That was causing problem with the parsing of those values when converting them from a string back to a date. We initially thought to add code to truncate these strings to 3 characters in length in the functions: localecalendar.getdayabbrev() and getmonthabbrev(), but that resulted in the same three letter being used for more than one month in some cases. Eventually we decided to hardcode the month name abbreviations and select them based on the current language retrieved from the operating system. If we don’t support a specific language, it reverts to English.

Changes in Superbase NG Personal

Many of the changes to the various libraries above have also found their way into Superbase NG Personal, since it is built on top of those libraries. In addition, some specific work in the Superbase NG Personal code was required to cope with those changes.

  • Modifications were done to accommodate forms having no master table and then switching to table or record view and back again.
  • Table Designer – The wrong current directory was being assigned when a table was created.
  • Form Designer – Various adjustments to the code were done to better handle the Graphic Report Designer when creating a new form or report. Similar modifications were undertaken to improve the overall handling of labels in the Label Designer portion as well as fixing some defects in the Undo functionality for labels.

Superbase NG v2.02 Specific Notes

This release contains a very important bug fix. It was sufficiently important that we rushed it out with a new revision number. Thank you to the customer who led us in the direction of this bug.

Changes to Superbase NG 2.02

Program Changes

There are numerous changes to programs throughout the package, as a result of a change to the STR.sml library, which is included almost everywhere, either directly or indirectly.

Library Changes

  • str.sml – The STR() function was using an unoptimised algorithm when assigning a value to a string. The result was that in some cases, decimal values as a result of division could have more than 700,000 significant digits and were causing the conversion to a 2-decimal value to take over a minute. A new, optimised approach to handling these extreme cases was established and implemented.

Superbase NG v2.01 Specific Notes

This release contains some very important bug fixes and a few enhancements. As with any product with a large number of new features and changes to existing ones, a few things can get missed. We would like to thank every one of our customers who contacted us and provided us with bug reports and reproducible examples so that we could find and fix the bugs.

Changes to Superbase NG 2.01

Program Changes

  • simpolbusiness.smp – We replaced the older invoice.sxr with a newer version that works without any additional code. The source code of the example has been modified to reflect the changes. We also added a labels example to SIMPOL Business to show how to integrate a Superbase NG labels definition file (*.sxl) into a program. We also commented out the “Test Function” entry in the Reports menu.
  • sbf2sbm.smp – Import from an SBF file was not removing the leading L character from display formats for TXT fields (these are not supported in v3 Superbase releases). This caused them to be interpreted as L for lowercase (which is meant to be a suffix, not a prefix to the display format). This can happen if the tables have not been reorganized in Superbase version 3.x or later before they are imported. Adjustment was made to the core code that handles the interpretation of the display format and also in the import tool. It is important to remember that the SBF converter expects the database file to have been reorganized before conversion.

Library Changes

  • databaseforms.smldataform1 was being marked as dirty when it created a new blank record.
  • displayformat.sml – The validatedisplayformat() function was not correctly handling the “.” display format for numbers and was changing it to “”.
  • labelslib.sml – Loading a labels file did not take into account the system locale for paper size. The way labels closed up controls wasn’t working if the controls overlapped, which is common to allow the fonts to be fully shown in print preview. Now they allow controls that are located up until half the height from the top of the reference control.
  • q1.sml – We fixed a bug in the query optimizer, which affects all of the reporting engines. Superbase NG table indexes are case-insensitive and range calculations were working as case-sensitive. That resulted in queries not finding all values in an index range if the same value was present in various forms (such as Miller and MILLER) because the range system would exit if the value in the indexed field of the record being tested was not equal using a case-sensitive comparison.

Changes in Superbase NG Personal

  • Copying Form Designer content to clipboard and pasting it caused the UTF-8 to not be properly converted back to UTF-16.
  • In an import, selecting a CSV file that was already open (say in Excel), would cause the program to crash. Now it reports the error that the file is unavailable.
  • Creating a new table didn’t add it to the most-recently-used (MRU) list.
  • File extension checking on arguments passed on the command line to Superbase NG Personal was case-sensitive. It now checks the operating system and on Windows is not case-sensitive.
  • Creating a new table when previously in table view switched to record view, now it stays on table view.
  • There were problems with the Label Designer and undo, saving, and then updating the original form.  We also added code to prevent the saving of a label definition with a page size that does not match the print form page size.
  • Added support so that labels files could be double-clicked and opened, as well as making sure that the undo files are correct and supported for the Labels Designer.
  • Removing a table didn’t remove it from the MRU list.
  • Form view in Superbase NG Personal did not show the Save menu item when the table was empty, even after a new unstored record was created.

IDE Update

IDE languages were not getting copied from HKLM to HKCU on a new installation. This has been fixed, but if you have the problem, you need to close all copies of the IDE and remove the HKEY_CURRENT_USER\Software\SIMPOL key using regedit.exe. The next time you start the IDE, it will recreate the key and its entire tree.

Important Note

Locking a record while working with PPCS and then while it is locked doing record selects, even with a different table object, causes the server to unlock the record, but it believes it is still locked in the program (client-side). Attempting to save results in the error code 1000177 (record is not locked). Currently the only workaround for this is to use a second ppcstype1 object to select the records. We are researching this currently.

Superbase NG v2.0 Specific Notes

In this major release of Superbase NG there are a number of new features, changes, and bug fixes that have occurred since the previous 1.83 release of SIMPOL Professional. The first obvious change is the renaming of the product back to Superbase. Superbase Software Limited owns the intellectual property of both Superbase and SIMPOL, and has chosen to rename the SIMPOL Professional product back to its originally intended name of Superbase NG. With this major release, there are a number of new features as well as numerous changes to the existing feature set.

New Features in Superbase NG 2.0

With this release we have added some exciting new features to the product. This is the first release of the NG line where we have had a Graphic Report Designer which is now part of the Superbase NG Personal program. With that addition we feel we have finally turned a corner with the product and it now has the majority of features that were core parts of the old Superbase line. Some parts have been allowed to drop as not being required, such as native dBase support. Some features that are standard in Superbase NG were never part of the old Superbase, such as direct support for TCP/IP sockets. Here are the lists of the new items.

New Programs

  • calcevaltest.smp – This is a test suite using the unittest.sml library for the calceval() function in the calceval.sml.
  • consoletest.smp – This is a test program for the new consolelib.sml that provides an interactive console environment for console-style programs.
  • fcasetest.smp – This provides a test program for the fcase() function using unittest.sml.
  • filetypetest.smp – Here is a regression test program for the new findfileencoding() function in stringlib.sml.
  • fixtest.smp – This is a regression test for the .fix() function.
  • saveimagetoblobgui.smp – This is a dialog based version of the saveimagetoblob program, which can do multiple images in one pass and save all image source code output into one file.
  • sbm2smagui.smp – This is a dialog based version of the sbm2sma program that converts Superbase Micro Engine database tables to source code.
  • sbv2sxf.smp – Using a similar user interface to the Superbase data file conversion program, this is a SIMPOL language-based Superbase form converter. It converts files in SBV format directly to SIMPOL sxf format. It does not yet handle reports. One big advantage is that this program can extract embedded images and save them off as image files.

New Libraries and New Functionality in Existing Libraries

  • conflib.sml – This library has a new function called getallprofilestrings() that can retrieve all of the entries in a section of an INI file.
  • consolelib.sml – This new library provides a console environment for creating interactive console-style programs that can read from and write to the console. This makes it easier to create quick programs for learning the language without requiring all the complexity of working with graphical user interface elements.
  • filtergui.sml – This library provides a selection list tool in the form of a non-modal dialog with a grid and callbacks to a user-provided function to act on changes to the row selected in the grid. The tool carries out a query based on a filter passed to it. The query is run in a separate process and can be interrupted by closing the dialog. This can be seen in action in Superbase NG Personal and has also been added to the SIMPOL Business tutorial example.
  • logmanager.sml – The log manager project was created to allow multiple threads to write to a file-based log without losing any entries or having collisions during file access. This is done by providing a queue that can be added to and a dedicated process that writes to the log file from the queue. (This libarary has since been upgraded to the
  • filesyslib.sml – The copyfile() function, which does what the name suggests, was added. We implemented the setcurrentdirectory() function, working on both Windows and Linux, to allow the program to change its current working directory. Another new function, createpath() was added which recursively creates every element of the path passed. The getdefaultnewline() function was added to return the appropriate newline character for the current OS.
  • sbnglib.sml – Added the fletcher16() and fletcher32() checksum generation functions.
  • sortlib.sml – The objinsertionsort() function was added for sorting objects using a callback function for comparison. A set of very powerful automatically sorted search trees were added. The implementation resulted in the following new types: TreeNode, BinarySearchTree, and AVLTree types. A dependency on the lists.sml was added because the list type is part of the BinarySearchTree and AVLTree types in order to support duplicates at a specific tree node as part of the BinarySearchTree implementation. The AVLTree is a special version of the BinarySearchTree type that ensures the trees are as balanced as possible, which can significantly improve performance with large trees.

Changes to Superbase NG 2.0

Program Changes

  • addressbook.smp – The toolbarcomboevents() function was modified to use the new appwindow.setcurrentindex() method.
  • convert.smp – This program was updated to be in line with the current state of the Mac OS-X operating system. It was also updated to use current SIMPOL
    programming conventions.
  • demo.smp – Fixed a problem in the code. Also removed the now unnecessary code for wxformoptiongroup and wxformoptiongroupmember types since they are part
    of uisyshelp.sml.
  • importppcs2sbme.smp – This was one of the oldest examples, so we did a complete rework of the code to modern standards.
  • jdktutorial.smp – We updated the code that handles fields so that it uses the member operator (!) instead of field reference variables.
  • ole2excel.smp – The program was updated and tested against Office 2010. It now creates a chart, copies the chart to the clipboard and pastes it into the form in the Superbase NG program. It can also print the results in landscape mode.
  • sbair.smp – The toolbarcomboevents() function was modified to use the appwindow.setcurrentindex() method.
  • sbf2sbm.smp – We removed the command line tool sbd_formula_reader.smp and added its code that converts SBD formulas to SIMPOL source to this graphical front-end that converts the databases. This feature can now be used while converting the data, a more natural location for it.
  • simpolbusiness.smp – To this project we added support for the new filtergui.sml library to demonstrate the creation of selection lists.
  • worm.smp – This program now has a dependency on uisyshelp.sml. We added the ability to switch between various game board sizes, all based on the size of the screen. We set the starting size to be the third of four board sizes, starting with full screen and reducing to 3/4, 1/2, and 1/3 of the available screen size.
  • We modified the guisimpolserver.exe, simpolserver.exe, and simpolserverclient.exe programs to test for multiple data file paths. If they are found, a message is issued in the GUI and written to the log that multiple data paths were found and the reorganize, backup, and restore functions have therefore been disabled. This is necessary because the current backup code assumes that all the database files are in the same directory.

Library Changes

  • appframework.sml – The appwindow type has a new method: setcurrentindex(), which can automatically ensure that the index combo is correctly updated. It also reselects the current record in the current view mode so that it is on the new index and sets the appwindow.lastselkeyvalue to .nul. The framework can now automatically show scrollbars if required when the window is resized if the form too large. We ensured that in appwindow.openformdirect() a specific call to dataform1.selectfirst() is made. We also modified appwindow.createformdirect() to use the newer parameter list for the call using the createformfunc parameter and also expressly set appwindow.viewmode to sFORMVIEW in the same function. A discovery we made resulted in necessary changes to the deferprocessing() function. Apparently the default values are not assigned when a function is called using !beginthread(). We also added field selection list (dataview) support to the showtableview() and showrecordview() functions and as required to various other components.MAJOR CHANGE: We added the selrec() etc. functions that were originally in the tutorial applications to the appframework.sml. In the process changes were made to ensure that if a record is saved in any view mode, and there are already existing view modes opened, but not currently shown, that the changed record is updated in the other view modes.We added the windowlist property to the appwindow type. This was part of adding support for using the new filtergui, though that library has not been added to this one. This also included a tdataview filterview property for appwindow. We created the function removedialogfromlist() for assignment to the onvisibilitychange event of the dialog. That way if the user closes the dialog, this code will remove the element from the windowlist array. Though it works as intended, this area is still a work-in-progress.
  • calceval.sml – We removed an unnecessary parameter from the calceval() function and improved the __lex() function so that it correctly handles identifiers that are wrapped in double quotes. We also added support for the SQL 92 CAST function as well as the AS key word to the calceval() function.
  • commonreportgui.sml– In order to facilitate re-use of certain interface components we extracted functionality from the repguilib.sml library and created the new commonreportgui.sml library to hold that functionality at a point where it can be included earlier in the library structure. This required various modifications and the addition of some callback functionality. As part of that, we added the commonfilterinfo and commonorderinfo types.One common request, was that it should be possible to edit the filter directly. To make this possible, we added the Edit Mode checkbox to the filter dialog as well as adding the necessary support so that it can be used correctly. It is not permitted to edit the filter while in the middle of using one of the more complicated button commands, that hae multiple stages and those buttons are disabled while in Edit Mode.We changed the position of some controls and added the NOT and the CAST buttons to the filter dialog and removed the NOT LIKE button. The doorder() function was changed to doreportorder(). We also exported the functions: __rep_movetop(), __rep_moveup(), __rep_movedown(), and __rep_movelast(). The function uparrowoutputrow() used for reporting errors from the sqlq1 methods was added as an exported function. The dofilter() function was modified so that it takes a “type(dataform1) form” parameter, which is now passed to commonfilterinfo.new() in dofilter(). In the function: __rep_flt_columns_osc() we switched from using the getcolumndatatype() method to the findcolumndatatype() method, since the latter works even if the prepare() method of the sql1 object has not yet been called. Support was added for handling cancellation of certain items like the date and time dialogs when used in the middle of another mode such as EXTRACT. Cancelling previously resulted in an unhandled program error. As part of this bug fix we added support to various of these functions so that the cancellation can be passed back to the calling function. Support for the NOT operator was added throughout. In the __rep_flt_join() function the parameter “dataform1 f” was changed to a “type(dataform1) f” declaration.
  • conflib.sml – This project now requires the utf8lib.sml library. We added support for detecting and correctly handling configuration files that have been stored in UTF-8 format if they are marked with a byte order mark.
  • databaseforms.sml – The dataform1record type’s isdirty property is now not being set so aggressively. The dataform1record type’s type(db1record) record property is now read only, and a setrecord() method was added. The dataform1.addcontrol() method has a new parameter, suppressfill, to prevent the filling of the list or combo control on create. The dataform1 type’s masterrecord and lastusedrecord properties were made read only. We added the setmasterrecord() method so that the record passed can be properly assessed. We also added the getlinkedrecord() method to retrieve a record that is linked to the master record, by passing the tablename. Adding a data source no longer marks the form as dirty. In the dataform1detailblock type the scrollbars can now have horizontal scrollbars at top or bottom as well as left or right. This makes sense if the number of columns exceeds the number of rows. We modified the replicatecontrolindbunit() function so that generated detailblock controls do not use the same naming convention as the names that are auto-generated for
    regular controls, in order to avoid an accidental collision between detail block controls and controls that might be added after the detailblock is built. We also added a safety check to the dataform1settext() function to ensure it doesn’t check for the presence of a masterrecord if the form is in design mode, but if it is not in design mode, it will also call the dataform1ongotfocus() method if the record is not marked as dirty, to ensure it gets locked.We added some more code to the df1droplistinfo type, which is used for drop lists associated with dataform1edittext controls. This is to ensure that the list correctly closes and also correctly places focus in the appropriate control afterwards. We also fixed a bug in this area where the max search entries was not being checked against.A potential lock leak in dataform1.setmasterrecord() was fixed where if a record had already been locked, it would not have been unlocked when the record was replaced. A problem was resolved that was introduced when the appframework began using embedded child windows for forms, which added an extra layer of windowing, so that caused the code that previously would post to the status bar to display a wxmessagedialog instead, resulting in a never ending cycle that the original code had been implemented to prevent. Support was added to both dataform1 and printform1 so that they carry an additional property called currentworkingdirectory. This is set in the formlib.sml code when the form is opened to be the same as the directory where the form was located. It is only used to build a full path when retrieving an image from a record for display in a dataform1bitmap and only then if the path does not start with either http:// or file:// and is a relative path (doesn’t start with either: a drive letter:\, \\, or / (on Linux)). We also ensured that when calling dataform1.setmasterrecord(), if the record object is .nul, that the form will be blanked.We fixed an internal problem where every detail block unit was being marked as master, rather than only the first one. We also fixed the detailblocksection.remove_dbunit() method so that it only removes controls from the form if they are not marked as master. Additional sanity checking was added when creating a detail block so as to ensure the result will fit in the available space. We made changes to ensure that calling the dataform1detailblock.remove() method cleanly removes the detail block but leaves the master controls behind.The types dataform1control and dataform1graphic were added to allow the IDE to do provide inline help for declarations of type(dataform1control) and type(dataform1graphic). A getdatasourceinfo() method was added to the dataform1datasource type to make it easier to convert from dataform1datasource to datasourceinfo. A similar mechanism was added for tables. The gettbinfo() method is now part of the dataform1table type, as is a getfieldinfo() method that returns a db1fieldinfo object (see the entry for db1util.sml below) for the field name that is passed.There is a new array property for the dataform1table called newfieldinfo, that contains an array of db1fieldinfo objects, one for each field in the table. The dataform1page and printform1page types have a new remove() method. A bug fix was implemented for the dataform1detailblock.addrowdata() method. Previously, calling this method would have caused a runtime failure. Error handling in the printform1page.addcontrol() and printform1page.addgraphic() methods was improved.Various changes were done in dataform1.setmastertable(), dataform1.selectcurrent(), printform1.setmastertable(), and printform1.selectcurrent(). These changes were added to work around a problem we recently discovered with the ppcstype1 component where if a record was selected using an index that allows duplicates, and if the field value that is the selection index is changed, then after saving and doing a selectcurrent() on the record object, the wrong record is returned. This is a very specific case and we will be repairing it as soon as we are happy that we have correctly isolated the circumstances that cause it. We modified the dataform1.addpage() and printform1.addpage() methods so that the form is only set to dirty if after adding the page there is more than one page.
  • db1util.sml – In prepration for future enhancements that are planned, we added the following extended field information fields: defaultformula, calcformula, valformula, readonly, and required. We also added default values for the equicalent parameters in the existing getfieldinfoarray() and the new getnewfieldinfoarray() functions and updated the db1fieldinfo type. We have switched internally to using the getnewfieldinfoarray() function. We modified the functions getuniqueindex() and getuniquenindex() to compare against "== .true" instead of "!= .false", because the index.unique property might be equal to .nul. We have updated the lockrecord() function to act the way it was intended to. It was meant to attempt to lock the record and if it failed, return the original (unlocked) record. It wasn’t doing that, so it has been changed accordingly. It now returns the unlocked record if it fails, and the error value should be checked for success.
  • dbconverter.sml – There was an issue with the wrong assignment operator being used in the sbme1 export converter that has now been corrected.
  • drilldown.sml – The drilldown() function now has forceupper and forcelower options to force the input to be forced to upper or lower case before searching. The drilldown() function now takes two additional parameters, a setfilterhandler function parameter and a type(*) reference. If the handler is defined, then that function will be called to construct the filter. The prototype of the user-supplied search filter function is searchfilterfunction(string s, type(*) reference), where the s parameter contains what the user has typed (converted to upper or lower case if those parameters were set). This allows the caller to construct the filter themselves, in cases where they wish to look in multiple fields for the same string, for example. We increased the amount of space available for the search message in the drilldown.sma() and tablesearch.sma() forms to roughly the entire width of the dialog minus the margins. The tablesearchfrm.sma() form now properly supports the passed in caption, OK and cancel button text. The main loop that handles the querying was modified to respond to the user changing the content (by typing additional characters) so that the query is broken off immediately if the typed content has changed length, and then it will start a new query).
  • filesyslib.sml – The copyfile() and setcurrentdirectory() functions were added. The createdirectory() function was improved so that it strips trailing directory separator characters before checking if the directory already exists. A new function, createpath(), was added that will recursively create every element of the path passed and another new function called getdefaultnewline() was added to return the appropriate newline character for the current OS.
  • formlib.sml – There were numerous fixes to the code that generates a source code program for the dataform1 forms. An important change is that the primary parameter passed to the resulting function is of type(appwindow) appw rather than type(application) app. In addition work was done to ensure that only relevant parameters are output and that the code compiles without warnings. Numerous improvements were made in the source code generation of a dataform1 form. Additional code was added to assign the dataform1link property on dataform1bitmap and printform1bitmap objects, the lack of this assignment resulted in the situation where if a table was linked 1:1 and a dataform1bitmap or printform1bitmap was placed from the linked table, it would not show the image because the link wasn’t there to find the record. Support was added for the new currentworkingdirectory property of both dataform1 and printform1 during the loading from file so that relative paths work better when displaying images that are located relative to the form file location. We modified the display form storage format and the source code generation to store the column widths of a dataform1grid so that these can be set in the design tool and so that they are preserved. In the loading code for dataform1 and printform1, we switched to using setmastertable() instead of directly assigning the master table in preparation to eventually making the mastertable property read only. There were some minor changes to how list source entries are read when a form is loaded. The code that associates a table with a form was enhanced to ensure that priority is given to already open tables before attempting to load one from the stored information. We fixed the load of a display form so that once all of the pages and controls have been loaded, the designdpi property is set to the value of the currentdpi property and the dpiadjfactor property is set back to 1 (since at this point, the form has been built according to the value in the currentdpi property, so should anything later be added, it will be sized correctly).
  • gaugelib.sml – The multigaugedialog type had support for the showcancelbutton parameter added.
  • graphicreportlib.sml – Moved from format version 0.3 to 0.4 for graphicreport1. This added the following properties: distinct, outputtargetpromptfordestination, allowuserdeffilter, allowuserdeforder, hidespecifiedfilter, and hidespecifiedorder. The sqr1table was given the master attribute. The project now includes uisyshelphdr.sma. We added the printform1graphic type tag to the graphicreport1 graphic types. We created the remove() method for the graphicreport1formpage type and added code to assign the control source to a display control if the createdisplayform property is set to .true. The helper function getcontrolsourcefromcolno() was created to support retrieving the correct control source so it can be assigned. The graphic report now has optional gauge support (similar to the quick report). Numerous other changes were done to support the creation and modification of graphic reports using a design tool. We made possible user-defined filters and orders at run time. There were also numerous code improvements. We handled a possible race condition in the code that removes a page. The graphicreport1form type definition now has the additional type tag (dataform1linkcontainer). Adding a page or a control on a page now sets the graphicreport1 object’s dirty property to .true. Removing a control, graphic, or page from a graphicreport1form sets the graphicreport1.dirty property to .true. Various improvements were made to the assignment of tables as controls’ sources. We added the report target selection dialog form. A place in the save code for the graphic report where a double conversion to XML was taking place was fixed.
  • httpclientlib.sml – This library was updated to better support debug output. We added a time stamp to the debug output and debug output now uses the logmanager.sml to handle multi-threaded log writes. The httprequest type was changed so that when it is retrieving the header, that if the accept property is empty, then no accept header will be output.
    We also added cookie support to the httprequestheader and httpresponseheader types together with appropriate methods.
  • labelslib.sml – The labels engine was updated to also provide an optional progress meter while running, similarly to other report modes. The file format was changed so that the printform1 used for the label is now embedded in the *.sxl file rather than being an associated *.sxp file with the same name. The older format is still supported but when saved it will be saved in the newer format.
  • printformlib.sml – The pagesetupinfo.new() method now takes the papertype, units, isportrait, and font parameters. We fixed an error where the dialogdata property of the params parameter to the printwxform() function was not being passed on when it was present if the output target was print preview. The printwxform() function now requires a new pagesetupinfo psinfo parameter so that the user-selected page orientation is supported.
  • quickreportlib.sml – This librry now exports the getprinttextextent() function for assessing the required print size of a string. Additional sanity checks were added to the quickreport1.addaggregate() method and it was also modified to use quickreport1.getcolumndatatype() and only if that fails to fall back to me.findcolumndatatype(). The export keyword was also added to: getaggtypestring() and getaggtypeidfromstring(). Quick reports were not using the users locale for list separator characters because the locale information had been hard-coded. It now creates a new locale object which interrogates the operating system for the locale information.
  • recordview.sml – The lastusedrecord property of the trecordview type is now read only and there is a companion setlastusedrecord() method. We fixed an error in the trecordview.saverecord() method that was calling a non-existent (sbme1rollback() method for ppcstype1file objects. The library now has a dependency on conflib.sml. This was part of adding support so that record view, if provided with an INI file name upon creation, can retrieve the row height settings for that table name from the INI file and store them if they are changed from the defaults. We also added support to work around the problem in ppcstype1 that was established with respect to doing a selectcurrent() method call after changing the value of the record’s indexed field.
  • repguilib.sml – Numerous changes were done to ensure that the Calculate button for creating calculated columns in the quick report works properly, supported by a Calculation dialog, and ensuring that the AS name is correctly represented throughout with double quotes if it contains a space. We also enhanced the group, filter and order portions to correctly support the AS name of the calculated column. As part of the same work we added support for the Modify button for modifying a calculated column. The front-end support for the update functionality was added to this library. The function quickreportwindow.new() no longer takes a wxfont font parameter, but instead takes a pagesetupinfo psinfo parameter, which provides the font and more information as well. The problem that was solved was that the paper size and type as well as the margins were all previously hard-coded. Now, they inherit these values from the pagesetupinfo type. Various other improvements were made to the Quick Report GUI. It now remembers which output target was last in use and sets that output target as the default if the report is placed back in the user interface tool.
  • reportlib.sml – We added a new function: lexorderclause() to improve the parsing done in parseorderclause(). It now copes with column names that contains spaces and which are wrapped in double quotes, such as those that might describe a calculated column. To this project we added the update.sma file and the new update engine. This also includes the loading and saving of updates so this required adding four libraries to the project: sbnglib.sml, libxml.sml, filesyslib.sml, and calceval.sml. It also added the lxml C-language component to the project. To support the GUI when analysing a report during design the report1.findaggregate() and report1group.findaggregate() methods were added.
  • sbldatelib.sml – Improvements were made to the string2date() function to make it more robust when bad data is passed to it.
  • sbnglib.sml – We updated the tablestatus() function so that it also outputs the total number of fields and indexes. The wxformoptiongroupmemberwxformoptiongroup, and related functions were moved to the uisyshelp.sml library so as to remove the dependency of this library on the wxwn component.
  • sendmail.sml – The sendmail() function now has a debug feature. We changed the position of the code that processes attachments so that it increments only if there is something to process.
  • simpollib.sml – We fixed a problem with the isproperty() function.
  • smtpclientlib.sml – The smtpmessage type now has a debug property.
  • smtpdatelib.sml – We added the gettimezoneinformation() function for both Windows and Linux.
  • sql1.sml – The findcolumndatatype() method was added to the sqlq1 type. This method, unlike the getcolumndatatype() method, does not rely on the query already having been successfully prepared. The sqlq1.findcolumnsource() method was added. We made numerous improvements to the sqlq1.findcolumndatatype() method so that it is more accurate (though still not perfect). This works without calling prepare(), but if the query has been prepare()‘d, then it is better to use sqlq1.getcolumndatatype(). Added support for the CAST operator in our SQL 92 implementation as well as support for the NOT key word. The hastable() method was added to the sql1q1 type to allow it to check if a table of a given name is part of the table list for the query.
  • stringlib.sml – There is a new parsemultitoken() function that is similar to the parsetoken() function but which can stop on multiple tokens and reports which one it found.
  • tableview.sml – The ttableview type’s lastusedrecord property is now read only, with a new companion setlastusedrecord() method. Improvements to calculate default column
    widths in table view were made. The library now has a dependency on conflib.sml. This was part of adding support so that table view, if provided with an INI file upon creation, can retrieve the column width settings for that table name from the INI file and store them if they are changed from the defaults. We also added support to work around the problem in ppcstype1 that was established with respect to doing a selectcurrent() method call after changing the value of the record’s indexed field.
  • uisyshelp.sml – We added the getwindowsfolder() and getwindowspublicdocsfolder() functions to the library to provide a consistent and reliable way to retrieve the correct location of the “C:\Users\Public\Document” and other system folder locations (Please note that on Windows 10, some of these locations can be virtualized when using UAC.) Some additional error checking was added to the getuserinput() function. The wxformoptiongroup, wxformoptiongroupmember, and supporting code was moved into this library from the sbnglib.sml library so that library could remove its dependence on the wxwn component. This required adding the lists.sml library to this project. We also updated the datepicker() function by adding a new parameter: boolean weekstartonmonday=.true. This retains the default behavior, but if set to .false, it will show the calendar with the week starting on Sunday for North American customers. We also added the showcopyabletextmessage() function to allow an easy method of showing a text message that is multi-line and read only and which can be copied to the clipboard. The function getusabledisplaysize() has been enhanced to now accept the left and top integer parameters. This accommodates the situation where the task bar is not at the bottom of the screen, but at the top or the left. In these cases, the left and top parameters will be filled with the correct offset of the usable display area. The functions getcenteredwindowrect(), centerdialogonparent(), and centerwindowondisplay() have been updated to work correctly with this change. A new function has been added for Windows users, called: getwindowstaskbarstateandpos(). This takes two point objects left-top (lt) and right-bottom (rt), a boolean ishidden, and an integer edge parameter. A new user-interface feature is the choicelistdialog() function. It is fairly flexible and can display a list of choices in a dialog. If the flag onlyone is set to .true, then it will display the entries as check boxes, if not, as option buttons. It returns an array where each element is set to .true or .false depending on whether it was selected or not. The array elements correspond to the position of the items in the original choice array.
  • uuencode.sml – We changed the implementations of base64encode() and base64decode() to use API calls on Windows and Linux. A fallback is provided to the older implementations if the API calls are unable to be obtained. This change means that base64encode() always returns a string with a trailing carriage return linefeed pair (previously it did not have this trailing character pair).

Changes to Superbase NG Personal

The Table Designer now supports the extended attributes (but they are not yet supported fully in the system) and we fixed the addfield(), deletefield(), tabledefok() and tabledefcellselect() functions to ensure that parts would not be called if the container file does not have the system tables.

The new Graphic Report Designer has been added to the package and work has been done to ensure that the graphicreport1 group of types is more thoroughly implemented than it had been previously. We added the graphicreport1form.findcontrol() and graphicreport1form.findgraphic() methods as well as additional features required by an interactive design tool such as the new Graphic Report Designer, including a setpapersize() method for the graphicreport1 type.

We made various changes to the import merge functionality so that if the target table does not have a unique index, then the index options are disabled in the user-interface.

There were numerous changes to the underlying program, including: renaming to Superbase NG Personal, selecting the default working directory to be the c:\users\public\documents\SBNG Personal folder (on Windows), migrating the INI file to the new folder location which is c:\users\<username>\Documents\SBNG Personal (on Windows) and renaming it to sbngpersonal.ini. We added dataview support (Field List) to the copy to clipboard functionality. An important adjustment was made to the defer() mechanism. We made some enhancements to the Table Status functionality including output of the field and index counts.

We now support four most-recently used (MRU) lists: tables, display forms, print forms, and graphic reports. We added the graphic report support, including loading, running, and creating or modifying them. In the Form Designer we added support for removing a detail block by setting either the rows or columns count to zero. The new Graphic Report Designer is part of the designers package and integrated so that from any designer, the Display and Print Form as well as the Graphic Report Designer are available. We changed the Form Designer package to support three MRU lists, one for each type of form: display, print, graphic report. Made numerous fixes throughout to ensure everything plays together smoothly. Selecting an item in the various form designer modes now shows the traits of that item in the tool bar (font, font size, font attributes, alignment, colors, etc.) if they have them. This does not change the global state. Clicking on the back drop will restore the default values in the tool bar. This change to the tool bar ribbon is not done if multiple controls are selected. Form Designer(s) now show the bullseye cursor when you are expected to click on something, for instance when aligning or sizing objects. We fixed a problem where the background color values were not being read out when opening the dialog to edit a dataform1bitmap object. The Edit->Paste functionality now checks that the type of form being pasted matches the type being worked on. Changed the createnewpage() function in the Form Designer so that for print forms it takes into account the orientation (portrait or landscape) in the page set-up information. We also fixed a problem where if a font is being added to the combo box in the tool ribbon, and it happens to be being added to the end, that it would cause a number out of range error. We made the createblankprintform() and createblankgraphicreport() functions in the Form Designer sensitive to orientation (portrait or landscape).

We implemented support for the Update functionality.

The default for opening tables when one is open was changed to opening in the same window instead of a new window and we added the new filtergui.sml library for list selection in place of the old filter functionality and it is called using the equals (=) button on the selection panel tool bar. The export data code was improved so that if the user types in a name that has no file extension, then the appropriate one will automatically be added. Also, if no path is included, the current path will be added. Finally, after the export completes, a message box will be shown telling how many records were exported, and to which file. The Label Designer now has the Ctrl+A accelerator for selecting all elements on a form page.

Conclusion

Try things out. Explore. Most important, have fun! Any problems you hit should be discussed in the appropriate news group at news://news.simpol.com/simpol.*.

Neil Robinson

Technical Director

Superbase Software Limited