FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Actualizar datos en MySql con TDolphin
Posts: 1713
Joined: Tue Oct 28, 2008 06:26 PM

Actualizar datos en MySql con TDolphin

Posted: Wed Sep 17, 2014 06:07 PM
Amigos

Necesito actualizar los datos de una tabla de 1300 registros y mucho tarda, antes lo hacia con REPLACE con DBF y es rápido
Ahora lo hago asi:
Code (fw): Select all Collapse
  
 oDATA:=oServer:Query( "SELECT * FROM DATPER ORDER BY CODIGO FOR UPDATE")

   Do While !oDATA:Eof()
      Vacacion() //Obtengo los valores
      nPend:=nTiene-nTomodas
       oDATA:TIENE:=nTiene;oDATA:TOMADAS:=nTomadas;oDATA:PEND:=nPend
       oDATA:Save()
      oDATA:Skip()
   Enddo


He encontrado un ejemplo de Daniel usando UPDATE pero le pone el mismo valor a todos los registros y también tarda, lo hago asi
Code (fw): Select all Collapse
    oDATA:=oServer:Query( "SELECT * FROM DATPER ORDER BY CODIGO FOR UPDATE")

  Do While !oDATA:Eof()
      Vacacion() //Obtengo los valores
      nPend:=nTiene-nTomodas
       cQry:="UPDATE datper SET TIENE = " + ClipValue2SQL(nTiene) + "TOMADAS = " + ClipValue2SQL(nTomadas) + " PEND = " + ClipValue2SQL(nPend) 
       oDATA:oServer:SqlQuery( cQry )
       oDATA:LoadQuery()
       oDATA:Skip()
   Enddo


Quizás hay otra manera de hacer la actualización más rápida.

Gracias por la ayuda.

Saludos,

Adhemar

Saludos,



Adhemar Cuéllar

Posts: 2069
Joined: Fri Jan 06, 2006 09:28 PM

Re: Actualizar datos en MySql con TDolphin

Posted: Wed Sep 17, 2014 06:32 PM

Acuellar,la forma de usar UPDATE para que no te coloque todos los registros con el mismo valor es usarlo conjuntamente con la condicion WHERE, ya que el UPDATE recorre toda la tabla sino la condicionas, fue mi primera leccion con mysql, cualquier duda estamos a la orden, saludos... :shock:

Dios no está muerto...



Gracias a mi Dios ante todo!
Posts: 1070
Joined: Sun Oct 09, 2005 10:41 PM

Re: Actualizar datos en MySql con TDolphin

Posted: Wed Sep 17, 2014 07:35 PM
Prueba asi:, EL UPDATE se debe condicionar, de otro modo se barre toda la tabla, ahora depende de como este estructurado tu tabla

Code (fw): Select all Collapse
Do While !oDATA:Eof()
      Vacacion() //Obtengo los valores
      cCodigo := oData:AlgunCodigo
      nPend:=nTiene-nTomodas
       cQry:="UPDATE datper SET TIENE = " + ClipValue2SQL(nTiene) + "TOMADAS = " + ClipValue2SQL(nTomadas) + " PEND = " + ClipValue2SQL(nPend)  +  " WHERE código = '" + cCodigo + "'"
       oDATA:oServer:SqlQuery( cQry )
       oDATA:LoadQuery()
       oDATA:Skip()
   Enddo
Posts: 1713
Joined: Tue Oct 28, 2008 06:26 PM

Re: Actualizar datos en MySql con TDolphin

Posted: Wed Sep 17, 2014 08:59 PM
Gracias amigos por las respuestas

Con UPDATE lo he logrado agregando
Code (fw): Select all Collapse
nRowID:=oDATA:=sql_rowid
" WHERE sql_rowid = " + ClipValue2SQL(nRowID)


Pero no hay mucha diferencia en velocidad y se tiene que escribir mucho más código.

Saludos,

Adhemar

Saludos,



Adhemar Cuéllar

Posts: 2069
Joined: Fri Jan 06, 2006 09:28 PM

Re: Actualizar datos en MySql con TDolphin

Posted: Thu Sep 18, 2014 01:48 AM
acuellar wrote:Gracias amigos por las respuestas

Con UPDATE lo he logrado agregando
Code (fw): Select all Collapse
nRowID:=oDATA:=sql_rowid
" WHERE sql_rowid = " + ClipValue2SQL(nRowID)


Pero no hay mucha diferencia en velocidad y se tiene que escribir mucho más código.

Saludos,

Adhemar

Como dicen por alli, esto es MYSQL, hay que olvidar la mentalidad de DBF y nada es perfecto, pero aun sigo creyendo que es mucho mas rapido y seguro que usar DBF, intenta depurar tu query, que no estes cargando y relacionando tablas innecesariamente, a mi me trabaja el UPDATE/WHERE a buena velocidad...saludos... :-)
Dios no está muerto...



Gracias a mi Dios ante todo!
Posts: 682
Joined: Tue Feb 14, 2006 09:48 AM

Re: Actualizar datos en MySql con TDolphin

Posted: Thu Sep 18, 2014 06:58 AM
Code (fw): Select all Collapse
oDATA:=oServer:Query( "SELECT * FROM DATPER ORDER BY CODIGO FOR UPDATE")
oData:oServer:BeginTransaction() ///<----
  Do While !oDATA:Eof()
      Vacacion() //Obtengo los valores
      nPend:=nTiene-nTomodas
       cQry:="UPDATE datper SET TIENE = " + ClipValue2SQL(nTiene) + "TOMADAS = " + ClipValue2SQL(nTomadas) + " PEND = " + ClipValue2SQL(nPend) 
       oDATA:oServer:SqlQuery( cQry )
      // oDATA:LoadQuery() //Creo que no es necesario
       oDATA:Skip()
   Enddo
oData:oServer:CommitTransaction()//<----

En tu caso hacerlo con un update o directamente sobre oData, no creo que varie mucho, ya que el update afecta unicamente a un registro, y en el fondo eso mismo es lo que va a hacer la clase.
Prueba a quitar el loadQuery, y añadir transaccionabilidad si tu base de datos es InnoDB.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
Posts: 401
Joined: Thu Oct 06, 2005 10:15 PM

Re: Actualizar datos en MySql con TDolphin

Posted: Thu Sep 18, 2014 11:12 AM
Code (fw): Select all Collapse
 oDATA:=oServer:Query( "SELECT * FROM DATPER ORDER BY CODIGO FOR UPDATE")

   Do While !oDATA:Eof()
      Vacacion() //Obtengo los valores // <<=== Muestra que hay aqui.. es otro Query ???
      nPend:=nTiene-nTomodas
       oDATA:TIENE:=nTiene;oDATA:TOMADAS:=nTomadas;oDATA:PEND:=nPend
       oDATA:Save()
      oDATA:Skip()
   Enddo
Saludos,



Pablo Alberto Vidal

/*

------------------------------------------------------

Harbour 3.2.0, Fivewin 17.02, BCC7

------------------------------------------------------

*/
Posts: 1713
Joined: Tue Oct 28, 2008 06:26 PM

Re: Actualizar datos en MySql con TDolphin

Posted: Thu Sep 18, 2014 03:30 PM

Gracias distinguidos

Con la recomendación de Biel funciona bien rápido.

Gracias una vez más.

Saludos,

Adhemar

Saludos,



Adhemar Cuéllar

Continue the discussion