• Viernes 29 de Marzo de 2024, 08:56

Autor Tema:  actualizacion de campos  (Leído 1951 veces)

libra_lk1

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
actualizacion de campos
« en: Miércoles 11 de Noviembre de 2009, 19:11 »
0
hola: se presenta el siguiente problema
tengo 2 controles datawindow en una dw_comprobante y el otro dw_detalle en mi ventama w_comprobante y cada ves que requiero modificar los datos no logro modificarlos, lo que estoy haciendo en un control button modifico los 2 datawindow simultaneamnete de mi tabla comprobante y detalle_comprobante y solo logro modificar el dw_comprobante(tipo freeform) de la tabla comprobante,  mas  no el dw_detalle(tipo tabular) de la tabla detalle_comprobante de mi base de datos y el cual agrego varias filas en el detalle no puedo modificarlos ya que son varias filas; y lo que quiero es modificar las filas de detalle, espero que puedan ayudar con mi problemas agradesco su atenion:
//codigo btn_actulizar
int n = 0
venta = dw_comprobante.object.cod_venta[1]
cliente = dw_comprobante.object.cod_cli[1]
comp = dw_comprobante.object.no_comp[1]
fecha = dw_comprobante.object.fecha_comp[1]
tipoc = dw_comprobante.object.tipo_comp[1]
update comprobante set cod_cli = :cliente, no_comp = :comp, fecha_comp = :fecha, tipo_comp = :tipoc where cod_venta = :venta;
   if sqlca.Sqlcode = 0 then
   commit using sqlca;  
   for n = 1 to dw_detalle.rowcount( )
    producto = dw_detalle.object.cod_prod[n]
    cantidad = dw_detalle.object.cant_venta_prod[n]
    precio = dw_detalle.object.importe[n]
    update detalle_comprobante set cod_prod = :producto, cant_venta_prod = :cantidad, precio_venta = :precio where cod_venta = :venta;
     if sqlca.sqlcode = 0 then
     commit using Sqlca;
    else
     rollback using Sqlca;
     messagebox("Atención!","Error Modificando Detalle"+ sqlca.sqlerrtext)
    end if
   next
   messagebox("Atención!","Datos Modficados con Éxito!")
  end if
 else
  rollback using Sqlca;
  messagebox("Atención!","Error Modificando Comrpobante!"+ sqlca.sqlerrtext)
 end if

gracias!!

davidmolina1

  • Miembro activo
  • **
  • Mensajes: 51
    • Ver Perfil
Re: actualizacion de campos
« Respuesta #1 en: Jueves 12 de Noviembre de 2009, 21:02 »
0
El problema lo tienes en que el la clausula where de la sentencia update que hay dentro del for  usas venta.

Esta variable siempre tiene el mismo valor dentro del for, Por tanto siempre le estás haciendo el update sobre la misma fila de detalle_comprobante.

Si no te importa te voy ha hacer algunas recomendaciones:

- Anteponle a las variables el tipo y al ambito, por ejemplo
   ll_venta en lugar de venta (con esto indicas que es local y long)
   ld_fecha en lugar de fecha (con esto indicas que es local y fecha)
   Cualquier persona que lea tu código en un futuro te lo agradecerá

- En lugar de la sintáxis .object. usa GetItemXXXX
   El motivo es que da más juego tener el nombre del campo en un string que dentro de una sentencia.

- Evita las sentencias SQL en código Updates, Commit, SQLCA.SQLCode, etc...
   En lugar del update usa el método update () de la datawindow/datastore.
   El commit/Rollback es mejor centralizarlo en una función global. Nunca se sabe cuanto te hará falta hacer hacer algo después de un commit/rollback. Esto te lo digo por experiencia. Por ejemplo registrar en un fichero el error rollback para posteriormente consultarlo.
   Haz un solo commit/Rollback al final del proceso. En el ejemplo que haz puesto se puede dar el caso de que hagas el commit de comprobante y el rollback de venta_comprobante. Esto hace que la operación no sea atómica.

-   Cuando hagas un .object.campo[1] o GetItemNumber (1, 'campo') asegurarte de que esa fila existe.
   Este es un error que siempre cometemos, Aquí me incluyo yo también.

libra_lk1

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: actualizacion de campos
« Respuesta #2 en: Martes 17 de Noviembre de 2009, 19:01 »
0
cierto creo que tiene sentido aplicarlo asi...  probare el codigo
gracias por tu ayuda