BROWSE com muitos registros - MYSQL remoto

BROWSE com muitos registros - MYSQL remoto

Postby MGA » Tue Mar 02, 2010 9:23 pm

Amigos,

Tenho uma tabela de produtos com muitos registros, e vou acessar este banco MYSQL remotamente.

Alguem teria uma dica de como criar uma consulta com TSBROWSE/TWBROWSE + SQLRDD, de modo que esta consulta não fique lenta?

Muito Obrigado
Last edited by MGA on Wed Mar 03, 2010 11:34 am, edited 1 time in total.
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1254
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

Re: BROWSE com muitos registros - MYSQL remoto

Postby Willi Quintana » Wed Mar 03, 2010 1:52 am

Hola,,
Con TWBROWSE y EAGLE1 lo hago asi:

Code: Select all  Expand view  RUN

oDatos := TMSQuery():New( oMySQL )
oDatos:Open( "SELECT * FROM productos ORDER BY detalle" )
If oDatos:RecCount() > 0
   REDEFINE LISTBOX oLbx ;
                  FIELDS   oDatos:FieldGet(1), ;
                               oDatos:FieldGet(2), ;
                               oDatos:FieldGet(3) ;
                  HEADERS "Codigo", ;
                                "detalle", ;
                                "precio" ;
                 SIZES 80,350,100 ;
                 ID 101 OF oDlg

                  MySetBrowse(oLbx, oDatos)

EndIf
                           


 
User avatar
Willi Quintana
 
Posts: 1023
Joined: Sun Oct 09, 2005 10:41 pm
Location: Cusco - Perú

Re: BROWSE com muitos registros - MYSQL remoto

Postby MGA » Wed Mar 03, 2010 11:33 am

Willi,

obrigado por ter respondido.

estou usando o SQLRDD, e da maneira como postou não ficaria lento? pois todo o conteudo da tabela seria carregado no browse!

Obrigado
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1254
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

Re: BROWSE com muitos registros - MYSQL remoto

Postby sjingo » Wed Mar 03, 2010 1:47 pm

Prueba a usar XBROWSE + ADO, va muy bién. Pues ADO crea en forma local un array denominado recordset con los datos de nuestra consulta. imagínate si es un array será rápido. Únicamente al inicio de la carga se siente un poco la espera, después todo OK.

Un saludo
Marcelo Jingo
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: BROWSE com muitos registros - MYSQL remoto

Postby MGA » Wed Mar 03, 2010 1:51 pm

Marcelo,

Por favor, teria um exemplo de como usar ADO e um exemplo de browse com ADO?

Muito obrigado
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1254
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

Re: BROWSE com muitos registros - MYSQL remoto

Postby sjingo » Wed Mar 03, 2010 3:11 pm

1.- Bajar de la página de Mysql http://www.mysql.com el conector ODBC la versión que esté disponible. Si tienes problemas te puedo enviar a tu correo.

2. Ejecutar el programa de instalación del conector.

3. Asegurarte que en el servidor no haya restricciones para el puerto del Mysql (supongo ya lo tienes resuelto)

4. Aqui va el código de ejemplo:
Code: Select all  Expand view  RUN

//Crear el objeto conexión
//--------------------------------------------------
TRY
    oCon := TOleAuto():new("adodb.connection")
CATCH oError
    MsgStop( "No se pudo crear el objeto conexión !")
    RETURN(.F.)
END

cdrive:="MySQL ODBC 5.1 DRIVER"
cserver:="tu IP"
cDB:="nombre_BDatos"
cUser:="nombre_usuario"
cPasw:="clave"
//Abrir la conexión usando el objeto connection creado
//----------------------------------------------------
oCon:ConnectionString :="Driver={"+alltrim(cDrive)+"};Server=" + ALLTRIM(cServer) + ;
";Port=3306;Database=" + ALLTRIM(cDB) + ;
";User=" + ALLTRIM(cUser)+;
"; Password=" + ALLTRIM(cPasW) + ";Option=3;"

TRY
    oCon:Open()
CATCH oError
    MsgInfo("Falló el intento de conexión con la cuenta "+cuser+" , REVISE LA CONEXION DE SU RED O LA CONEXION A INTERNET !")
    RETURN(.F.)
END

//Creamos el objeto recodset
    TRY
        ::oRsBrw= TOleAuto():New("adodb.recordset")
    CATCH oError
        MsgStop( "No se ha podido crear el RECORDSET de la Tabla Seleccionada!", )
        ShowError(oError)
        ::oRsBrw := NIL
        RETURN(.F.)
    END
               
//Configuramos el recordset
    ::oRsBrw:CursorLocation := adUseClient
    ::oRsBrw:LockType := adLockOptimistic
    ::oRsBrw:CursorType := adOpenKeyset//adOpenDynamic
    ::oRsBrw:Source :=  "SELECT * FROM MITABLA"
    ::oRsBrw:ActiveConnection(oCon)

//abrimos el recordset
    TRY
        ::oRsBrw:Open()
    CATCH oError
        MsgStop( "No se pudo abrir La Tabla Seleccionada!")
        RETURN(.F.)
    END/



Aqui va la creacion del xbrowse de forma basica:
Code: Select all  Expand view  RUN

   ::oBrw := TXBrowse():New( ::oWnd )
   ::oBrw:nleft:=0
    ::oBrw:ntop:=30
   ::oBrw:lFastEdit:= .t.
    ::oBrw:lEditmode:= .t.
   ::oBrw:nMarqueeStyle   := MARQSTYLE_HIGHLCELL
   ::oBrw:nColDividerStyle = LINESTYLE_DARKGRAY

   ::oBrw:SetAdo(::oRsBrw,.t.,.t.)
   ::oBrw:CreateFromCode()

   ::oBrw:bpastEof={||MsgBeep()}
 

Espero te sirva

Un saludo
Marcelo Jingo
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: BROWSE com muitos registros - MYSQL remoto

Postby MGA » Wed Mar 03, 2010 5:06 pm

Muito obrigado Marcelo.
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1254
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

Re: BROWSE com muitos registros - MYSQL remoto

Postby MGA » Wed Mar 03, 2010 5:45 pm

Marcelo,

1) De onde baixo o ADORDD?

2) Poderia enviar para o meu email:
Bajar de la página de Mysql http://www.mysql.com el conector ODBC la versión que esté disponible. Si tienes problemas te puedo enviar a tu correo.

santosuj@bol.com.br

obrigado
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1254
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

Re: BROWSE com muitos registros - MYSQL remoto

Postby MGA » Wed Mar 03, 2010 8:49 pm

Marcelo,

eu consegui fazer os testes e como você disse ele demora um pouco mais para carregar mais depois fica muito bom para navegar no browse.

porém, fiquei com algumas dúvidas:

1)Imagine o usuário fazendo uma venda, ele vai consultar na mesma venda varios produto, em cada consulta o sistema vai carregar a base(objeto RECORDERSET). Isso vai gerar demora! Como você faz?

2)Pensei em carregar no inicio do sistema o objeto RECORDERSET, desse modo não vai gerar a demora citada acima, porque os dados já estão carregados, mais o problema é: Imagine que o usuário adicione um novo produto ou altere algum campo, eu teria que prever isso para recarregar o objeto RECORDERSET.

Desde já te agradeço
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1254
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

Re: BROWSE com muitos registros - MYSQL remoto

Postby sjingo » Wed Mar 03, 2010 9:53 pm

1)Imagine o usuário fazendo uma venda, ele vai consultar na mesma venda varios produto, em cada consulta o sistema vai carregar a base(objeto RECORDERSET). Isso vai gerar demora! Como você faz?

Entiendo que te refieres a que el usuario está facturando. Si no son muchos productos se podría hacer la consulta de toda la tabla y bajarlo al Recordset, y si hay cambios en la tabla sea con insert delete o update se puede usar el método requery() para refrescar el Recordset

Iden para la segunda pregunta.

Ado da la oportunidad de usar varias formas de hacer los cambios a las tablas, bien puedes hacer usando los métodos del recordset o ejecutando una sentencia SQL directamente a la tabla mediante el objeto Comand o mediante el método Execute() del objeto Conexión que es la forma que yo lo hago.

Personalmente cargo todas las tablas(recordsets) que necesito al inicio de la aplicación. Lo importante es cargar sólo lo necesario usando las colunltas SELECT.

Al momento estoy desarrollando un sistema de control de vehículos donde inicialmente cargo 20 tablas que no son muy grandes, hoy por hoy no se nota mucha la lentitud, veremos que pasa luego cuando aumenten los datos.

Lo que nos queda es PROBAR.

Saluditos

Marcelo Jingo
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: BROWSE com muitos registros - MYSQL remoto

Postby MGA » Thu Mar 04, 2010 11:10 am

Marcelo,

você poderia me enviar a sua ADORDD.PRG/LIB? a que consegui é muito antiga!

Marcelo: y si hay cambios en la tabla sea con insert delete o update se puede usar el método requery() para refrescar el Recordset
Você teria exemplos (PRG) de como usar INSERT/DELETE/UPDATE/REQUERY, me ajudaria muito.

Marcelo, uma duvida:
Imagine que um usuario(1) carrega a tabela de produtos ao iniciar, outro usuario(2) entra e carrega toda tabela de produto tambem, se o usuario(1) adicionar um produto, este novo produto nao estara visivel para o usuario(2)?

Obrigado

santosuj@bol.com.br
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1254
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

Re: BROWSE com muitos registros - MYSQL remoto

Postby sjingo » Thu Mar 04, 2010 3:14 pm

Estimado Santos
No uso ADORDD, lo hago directamente con las instrucciones propias.

Lo que quieres hacer depende del tipo de cursor que implementes, cada uno tiene sus ventajas y desventajas. Debemos estar claros que se quiere hacer, si se quiere solo consultar o una edición en línea. De acuerdo al tipo será más lento o más velóz.

*******************
Tipo de cursor: adOpenForwardOnly,sólo permite desplazarse hacia adelante en los registros
AdOpenKeyset, Igual que un cursor dinámico, excepto que no se pueden ver los registros que agregan otros usuarios
adOpenDynamic, Las incorporaciones, cambios y eliminaciones que hacen otros usuarios permanecen visibles, y se admiten todo tipo de movimientos entre registros
adOpenStatic, Cursor estático. Una copia estática de un conjunto de registros que se puede usar para buscar datos o generar informes. Las incorporaciones, cambios o eliminaciones que hacen otros usuarios no son visibles.
Tipo de bloqueo: adLockReadOnly, Predeterminado. Sólo lectura- no puede modificar los datos
AdLockPessimistic, Bloqueo pesimista, registro a registro: el provedor hace lo necesario para asegurar la modificación correcta de los registros, generalmente bloqueando registros en el origen de datos durante el preceso de modificación
AdLockOptimistic, Bloqueo optimista, registro a registro: el provedor usa bloqueo optimista, bloqueando registros sólo cuando llama al método Update.
AdLockBatchOptimistic, Actualizaciones optimistas por lotes: requirido para el modo de actualización por lotes como contraposición al modo de actualización inmediata.
****************

Ejemplos de como hago para insertar y eliminar
//----------------------------------------------------------------------------//
//Inserto Un registro vacío para luego rellenar en el los datos
//Esto es conveniente así tenemos el registro con el siguiente numero autoincrementado
//oRs Recordset que maneja la tabla
//tabla nombre de la tabla donde se va a insertar
//is_auto indica si el registro es autoincremental, por defecto es verdadero
//akey_ext array con el nombre y valor del campo con clave externa
METHOD InsIt(oRs,tabla,is_auto,akey_ext) CLASS TVehic
local cQuery,nobra
local i
default is_auto:=.t.

CursorWait()
if is_auto
if akey_ext!=nil
cQuery :="insert into " + tabla + "(" + oRs:Fields(0):Name + ","+ akey_ext[1] +") values(0,"+str(akey_ext[2])+")"
else
cQuery :="insert into " + tabla + "(" + oRs:Fields(0):Name + ") values(0)"
endif
else
if akey_ext!=nil
cQuery :="insert into " + tabla + "(" + oRs:Fields(0):Name + ","+ akey_ext[1] + ") values('" + space(20) + "'," + akey_ext[2]+")"
else
cQuery :="insert into " + tabla + "(" + oRs:Fields(0):Name + ") values('"+space(20)+"')" //ojo si el campo es numerico puede dar error
endif
endif
oCon:Execute(cQuery,"INSERT")
oRs:Requery()
oRs:Movelast()

return .t.

METHOD DelIt(oRs,ctabla) CLASS TVehic
local cQuery,nrec,nlen
local uclave //Registro actual //asumimos que el campo clave es el primero
local cfield

CursorWait()
if !oRs:BOF .and. !oRs:EOF
uclave:=oRs:Fields(0):Value //Registro actual //asumimos que el campo clave es el primero
cfield:=oRs:Fields(0):Name
cQuery :="delete from " + ctabla + " where "+ cfield +" = " +if(valtype(uclave)="N",str(uclave),"'"+alltrim(uclave)+"'")

nrec:=oRs:AbsolutePosition
oCon:Execute(cQuery,"DELETE")
oRs:Requery()
nLen:=oRs:RecordCount()
if !oRs:BOF .and. !oRs:EOF
if nrec > nLen
oRs:Movelast()
else
oRs:Move(nrec-1)
endif
endif
else
msgstop("No hay nada para borrar")
endif
return nil

Para los cambios de la fila el mismo Xbrowse lo hace automaticamente indicando el tipo de edicion a la columna:

for n := nini to Len( ::oBrw:aCols )
oCol:nEditType := EDIT_GET
next

Espero te sirva

Saludos

Marcelo Jingo
Marcelo Jingo
User avatar
sjingo
 
Posts: 229
Joined: Sat Mar 18, 2006 3:42 pm
Location: Ibarra-Ecuador

Re: BROWSE com muitos registros - MYSQL remoto

Postby MGA » Thu Mar 04, 2010 8:07 pm

Ok,

Marcelo muito obrigado amigo, agora vou fazer varios testes referente as informações que você me forneceu.

Muito obrigado
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1254
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá

Re: BROWSE com muitos registros - MYSQL remoto

Postby Armando » Thu Mar 04, 2010 10:14 pm

SGS

Visita este blog

http://sqlcmd.blogspot.com/

Ahí encontraras casí todo sobre ADO y MySql

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
User avatar
Armando
 
Posts: 3242
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: BROWSE com muitos registros - MYSQL remoto

Postby MGA » Fri Mar 05, 2010 5:02 pm

Obrigado Armando!
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
MGA
 
Posts: 1254
Joined: Mon Feb 25, 2008 2:54 pm
Location: Brasil/PR/Maringá


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot] and 16 guests