twbrowse+mysql utilizando recordset é possivel?
Alguem teria um exemplo?
muito obrigado
twbrowse+mysql utilizando recordset é possivel?
Alguem teria um exemplo?
muito obrigado
SGS,
Si es posible, aqui te dejo un pequeÑo ejemplo como guia , altas, bajas y cambios con un Browse de la clase TWbrowse
//====================
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
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,
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
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
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
Obrigado Ramon ![]()
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
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
Amigos con Ado se puede solo tienes que paginar el browse , como lo hace google y listo
Saludos
jbrita,
tem um exemplo?
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.)