Code: Select all
---------------- New to 2.0 (build 267) ----------
1489. Added new class: DC_BrowseMessage(). This is a convenient method of
displaying progress messages in a window that runs in another thread.
Message text, font and color is displayed in a browse object. See the
sample program in .\samples\browse\message.prg.
1488. Added new function: DC_BrowseSqlQuery(). This is a data browser that
uses the :dataBrowse class of Sqlquery, located in SqlQuery.Dll. It
employs all the features and advantages of browsing a workarea with
column filtering, exporting, printing, editing, etc. See the example
in .\Samples\Browse\Filtered.Prg
1487. Added new class: DC_DacSession(). This is a class that inherits from
DacSession(). It contains some new iVars that are required for
DC_DbGather() to do updates and inserts via SQL. The class has an
iVar named "SqlExecuteBlock". This is a code block that receives SQL
statements and executes the statement. This should contain a call to
your custom SQL execute function.
1486. Added new function: DC_GetSqlStatement(). This returns the SQL SELECT
statement for the current work area. If no SQL cursor exists, then it
will return "".
1485. Added new function: DC_GetSqlTableName(). This returns the name of the
table that is associated with the SQL statement for the current work
area. This is needed by DC_DbRecord2SqlUpdate() and
DC_DbRecord2SqlInsert() when creating the SQL UPDATE and SQL INSERT
statements from a record object.
1484. Added new function: DC_DbRecord2SqlUpdate(). This returns a SQL UPDATE
statement from a record object. The record object must contain a field
named UUID Char(36) and the field must not be empty. This is required
to insure that the correct record is updated.
1483. Added new function: DC_DbRecord2SqlInsert(). This returns a SQL INSERT
statement from a record object. If the record object contains a field
named UUID Char(36) its value will be set to UUIDToChar(UUIDCreate())
if it is empty.
1482. Added new <cNumPrefix> parameter to DC_Array2Csv() and
DC_WorkArea2Csv(). The default is '='. A <cNumPrefix> is placed before
each cell output that is a character string which starts with a number.
This insures that CSV files imported into Excel will display character
strings correctly. Use a "" null character for no prefix.
1481. Added new database management and query tool: SqlQuery.
SqlQuery.Exe is a tool written entirely in Xbase++ using eXpress++.
The Query tool allows a user to make multiple connections to ADS, ODBC
or PostGreSql data sources. Do don't need to know anything about SQL
to use this application to query all of your data tables.
A treeview window displays the tables, fields, views, scripts and index
info for each data connection.
It allows you to browse data in ISAM or SQL SELECT mode.
You can pick fields (columns) to browse then filter the data using a new
feature built into the eXpress++ DCBROWSE system that takes advantage of
SQL WHERE clauses for fast filtering and ORDER BY for sorting.
You can tag rows and columns for printing or exporting to Excel, XML,
Json, HTML, Csv, Database, etc.
You can execute Views that are already in the data source or create your
own views using SQL commands and save them to the SqlQuery scripting
dictionary.
These features can also be built into your own applications and work
with workareas or arrays of data objects.
You do not need to use ADSDBE, ODBCDBE or PGDBE in your applications to
use this SQL capability in your applications if you are using .DBF/.CDX
files. You only need the free ADS client DLLs which are in the runtime
folder of the Xbase++ Professional Version.
(Ace32.dll,Axcws32.dll,aAdsLoc32.dll)
You do not need to create an Ads Data-Dictionary to use this capability
because SQL queries can be made against a set of free tables. However,
if you want to create a data-dictionary you don't need the Ads
Architect to do this. It can be created in SqlQuery.Exe.
See the SqlQuery tutorials on You Tube.
1480. Added new functions for converting Xbase++ values to JSON (Java Script
Notation).
DC_Var2Js()
DC_Array2Js()
DC_Object2Js()
These functions will work in Xbase++ 1.9 and 2.0.
1479. Added a new parameter to the DC_BrowseAutoseek() function.
<bScan> is a code block to use to do the Ascan() for the element
of an array if the data source is an array. If <bScan> is a NIL
the scan will be for a match in the edit buffer.
1478. Added new function: DC_FindGoodIndex(<cFieldName>).
This will search the index keys of all index tags to find the tag that
will match <cFieldName>. This is used to find an index that can be
used to seek a value that would be relevant to <cFieldName>.
1477. Added new parameters to the DC_DbScatter() function>
<cRecNoFieldName> is the name of the iVar in the record object which
will be used to store the Record Number (RecNo()). The default is
RECORD_NUMBER.
<cDeletedFieldName> is the name of the iVar in the record object which
will be used to store the DELETED status of the record (Deleted()).
The default is RECORD_DELETED.
<lTrimFields> will trim the values in iVars that are type C or M.
1476. Added 2 new functions: DC_VarSave() and DC_VarRestore(). These
functions will save and restore a variable of any type to/from a file.
DC_VarSave(<xVar>, <cFileName>) -> <lStatus>
DC_VarRestore( <cFilename> ) -> <xVar>
1475. Added 2 new parameters to the DC_AdsSqlStatement().
@<cXml> is a variable, passed by reference, that is used to store
the data as an XML stream.
@<cJson> is a variable, passed by reference, that is used to store
the data as JSON (Java Script Object Notation).
1474. Added new parameters to DC_DbRecord() / DC_DbRecordObject() functions.
DC_DbRecord([<cClassName>],[<cRecnoFieldName>],[<cDeletedFieldName>],
[<aFields>]):new()
<cRecNoFieldName> is the name of the iVar in the record object which
will be used to store the Record Number (RecNo()). The default is
RECORD_NUMBER.
<cDeletedFieldName> is the name of the iVar in the record object which
will be used to store the DELETED status of the record (Deleted()).
The default is RECORD_DELETED.
<aFields> is a single-dimensional array of field names (iVars) to
include in the record object. If <aFields> is a NIL, then all fields
in the work area will be included.
1473. Added new function DC_WTFWhen( <bWhen> ). This is used to set a code
block which will cause any WTF (debug) command in the code to be
suppressed when evaluating <bWhen> returns a .FALSE.
1472. Added 2 parameters to the DC_DbGather() function.
<oDacSession> is a DacSession() object that connects to a datasource
which supports SQL statements. This will be used as an alternative
method for updating or adding a record using SQL in the event that
a record could not be locked. This can happen if the current work area
is a STATIC SQL Cursor. If <lNew> is TRUE, then then an INSERT
statement will be created. If the current work area contains a field
named UUID, a new 36-byte UUID will be created. If <lNew> is FALSE
and a field named UUID exists and is not empty, then an UPDATE
statement will be created using the UUID to find the correct record
to update.
<cLockFailMsg> is the message to display if the record could not be
updated or added.
1471. Added new clauses to DCPUSHBUTTON, DCADDBUTTON, DCPUSHBUTTONXP and
DCADDBUTTONXP. The DELAYACTION <bActionDelay> CLICKDELAY <nDelay>
clause allows for 2 different actions for a push button. This is
intended for touch-screen applications however it also works with the
mouse. If the user holds the button for longer than <nDelay> seconds,
the <bActionDelay> code block will be evaluated, otherwise the regular
<bAction> code block will be evaluated. See the sample program in
.\samples\buttonxp\buttondelay.prg.
1470. Added a 5th parameter to DC_WorkArea2Csv() - <lHeader>. Default is
TRUE. Setting <lHeader> to FALSE will suppress the header in the
output CSV.
1469. Added many new features to the DCBROWSE system to give the user much
improved searching and filtering capability and performance. This
concept works with browses of arrays, record objects, ISAM work areas
and SQL work areas. To experiment with these features, run the
SqlQuery.exe program in the ..\SqlQuery folder.
a. New clauses for the DCBROWSE command:
SUBCLASS 'DC_XbpBrowseFiltered()' invokes a class that is used to
create a means for users to easily filter the browse when
right-clicking in the heading of the browse. It will drop down a
dialog for entering a value for filtering based on the contents of
the column. Filtering is done on an AND basis only, meaning that
filtering 2 or more columns will scope down to less and less records
being display. The filtering system will use dbFilter and scoping if
there is no SQLSESSION clause being used, otherwise it will use a SQL
statement with a WHERE clause, this being a much faster technique.
Left-clicking the heading will sort based on an Index tag that
matches the data, if one can be found, otherwise it will use the
ORDER BY clause of the SQL statement.
SQLSESSION <oDacSession> is a pointer to a DacSession() object that
supports SQL. This is used with the filtering system to create
sub-queries using the WHERE clause of SQL statements.
CACHECOLUMNS <nColumns> [AUTOADD] is used to improve performance when
creating a browse that has a lot of columns. <nColumns> is the
maximum number of columns that will be added to the browse regardless
of the number of DCBROWSECOL commands used. The remaining columns
will be cached and created "on demand" by several methods. AUTOADD
will create columns when the cursor or horizontal scrollbar hits the
last displayed column. Columns can also be added to the browse using
methods of the DC_XbpBrowseFiltered() class.
b. New clauses for the DCBROWSECOL command:
SUBCLASS 'DC_XbpColumnFiltered()' enables the filtering system for
the column as described above for 'DC_XbpBrowseFiltered'.
SQLFIELD <cSqlField> is the name of the database field that is
associated with the column. This is needed only if the column
heading is not the same as the field. It requires that the DCBROWSE
command also use the SQLSESSION clause so that column filtering
can use the WHERE <cSqlField> clause in the SQL statement.
SQLSORT is used to create a SORT button in the header which contains
the caption of the heading. This is only used as a replacement for
the SORT <bSort> clause. It requires that the DCBROWSE command also
use the SQLSESSION clause so that the sort can be accomplished using
the ORDER BY clause of an SQL statement.
INDEXTAG <cTagName> is provided for sorting using an INDEX (when
available). Some Advantage Server SQL cursors also provide indexes
that are in .CDX files to the work area. If the index is available
it will be used, otherwise an ORDER BY clause will be used.
CACHECOLUMN <nCacheMode> is used to override the default behavior of
column caching as set in the DCBROWSE CACHECOLUMNS command.
<nCacheMode> can be one of the following values:
DCBROWSECOL_CREATE_YES - Create column regardless of position of
column in the browse and the setting DCBROWSE
CACHECOLUMNs.
DCBROWSECOL_CREATE_NO - Do not create column regardless of position of
column in the browse and the setting DCBROWSE
CACHECOLUMNs.
IF this clause is not used, then the setting of DCBROWSE CACHECOLUMNS
will determine if the column is initially created.
See the example in .\Samples\Browse\Filtered.Prg. Source for how to
implement a Filtered browse is in .\Source\SqlQuery\Sqlquery.Prg.
Search for METHOD Sqlquery:DataBrowse.
1468. Fixed a bug in DC_XbpMle() caused by addition of Spell-x that can cause
a runtime error.
1467. In build 265, 2 new Get-Set functions were added due to complaints from
eXpress++ users that they wanted to control the behavior of the
SetInputFocus and KillInputFocus behaviors of DCGET objects. Those
functions are DC_XbpGetSetInputFocusBlock() and
DC_XbpGetKillInputFocusBlock(). They are used to set a code block for
the entire application's DCGET behavior. Now there has been some
complaints that when this was implemented the default behavior also
changed. If you want the same behavior as in builds 264 and earlier
then add the following to the beginning of your application:
DC_XbpGetSetInputFocusBlock(;
{|x,y,o| IIF(o:isGetDataOnLostFocus,o:getData(),nil), ;
IIF(!Empty(o:get:buffer),o:get:pos := o:savePos,nil), ;
o:DateFlag := .T., ;
o:home(), ;
DC_HiliteGets(o,1,o:getList:getOptions[nGETOPT_HILITECOLOR]), ;
DC_ColorGets(o,1,o:getList:getOptions[aGETOPT_COLORGETS]), ;
DC_PopupButtonShow(o,.t.)})
DC_XbpGetKillInputFocusBlock(;
{|x,y,o| o:savePos := o:get:pos, ;
o:DateFlag := .T., ;
IIF(o:isGetDataOnLostFocus,o:getData(),nil), ;
IIF(o:isGetDataOnLostFocus,o:setData(),nil), ;
o:Home(), ;
DC_HiliteGets(o,1,o:getList:getOptions[nGETOPT_HILITECOLOR]), ;
DC_ColorGets(o,1,o:getList:getOptions[aGETOPT_COLORGETS])}, ;
DC_PopupButtonShow(o,.f.)})
1466. Fixed a bug in DCTREEITEM that caused a tree branch to show double the
amount of tree items if branch was double-clicked the first time to
expand the branch.