Página 1 de 1

AdsConnection() tables

Publicado: Jue Nov 07, 2013 11:43 pm
por reinaldocrespo
Hi.
It seems to me like Frx's SetWorkArea() method does not work properly with Ads Remote server connection tables. I wrote a short self-contained sample to demonstrate. Using FrConsole.prg sample code provided with frx I added the function below. Then changed option #6 to execute TestWAdsConnection() instead of Sergey(). Execution stops right at :SetWorkArea( "customers" ) and never recovers.
Perhaps Frx's SetWorkArea() was never intended to work with ADS remote tables?
Please help.

//------------------------------------------------------------------------------
FUNCTION TestWAdsConnection()
LOCAL oReport, oCustomer, oOrders
CLS
@ 0, 0 SAY PadC( "*** FastReport Sergey compatibility mode sample ***", 80 ) color "N/W"
SetPos( 1, 0 )
? "Connecting...."

rddRegister( "ADS", 1 )
rddsetdefault( "ADS" )
ADSSetServerType( ADS_REMOTE_SERVER )
AdsSetFileType( ADS_ADT )
AdsRightsCheck( 1 )
AdsLocking( ADS_PROPRIETARY_LOCKING )
IF !AdsConnect60( "juanluis:49000adsdata2sfirestoremp.add", ;
ADS_REMOTE_SERVER, ;
"UserCode", ;
"Password", ;
ADS_TCP_IP_CONNECTION )
? "cannot connect to remote ads server"
RETURN NIL

ENDIF
? "Connected ...."

Dbusearea( .T. ,"ADS" , "customers","customers" , .T., .F. )
? "File Opened...."
WITH OBJECT oReport := frReportManager():New()
:SetWorkArea( "customers" )
? "WorkArea has been set...." // **This line never shows on console.
:bOnAfterLoad := {|| QOut( "Report loaded" ) }
:bOnClickObject := {|oSender, cObject| QOut( "Mouse click on object: " + cObject ) }
:bOnEndPreview := {|| QOut( "Report preview window closed" ) }
:bOnBtnSendMail := {|| Alert( "Email" ), 1 }
:bOnBtnPrint := {|| Alert( "Print" ), 1 }
:bOnBtnGenPdf := {|| Alert( "Gen PDF" ), 1 }
:cFilename := ".ReportsAdsConnection.fr3"
? "Ready to show...."
IF !lDesign
:ShowReport()
ELSE
:DesignReport()
ENDIF
:End()
END WITH
CLOSE ALL
ADSDisconnect()

? ""
? "Push any key to continue."
Inkey( 0 )
RETURN NIL

Reinaldo.

AdsConnection() tables

Publicado: Lun Nov 11, 2013 5:03 pm
por ignacio
Hello,
Without a sample or a error.log is impossible to know what is exactly happening on your code. I assume the program runs on a endless loop.
A ADS alias should work in the same way as any other DBF alias, so there should be no differences between a native RDD or ADS.
The code of frReportManager:SetWorkArea() is given, so it should be easy to put some traces on that code to see what is happening.
Sorry for not giving you a better answer.
Regards,

AdsConnection() tables

Publicado: Mar Nov 12, 2013 1:03 am
por reinaldocrespo
I did not realize the code for the function was provided. You are right, I should be able to trace the problem. Unfortunately I will be on a road trip for the next 10 days. I will get back to this subject as soon as I return.
Thank you.
Reinaldo.

AdsConnection() tables

Publicado: Vie Nov 22, 2013 2:13 am
por reinaldocrespo
Hi,
After doing some debugging of the source code that comes in frxsource I was able to find the problem.
It seems like this FR implementation can't handle extended field types. My source .adt table has a few fields of types other than C,N,D,L. As soon as a binary field is encountered on the source data, FRX brakes with this error information:
Quote:
"Error Base/1604 Argument error:Switch.

The error happens on line 423 of source file FrDataSet.prg.
To reproduce el error, create a .adt table including a Binary field type, a ModTime field type, and TimeStamp field type. Populate the table and then try using that table as the source data file on oFrx:SetWorkArea().
FYI- this is not a problem with Sergey's implementation of FastReports.
BTW - it takes forever and ever for the source data file to load into the array. In the meanwhile nothing happens. It causes the impression that the system is hung. You may reproduce this behavior by using a table with 500k records where each record contains over 30 fields.
Best regards,
Reinaldo.

AdsConnection() tables

Publicado: Vie Nov 22, 2013 10:45 am
por ignacio
Hello,
Please could you send a small ADS table with all those field types. TIA.
About your second issue:
1) I suggest you only send the fields you need to print
2) We can inmplement a event to show a progress bar when the report is loading its data, but that will consume also time. BTW, I believe is not very usual to create a report of 500,0000 records. Just for curiosity: How many output pages produces?
3) If at any time you move to a SQL BD, which I obviously recommend then you will have this same problem even with Sergey software.
4) I suggest you access through ADO as I told you before. Surely there is ADO for ADS. In that case the data goes directly to the report and is not treated by any Harbour code. BTW, I am almost sure that you will have the same lag.
Regards,

AdsConnection() tables

Publicado: Sab Nov 23, 2013 4:05 am
por reinaldocrespo
Ignacio;
Please feel free to use the code below to test with .adt tables. You will only need to populate the tables to test FRX.

//--------------------------------------------------------------------------------------
//function CreateTables() will create three tables using stnd harbour func dbCreate
//Each table structure is saved on an array following the std returned by dbStruct()
//Each element on the array is an array describing the field. Thus, the array
//for a table with 3 fields would look like this:
//aStructure := { { cFieldName1, cFieldType1, nFldWidth, nDecimals },;
// { cFieldName2, cFieldType2, nFldWidth, nDecimals },;
// { cFieldName3, cFieldType3, nFldWidth, nDecimals } }
//
//Function CreateTables() uses regular Clipper RDD calls. I rather do all this using
//SQL and will take the time on a later sample to show how to create and maintain
//tables using SQL while still using array structures to house table structure information
//with the same format used here which follows dbStruct() format.
STATIC FUNCTION CreateTables()
LOCAL cAlias := "MyAlias"
LOCAL afiles := {}
LOCAL cFileName, e
//---------------------- customers.adt --------------------------------------------
LOCAL aStruc := { { "cust_id" , "C", 10, 0 },;
{ "Sequence" , "AutoInc", 07, 0 },; //ADT extended field type autoincrement
{ "customer_name" , "C", 25, 0 },;
{ "Start_date" , "TimeStamp", 01, 0 },; //ADT extended field type
{ "Photo" , "binary", 01, 0 },; //ADT extended field type
{ "Notes" , "M", 10, 0 } }

AdsSetFileType( ADS_ADT )
TRY
dbCreate( ( cFileName := cPath + "customers" ), aStruc,, .t., cAlias )
( cAlias )->( OrdCreate( cPath + "customers", "cust_id", "cust_id" ) )
( cAlias )->( OrdCreate( cPath + "customers", "Start_date", "Start_date" ) )
( cAlias )->( dbclosearea() )
(cAlias)->( dbclosearea() )
AADD( afiles, { cFileName, "customers.adi" } )

//------------------------ sales.dbf -------------------------------------------------
//ADS_VFP should not be confused with ADS_CDX. The first is a NEWER fox pro table
//format that extends field types. I'm testing here with VFP tables to show the
//use of extended fields, but keep in mind that most xbase developers are still
//using regular CDX tables and for that you should use ADS_CDX filetype.

aStruc := { { "cust_id" , "C", 10, 0 },;
{ "invoice" , "C", 15, 0 },;
{ "s_date" , "TimeStamp", 01, 0 },; //VFP extended field type
{ "item_id" , "C", 15, 0 },;
{ "Units" , "N", 03, 0 },;
{ "Price" , "Money", 09, 2 },; //VFP extended field type
{ "Notes" , "M", 10, 0 } }

AdsSetFileType( ADS_VFP ) //Notice this is NOT ADS_CDX. Extended field types
//such as TimeStamp will not work with ADS_CDX.
dbCreate( ( cFileName := cPath + "sales.dbf" ), aStruc,, .t., cAlias )
( cAlias )->( OrdCreate( cPath + "sales", "invoice", "invoice" ) )
( cAlias )->( OrdCreate( cPath + "sales", "cust_id", "cust_id" ) )
( cAlias )->( dbclosearea() )
aadd( afiles, { cFileName, "sales.cdx" } )
//------------------------ items.dbf -------------------------------------------------
//Below I'm using old fashioned DBF/NTX tables. Very little value as opposed to
//ADT/ADI tables. The purpose here is only to show that it also works with ADS.

aStruc := { { "item_id" , "C", 15, 0 },;
{ "Desc" , "C", 25, 0 },;
{ "Price" , "N", 07, 2 } }

AdsSetFileType( ADS_NTX )
dbCreate( ( cFileName := cPath + "items.dbf" ), aStruc,, .t., cAlias )
( cAlias )->( OrdCreate( cPath + "itm_id",, "item_id" ) )
( cAlias )->( OrdCreate( cPath + "itm_desc",, "Desc" ) )
( cAlias )->( dbclosearea() )
aadd( afiles, { cFileName, "itm_id.ntx;itm_desc.ntx" } )
CATCH e

ShowError( cFileName, e )
afiles := {}

END
RETURN a files

On your #3, Sql bd? I think you meant SQL engine such as MS-SQL. If so, ADS is a perfect choice of SQL.
On #4, I'm quite happy with ADS as my sql of choice and as far as I know, i'm better off using the native ADS RDD + ACE than any ADO middleware. I really was never planning on abandoning ADS RDD + ACE in preference of any other SQL. I hope you can understand.
I don't want to give up on FRX, I think it has potential. IMO, this implementation of fast report is not better than Sergey's as you argue on your posts and I mean no offense. I only mean that Sergey's implementation did not force you to work exclusively with ADO. The main problem right now is what I perceive as a lack of interest on doing a more complete job with FRX. Instead of steering development away from native RDD and in favor of ADO, I think you should at least attempt to work with harbour's native rdds. Trust me, theres is going to be ADS RDDs for a long time.
I really do hope you are persuaded to try to make FRX completely compatible with ADSRDDs without forcing ADO. Also, please do consider implementing the use of datasources without loading the complete dataset into a memory array. Thank you.
Reinaldo.

AdsConnection() tables

Publicado: Sab Nov 23, 2013 4:48 pm
por ignacio
Hello,
On my tests the new field types are not recognised correctly and no value is shown on the report, but there is no run-time error.
BTW, the bug is fixed it will be available on next release.
Regards