FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour browse and SQL
Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
browse and SQL
Posted: Sat Oct 03, 2009 07:31 PM

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

Posts: 1364
Joined: Wed Jun 21, 2006 12:39 AM
Re: browse and SQL
Posted: Sat Oct 03, 2009 07:39 PM

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

Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: browse and SQL
Posted: Sat Oct 03, 2009 09:58 PM

Amigo yo lo hago con xbrowse paginado de 30 o 50 con botones de paginar
usando la metodo LIMIT 0.50
ADO+MYSQL

Saludos

Posts: 389
Joined: Wed Nov 29, 2006 01:51 PM
Re: browse and SQL
Posted: Sun Oct 04, 2009 12:14 AM

Jbrita,

podrias poner un ej. del codigo, de como lo haces ???

Gracias.

Salu2, Ariel.

Posts: 326
Joined: Sun Oct 09, 2005 05:22 PM
Re: browse and SQL
Posted: Sun Oct 04, 2009 01:45 AM

" rel="noopener">



En mi caso uso xBrowse con SQLRDD y veo una buena respuesta. Una parte del código usado según imagen, es:

Code (fw): Select all Collapse
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.)
Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: browse and SQL
Posted: Sun Oct 04, 2009 05:25 AM

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

Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: browse and SQL
Posted: Mon Oct 05, 2009 01:21 PM

Que estas ocupando para la conexion de tus tablas

Saludos

Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: browse and SQL
Posted: Mon Oct 05, 2009 04:05 PM

JBrita,

TMySql

Saludos,
Mauricio

Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: browse and SQL
Posted: Mon Oct 05, 2009 04:08 PM

Esta bien Mauricio que Mysql, pero ocupas ADO, TMYSQL que libreria ocupas en tus sistemas

Saludos

Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: browse and SQL
Posted: Mon Oct 05, 2009 04:16 PM

JBrita

Perdon,

ya corregi el post, pero me ganasta es TMySql

Mauricio

Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: browse and SQL
Posted: Mon Oct 05, 2009 04:36 PM

Mauricio , ademas de paginar quieres hacer busquedas en ese browse o solo quieres mostrar

saludos

Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: browse and SQL
Posted: Mon Oct 05, 2009 05:46 PM

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

Posts: 299
Joined: Mon Oct 22, 2007 03:03 PM
Re: browse and SQL
Posted: Mon Oct 05, 2009 07:30 PM

No, Si está de lo más entretenido!!
Jeje :oops:

Saludos



Angel, Valencia, Venezuela



xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
Posts: 299
Joined: Mon Oct 22, 2007 03:03 PM
Re: browse and SQL
Posted: Mon Oct 05, 2009 07:38 PM
Yo lo hago así, no se si te sirva de algo

Code (fw): Select all Collapse
******************************************************************************************
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 (fw): Select all Collapse
******************************************************************************************
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) :-)
Saludos



Angel, Valencia, Venezuela



xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
Posts: 199
Joined: Thu Oct 06, 2005 09:07 PM
Re: browse and SQL
Posted: Mon Oct 05, 2009 09:25 PM

Hola Blanco,

Gracias por voy a probar tu solucion,
(copy / paste )

saludos,
Mauricio