<?xml version="1.0"?>
<!-- PsiDat XML Export -->
<History>
<RECORD>
<Revision>v1.23</Revision>
<Details>Added toolbar icons for devices with screensize 640x240 or above.

Modified the Index selector so that it doesn't appear when switching to a different table (but reselecting the same table will offer the index selection)

Added 'Save Def' button to the 'Show OPL Code' dialog. This saves a new database file to c:\PsiDatTableDef containing details of the tables fields and modifiers. This can be useful for documenting table designs - eg. by creating an HTML page.

Added an option to show or hide the fieldnames/aliases. This uses the global variable showlabels%. To avoid confusion, this variable is always switched to true when switching tables or on startup (otherwise the user might not notice that they had switched to a subtable). This option also affects the appearance of single record HTML output.

The underscore character "_" can now be used within table and field names (but must not be the first character)

Modified the HTML export dialog so that the path defaults to that containing the current database.

Added a keyboard shortcut for 'Show Summary Values'

New PsiDat icon - reflecting the program's relational capabilities instead of the 'flat-file' rolodex-style.

Improved the options dialogs so that they are more consistent and easier to add additional variables.

Added option to include the current datetime at the foot of HTML exports.

Added &lt;CUR&gt; currency field modifier for doublefloat fields. The output style can be controlled from the General Options dialog.

Improved layout on Osaris

Added userhelp$ variable for the user-defined helpfile. It still defaults to myfile$+".hlp" but can be altered by the userauto: routine if desired.

Added custom header, footer, and meta tag options for the HTML exports.

The 'Default Table' dialog can create a special table zPsiDatHTML. This table has three default entries; 'header', 'footer', and 'meta'. If the Used field is non-zero, then the raw contents of the HTML field will be inserted in all HTML exports in the appropriate place.

It's also possible to create special entries for particular tables, eg.

Suppose that we have a table called 'Index' that needs different headers, footers, and meta entries to the other tables in the database. three entries would be added to the zPsiDatHTML table called :-
Index-header
Index-meta
Index-footer

When PsiDat exports HTML it checks for page-specific headers first, and if none exists, reverts to the default ones. It is therefore easy to change just the meta entries or change/remove headers or footers separately.

This can be used to standardise the output with navigation menus, copyright notices, CSS files etc.</Details>
</RECORD>
<RECORD>
<Revision>v1.22</Revision>
<Details>Working version used to try out some new features in v1.23 (v1.22 was not publically released)</Details>
</RECORD>
<RECORD>
<Revision>v1.21</Revision>
<Details>Added some basic field colour-coding, eg red for negative values.

Added a unique decimal number generator function urn:

Added a unique text key generator function ui:([#]). The current value of the field must be passed as #, eg. if used as a calculation for the first field, the field modifier function would read :-
ui:([1])

It should be noted that the text field should be a minimum of 14 characters long (ideally 15 characters) and that there are a maximum of 100,000,000 unique numbers available per day. Both urn: and ui:(#) use the same counter and the integer portion represents the number of days since 1/1/1900. The decimal portion is incremented from zero each day.

The numbers generated are unique (on the machine that created them) across all databases and tables, even if PsiDat is removed and reinstalled at a later date.

If a database containing these numbers is copied to another machine, the numbers may not be unique, although they are within databases (unless other tables are copied/merged in).

The purpose of these functions is to provide a unique key field for certain types of lookup table. ui:([#]) provides the unique key and urn: indicates a modification (which can be useful for synchronisation purposes).

Added an option to specify whether &lt;P&gt; or &lt;BR&gt; is used in the HTML output for a carriage return character. This means that memos can be formatted more naturally if desired.

Added a &lt;LIN&gt; field modifier. This causes a line separator to appear above the field name and enables jumping to a particular separator using the '.' key. When '.' is pressed, the nearest line separator is displayed and the user can select one using the arrow keys and the Enter key.

Improved the restructure routine so that LongText8 (Memo) fields can convert to Text and vice versa within the limits of the text field size.

Improved the dBASE imports so that badly structured headers are treated in a more robust manner.

Added a standalone CSV-import option that can cope with CSV files created by applications that don't enclose all fields in quotes. This routine can also import memo fields.

NB: There is some overlap in functionality between the text and CSV import routines. In general the text import is much quicker, but the CSV import can cope better with problematic files and can also handle memo fields. 

Modified the 'Merge In' option so that it can use CSV files as well as PsiDat/OPL tables.

Added facility to explore a help/lookup file from within the popup table. Pressing the Tab key will allow the lookup table to be browsed. Pressing Ctrl-D (or tapping the "«" toolbar button) will switch back to the calling table. This feature can use up to 10 nested levels. The &lt;NDR&gt; field modifier can be used to switch off this ability.

Added a facility to handle nested levels of sub-records. The &lt;SUB&gt; field modifier should be followed by the name of the sub-table. Anything after the sub-table name should be preceded by a space. The fieldnames in both parent and sub-table must match. Pressing Shift-O (or tapping the "»" toolbar button) will jump into the sub-table (child records) and Ctrl-D (or tapping the "«" toolbar button) will switch back to the parent table.

The 'CustomerOrders' example demonstrates both features.

Added a &lt;LCK&gt; field modifier to prevent numerical, datetime, and text fields being modified. This is especially useful with sub-table key fields but can also be useful to prevent tampering with &lt;NOW&gt; datestamps.

Modified the &lt;L2F&gt;, &lt;L3F&gt;, and &lt;L4F&gt; modifiers so that they are no longer restricted to text fields.

Fixed a minor error in the Show OPL Code routine.

Altered the field properties dialog so that it uses multiline editing for the field modifiers. The label for this field is now standardised as 'Modifiers' regardless of the field type. The field properties dialog has been enhanced so that it remembers its position between calls and a linebreak now has similar functionality to a tab character.

Added a flag file option for emulating smaller screen sizes.

Added the &lt;CIZ&gt; field modifier for numeric fields. This instructs PsiDat to calculate the field only if it is empty or equal to zero.</Details>
</RECORD>
<RECORD>
<Revision>v1.20</Revision>
<Details>Modified the HTML option dialogs and added a simple preview option (the '?' button). This allows the colour scheme to be seen but will not show special fonts and features such as background images.

Added &lt;FONT&gt; tag option to HTML options so that user can specify the font size and other attributes.

Added extra HTML colour options. (Note for translators: there are significant changes to the category 20 resources in this version)

Modified the HTML defaults so that they use the websafe 216 palette.

Produced a standalone tool 'WebCol' for colour users to assist with defining HTML colours.

Added two more default colour schemes and changed the call method so that it uses a choice field plus one button instead of a button for each scheme. Also added an option to copy the OPL code to generate the current scheme to the clipboard.
Modified HTML export so that soft line breaks are handled correctly in normal text fields.

Added &lt;DT1&gt;, &lt;DT2&gt;, &amp; &lt;DT3&gt; field modifiers for doublefloat fields. These display a value in seconds as a datetime, date, or time component string respectively.

Added &lt;HNM&gt; field modifier. This is used to seed the filename dialog for HTML single record output based on the value of this field. Also made it easier to select single or multiple (tabular) HTML output by adding a separate menu cascade item and keyboard shortcuts.

Enabled a user-routine to alter the default HTML export filename just before calling the dialog. A user-defined procedure is called as follows:-
userhtmlname$:(&lt;filename&gt;)
&lt;filename&gt; is the PsiDat-generated default. If this procedure exists in a user's custom OPL routine then it should return an alternative filename or the &lt;filename&gt; parameter originally passed. This allows more sophisticated naming rules to be generated and always runs after the routine used by the &lt;HNM&gt; field modifier.

Improved the HTML export dialog so that the linkback text and URL are retained by default until the current table is changed.
Improved the quality and compatibility of the HTML output - especially with Mozilla and other compliant browsers.

Added some auto-recovery to cope with database files that have corrupt indexes.</Details>
</RECORD>
<RECORD>
<Revision>v1.19</Revision>
<Details>Fixed minor bug in field properties routine that prevented the correct field number being shown.

Improved the datetime accuracy; it's now possible to set and obtain the number of microseconds and the calculation limits on very low and high dates have been removed.

Added a 'Filename' option to the text field 'Special Use' options. This enables a fileselector when the field is tapped, allowing a filename to be selected or the field to be blanked.

Resource file editors should note that resource item 181 is now deprecated and has been replaced by a new item 457.

Fixed bug in listview that could cause the Data.OPX to panic if a new record has just been created in a table with an index.
Improved the simple search facility so that the user can enter their own wildcards.

Improved the sound-playing facility so that a sound can be cancelled by pressing a key.

Improved the table lookups and split list view so that you can jump to a position by pressing the first letter of the required entry.

Fixed minor bug in pen routine that could cause a subscript error if a pen tap occurred above the first field.

Tidied up some problems with calculations, searches and SQL queries (including auto SQL filters) involving strings that include single and double quotes.

Improved the memory handling when launching embedded files.

Improved the handling of custom OPL source code when stored in the 3rd record of zPsiDatDefaults. When this file is launched, modified and translated, the option to replace it will update the .opo executable in record 2 as well as the changed source in record 3.

Improved the Text export routine so that it can included LongText8 (Memo) fields. There is an additional option hidden away in the Options | General | &gt; dialog called 'EPOC *.TXT'. When this is ticked, exported text will use &amp;06 for lineends instead of &amp;0D&amp;0A (crlf) combinations. This makes it easier to export text for the standard Data application.</Details>
</RECORD>
<RECORD>
<Revision>v1.18</Revision>
<Details>Improved the predefined SQL Query selector so that it uses a lookup-style window instead of a dialog box. The picklist button has been changed to the tab key so that it is easier to call up the picklist.

Added a split view mode. The autowidth list view is still available using shift-V but the far left screen pen action and tab key now call up a modal split-screen view. While navigating the list, the left and right arrow keys alter the field displayed. The favoured column is remembered while the table is open and a default can be set using the &lt;SPV&gt; field modifier. During split view, the toolbar buttons and position bar are disabled; any pen event outside the list or record scrollbar will return PsiDat to the normal card view.

Added a feature so that a user-defined pattern background can be used instead of a solid colour - copy an EPOC picture named 'background.mbm' into the PsiDat application directory and it will be loaded instead of any colour selection if the 'Use Wallpaper' option is set. On greyscale machines, a 16 colour background tile will automatically switch PsiDat to 16 colour mode on startup.

Added url:() and img:() string calculations to aid web page developments.

Improved the handling of LongText8 fields when in editmode so that the user does not attempt editing without switching to the memo dialog.

Added options for setting the preferred list view width and maximum start position for the field editboxes.

Improved the 'N'ew Record keypress action so that a &lt;NOW&gt; DateTime or Lookup/Help with &lt;CD&gt; modifier escapes the dialog.

Improved the lat/long fields so that if RealMaps is not running, PsiDat will attempt to obtain the NMEA data directly (at 4800 baud) instead of by polling the RM.SIG file. The &lt;NOW&gt; field modifier may also be used with lat/long fields to force a RealMaps or GPS read when creating a new record.

Fixed a minor display bug that could occur after a table merge.

Enabled user-defined helpfile: If a standard Data file 'MyFile.HLP' exists in the same folder as a PsiDat database called 'MyFile' then this can be accessed as well as the main helpfile.

Added the field number to the field properties dialog title.

Altered the binary file embedding dialog so that it initiates with the same directory as the database file and subsequently remembers the selected directory.</Details>
</RECORD>
<RECORD>
<Revision>v1.17</Revision>
<Details>Fixed minor bug that prevented the tablelist and indexlist being updated after importing text and dbase files.

Tidied up the behaviour when a user attempts to open an EPOC data file that has no records.

Modified the embedded file launch routine so that it is easier for the system to recognise an HTML file and launch it in the default browser.

Some security has been added so that the user is warned and given the option not to run a custom OPL routine the first time it is run on their machine.

Fixed problem that prevented v1.16 running properly on machines with codepage 1250 localisation patch.

Altered the dialog boxes slightly when running on the Osaris so that they fit the screen better.

Made it possible to force a completely blank new record (ie. 
ignore all &lt;CD&gt; and autofield modifiers) by typing Shift-N.

The trailing space character on DateTime fields set to display 'Date only' has been removed.

The autofiltering routine has been improved so that it works properly with Date fields on systems that use the US or Japanese date ordering (provided that the PsiDat settings match those in the control panel).

The default forcing of zero times on Date fields has been restricted to those fields that use the &lt;SQL&gt; field modifier.
A new function ParseSQL$:(string$) has been added. This is used by the SQL search dialog and allows the user to enter the following:-

#TODAY#
(to indicate today's date)

#TOMOR#
(to indicate tomorrow's date)

These can be used together to filter records before, after, or on today's date, eg:-

WHERE Date&gt;=#TODAY# AND Date&lt;#TOMOR#
returns only records with today's Date

WHERE Date&lt;#TODAY#
returns only records before today

WHERE Date&lt;#TOMOR#
returns only records up until midnight today

WHERE Date=#TODAY#
returns only records with the DateTime value (Today at 00:00:00am)

NB: Once the filter has been searched or applied, the SQL dialog displays the parsed SQL so if you want to save it for the picklist, this should be done before using it.

Added option to use a Word file instead of a jotter file as the 'Rich Text' type for LongBinary fields (see 2nd page of the 'General Options' dialog).

Improved the printing setup so that PsiDat should be able to remember the selected media.

Added option to view/manually change the SQL statement for the current table OPEN  statement. This is shown on 2nd page of the 'General Options' dialog. This can be used by advanced users to perform special sort views (eg. FOLDED SELECT to sort without case-sensitivity). However, if you alter this manually and get it wrong, PsiDat will crash - though it's very unlikely any data loss will occur because the table is closed normally before attempting to open the view.

Enabled a basic print function that does not require a report layout to be prepared. This allows longtext8 (Memo) and MBM pictures embedded in longbinary fields to be printed as a continuous list.</Details>
</RECORD>
<RECORD>
<Revision>v1.16</Revision>
<Details>Fixed bug in dBase IV export dialog that prevented escape if the filename was invalid (ie. too long for dBase IV).

HTML 'Back' default is now included in the resource file so that it can be localised.

The filepath used for HTML exports is now maintained during a session.

Buttons used in 'Create Table' dialog have been changed to make it quicker to use (ie. the tab and enter keys are used to move up and down the fields)

Improved the table and index selection by using an ordered lookup instead of a dialog box.

Added additional error-checking so that ordered lookups revert to unsorted ones when no suitable index exists on pre-ER5 machines.

Improved reporting of record numbers - PsiDat can now report record numbers in excess of 65535 provided that the table contains at least one text field.

Modified the table closure routine so that compaction of large (&gt;500KB) databases is optional.

Speeded up multiple record deletion for large databases.

Made it possible to add text 'on-the-fly' to user-defined lookup and help tables in a similar fashion to the built-in zPsiDatLookups ones (limited to the lookup field only but can be useful)

Lookup fields can now be manually cleared even if an empty string is not included in the lookup table.

Improved the text cursor.

Added a text calculation function TNStr:() that can be used to insert tab and new paragraph characters into calculated text fields.

eg. TNStr:([1]^t[2]^p[3]^t[4]) would concatenate fields 1-4 so that '^t' would be replaced by a tab and '^p' would be replaced by a new paragraph character (ASCII 6).

Provided a simple way of copying any text or numeric field to the clipboard by tapping it with the Ctrl key held down.
Modified the new record routine so that the user is instantly in edit mode (unless the record is created from the toolbar since this may not always be desirable).

Removed limit on number of 'copy-down' (&lt;CD&gt;) field modifiers.
Added 'rollback' feature and improved use of transactions to improve memory usage on large databases. If rollback is available, it is indicated by a light (green) band behind the position indicator bar. Shift-Esc will rollback when available. NB: Use of First or Last record will commit the current transaction.

Additional comments :-

Rollback is not available if the table has an index.
Explanation: if records are added, deleted, or revised so that their position changes, then attempting to rollback corrupts the table. (Interestingly, deleting all the indexes for the table seems to recover the database but DbRecover: fails to do the same - this looked too dangerous to try and work around so Shift-Esc on indexed tables just commits the transaction).
On colour machines, incomplete transactions on indexed tables are indicated by a pale red band.</Details>
</RECORD>
<RECORD>
<Revision>v1.15</Revision>
<Details>Added HTML option - 'Single Record'. When this is ticked the HTML export routine will output the current record being viewed in a record view. This is ideal for creating reports of single records (eg. a 'Memo' database)

Improved the HTML output quality including right-aligned numbers, summary values, &amp; fonts.

Added option to specify a user-defined &lt;BODY&gt; tag for both the multi- and single-record HTML outputs. NB: if used this will cause the multi-record background colour to be ignored (although it can obviously be included manually in the user-defined tag).

Added option to specify a maximum number of records per page for multi-record HTML exports. Leave this at zero to put all records on a single page. When a number is input, a series of pages will be generated. Eg. a page with filename 'mypage' would output pages called 'mypage1.htm', 'mypage2.htm' etc. 

The pages are hyperlinked together with a simple navigation at the bottom of the page.

Improved the keyboard editing to make it possible to modify all field types (including helps and lookups) without using the screen pointer.

Increased the size of the memo editing box for the Netbook / Series 7

Modified the display routine so that, if the last field is a memo type, it will display to the bottom of the screen when 'Show Memos' is set in the preferences.

Altered the toolbar button size for large displays so that they look more consistent with other EPOC applications.

Added &lt;SQL&gt; field modifier and 'AutoFilter' option. When the &lt;SQL&gt; modifier is added to a numeric, datetime, or text field type, it enables an automatic filter to be applied based on the current record's values for those fields. This can be quickly applied by pressing the keyboard shortcut shift-F

For example, a list of orders may have (text) 'client' and (numeric) 'order' fields. Adding the &lt;SQL&gt; field modifier to these would result in a query like :-

WHERE client='My Client Ltd' AND order=1234

or whatever the current values for these fields were. This provides a simple method of creating a relational-style sub-table without overcoming the display size constraints and lack of true table joins in EPOC databases.

As a result of this, it has been necessary to deprecate the auto-generation of time data for DateTime fields that are set to display only dates. Applying SQL filters to dates has always worked fine provided that less-than/more-than rules were applied. However, absolute date queries would fail because SQL only functions with absolute dates and cannot check the time component of the DateTime field which was invariably not set to 00:00:00 (12:00:00 am)
v1.15 will therefore set the time component of DateTime fields to zero for all new DateTime fields that are set to display date-only. This modification affects new dates created with the &lt;NOW&gt; modifier or when a blank datetime field is edited. It also affects existing fields that are updated automatically by the &lt;MOD&gt; modifier. DateTime fields set to display both date and time, or time-only, are unaffected. It is still possible to enter a specific time or use the 'Now' button in the DateTime editing dialog.

This has the (small) potential to prevent existing databases from working as expected, so this behaviour can be prevented by a custom OPL routine that includes the following line in the userauto: procedure:-

forcezero%=0

The HTML export routine titles have been modified slightly to take advantage of the AutoFilter functionality. It is recommended that the &lt;NOE&gt; field modifier is used in conjunction with &lt;SQL&gt; to optimise the HTML output with the autofilter activated (because the current autofilter fields are now shown at the head of the HTML report when the autofilter is activated).

The range of the &lt;CD&gt; ('Copy Down') field modifier has been extended to include the DateTime field type.

Windows-1252 encoding in XML export is now an option because many applications don't recognise encodings yet and produce errors.

Improved the retention of the current record when exporting and reduced the dependence on bookmarks.

Enabled creation of new PsiDat databases using the system 'New File' command, provided PsiDat is not already running. This also means that PsiDat databases will appear in the 'Recent Files' launcher.

Modified the 'Merge In' facility so that if the receiving table has a unique index, it will receive new unique records and discard those that cause key violations.

Improved the colour icon renaming so that the colour version of the PsiDat icon becomes visible properly the first time PsiDat is run.</Details>
</RECORD>
<RECORD>
<Revision>v1.14</Revision>
<Details>Improved the 'Save As' and 'Restructure' routines so that field properties are copied over and adjusted to suit modified/moved fields.

Improved the 'Delete Table' routine so that associated field properties stored in zPsiDatFieldInfo are deleted along with the table.

Added an error trap to the DoPrint: procedure.

Added &lt;MXW&gt; field modifier to force lookup/help popup width to maximum.

Added &lt;L2F&gt;,&lt;L3F&gt;,&lt;L4F&gt; field modifiers to force custom lookup/help popups to display 2,3,&amp; 4 text fields instead of only one in each line.

Added confirmation dialog to confirm use of aliases as fieldnames in 'Save As', 'Restructure' and 'Export... dBase' routines. This helps to avoid common errors that occur when trying to create tables with invalid fieldnames. The extra dialog box only appears when aliases are already switched on. This hasn't been added to the text export routines because use of the aliases will tend to be desirable or easy to spot in the output file anyway.

Changed the default title for HTML export files so that the application name is used where specified.</Details>
</RECORD>
<RECORD>
<Revision>v1.13</Revision>
<Details>Fixed a few bugs and inconsistencies in the filtered lookup routines. These mainly affected filtered lookups using real number criteria when the decimal separator was set to a comma instead of a decimal point.
However, the text field lookup was also affected.
All of these are issues are fixed in this release.

This has also highlighted an international issue with regard to calculations that include constants.

For example, the calculation:-

[1]*17.5/117.5

will work on machines with the decimal separator set to a decimal point but not if it is set to a comma.

One workaround is to specify the same constant without a decimal separator, eg:-

[1]*35/235

will work regardless of the decimal separator.

An alternative, where real constants have to be used, is to make use of the built-in real global variables provided, ie. u(1) to u(100) and set these via a custom OPL routine containing a userauto: procedure:-

PROC userauto:
u(1)=17.5 REM UK VAT rate
ENDP

The calculation string could then be changed to:-

[1]/( u(1) / (100+u(1)) )

Another alternative is to put all the required constants in a separate table and refer to them using xref:()
(In this example this might be the best choice anyway since a VAT rate will vary between countries and would be better as a user-defined value).

XRef has been modified so that it can also obtain datetime variables. The syntax for the access string with a datetime lookup against a text variable would be "$D" (ie. 'D' represents a datetime). The numeric equivalent of the date is returned for numeric fields and a full datetime string for a text field.

A feature has been added to the field properties procedure to make debugging of lookup tables and calculations easier. Immediately after changing a field's properties (or at least pressing 'Enter' to confirm them), single tap calculations/lookups are debugged. This mode is aborted as soon as a full record recalculation is carried out or a new table selected.

The XRef function and lookups/helps have been modified so that embedded quotes can be accepted.

Added &lt;MF&gt; (Male/Female) modifier for bit fields.

Added &lt;AP1&gt;, &lt;AP2&gt;, &lt;AP3&gt;, &lt;AP4&gt;, &lt;AP5&gt; modifiers for field using helps - these cause the help result to be appended to the current field instead of replacing its contents.
Improved pasting text into a field.

Added XML export to the HTML export options.</Details>
</RECORD>
<RECORD>
<Revision>v1.12</Revision>
<Details>Fixed bug in text import routine that made negative numbers import as text rather than numbers.

Added 'Delete all records in view option'

Fixed bug that prevented last record being shown in list view and added horizontal scrolling via the keyboard and left column fieldname info.

Modified general-purpose file dialog so that files in the system folder can be accessed for embedding objects.

Modified DayNm$:(n$) function so that it can process DateTime fields directly as well as numeric fields. The function will also work with text fields containing dates provided that the date layout matches that set in the general properties.

Improved the speed and overall range of the date functions and added the missing one - IsToday:([1])

Added text functions Date:([1]), Time:([1]) to extract the relevant portion from a datetime field.

Added Mid:([1]|n1|n2), Left:([1]|n), Right:([1]|n) text functions. 

Example; if field 1 contains numeric value 12, then 
Right:(00000[1]|5) returns 00012

Added function Month:([1]) and text function MonthNm:([1])

Added 'Rich Text' as a special use for LongBinary fields. This is a bit of a cheat really, although quite effective; a Jotter template ('PsiJot' - stored in the PsiDat application directory) is used to create a single-tap entry into an embedded jotter file 'edit-view' without toolbar. As soon as the field is tapped, the jotter file is launched (after creating a blank one if the field is empty). If the Jotter file has changed then closing it will bring up the normal 'File has changed. Update ... ?' dialog with an extra (delete) option.

A table lookup cross-reference function xRef: has been added for calculated fields.

Lookup definition for separate lookup tables has been enhanced. The lookup can be filtered according to criteria entered after the table name, eg. for a lookup table called 'mylook' being called from field 2, you can now enter, eg. :-

mylook WHERE price &gt; 0.1 AND price &lt; 0.3

or

mylook WHERE price &gt; [1]

to only list lookups with a value greater than that in field 1. Sort order can also be appended, eg.
mylook WHERE price &gt; [1] ORDER BY price

Minor revision to the HTML export routine to deal with non-breaking spaces and single newlines in memo fields.

Fixed bug in the dBase export that occurred when a PsiDat table contains field types other than 0-11 or 14 (ie. fields that cannot be converted to valid dBase types)</Details>
</RECORD>
<RECORD>
<Revision>v1.11</Revision>
<Details>Added field modifier &lt;ST&gt; which makes cursor start at the beginning of the text instead of the end when editing.

Added field modifier &lt;NOA&gt; which prevents text being auto-added to helps.

Changed the way that user-defined OPL routines are used. USER.OPO is no longer supported. To use an OPO file it must be embedded in the 2nd record of the zPsiDatDefaults table. This means that user-defined functions and menu can be included in a single PsiDat database. If more than one PsiDat session is open they can all use separate user OPO files provided that they do not have the same filename. The OPO file is created in the PsiDat application directory and named &lt;mydb&gt;.OPO where '&lt;mydb&gt;' is the name of the database that the file is embedded in.

Added the facility to prevent the user from changing the table to any of those beginning 'zPsiDat...' This is done by entering a password in the first field of the 2nd record in zPsiDatDefaults so it is particularly effective when combined with a user menu. To unlock a locked database, type '~' to access a password dialog.

Improved the field editing so that the pen may be used to position the cursor within a field as it is being edited.

Swapped the shortcut key from 'Restructure' to 'Show Record Info' so that programmers defining their own menu can prevent any structural changes to their database if desired.

Added hidden keyboard shortcut to switch to RealMaps if it is running (shift-K). The same function to return has been added to RealMaps v5.09 so shift-K alternates between the two programs if they are both running.

Fixed bug that prevented number formats being shown correctly in reports (though summary values are still unaffected by these).

Added WeekDay:(n) function to return the day number (1-7) from a datetime field or its numeric equivalent.

Added Day:(n) function to return the number of days since 1/1/1970 from a datetime field or its numeric equivalent.

Added DayNm$:(n$) text function to return a three character day-of-the-week name from a number ("1"-"7")

Modified the Text and HTML export so that the user can select which fields to export. The field modifier &lt;NOE&gt; causes the field to be switched off by default.

Added Ctrl-B and shift-Ctrl-B options to toggle field and label text attributes (bold &amp; italics on/off).

Improved dBase export routine so that fieldnames that are truncated to ten characters are always unique.

Added &lt;HTM&gt; field modifier. If this flag is used then no text-to-HTML conversion is used on the field when exporting HTML

Added the tab key character to those that can be used to separate modifiers from calculation strings and lookup table names. For new applications it is recommended that this character is used in preference to the space or comma (the advantage of the tab character is that it can be used in text calculations/concatenations - everything from the tab onwards is ignored when performing calculations/lookups).

Enabled 'Paste' (Ctrl-V) function during field editing.

List View - By tapping the far left of the screen or typing shift-V a list view is shown. Use the scroll bar or up/down keys to navigate and then tap on the desired record. Pressing Esc or tapping the toolbar will abort maintaining the original record position. Pressing Enter will move to the top record in the view.

Changed the default export filename for TXT, HTM, and DBF files to the current tablename plus the '.TXT', 'HTM', or 'DBF' extension.

Provided predefined global variables for user's custom routines :- GLOBAL u(100),u%(100),u&amp;(100),u$(20,255)

Modified the 'Show Summary' output so that if an SQL filter is applied, the SQL string is shown under the database and table information.

Added character map feature (shift-Ctrl-C) to the field edit routine. This is slightly different to the built-in EPOC function because the entire character set can be used. Invisible or awkward characters to the left of the cursor are reported as 'CHR$(...)' after a keypress.</Details>
</RECORD>
<RECORD>
<Revision>v1.10</Revision>
<Details>Modified PsiDat's Icon (again) so that it looks better and is in colour under WINS and on the Series 7/Netbook

Added option to change the background and label colours.

Altered language selector so that toolbar buttons are immediately updated when changing language.

Fixed k$(116) bug in dBase import dialog and a few missing text strings.

Modified 'Save As' and 'Restructure' routines so that if the view is filtered with an SQL query, only the matching records are copied over to the new table.

Changed the PsiDat temporary field definition filename from PsiDat.DAT to  PsiDatTempData to avoid OPL dialog extension bug.

Added some additional international text strings to the resource file.

Modified the record positioning system. The record position bar is now displayed for filtered views and can position anywhere in a view. In filter view the colour is changed from white to grey so that the user is still aware that the view has an SQL filter applied. When the total records in the view exceeds 65535 (an OPL limit), the absolute record number is indeterminate and the bar is shown black. However, tapping on the bar will still move to the required position in the file. The 'Goto' option will also function correctly for any number of records, but will take an increasingly long time to get there when the number of records exceeds 32767. NB: If a field is edited in a sorted table, the record position will be inaccurate until a Goto, Search, First Record, or Last Record position change. There is no way around this without losing the current record.

Improved use of transactions to speed up a number of table-writing routines and reduce the size of the open database while it is being processed.

Database compaction has been modified so that it is controlled by PsiDat instead of activated by the system everytime a file is closed. This will ensure that all files are still compacted on exit or when a table is switched, but should speed up the manipulation of very large tables since they will not be compacted when PsiDat has to close them temporarily.

Added new field modifier &lt;INF&gt;. This causes the field contents to be displayed along with the record number when the 'Show Record Info' option is enabled. Up to three fields can be flagged in this way. It is important to note that adding/deleting this feature on a field is only activated when the table is opened in order to keep the speed up.

Fixed minor bug in the import text dialog.

Added 'Merge In' facility.

Added date convenience functions for use in field calculations, eg. you could calculate the following for a datetime in field 1:-

Before:(2001,4,5,[1]) ie. is the date before 5th April 2001 ?
After:(2000,4,4,[1]) ie. is the date after 4th April 2000 ?
ThisYear:([1]) ie. is the date in the current year ?
ThisMonth:([1]) ie. is the date in the current month ?
ThisWeek:([1]) ie. is the date in the current week ?

All of the above return 1 for true or 0 for false

WeekNo:([1])
 - returns the week number based on the EPOC machine settings for the first day of the week.

DateTime:(2001,4,5,15,30,0)
- returns the equivalent numerical value of 5th April 2001 3:30pm

Now:
- returns the equivalent numerical value of the current system time

Added field modifier &lt;DEF&gt; which causes a default value to be entered when adding a new record.  The value to be entered must follow the &lt;DEF&gt; modifier and be the last item in the field modifiers.

Added field modifiers &lt;UC&gt; and &lt;LC&gt; to display text in upper and lower case respectively.

Modified the text calculation routine so that it can call a procedure with a single string variable. The routine must return a string variable and is called without the '$' in the procedure name. Eg. to call a routine PROC mymod$:(var$) and insert the value of field number 2, you would use :- mymod:([2])

This allows any number of user routines to be called by putting an OPL executable file called USER.OPO in the PsiDat application directory.

Example databases removed from installer.

WINS version now includes required OPX SIS files in installer.

Modified the 'Save As' and 'Restructure' file save dialog so that if the selector is seeded with a filename containing an extension, the user is asked to confirm whether the new filename should include this or not. (A 'feature' in the EPOC file selector means that if the dialog is initially seeded with the filename 'OldFile.DAT' and the user inputs a new filename 'NewFile', the selector actually returns the input filename as 'NewFile.DAT' - when this happens the user is now asked to confirm whether they mean 'NewFile' or 'NewFile.DAT')</Details>
</RECORD>
<RECORD>
<Revision>v1.09</Revision>
<Details>Fixed display error when stopwatch is used with scrollbars.

Tidied up icon a bit

Fixed error in displaying language variants for toolbar button text.

Made menu texts more consistent with design guide.</Details>
</RECORD>
<RECORD>
<Revision>v1.08</Revision>
<Details>Completely redesigned Lookup and Help text dialogs. The text size now matches that in the current view and the texts will now tolerate empty string values. This means that empty strings can be used to blank Lookup fields.

DateTime field entry dialog now defaults to the value in the field rather than the current time. A new button ('Now') has been added to update the value to the current Date/Time.

Next/Previous repeat bug on faster EPOC devices has been fixed.

Scrollbar support has been added.

Fixed bug that prevented a database being loaded when 'Use MBM Banner' was ticked in the default table dialog but no picture was present.

Fixed exit bug in 'Save As' dialog.

Added international support. New language versions can be created by making a copy of PsiDatRSC.English, renaming it to PsiDatRSC.&lt;new language&gt;, loading the new copy into PsiDat, and translating the text strings into &lt;new language&gt;. It's also possible to create new language versions of this helpfile and rename them to PsiDat-&lt;new language&gt;.HLP</Details>
</RECORD>
<RECORD>
<Revision>v1.07</Revision>
<Details>Added option to the preferences dialog to allow partial memo text to be displayed instead of &lt;MEMO&gt; - this is also useful when printing reports.

Lookup/Help table names can be left blank instead of specifying another table (also a comma may be used instead of a space before field modifiers/copy-down flags).

When the table name for the lookup is left blank, a new table 'zPsiDatLookup' is created to hold the information. It's also possible to add new items to this table by typing new text in the calling table (though to do this with Lookups it is necessary to enter the field in edit mode using the cursor keys from an adjacent field).

This facility should only be used for small numbers of lookup/help entries - especially if there are many fields in the database that make use of it.

Added Export to Idealist Natural Format

Added Export to Lotus Notes Structured Text.

Added Export to HTML

Improved fieldname and tablename error handling.

Modified the manual editing of Lat/Long modified real numbers so that you can enter eg. 51º30'35.6" as :-

51 30 35.6

or

51º30.5' as:-

51 30.5

To enter West or South coordinates you must add a '-' sign before the first figure.

Added 'Use Special Formats' to the options menu. This defines whether the &lt;YN&gt;, &lt;TF&gt;, and Lat/Long modifiers are used in the display and during text exports. The feature can be temporarily switched on and off in the export dialogs.

Added the last filename to the INI file so that PsiDat defaults to this in the 'Open Database' file selector.

Improved DBase import and Export routines. Support for 850-1252 and 1252-850 codepage conversion is now included. Added check on whether user has tried to export a dBase IV table without any memo fields so that option to use dBase III is given before proceeding (many PC databases fail to load these otherwise correctly-specified files).

Added support for LongBinary fields. These can store entire files and are handled as follows:-
EPOC picture files (MBMs) have their own built-in viewer which switches to the correct screen mode. This is pen- and cursor-enabled. The Esc key exits. It is also possible to Launch these files if another application has a file recogniser for them.
Word, Sheet, Data, and OPL .OPO files are recognised and launched quickly. Record files are similar but also have an option just to play the sound. This enables the sounds to be played quicker and also allows the Revo to play sound files even though it doesn't have the Record program.
Other files can be launched by the system if they have recognisable UIDs or file recognisers.
Any type of file can be stored and restored.

Added Calculation option to the Text field properties although this is currently limited to concatenation.

Added a demonstration database (ObjectExamples) to illustrate the use of LongBinary fields.</Details>
</RECORD>
<RECORD>
<Revision>v1.06</Revision>
<Details>Fixed bug that prevented a field being added when a table was restructured.</Details>
</RECORD>
<RECORD>
<Revision>v1.05</Revision>
<Details>Added option to switch off sounds.

Added DateTime field modifier &lt;MOD&gt;. This causes the field to always reflect the datetime of the last recalculation (ie. effectively it is a 'Record Last Modified' datestamp).

Fixed bug in report printing when centimetre unit was used.

Fixed major bug in the reading of indices that meant they were always read in ascending order. Unfortunately the bug extended to their creation as well which means that indices meant to be ascending were descending and vice-versa. The downside of this fix is that it will be necessary to delete and remake any ascending index. The upside is that browsing tables with indexes is now much faster.

Revised the 'Add Index' dialog to make it clearer where the user is in the creation process.

Added option to perform a full recalculation of all records in view during a 'Show Summary Values' or while printing reports.

Added Import Text option.

Added ability to restructure text field type to datetime type with intelligent analysis of format.

Modified the table selection process so that default tables do not affect the selection when adding/deleting indexes or deleting tables.

Added option to manually resize the memo buffer. This isn't required when reading existing memo fields but can be useful when you want to paste in large amounts of text.

Enabled &lt;PgUp&gt;, &lt;PgDn&gt;, &lt;Home&gt;, and &lt;End&gt; keys to move up and down the fields.</Details>
</RECORD>
<RECORD>
<Revision>v1.04</Revision>
<Details>Tidied up the display when switching tables.

Fixed bug in report title when loading report.

Tidied up the Change Table selection dialog so that it defaults to the current table. 

Added field display modifiers &lt;DMS1&gt;, &lt;DMS2&gt;, &lt;DMS3&gt;, &lt;DMS4&gt;, &amp; &lt;DMS5&gt; to the Latitude/Longitude (Double Real) fields to match the options in RealMaps

Eg. for a latitude of 35.96160 degrees:-
&lt;DMS1&gt; means display as 35.96160º
&lt;DMS2&gt; means display as 35º57.70'N
&lt;DMS3&gt; means display as 35º57.696'N
&lt;DMS4&gt; means display as 35º57'41"N
&lt;DMS5&gt; means display as 35º57'41.8"N</Details>
</RECORD>
<RECORD>
<Revision>v1.03</Revision>
<Details>Modified the way that DateTime field values are used in calculations. This allows proper calculations to one second accuracy for DateTimes within 65 years of 1/1/1970 and to 60 second accuracy for DateTimes over 65 years adrift of that date.

Enhanced the restructure routine so that it can convert datetime fields to text or numeric values.

Added a lottery number generator to the demo files - I never play the lottery myself but many people do and it makes a good demonstration of the new features introduced in v1.03

Added &lt;TF&gt; and &lt;YN&gt; as options for the 'Bit' field type. If the option &lt;TF&gt; is used, 0 or null values display as 'FALSE' and 1 displays as 'TRUE'. Similarly the &lt;YN&gt; option displays as 'YES' and 'NO'.

Also added the feature that you can enter the Bit field value of 0 with any word beginning 'f','F','n', or 'N' and the value 1 with any word beginning 't','T','y', or 'Y'.

Increased the available size of the calculation/special field again, this time up to the maximum of 255 characters. This increases flexibility, but some caution is required:- When a calculation field is processed, it creates a new string for the EVAL function to operate on containing the actual values of the fields used. If the new string length exceeds 255 characters then the calculation will not be processed.

Added a RANDOMIZE statement based on the current time to the recalculate all fields function. This makes the Dice application much more useful.

Added 'Latitude' and 'Longitude' options to the special use categories for floating point variables. These take their values from RealMaps external file support so they can be obtained from a GPS reading or by locating a position on a map and pressing Enter in RealMaps.

Added the facility to save SQL query strings in a system table 'zPsiDatQueries' so that they can be recalled into the SQL search dialog. New queries can be saved from here as well ; if you try to save another copy of the same query then you are given the option to delete it from the pick list.

Altered the logic slightly for opening and closing databases and tables. Ctrl-X closes a database and Ctrl-O can be used to change the current table within the current database.

Fixed bug in the restructure routine that prevented a table being created in the same database file as the source.</Details>
</RECORD>
<RECORD>
<Revision>v1.02</Revision>
<Details>Not released - change details shown in v1.03</Details>
</RECORD>
<RECORD>
<Revision>v1.01</Revision>
<Details>Fixed bug that caused the toolbar to be switched to the state it wasn't in last time you exited PsiDat.

Fixed bug that prevented restructure when you increased the total number of fields (I had eliminated this once - don't know how it crept back in to v1.00)

Added manual recalculation option to recalculate all fields.

Altered the shortcut for Restructure to R so that I could use r for manual recalculation of all fields.

Altered the 'New Record' routine so that it recalculates if 'auto recalc' is on.

Fixed bug which caused termination when you deleted the very last available record when calculations or copy-down fields were being used.

Modified the calculation/special field so it can take up to 80 characters instead of 64 and limited the equivalent field in zPsiDatFieldInfo to match.</Details>
</RECORD>
<RECORD>
<Revision>v1.00</Revision>
<Details>Modified datetime field so that it no longer defaults to the current date (you can restore this with the &lt;NOW&gt; option in the field properties).

Also added the option to 'blank' a datetime field.

Added copy to clipboard functions

Added summary operators &lt;CNT&gt; &lt;SUM&gt; &lt;AVG&gt; &lt;MIN&gt; &lt;MAX&gt; to the available calculation items in the numeric field properties (CNT = COUNT).

Added functions for reporting and printing

Added 'Goto Record' function.

Added 'Apply SQL as Filter' option.

Added an option whether zero values should be displayed.

Altered the general field edit routine so that pressing right-arrow, left-arrow, or the delete key while on a memo or datetime field gives access to the field. 

Added option to restructure table (note: a new table is created - it must have a different name from the source table). This allows numeric field types to be changed and fields to be added, deleted, renamed, and moved around.

Completely overhauled the create table routine - you can now move fields about and it is dialog-based instead of database table based.

When restructuring a table or using 'Save As' you can decide which fields to copy data over from the source or even decide to create an empty blank table.

Option to edit field definitions during a dBase import removed (there's too much to go wrong there; it's safer to import and then restructure if necessary)

Added a vertical bar to show the relative position in the database. You can move to a relative position in the table by tapping the bar. (Just in case you are wondering, I tried scrollbars but they were too slow for record navigation and looked as though they were a method for scrolling up and down the fields. I may add scrollbars for this later anyhow, so this seems better for record position. A horizontal scroll bar takes up too much room, especially on the Revo).

Added Ctrl-X as a shortcut to close the current table instead of the escape key so that it's harder to close a table by mistake (nice to see that combination resurrected from the series 3 !)

Added INI file to save settings.

Improved Clock display on the Revo.

Embedded required SIS files in PsiDat.SIS</Details>
</RECORD>
</History>

