Mas sobre ADS - Solucionado (a mi modo)

Mas sobre ADS - Solucionado (a mi modo)

Postby rolando » Sat Jul 21, 2012 3: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: Select all  Expand view
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 :D
Last edited by rolando on Mon Jul 23, 2012 11:53 am, edited 1 time in total.
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Mas sobre ADS

Postby Marcelo Via Giglio » Sat Jul 21, 2012 6:42 pm

Rolando,

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

Code: Select all  Expand view

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: Select all  Expand view

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
 
Marcelo Via Giglio
 
Posts: 1064
Joined: Fri Oct 07, 2005 3:33 pm
Location: Cochabamba - Bolivia

Re: Mas sobre ADS

Postby rolando » 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 :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Mas sobre ADS - Solucionado (a mi modo)

Postby rolando » 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: Select all  Expand view
// 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 :D
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Mas sobre ADS - Solucionado (a mi modo)

Postby Patricio Avalos Aguirre » Mon Jul 23, 2012 4: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
User avatar
Patricio Avalos Aguirre
 
Posts: 1060
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile

Re: Mas sobre ADS - Solucionado (a mi modo)

Postby rolando » Mon Jul 23, 2012 6: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
User avatar
rolando
 
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 50 guests