If your subscription is current, send me a private email and I will give you download instructions.

Code:

---------------- 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.

<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:

Who is online

Users browsing this forum: No registered users and 6 guests

You cannot post new topics in this forumYou cannot reply to topics in this forumYou cannot edit your posts in this forumYou cannot delete your posts in this forumYou cannot post attachments in this forum