FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour twbrowse+mysql utilizando recordset é possivel
Posts: 1286
Joined: Mon Feb 25, 2008 02:54 PM
twbrowse+mysql utilizando recordset é possivel
Posted: Mon Jul 26, 2010 10:20 PM

twbrowse+mysql utilizando recordset é possivel?

Alguem teria um exemplo?

muito obrigado

ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
Posts: 215
Joined: Fri Feb 02, 2007 03:38 PM
Re: twbrowse+mysql utilizando recordset é possivel
Posted: Mon Jul 26, 2010 11:57 PM

SGS,

Si es posible, aqui te dejo un pequeÑo ejemplo como guia , altas, bajas y cambios con un Browse de la clase TWbrowse

Include "FiveWin.ch"

Include "Ado.ch"

Include "Report.ch"

//====================
FUNCTION TABLAS()
//====================

Public dTipo[1],dNatural

dNatural :={"Deudora","Acreedora"}

PRIVATE oRs := TOLEAUTO():New("adodb.recordset")
oRs:LockType := adLockOptimistic
oRs:CursorType := adOpenKeyset
oRs:CursorLocation := adUseClient
oRs:ActiveConnection(oCon)
oRs:Source := "Select * from catalogo"
oRs:Open()

Public oDlg,
Public oBtnCancel,oLbx,oBtn

DEFINE DIALOG oDlg RESOURCE 14

REDEFINE LISTBOX oLbx FIELDS oRs:Fields("codigo"):Value, ;
oRs:Fields("nombre"):Value, ;
oRs:Fields("naturaleza"):Value, ;
oRs:Fields("eeff"):Value ,;
oRs:Fields("afectar"):Value ;
FIELDSIZES 100,250,100,250,50 ;
HEADERS "Codigo","Nombre de la Cuenta","Naturaleza","Ubic. EEFF","s/n" ;
COLOR CLR_HBLUE,CLR_WHITE ;
ID 108 of oFld:aDialogs[1]

       oLbx:aJustify  ={.F.,.F.,.f.,.f.,.f.}
       oLbx:bLogicLen = { || oRs:RecordCount }
       oLbx:bGoTop    = { || oRs:MoveFirst() }
       oLbx:bGoBottom = { || oRs:MoveLast() }
       oLbx:bSkip     = { | nSkip | Skipper( oRs, nSkip ) }
       oLbx:cAlias    = "ARRAY"

REDEFINE BUTTON ID 102 OF oDlg ACTION( EditC1(.t.,oLbx ), oLbx:Refresh() )
REDEFINE BUTTON ID 103 OF oDlg ACTION( EditC1(.f.,oLbx ),oLbx:Refresh() )
REDEFINE BUTTON ID 104 OF oDlg ACTION( BorrO( oLbx ), oLbx:Refresh() )
REDEFINE BUTTON ID 105 OF oDlg ACTION ( oDlg:End() )

RETURN NIL

//=================================
FUNCTION EditC1(SiNuevo, oLbx )
//=================================

Local oDlg, lSalvar := .f.

IF sinuevo = .t.
oRs:ADDNEW()
oRs:Fields("codigo"):value := SPACE(12)
oRs:Fields("nombre"):value := SPACE(45)
oRs:Fields("naturaleza"):value := SPACE(9)
oRs:Fields("eeff"):value := SPACE(50)
oRs:Fields("afectar"):value := 0
ENDIF

LoadLibrary("BWCC32.DLL")

DEFINE BRUSH oBrush FILENAME "OSXBack.bmp"

DEFINE DIALOG oDlg RESOURCE 23 BRUSH oBrush TRANSPARENT

REDEFINE GET oRs:Fields("codigo"):value ID 101 of oDlg
REDEFINE GET oRs:Fields("nombre"):value ID 102 of oDlg
REDEFINE COMBOBOX oRs:Fields("naturaleza"):value ID 103 of oDlg PROMPTS dNatural
REDEFINE COMBOBOX oRs:Fields("eeff"):value ID 104 of oDlg PROMPTS dTipo
REDEFINE CHECKBOX oRs:Fields("afectar"):value ID 105 of oDlg

REDEFINE BUTTON ID 106 OF oDlg action ( lSalvar := .T. , oDlg:End() )
REDEFINE BUTTON ID 107 OF oDlg ACTION ( lSalvar := .F. , oDlg:End() ) CANCEL

ACTIVATE DIALOG oDlg CENTERED

IF lSalvar
oRs:UPDATE()
IF !empty(oRs:Filter)
oRs:REQUERY()
ENDIF
ELSE
IF SiNuevo
oRs:DELETE()
oRs:REQUERY()
ENDIF
ENDIF

RETURN

//======================================
STATIC FUNCTION SKIPPER( oRs, nSkip )
//======================================

LOCAL nRec := oRs:AbsolutePosition

oRs:Move( nSkip )

IF oRs:EOF()
oRs:MoveLast()
ENDIF

IF oRs:BOF()
oRs:MoveFirst()
ENDIF

RETURN oRs:AbsolutePosition - nRec

//================================
STATIC FUNCTION BORRO( oLbx )
//================================

oRs:Delete()
oRs:Requery()

oLbx:Refresh()

RETURN

// Nota : la estructura de la tabla es la siguiente :
// NOMBRE : CATALOGO
// CODIGO CARACTER 12
// NOMBRE VARCHAR 40
// NATURALEZA CARACTER 10
// EEFF VARCHAR 35
// AFECTAR TYNINT 1
//=======================================================

espero te sea de utilidad,

Desde Managua Nicaragua

Ramon Paredes

... Desde la Tierra de lagos y Volcanes......
Posts: 1286
Joined: Mon Feb 25, 2008 02:54 PM
Re: twbrowse+mysql utilizando recordset é possivel
Posted: Tue Jul 27, 2010 11:37 AM
Ramon,

Muito obrigado por ter respondido.

Realmente o seu exemplo será de muita utilidade!

Eu uso SQLRDD (xharbour), é possível utilizar com o seu exemplo?

ex:
nID:=SR_GetActiveConnection() //Retorna o ID da conexão atualmente ativa

PRIVATE oRs := TOLEAUTO():New("adodb.recordset")
oRs:LockType := adLockOptimistic
oRs:CursorType := adOpenKeyset
oRs:CursorLocation := adUseClient
oRs:ActiveConnection(nID)
oRs:Source := "Select * from catalogo"

Isso é possível ?

Se não, vc poderia me mostrar a parte da conexão do seu codigo?

Muito obrigado Ramon :-)

SGS
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
Posts: 140
Joined: Tue Oct 11, 2005 02:36 AM
Re: twbrowse+mysql utilizando recordset é possivel
Posted: Tue Jul 27, 2010 12:09 PM

Ola SGS

Tambem uso a SQLRDD e não ha a nescessidade de usar RECORDSET, vc pode usar como um DBF normal, basta utilizar USE <tabela> ALIAS <calias> NEW VIA "SQLRDD"

Qualquer coisa grite.

Jackson Douglas C. Brito

Boa Vista - RR - Brasil

FWH 12.09 Last Build

xHarbour Free

UESTUDIO

SQLRDD
Posts: 1286
Joined: Mon Feb 25, 2008 02:54 PM
Re: twbrowse+mysql utilizando recordset é possivel
Posted: Tue Jul 27, 2010 12:22 PM

Jackson,

Eu já utilizo assim hoje, porem:

Em um cliente especifico com um cadastro de produtos de mais de 200.000 itens, estamos instalando o sistema local e o banco remoto, do jeito que esta fica muito lento a consulta de produtos, por isso estou testanto o desempenho com RECORDSET.

De qualquer forma obrigado

SGS

ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
Posts: 140
Joined: Tue Oct 11, 2005 02:36 AM
Re: twbrowse+mysql utilizando recordset é possivel
Posted: Tue Jul 27, 2010 12:34 PM

Ola amigo

Infelizmente para se fazer um BROWSE com 100 mil ou mais registros remotamente fica lento mesmo, isso sendo RECORDSET ou USE normal, vc tera que fazer via consulta e trazer o resultado da consulta, agora tem uma função na SQLRDD que limita o NR de REGISTROS a serem mostrados "só num lembro agora" pois deve servir para o seu proposito

Qualquer coisa grite

Jackson Douglas C. Brito

Boa Vista - RR - Brasil

FWH 12.09 Last Build

xHarbour Free

UESTUDIO

SQLRDD
Posts: 215
Joined: Fri Feb 02, 2007 03:38 PM
Re: twbrowse+mysql utilizando recordset é possivel
Posted: Tue Jul 27, 2010 03:23 PM

SGS,

Efectivamente como te indica miragerr aun con Recordsets tendrias el problema de lentitud, tendrias que crear querys para tus consultas de productos asi dinamizar el proceso a nivel remoto, ahora SQLRDD lo que crea realmente en tablas SQL es un record set cuando haces : USE "MITABLA" NEW SHARED ALIAS "MI_RECORDSET" VIA "SQLRDD" por lo que no ganarias mucho en velocidad usando ADO con ese volumen de registros.

Otra sugerencia es que crees indices condicionales desde codigo antes del recordset que efectivamente SQLRDD te lo permite y entonces ganas velocidad en procesos selectivos ,

Saludos desde Managua, Nicaragua

Ramon Paredes

... Desde la Tierra de lagos y Volcanes......
Posts: 1286
Joined: Mon Feb 25, 2008 02:54 PM
Re: twbrowse+mysql utilizando recordset é possivel
Posted: Tue Jul 27, 2010 04:54 PM

Obrigado Ramon :)

ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
Posts: 1286
Joined: Mon Feb 25, 2008 02:54 PM
Re: twbrowse+mysql utilizando recordset é possivel
Posted: Wed Jul 28, 2010 11:01 AM

Ola Ramon,

Testei a minha base com mais de 200.000 registros com recordset e ficou muito bom, demora um pouquinho para carregar no inicio mais depois é uma maravilha.

Porem, tenho um problema:

Estou usando esta configuração:

oRs:LockType := adLockOptimistic
oRs:CursorType := adOpenDynamic
oRs:CursorLocation := adUseClient

Com esta configuração não estou conseguindo visualizar as alterações feitas por outros usuários. Tenho que fazer mais alguma coisa?

Obrigado

SGS

ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
Posts: 140
Joined: Tue Oct 11, 2005 02:36 AM
Re: Ramon - twbrowse+mysql utilizando recordset é possivel
Posted: Wed Jul 28, 2010 11:35 AM

Ola amigos

SGS esse é um dos problemas quando vc carrega todos os registros para o CACHE do computador local, ele não atualiza os dados, a não ser que vc recarregue novamente o CACHE, como lhe falei vc esta lidando com SQL que é totalmente diferente de DBF, tambem tive este problema, e tive que mudar minha forma de desenvolver, mais se vc quer que apareçam todos os dados de forma RÁPIDA e que venhan sempre com as alterações igual se faz com DBF, lhe aconcelho a testar o ADS SERVER, esse sim meu amigo, é rápido em tudo, mesmo via remoto, só tem um porem, é caro.

Espero ter ajudado

Jackson Douglas C. Brito

Boa Vista - RR - Brasil

FWH 12.09 Last Build

xHarbour Free

UESTUDIO

SQLRDD
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: Ramon - twbrowse+mysql utilizando recordset é possivel
Posted: Wed Jul 28, 2010 01:16 PM

Amigos con Ado se puede solo tienes que paginar el browse , como lo hace google y listo

Saludos

Posts: 1286
Joined: Mon Feb 25, 2008 02:54 PM
Re: Ramon - twbrowse+mysql utilizando recordset é possivel
Posted: Wed Jul 28, 2010 03:03 PM

jbrita,

tem um exemplo?

ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
Posts: 537
Joined: Mon Jan 16, 2006 03:42 PM
Re: twbrowse+mysql utilizando recordset é possivel
Posted: Thu Jul 29, 2010 01:57 PM

Amigo aca va una imagen

http://yfrog.com/jwimagennlj
la idea es pagina con botones de paginacion ejemplo
Boton Inicio
Boton Atras
Boton Siguente
Boton Fin

FUNCTION paginar_Adelante(oLbx,oRcs,oTabla,oCbx,cIndice)
*--------------------------------------------------------
Local oOrden:=cIndice[oCbx:nAt]
Local campo
If (oRcs:RecordCount) # 0
oRcs:MoveLast()
campo:=oRcs:Fields(oOrden):value
oRcs:Close()
oRcs:Open("SELECT * FROM "+oTabla+" WHERE "+oOrden+" > '" + Alltrim(campo) +"' ORDER BY "+oOrden+" LIMIT 100", oConexion, 1, 3)
If (oRcs:RecordCount) == 0
oRcs:Close()
oRcs:Open("SELECT * FROM "+oTabla+" Order By "+oOrden+" DESC LIMIT 100", oConexion, 1, 3)
oRcs:Sort:=oOrden
Endif
oRcs:Refresh()
oLbx:refresh(.t.)
oLbx:SetFocus()
Endif
RETURN(.t.)

FUNCTION paginar_Atras(oLbx,oRcs,oTabla,oCbx,cIndice)
*-----------------------------------------------------
Local oOrden:=cIndice[oCbx:nAt]
Local campo
If (oRcs:RecordCount)# 0
oRcs:MoveFirst()
campo:=oRcs:Fields(oOrden):value
oRcs:Close()
oRcs:Open("SELECT * FROM "+oTabla+" WHERE "+oOrden+" < '" + AllTrim(campo) +"' ORDER BY "+oOrden+" desc LIMIT 100", oConexion, 1, 3)
If (oRcs:RecordCount) == 0
oRcs:Close()
oRcs:Open("SELECT * FROM "+oTabla+" Order By "+oOrden+" LIMIT 0,100",oConexion, 1, 3)
Endif
If (oRcs:RecordCount) < 100
oRcs:Close()
oRcs:Open("SELECT * FROM "+oTabla+" ORDER BY "+oOrden+" LIMIT 100",oConexion, 1, 3)
Endif
oRcs:Sort:=oOrden
oRcs:Refresh()
oLbx:refresh(.t.)
oLbx:SetFocus()
Endif
RETURN(.t.)

FUNCTION paginar_Inicio(oLbx,oRcs,oTabla,oCbx,cIndice)
*------------------------------------------------------
Local oOrden:=cIndice[oCbx:nAt]

oRcs:Close()
oRcs:Open("SELECT * FROM "+oTabla+" Order By "+oOrden+" LIMIT 0,100",oConexion, 1, 3)
oRcs:Refresh()
oLbx:refresh(.t.)
oLbx:SetFocus()
RETURN(.t.)

FUNCTION paginar_Fin(oLbx,oRcs,oTabla,oCbx,cIndice)
*---------------------------------------------------
Local oOrden:=cIndice[oCbx:nAt]

oRcs:Close()
oRcs:Open("SELECT * FROM "+oTabla+" Order By "+oOrden+" DESC LIMIT 100", oConexion, 1, 3)
oRcs:Sort:=oOrden
oRcs:Refresh()
oLbx:Refresh(.t.)
oLbx:SetFocus()

RETURN(.t.)

Continue the discussion