TxBrowse y ADS query - SOLUCIONADO

User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: TxBrowse y ADS query - Necesito Ayuda

Post by rolando »

Carlos y Rolando,

INCREIBLE, sólo eso puedo decir, creo que han "dado en el clavo".

Con sólo colocar "{static}" al SELECT, ya la cosa mejoró notablemente y, si bién no iguala la velocidad del ARCHITECT, se le acerca mucho.

Ahora debo definir que usar, porque tenía todo hecho para usar un array pero al hacer xBrowse() (ver mi último ejemplo), lo que estoy haciendo es hojear el alias abierto.

Uso una sola vez el xBrowse para hojear DBF's y uso la clase TDataBase. ¿Como debería hacer para asignarle al xBrowse el alias {static} creado con el query?

Gracias

Rolando :D
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: TxBrowse y ADS query - Necesito Ayuda

Post by rolando »

Me respondo a mí mismo.

Estaba tan enfrascado en este problema que no me dí cuenta, al releer mi último post me dí cuenta que seguramente es de lo más sencillo.

Por ahora estoy en mi trabajo y sólo pude probar pero creo que funcionará con hacer un

Code: Select all

Database:oDbf
Y listo, ahora se puede tratar el alias como un objeto oDbf, por lo menos hice para probar:

Code: Select all

oDbf:goto(10)
msginfo(oDbf:NOMBRE)
Y funciona ok.

Pruebo luego en casa y comento.

Saludos.

Rolando :D
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: TxBrowse y ADS query - SOLUCIONADO

Post by rolando »

Listo,

Agradezco a todos los que ayudaron para que solucione esta cuestión.

Como dije en mi post anterior, pasé el area del query a un oDbf usando la clase TDatabase.

Luego de esto creo índices temporales para cada campo y puedo hacer un xBrowse en el cual indexar al presionar sobre cada cabecera, tal cual se hace normalmente con una dbf.

El único inconveniente que tengo es que el query lleva el "{static}" para ser más rápido y eso evita que el recno() de cada registro no sea el real de la DBF sino que sea el de la oDbf creada. Pero eso, para editar un registro sobre la DBF, lo supero haciendo un seek a la DBF y listo.

Gracias.

Rolando :D
User avatar
Patricio Avalos Aguirre
Posts: 1028
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile
Contact:

Re: TxBrowse y ADS query - SOLUCIONADO

Post by Patricio Avalos Aguirre »

Hola Rolando

Podrias mostrar es de crear indices temporales?
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
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: TxBrowse y ADS query - SOLUCIONADO

Post by rolando »

Patricio,

Te muestro a continuación un ejemplo básico de como uso la TDatabase con un área abierta por un query ADS.

Code: Select all

#INCLUDE "FIVEWIN.Ch"
#include "xbrowse.ch"
#include "ADS.CH"


REQUEST HB_LANG_ES
REQUEST DBFCDX, DBFFPT
REQUEST ADS,ADSKeyCount,ADSKeyNo,OrdKeyCount,OrdKeyNo, AdsGetRelKeyPos, AdsSetRelKeyPos,DBFCDX

Function PruebaADS()

local cCarpetaInstalacion:="\\Asus\d\VERCE\RJCTaller" , cFechaDesde:="01/01/1976" , cFechaHasta:="01/07/2012"
local cServer  := cCarpetaInstalacion+"\DBF's\"
local lConect:=.f. , oBrush , oCur1

cConsulta1:="Select {static} TALON, NOMBRE, DIRECCION, LOCALIDAD, BARRIO, CODPOSTAL, TELEFONO1, TELEFONO2, "+;
              "CELULAR, EMAIL, ARTEFACTO, MARCA, MODELO, SERIE, UBICADO, FECHAIN, "+ ;
              "FECHALIQUI, FINALIZADO, RETIRO, FECHA_COM, DETALLECL, DETALLETA, "+;
                            "ESTADO, DEALER, GARANTIZA, STATUS from TRABAJOS where "+;
                            "(FECHAIN>='"+cFechaDesde+"' and FECHAIN<='"+cFechaHasta+"'"+;
                            " or "+;
                            "FECHALIQUI>='"+cFechaDesde+"' and FECHALIQUI<='"+cFechaHasta+"'"+;
                            " or "+;
                            "RETIRO>='"+cFechaDesde+"' and RETIRO<='"+cFechaHasta+"')"

        ADSSETDATEFORMAT("DD/MM/YYYY")       // agregado por sugerencia foro fwh
        RddRegister("ADS",1)
    RddSetDefault("ADS")
    AdsSetServerType ( 2 )
    SET FILETYPE TO CDX

        DbSelectArea( 0 )             // agregado por MArio

    AdsConnect( cServer , 2 )

     IF ! ADSCreateSQLStatement("SQLarea",2)  // 2 == ADS_CDX
       MsgAlert( "ADSCreateSQLStatement('SQLarea',2)" )
       RETU .F.
   ENDIF


     if ADSExecuteSQLDirect( cConsulta1 )


     DATABASE oDbf            // asigno el area abierta del query a el objeto oDbf
                                                        // la clase Tdatabase

     define brush oBrush resource "GRAY"                            //"WATER2"
     define cursor oCur1 resource 222
     define dialog oDlg resource "LISTARREGIS_XBR" brush oBrush transparent of oWnd

          oBrw := TXBrowse():New( oDlg )
            oBrw:CreateFromResource( 4001 )
            oBrw:SetoDbf( oDbf )
            oBrw:bClrStd:={||{nrgb(0,0,0),nRGB(243,250,200)}}
            oBrw:nRowHeight:=20
            oBrw:lContrastClr := .f.       // para evitar que _ salgan aleatoriamente con otra tinta


            oCol                                := oBrw:AddCol()
            oCol:cHeader        := "TALON"
            oCol:bStrData       := { || oDbf:TALON }
            oCol:nHeadStrAlign  := AL_CENTER
            oCol:nDataStrAlign  := AL_LEFT
            oCol:nWidth         := 60
            oCol:bLClickHeader:= {|| nRecno:=oDbf:recno() ,;
                                     oDbf:CreateIndex( cCarpetaInstalacion+"\DBF's\TEMP.CDX", "TALON", "TALON") , ;
                                     oDbf:goto(nRecno) , oBrw:refresh() }

                                // con el CreateIndex() genero un indice cada vez que se presiona sobre la cabecera
                                // Hay otra manera de hacerlo pero siempre me indexa por la columna 1
                                // (será la versión de FWH que uso - la 10.04)
                                // y luego hago que vuelva a la línea en que estaba al indexar
                                // sólo copio dos columnas de xBrowse a modo de ejemplo porque son todas iguales


            oCol                                := oBrw:AddCol()
            oCol:cHeader        := "NOMBRE"
            oCol:bStrData       := { || oDbf:NOMBRE }
            oCol:nHeadStrAlign  := AL_CENTER
            oCol:nDataStrAlign  := AL_LEFT
            oCol:nWidth         := 230
            oCol:bLClickHeader:= {||nRecno:=oDbf:recno() , ;
                                   oDbf:CreateIndex( cCarpetaInstalacion+"\DBF's\TEMP.CDX", "NOMBRE", "NOMBRE") ,;
                                   oDbf:goto(nRecno) , oBrw:refresh() }



     Activate dialog oDlg center on init {||oBrw:setfocus(), oBrw:refresh()  }



     endif // de if ADSExecuteSQLDirect( cConsulta1 )


        AdsDisconnect()
    sqlarea -> ( dbclosearea() )

    Return nil
Lo más importante de todo está en esto:

Code: Select all

oCol:bLClickHeader:= {|| nRecno:=oDbf:recno() ,;
                                     oDbf:CreateIndex( cCarpetaInstalacion+"\DBF's\TEMP.CDX", "TALON", "TALON") , ;
                                     oDbf:goto(nRecno) , oBrw:refresh() }
Cualquier duda, estoy a disposición. Saludos.

Rolando :D
Post Reply