Uso de Diccionario de Datos ADS y tablas libres

Re: Uso de Diccionario de Datos ADS y tablas libres

Postby VitalJavier » Fri Jan 30, 2015 4:18 pm

Reinaldo, buen dia

Una pregunta.
Yo trabajo con ADS (Sin DD)
En el Recuadro donde te marca los usuarios que están conectados
y las tablas que están usando, existe una información que dice "Data Locks"
casi siempre esta en "0" pero en ocaciones empieza a poner "1" o "2" y después "0"
y tarda en volver a "0", en ese lapso de tiempo algunos usuarios del sistema me hablan
diciéndome que el sistema se esta atorando o deteniendo, y hasta la fecha no he logrado saber
que es lo que pasa, Alguna idea ??

Saludos.
User avatar
VitalJavier
 
Posts: 241
Joined: Mon Jun 10, 2013 6:40 pm

Re: Uso de Diccionario de Datos ADS y tablas libres

Postby reinaldocrespo » Fri Jan 30, 2015 4:33 pm

Vita,

Si usas tablas libres sin DD, seguramente es mejor usar compatible record locking. AdsLocking( .F. ). Los data locks que ves son locks de advantage. Con tablas libres debieras ver cero allí siempre. AdsLocking( .T. ) es mucho mejor que locks del sistema operativo pero no es compatible con el método tradicional de locks.

Saludos,


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

Re: Uso de Diccionario de Datos ADS y tablas libres

Postby Yessica » Fri Jan 30, 2015 4:34 pm

Yessica wrote:
reinaldocrespo wrote:No veo que haga alguna diferencia y de hecho tu misma pudieras hacer la prueba con el mismo código que te he escrito.

Abajo te incluyo nuevo código que hace la prueba tal como la deseas. Observa que he removido código que crean tablas y el dd y he añadido una sola función de 2 lineas para abrir y ver una tabla libre ya existente después de estar conectados al ADS DD. La tabla existente y el DD son producto del código que anteriormente tienes en este mismo hilo:

Code: Select all  Expand view
//This console mode app shows how to create a few tables of different types.
//How to create an Advantage Data Dictionary and add the newly created
//tables the data dictionary file.
//I'm using various table types using ADS RDDs for DBF/NTX, DBF/VFP, ADT/ADI
//
//After that it atttempts to connect to the dd, create a new table and then
//open the new table as a free table.
//In short- it creates tables and dd, opens dd bound tables and free tables
//at the same time.
//
//The sample code uses pure rdds + some ACE calls.
//No GUI dependency as only a console mode app is being built, which should
//build just the same under Windows as well as under Linux.
//
#include "ads.ch"

#xcommand DEFAULT <uVar1> := <uVal1> ;
                [, <uVarN> := <uValN> ] => ;
                  <uVar1> := iif( <uVar1> == nil, <uVal1>, <uVar1> ) ;;
                [ <uVarN> := iif( <uVarN> == nil, <uValN>, <uVarN> ); ]

REQUEST DBFCDX
REQUEST ADS          //Make sure rddads gets linked to our app.
REQUEST hb_gt_win    //needed for console mode app.

//Static variable cPath will contain the path where tables and DD will be created.
//After connecting to an existing DD, there is no need to use the file path as the
//DD saves the relative path of each table as part of its metadata.
STATIC cPath

*-----------------------------------------------------------------------------------------------------
FUNCTION Main()

   LOCAL afiles

   SetMode(25,80)      //25 lines by 80 columns console

   rddRegister( "ADS", 1 )
   
   rddSetDefault( "ADS" )

   adsSetServerType( ADS_LOCAL_SERVER )

   //NON-compatible locking mode.  If other NON-ADS clients are going to
   //to work on the same tables, then make sure to use compatible locking mode.
   AdsLocking( .t. )  
    AdsRightsCheck( 0 )
   
   //Path for existing .dbf tables maybe sent as a parameter
   //on the command line.  This is just one idea.  It could be saved
   //on a .ini file or hardcoded.
   cPath   := hb_ArgV( 1 )
   
   //in case no path was sent on command line, assume current path.
   DEFAULT cpath := ""  
   
    IF !AdsConnect60( cPath + "test_dd.add", ADS_LOCAL_SERVER, "user1", "password1" )
   
       Alert( "Cannot connect to test_dd" + Str( AdsGetLastError() ) )
      QUIT

   ENDIF

   //Now we create a dbfcdx table to be used as a free table.
   //CreateAndUseFreeTable()
   OpenExistingFreeTable()

       
RETURN NIL


//-----------------------------------------------------------------------------------------------------
STATIC FUNCTION OpenExistingFreeTable()

   DbUseArea( .T., "DBFCDX", "testdbf", "TestAlias", .T., .F. )
   Browse()
   
RETURN NIL


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



Igualmente funciona perfectamente.

Te animo a que escribas un ejemplo reducido, o sea, tan reducido como sea posible, que recree el problema que describes. Seguramente así te podamos ayudar mejor. No creo que exista problema alguno con abrir tablas libres mientras estás conectado a un dd, de otra manera mucha gente estaría reportando ese problema y si te fijas en el foro de Advantage no existe mención de problema tal.


Saludos,


Reinaldo.


Estoy usando lo que me mandaste pero me marca un error aquí:

DbUseArea( .T., "?????", "miADT", "TadtAlias", .T., .F. ) // en los signos de interrogación es el tipo de tabla yo Uso ADT, como seria ahi entonces, porque yo le pongo ADTADI y marca error.

Browse()



Te mando el codigo para que veas como lo uso.

#include "FiveWin.ch"

FUNCTION main() // 32bits
Parameters Rutha
Local cRutha
cRutha := Rutha

********* NUEVO *********
rddRegister( "ADS", 2 )
rddsetdefault( "ADS" )
AdsSetServerType( 7 )
AdsSetFileType( 3 )
AdsRightsCheck(.F.)
*************************

xDic= cRutha+"\dicciona.add"
cUsua="Usario"
pClave="ClaveUsua"

If !AdsConnect60( xDic, 7, cUsua,pClave)
msginfo("Hay problemas en el servidor")
Return
EndIf

DBCLOSEALL()
sele 120
DbUseArea(.t.,"ADS","MOVICONT","MOVI",.f.,.F.)

Browser()

RETURN


y el error que me manda es:

Application
===========
Path and name: C:\BDSysReal\HOSREPOR.exe (32 bits)
Size: 3,968,000 bytes
Compiler version: Harbour 3.2.0dev (r1412151448)
FiveWin Version: FWH 14.12
Windows version: 6.2, Build 9200

Time from start: 0 hours 0 mins 2 secs
Error occurred at: 30/01/2015, 10:29:55
Error description: Error ADSADT/5132 Error 5132: The specified database object name is not valid. "MOVICONT" is not a table or view in the data dictionary.: MOVICONT

Stack Calls
===========
Called from: => DBUSEAREA( 0 )
Called from: REP_VAR.PRG => MAIN( 53 )

System
======
CPU type: AMD A10 PRO-7850B R7, 12 Compute Cores 4C+8G 3700 Mhz
Hardware memory: 7151 megs

Free System resources: 90 %
GDI resources: 90 %
User resources: 90 %

Windows total applications running: 3
1 ,
2 , C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.9600.17415_none_7c576
3 Conmutación de tareas, C:\BDSysReal\HOSREPOR.exe

Variables in use
================
Procedure Type Value
==========================
DBUSEAREA
Param 1: O Class: ERROR
MAIN
Param 1: L .T.
Param 2: C "ADS"
Param 3: C "MOVICONT"
Param 4: C "MOVI"
Param 5: L .F.
Param 6: L .F.
Local 1: U
Local 2: U

Linked RDDs
===========
ADS
ADSADT
ADSVFP
ADSCDX
ADSNTX
DBF
DBFFPT
DBFBLOB
DBFNTX

DataBases in use
================

Classes in use:
===============
1 ERROR
2 HBCLASS
3 HBOBJECT
4 TREG32

Memory Analysis
===============
226 Static variables

Dynamic memory consume:
Actual Value: 0 bytes
Highest Value: 0 bytes


Yessica
 
Posts: 78
Joined: Thu May 28, 2009 6:58 pm

Re: Uso de Diccionario de Datos ADS y tablas libres

Postby Giovany Vecchi » Fri Jan 30, 2015 6:03 pm

A anos trabalho com ads e tive muitos problemas tentando usar dicionarios de dados ADT e DBFs livres. Neste percurso desde 2004 quando comecei com advantage resolvi ir atribuindo a ferramentas que eu mesmo contrui. Primeiramente o xAds para trabalhar com DBFs livres, depois de muito tempo desenvolvi o tAds para trabalhar estilo OOP com RDD e Sql mesmo em ISAM juntos e com varias conexões ao mesmo tempo.
Hoje trabalho assim:
Quando inicio o sistema em tAds chamo a função TADS_START_CONFIG() que inicia o ambiente de Advantage e cria um vetor para poder acessar 121 conexões simultaneas. A conexão 121 ja é atribuida a um dicionario de dados que tAds cria automaticamente na Pasta \DADOSTMP\TADS_TMP.ADD onde os logs e erros de tads são gravados.
Neste caso parei de usar tabelas livres, somente com dicionarios de dados ja que posso manipular varias conexões e varios dicionarios ao mesmo tempo. Posso tambem abrir um dicionario de advantage em LOCAL e outro REMOTO. Tudo é definido pelo numero de conexão que eu atribui quando abro o dicionario de dados. EX:
Code: Select all  Expand view

  TADS_START_CONFIG()

  st_oConexaoDefault := tAdsConnection():New(1,.T.)
  st_oConexaoDefault:cDataDictionary  := "\\SERVER\DADOSADD\Cartorio.add"
  st_oConexaoDefault:cSenhaConnect    := DECRYPT(cSenhaDataDictionary,"MySenha")
  st_oConexaoDefault:nTpConnect       := ADS_REMOTE_SERVER
  lConectou := st_oConexaoDefault:tAdsConnect()

IF !lConectou
  MSGSTOP("Não foi possivel conectar com o servidor principal","Inicie o Programa novamente.")
   RETURN (4)
ENDIF

  TADS_START_CONFIG()

  st_oConexaoDistribuidor := tAdsConnection():New(2,.F.)
  st_oConexaoDistribuidor:cDataDictionary  := "\\200.182.66.121:2081\DADOSADD\Cartorio.add"
  st_oConexaoDistribuidor:cSenhaConnect    := DECRYPT(cSenhaDataDictionary,"MySenha")
  st_oConexaoDistribuidor:nTpConnect       := ADS_AIS_SERVER
  lConectou := st_oConexaoDistribuidor:tAdsConnect()

IF !lConectou
  MSGSTOP("Não foi possivel conectar com o servidor do Distribuidor","Inicie o Programa novamente.")
   RETURN (4)
ENDIF

 


tAds possui a função TAds_CreateClassFromDatabase(f_nConnection,f_cTableName,f_cDirectory) para criar um PRG com a Classe da tabela ex:

TAds_CreateClassFromDatabase(1,"CLIENTES","C:\PROJETOS\CARTORIO\DATABASES\")
Quando criado o PRG Tads implementara a classe DB_CLIENTES que serve para abrir via RDD. Ex:

nConexaoServer := 1
oDb_ClientesServer := DB_CLIENTES():oPenRdd(nConexaoServer)

Apos conectado posso abrir a tabela dos clientes de outra conexão usando a mesma classe

nConexaoDistribuidor := 2
oDb_ClientesDistribuidor := DB_CLIENTES():oPenRdd(nConexaoDistribuidor)


(oDb_ClientesServer:cAlias)->(xBrowse())
(oDb_ClientesDistribuidor:cAlias)->(xBrowse())

Lembrando que conexões de cursor vivo em RDD no ads fica lento a navegação porque a chamada do registro no servidor e refeita toda vez que for reapresentar os dados ou em um Skip.

Para resolver isto use via SQL com cursores estaticos. Quando invocado os registros são carregados por cache e não pela navegação. Neste caso fica igual a qualquer banco de dados SQL, MySQL,
PostGree, SqlServer etc

Code: Select all  Expand view

  oDs_ClientesDistribuidor := tAds()DsNew(1,nConexaoDistribuidor)
  oDs_ClientesDistribuidor:cQrySql := "Select {Static} * from CLIENTES Order By NOME"
  (oDs_ClientesDistribuidor:cAlias)->(xBrowse())
 


Há varias maneiras de conectar usando Tads. tAds é Free e pode ser baixado via TORTOISE com este endereço:

https://tads-class-for-harbour.googlecode.com/svn/trunk

Na Pasta HelpTAds tem um help de tAds.

Nos proximos dias vou elaborar mais alguns exemplos para incluir no projeto.
User avatar
Giovany Vecchi
 
Posts: 223
Joined: Mon Jun 05, 2006 9:39 pm
Location: Brasil

Re: Uso de Diccionario de Datos ADS y tablas libres

Postby VitalJavier » Fri Jan 30, 2015 6:35 pm

Reinaldo, gracias por tu respuesta

Uso Tablas ADT

Quiero entender que si utilizo AdsLocking( .T. ) ADS bloquea los registros ??
(a la hora de escribir en la tabla)

si utilizo AdsLocking( .F. ) yo tengo que bloquear los registros ??
(en todo el sistema yo utilizo RLock, FLock y DbUnLock)
User avatar
VitalJavier
 
Posts: 241
Joined: Mon Jun 10, 2013 6:40 pm

Re: Uso de Diccionario de Datos ADS y tablas libres

Postby reinaldocrespo » Fri Jan 30, 2015 6:50 pm

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

Re: Uso de Diccionario de Datos ADS y tablas libres

Postby VitalJavier » Fri Jan 30, 2015 8:01 pm

Reinaldo, muchas gracias.
User avatar
VitalJavier
 
Posts: 241
Joined: Mon Jun 10, 2013 6:40 pm

Re: Uso de Diccionario de Datos ADS y tablas libres

Postby George » Sun Feb 01, 2015 4:30 pm

Yessica,

Las tablas libres la uso tipo clipper (DBF no ADT) y se pueden usar conjuntamente con el diccionario de datos sin ningun tipo de problemas.
De hecho las he usado ambas en mis aplicaciones por muchos años en tablas de cientos de miles de records.

Te sugiero que haga una prueba con las tablas libres DBF, puedes usar los indices CDX, como en el codigo que te mostre anteriormente. Veras que para usar las tablas solo tienes que seleccionar el area tal como lo haces con las tablas pertenecientes al DD.
El manejo de desde tu codigo de ambos tipos de tablas, las del DD y las tablas libres por medio de [x]Harbour + FWH, es practicamente igual y muy rapido..

Saludos,

George
George
 
Posts: 725
Joined: Tue Oct 18, 2005 6:49 pm

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

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