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
TxBrowse y ADS query - SOLUCIONADO
Re: TxBrowse y ADS query - Necesito Ayuda
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
Y listo, ahora se puede tratar el alias como un objeto oDbf, por lo menos hice para probar:
Y funciona ok.
Pruebo luego en casa y comento.
Saludos.
Rolando
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
Code: Select all
oDbf:goto(10)
msginfo(oDbf:NOMBRE)
Pruebo luego en casa y comento.
Saludos.
Rolando
Re: TxBrowse y ADS query - SOLUCIONADO
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
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
- Patricio Avalos Aguirre
- Posts: 1028
- Joined: Fri Oct 07, 2005 1:56 pm
- Location: La Serena, Chile
- Contact:
Re: TxBrowse y ADS query - SOLUCIONADO
Hola Rolando
Podrias mostrar es de crear indices temporales?
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
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
Re: TxBrowse y ADS query - SOLUCIONADO
Patricio,
Te muestro a continuación un ejemplo básico de como uso la TDatabase con un área abierta por un query ADS.
Lo más importante de todo está en esto:
Cualquier duda, estoy a disposición. Saludos.
Rolando
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
Code: Select all
oCol:bLClickHeader:= {|| nRecno:=oDbf:recno() ,;
oDbf:CreateIndex( cCarpetaInstalacion+"\DBF's\TEMP.CDX", "TALON", "TALON") , ;
oDbf:goto(nRecno) , oBrw:refresh() }
Rolando