Page 1 of 1

Vaciar un diccionario de Datos

Posted: Thu Jul 19, 2012 6:38 pm
by JavierVital
que tal Saludos a todos
Estoy usando ADS
A alguien se le a presentado que tenga que vaciar su diccionario de datos
desde software de un solo golpe o sea sin saber que tablas tenga, solo vaciarlo
O sacar una lista de las tablas que tenga en el DD

Saludos.

Re: Vaciar un diccionario de Datos

Posted: Thu Jul 19, 2012 9:22 pm
by RSalazarU
Javier:

Claro que si, muchas veces, y lo hago de varias formas:

1. Elimino directamente el archivo/diccionario y lo vuelvo a crear.
2. Utilizo la funcion AdsDDRemoveTable( cFile,,,nConnect ) para eliminar la defincion de las tablas (si no recuerdo mal, esta funcion tiene un parametro que te elimina, tambien, fisicamente la tabla).

Un consejo, antes de eliminar hay que desencriptar las tablas, yo lo hago con la siguiente funcion:

Code: Select all

Function AdsDDDecriptTable( cTable, nConnect )
   if SQL_Ejecuta( "SELECT name, Table_Encryption Encrypted FROM system.tables WHERE name='"+cTable+"'",,nConnect,"DDTABLES" )
      if DDTABLES->( Reccount() > 0 .AND. FIELD->Encrypted .AND. AdsEsPosibleAbrirTabla(cTable) )
         SQL_Ejecuta("EXECUTE PROCEDURE sp_ModifyTableProperty('"+cTable+"','TABLE_ENCRYPTION','FALSE','','')",.T.)
      endif
      DDTABLES->( DBCloseArea() )
   else
      MSGSTOP("Fallo el proceso de desencriptacion de la tabla"+CRLF+PADC("Proceso cancelado",50),"SISTEMA")
      return .F.
   endif
Return .T.
 
Puedes hacer una funcion similar que en vez de desencriptar elimine la tabla.

Atentamenmte

Rolando.
Cochabamba, Bolivia.

Re: Vaciar un diccionario de Datos

Posted: Thu Jul 19, 2012 10:10 pm
by Patricio Avalos Aguirre
Hola

Puedes usar la funcion AdsDirectory(), el cual entrega todas las tablas del diccionario

te adjunto como lo utilizo yo..

Code: Select all

aIndex := AdsDirectory()
oMeter:nTotal := Len( aIndex )
for i := 1 to len( aIndex )
    cDbf := Left( aIndex[i], len( aIndex[i] )-1 )
    oMeter:cText := "Creando Indice para BD :"+cDbf
    oMeter:Set( i )
    if Netuse( cDbf, .f. )
        if ADSGETNUMINDEXES() > 0
            if !AdsReindex()
                MsgInfo( AdsGetLastError(), "Usuario" )
            endif
        endif
    endif
    USE
next i
dbCloseAll()
 

Re: Vaciar un diccionario de Datos

Posted: Fri Jul 20, 2012 2:07 pm
by JavierVital
Rolando, Patricio.

Gracias., lo voy a poner en practica y les aviso como quedo lo que quiero hacer.

Saludos.

Re: Vaciar un diccionario de Datos

Posted: Fri Jul 27, 2012 6:29 pm
by JavierVital
Patricio

Lo que queria es quitar todas las tablas del DD y volver a meter las tablas
Te explico por que, lo que pasa es que al crear un temporal el sistema lo mete el DD
y mi DD ya esta lleno de temporales y tiene un tamaño increible.

Entonces esto es lo que hice :

Code: Select all

    aIndex := AdsDirectory()
    FOR I := 1 TO LEN(aIndex)
        AdsDDRemoveTable(aIndex[I])
    NEXT

**************** Aqui fui metiendo uno por uno de mis archivos asi

       AdsDDAddTable("MONEDAS",".\DATOS\MONEDAS.ADT")


 
Gracias asi me funciono perfecto y es cuestion de segundos.

Re: Vaciar un diccionario de Datos

Posted: Fri Jul 27, 2012 7:33 pm
by Patricio Avalos Aguirre
Javier

yo tambien uso tablas temporales pero no las anexo al DD

te dejo un ejemplo como lo hago

Code: Select all

    cFileTemp := cNewFileName( cPathTmp + "\TEMPO", "DBF" )

    dbCreate( cFileTemp, ;
                            { { "cod_prod", "c", 15,0},;
                              { "des_prod", "C", 40,0},;
                              { "Stock",    "n", 10,0},;
                              { "cant1",    "n", 10,0},;
                              { "cant2",    "n", 10,0},;
                              { "cant3",    "n", 10,0},;
                              { "cant4",    "n", 10,0},;
                              { "cant5",    "n", 10,0}}, "DBFCDX", .T., "TEMP" )

    INDEX ON FIELD->COD_PROD TAG CODIGO

 

Re: Vaciar un diccionario de Datos

Posted: Sat Jul 28, 2012 4:04 pm
by JavierVital
Patricio, Saludos.

Yo creo que el sistema los mete al DD por que uso tablas ADT
Y tambien los Temporales los pongo en un Directorio aparte de donde estan las tablas
del sistema.

Code: Select all


cFile := CreaTemporal()


FUNCTION CreaTemporal
    LOCAL cTemp, aTempora := {}, cCrea
    SELECT INDICES
    DbGoTop()
    LOCATE FOR AllTrim(INDICES->NOMBRE) == "TEMPORAL"
    IF !FOUND()
        MsgAlert("Verifique con el Administrador del Sistema"+CRLF+"No se encuentra el Indice de Temporales...","Alerta!")
        RETURN("")
    ENDIF
    INDICES->(ARlock())
        REPLACE INDICES->INDICE WITH (INDICES->INDICE + 1)
        cTemp := "TM"+Replicate('0',8-Len(AllTrim(Str(INDICES->INDICE)))) + AllTrim(Str(INDICES->INDICE))
        INDICES->(DbCommit())
    INDICES->(DbUnLock())
    cCrea := cTemp //+ ".ADT"
    AADD(aTempora,{"ARTICULO"   ,"C",15,0})
    AADD(aTempora,{"NOMBRE"     ,"C",60,0})
    AADD(aTempora,{"CAJAS"      ,"N",15,4}) //  999,999.99
    AADD(aTempora,{"PIEZAS"     ,"N",15,4}) //  999,999.99
    AADD(aTempora,{"PRECIO"     ,"N",15,4}) //  99,999.99
    AADD(aTempora,{"IMPORTE"    ,"N",15,2}) // 999,999.99
    AADD(aTempora,{"DESCTO"     ,"N",06,2}) //     999.99
    AADD(aTempora,{"IMPDES"     ,"N",09,2}) //  99,999.99
    AADD(aTempora,{"GTOTAL"     ,"N",10,2}) // 999,999.99
    AADD(aTempora,{"SERIES"     ,"C",25,0})
    AADD(aTempora,{"DESCTOA"    ,"N",06,2}) //     999.99
    AADD(aTempora,{"RENGLON"    ,"N",05,0}) //         99
    AADD(aTempora,{"PRECIOA"    ,"N",09,2}) //  99,999.99
    AADD(aTempora,{"CDESCTO"    ,"C",05,0}) //  99,999.99
    AADD(aTempora,{"CANTIDAD"   ,"N",09,2}) //  99,999.99
    AADD(aTempora,{"CODIGO"     ,"C",15,0})
    AADD(aTempora,{"COSTOC"     ,"N",15,4}) //  99,999.99
    AADD(aTempora,{"COSTOP"     ,"N",15,4}) //  99,999.99
    AADD(aTempora,{"PROMO"      ,"L",1,0})
    AADD(aTempora,{"ARTPROMO"   ,"C",15,0})
    AADD(aTempora,{"IMPORTEC"  ,"N",15,4}) //  99,999.99
    AADD(aTempora,{"IMPORTEP"  ,"N",15,4}) //  99,999.99    
    AADD(aTempora,{"FECHA"     ,"D",08,0})
    AADD(aTempora,{"PRECIOT"    ,"N",15,4}) //  99,999.99
    AADD(aTempora,{"IMPORTET"   ,"N",15,2}) // 999,999.99
    DbCreate(cPathTEM+cCrea,aTempora,DbSetDriver())
RETURN cTemp

** cMiRuta := DiskName()+":"+CurDir()
**  cPathTEM := cPathTEM := cMiRuta+"\temporal\"

Es exactamente lo mismo, el detalle que son tablas ADT y creo que por eso los mete al DD

Re: Vaciar un diccionario de Datos

Posted: Tue Jul 31, 2012 1:14 pm
by reinaldocrespo
Javier;

Para conocer que objetos tipo tablas son parte del ADS DD, utiliza el ACE API AdsDirectory() que devuelve un array cargado con las tablas que forman el DD.

Code: Select all

      afiles := AdsDirectory()
 


Reinaldo.