FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Mas sobre ADS - Solucionado (a mi modo)
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Mas sobre ADS - Solucionado (a mi modo)
Posted: Sat Jul 21, 2012 03:18 PM
Buen día,

Si bién he resuelto el problema, en forma intuitiva, para pasar el resultado de un query ADS a un objeto de la clase Tdatabase, me interesaría saber si hay algun modo en que se pueda hacer lo mismo pero pasando ese resultado del query ADS a un array.

Por ej.

Code (fw): Select all Collapse
aArray:=sqlarea


Esto simplificaría mucho el uso del ADS y sé que para otros lenguajes esto se puede hacer. ¿Porqué no con FWH?

Saludos.

Rolando :-)
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Mas sobre ADS
Posted: Sat Jul 21, 2012 06:42 PM
Rolando,

debes hacer como una si fuera un DBF, de memoria creo que sería algo así:

Code (fw): Select all Collapse
aArray := {}
sqlarea -> ( DBGoTop() )
Do While ! sqlarea -> ( Eof() )
aAux := {}
for i := 1 to sqlarea -> ( fCount() )
     AADD( aAux, sqlarea -> ( fieldGet( i ) ) )
next
AADD( aArray, aAux )
sqlarea -> ( DBSkip() )
end do


o

Code (fw): Select all Collapse
aArray := {}
sqlarea -> ( DBGoTop() )
Do While ! sqlarea -> ( Eof() )
AADD( aArray, {} )
for i := 1 to sqlarea -> ( fCount() )
     AADD( aArray[ LEN( aArray ) ],  sqlarea -> ( fieldGet( i ) ) )
next
sqlarea -> ( DBSkip() )
end do
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Mas sobre ADS
Posted: Sat Jul 21, 2012 10:26 PM
Marcelo,

Ese es precisamente el problema. Esto lo consulté en un post anterior.

Si hago como explicas (cosa que hacía), trabajando en red local, el query es instantáneo pero cuando el resultado del query son 30000 registros, el tiempo que tarda en armar el array de la forma que comentas es de 2.27 minutos (Una eternidad).

Por esto, y con la ayuda del foro, usé un query incluyendo "{static}" y luego pasé el sqlarea a un oDbf usando la clase Tdatabase y en todo ese proceso llego al xBrowse en sólo 5.31 segundos.

Si esto lo pude hacer en forma "intuitiva" usando la clase Tdatabase, supongo que alguien con mayores conocimientos que yo podría crear alguna función que lo pasara directamente a un array u otra forma de hacer un xBrowse con toda su funcionalidad directamente sobre el sqlarea (área activa de resultante del query ADS).

Fijate que si luego del query hago sqlarea->(xBrowse()), en forma instantánea se visualiza el xBrowse().

Saludos.

Rolando :-)
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Mas sobre ADS - Solucionado (a mi modo)
Posted: Mon Jul 23, 2012 12:01 PM
Buen día,

Creo haber solucionado el tema (por lo menos para el uso que pretendía hacer del query ADS).

Hice una pequeña función que añadí a la clase TxBrowse (al final del xBrowse.prg) al que, obviamente, hay que agregar a la lista de compilación.

Esto hace que pueda ordenar creando un índice temporal en cada ocasión de ordenado por columna.

Como creo debe haber algún/os interesado/s, copio el agregado con su correspondiente explicación.

Code (fw): Select all Collapse
// 22/07/2012   -  agregado by Rolando Cerella
//  - Agrego "Function OrdenoSQLADSarea(oDbf,cIndex,nCol,oBrw)" para poder hacer un xbrowse a un query ADS tipo "{static}"
//            Luego de hacer un query "{static}", en el área activa queda el resultado de este query y esto lo paso a un
//            objeto oDbf (Usando la clase TDatabase). esto permite hacerle un xbrowse pero de sólo lectura, no se puede
//            editar (se podría actualizar haciendo nuevamente el query y luego "DATABASE oDbf").
//            Para listar el resultado del query en una xbrowse se hace primero un query ADS tipo static y luego:
//
//                     sqlarea->(dbgotop())
//                       DATABASE oDbf
//
//            Para ordenar por columna (cuando se presiona sobre la cabecera), agregué al final de la xBrowse.prg, esta función
//            "Function OrdenoSQLADSarea(oDbf,cIndex,nCol,oBrw)" que se invoca así:
//
//                 nColumna:=OrdenoSQLADSarea(oDbf,cIndex,nCol,oBrw) - los datos que se le pasan son:
//                                      -- oDbf   = el objeto database creado
//                                      -- cIndex = en nombre del campo por el que se odenará
//                                      -- nCol   = número de la columna que se ordenará
//                                      -- oBrw   = objeto del TxBrowse
//                 ----> RETORNA el nro de columna por el que se ordenó por última vez, quizás convenga tenerlo
//                       por si hiciera falta luego para otra función.
//
//

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


Function OrdenoSQLADSarea(oDbf,cIndex,nCol,oBrw)
                                                                                                                    //cIndex  ej. "GARANTIZA"
                                                                                                                    // nCol = columna que se ordena
        local nRecno

        nRecno:=oDbf:recno()
        oDbf:CreateIndex("TEMP.CDX", cIndex, cIndex)
        oDbf:goto(nRecno)
        For f = 1 to len(oBrw:aCols)
                if f=nCol
                  oBrw:aCols[f]:cOrder:="A"
                 else
                    oBrw:aCols[f]:cOrder:=" "
                endif
        next
        oBrw:refresh()

 Return nCol


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


Como se puede ver, sencillito, pero para mí, rendidor.

Saludos.

Rolando :-)
Posts: 1074
Joined: Fri Oct 07, 2005 01:56 PM
Re: Mas sobre ADS - Solucionado (a mi modo)
Posted: Mon Jul 23, 2012 04:39 PM

Hola

Gracias rolando por el tip, vamos a ponerlo en practica a ver si nos funciona si n pasar a Arreglo

Saludos
Patricio

__________________________________________________________________
Version: Harbour 3.2.0dev (r1307082134),Compiler: Borland C++ 5.8.2 (32-bit)
PCode version: 0.3, FWH 13.2
http://www.sialm.cl
Posts: 593
Joined: Sat May 12, 2007 11:47 AM
Re: Mas sobre ADS - Solucionado (a mi modo)
Posted: Mon Jul 23, 2012 06:35 PM

Patricio,

Funciona correctamente (según lo explicado). Cualquier duda consúltame.

Es un gusto compartir lo que aprendo (aunque sea poco), porque es en base a lo que me enseñan los que saben más en este grandioso foro.

Saludos.

Rolando :D

Continue the discussion