Page 1 of 2
browse and SQL
Posted: Sat Oct 03, 2009 7:31 pm
by Mauricio
Hola,
Cual es el mejor browse para ver tablas en SQL con conexion remota, o cual es el mejor procedimiento para hacerlo, traerme las tablas y guardarlas en DBF.
revisando lo que hacen los visores de tablas SQL, por defecto vienen configuradas para traer 50 registros, como puedo hacer eso en FWH ?
tengo tablas con 10,20, 30mil registros y se tardaran una eternidad al hacer el acceso remoto, si continuo con mis browse tradicionales.
o es mejor cambiar la programacion y no usar browse?
Gracias anticipadas.
Mauricio
Re: browse and SQL
Posted: Sat Oct 03, 2009 7:39 pm
by horacio
Mauricio, no es que el browse traiga 50 registros por defecto, sino es la clausula limit en la cadena del query. y con respecto a traer esa cantidad de registros en forma remota lo veo, al menos dificil de tolerar por el tiempo que tardaría. No podés fraccionar la información, por ejemplo yo tengo funcionando un pequeño programa de facturación, y para mostrar las facturas, lo hago en un browse, pero solo las del corriente mes por defecto. si necesitan de otros periodos ellos pueden escribir su propia sentencia. Solo ideas
salu2
Re: browse and SQL
Posted: Sat Oct 03, 2009 9:58 pm
by jbrita
Amigo yo lo hago con xbrowse paginado de 30 o 50 con botones de paginar
usando la metodo LIMIT 0.50
ADO+MYSQL
Saludos
Re: browse and SQL
Posted: Sun Oct 04, 2009 12:14 am
by Ariel
Jbrita,
podrias poner un ej. del codigo, de como lo haces ???
Gracias.
Salu2, Ariel.
Re: browse and SQL
Posted: Sun Oct 04, 2009 1:45 am
by Alfredo Arteaga
[url=http://img121.imageshack.us/i/cas ... .jpg[/img]
[/url]
En mi caso uso xBrowse con SQLRDD y veo una buena respuesta. Una parte del código usado según imagen, es:
Code: Select all
FUNCTION Open_Table(oBrw)
LOCAL oIcon, nClrB, oWChld, oLbx, oCbx
LOCAL oDbf, cDbf, aIdx, cFile, oDBas
LOCAL oPop, cVar, oB[6], cAlias , nTab
CursorWait()
nClrB:=LightColor(215,nClrM)
aIdx:={"<sin índice>"}
cVar:= "<sin índice>"
lFil:=.F.
cDbf:=Alltrim(oBrw:aArrayData[oBrw:nArrayAt,1])
cAlias:=Open_Dbf(cDbf,lData)
DATABASE oDbf
oDbf:GoTop()
nReg:=oDbf:LastRec()
DEFINE ICON oIcon RESOURCE "IconSys"
DEFINE WINDOW oWChld MDIChild TITLE cTitl OF oWnd ICON oIcon
DEFINE BUTTONBAR oBar 3DLOOK BUTTONSIZE 26,26 2007 OF oWChld
DEFINE BUTTON oB[1] OF oBar RESOURCE "B_Bus","","B_DBs" TOOLTIP "Buscar (Ctrl+B)" ;
ACTION Buscar(oCbx,oLbx,oDbf) NOBORDER
DEFINE BUTTON oB[2] OF oBar RESOURCE "B_Loc" TOOLTIP "Localizar (Ctrl+L)" ;
ACTION Localizar(oLbx,oDbf) NOBORDER
DEFINE BUTTON oB[3] OF oBar RESOURCE "B_Prt" TOOLTIP "Reportes (Ctrl+R)" GROUP ;
ACTION New_Report(oLbx) NOBORDER
DEFINE BUTTON oB[4] OF oBar RESOURCE "B_Xls" TOOLTIP "Enviar a Excel" GROUP ;
ACTION To_Excel(oLbx) NOBORDER
DEFINE BUTTON oB[5] OF oBar RESOURCE "B_Ver","","B_DVr" TOOLTIP "Ver/Ocultar registros borrados";
ACTION Desp_Del(oLbx) NOBORDER
DEFINE BUTTON oB[6] OF oBar RESOURCE "B_Fil" TOOLTIP "Filtrar por... (Ctrl+F)";
ACTION Filtrar(oLbx,oDbf,oB) NOBORDER
MENU oPop POPUP
MENUITEM "en &Mosaico" ACTION oWnd:Tile() ;
WHEN Len(oWnd:oWndClient:aWnd)>0
MENUITEM "en &Horizontal" ACTION oWnd:Tile(.T.) ;
WHEN Len(oWnd:oWndClient:aWnd)>0
MENUITEM "en &Cascada" ACTION oWnd:Cascade() ;
WHEN Len(oWnd:oWndClient:aWnd)>0
ENDMENU
DEFINE BUTTON OF oBar RESOURCE "B_Ven" TOOLTIP "Organizar ventanas" GROUP ;
ACTION oWnd:Tile() NOBORDER MENU oPop
oBar:bRClicked:={|| Que_Pasa("¿Que intentas?...")}
@ 0.25,31 COMBOBOX oCbx VAR cVar ITEMS aIdx OF oBar SIZE 150,300 ;
ON CHANGE Sel_Index(oCbx,oDbf,oLbx,oB) FONT oWChld:oFont
oCbx:cTooltip:="Clasificar..."
oBar:bPainted:={|hDC| oBar:Say( 7,400,Tran(nReg,"9999,999")+" Reg(s)",nClrM,,oWnd:oFont,.T.,.T.)}
oLbx:=TXBrowse():New(oWChld)
oLbx:nMarqueeStyle :=3
oLbx:nColDividerStyle:=4
oLbx:SetRDD()
IF DbSetDriver()="DBFCDX"
oLbx:bClrStd:={|| {IF(Deleted(),CLR_HRED,CLR_BLACK),IF((oLbx:cAlias)->(OrdKeyNo())%2==0,nClrB,CLR_LGRAY)}}
ELSE
oLbx:bClrStd:={|| {IF(Deleted(),CLR_HRED,CLR_BLACK),CLR_WHITE}}
ENDIF
oLbx:bRClicked :={|nRow,nCol| Pop_Menu(nRow,nCol,oWChld,oCbx,oLbx,oDbf,oB)}
oLbx:bKeyDown :={|nKey| Val_nKey(nKey,oLbx,oDbf,oCbx,oB)}
oLbx:CreateFromCode()
oWChld:SetControl(oLbx)
oWChld:GoTop()
ACTIVATE WINDOW oWChld VALID Close_Table(oLbx,oDbf,cDbf,cAlias)
RETURN (NIL)
STAT FUNC Close_Table(oLbx,oDbf,cDbf,cAlias)
oLbx:End()
oDbf:Close()
Close_Dbf(cDbf,cAlias)
Set(_SET_DELETED,lSetDel)
RETURN (.T.)
Re: browse and SQL
Posted: Sun Oct 04, 2009 5:25 am
by Mauricio
Gracias a todos,
tomare sus soluciones para intentar implementar la mia,
estoy hablando de mySQL en remoto, en local funciona perfecto, al hacer el modulo con acceso remoto se me duermen los clientes cuando descargan las tablas.
Gracias.
Mauricio
Re: browse and SQL
Posted: Mon Oct 05, 2009 1:21 pm
by jbrita
Que estas ocupando para la conexion de tus tablas
Saludos
Re: browse and SQL
Posted: Mon Oct 05, 2009 4:05 pm
by Mauricio
JBrita,
TMySql
Saludos,
Mauricio
Re: browse and SQL
Posted: Mon Oct 05, 2009 4:08 pm
by jbrita
Esta bien Mauricio que Mysql, pero ocupas ADO, TMYSQL que libreria ocupas en tus sistemas
Saludos
Re: browse and SQL
Posted: Mon Oct 05, 2009 4:16 pm
by Mauricio
JBrita
Perdon,
ya corregi el post, pero me ganasta es TMySql
Mauricio
Re: browse and SQL
Posted: Mon Oct 05, 2009 4:36 pm
by jbrita
Mauricio , ademas de paginar quieres hacer busquedas en ese browse o solo quieres mostrar
saludos
Re: browse and SQL
Posted: Mon Oct 05, 2009 5:46 pm
by Mauricio
Hola Jbrita,
tienes algun correo de contacto, estamos usando el foro como chat y si logro dar con bola pongo la solucion aqui, asi lo demas usuarios no tienen que leerse nuestro chat.
saludos,
Mauricio
Re: browse and SQL
Posted: Mon Oct 05, 2009 7:30 pm
by ADBLANCO
No, Si está de lo más entretenido!!
Jeje
![Embarassed :oops:](./images/smilies/icon_redface.gif)
Re: browse and SQL
Posted: Mon Oct 05, 2009 7:38 pm
by ADBLANCO
Yo lo hago así, no se si te sirva de algo
Code: Select all
******************************************************************************************
FUNCTION prueba2() && Programa de prueba
******************************************************************************************
LOCAL oDlg ,;
oButSalir ,;
oTabla ,;
oLbx ,;
cTabla := "MODELO"
LOCAL cCommand,oQuery
LOCAL oControl:=colores()
LOCAL aTabla:={},aLoaded
CURSORWAIT()
cCommand :='SELECT * '+;
'FROM `'+cDTBase+'`.`'+cTabla+'` '+;
'limit 90000'
oQuery :=TMSQuery():New( oDTBase )
oQuery:Open( cCommand )
// Traemos el resultado a nuestro cliente
IF ( oQuery:nRowCount>0 )
DEFINE DIALOG oDlg RESOURCE "prueba";
TITLE 'Prueba con oQuery Directo' ;
OF oWnd
oDlg:lHelpIcon :=.f. && Apago el Icono de Help
REDEFINE LISTBOX oLbx ;
FIELDS PadL( oQuery:FieldGet( 1 ), 6, " " ),;
oQuery:xFieldGet( 3 ), ;
oQuery:xFieldGet( 4 ), ;
oQuery:xFieldGet( 5 ), ;
oQuery:xFieldGet( 6 ) ;
FIELDSIZES 45,45,190,45,45;
HEADERS "Codigo", ;
"Cod/Estado", ;
"Ciudad", ;
"Abreviatura", ;
"Cod.Area" ID 401 OF oDlg
oQuery:GoTop():Read() // No se olvide nunca de esta linea
MySetBrowse(oLbx,oQuery) // No Olvidarse Nunca de Esta Línea
oLbx:cAlias := "ARRAY" // No Olvidarse de "ESTO", si no se tranca
oLbx:lCellStyle := .f. // Apaga El estilo por celda
oLbx:nLineStyle := 3 // coloca la linea entre registros
// poner colores a las lineas
oControl:aLbxBkGClr[ 1 ] :={ || iif( oQuery:nRow %2=0, oControl:nCL_HGreen, oControl:nCD_HGreen ) }
oLbx:bTextColor :={ | nRow, nCol, nStyle | iif( nStyle>=0 .and. nStyle<=3,;
oControl:aLbxTxtClr[ nStyle+1 ],;
CLR_WHITE ) }
oLbx:bBkColor :={ | nRow, nCol, nStyle | iif( nStyle>=0 .and. nStyle<=3,;
eval( oControl:aLbxBkGClr[ nStyle+1 ] ),;
CLR_WHITE ) }
// colores hasta aqui
REDEFINE Button oButSalir ID 101 OF oDlg;
MESSAGE "Salir";
ACTION oDlg:End() && Sale de la Rutina, Por Convencion el ID es 101
oDlg:oClient := oLbx
ACTIVATE DIALOG oDlg CENTER
oQuery:close()
ELSE
MSGALERT("No se puede abrir la tabla: " + cTabla, "Operación Cancelada" )
ENDIF
RETURN NIL
y me trabaja bastante rápido, aunque más rápido es transferir el query a una matriz provisional
Asi
Code: Select all
******************************************************************************************
FUNCTION prueba3() && Programa de prueba
******************************************************************************************
LOCAL oDlg ,;
oButSalir ,;
oTabla ,;
oLbx ,;
nReg :=0 ,;
cTabla := "MODELO"
LOCAL cCommand,oQuery,aLoaded
LOCAL aTabla[300000,5]
CURSORWAIT()
cCommand :='SELECT * '+;
'FROM `'+cDTBase+'`.`'+cTabla+'` '+;
'limit 300000'
oQuery :=TMSQuery():New( oDtBase )
oQuery:Open( cCommand )
// Traemos el resultado a nuestro cliente
IF ( oQuery:nRowCount>0 )
*MSGALERT(oQuery:nRowCount)
CURSORWAIT()
DO WHILE !oQuery:lEof
nReg +=1
aTabla[nReg,1]:=oQuery:FieldGet( 1 )
aTabla[nReg,2]:=oQuery:FieldGet( 3 )
aTabla[nReg,3]:=oQuery:FieldGet( 4 )
aTabla[nReg,4]:=oQuery:FieldGet( 5 )
aTabla[nReg,5]:=oQuery:FieldGet( 6 )
oQuery:Fetch()
ENDDO
DEFINE DIALOG oDlg RESOURCE "prueba";
TITLE 'Prueba con oQuery pasado a Arreglo'
oDlg:lHelpIcon :=.f. && Apago el Icono de Help
REDEFINE LISTBOX oLbx ;
FIELDS transform(aTabla[oLbx:nAt,1],'999'),;
aTabla[oLbx:nAt,2],;
aTabla[oLbx:nAt,3],;
aTabla[oLbx:nAt,4],;
aTabla[oLbx:nAt,5];
ID 401 OF oDlg
*oLbx:Ajustify :={1,2,0,2,2} && Justificado de Columnas 0=izq, 1=Der, 2=Cent
*oLbx:nFreeze := 3
oLbx:SetArray( aTabla )
REDEFINE BUTTON oButSalir ID 101 OF oDlg;
ACTION oDlg:End() && Sale de la Rutina, Por Convencion el ID es 101
oDlg:oClient := oLbx
ACTIVATE DIALOG oDlg CENTER
oQuery:close()
ELSE
MSGALERT("No se puede abrir la tabla: " + cTabla, "Operación Cancelada" )
ENDIF
RETURN NIL
(Ya me puse serio)
![Rolling Eyes :roll:](./images/smilies/icon_rolleyes.gif)
Re: browse and SQL
Posted: Mon Oct 05, 2009 9:25 pm
by Mauricio
Hola Blanco,
Gracias por voy a probar tu solucion,
(copy / paste )
saludos,
Mauricio