Class to manager MYSQL for Harbour/xHarbour
Custom Search

miércoles, 21 de julio de 2010

Save Vs Update

En el post pasado expuse varias formas de hacer una Actualizacion a una tabla
Last post i showed various ways to do a Update

  • Method Update
  • Build Sentence
  • Method Save
  • Sentence UPDATE

El Method Save fue el mas lento,  para actualizacione masivas no es recomendable, porque hace validaciones internas, transforma los valore de clipper a MySql (como sabemos son diferentes los manejos de datas), construye la sentencia Update, verifica valores cambiados del registro actual.
Por tal razon la idea del post anterior fue mostrar las vias de hacer una Actualizacion y  demostrar que tecnicas usar dependiendo de las necesidades del modulo a construir

The Save Method was the slowest for bulk update is not recommended, because it makes internal validations, transforms the values of clipper to MySql (as we know are different handlings of datas), builds sentence Update, check the current record changed values.
For this reason the idea of the previous post was to show ways to make an update and demonstrate techniques to use depending on the needs of the module to build


Download Sample

ahora muestro un simple ejemplo de como usar el Method save / Now show a simple test to use Method Save

definimos los Get / define Gets

   REDEFINE GET oData:last_name ID 4008 OF oDlg   UPDATE WHEN lNew .OR. lMod
   REDEFINE GET oData:first_name ID 4009 OF oDlg  UPDATE WHEN lNew .OR. lMod
   REDEFINE GET oData:suffix ID 4010 OF oDlg      UPDATE WHEN lNew .OR. lMod
   REDEFINE GET oData:city ID 4011 OF oDlg        UPDATE WHEN lNew .OR. lMod
   REDEFINE GET oData:state ID 4012 OF oDlg       UPDATE WHEN lNew .OR. lMod
   REDEFINE GET oData:birth ID 4013 OF oDlg       UPDATE WHEN lNew .OR. lMod
   REDEFINE GET oData:death ID 4014 OF oDlg       UPDATE WHEN lNew .OR. lMod

Cuando cambiemos un valor solo basta hacer un SAVE para guardar dicho valor
When we change a value with a simple SAVE we can save the current value changed

oData:Save()



de otra forma tendriamos que crear la sentencia o hacer uso del Method Update y llenar los valores que requiere ese metodo
otherwise the sentence would have to create or use the Update Method and fill the values that this method requires


   cQry += "UPDATE president SET "
   cQry += "last_name=" + ClipValue2SQL( oData:last_name ) + ","
   cQry += "first_name=" + ClipValue2SQL( oData:first_name ) + ","
   cQry += "suffix=" + ClipValue2SQL( oData:suffix ) + ","
   cQry += "city=" + ClipValue2SQL( oData:city ) + ","
   cQry += "state=" + ClipValue2SQL( oData:state ) + ","
   cQry += "birth=" + ClipValue2SQL( oData:birth ) + ","
   cQry += "death=" + ClipValue2SQL( oData:death )  + " WHERE "

   cWhere += "last_name" + ;
              If( ( cData := ClipValue2SQL( oData:oQuery:hRow[ '_last_name' ] ) ) == "NULL", " IS ", " = " ) +;
              cData + " AND "
   cWhere += "first_name" + ;
              If( ( cData := ClipValue2SQL( oData:oQuery:hRow[ '_first_name' ] ) ) == "NULL", " IS ", " = " ) +;
              cData + " AND "
   cWhere += "suffix" + ;
              If( ( cData := ClipValue2SQL( oData:oQuery:hRow[ '_suffix' ] ) ) == "NULL", " IS ", " = " ) +;
              cData + " AND "
   cWhere += "state" + ;
              If( ( cData := ClipValue2SQL( oData:oQuery:hRow[ '_state' ] ) ) == "NULL", " IS ", " = " ) +;
              cData + " AND "
   cWhere += "city" + ;
              If( ( cData := ClipValue2SQL( oData:oQuery:hRow[ '_city' ] ) ) == "NULL", " IS ", " = " ) +;
              cData + " AND "
   cWhere += "birth" + ;
              If( ( cData := ClipValue2SQL( oData:oQuery:hRow[ '_birth' ] ) ) == "NULL", " IS ", " = " ) +;
              cData + " AND "
   cWhere += "death" + ;
              If( ( cData := ClipValue2SQL( oData:oQuery:hRow[ '_death' ] ) ) == "NULL", " IS ", " = " ) +;
              cData

   cQry += cWhere
  
   oData:oServer:SqlQuery( cQry )
  
   oData:LoadQuery()



Podemos ver quela diferencia de tiempo no es importante, pero si en la construccion del codigo
we can see, the process time is not important, but yes  building source code

6 comentarios:

  1. Daniel,

    El ejemplo es muy sencillo y aprecias las diferencias muy facilmente en el codigo. De hecho parece que apuestes por el metodo Save() mucho mas facil de entender, mantener y seguir que el MethodUpdate( oData ). Estoy de acuerdo que cada metodo tiene su cavida en un sistema y en este caso el ::save() se lleva la palma.

    Yo creo que un buen ejemplo seria el tipico mantenimiento de cabecera/posiciones (que es la base de una gestion). Basicamente te propongo:

    1.- Entrada de codigo
    2.- Carga de datos de cabecera.
    3.- Carga de datos de posicion
    4.- Edicion de campos de cabecera
    5.- Edicion (por ejemplo) de 15 registros de posicion
    6.- Actualizacion !

    Cuando actualizamos un registro, el sistema que propones (engine :-) ) es muy bueno y va rapido, al menos conectandome con una linea lenta desde Barcelona. Pero estos sistemas los empiezas ha notar a partir de estas situaciones.

    Como plantearias con tu sistema una carga p.e de 50 registros de posicion y de estos 50 actualizar 15 ? sistema transaccional ?

    Te sigo, te sigo... :-)


    Adelante y animo !!!
    C.

    ResponderEliminar
  2. Charly.
    No lo llamaria un sistema transaccional, sino un sistema que usa transacciones.
    Las transacciones son un varias de sentencias SQL que se ejecutan como una una sola, es decir, o se ejecutan todas con exito o ninguna tendra efecto.
    Todas las sentencias SQL son implicitamente transaccionales y se ejecutan en modo auto-consignacion (auto-commit), cuando "activas" las transacciones ( START TRANSACTION o BEGIN ) lo que se esta haciendo es desactivar la auto-consignacion
    Respondiendo tu pregunta, si los 15 registros editados/modificados no estan relacionados entre si no usaria transacciones.
    Que metodo usaria para actualizar de forma masiva, dependeria tambien de las caracteristicas de la tabla, si usa clave unica, llave primaria, en el post anterior esta la respuesta, pero casi seguro escojeria por METHOD Update me facilita mas el trabajo y me hace las comprobaciones necesarias, solo tendria que hacer la clausula WHERE y crear los arrays de campos y valores que no es muy complicado.
    Si fuese necesario usar transacciones simplemente las activo antes de empezar a hacer las actualizaciones al terminarlas las consigno.
    Espero haber respondido tu pregunta :-)

    ResponderEliminar
  3. Daniel,

    Puedo crear en tu site un par de tablas con datos cabecera/posicion para experimentar ?

    Gracias.
    C.

    ResponderEliminar
  4. Charly si se puede, la idea es esa, poder hacer pruebas pero sin intentar sobrecargar el servidor porque sino nos cierran y no podremos probar, es decir, usar el servidor con moderacion.

    :-)

    ResponderEliminar
  5. Daniel,

    Como se puede bloquear un registro para q nadie pueda acceder mientras realizas una modificacion. ya se q la filosfia es otra, pero grandes sistemas utilizan este metodo :-)

    Gracias.
    C.

    ResponderEliminar
  6. http://tdolphin.blogspot.com/2010/07/bloquear-registros-record-lock.html

    :-)

    ResponderEliminar