Version 3.20
New Features
- A splash screen can now appear when Stonefield Query starts up if you create an image named SPLASH.BMP, JPG, JPEG, or PNG that you want displayed in the splash screen.
- A new workstation installer, WSSetup.EXE, makes it easier for your users to install your customized Stonefield Query on their workstations. After installing it on a network server, each user simply has to run WSSetup.EXE to install the minimum runtime files on their workstation and create a shortcut to SFQuery.EXE on the server. WSSetup.EXE also copies the help file to their workstation to avoid security issues with help files located on servers.
- The properties page for a database now includes settings you set when you added the database to the data dictionary, such as whether views are included or not. You can change these settings so the Refresh Data Dictionary function respects the new settings.
- In addition to setting the application name and other configuration settings, you can now brand the Stonefield Query files themselves.
- The new Enable Table/Field Favorites configuration setting enables a new Show Only Favorites option in step 2 of the report wizards so the user can minimize the number of tables and fields they see.
- Improvements were made in how link action scripts are handled, making it easier to do things such as link to Google Maps.
- You can now distribute customized Standard and Elegant templates in the Sample Templates folder. Previously, the internal versions of these templates were always used.
- You can now define a default table for each data group.
- The new Icon File configuration setting allows you to specify your own icon for the Stonefield Query dialogs.
- The new Display Application Name configuration setting allows you to specify whether the application name is displayed before the logo in the About dialog.
- The new Support Maintenance Reminder configuration setting allows you to specify whether your users will receive reminders when their software maintenance is due to or has lapsed.
- Stonefield Query now supports the TopSpeed ODBC driver.
- You can now open multiple code editing windows at a time.
- The Desktop Image configuration setting was removed because Stonefield Query no longer uses a background window. If it exists, the value of the Desktop Image configuration setting is now moved to the Logo Image setting if that setting is blank.
- Opening a project in the Configuration Utility makes it the default one. This still also happens when you close it, but now you don't have to close the Configuration Utility to make it the default. This is handy if you switch between multiple projects a lot like we here at Stonefield do.
- New DataEngine.AfterResultSetRetrieved, Application.ReportsExplorerActivated, and Application.ReportsExplorerReady events are available.
- The DataEngine object has a new GetFieldsFromSQLStatement method that, similar to the GetTablesFromSQLStatement method, returns a collection of the fields involved in the specified statement.
- The new CanEditReports property of the Application object can be set to False if you want to prevent the user from adding or editing reports programmatically.
- The new Execute method of the Application object can be used to launch an application.
- The return value of the DataEngine.GetCustomMetaData script is now important: True means continue, false means terminate so you can close the application if you detect a problem in such a script.
- The window displayed when you select View Table Contents in the Configuration Utility now shows the contents of the memo field selected in the grid at the bottom of the window.
- The dialogs displayed when you call the DataEngine object's GetValuesForField or GetValuesForParameter methods now include the "ignore this condition" option. You can also pass these methods a collection of default values to use.
- The Application object has a new GetValuesCollection method and new ApplicationDirectory, ApplicationDataDirectory, ShortApplicationName, and Version properties.
- The ADODataSource object has new ConnectionTimeout and CommandTimeout properties so you can control timeout settings.
- The LoadProject method of the SQProxy object now accepts the name of the data source to query on as a parameter.
- The SQProxy object now has a Parameters collection you can use to pass user-defined parameters to Stonefield Query, much as you can pass user-defined parameters on the command line.
- Turning on or off the checkbox for a database in the Data Groups or User Groups pages now turns on or off the checkboxes for all tables in that database.
- You no longer have to specify parameters in a stored procedure passed to the ExecuteSQLStatement method of a Database object using syntax like "exec MyProcedure ?FirstParameter, ?SecondParameter". Instead, pass a parameters collection as the second parameter to ExecuteSQLStatement and specify the stored procedure with any parameters (in other words, simply "exec MyProcedure").
- The Text datasource handles more types of date values.
- The Subtable Filter property of a subtable has to contain a reference to the subtable, not the original table. To prevent errors, when you fill in the filter, the Configuration Utility now automatically converts the original name to the subtable name in case you entered the wrong name.
- A new Prompt for subtables option in the Add Database dialog allows you to indicate whether you are prompted for subtable names when multiple relationships are found between tables or a table has a self-join. While this is turned on by default, you may wish to turn it off if you don't plan on dealing with multiple relations and don't want to be prompted for them every time you refresh the data dictionary.
- The Reports Explorer and Help menu now have a Manual function that displays the content of a PDF with the same name as the executable (SFQUERY.EXE by default). These functions are only visible if that file exists.
Bug Fixes
- A problem caused by zooming the code window for a script, then clicking on a different item in the Configuration Utility, then saving the changes in the code window was corrected.
- Delimited field and table names for MySQL databases, which use the reverse apostrophe as the delimiter character, are now handled properly in Stonefield Query. Also, Stonefield Query now replaces the TOP N clause with LIMIT N when connecting to MySQL since MySQL doesn't support TOP N.
- Reports using an expression filter condition (such as "Order Date equals DATE() - 7") on tables that have a Select script are now handled properly.
- Calculated fields using non-Stonefield Query expressions that reference a field in another tables are now handled properly.
- The Configuration Utility now creates a help file correctly when the Target Application's Name setting is filled in but Need Target Application Directory is set to False.
- A bug that caused the wrong Default Language or Default Data Group for New Reports to be displayed in the Configuration Utility was fixed.
- A problem that caused a bogus error message when refreshing a data dictionary which doesn't contain all the tables in the database was corrected.
- An error that occurred when converting a data dictionary table named something other than REPMETA.DBF to the latest structure was fixed.
- Calculated fields using non-Stonefield Query expressions and calling functions native to the database engine (for example, "DATEADD(minute, 360, Order.OrderDate)") that return data types different than specified in the data dictionary now work properly in reports.
- A problem importing a data dictionary that didn't specify relationships was fixed.
- An issue that caused an error when you specified a value for Custom Properties for a field was fixed.
- The user no longers gets an ask-at-runtime dialog twice if a report has an ask-at-runtime filter condition and you have a DataEngine.FinalizeSQLStatement script.
- The user no longer gets a "no records matched" message if you display a dialog in the DataEngine.FinalizeSQLStatement script (such as calling the DataEngine object's GetValuesForField or GetValuesForParameter methods) and the user chooses Cancel in that dialog.
- The Configuration Utility now treats "PLAN" as a reserved word, so delimiters are automatically added around a table or field with that name.
- The ProjectLoaded property of the SQProxy object is now only set to True once the project has finished loading. In previous versions, it may have been set to True a little too soon, especially if you had a lot of scripts that slowed down startup.
- Fields using "R" for the Format property no longer have the Picture property applied twice when a value selected in the Values dialog is inserted into the Filter Condition dialog.
- An issue with MySQL when using multiple databases that caused the connection to the second database to fail because the user name and password were specified twice in the connection string was fixed.
- A data group with a name that's a subset of another data group (for example, "My Group" and "My Group 1") now works properly.
- Previously, if you used the zoom feature for the code for a script (right-click and choose Zoom), then selected a different script, then closed the zoom window, the selected script's code was overwritten with the code in the zoom window. Now, the code is saved to the originally selected script.
- Filtering on a calculated field that has a different output data type than how it's actually stored (for example, a character field you want treated as a logical field) in a custom SQL statement now works correctly.
- The user no longer gets an unexpected error but instead a warning message if they try to report on two tables that aren't related in a very large (i.e. hundreds of tables) data dictionary. (In technical terms, we prevent blowing the call stack when the recursive code trying to find a relationship gets too deep.)
- Renaming a database added to the Configuration Utility through an OLE DB provider no longer causes a new database with the original name to be added to the data dictionary when you refresh.
- Renaming a table, subtable, or virtual table when you have more than one data dictionary table no longer results in records for both the old and new names.
- A bug that gave an error when running a report with a filter from a text data source was fixed.
- The Generate Setup function in the Configuration Utility no longer gives an "Inno Setup is not installed" error if you installed only the Inno Quick Start Pack and not the full Inno Setup.
- A bug that caused a field needed by a link action to appear in both the available and selected lists in Step 2 of the Quick Report Wizard was fixed.
- A bug in how the project list in the Configuration Utility (displayed by clicking the arrow beside the Open Project button in the toolbar) is filled when opening projects was fixed.
- A difficult-to-reproduce bug that caused an error immediately after adding a calculated field or virtual table in the Configuration Utility was fixed.
- The Test button on the properties page for relations in the Configuration Utility is now disabled if the relationship information isn't complete.
- A bug that caused an error if the users tried to sort on a calculated field that derives its value from a memo field was fixed.
- A bug that prevented the code zoom window from being restored to the correct location if you had two monitors and the window was previously open on the second one but you only have one now was fixed. (Ok, that one was really obscure!)
- A bug that prevented a field containing characters requiring it to be delimited (for example, a field named [Some-Field]) from being displayed correctly when defined as an enumerated field was fixed.
Version 3.10
New Features
- There are several changes in Stonefield Query. See the What's New in This Version topic in the Stonefield Query help file (SFQUERY.CHM) for details on the new features.
- The Configuration Utility is now fully compatible with Windows Vista. It takes advantage of Aero Glass and the new system Segoe UI font for a more attractive, modern appearance, there are no attempts to write to the program folder, which is by default read-only, and there are no errors during installation as there was with the previous release.
- The Configuration Utility has a more modern icon:

- Stonefield Query now keeps track of your software maintenance expiry date: the About dialog shows the date. Stonefield Query reminds you when your software maintenance is due for renewal and prevents you from running a newer version of the program if your software maintenance has lapsed.
- It's now much easier to discover when new versions are available and to install them. By default, Stonefield Query automatically checks our server once a day to see if a newer version is available. If so, a dialog describing the new features displays and you have the option of downloading and installing that version. Note that updates are only available to current subscribers. You can turn off automatically checking or change how often checking is done with settings in the Options dialog in Stonefield Query. You can also manually check for updates with the new Check for Updates function in the Help menu.
- The Import Data Dictionary function now supports importing from XML files and supports importing relations.
- Because some users were confused by a folder called Reports (they thought that's where all reports were stored rather than just sample reports), we've renamed the folder Stonefield Query automatically imports sample reports from to Sample Reports. For backward compatibility, Reports is still supported.
- The language resource files now contain Dutch and German translations for all text displayed in Stonefield Query dialogs and all messages displayed to users. Thanks for Boudewijn Lutgerink for providing the Dutch translations.
- A new NoDisplay command-line parameter causes Stonefield Query to start but not display any user interface. This is used along with the new SQProxy object to run Stonefield Query reports from another application without starting and terminating Stonefield Query for each report, resulting in much better performance.
- SQApplication has a new Shutdown method and ReportEngine member. Shutdown terminates the Stonefield Query session and ReportEngine allows you to retrieve a list of folders or reports and run a report programmatically.
- There are new ReportEngine.BeforeRunReport and ReportEngine.AfterRunReport scripts.
- New Link Action and Link Description properties for scripts allow you to define which scripts are used as link actions. To support this, the script table, SFSCRIPT, has new LINKACTION and LINKDESC columns. As a result, the first time you open a project with the Configuration Utility, you will be prompted to update the structure of the script table.
- The GetValuesForParameter method of the DataEngine object now displays the same calendar control for Date and DateTime fields as the Filter dialog does.
- The Database object has a new Quiet property.
- The Field object has a new Other property.
- The Application object has new ApplicationDirectory and ApplicationDataDirectory properties.
- The properties page for Relations now includes a Test button so you can test the relationship.
- A new Create Virtual Table from Table function makes it easier to "clone" a table.
- The Options.Settings script now supports drop-down controls with custom values.
- A Select script can now detect whether it's being called for a query or from the Values button.
- The shortcut menu was shortened to eliminate the need to scroll.
Bug Fixes
- An issue calling stored procedures during a query was fixed.
- A bug in querying on Visual FoxPro free tables was fixed.
- Changes to the case of a table's or field's name (for example, changing "CUSTOMERS" to "Customers") are now saved properly.
- A bug that didn't cause the Decimals property of the field to be set properly for fields with the Display from Related Table setting turned on was fixed.
- A bug that prevented a single table with delimiters in its name from being refreshed was fixed.
- Turning on a database's Main property now causes that property for all other databases to be turned off.
- Certain reserved words in table and field names (for example, UNIQUE, LINENO, TABLE, and TRANSACTION) are now handled properly and automatically delimited.
- The Refresh Table function is now disabled when a subtable is selected.
- A bug in dealing with subtables with names that are substrings of other tables was fixed.
- Stonefield Query now correctly handles table and field names beginning with digits and underscores and field names containing parentheses, periods, and other punctuation characters.
- References to the original tables name in the output expression of a calculated field are converted to the new name when a subtable is created.
- Programmatically removing a database from the data dictionary (using SQApplication.DataEngine.Databases.Remove) now automatically removes any data group that's only being used for that database.
- Stonefield Query now properly handles new filters added to the FilterConditions collection in the DataEngine.FinalizeSQLStatement script.
- Fields containing Unicode data are now handled properly.
- A bug caused by selecting a field whose name is delimited (for example, [DESC]) in the Field dropdown list in the Special page has been fixed.
- Removing a relation from one table now removes the matching relation node in the list for the other table in the relation.
- Varbinary fields are now marked as non-reportable by default since they contain binary information that isn't readable to a user.
Version 3.04
- There are several changes in Stonefield Query. See the What's New in This Version topic in the Stonefield Query help file (SFQUERY.CHM) for details on the new features.
- There is no longer a 7-day demo version; the demo version works for 30 days and can be extended by request to 60 days.
- Stonefield Query now supports querying against multiple data sources at the same time.
- Data dictionary items added or updated on or after a particular date now show up in bold if you use the new Filter Data Dictionary function. This makes it easy to see which items need to be checked after the data dictionary is refreshed, for example. To support this, the data dictionary table, REPMETA, has a new UPDATED column. This column is automatically updated whenever a change is made to a data dictionary item. As a result of this new column, the first time you open a project with the Configuration Utility, you will be prompted to update the structure of the data dictionary table.
- When you have multiple data dictionary files, changes to all data dictionary objects, even those in other files, are now written to the last file listed is SFQuery.INI. This allows someone to make changes in the Configuration Utility and not have those changes overwritten when a new copy of the other data dictionary tables is released.
- The properties pane for databases now displays and allows you to change the connection information for a database. This is very useful if the data dictionary was originally filled with information about a database and you later want to refresh the data dictionary from a different database.
- Refreshing the data dictionary is now significantly faster.
- Queries using tables from different databases but using the same connection information now perform more quickly.
- The code editor window, which appears when you right-click an edit box, such as the code for a script, and choose Zoom, can now be sized and positioned outside the Configuration Utility window, and the size and position is remembered the next time you bring up the window.
- The pane showing properties for relations is now much faster when working with large databases (that is, hundreds of tables).
- If a field's heading contains an expression (in which case it starts with "="), that expression is evaluated when the report is run rather than when the report is created. This allows more dynamic expressions to be used.
- The GetINIValue method now accepts a default value parameter.
- You can call the new built-in GetParameterValue function to return the value for the specified parameter rather than getting a parameter object from the Parameters collection and then using its Value property.
- MSVCP71.DLL must now be distributed to end-users, as output to PDF, Word, and HTML require that file.
- Emailed error reports now always include the report the user was working with as an export file attachment.
- Project documentation now includes captions as well as real names on the database and tables pages.
- If the OpenDataSource or Connect methods fail to connect to a data source, the ErrorMessage property of the appropriate objects contains the error message from the database engine. The error is also logged in the diagnostic file.
- A bug in dealing with subtables containing filters in a report that has no filter condition was fixed. Also, subtables of Visual FoxPro tables are now handled correctly.
- A bug that caused some issues when renaming a database was fixed.
- A bug that corrupted project files if you encrypted the project and then changed the password has been fixed.
- A bug that prevented relations from being retrieved from a database when you used an ODBC connection string to connect to it and specified a user name and password was fixed.
- A bug that caused an error the second time as report was run when a table had a Select script and the query had a field with an AS clause (okay, this is somewhat obscure) was fixed.
- A bug in caused the same table to appear in multiple "free tables" databases in the Configuration Utility was fixed.
- A bug that caused an error when using the Import Data Dictionary function with a project containing multiple data dictionary files was fixed.
Version 3.03
- There are several changes in Stonefield Query. See the What's New in This Version topic in the Stonefield Query help file (SFQUERY.CHM) for details on the new features.
- Reports can now be licensed.
- A new Default for Auto-adding DISTINCT configuration setting allows you to specify whether Stonefield Query automatically adds a DISTINCT clause to the SQL statement for a query under some conditions.
- The new GetTablesFromSQLStatement method of the DataEngine object makes it easier to parse SQL statements because it returns a collection of the table names referenced in a SQL statement.
- The new UpdateProgressBar method of the Application object allows you to display a progress bar in the status bar of the Reports Explorer when a script performs some lengthy processing.
- Stonefield Query is now available in German. All English messages in the resource file have been translated into German.
- Some localization issues were corrected.
- The Resource Editor now displays in which Stonefield Query component a resource is used and has the ability to display only those resources used in a particular component or added or modified after a certain date.
- The ConnectionHandle property of an ODBC DataSource object is no longer read-only. This allows you to, for example, use the same connection handle for two databases if they're on the same server (you'd put the code setting the ConnectionHandle property of the DataSource object to the ConnectionHandle property of the data source for the first database into the OpenDataSource event of the second database).
- If a table exists in more than one data group, it now appears in each data group it belongs to in the Table drop down list in Step 2 of the report wizards when the All data group is selected. Previously, it only appeared in the first one.
- You can now specify the file type and description for files in the Options.Settings script.
- In previous versions, deleting a relation from a child table caused the next node under that table to be deleted rather than the relation from the parent table being deleted. This was a display-only issue, as it did not affect which records were deleted in the data dictionary, but this bug has been fixed.
- The Configuration Utility now automatically adds delimiters around fields and tables named "File," since that's a reserved word in some versions of SQL.
- A problem that prevented the Configuration Utility from running the Inno Setup compiler on some systems was corrected.
- The Configuration Utility now handles databases that only contain system tables when adding them to the data dictionary, and correctly handles OLE DB providers that don't completely support OpenSchema.
- The View Table Contents function is now disabled for virtual tables or tables with a Select script, since that function simply performs a SELECT * FROM TABLE query.
- Some methods missing in IntelliSense (such as SQApplication.Encrypt) were added.
Version 3.02
- The Configuration Utility now properly handles multiple data dictionary and multiple script tables.
- You can now customize the SQL statement for a report even if it includes calculated fields or tables with Select scripts.
- It's now easier to change the folder where reports are stored; rather than having to run Stonefield Query with the ACTION=SETUP command-line parameter to invoke the Setup dialog or modifying settings in the Windows Registry, you can now change an entry in Data.INI, a new settings file in the program directory. See the "Changing the Location for Reports" in SFQuery.CHM for details.
- Data.INI, discussed in the previous point, also make workstation setup easier. In previous versions, after installing Stonefield Query on a server and specifying the location for the reports files, you then had to do workstation installs and specify the same location for the reports on each workstation. If you chose the wrong location on one particular machine, that user didn't have access to the reports. Now, after the first user runs Stonefield Query, Data.INI will contain the proper location, and each workstation will automatically use that location.
- When you create a new project, the dialog that appears no longer allows you to specify a file name, since it must always be SFQuery.INI.
- If more than one table is listed in SFQuery.INI, the last one listed is the one new data dictionary records are added to. Updates to existing items are written to the table the record is stored in. This allows you to distribute a "standard" data dictionary but allow your users to purchase their own copy of the Stonefield Query SDK and use the Configuration Utility to add custom tables and fields. In previous versions, custom changes the user made would be lost when you distributed an updated project, since their changes were stored in the same REPMETA table as yours.
- The Short Application Name configuration setting allows you to specify an abbreviated name in various places in Stonefield Query. It's also exposed as a ShortApplicationName property of the Application object.
- The properties pane for data groups and user groups now includes a list of tables. You can quickly specify which tables belong to a particular data group or user group by checking or unchecking the appropriate tables.
- The Sortable and Allow Values properties for fields are now disabled for Blob fields.
- Stonefield Query now works better with SQL Server 2005.
- Stonefield Query now respects filters added in script code with the DataEngine.AddToWhere method when dynamic filter expressions are used.
- New Setup.Settings, Setup.Validate, and Setup.Changed event scripts allow you to add custom properties to the Setup dialog.
- The Application object has new Decrypt, Encrypt, and ShowErrorMessage methods.
- If you have DateTime fields containing Greenwich Mean Time (GMT) values, you can now easily convert them to local time values.
- You can now stop the process of adding or refreshing a database by pressing Esc.
- If you refresh a data dictionary build from a particular ODBC data source and that data source no longer exists or references a server that isn't available, the Configuration Utility now prompts you to select a different data source, and uses the new data source the next time you refresh. This allows you to, for example, create a data dictionary from an ODBC data source on your system and then later refresh it on a customer's system (assuming they have a license for the Configuration Utility).
- The Generate Setup function now includes custom logo files in the setup script it generates. It also displays a reason if it couldn't launch Inno Setup.
- The dropdown list for the Open Project button in the toolbar of the Configuration Utility now handles quotes in paths.
- ImportFFXML.PRG now supports invalid XML in CDATA sections and handles fields that don't exist in the Stonefield Query data dictionary.
- InnoSetup.TXT now specifies that TaskScheduler.DLL is installed and registered on the user's computer even when a "workstation only" install is selected.
- The Web service DataSource object now displays an error message if it fails to connect to the Web service.
- A bug that caused an error converting an old Stonefield Query data dictionary to the new format was fixed.
- An error in refreshing from a Visual FoxPro database was fixed.
- In previous versions, with the Stonefield Query Performs Joins and Include Joins in the WHERE Clause configuration settings turned on, some reports returned no results with some types of filters. This has been corrected.
- A bug that prevented changes to the filter property for subtables from being saved was fixed.
- A bug that caused an error if you specified a custom setting in an Options.Settings that's too close to the right edge of the Options dialog was corrected.
- If you have no data groups defined but reports created with the "All" data group (presumably you previously had some data groups and then removed them), Stonefield Query no longer prevents those reports from being visible.
Version 3.01
- There are several changes in Stonefield Query. See the What's New in This Version topic in the Stonefield Query help file (SFQUERY.CHM) for details on the new features.
- You can now open recently opened projects by clicking the new down arrow beside the Open button in the toolbar and selecting the desired project directory.
- Some issues with creating a custom help file were corrected.
- Varchar fields now show up as Varchar fields rather than Character fields.
- The About dialog no longer shows the Stonefield Query logo if you specified a different image but that file is missing.
- A problem with scripts with similar names (for example, GetData and GetDatabase) being mixed up was fixed.
- The Table object now has Virtual and Roles properties.
- The Field object now has a Roles property.
- The User object now has a Roles property.
- The new Application.BeforeSetup event script gives you the opportunity to perform any necessary tasks before the Stonefield Query window appears.
- InnoSetupBeforeFile.RTF is now installed in the Stonefield Query program directory because that file is referenced from Inno Setup scripts created with the Generate Setup function.
- If an error occurs in the Configuration Utility, it no longer spawns another set of errors.
- An issue that caused the icon for a table to not reflect its Reportable status under certain conditions was corrected.
- The Configuration Utility no longer overwrites custom changes you made to the Picture property of fields when you refresh the data dictionary.
Version 3.0
The list of new and enhanced features in version 3.0 is extensive, and we're sure you and your users will love them.
Reports Explorer
- The Report Wizard has been replaced with a new Reports Explorer. This was done for several reasons:
- Having a wizard-based dialog caused confusion for some users. For example, some thought the Exit button returns them to Step 1 rather than exit the application.
- It was more difficult to support new features, such as a report information page, using a wizard dialog.
- The Information page in the Reports Explorer shows information about the selected report, including when it was created and by whom, when it was last edited and by whom, and when it was last run and by whom.
- The icon for a report in the reports list now indicates the report type.
- The Sample page in the Report Explorer shows a snapshot of the first page of the report the last time it was run. This is handy to quickly identify reports, and can optionally be turned off.
- The Reports Explorer saves which folders were expanded and which report was selected when the user exits Stonefield Query, and restores those settings the next time they run it. This means it comes back up exactly as it was when they left it.
- The toolbar is more attractive and easier to use than the set of buttons in the former Report Wizard. For example, the buttons are always available rather than only being visible in Step 1 as was the case with the Report Wizard, and the New button has a drop-down list of choices so the user doesn't have to bring up the Report Type dialog when creating a new report.
- Support for report folders (formerly called report groups) has improved greatly. You can now have multiple levels of folders (that is, folders within folders), can now create and delete folders separately from creating or deleting reports, and have reports appear in more than one folder. There's also a user-specific Favorites folder.
- The Show SQL option now displays the WHERE clause of the SQL statement used for the selected report.
Security
- In previous versions, Stonefield Query supported only three levels of security for reports and it was all or none. You could specify that all users had all rights to a report, that users other than the one who created it could run it but not modify or delete it, or that only the user who created it could see it at all.
- Stonefield Query now supports role-based security for reports, folders, and the data dictionary. The Maintain Authorized Users dialog is now called Maintain Users and Groups ("groups" being the name we chose for "roles"). You can define new roles besides the built-in ones ("Everyone" and "Administrators"), such as "Clerks," "Managers," and "Senior Executives," and you can indicate which roles (there can be more than one) a user belongs to. The user who creates a folder or report can then specify which groups have what type of access to it. For example, a report which the Everyone group has access to means everyone has complete access to the report (run, modify, or delete). Removing the Everyone group and adding the Managers group means the report won't appear for anyone who isn't in the Managers group.
- You can also specify roles for data dictionary items. For example, while most tables and fields are available to the Everyone role, the Salary field in the Payroll table might only be available to the Payroll Clerks role.
- You can now create users with blank passwords if you wish. You are asked to confirm that the password can be blank.
Quick Report Wizard
- The Quick Report Wizard has been reorganized so data selection is now in Step 2 rather than Step 3. This allows the user to more quickly get to the most important task in the wizard. Also, formatting tasks have been combined into Step 5, including access to the Advanced Report Designer.
- Stonefield Query now supports customizable report templates. A report template specifies certain formatting information about a report, such as the placement of new fields, default objects in the page header and footer, and so forth. The template used for quick reports, which was previously internal to Stonefield Query, is now the "standard" template. You can modify this template if you wish or create new templates using the new Template Editor. Some uses for templates are having a company logo on every report or creating different layouts for different users. You can specify which template is the default one used for new reports in the Options dialog, available from the Tools menu.
- The Field Properties dialog now has options for dynamic font style and color (see the description of this feature in the Advanced Report Designer topic).
- The Field Properties dialog also has more data trimming options. For example, you can specify that data is cut off if the column is too narrow but that an ellipsis appears at the end of the text, making it obvious that some data isn't displayed. It also supports displaying blanks instead of " / / " for empty date values.
- The Field Properties dialog has new "use default" options. Turning these options on (which they are by default) tells Stonefield Query to use the default formatting for the field as defined in the data dictionary. The advantage of this setting is that changes made to the formatting in the data dictionary after a report has been created are applied to existing reports.
- There are a couple of new properties for grouped fields that can be specified in the Field Properties dialog. The first is when each group appears on a new page, whether the page number is reset to 1 or not. The second is sort order for groups, ascending or descending; previously, groups were automatically sorted in ascending order. Also, the Bookmark option was moved to the Grouping page, since it's only available for grouped fields.
- If the Reset page number to 1 option discussed above is turned on, the summary band (which shows a total count of records and any grand totals) is omitted because it would appear at the end of the last group, which wouldn't make sense.
- The default font and size for a report now affects not just new fields but existing fields that weren't changed from the defaults. This makes it easier to change the font and/or size for all the fields in a report.
- Certain report objects, such as the page header and footer, now use the entire paper width rather than the report width, making better use of the paper. This also prevents the case where a narrow report (just a few short columns, for example) with a long filter has extensive word wrapping in the filter expression shown in the page header.
- The Customize button in Step 2 of the Quick Report Wizard has been renamed to Advanced. The Customize Wizard has a new first page: Advanced Settings. The options in this page allow you to indicate whether duplicate records are included or not and specify TOP N values for the report.
Cross-Tab Wizard
- Cross-tab reports also support customizable report templates.
- There's a new setting in the Formatting Options page for cross-tab reports: Place subtotals above details. If this option is turned on, subtotals for row records are shown in the row record rather than in a "subtotal" record.
- A new _SUBTOTAL field is automatically added to the result set for cross-tab reports. This field contains True for the subtotal row and False for the rest of the rows. You can use this in the Print When expression of a report object in a template to, for example, highlight subtotal rows by including a colored rectangle.
Advanced Report Designer
- The Advanced Report Designer has had a major overhaul. The properties dialogs are now cleaner and easier to use. For example, you can change all of the properties for a field in one place, rather than having to bring up one dialog for the font and another for the expression. The new Report Properties dialog combines the features of the Page Setup, Title/Summary, Data Grouping, Variables, and Set Grid Scale dialogs from earlier versions, plus adds new features as well. Options that don't make sense have been eliminated from dialogs.
- You can now preview the report right within the Report Designer without having to first save and close the report.
- You no longer need to know the real table and field name for a field when you add it in the Report Designer. When you click the Expression Builder button (the button with the ellipsis) in the Field Properties dialog, the new Expression Builder dialog displays the same descriptive table and field names you see in the Quick Report Wizard.
- The names displayed for fields reflect their purpose rather than the actual expression. For example, instead of showing "loReport.GetReportHeader()", the page header field shows "Page Header".
- You can now specify the exact size and position of an object by typing the top, left, height, and width values in the properties dialog rather than having to carefully move or resize it one pixel at a time to get it to the correct place and shape.
- Stonefield Query now supports dynamic font style and color. Dynamic means that the font style and/or color for a particular field changes from record to record depending on an expression you specify. For example, you could indicate that an amount field appears in red if the value is negative and black if positive, or you can make the amount bold if it's more than $5000 to make it stand out more.
- Stonefield Query now supports rotation of objects. This is handy, for example, to place the headings of narrow columns at a 45 degree angle so the columns can be placed closer together.
- Stonefield Query uses a new graphics engine, called GDI+, for rendering reports. This provides smooth scaling of text and images, even at large magnifications. Since GDI+ requires slightly more space to render text than the older graphics engine (GDI) used by previous versions, it's possible some advanced layout reports might not render quite right using the new reporting engine, so by default, existing advanced layout reports are rendered using the old report engine. Step 5 of the Quick Report Wizard allows you to switch between the two engines.
- Reports with multiple columns (such as mailing labels) have better support: group headers now appear on their own row rather than taking up one of the data columns, and they can now span multiple columns.
- Report directives are no longer put into the Comment property of report objects so this property can be used for true comments.
- Stonefield Query now allows you to specify the Script setting for a font. This is important for different languages, such as Cyrillic, Japanese, Hebrew, and Arabic, which require the proper setting be used to display text properly. In addition, text alignment works better than before in both left-to-right and right-to-left languages.
- The variables used for counting total records and records in groups in reports were renamed to more understandable Report_RecordCount and Report_GroupCount<N>.
Configuration Utility
The Configuration Utility is now licensed in a similar manner to Stonefield Query. It uses its own license file, SQConfig.LIC, so you need to obtain an activation code from Stonefield Software Inc.- More modern icons are used in the TreeView, toolbar, and menus.
- You can now define calculated memo fields.
- You can now define comments for fields. These comments are displayed in Stonefield Query in the Comments page of the Field Properties dialog.
- There are several new data-related configuration settings:
- Use DSNless connection: set this to True (the default) to use a connection string rather than a DSN for the database connection. However, some database engines cannot accept DSNless connections, so set this to False if you experience connection problems.
- Include joins in the WHERE clause: normally, joins between tables go in JOIN clauses. However, some database engines require joins to be specified in the WHERE clause, so set this setting to True in that case.
- Stonefield Query performs joins: while most database engines perform multi-table queries quickly, some perform them significantly slower than single table queries, so set this setting to True for better performance with those types of engines.
- IntelliSense is now available for all scripts. To access IntelliSense, right-click the edit box for the code and choose Zoom. To get IntelliSense on the members of the Stonefield Query object model, add "LOCAL SomeVariable AS StonefieldQueryObjectName" to your code. For example, for IntelliSense on Table objects, use "LOCAL MyTable as Table". When you later type "MyTable" followed by a period, you see the property and method members of the Table object in a drop-down list from which you can select the desired member.
- You can now create an empty database using the Add Database dialog. This is useful if you need a virtual database, such as when querying against text or Excel files.
- The Configuration Utility can now read in tables that have more than 255 fields.
- You can now indicate whether fields are sorted alphabetically (the default) or displayed in natural order (the order they appear in a table) in the Configuration Utility.
- The new Create Relation on Field function in the Configuration Utility makes it easier to relate one table to another one on the selected field.
- You can now specify the caption displayed for "data group" in the Data node of the Configuration Utility. For example, in an accounting system, you may want it displayed as "module."
- New View Table and View Field functions in the Configuration Utility make it easy to see the contents of the selected table or field.
- The new DataEngine.FinalizeSQLStatement script is used to change the SQL statement used for every query. A typical use of this is to add a WHERE clause to the query so the user can only see records they are allowed to.
- The new ReportEngine.AfterGetFolders script is called after a collection of report folders the user has access to has been retrieved but before these folders are displayed in the Reports Explorer. You can modify this collection if, for example, you want to only display certain folders under certain conditions.
- The new DataEngine.BeforeCreateSQLStatement script is called before Stonefield Query creates the SQL statement for the report, allowing you to make changes to things, such as filter conditions, that affect the SQL statement.
- You can pass the directory for the project files on the command line to the Configuration Utility to have it automatically open that project.
- You can now edit configuration settings from the Configuration node without having to first select the appropriate subnode.
- Stonefield Query now uses the appropriate image in all dialogs if you've filled in one of the Desktop Image or Logo Image properties but left the other one blank.
- The new DataEngine.BeforeCreateSQLStatement script fires before the SQL statement for a report is created. This allows you to hook in before the ask-at-runtime dialog displayed.
- The FilterConditions collection now has an AddItem method so you can add filter conditions programmatically.
- FilterCondition objects now have an IncludeInDisplay property. Setting this to False prevents that condition from appearing in the filter display even though it's used in the query. This allows you to create filter conditions the user doesn't see.
Other Improvements
- The Preview window has several improvements. There are new buttons in the toolbar allowing you to specify the number of pages displayed at a time. The new Find and Find Next functions allow you to quickly locate text anywhere in the report. You can now scale a report above 100%: 200, 300, and 500% are supported. A shortcut menu is available. The toolbar is now automatically docked. If you click the Print button, the Current Page option is available to print just the current page.
- TIFF, GIF, and PNG images are now supported in PDF and RTF output; formerly, only BMP and JPEG files were supported.
- Online activation has been implemented. When you purchase a license of the Stonefield Query SDK or Report Designer or Runtime licenses of Stonefield Query, we will provide you with a serial number. In the Registration dialog that appears when you activate Stonefield Query, enter the serial number and click the Online button. After a few seconds, an activation code will be filled in and you can click Finish. This means you can activate Stonefield Query or the Configuration Utility without having to contact Stonefield Software Inc.
- You can now print or output reports to file when the program is unactivated. However, you must activate it within 30 days or it will stop working. The activation "nag" screen reminds you of how many days you have left. You are also asked to login whether the program is activated or not.
- Auto-completion is now available in the To and Subject text boxes in the Email dialog. Auto-completion means that as the user types, a drop-down list of previously entered values appears, from which the user can select an item rather than typing the entire item again. This is similar to the way the address bar works in Internet Explorer, for example.
- Stonefield Query handles data coming from a Visual FoxPro-based Web Service better.
- There's better performance for all types of file output, especially PDF and Word.
- There's much better querying performance when using subtables.
- Stonefield Query now uses XML for many of the settings stored in the reports table and for export files (it still supports export files from previous versions for backward compatibility). This makes it easier to edit the content directly (something not recommended but occasionally useful if you know what you're doing).
- IntelliSense is also available for the code in the Customize dialog (accessed with the Advanced button in Step 2 of the Quick Report Wizard).
- You can now indicate that external Visual FoxPro reports, imported using the External Report Wizard, can be edited in the Quick Report Wizard.
- When you compare a field to an expression in the Filter Conditions dialog, new Expression Builder buttons (the buttons with the ellipsis) launch the new Expression Builder, making it much easier to enter an expression. There's even a drop-down list of commonly-used expressions available so you don't have to know the expression for "last day of the month," for example. In addition, you can now use fields in an expression filter. For example, you could create a filter on OrderDate is less than ShippedDate - 30 (that is, all items that took more than 30 days to ship).
- The Schedule Report Wizard now allows a blank password.
- You are no longer prompted if you want to exit the application when clicking its close box.
- Stonefield Query now stores Registry settings in HKEY_CURRENT_USER\Software\CompanyName\ApplicationName, where CompanyName and ApplicationName are the values of the Company Name and Application Name configuration settings. Previous versions stored them in HKEY_CURRENT_USER\Software\Stonefield Systems Group Inc.\ApplicationName, which made it more obvious where Stonefield Query came from.
- The Copy Settings button in the About Stonefield Query dialog now includes the version number in the text placed on the clipboard.
Version 1.06
- There are several changes in Stonefield Query. See the What's New in This Version topic in the Stonefield Query help file (SFQUERY.CHM) for details on the new features.
- A new type of license is now available: an Unlimited Runtime license allows an unlimited number of users to run reports but not create a new report or copy, edit, or delete an existing report.
- The Configuration Utility now stores and displays table and field names in the case the database engine uses. This is so Stonefield Query works correctly with case-sensitive database engines, such as MySQL running on Linux.
- You can now specify which characters to use as delimiters around table and field names that need delimiters (for example, names with spaces in them) in the Select Data Source dialog. Specify a two-character value, with the first character being the left delimiter and the second being the right. The default delimiters are "[]", meaning names are delimited with square brackets. Previously, double-quotes were used as the delimiters. This change uses the more standard square brackets as defaults, plus supports databases that use different delimiters, such as MySQL.
- The Configuration Utility now adds delimiters around table and field names matching SQL keywords, such as ORDER and GROUP, when it reads them from the database.
- You can now indicate that the output expression for a calculated field is sent directly to database engine rather than being processed by Stonefield Query by turning off the new Stonefield Query Expression setting. This can result in better performance, especially if the user filters on that field, and the output expression can use functions built into the database engine.
- A new datasource type, ADO, is now available, making it easy to query against ADO data sources. You can also now read a database structure into the data dictionary using an OLE DB provider.
- The WebService datasource can now accept an ADO.NET DataSet from a Web Service, making it easy to query against an ASP.NET Web Service that returns a DataSet. Also, error messages returned from Web Services are now cleaner.
- Two new event scripts, ReportEngine.AfterReportPrepared and Scheduler.GetCommandLine, are available.
- The Refresh Table option is now disabled when you select a virtual table.
- You can now double-click a configuration setting in the list to toggle the value for that item to the next one in the drop-down list of values for that setting.
- Stonefield Query has better support for Oracle databases.
- The Configuration Utility now handles Access system databases properly.
- The Configuration Utility now handles tables and views defined in DBCX meta data properly, and uses Visual FoxExpress data dictionary properties for field captions and headings.
- The Configuration Utility does a better job of handling the case where a generic DSN like MS Access Database with no default database is chosen. It also handles the case where you originally read in the data dictionary from a DSN but that DSN no longer exists when you refresh the data dictionary.
- A bug that caused an error when reading the data dictionary for a database with multiple relations between tables with long names was fixed.
- A bug which prevented changes from being saved for a field when the only change you made was turning off the Enumerated Values or Display Field From Related Table options was corrected. A similar bug that prevented the proper image in the TreeView from being displayed when you changed only the Reportable status of a field was corrected.
- A bug that caused an error when the Add All Tables to Data Dictionary option in the Select Data Source dialog was selected was fixed.
Version 1.05
- There are several changes in Stonefield Query. See the What's New in This Version topic in the Stonefield Query help file (SFQUERY.CHM) for details on the new features.
- The progress of reading data structures from a database is now shown in the status bar.
- The Configuration Utility now handles non-reportable subtables properly, including displaying a "non-reportable" icon.
- A new utility, IMPORTFF.PRG, can be used to import reports created in FoxFire!, a reporting system from MicroMega Systems.
- The Application object now has a ReportsDirectory property.
- The Users collection now has a GetLicenseCount method.
- The DataSource object now has a Type property.
- Stonefield Query now properly handles the case where you've specified that some tables belong in a data group but others don't have any data group.
- The Submit button in the demo registration dialog now uses a localized message rather than a hard-coded English message.
- Stonefield Query now properly handles fields with punctuation symbols in their names (such as "E-Mail Address").
- A bug that prevented Stonefield Query from using the proper location for Visual FoxPro free tables was corrected.
- A problem in reading the structures of dBase tables was corrected.
- A bug that prevented projects from being encrypted properly was fixed.
- Under some conditions, Stonefield Query used an inner join for a report rather than the specified outer join. This has been fixed.
- A bug that prevented the proper logo from being displayed in the demo "welcome" dialog was fixed.
Version 1.04
- There are several changes in Stonefield Query. See the What's New in This Version topic in the Stonefield Query help file (SFQUERY.CHM) for details on the new features.
- The Enumerated Field feature now properly supports lower-case values.
- You can now refresh just a single table rather than the entire data dictionary if you wish.
- Different images are used in the TreeView for non-reportable tables and fields, making it easy to identify them.
- There are several changes in the files distributed to your users, so if you have created your own setup executable, make the necessary adjustments.
- C40FOX70.FLL and SOAP_CORE.MSM are no longer required.
- XICRCORE.DLL should now be installed in the Stonefield Query program directory rather than the Windows System directory.
- MSMAPI.MSM is now required, so be sure to add that merge module to your setup.
- GDIPLUS.DLL, MSVCR71.DLL, and XFRXLIB.FLL are new files that should be installed in the Stonefield Query program directory.
- A carriage return is no longer allowed in the Output Expression, Fields Involved, or Values Method properties for fields, the Complex Join property for relations, or the Filter property for subtables since that results in an invalid expression.
- A problem in reading the data structures from PostGreSQL was fixed.
- The Allow Values property for a field that displays a field from a related table is now disabled (and turned on), since Stonefield Query displays the values from the related table when the user clicks the Values button.
- Stonefield Query does a better job of using trusted connections to database engines where possible. Leave the user name and password blank when adding a database to the data dictionary to use a trusted connection.
- A new DataEngine.FilterChanged script is called when the user changes the filter in any way (adding, editing, or removing a condition).
- The DataEngine object has a new FilterConditions collection, which consists of FilterCondition objects. This gives you access to the filter for the selected report so you can examine it, change it, etc.
- There are new Options.Changed and Options.Validate scripts so you have more controls over changes to custom settings.
- Stonefield Query now filters the result set returned by a Select script for a table according to the user's filter for the report. This means your script no longer has to apply the filter, although it certainly doesn't hurt if your existing code does that. This prevents an issue where your script calls a stored procedure that doesn't provide any parameters for filtering, but the user applies a filter to the report.
- The following properties were removed from Field objects: Alias, AliasCaption, Database, and TableLocation properties. These properties were redundant because they belong to the Table object a field belongs to.
- If you want to supply some sample or standard reports with Stonefield Query, create them in your copy of Stonefield Query, export them to SFQ files using the Export Report function in the File menu, and then put them into a Reports folder under the Stonefield Query program directory. The first time a user runs Stonefield Query, it automatically imports any reports it finds in that folder, adding them to the list of reports that appear in the Report Wizard.
- The demo version no longer has a limitation of only creating three reports; the user can create as many reports as they wish. However, there are two new limitations:
- When the demo version is installed, it's initially a 7-day demo. This user can only preview reports, not print them or output to file, and after seven days, the demo stops operating.
- The 7-day demo version displays a dialog every time the user starts it asking if they want to register for a 30-day demo version. If they choose to do so, they're asked to enter some information (name, company, address, email address, and so forth) and submit the registration. This information is automatically emailed to you (it's emailed to the email address specified in a new Sales Email configuration setting) so you know who has downloaded a demo version and can hound them until they purchase it <g>. The user is emailed an activation code they can enter to convert the 7-day demo into a 30-day version. This means, of course, that they have to provide a valid email address.
- The 30-day demo version has all of the features of the full version of Stonefield Query, except it stops working 30 days after activation.
One consequence of this new demo version is that the demo version can no longer be activated to a full version, and that you can no longer install the demo version over the full one to update to the latest version. Instead, you must install the full version (it automatically uninstalls any existing demo or full version, but keeps any existing reports and other files intact) when upgrading from a demo version or an earlier full version. This is actually a good thing, because it means that someone must purchase software maintenance to obtain the latest full version; earlier, they could simply download and install the latest demo version even if their software maintenance had expired. Users whose software maintenance is up-to-date are provided a password to download the latest full version.
- A new type of license is now available: a runtime license allows the user to run a report but not create a new report or copy, edit, or delete an existing report. This is a less expensive license for those users who don't need (or you don't want) to create their own reports. As a result of this new license, the User Can Create, Edit, or Delete Reports option has been removed from the Maintain Authorized Users screen.
- Online activation is now available. Users are given a serial number when they purchase a license of Stonefield Query. In Step 3 of the Registration dialog, they enter the serial number and click the Online button to obtain an activation code immediately. The benefit of this mechanism is that they don't have to wait for anyone to get back to them with an activation code.
- Previously, if you filled in the Data Group property for any tables, those tables you didn't assign to a data group didn't show up in Stonefield Query. Now, those table show up when the user chooses the All data group.
- A 255-byte character field in a database is now by default treated as a 254-byte character field rather than a memo field; this allows the user to sort on and use the Values button for these fields. You can manually change them to memo fields in the Configuration Utility if you wish.
- A bug that caused an error when running a report which accesses a database in which the physical database name is different than the logical name was fixed.
Version 1.03
- There are several changes in Stonefield Query. See the What's New in This Version topic in the Stonefield Query help file (SFQUERY.CHM) for details on the new features.
- You can now have several databases of free tables. The second database is named "freetables2," the third "freetables3," and so forth.
- A problem with refreshing the data dictionary for databases consisting of free tables was fixed.
- The list of fields used for defining relationships between tables no longer includes calculated fields; they can't be used since they don't actually exist in the database.
- In previous versions, creating a relationship between tables didn't always create a node in the TreeView under "Relations" for the related table (the node appeared if you closed and reopened the Configuration Utility). This has been corrected.
- The Default Table for New Reports configuration setting now only includes reportable tables in the drop-down list.
- A utility in the Utilities subdirectory, VMP2SQ.PRG, assists developers using Visual MaxFrame Professional (VMP).
Version 1.02
- There are a lot of changes in Stonefield Query, including a new Cross Tabulation Wizard for creating cross-tab reports. See the What's New in This Version topic in the Stonefield Query help file (SFQUERY.CHM) for details on the new features.
- Stonefield Query now supports multiple languages for all messages and captions. The Stonefield Query Resource Editor allows you to translate the English strings used in Stonefield Query to any other language.
- You can now specify that a field from a related table is displayed when the user selects a particular field in a report.
- A new Data Group property for tables allows you to logically group your tables.
- A new Caption property for databases displays as the descriptive name for the database if only one data source is available.
- There's a splitter control in between the TreeView and the Properties pages in the Configuration Utility so you can control the relative widths of these items.
- There are several new configuration settings. The Description for Data Source (Plural) property is used in places where a plural name is used (for example, "databases"). Support Multi-Languages indicates whether more than one language is supported; if so, the user can choose what language to use in the Options dialog. Default Language is what language is used in Stonefield Query by default. Default Data Group for New Reports specifies the default data group used for new reports.
- The Application object now has GetINIValue and SetINIValue methods.
- Two new event scripts, Application.Shutdown and DataEngine.BeforeResultSetRetrieved, are now available.
- The sample project has been updated to show the use of data groups and displaying fields from related tables.
- Several bugs in reading data dictionary information from a data source were corrected, including handling more than two relations between the same set of tables.
- Issues involving tables with spaces in their names were resolved.
Version 1.01
- The new Email option in the Output Options page of the Report Wizard allows you to email a report as a PDF attachment without first previewing the report. You can also specify that a report is emailed automatically using command line parameters.
- Previously, Stonefield Query had a limit of 16,000 fields in the data dictionary. This limit has been removed.
- The Filter dialog now comes up much quicker than before, especially when you have a lot of tables and fields in the data dictionary.
- A bug that caused an error when creating help files for a project was fixed.
- Several problems with the Advanced Preview window were resolved, including the disabling of the "Use Advanced Preview Window" option in the Options dialog.
- A bug that caused an error when the SQL statement for a report was changed in the Edit SQL dialog was fixed.
- Most data dictionary properties for fields, such as Reportable and Filterable status, are no longer overwritten when you refresh the data dictionary. Only information about the structure of the field (data type, size, and decimals) are updated, as is Caption if the caption in the database has changed and the Caption property in the data dictionary was the default.
- A bug that prevented the proper field from being displayed in a report when the report included a calculated field that referenced a field in another table was fixed.
- A bug that caused the filter for a report to be ignored when a field was added and the report previewed in the Quick Report Wizard was fixed.
- The Fields collection has a new AliasFilter property.