Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MySQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=21)
-   -   Metodo Ideal para Modificar un valor a todos los Registros mostrados en un DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=53724)

Alexis De la Cr 28-02-2008 00:16:28

Metodo Ideal para Modificar un valor a todos los Registros mostrados en un DBGrid
 
Estimados Colegas del foro:

Tengo un Pequeño Problema que ojala alguien pudiera Darme una luz para resolverlo.

Utilizo el Componente MYDAC para conectar con la Base de Datos. Tengo un DBGrid Conectado a una Tabla a traves de un Query. Ejecuto la Siguiente sentencia SQL

select * from ventas where (corte=0) and (cancelada=0)

El campo booleano corte me indica que no esta contabilizada a venta y el campo booleano cancelada me indica si esa venta no esta cancelada. hasta aqui todo bien

el problemita a que me enfrento es que deseo cambiar automaticamente el valor del campo corte a True (1) de unicamente los registros que tengo mostrados actualmente en el DBGrid, independientemente de que se hayan agregado registros a la tabla despues de haber ejecutado mi sentencia, unica y exclusivamente a los registros que tengo en el grid.

Lo intente de la siguiente manera

coloque en el SQLUpdate del query la siguiente instruccion

Código SQL [-]
UPDATE ventas
SET
  corte = 1

y despues ejecutaba
Código Delphi [-]
myquery1.Edit;
myquery1.Post;

A veces se ejecutaba bien, pero la mayoria de las veces marca error de violacion de no que que cosa.

y es que no puedo usar la sentencia update directamente oprque si se agrega algun o algunos registros despues de hacer mi sentencia selec, obviamente ya cambian varios parametros.

Les agradecere la ayuda y atencio prestada a este post?

Gracias
Alexis de la Cruz

Lepe 28-02-2008 01:01:31

el sql de update debe tener un where:
Código SQL [-]
update ventas
set corte = 1
where (corte= 0) and ( cancelada=0)

ahora haces un Query1.ExecSql y listo.

Hay un problema:
- Haces el select, ves tus datos en el dbgrid y te vas a tomar café.
- Otros usuarios añaden nuevos registros con corte =0 y cancelada = 0
- Después del cafetito ejecutas la sentencia.

obviamente la consulta de actualización también va a afectar a los registros de tus otros usuarios.

Para que solo afecte a los que ves en el grid, tendrías que recorrer el grid e ir apuntando la clave primaria de cada uno de los registros, de forma que el sql quedará así:
Código SQL [-]
update ventas
set corte = 1
where ClavePrimaria in ( 2, 3, 4, 56, 5, 55 , 67)
Suponiendo que la clave primaria sea un número entero, claro.
No es nada difícil construir el sql:
Código Delphi [-]
var strWhere :string;
begin 
query1.first; // consulta del grid;
while not query1.eof do
  strWhere := strWhere + query1.Fieldbyname('claveprimaria').AsString + ', '
if strWhere <> ',' then
begin
  delete(strWhere, length(strWhere), 1); // borrar la última coma
  strWhere := 'where claveprimaria in (' + strWhere + ')';
end;
Tampoco es eficiente y si son muchos registros, busca otra forma de hacerlo, o la actualización puede tardar mucho tiempo en llevarse a cabo.

Saludos

Neftali [Germán.Estévez] 28-02-2008 10:01:18

Cita:

Empezado por Alexis De la Cr (Mensaje 269201)
...A veces se ejecutaba bien, pero la mayoria de las veces marca error de violacion de no que que cosa.

Estaría bien saber exactamente cual es el "Error de Violación de no se que cosa" que te da.:D
De otra forma es difícil ayudarte.

Si es un Access Violation, es cuestion de memoria y puede ser que no tenga nada que ver con la sentencia SQL.

Alexis De la Cr 29-02-2008 05:24:04

Cita:

Empezado por Lepe (Mensaje 269225)
el sql de update debe tener un where:
Código SQL [-]update ventas
set corte = 1
where (corte= 0) and ( cancelada=0)


ahora haces un Query1.ExecSql y listo.

Fijate que la instruccion Query1.ExecSQL no la la encuentro en el componente MyQuery de MyDAC.

Tampoco Tiene el Metodo Update.


Gracias Neftali por contestar.... estoy tratando de reproducir las condiciones en la que se presenta el error, y obviamente tomar nota exacta del mensaje de error que manda, curiosamente no se ha presentado el error, y eso que estoy dale y duro ejecutando el proceso. Ahorita son las 10 de la noche y obviamente ya no estan trabajando nadie mas que yo, y haciendo memoria las veces que me ha arrojado el error ha sido en el transcurso del dia, horas habiles, que es cuando se esta ejecutando el punto de venta, sera por ahi el problema? algun problema de acceso a la base de datos?

Lepe 29-02-2008 12:30:09

Todo query tiene el método ExecSql, quizás se llama Exec o ExecQuery, aunque en honor a la verdad, no conozco mydac y estoy suponiendo las cosas.

y la otra cosita: ¿método update?
Dije "sql de update" porque es así como se llaman a la instruccción sql que estamos ejecutando, es un SQL de acción (inserción, borrado o actualización). Ese código debería escribirse dentro de la propiedad query1.SQL

Saludos

Alexis De la Cr 03-03-2008 23:04:48

Bueno, yo solo pensaba en algun metodo como el refresh.. Aclaro qu ste tipo de pregunta la hago porque no soy experto.. Al final de cuentas me doy por vencido.... pude haber hecho un ciclo que vaya desde el primer registro del grid hasta el ultuimo y cambie el valor del campo que deseo, y luego aplicarle un applyupdate ya que esta en modo cachedupdates.... pero al final me decidi por unicamente ejecutar una sentencia update....


Gracias de todos modos a los que se tomaron la amabilidad de contestar a este post

egostar 03-03-2008 23:23:58

Cita:

Empezado por Alexis De la Cr (Mensaje 270403)
Bueno, yo solo pensaba en algun metodo como el refresh.. Aclaro qu ste tipo de pregunta la hago porque no soy experto.. Al final de cuentas me doy por vencido.... pude haber hecho un ciclo que vaya desde el primer registro del grid hasta el ultuimo y cambie el valor del campo que deseo, y luego aplicarle un applyupdate ya que esta en modo cachedupdates.... pero al final me decidi por unicamente ejecutar una sentencia update....


Gracias de todos modos a los que se tomaron la amabilidad de contestar a este post

Hey compañero, tan rápido te das por vencido? Ciertamente ese componente por lo que alcanzo a ver requiere de hacer mas "talacha" pero de que se puede se puede.

Mira este hilo, tal vez te ayude.

Salud OS

santi33a 09-04-2008 14:00:00

Me parece tambien que te diste por vencido muy rápido y que falto lo principal para que te puedan ayudar que es el error que te da, pues un error de violacion de no se que cosa no ayuda mucho para responderte


La franja horaria es GMT +2. Ahora son las 00:28:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi