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 :oops:

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) :roll:

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