Page 1 of 1

twbrowse+mysql utilizando recordset é possivel

PostPosted: Mon Jul 26, 2010 10:20 pm
by MGA
twbrowse+mysql utilizando recordset é possivel?

Alguem teria um exemplo?


muito obrigado

Re: twbrowse+mysql utilizando recordset é possivel

PostPosted: Mon Jul 26, 2010 11:57 pm
by Ramon Paredes
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

Re: twbrowse+mysql utilizando recordset é possivel

PostPosted: Tue Jul 27, 2010 11:37 am
by MGA
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 :D

SGS

Re: twbrowse+mysql utilizando recordset é possivel

PostPosted: Tue Jul 27, 2010 12:09 pm
by miragerr
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.

Re: twbrowse+mysql utilizando recordset é possivel

PostPosted: Tue Jul 27, 2010 12:22 pm
by MGA
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

Re: twbrowse+mysql utilizando recordset é possivel

PostPosted: Tue Jul 27, 2010 12:34 pm
by miragerr
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

Re: twbrowse+mysql utilizando recordset é possivel

PostPosted: Tue Jul 27, 2010 3:23 pm
by Ramon Paredes
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

Re: twbrowse+mysql utilizando recordset é possivel

PostPosted: Tue Jul 27, 2010 4:54 pm
by MGA
Obrigado Ramon :)

Re: twbrowse+mysql utilizando recordset é possivel

PostPosted: Wed Jul 28, 2010 11:01 am
by MGA
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

Re: Ramon - twbrowse+mysql utilizando recordset é possivel

PostPosted: Wed Jul 28, 2010 11:35 am
by miragerr
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

Re: Ramon - twbrowse+mysql utilizando recordset é possivel

PostPosted: Wed Jul 28, 2010 1:16 pm
by jbrita
Amigos con Ado se puede solo tienes que paginar el browse , como lo hace google y listo

Saludos

Re: Ramon - twbrowse+mysql utilizando recordset é possivel

PostPosted: Wed Jul 28, 2010 3:03 pm
by MGA
jbrita,

tem um exemplo?

Re: twbrowse+mysql utilizando recordset é possivel

PostPosted: Thu Jul 29, 2010 1:57 pm
by jbrita
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.)