Page 1 of 1

New FTDN June/Junio 2013 (FWH 13.06)

Posted: Mon Jul 08, 2013 6:53 pm
by Antonio Linares
June 2013
=========

* New: Method Set( cItem ) CLASS TDbCombo, now initializes properly the shown item:

http://forums.fivetechsupport.com/viewt ... 08#p146508

* Fix: There was a bug in Class TMsgItem Method Refresh() that caused a resources
leak. Now it is ok:

http://forums.fivetechsupport.com/viewt ... 54#p146554

* Fix: Recent Class TDbCombo Method Set( cItem ) was not considering not string
values. Now it is ok:

http://forums.fivetechsupport.com/viewt ... 71#p146671

* New: XBrowse new DATA bDelete and new Method Delete()
oBrw:Delete() evaluates oBrw:bDelete if assigned and refreshes the browse.
SetRDD(), SetADO, SetOdbf, SetArray and SetTDolphin assign default bDelete codeblocks.
So, by default oBrw:Delete() deletes the current row and refreshes the browse for RDD, ADO
Array, TDataBase and TDolphin.

* Fix: XBrowse SetADO(). Even for numeric columns with more than 2 decimal places, xbrowse
was limiting the decimal places to 2 only. Fixed now.

* Fix: TDatabase class: Method Save() was not calling method Load() after successful save,
resulting in misleading result by method Updated(). Fixed now.

* DataRow.prg improved. Method Edit() uses suitable picture clause for numeric values.
DataRow created from XBrowse can handle edits and appends
* New: TDataRow class: New Methods
SetPrompt( cFieldName, cPrompt )
or
SetPrompt( { { cFieldName1, cPrompt1 }, ... { cFieldNameN, cPromptN } } )
Enbales seetting an alternative name to a field to be used as prompt
Example: oRec:SetPrompt( "first", "First Name" )
oRec:EditMethod uses the prompt to display name of field
Value of the field can be accesssed either as oRec:First or oRec:FirstName
Query prompt of field by oRec:FieldPrompt( 1 ) or oRec:FieldPrompt( "first" ) --> "First Name"

* Enhancement: FW_ShowAdoError( oCn, [lSilent := .f.] ) now returns the ado error object. New second parameter
if set to .t., suppresses display of message but returns the error object. When error is displayed line
number and process name also is displayed.

* The two new commands DBG and LOG introduced in FWH 13.05 are renamed as FWDBG and FWLOG to avoid conflicts with
names used in application programs

* XBrowse ADO: Improved handling of multi-user editing conflicts.

* Enhancement: FW_CreateMDB( cMdbOrAccDb, [ cPassWord ] ) now accepts optional password as second paramter.
If specified the MDB/ACCDB is created with the password.

* New sample: AdoXbr01.prg in fwh\samples folder. For beginners, demonstrates creation of access database,
creation of table, copy from dbf and xbrowse with Add, Edit and Delete.
In particular demonstrates the simplest way of using AddNew(), Update() and GetRows() methods of ADO

* XBrowse: In the method SetRDD(), bSeek codeblock is created only if the programmer did not already
specified bSeek codeblock before calling SetRdd. This is to provide backward compatibility with some
legacy software where SetRDD is never called in the program

* New ADO Functions:
1) FW_CreateAdoTableSQL( cTable, aCols, [oCn], [lAddAutoInc] ) --> cSql

This function returns cSql that can be used for creation of the table by oCn:Execute( cSql )
The programmers can examine the Sql statement, make alternations if neeeded and then create the table.

aCols is an array same as DbStruct() of DBF. Appropriate column types are chosen by the function
suitable to the RDBMS used by the oCn ( connection object ).
Memo fields are considered as text only fields and suitable field type is selected by the function.
If field is to be created to hold binary data like photos, etc., filed type "M" may be changed to
"m" before calling the function.

Notes: oCn defaults to previously used connection and lAddAutoInc defaults to .t.

2) FW_CreateAdoTable( cTable, aCols, [oCn], [lAddAutoInc] ) --> lSuccess
This function uses the first function to generate sql statement and uses it to create the table.
The table is created only if the tables does not already exist.

3) FW_AdoImportFromDBF( oCn, cDbfFile, [cAdoTable], [cColPrefix], [nMultiRowSize], [acFields] )

This function creates a Table in the sql database, based on the structure of the Dbf file and also
copies data from the dbf into the sql table, all in one go.

Parameters:
1. oCn : Connection Object. If instead a connection string/ spec is specified, the connection is
opened and closed after importing the DBF.
2. cDbfFile: Dbf file name from which data is to imported. If the file is not found or can not be
opened, the function aborts with a message.
3. cAdoTableName [Optional]. By default the DBF file name is used.
4. cColPrefix: [Optinal]. The function allows creation of field names which may confilct with reserved
words. This is done by escaping the column names suitable to the RDBMS.
However it is not desirable to have column names which conflict with reserved words. To guard
against this, the programmer may specify a string to be prefixed to each column name.
Example: If cColPrefix is specified as "C_", then each column created is "C_" + field name in DBF.
5. nMultiRowSize [Optional: Default 20]: This function used SQL "INSERT" statements to speed up import
instead of ADO's AddNew(). Though MSACCESS allows only single row inserts, most other RDBMS permit
multi-row inserts. By default for RDBMS other than MSACCESS, the function prepares one SQL statement
for 20 rows and inserts 20 rows at a time. The programmer can specify a different number instead of
the default 20. Multi-row inserts are faster than single row inserts.
6. caFields: [Optional]. The programmer can specify a comma delimited list of fields to be imported.
Eg. "FIRST,STREET,CITY,SALARY". Or the programmer can specify an limited part of the dbstruct() array
containing only the fields to be imported. The array should be of the same structure as a dbstruct() array.

4) FW_AdoTableExists( cTable, [oCn] ) --> lExists
5) FW_AdoTables( [oCn] ) --> aTables

* Fix: Class TRBtn Method ShowPopup() was not properly working when invoked from a RibbonBar button
action. Now it is ok:

http://forums.fivetechsupport.com/viewt ... 82#p147882

* Fix: MsgDate() is entering into infinite loop when the first parameter dDate is an empty date.
Now fixed.
http://forums.fivetechsupport.com/viewt ... =6&t=26699

* XBrowse and TDataRow for ADO: Assignment of Empty Date Value to a Date/DateTime field
of Non-Jet (other than Access) in Harbour results in runtime error. There is no such
problem with xHarbour. Implemented a work around for Harbour till the issue is resolved.

Re: New FTDN June/Junio 2013 (FWH 13.06)

Posted: Tue Jul 16, 2013 5:19 pm
by Antonio Linares
Junio 2013
==========

* Nuevo : Método Set( cItem ) en la clase TDbCombo, ahora se inicializa correctamente el elemento:

viewtopic.php?p=146508#p146508

* Corrección: Había un error en la clase TMsgItem, en el método Refresh() que causaba pérdida de recursos. Se ha solucionado el problema.

viewtopic.php?p=146554#p146554

* Corrección: En la clase TDbCombo, el método Set( cItem ) no estaba teniendo en cuenta valores que no fuesen de tipo cadena. Se ha solucionado el problema.

viewtopic.php?p=146671#p146671

* Nuevo: En la clase XBrowse, nuevo DATA bDelete y nuevo método Delete(). oBrw:Delete() evalua bDelete si ha sido asignado y refresca el “browse”. SetRDD(), SetADO, SetOdbf, SetArray y SetTDolphin asignan por defecto el bloque de código bDelete.
Así, por defecto oBrw:Delete() borra la fila actual y refresca el “browse” de RDD, ADO, Array, TDataBase y TDolphin.

* Corrección: Se ha corregido la función SetADO en XBrowse. Incluso para las columnas numéricas con más de 2 decimales, xbrowse estaba limitado a 2 decimales.

* Corrección: Se ha corregido el método Save() en la clase TDatabase. Este método no estaba llamando al método Load() después de una grabación satisfactoria, dando un resultado engañoso al utilizar el método Updated().

* Mejora: Se ha mejorado DataRow.prg. El método Edit() usa una máscara adecuada para los valores numéricos. DataRow creada a partir de XBrowse puede manejar ediciones e inserciones.

* Nuevo: En la clase TDataRow, nuevo método SetPrompt( cFieldName, cPrompt ) o
SetPrompt( {{cFieldName1, cPrompt1}, … {cFieldNameN, cPromptN}} )
Permite poner un nombre alternativo a un campo para ser usado como “prompt”.
Ejemplo: oRec:SetPrompt( “firts”, “First Name” )
oRec:EditMethod usa el “prompt” para mostrar el nombre del campo.
El valor del campo puede ser accedido como oRec:First or oRec:FirstName o como consulta al prompt del campo como oRec:FieldPrompt( 1 ) or oRec:FieldPrompt( "first" ) --> "First Name"

* Mejora: FW_ShowAdoError( oCn, [lSilent := .f.] ) ahora devuelve el objeto error ADO. Nuevo segundo parámetro, si es puesto a .T., no se muestra el mensaje de error pero devuelve el objeto error. Cuando se muestra el mensaje de error se muestran también el número de línea y el nombre del proceso.

* Actualizado: Los dos nuevos comandos DBG y LOG añadidos en FWH 13.05 han sido renombrados como FWDBG y FWLOG para evitar conflictos con los nombres usados en aplicaciones.

* Mejora: En XBrowse ADO se ha mejorado el manejo de los conflictos de la edición multiusuario.

* Mejora: En la función FW_CreateMDB( cMdbOrAccDb, [ cPassWord ] ) se ha añadido un segundo parámetro opcional (contraseña). Si se especifica el fichero MDB/ACCDB es creado con contraseña.

*Nuevo: Nuevo ejemplo AdoXbr01.prg en el directorio fwh\samples. Para los principiantes, muestra cómo crear bases de datos Microsoft Access, crear tablas, copiar desde DBFs y xbrowse, con Add, Edit y Delete. Muestra de una manera simple el uso de los métodos AddNew(), Update() y GetRows() de ADO.

* Compatibilidad: En el método SetRDD() dela clase XBrowse, se crea el bloque de código sólo si el programador no ha especificado el bloque de código antes de llamara a SetRDD. Esto es para proporcionar compatibilidad con programas heredados donde SetRDD nunca es llamado en el programa.

* Nuevo: Nuevas funciones ADO:
1) FW_CreateAdoTableSQL( cTable, aCols, [oCn], [lAddAutoInc] ) --> cSql
Esta función devuelve cSql que puede ser usada para crear la tabla mediante oCn:Execute(cSql).
Los programadores pueden examinar la sentencia SQL, hacer modificaciones si son necesarias y entonces crear la tabla.
aCols es una matriz igual a DbStruct() de DBF. Los tipos apropiados de las columnas son elegidos por la función adecuada al RDBMS utilizado por el objeto conexión oCn.
_ Memo son considerados sólo como campos de texto y el tipo adecuado de campo es elegido por la función.
Si el campo se va a crear para almacenar datos binarios como fotos, etc, el tipo “M” puede ser cambiado a “m” antes de llamar a la función.
Notas: Por defecto, oCn usa la conexión previa y lAddAutoInc se pone a .T.

2) FW_CreateAdoTable( cTable, aCols, [oCn], [lAddAutoInc] ) --> lSuccess
Esta función utiliza la primera función para generar la instrucción SQL y la utiliza para crear la tabla. La tabla se crea sólo si la tabla no existe.

3) FW_AdoImportFromDBF( oCn, cDbfFile, [cAdoTable], [cColPrefix], [nMultiRowSize], [acFields] )
Esta función crea una tabla en la base de datos SQL, basada en la estructura del fichero DBF y también copia los datos del fichero DBF a la tabla SQL, todo en un sólo paso.

Parámetros:
1. oCn: Objeto conexión. Si es especificado en lugar de una cadena de conexión, la conexión es abierta y cerrada después de la importación del fichero DBF.
2. cDbfFile. Nombre del fichero DBF desde donde se importarán los datos. Si el fichero no es encontrado o no puede ser abierto, la función cancela el proceso con un mensaje..
3. cAdoTableName [Opcional]. Por defecto se usa el nombre del fichero DBF.
4. cColPrefix: [Opcional]. La función permite la creación de los nombres de campo que pueden tener conflicto con palabras reservadas. Esto es hecho “escapando” los nombres de columnas adecuados al RDBMS. Sin embargo, no es deseable tener nombres de columnas que entren en conflicto con palabras reservadas. Para evitar esto, el programador puede especificar una cadena de caracteres como prefijo de cada nombre de columna.
Ejemplo: Si cColPrefic se especifica como “C_”, entonces cada columna es creada como “C_”+ el nombre de campo en la DBF.
5. nMultiRowSize [Opcional: Por defecto 20]. Esta función usa la sentencia SQL “INSERT” para acelerar la importación en lugar de la función de ADO AddNew(). Aunque Microsoft Access sólo permite inserciones de fila individuales, la mayoría de otros RDBMS permiten la inserción multifila. Por defecto para RDBMS diferentes a Microsoft Access, la función prepara una sentencia para 20 filas e inserta esta 20 filas a la vez. El programador puede especificar un número diferente en lugar de las 20 por defecto. Las inserciones multifila son más rápidas que las inserciones simples.
6. caFields: [Opcional]. El programador puede especificar una lista separada por comas de _ a importar. Por ejemplo: "FIRST,STREET,CITY,SALARY". O el programador puede especificar una parte de la matriz dbstruct(), conteniendo sólo _ que serán importados. La matriz debería contener la misma estructura que la matriz dbstruct().

4) FW_AdoTableExists( cTable, [oCn] ) --> lExists
5) FW_AdoTables( [oCn] ) --> aTables

* Correción: En el método ShowPopup() de la clase TRBtn. No estaba funcionando correctamente cuando era llamado desde la acción de un botón RibbonBar. Ahora funciona correctamente.

viewtopic.php?f=3&t=26445&p=147882#p147882

* Corrección: La función MsgDate() entraba en bucle infinito cuando el primer parámetro dDate era una fecha vacía. Ahora funciona correctamente.

viewtopic.php?f=6&t=26699

* Solución temporal. XBrowse y TDataRow para ADO. La asignación de un valor de fecha vacía a un campo Date o DateTime en RDBMS diferente a Microsoft Access da error en tiempo de ejecución en Harbour. Esto no ocurre en xHarbour. Se ha implementado una solución alternativa para Harbour hasta que se resuelva el problema.