ADS remote access

ADS remote access

Postby Detlef Hoefner » Fri Apr 20, 2007 7:01 am

Dear Friends,

with the kind help of RF i built my first app which uses the ADS rdd.
This was rather easy. And it works fine with the local ADS server.

Now i would like to know how to acces a remote server.
If i set AdsSetServerType(2), where do i have to give an IP address to my app?

Thanks for each help in advance.
Regards,
Detlef
User avatar
Detlef Hoefner
 
Posts: 312
Joined: Sat Oct 08, 2005 9:12 am
Location: Germany

Postby Detlef Hoefner » Fri Apr 20, 2007 3:35 pm

Dear friends,

i'm a little bit further :wink:

I set up an ADS server which operates 200 km from here and built a data dictionary on it with 3 dbf files.

When i open a VPN connection i can call my local data architect ( arc32.exe ) to open a dbf file from the remote server.
My xHarbour app works with the local ADS but can not connect to the remote server. I don't know how to open a dictionary.

The only way to see the remote data is to use the arc32.exe.
But browsing a dbf with the arc32 is very slow. The dbf file has only 13000 records.

Can a xHarbour app be faster than the sluggish speed of the arc32.exe?

I'm rather interested to learn from your experiences.

Bet regards,
Detlef
User avatar
Detlef Hoefner
 
Posts: 312
Joined: Sat Oct 08, 2005 9:12 am
Location: Germany

Postby R.F. » Fri Apr 20, 2007 7:15 pm

My best advice:

For remote access you should use AIS (Advantage Internet Server), works great.

Download samples:

http://www.google.d2g.com/ads/demos/

Local servers is toooo slow for remote connection, try AIS instead.

There are some things you have to setup before attempt to connect to a remote server via AIS.

1) You will need to create a dictionary, and set the flag of "internet" access.
2) You will need to create a user, and set permissions for internet access.

Now from source code:

ADSConnect60(<diccionary>,<servertype>,<user>,<password>)

This function returns .T. if you could succesfully connect to a dictionary

Sample:

AdsConnect60("\\googleserver\adsdemos\demo.add",4,"admin","admin")

In order to "resolve" the server route, you will need a INI file, called ADS.INI

ADS.INI has section with the server name:

[googleserver]

Where you have to setup the ips and ports used to connect:

[googleserver]
LAN_IP = 192.168.2.1
LAN_PORT = 2000
INTERNET_IP = google.d2g.com
INTERNET_PORT = 2001

When you try to connect to an ADS server, AXWCS32.DLL will look for the ADS.INI file, in order to resolve the server location, avoiding the "discovery" process which usually takes its time.

See the samples I suggested to download at the begining of this message
Saludos
R.F.
R.F.
 
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Postby RAMESHBABU » Sat Apr 21, 2007 11:09 am

Hello Mr.RF


1) You will need to create a dictionary, and set the flag of "internet" access.
2) You will need to create a user, and set permissions for internet access.


Can you please guide me on the above to create a dictionary.


AdsConnect60("\\googleserver\adsdemos\demo.add",4,"admin","admin")

What exactly demo.add contains ?
Can you please an example of a data dictionary ?

[googleserver]
LAN_IP = 192.168.2.1
LAN_PORT = 2000
INTERNET_IP = google.d2g.com
INTERNET_PORT = 2001


192.168.2.1 is the IP adress of remote server or local system ?

Thanks

- Ramesh Babu P
User avatar
RAMESHBABU
 
Posts: 625
Joined: Fri Oct 21, 2005 5:54 am
Location: Secunderabad (T.S), India

Postby R.F. » Sat Apr 21, 2007 6:57 pm

Ramesh:

In the SQL-based databases, all the stuff is stored in one single file, for example in MS Access all the tables, users, passwords, security schemas,stored procedures, etc is stored into a one singe MDB file, same happens in SQL Server, MySQL, Informix, etc.

ADS tries to do the same, using a "data dictionary" with a "little" difference, the DBF or ADT tables will not be "merge" into one single file, in this case the file is the data dictionary, they will remain as "free files", but they will be handled by the Data Dictionary, because the DD will have an internal reference to them.

How to create a dictionary:

To create the data dictionary you need to use the ARC, open the ARC (Advantage Data Architech), go to DATABASE in the main menu and select NEW DATABASE, give it a name, check the appropiate features you may need, and you are done.

The DD creation is also available via SourceCode in (x)Harbour.

Inmediatly after creating the dictionary you will need to create a "super user account" this is an administrative user account, by default ADS will create the ADSSYS user, and you will have to give it a password.

Data dictionaries will have the .ADD extension.

Once created, you will need to add all the tables you want to be accesed via the data dictionary, remember, the tables will not be merged into the DD, this is only to give the DD a reference of where are those tables located; this gives you an extra level or security because you will need a user and password to access the data.

To add tables into the dictionary, go to the tree structure you will see at the left of the screen, select TABLES, right click over the TABLES item, and you will see a pop up menu, select ADD EXISTING TABLES, then pick up all the tables and indexes you will need to be into the data dictionary and you are done. Tables can be DBF with CDX or NTX indexes and DBT or FPT memos, or ADT tables with ADI indexes and ADM memos, you can also mix ADTs and DBFs in the same dictionary.

The goal of a data dictionary is to give an extra security level because you need to create users in the dictionary and give permissions to them for reading, writting, or deleting data, in DBF or ADT tables.

Data dictionaries are also important for internet access, because every user you create into the dictionary can have, or not to have Internet access to your data, you can set this feature every time you create a new user or you can modify user accounts to let them read your data via internet.

Thanks to ADS, you can handle data using SQL statements, Data dictionaries are also important to users that have worked with SQL based databases, they are used to "connect" to the database using an administrative program, and after that they can write queries to retrieve data, in ADS you can also "connect" o a database, this "database" is called "data dictionary" and, as a Data Dictionary has a list of all the tables needed, you can handle them as in the most popular SQL based systems.

So far so good, let's see now how to use the DD in (x)Harbour code.

First you will need to connect to the dictionary, which is the the most important part:

AdsConnect60(<data dict>,<server type>, <user>,<password>)

<data dict> is the route where the DD is, this route has to be indicated using the UNC:

\\server\shared resource\folder\dictionary.add

sample:

\\googleserver\adsdemos\samples\demo.add

This may sound reasonable if we were working into a LAN, but what if we want to use the Internet access to the data.

For internet access (and to speed the lan access too), ADS will use a configuration file that is used by the AXWCS32.DLL (ADS windows client), this file is an INI file called ADS.INI and you have to place it in the same directory where your exe file is.

This INI files has to be a section with the server name:

[googleserver]

under this section you have to put the LAN address of the server AND in case you were working via internet, you have to place the public IP adress or the domain name:

[googleserver]
LAN_IP=192.168.2.1

When working with the REMOTE ADS server (not the local), you also need to configure the ports of the server where you are reading information, this is done using the Advantage Configuration Utility, only available with the remote server, using this tool, you configure the lan ports and internet ports to be used, and in the ADS.INI you have to indicate such ports.

[googleserver]
LAN_IP=192.168.2.1
LAN_PORT=2000

If you are using the AIS (Advantage Internet Server), you will also have to indicate the public IP of the server, or the domain name in order to resolve de ip address, also, you have to indicate which port is "listening" the internet requests:

[googleserver]
LAN_IP=192.168.2.1
LAN_PORT=2000
INTERNET_IP=google.d2g.com ; or 200.67.137.11
INTERNET_PORT = 2001

Please notice that LAN and INTERNET port must be different.

Back to the dictionary connection, the first two parameters will try to connect to the dictionary using the server type stablished.

AdsConnect60("\\googleserver\adsdemos\demo.add",4,.......)

When calling this function, the ADS client will read the UNC, and inmediatly after will look for the ADS.INI looking for the server name section, and using its entries will try to resolve the server location.

The server type (4) is also important, 4 indicates that it must connect to the server only via INTERNET which means that no matter if the computer is connected to the LAN, the programm will attemp to connect to the server via INTERNET using the entries in the INI file. If there's no internet connection available the program will indicate an error, and it will finish.

Values for the connection parameter are:

(1) Local server only, no client server nor transactions features, no internet access either, this is a free redistributable server for developing, testing or for commercial applications, you can use it in a single computer (stand alone) but you can also use it up to 5 users under LAN enviroments, you are free to use and distribute this server (ADSLOC32.DLL).

(2) Remote server only, you need to have an ADS remote server running in your server. Remote server will run under Novell Netware (from version 5.x and greater), Linux or Windows true 32 enviroments (NT, 2000, XP, 2003 or Vista), your choice.

(3) Local (1) + remote servers (2), the program will attempt to connect first via the remote server, if there's no remote server running on the file server, it will use the local server, this value is adecuate if you are planing to move to a remote server later, because avoids you to write double code or to make modifcations into the source, you can work with free local server, and when you decide to move into the remote server for all the client/server transactional features, you will not need to make any changes to your code, simply install the remote server, and run your program again.

(4) Internet server. This configuration is adecuate for remote computers, not connected to the LAN, using internet to gain access to the data.

(5) Local (1) + Internet (4), you can use both servers, local and internet, for example, you can use the internet access to retrieve data via internet, and use the local server to create temp data files for reporting in your local computer.

(6) Remote (2) + Internet (4), you can use this value when are working in your office in your LAN, retrieving data from the server, and if you go out of the office in a trip or want to work at home, you can use internet to connect to the server, remember, no modifications in the source code are needed, the same exe will work under the lan an under internet.

(7) Local (1) + Remote (2) + Internet (4), this is your best choice since it allows you to connect to any server or combination of servers, for example you are working at your office in your LAN, using the remote server (2), but you go out of the office and decide to work at home, you can use the same exe to connect to a internet server (4), and you can use the local server (1) to create temp DBF or ADT files in your local hd for reporting.

And finally, the last two parameters of the AdsConnect60() function are the user name, and its password, these values are set in the data dictionary when creating a new user.
Saludos
R.F.
R.F.
 
Posts: 840
Joined: Thu Oct 13, 2005 7:05 pm

Postby reinaldocrespo » Sun Apr 22, 2007 2:18 am

The DD can also be created from source. Here is sample code to create/update a DD using ACE API calls. For more info on ACE calls look at the help in ARC. It also helps reading the .c sources in the rddads contrib lib.

ADS is really-really working very good for me. Speed, stability, remotely access of dbf via Internet, dbf security (very secure) and SQL capability against .ntx and .cdx files. So, with ADS you get to keep ISAM and add SQL to it. Best of both worlds. Futhermore, DBFs are invisible to users on the LAN and/or WAN.

Hope the code below helps.

Code: Select all  Expand view  RUN
#include "ads.ch"
#include "fivewin.ch"

#define ADS_DEFAULT              0

REQUEST ADS
REQUEST ADSKeyCount, ADSKeyNo, OrdKeyCount, OrdKeyNo

STATIC aFiles := {}
static cPath
*-----------------------------------------------------------------------------------------------------
Static Function Start()
Local oIni
Local xRDD
Local nErr
Local cParmPath    := Arg( 1 )
local xPath
local cIniPath   := iif( cParmPath == Nil .or. empty( cParmPath ), ;
         cFilePath( GetModuleFileName( GetInstance() ) ) , ;
         cParmPath + iif( right( cParmPath, 1 ) == "\", "", "\" ) )
Local cIni      := cIniPath + "patients.ini"

   INI oIni FILE cIni
      GET xPath SECTION "RDD" ENTRY "PATH" OF oIni DEFAULT "f:\mp\data\"
      Get xRDD SECTION "RDD" ENTRY "RDD_VERSION" OF oIni DEFAULT "LOCAL"
   ENDINI

   rddsetdefault( "ADS" )
   AdsSetFileType( ADS_NTX )
   AdsLocking( ADS_COMPATIBLE_LOCKING )
   rddRegister ( "ADS", 1 )
   if ( nErr := ADSSetServerType( iif( xRDD == "LOCAL", ADS_LOCAL_SERVER, ADS_REMOTE_SERVER ) ) ) <> 0
      MsgStop( "Cannot connect to server " + Str( nErr ), "Problem" )
   Else
      MsgRun( "Creating ADS Data Dictionary...", "ADS DD creation", { ||CreateDictionary( xPath ) } )
   Endif

Return (Nil)

*------------------------------------------------------------------------------------
Function CreateDictionary( xpath )
local aFiles   := FileIndexStruc()

   cpath := xPath

   if !file( cpath+ "mp.add" ) .and. !ADSDDCREATE( cPath+"mp.add",, "mp system data dictionary" )
         if !AdsConnect60( cpath + "mp.add", ADS_REMOTE_SERVER, "ADSSYS","mp8" ) //.and. UpdateADSDD()
         MsgStop( "Create and/or connect failed." + cValToChar( AdsGetLastError() ), cPath + "mp.add" )
         RETURN NIL
      Endif
   Endif

   logfile( "dd.log", { cPath+"mp.add", AdsConnection() } )
   AdsDDSetDatabaseProperty( ADS_DD_ENABLE_INTERNET, .t. )
   AdsDDSetDatabaseProperty( ADS_DD_INTERNET_SECURITY_LEVEL, ADS_DD_LEVEL_2 )

   AdsDDCreateUser( , "mpuser", "mp8", "Mp system users" )
   AdsDDCreateUser( , "x12", "mp8", "x12 document users" )
   AdsDDCreateUser( , "billing", "mp8", "Billing users" )

   AdsSetFileType( ADS_NTX )

   aEval( aFiles, { |e| AdsSetFiletype( iif( len( e ) > 1 .and. lower( cFileExt( e[ 2 ] ) ) == "cdx", ADS_CDX, ADS_NTX ) ),;
      addfiletoDD( e ), ;
      SetTableProp( e ), ;
      logfile( "dd.log", { "Adding table to DD", ;
                     e[1], ;
                     AdsSetFileType(), ;
                     cFileExt( e[ min( 2, len( e ) ) ] ), ;
                     ADSGetLastError() } ) } )

return Nil

*------------------------------------------------------------------------------------
Static Function AddFiletoDD( aFile )
local cIndexs := ""

   if len( afile ) > 1 .and. left( afile[ 2 ],1 ) <> "."
      aEval( afile, { |e| cIndexs += e +";" }, 2 )
      cIndexs := left( cIndexs, len( cIndexs ) -1 )
   Endif

Return( AdsDDAddTable( left( afile[ 1 ], at(".", afile[1] )-1 ), ;
            cPath + aFile[ 1 ], ;
            cIndexs ) )

*------------------------------------------------------------------------------------
static function SetTableProp( aFile )
local cFile := cFileName( afile[ 1 ] )
#ifndef VERSION_0.99
   AdsDDSetTableProperty( cFile, ADS_DD_TABLE_AUTO_CREATE, .t. )
#endif
return Nil

*------------------------------------------------------------------------------------
function FileIndexStruc()
local a := {}

   aadd( a, { "auditlog.dbf", "auditlog.cdx" } )
   aadd( a, { "remits.dbf", "remits.cdx" } )
   aadd( a, { "closed.dbf", ".cdx" } )
   aadd( a, { "icd4cpts.dbf", "icd4cpts.cdx" } )
   aadd( a, { "doctors.dbf", "doc_id.ntx", "doc_name.ntx" } )
   aadd( a, { "hospital.dbf","hospital.ntx" } )
   aadd( a, { "techs.dbf", "tch_id.ntx" } )
   aadd( a, { "macros.dbf", "mcr_id.ntx" } )
   aadd( a, { "users.dbf", "users.ntx" } )
   aadd( a, { "scribes.dbf","scrb_id.ntx" } )
   aadd( a, { "images.dbf", "images.cdx" } ) //"img_rec.ntx","img_adm.ntx" } )
   aadd( a, { "imgtypes.dbf",".cdx" } )
   aadd( a, { "patients.dbf", "pat_rec.ntx", "pat_ssn.ntx", "pat_name.ntx" } )
   aadd( a, { "pat_err.dbf",".cdx" } )
   aadd( a, { "poliza.dbf", "poliza.ntx","pol_id.ntx" } )
   aadd( a, { "planfile.dbf", "planfile.ntx", "ins_code.ntx" } )
   aadd( a, { "zipcode.dbf", "zip_city.ntx", "zip_code.ntx" } )
   aadd( a, { "diagfile.dbf", "diagcode.ntx", "diagdesc.ntx" } )
   aadd( a, { "forms.dbf", "forms.ntx" } )
   aadd( a, { "pmtrsns.dbf", ".ntx" } )
   aadd( a, { "meddata.dbf", "meddata.cdx" } )
   aadd( a, { "scripts.dbf", ".ntx" } )
   aadd( a, { "medsys.dbf", ".ntx" } )
   aadd( a, { "pay_items.dbf", "pay_items.cdx" } )

#ifndef PROFESSIONAL
   aadd( a, { "abgparm.dbf", "abgparm.cdx" } )
   aadd( a, { "adtlog.dbf", "adtlog.cdx" } )
   aadd( a, { "nurses.dbf", "nur_id.ntx", "nur_name.ntx" } )
   aadd( a, { "autocode.dbf", "acd_code.ntx", "acd_cpt.ntx", "acd_ins.ntx" } )
   aadd( a, { "lbdefrs.dbf", "lbdefrs.cdx" } )
   aadd( a, { "ovrprdm.dbf", "ovp_code.ntx", "ovp_cpt.ntx" } )
   aadd( a, { "revcodes.dbf", "rev_code.ntx", "rev_item.ntx", "rev_desc.ntx" } )
   aadd( a, { "charges.dbf", "chr_code.ntx", "chr_desc.ntx", "chr_cpt.ntx", "chr_rev.ntx" } )
   aadd( a, { "admit.dbf", "adm_rec.ntx", "adm_num.ntx", "adm_date.ntx", "adm_dis.ntx", "adm_doc.ntx" } )
   aadd( a, { "rooms.dbf", "rms_id.ntx" } )
   aadd( a, { "meddept.dbf", "meddept.ntx" } )
   aadd( a, { "ptechrgs.dbf", "pch_date.ntx", "pch_adm.ntx", "pch_itm.ntx" } )
   aadd( a, { "packages.dbf", "pkg_code.ntx" } )
   aadd( a, { "abstrct.dbf", "abs_adm.ntx", "abs_rec.ntx" } )
   aadd( a, { "consults.dbf", "cns_adm.ntx", "cns_doc.ntx" } )
   aadd( a, { "incmprec.dbf", "inr_adm.ntx", "inr_stf.ntx" } )
   aadd( a, { "drg.dbf", "drg.ntx" } )
   aadd( a, { "admtypes.dbf",".cdx" } )
   aadd( a, { "condcds.dbf", "condcds.ntx" } )
   aadd( a, { "trnsfs.dbf", "trn_adm.ntx", "trn_date.ntx" } )
   aadd( a, { "ubcodes.dbf", "ubc_adm.ntx" } )
   aadd( a, { "medyrded.dbf", "medyrded.ntx" } )
   aadd( a, { "orders.dbf", "ord_adm.ntx", "ord_date.ntx" } )
   aadd( a, { "labordrs.dbf", "lab_adm.ntx", "lab_rec.ntx", "lab_id.ntx", "lab_date.ntx" } )
   aadd( a, { "labrslts.dbf", "lrs_id.ntx" } )
   aadd( a, { "labrjcts.dbf", "lrj_id.ntx" } )
   aadd( a, { "labcmnts.dbf", "lcmts_id.ntx" } )
   aadd( a, { "labphned.dbf", "lphnd_id.ntx" } )
   aadd( a, { "hemafnds.dbf", "hemafnds.ntx" } )
   aadd( a, { "labdepts.dbf", "ldp_dept.ntx" } )
   aadd( a, { "xrorders.dbf", "xro_id.ntx", "xro_adm.ntx" } )
   aadd( a, { "rdlgsts.dbf", "rdl_id.ntx", "rdl_name.ntx" } )
   aadd( a, { "xrtrn.dbf", "xrtrn.cdx" } )
   aadd( a, { "autoreg.dbf", "autoreg.cdx" } )
   aadd( a, { "triage.dbf", "triage.cdx" } )
   aadd( a, { "painarea.dbf", "painarea.cdx" } )
   aadd( a, { "cost_ctr.dbf", "cost_ctr.cdx" } )
   aadd( a, { "srv_clss.dbf", "srv_clss.cdx" } )
   aadd( a, { "dsuppl.dbf", "dsuppl.cdx" } ) //"ds_code.ntx" } )
   aadd( a, { "dtypes.dbf", "dtypes.cdx" } ) //"dt_type.ntx", "dt_desc.ntx" } )
   aadd( a, { "drstric.dbf", "drstric.cdx" } ) //"dr_code.ntx" } )
   aadd( a, { "dietmast.dbf", "dietmast.cdx" } ) //"dietkey.ntx", "dietcode.ntx", "dietdesc.ntx" } )
#endif

return a

*------------------------------------------------------------------------------------
Function IsInDictionary( odbf )
local cfilename := lower( cFileName( odbf:cfilename ) )
   if at( ".", cfilename ) == 0
      cfilename += ".dbf"
   endif

   if empty( aFiles )
      afiles := FileIndexStruc()
   Endif

return aScan( aFiles, { |e| e[ 1 ] = cFileName } ) > 0   // cfileName IN aFiles //
User avatar
reinaldocrespo
 
Posts: 979
Joined: Thu Nov 17, 2005 5:49 pm
Location: Fort Lauderdale, FL

Postby RAMESHBABU » Sun Apr 22, 2007 4:09 am

Mr.RF

Thank you very much for your detailed tutorial on ADS. Now I am
right track. I will seek some more help from you after some time.


Mr.Reinaldo

Thank you for the source.

Regards to you both

- Ramesh Babu P
User avatar
RAMESHBABU
 
Posts: 625
Joined: Fri Oct 21, 2005 5:54 am
Location: Secunderabad (T.S), India

Postby Detlef Hoefner » Sun Apr 22, 2007 4:30 pm

RF wrote:My best advice:

For remote access you should use AIS (Advantage Internet Server), works great.
...
Local servers is toooo slow for remote connection, try AIS instead.
...

Hello Rene,

now i'm totally confused.
I thought the ADS Server would be the first choice for handling huge databases better than with dbfntx or even dbfcdx.
If i'm far away from the server i can use the server type setting as 'remote server'.

But you recommend the AIS. Is this a totally different product?

What would you recommend if i want to access the same dbf files by workstations in a local network and also from far way workstations?

Best regards,
Detlef
User avatar
Detlef Hoefner
 
Posts: 312
Joined: Sat Oct 08, 2005 9:12 am
Location: Germany

Postby reinaldocrespo » Sun Apr 22, 2007 6:45 pm

René is THE professor of ADS. He helped me a lot when I got started, so with his permission, I'll try to explain a bit more:

ADS has 3 access modes:

"Local" - means no ADS server software running on the server. You access your tables in the same manner you've always have. In this manner the server only serves as a file server. Slow, prone to corruption, no security. This RDD is free. You are probably using it right now.

"Remote"- You might think that this means access via the Internet. It does not. It mean that you access your tables via the server software running on the server. But work stations are connected inside the LAN where the server is. This is what is called a client-server architecture. Here only the server software (ADS deamon/service) really access the tables and responds to client workstations sending requested data. Using the very same free RDDs, DBFS may be invisible to the client workstations and only after the app has connected to a DD owned by the ADS server service it gains access to data. Here the server is NO longer a simple file server. Think of it like an SQL server. Files are opened and closed in the server not at the workstation. Files are **NOT** sent to the workstation for processing to take place. If power fails on the workstation or it freezes, the files are not affected. Althought it is not obligatory, you should access your tables by connecting to the DD. Only by using a DD you get to protect DBFS and use SLQ commands on the very same dbf/ntx -dbf/cdx files, etc... In this scenario you HAVE to purchase the "server" software which runs as a service in windows, as a NML in Novell, and as a deamon in Linux. Prices depend on the # of users (connections) you want to purchase to connect concurrently. I've been using the windows and the Linux versions with much success. I have never tried the Novell version.

"Internet" - This is what rené is referring to as the AIS. With ADS server software running on the server, local computers (LAN) can access data in the manner I described above, but other workstations out side de LAN, ie.. WAN (via the Internet) can also access the data by connecting to the DD. The user/password combination used to connect to the DD must have internet access enabled. A few other considerations must also be looked at. But the ADS service/deamon running on the server is the very same used by the "remote" connecting computers inside the lan. There are two different ways to connect and view data via an Internet connection. One of them (which is what I'm using), is connecting a FW-Win32 application directly to the DD using a connection from the number of connections allowed by your license directly to the IP/Port where the ADS server is responding to internet connections. Another is via a .net or PHP or Java connection. In the later manner no connection slot from your # of connections license is used.

I'll leave you with that. I hope it helped.


Reinaldo.
User avatar
reinaldocrespo
 
Posts: 979
Joined: Thu Nov 17, 2005 5:49 pm
Location: Fort Lauderdale, FL

Postby Detlef Hoefner » Sun Apr 22, 2007 9:44 pm

Reinaldo,

your answer helped me very much.

You were right, i thought the "remote" server mode is the one to connect from a WAN.
Thanks for the clarification :idea: .

As you already work with this technology i have some more questions.
Is there a reasonable speed when browsing data with an AIS connection?
Is it possible to allow other clients from the internet to retrieve data from an AIS with php scripts ( just as with mySQL ) ?
And a last question, can i use a query with SQL like syntax from an AIS?

Best regards,
Detlef
User avatar
Detlef Hoefner
 
Posts: 312
Joined: Sat Oct 08, 2005 9:12 am
Location: Germany

Postby reinaldocrespo » Mon Apr 23, 2007 3:13 am

Is there a reasonable speed when browsing data with an AIS connection?


response is acceptable. Just open files and keep them opened through the session. I use xbrowse. I have users work totally via an internet connection. Browse, edit data, print reports using a fw-xharbour app.

Is it possible to allow other clients from the internet to retrieve data from an AIS with php scripts ( just as with mySQL ) ?


Yes. Totally. Even parameterized queries with PHP. Just like with MySQL.

And a last question, can i use a query with SQL like syntax from an AIS?


Absolutly! and very fast! But must use a Data Dictionary connection, that's all. You also have triggers, stored procedures, on-line backup, and replication. With time I've been using sql statements more and more. Latetly I've been recurring to SQL querries to allow users to xbrowse datasets built ad-hoc.

Listen; there is a recent book on the subject: "Advantage Database Server, A developer's guide" by Cary Jensen and Loy Anderson. You'll find it in Amazon.

There is a 2 user version of the ADS server available for free from the advantagedatabase.com page. It is a good idea to download and start playing with it. That's how I got started. I get special pricing from Extended Systems so, when the time comes for your customers to purchase, email me and I'll transfer my savings over to any fw developer interested.

Reinaldo.
User avatar
reinaldocrespo
 
Posts: 979
Joined: Thu Nov 17, 2005 5:49 pm
Location: Fort Lauderdale, FL

Postby Detlef Hoefner » Mon Apr 23, 2007 6:37 am

Reinaldo,

many thanks again for your explanations.
This now made up my decision to plan my redesign with ADS/AIS as database system.

Best regards,
Detlef
User avatar
Detlef Hoefner
 
Posts: 312
Joined: Sat Oct 08, 2005 9:12 am
Location: Germany


Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 32 guests