Page 1 of 1

BROWSE com muitos registros - MYSQL remoto

PostPosted: Tue Mar 02, 2010 9:23 pm
by MGA
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

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Wed Mar 03, 2010 1:52 am
by Willi Quintana
Hola,,
Con TWBROWSE y EAGLE1 lo hago asi:

Code: Select all  Expand view

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
                           


 

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Wed Mar 03, 2010 11:33 am
by MGA
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

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Wed Mar 03, 2010 1:47 pm
by sjingo
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

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Wed Mar 03, 2010 1:51 pm
by MGA
Marcelo,

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

Muito obrigado

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Wed Mar 03, 2010 3:11 pm
by sjingo
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

//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

   ::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

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Wed Mar 03, 2010 5:06 pm
by MGA
Muito obrigado Marcelo.

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Wed Mar 03, 2010 5:45 pm
by MGA
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

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Wed Mar 03, 2010 8:49 pm
by MGA
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

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Wed Mar 03, 2010 9:53 pm
by sjingo
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

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Thu Mar 04, 2010 11:10 am
by MGA
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

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Thu Mar 04, 2010 3:14 pm
by sjingo
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

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Thu Mar 04, 2010 8:07 pm
by MGA
Ok,

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

Muito obrigado

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Thu Mar 04, 2010 10:14 pm
by Armando
SGS

Visita este blog

http://sqlcmd.blogspot.com/

Ahí encontraras casí todo sobre ADO y MySql

Saludos

Re: BROWSE com muitos registros - MYSQL remoto

PostPosted: Fri Mar 05, 2010 5:02 pm
by MGA
Obrigado Armando!