ADS - The future is <sadly> now so where do you go ?

ADS - The future is <sadly> now so where do you go ?

Postby TimStone » Tue Apr 19, 2022 9:54 pm

For many years I have used ADS as a Client Server option for my customers. It is expensive but serves them well. However the last build was in 2015.

Although they advertise it still as a product they sell, I have finally confirmed that they effectively have set it for End of Life for December of this year. I have tried to get information from them about effective options for increasing the number of seats in the future, or making it available to new clients, but they have not been responding. All they have confirmed so far is that it is slated for maintenance termination on 12/31/2022, although there have been no updates for many years.

At this point I am facing the dilemma of modifying tens of thousands of lines of code to SQL, or simply sticking with DBFCDX peer to peer ( which is not good when some clients have 10-20 workstations ). NO, a web based solution will NOT work for my clients. Most do not have sufficient internet capabilities to perform their daily work, so it must be a local server setup.

I would like to hear of solutions others may have found for client server operations, or to efficiently handle a larger number of workstations on a network without failures. I do know some might recommend remote desktop but that is also not a preferred option.

I'm looking forward to hearing from those who may also be needing to embark on a change from ADS.

Tim
Tim Stone
http://www.MasterLinkSoftware.com
http://www.autoshopwriter.com
timstone@masterlinksoftware.com
Using: FWH 23.10 with Harbour 3.2.0 / Microsoft Visual Studio Community 2022-24 32/64 bit
User avatar
TimStone
 
Posts: 2904
Joined: Fri Oct 07, 2005 1:45 pm
Location: Trabuco Canyon, CA USA

Re: ADS - The future is <sadly> now so where do you go ?

Postby Giovany Vecchi » Wed Apr 20, 2022 12:19 am

Hi Tim, This motto I will also face. I use ads with data dictionary and ADT tables. I have LINKS, FUNCTIONS, PROCEDURES in the data dictionary. Builds the tAds class to transform each connection, resources and tables into objects. Today I'm studying Mod_harbour, I've already converted my tAds class to Mod_harbour and so the remote ads system will no longer be necessary. The advantage of using ads at the moment is that I have RDD and SQL commands together, but this only with Data Dictionary. My tables have complex division schemes as they use many blobs/binarys fields. I've studied other databases, and to do what I already have in operation will be very difficult. The hope of ads is that a dis he can be open source since I read in a forum years ago this possibility. For the time being I will take some action only after the bankruptcy of ads. From the current situation that ads are in, we still have a few years before we drown.
User avatar
Giovany Vecchi
 
Posts: 207
Joined: Mon Jun 05, 2006 9:39 pm
Location: Brasil

Re: ADS - The future is <sadly> now so where do you go ?

Postby Otto » Wed Apr 20, 2022 3:14 am

>My tables have complex division schemes as they use many blobs/binarys fields.

Hi Giovany,
can you please explain what you are doing exactly. Can't you use the file system instead?
Best regards,
Otto
********************************************************************
mod harbour - Vamos a la conquista de la Web
modharbour.org
https://www.facebook.com/groups/modharbour.club
********************************************************************
User avatar
Otto
 
Posts: 6005
Joined: Fri Oct 07, 2005 7:07 pm

Re: ADS - The future is <sadly> now so where do you go ?

Postby Rick Lipkin » Wed Apr 20, 2022 12:20 pm

Tim

ADO and Sql ( ms sql server, ms access ) is the database mechanism I have used for over 10 years .. 32 and 64 bit are both supported and is perfectly integrated into FiveWin .. the only difference is that you have to think of ADO in terms of an Objected oriented class and methods.

Rao has simplified much of the ADO syntax with many FiveWin wrappers .. Look in the \source\functions\adofuncs.prg ..

I use Sql Server for large corporate databases and MS Access as a local solution much like dbf\cdx. Have a look at the \samples folder and compile AdoRick.prg . be glad to help you ..

Rick Lipkin
User avatar
Rick Lipkin
 
Posts: 2616
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: ADS - The future is <sadly> now so where do you go ?

Postby Giovany Vecchi » Wed Apr 20, 2022 4:05 pm

Otto wrote:>My tables have complex division schemes as they use many blobs/binarys fields.

Hi Giovany,
can you please explain what you are doing exactly. Can't you use the file system instead?
Best regards,
Otto


Otto, I'm going to explain a case here. I have an agent table that has 320,000 names. The notary has to digitize the personal documents of each one. If I put it in just one table, this table will have a size of 60 gb. To solve the problem I had to separate the tables from 40 thousand to 40 thousand agents so that the tables were at most 10 gb.
Let's go to this table of documents of the agents I work with classes.

Class DB_AGE_DOCIMGS
Code: Select all  Expand view

//Classe gerada por TAds 13/08/2018 - 13:19:59
#Include "Fivewin.ch"
#Include "TAds.ch"

CLASS DB_N_AGE_DOCIMGS from TAds

    Data cTableName     Init "N_AGE_DOCIMGS001"
    Data nCache
    Data lConnected     Init .F.

    Method New() Inline Self Constructor

    METHOD OpenRdd(f_nSequencia,;       // Numero de sequencia de F_LANDES->SEQ_LANCA
                        f_nConexao,;        // Numero da Conexão - Default tAds_GetConnectionDefault()
                        f_nCache,;          // Numero de registros em Cache - Default nCacheAds()
                        f_lExclusive,;
                        f_lDataLoadOnSkip) ;
                        Constructor

    METHOD End()

    Method DB_N_AGE_DOCIMGS_TableInUse(f_nAgenteSeqAuto)
    Method DB_N_AGE_DOCIMGS_FilterAgenteSeqAuto(f_nAgenteSeqAuto)
    Method DB_N_AGE_DOCIMGS_SeekSeqAuto(f_nSequencia)


ENDCLASS
//-----------------------------------------------------------------------------
METHOD OpenRdd(f_nSequencia,f_nConexao,f_nCache,f_lExclusive,f_lDataLoadOnSkip) Class DB_N_AGE_DOCIMGS
    Local lc_aStructTmp := {}
    Local lc_iFor := 0, lc_nSeqsQta := 42000, lc_nSeqsCount := 1

    Default f_nCache := 16
   
    if f_nSequencia == 0
        f_nSequencia := 1
    EndIf

    ::nCache        := f_nCache
    ::nTpCallRdd    := 2
   
    For lc_iFor := 1 to 500 // qta de arquivos binarios
        if f_nSequencia >= lc_nSeqsCount ;
            .and. f_nSequencia <= (lc_nSeqsCount+lc_nSeqsQta)
            ::cTableName := "N_AGE_DOCIMGS"+StrZero(lc_iFor,3)
            exit
        Else
            lc_nSeqsCount += lc_nSeqsQta
        EndIf
    Next

    IF !ADSCHECKEXISTENCE(::cTableName,tAds_GetConnectionHandle())

        aadd(lc_aStructTmp,{"nSeqAuto","AutoInc",2,0,1,"Sequencia de inclusao da imagem",Nil})
        aadd(lc_aStructTmp,{"nAgenteSeqAuto","Integer",2,0,1,"Sequencia automatica de cadastro do Agente",0})
        aadd(lc_aStructTmp,{"nAgenteCodigo","Integer",2,0,1,"Codigo de ficha do Agente",0})
        aadd(lc_aStructTmp,{"cNomeFuncionario","C",50,0,0,"Nome do funcionario que digitalizou o documento",Nil})
        aadd(lc_aStructTmp,{"dImagemData","Date",8,0,1,"Data da criacao da imagem",Nil})
        aadd(lc_aStructTmp,{"lCCN_Enviar","L",1,0,0,"Se é para enviar a foto para o CCN",.F.})
        aadd(lc_aStructTmp,{"nCCN_EnvioStatus","Short",2,0,0,"0-Nunca Enviado 1-Preparado para enviar 2-Enviado por ultimo",0})
        aadd(lc_aStructTmp,{"dCCN_Enviado","Date",8,0,1,"Data do envio da Imagem",Nil})
        aadd(lc_aStructTmp,{"bImgFileBlob","blob",8,0,0,"Bytes do arquivo imagem",Nil})

        TAds_CreateTableFromCode(   f_nConexao,::cTableName,;
                                            lc_aStructTmp,;
                                            "Tabela das imagens dos documentos dos agentes")
     

    EndIf

    ::nCache        := f_nCache
    ::nTpCallRdd    := 2
    ::NewRdd(::cTableName,f_nConexao,::nCache,f_lExclusive,f_lDataLoadOnSkip)
    If ::nOpenStatus == 0
        ::lConnected := .T.
    EndIf

RETURN Self
//-----------------------------------------------------------------------------
METHOD End() Class DB_N_AGE_DOCIMGS

     If ::lConnected
         ::Super:End()
     EndIf

     Self := Nil

RETURN Nil
//-----------------------------------------------------------------------------
Method DB_N_AGE_DOCIMGS_TableInUse(f_nAgenteSeqAuto) Class DB_N_AGE_DOCIMGS
    Local lc_iFor := 0, lc_nSeqsQta := 42000, lc_nSeqsCount := 1

    if f_nAgenteSeqAuto == 0
        f_nAgenteSeqAuto := 1
    EndIf

    For lc_iFor := 1 to 500 // qta de arquivos binarios
        if f_nAgenteSeqAuto >= lc_nSeqsCount ;
            .and. f_nAgenteSeqAuto <= (lc_nSeqsCount+lc_nSeqsQta)
            ::cTableName := "N_AGE_DOCIMGS"+StrZero(lc_iFor,3)
            exit
        Else
            lc_nSeqsCount += lc_nSeqsQta
        EndIf
    Next

    If ADSCHECKEXISTENCE(::cTableName,tAds_GetConnectionHandle())
        ::cTableName := "N_AGE_DOCIMGS"+StrZero(1,3)
    EndIf

Return ::cTableName
//-----------------------------------------------------------------------------
Method DB_N_AGE_DOCIMGS_FilterAgenteSeqAuto(f_nAgenteSeqAuto) Class DB_N_AGE_DOCIMGS
   
    ::SetOrder("nSeqAuto")
   
    ::Filter("nAgenteSeqAuto == "+m_Str(f_nAgenteSeqAuto))

Return ::KeyCount()
//-----------------------------------------------------------------------------
Method DB_N_AGE_DOCIMGS_SeekSeqAuto(f_nSequencia) Class DB_N_AGE_DOCIMGS
    Local lc_lFound := .F.

    lc_lFound := ::Seek(f_nSequencia,"nSeqAuto")

Return lc_lFound
 


Now in practice I use it like this:
Code: Select all  Expand view

Method N_AgentesCadPf_DocImgs_Gravar(f_nAgenteSeqAuto) Class N_AgentesCadPf_DocImgs
    Local lc_oDbTmp_AgenteDocImgs
    Local lc_lAppend := .F.

    lc_oDbTmp_AgenteDocImgs := DB_N_AGE_DOCIMGS():OpenRdd(f_nAgenteSeqAuto)
    lc_oDbTmp_AgenteDocImgs:DB_N_AGE_DOCIMGS_FilterAgenteSeqAuto(f_nAgenteSeqAuto)

bla bla bla
 


In SQL commands:
Code: Select all  Expand view

   ::oDs_AgenteDocsImgs := tAds():DsNew(1/*Select*/, 1)
   Text Into ::oDs_AgenteDocsImgs:cQrySql
      Select {static}
      Tb01.* ,
      Tb02.*
      from N_AGENTES As Tb01
      Inner Join _!DataBaseAgentesImgs_ AS Tb02 ON Tb02.nAgenteCodigo = Tb01.nCodigoAgente
      __WHERE__ __ORDER_BY__ ;
   EndText
   ::oDs_AgenteDocsImgs:nCacheDefault        := 100 //Page
   ::oDs_AgenteDocsImgs:lDataLoadOnSkip      := .T.  
   ::oDs_AgenteDocsImgs:lDataLoadBinaryField := .F.  
   ::oDs_AgenteDocsImgs:lDsCursorsToTemp     := .F.
   Text Into ::oDs_AgenteDocsImgs:cDsWhere
      Where Tb01.nCodigoAgente = _nAgenteCodigo_
   EndText
   Text Into ::oDs_AgenteDocsImgs:cDsOrderBy
      Order By Tb02.dImagemData
   EndText
   ::oDs_AgenteDocsImgs:DsAddVar("_!DataBaseAgentesImgs_",DB_N_AGE_DOCIMGS():DB_N_AGE_DOCIMGS_TableInUse(f_nCodigoAgente))
   ::oDs_AgenteDocsImgs:DsAddVar("_nAgenteCodigo_",f_nCodigoAgente)
   ::oDs_AgenteDocsImgs:DsExecute()

 
User avatar
Giovany Vecchi
 
Posts: 207
Joined: Mon Jun 05, 2006 9:39 pm
Location: Brasil

Re: ADS - The future is <sadly> now so where do you go ?

Postby Armando » Wed Apr 20, 2022 4:21 pm

Tim:

I support the rick advise, Here you can found much support

Regrads
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3061
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: ADS - The future is <sadly> now so where do you go ?

Postby Otto » Wed Apr 20, 2022 4:33 pm

Hello Giovany,

> aadd(lc_aStructTmp,{"bImgFileBlob","blob",8,0,0,"Bytes do arquivo imagem",Nil})

I mean can't you use a file for each record instead of the blob field?
I used to have that problem too.
But it seems now that you can store as many files as you want in a directory.
Before (WINDOWS 2000!!! server), it was about 20000.
I do it this way with my document management.

My view - very personal

I think the file system is better than any database.
And now with mod harbour, if you have all the data on the same hard drive, you have all the possibilities.
And with the GOP you can handle the rights very well.

I have just started to develop an appointment management system for us in the company.
It is file based - no database!

viewtopic.php?f=3&t=41516&p=249036&hilit=time&sid=b1726e0c17bc7432904f164ad2b0b6d3#p249036

If you're interested, I'll send you the download link.

Best regards,
Otto
********************************************************************
mod harbour - Vamos a la conquista de la Web
modharbour.org
https://www.facebook.com/groups/modharbour.club
********************************************************************
User avatar
Otto
 
Posts: 6005
Joined: Fri Oct 07, 2005 7:07 pm

Re: ADS - The future is <sadly> now so where do you go ?

Postby Giovany Vecchi » Wed Apr 20, 2022 5:02 pm

Otto wrote:> aadd(lc_aStructTmp,{"bImgFileBlob","blob",8,0,0,"Bytes do arquivo imagem",Nil})

I mean can't you use a file for each record instead of the blob field?

In the agent register from code 1 to 42000 the table with the images is N_AGE_DOCIMGS001, after 42001 to 84000 the table is N_AGE_DOCIMGS002 and so on.

Scanned documents, images, pdfs, biometric templates, digital certificates and other things are in the tables because the server does not have active sharing of folders. Nobody accesses the server, only the program using ads server. And some employees work on their laptops outside the company, in their homes. It would be difficult for them to access a pdf document and digitally sign it by recording in folders. Now with mod_harbour this type of resource would no longer be necessary, however there is still a lot to be done on the web. The program has many modules.
Let's stay optimistic thanks to mod_harbour.
User avatar
Giovany Vecchi
 
Posts: 207
Joined: Mon Jun 05, 2006 9:39 pm
Location: Brasil

Re: ADS - The future is <sadly> now so where do you go ?

Postby Otto » Wed Apr 20, 2022 5:30 pm

Hello Giovany,

I understand. And yes.

Scanned documents, images, pdfs, biometric templates, digital certificates and other things are in the tables because the server does not have active sharing of folders.
Nobody accesses the server, only the program using ads server. And some employees work on their laptops outside the company, in their homes.
It would be difficult for them to access a pdf document and digitally sign it by recording in folders. Now with mod_harbour this type of resource would no longer be necessary,




That's why I'm lucky that I switched my clients to RDP a long time ago.
Now it makes it much easier for me.

Best regards,
Otto

Full text search with mod harbour
Image

Here is a screenshot of my DMS on the web with mod harbour.
Image
********************************************************************
mod harbour - Vamos a la conquista de la Web
modharbour.org
https://www.facebook.com/groups/modharbour.club
********************************************************************
User avatar
Otto
 
Posts: 6005
Joined: Fri Oct 07, 2005 7:07 pm

Re: ADS - The future is <sadly> now so where do you go ?

Postby Giovany Vecchi » Wed Apr 20, 2022 7:41 pm

RDP for me does not work. The terminals have A3 digital certificates (card), scanners, WebCams and biometric readers. Getting this to work in RDP is not easy.
User avatar
Giovany Vecchi
 
Posts: 207
Joined: Mon Jun 05, 2006 9:39 pm
Location: Brasil

Re: ADS - The future is <sadly> now so where do you go ?

Postby Otto » Wed Apr 20, 2022 8:23 pm

Hello Giovany,

We need smartcards to sign the invoices. We also have many connections such as dispensing systems, telephone systems, etc.
We use USB2NET and COM2NET adapters.
It works well.
Best regards,
Otto
********************************************************************
mod harbour - Vamos a la conquista de la Web
modharbour.org
https://www.facebook.com/groups/modharbour.club
********************************************************************
User avatar
Otto
 
Posts: 6005
Joined: Fri Oct 07, 2005 7:07 pm

Re: ADS - The future is <sadly> now so where do you go ?

Postby TimStone » Fri Apr 22, 2022 12:37 am

Giovanni,

Right now I have ongoing, daily, contact with SAP ( the owners of ADS ). This is not bankruptcy. They took away resources for further development apparently in 2015 ( the last release of ADS 12 ). Now they have used a funny term, but it is End of Life for 12/31/2022.

I have asked directly if they will release it to public domain, or give us access to update existing keys for more seats ( at no charge ). The problem is they can't even seem to find anyone in the company (SAP) who handles responsibility for this product even though their website says it is still available for sale. If you fill out a form as if you are a new client, no one will even respond, even though the form is still online.

It was my intention to convert to SQL and FWH has ample assistance, and samples, for doing this. My whole program is object oriented and perhaps once I start working with it, I will have success and move quickly through the process. I did use the FWH functions to actually convert my existing data files ( about 130 ) into a MySQL database, and that will be very helpful because the process is so simple. Now it is a matter of moving forward on implementing it within this massive application.

I am using FWH, Harbour, and MSVC ( Visual Studio Community 2022, and the latest builds of FWH and Harbour ). I am also fully focused on doing this in 64 bit ( and my application is fully running now as both 32 bit and 64 bit ) and all 3rd party libraries are updated.

So I will see how it goes. However, I can wait no longer to this conversion because we have no idea what will happen with ADS ... and it might even have some built in code that is date sensitive and it will stop working.

Tim
Tim Stone
http://www.MasterLinkSoftware.com
http://www.autoshopwriter.com
timstone@masterlinksoftware.com
Using: FWH 23.10 with Harbour 3.2.0 / Microsoft Visual Studio Community 2022-24 32/64 bit
User avatar
TimStone
 
Posts: 2904
Joined: Fri Oct 07, 2005 1:45 pm
Location: Trabuco Canyon, CA USA

Re: ADS - The future is <sadly> now so where do you go ?

Postby Jimmy » Fri Apr 22, 2022 2:37 am

hi Tim,

Alaska have made PgDBE using PostgreSQL

PgDBE does have ISAM "Emulation" so you "only" change DBE ( = RDD)
that is what Advertising say ... :roll:

---

even when change from NTX to CDX it was a lot of Work.
ADO seem a Solution as ActiveX "Layer" to Backend and it is OOP

but as long your ADS Server work there is no need to change a "running System" ...
p.s. Mod_harbour also can use ADS
greeting,
Jimmy
User avatar
Jimmy
 
Posts: 1585
Joined: Thu Sep 05, 2019 5:32 am
Location: Hamburg, Germany

Re: ADS - The future is <sadly> now so where do you go ?

Postby Rick Lipkin » Fri Apr 22, 2022 12:45 pm

Gentleman ... for those who want to see what ADO is like ... here is the adorick.prg ... notice also .. incorporated into the program is a integrated xbrowse incremental search using filters ( very fast ) .. also as you can see you can use plain old ansi Sql .. see how I create a new .mdb from scratch using code ..


Code ....
Code: Select all  Expand view

// Incremental Search

#include "FiveWin.ch"
#Include "Xbrowse.ch"
#include "dtpicker.ch"


STATIC oWnd,oBar,lOK,lOk1,oWndChild,oLbx
STATIC cLname,oLname,oFname,cFname,oFontB

Static dDatePur,oDatePur
//-------------
Func Main()

Local catNewDB,cFile,aDir,dExe,cDefa,mStart
Local oCn,cSql,oErr,oRsCust,cLOGIN,Saying,xLogin,cRights
Local cTitle,oButt1,oButt2,nYear,nScr1,nScr2,xMessage,cRdd

PUBLIC xCONNECT,xSource,xProvider

lOK  := .F.


//-- get timestamp on .exe //

cFILE := GetModuleFileName( GetInstance() )
aDIR  := DIRECTORY( cFILE )
dEXE  := aDIR[1] [3]

// where .exe started from is default directory //

mSTART := RAT( "\", cFILE )
cDEFA  := SUBSTR(cFILE,1,mSTART-1)

aDIR := NIL
SET DEFA to ( cDEFA )

SET DELETED on
SET CENTURY on
SET 3DLOOK on

nYEAR := ( year( DATE() )-30 )
SET EPOCH to ( nYEAR )

REQUEST DBFCDX
rddsetdefault ( "
DBFCDX" )

nSCR1 := GetSysMetrics(0)
nSCR2 := GetSysMetrics(1)

xPROVIDER := "
Microsoft.Jet.OLEDB.4.0"
xSOURCE   := cDEFA+"
\Rick.mdb"
cRDD      := xPROVIDER+"
-- "+xSOURCE

 // global connection string
xCONNECT := 'Provider='+xPROVIDER+';Data Source='+xSOURCE

If .not. File( cDefa+"
\Rick.mdb" )

   Ferase( cDefa+"
\Rick.mdb" )

   // create the adox object
   Try
      catNewDB := CreateObject("
ADOX.Catalog")
   Catch
      MsgInfo( "
Could not Create ADOX object")
      Return(.f.)
   End try

   // create the table Rick.mdb
   Try
     catNewDB:Create('Provider='+xProvider+';Data Source='+xSource+';Jet OLEDB:Engine Type=5' )
   Catch
     MsgInfo( "
Could not create the table "+xSource )
     Return(.f.)
   End Try

   Try
     oCn  := CREATEOBJECT( "
ADODB.Connection" )
   Catch
     MsgInfo( "
Could not create the ADO object for connection")
   End Try

   TRY
     oCn:Open( xCONNECT )
   CATCH oErr
     MsgInfo( "
Could not open a Connection to Database "+xSource )
     RETURN(.F.)
   END TRY


   cSQL := "
CREATE TABLE CUSTOMER"
   cSQL += "
( "
   cSQL += "
[CUSTOMEREID] char(18) NOT NULL, "
   cSQL += "
[LAST NAME] char(30) NULL, "
   cSQL += "
[FIRST NAME] char(30) NULL, "
   cSQL += "
[MID INIT] char(30) NULL, "
   cSQL += "
[ADDRESS1] char(30) NULL, "
   cSQL += "
[CITY] char(30) NULL, "
   cSQL += "
[STATE] char(30) NULL, "
   cSql += "
[MEMO] LONGBINARY NULL,"
   cSql += "
[DATEPUR] DateTime NULL, "
   cSQL += "
CONSTRAINT PK_USERINFO PRIMARY KEY ( CUSTOMEREID )"
   cSQL += "
)"

   Try
      oCn:Execute( cSQL )
   Catch
      MsgInfo( "
Table CUSTOMER Failed" )
      Return(.f.)
   End try

   oCn:Close()
   oCn := nil

Endif

xLOGIN := UPPER( WNetGetuser() )+space(8) // fivewin
xLOGIN := SUBSTR(xLOGIN,1,8)

oRsCust := TOleAuto():New( "
ADODB.Recordset" )
oRsCust:CursorType     := 1        // opendkeyset
oRsCust:CursorLocation := 3        // local cache
oRsCust:LockType       := 3        // lockoportunistic

// check for very first user

cSQL := "
SELECT * FROM CUSTOMER"
TRY
   oRsCust:Open( cSQL, xCONNECT )
CATCH oErr
   MsgInfo( "
Error in Opening CUSTOMER table here" )
   RETURN(.F.)
END TRY

If oRsCust:eof

   oRsCust:AddNew()
   oRsCust:Fields("
CustomerEid"):Value  := "011111111111111111"
   oRsCust:Fields("
Last Name"):Value    := "Lipkin"
   oRsCust:Fields("
First Name"):Value   := "Richard"
   oRsCust:Fields("
Mid Init"):Value     := "M"
   oRsCust:Fields("
Address1"):Value     := "123 Anywhere"
   oRsCust:Fields("
City"):Value         := "Columbia"
   oRsCust:Fields("
State"):Value        := "SC"
   oRsCust:Fields("
DatePur"):Value      := Date()
   oRsCust:Update()

   oRsCust:AddNew()
   oRsCust:Fields("
CustomerEid"):Value  := "011111111111111112"
   oRsCust:Fields("
Last Name"):Value    := "Lipinsky"
   oRsCust:Fields("
First Name"):Value   := "Jason"
   oRsCust:Fields("
Mid Init"):Value     := "S"
   oRsCust:Fields("
Address1"):Value     := "123 Arborgate"
   oRsCust:Fields("
City"):Value         := "Columbia"
   oRsCust:Fields("
State"):Value        := "SC"
   oRsCust:Fields("
DatePur"):Value      := Date()
   oRsCust:Update()

   oRsCust:AddNew()
   oRsCust:Fields("
CustomerEid"):Value    := "011111111111111113"
   oRsCust:Fields("
Last Name"):Value    := "Lipkin"
   oRsCust:Fields("
First Name"):Value   := "Beth"
   oRsCust:Fields("
Mid Init"):Value     := "  "
   oRsCust:Fields("
Address1"):Value     := "123 Lake Murray Blvd"
   oRsCust:Fields("
City"):Value         := "Lexington"
   oRsCust:Fields("
State"):Value        := "SC"
   oRsCust:Fields("
DatePur"):Value      := Date()
   oRsCust:Update()

   oRsCust:AddNew()
   oRsCust:Fields("
CustomerEid"):Value    := "011111111111111114"
   oRsCust:Fields("
Last Name"):Value    := "Lizzarous"
   oRsCust:Fields("
First Name"):Value   := "Tim"
   oRsCust:Fields("
Mid Init"):Value     := "J"
   oRsCust:Fields("
Address1"):Value     := "456 Broad River"
   oRsCust:Fields("
City"):Value         := "Irmo"
   oRsCust:Fields("
State"):Value        := "SC"
   oRsCust:Fields("
DatePur"):Value      := Date()
   oRsCust:Update()


Endif

oFontB  := TFont():New("
Ms Sans Serif",,-6,.F.,.T. ,,,,.F. )
cRIGHTS := "
(RWS)"

xMESSAGE :=  "
User  "+xLOGIN+"    Rights  "+cRIGHTS+        ;
      "
    Default= "+cDEFA+"      Rdd= "+cRDD+            ;
      "
    Revision  "+DTOC(dEXE)+;
      "
 -r"+str(nSCR1,4)+" x "+STR(nSCR2,4)

cTitle := "
Test Incremental Search with ON CHANGE"

DEFINE WINDOW oWnd ;
       TITLE cTITLE  ;
       MENU _BuildMenu();
       MDI

DEFINE BUTTONBAR oBar OF oWnd SIZE 65,70 3DLOOK 2007
oBar:SetColor(0)

DEFINE BUTTON oButt1 OF oBar  ;
MESSAGE "
Customer Information" ;
ACTION _Custview( "
A",oWnd,oButt1,oButt2 ) ;
PROMPT "
Customer Info"


DEFINE BUTTON oButt2 OF oBar ;
MESSAGE "
Close Application" ;
ACTION ( oWnd:End() ) ;
PROMPT "
Quit"


SET MESSAGE OF oWnd     ;
   to xMESSAGE CLOCK 2007

ACTIVATE WINDOW oWnd MAXIMIZED ;
VALID ( IIF( !lOK, _ExitPgm(.T.), .F. ))

RETURN( NIL )

//---------------------------
Static FUNCTION _BuildMenu()

LOCAL oMENU, cDEFA

cDEFA := SET(7)


MENU oMenu 2007

   menuitem "
Login..."   ;

   MENUITEM "
&About..."

   MENUITEM "
&Quit"          ;
         MESSAGE "
Close this program";
         ACTION oWND:END()

ENDMENU

RETURN( oMenu )


//-----------------------
Static FUNCTION _ExitPgm( lCLEAN )

LOCAL lOK3

lOK3  := .F.

IF lCLEAN = .T.
   lOK3 := .T.
   lOK  := .T.
   SET RESOURCES to

ENDIF

RETURN( lOK3 )

//-------------------------------
Static FUNC _Custview( cMODE,oWnd,oBtn1,oBtn2 )


LOCAL SAYING,cDEFA
LOCAL cTITLE
LOCAL oIco,oFld,oCust
LOCAL oRsCust,cSql

lOK1  := .F.

cSQL := "
SELECT * from CUSTOMER order by [Last Name]"

oRsCust := TOleAuto():New( "
ADODB.Recordset" )
oRsCust:CursorType     := 1        // opendkeyset
oRsCust:CursorLocation := 3        // local cache
oRsCust:LockType       := 3        // lockoportunistic

TRY
   oRsCust:Open( cSQL,xCONNECT )
CATCH oErr
   MsgInfo( "
Error in Opening CUSTOMER table" )
   RETURN(.F.)
END TRY

SysReFresh()

cTITLE := "
Customer Maintenance"

DO CASE
CASE cMODE = "
E"
   cTITLE := "
Customer Maintenance  EDIT"
CASE cMODE = "
A"
   cTITLE := "
Customer Maintenance   ADD"
CASE cMODE = "
V"
   cTITLE := "
Customer Maintenance  VIEW"
ENDCASE

oBtn1:Disable()
oBtn2:Disable()


DEFINE WINDOW oWndChild            ;
       MDICHILD                    ;
       FROM 0,0 to 32,100          ;
       OF oWnd                     ;
       TITLE cTITLE

DEFINE DIALOG oCust RESOURCE "
CUSTOMER" of oWndChild


       REDEFINE FOLDEREX oFld ID 109 of oCust PROMPT "
Billing Information", "Service Address";
                DIALOGS "
CUSTVIEW", "SERVVIEW"

       _Folder_1( cMode, oWnd, oRsCust, oFld ) // Custview folder


ACTIVATE DIALOG oCust  NOWAIT ;
   ON INIT ( oCust:Move( 0, 0 ));
   VALID(!GETKEYSTATE( 27 ))


ACTIVATE WINDOW oWndChild ;
   ON INIT oWndChild:SetSize( oCust:nWidth, oCust:nHeight, .T. );
   VALID ( IIF( !lOK1, _ExitPgm1(.T.,oWndChild,oRsCust,oBtn1,oBtn2), .F. ))


RETURN( NIL )

// ---------- FOLDER-PAGE 1
Static FUNC _Folder_1( cMode, oWnd, oRsCust, oFld )

Local oSay1,oSay2,oSay3,oSay4,oSay5

cLname := space(50)
cFname := space(50)

dDatePur := if(empty(oRsCust:Fields("
datePur"):Value), Date(),;
                           _TtoDate(oRsCust:Fields("
datePur"):Value ))

*msginfo( dDatePur )

REDEFINE SAY oSay1 PROMPT "
Customer Type" ID 110 OF oFld:aDialogs[1] UPDATE
oSay1:SetFont( oFontB )

REDEFINE SAY oSay2 PROMPT "
Customer Id" ID 111 OF oFld:aDialogs[1] UPDATE
oSay2:SetFont( oFontB )

REDEFINE SAY oSay3 PROMPT "
Company or Last Name" ID 112 OF oFld:aDialogs[1] UPDATE
oSay3:SetFont( oFontB )

REDEFINE SAY oSay4 PROMPT "
First Name" ID 113 OF oFld:aDialogs[1] UPDATE
oSay4:SetFont( oFontB )

REDEFINE SAY oSay5 PROMPT "
Date Purchased" ID 163 OF oFld:aDialogs[1] UPDATE
oSay4:SetFont( oFontB )


REDEFINE GET oLname var cLname ID 153 of oFld:aDialogs[1] ;
         ON CHANGE ( _Isearch( oLname, cLname, oLbx, oRsCust )) UPDATE

REDEFINE GET oFname var cFname ID 154 of oFld:aDialogs[1] UPDATE

REDEFINE DTPICKER oDatePur VAR dDatePur  ID 164 OF oFld:aDialogs[1] UPDATE //PICTURE '@D' UPDATE // ;
            *    When cMode <> "
V" UPDATE


REDEFINE xBROWSE oLBX                ;
         RECORDSET oRsCust           ;
         COLUMNS "
CUSTOMEREID"       ;
         COLSIZES 50                 ;
         HEADERS "
Cust Id"           ;
         ID 172 of oFld:aDialogs[1]  ;
         AUTOCOLS LINES

         ADD oCol TO oLbx AT 1 DATA {|x| x := _ChkName(oRsCust:Fields("
Last Name"):Value,;
                                                   oRsCust:Fields("
First Name"):Value,;
                                                   oRsCust:Fields("
Mid Init"):Value) };
                                                   HEADER "
Last Name or Company" size 190


         ADD oCol TO oLbx AT 2 DATA {|x| x := _ChkAdd(oRsCust:Fields("
Address1"):Value,;
                                                   oRsCust:Fields("
City"):Value,;
                                                   oRsCust:Fields("
State"):Value) };
                                                   HEADER "
Address" size 200


RETURN( nil )

//--------------------------
Static Function _TtoDate( tDate )

If empty( tDate)
   Return( ctod("
00/00/00"))
Endif

If ValType( tDate ) = "
D"
   Return(tDate )
Endif

Return( stod( substr( ttos( tDate ), 1, 8 ) ))


//----------------------------
Static Func _ChkName( cLast,cFirst,cMiddle )

Local cName

cName := substr("
Unk"+space(45),1,45)

If cMiddle = "
"
   If cFirst = "
" .or. empty( cFirst )
      cName = substr( alltrim( cLast)+space(45),1,45)
   Else
      cName := substr(alltrim(cLast)+"
, "+alltrim(cFirst)+space(45),1,45)
   Endif
Else
   If cFirst = "
" .or. empty( cFirst )
      cName = substr( alltrim( cLast)+space(45),1,45)
   Else
      cName := substr(alltrim(cLast)+"
, "+alltrim(cFirst)+" "+;
               alltrim(cMiddle)+space(45),1,45)
   Endif
Endif

Return( cName )


//-------------------------------
Static Func _ChkAdd( cAddress, cCity, cState )

LOCAL cName

cName := if( cAddress = "
" .or. empty( cAddress ), " ", alltrim( cAddress ))+" "+;
         if( cCity = "
" .or. empty( cCity), " ", alltrim(cCity))+" "+;
         if( cState = "
" .or. empty( cState), " ", alltrim(cState))

cName := substr( alltrim( cName ) +space(45),1,45)

Return( cName )

//-------------

Static Func _Isearch( oLname1, cLname1, oBrw, oRsCust )

  cLname1 = Alltrim( oLName1:GetText() )

  if Empty( cLname1 )
     return .T.
  endif

   oRsCust:Filter := "
[Last Name] like '"+cLname1+"%'"

   oBrw:ReFresh()

Return .T.

//-------------------------------
Static FUNCTION _ExitPgm1( lCLEAN,oWndchild,oRsCust,oBtn1,oBtn2 )

LOCAL cDEFA, lOK3

cDEFA := SET(7)

IF lCLEAN = .T.
   lOK1  := .T.

   oRsCust:CLose()
   oWndChild:End()

   oBtn1:Enable()
   oBtn2:Enable()

ENDIF

RETURN( lOK1 )

 // -- end


here is the .rc
Code: Select all  Expand view

// Generated by ResEdit 1.6.6
// Copyright (C) 2006-2015
// http://www.resedit.net

#include <windows.h>
#include <commctrl.h>
//#include "resource.h"

#ifndef WC_STATIC
#define WC_STATIC L"Static"
#endif

#ifndef MONTHCAL_CLASS
#define MONTHCAL_CLASS "SysMonthCal32"
#endif

#ifndef DATETIMEPICK_CLASS
#define DATETIMEPICK_CLASS "SysDateTimePick32"
#endif

//
// Dialog resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
CUSTOMER DIALOG 3, 13, 538, 356
STYLE DS_SETFONT | WS_CHILDWINDOW
FONT 8, "Arial"
{
    CONTROL         "", 109, "TFolderex", 0x50010000, 3, 4, 524, 308, 0x00000000
}



LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
CUSTVIEW DIALOG 12, 11, 513, 311
STYLE DS_SETFONT | WS_CHILDWINDOW
FONT 6, "MS Sans Serif"
{
    LTEXT           "Date Purchased", 163, 16, 103, 81, 12, SS_LEFT | SS_NOPREFIX, WS_EX_LEFT
    CONTROL         "", 164, DATETIMEPICK_CLASS, WS_TABSTOP | DTS_SHOWNONE, 101, 101, 83, 13, WS_EX_LEFT
    LTEXT           "Customer Type", 110, 8, 8, 37, 22, SS_LEFT | SS_NOPREFIX, WS_EX_LEFT
    AUTORADIOBUTTON "  Individual   ", 150, 46, 10, 63, 12, 0, WS_EX_LEFT
    AUTORADIOBUTTON "  Commercial", 151, 46, 24, 63, 12, 0, WS_EX_LEFT
    CTEXT           "Customer Id", 111, 112, 11, 94, 10, WS_BORDER | SS_CENTER | SS_NOPREFIX, WS_EX_LEFT
    EDITTEXT        152, 112, 23, 94, 12, NOT WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_LEFT
    LTEXT           "Company or Last Name", 112, 7, 39, 105, 10, SS_LEFT | SS_NOPREFIX, WS_EX_LEFT
    LTEXT           "First Name", 113, 119, 39, 73, 10, SS_LEFT | SS_NOPREFIX, WS_EX_LEFT
    EDITTEXT        153, 7, 50, 105, 12, ES_AUTOHSCROLL, WS_EX_LEFT
    EDITTEXT        154, 117, 50, 76, 12, ES_AUTOHSCROLL, WS_EX_LEFT
    GROUPBOX        "", 196, 2, 4294967294, 213, 304, 0, WS_EX_LEFT
    CONTROL         "Customer Info", 172, "TXBrowse", 0x50A10000, 221, 1, 290, 215, 0x00000000
}



LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
SERVVIEW DIALOG 12, 11, 436, 311
STYLE DS_SETFONT | WS_CHILDWINDOW
FONT 6, "MS Sans Serif"
{
    LTEXT           "Company or Last Name", -1, 24, 58, 105, 10, SS_LEFT | SS_NOPREFIX, WS_EX_LEFT
    EDITTEXT        120, 24, 70, 105, 12, ES_AUTOHSCROLL, WS_EX_LEFT
}


 



here is the wiki
https://wiki.fivetechsoft.com/doku.php? ... ted_stuffs

Rick Lipkin
User avatar
Rick Lipkin
 
Posts: 2616
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: ADS - The future is <sadly> now so where do you go ?

Postby vilian » Fri Apr 22, 2022 2:05 pm

TimStone wrote:Giovanni,

Right now I have ongoing, daily, contact with SAP ( the owners of ADS ). This is not bankruptcy. They took away resources for further development apparently in 2015 ( the last release of ADS 12 ). Now they have used a funny term, but it is End of Life for 12/31/2022.

I have asked directly if they will release it to public domain, or give us access to update existing keys for more seats ( at no charge ). The problem is they can't even seem to find anyone in the company (SAP) who handles responsibility for this product even though their website says it is still available for sale. If you fill out a form as if you are a new client, no one will even respond, even though the form is still online.

It was my intention to convert to SQL and FWH has ample assistance, and samples, for doing this. My whole program is object oriented and perhaps once I start working with it, I will have success and move quickly through the process. I did use the FWH functions to actually convert my existing data files ( about 130 ) into a MySQL database, and that will be very helpful because the process is so simple. Now it is a matter of moving forward on implementing it within this massive application.

I am using FWH, Harbour, and MSVC ( Visual Studio Community 2022, and the latest builds of FWH and Harbour ). I am also fully focused on doing this in 64 bit ( and my application is fully running now as both 32 bit and 64 bit ) and all 3rd party libraries are updated.

So I will see how it goes. However, I can wait no longer to this conversion because we have no idea what will happen with ADS ... and it might even have some built in code that is date sensitive and it will stop working.

Tim

Some years ago I moved from ADS to MySql. This was the best thing I did. Mr Rao did a great job with FWH MySQL/MariaDB native support, the migration from ADS was very easy and his support is fast and perfect!
Sds,
Vilian F. Arraes
vilian@vfatec.com.br
Belém-Pa-Brazil
User avatar
vilian
 
Posts: 920
Joined: Wed Nov 09, 2005 2:17 am
Location: Brazil

Next

Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: karinha, Rick Lipkin and 99 guests