Ir al contenido



Foto

borrar registros con DateTimePicker

ADO delphi MS ACCESS

  • Por favor identifícate para responder
8 respuestas en este tema

#1 the walrus

the walrus

    Member

  • Miembros
  • PipPip
  • 47 mensajes

Escrito 03 octubre 2018 - 05:15

estoy intentando borrar registros desde dos datetimepicker y un boton y tengo una duda (la voy a comentar en le codigo) uso componentes ADO y MS ACCESS como base de datos


delphi
  1. if Application.MessageBox('Desea borrar los registros seleccionados?',
  2. 'Atención',
  3. MB_ICONWARNING or MB_YESNO or MB_APPLMODAL) = mrNo then
  4. query.close;
  5. query.sql.clear;
  6. query.sql.text := ('delete from tabla');
  7. query.sql.text:= ('where tabla.campo_fecha=:campo_fecha and campo_fecha >= :fecha1 and campo_fecha <= :fecha2');
  8. query.parana.Parameters.ParamByName // aqui es mi duda nose que parametro le puedo pasar
  9. query.parana.Parameters.ParamByName('fecha1').Value := FormatDateTime('yyyy/mm/dd',Datetimepicker1.Date);
  10. query.parana.Parameters.ParamByName('fecha2').Value := FormatDateTime('yyyy/mm/dd',Datetimepicker2.Date);
  11. query.ExecSQL;
  12. query.open;
  13. query.refresh;


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.199 mensajes
  • LocationArgentina

Escrito 03 octubre 2018 - 06:45

Hola The Walrus,

He editado tu post para añadir la etiqueta de código. Por favor úsalas.

 

Respecto a tu pregunta, no estoy seguro de si lo estoy entendiendo bien. ¿Quieres borrar unos registros que cumplan la condición de rango de fechas?

Si es el caso, tu consulta está mal. Basta con hacer algo así:


sql
  1. DELETE FROM tabla WHERE (campo BETWEEN :fecha1 AND :fecha2)

Luego en Paramaters le asignas el DataType y Valor correspondiente. En parte depende de que tipo hayas definido al campo que vas a evaluar, aunque lo habitual es manejarse con el tradicional DATETIME, o el TIMESTAMP. Desde el lado de delphi, al parámetro es conveniente tratarlo con el tipo ftDateTime.

 

Recuerda, primero debes establecer el DataType, y luego el valor. Es asi como funciona ADO.

 

Además por lo que veo en tu código, creería que todas esas instrucciones deben estar dentro del if then con un begin end. ;)

Y como última recomendación, evita el borrado físico. En su lugar fomenta el borrado lógico. Emplea un campo adicional a modo estado que determine si el registro está activo o ha sido marcado como borrado.

De esta forma se puede revertir las operaciones de ser necesaria.

El borrado físico es la última opción a considerar.

 

Saludos,


  • 0

#3 the walrus

the walrus

    Member

  • Miembros
  • PipPip
  • 47 mensajes

Escrito 08 octubre 2018 - 04:16

Hola The Walrus,

He editado tu post para añadir la etiqueta de código. Por favor úsalas.

 

Respecto a tu pregunta, no estoy seguro de si lo estoy entendiendo bien. ¿Quieres borrar unos registros que cumplan la condición de rango de fechas?

Si es el caso, tu consulta está mal. Basta con hacer algo así:


sql
  1. DELETE FROM tabla WHERE (campo BETWEEN :fecha1 AND :fecha2)

Luego en Paramaters le asignas el DataType y Valor correspondiente. En parte depende de que tipo hayas definido al campo que vas a evaluar, aunque lo habitual es manejarse con el tradicional DATETIME, o el TIMESTAMP. Desde el lado de delphi, al parámetro es conveniente tratarlo con el tipo ftDateTime.

 

Recuerda, primero debes establecer el DataType, y luego el valor. Es asi como funciona ADO.

 

Además por lo que veo en tu código, creería que todas esas instrucciones deben estar dentro del if then con un begin end. ;)

Y como última recomendación, evita el borrado físico. En su lugar fomenta el borrado lógico. Emplea un campo adicional a modo estado que determine si el registro está activo o ha sido marcado como borrado.

De esta forma se puede revertir las operaciones de ser necesaria.

El borrado físico es la última opción a considerar.

 

Saludos,

si lo que busco hacer es lo que dijiste 

con respecto paramaters intente de esta forma pero no funciono 


delphi
  1. query.Parameters.ParamByName('campo_fecha').DataType.ftDateTime;


  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.199 mensajes
  • LocationArgentina

Escrito 08 octubre 2018 - 08:55

The Walrius, si efectivamente has puesto ese código es natural que no te corra. Si te digo que debes establecer un valor, es porque debes emplear una instrucción de asignación:


delphi
  1. Query.Paramaters.ParamByName('ElNombreDelParametro').DataType := ftDateTime;
  2. Query.Paramaters.ParamByName('ElNombreDelParametro').Value := Datetimepicker1.DateTime;

En este ejemplo se pasa el valor desde un TDateTimePicker, aunque podría pasarse desde otros controles, y de ser necesario apoyarse en funciones como StrToDateTime() si el contenido de la fecha/hora proviene de forma textual.

 

Lo importante es que primero definas el DataType esperado, y en consiguiente, pasarle el valor de acuerdo a ese tipo. Si le dices que es ftDateTime, entonces el valor debe ser un TDateTime, no le pases un string.

 

Busca en el foro que esta duda se ha discutido reiteradas veces.

 

Saludos,


  • 0

#5 the walrus

the walrus

    Member

  • Miembros
  • PipPip
  • 47 mensajes

Escrito 25 octubre 2018 - 01:47

Hola The Walrus,

He editado tu post para añadir la etiqueta de código. Por favor úsalas.

 

Respecto a tu pregunta, no estoy seguro de si lo estoy entendiendo bien. ¿Quieres borrar unos registros que cumplan la condición de rango de fechas?

Si es el caso, tu consulta está mal. Basta con hacer algo así:


sql
  1. DELETE FROM tabla WHERE (campo BETWEEN :fecha1 AND :fecha2)

Luego en Paramaters le asignas el DataType y Valor correspondiente. En parte depende de que tipo hayas definido al campo que vas a evaluar, aunque lo habitual es manejarse con el tradicional DATETIME, o el TIMESTAMP. Desde el lado de delphi, al parámetro es conveniente tratarlo con el tipo ftDateTime.

 

Recuerda, primero debes establecer el DataType, y luego el valor. Es asi como funciona ADO.

 

Además por lo que veo en tu código, creería que todas esas instrucciones deben estar dentro del if then con un begin end. ;)

Y como última recomendación, evita el borrado físico. En su lugar fomenta el borrado lógico. Emplea un campo adicional a modo estado que determine si el registro está activo o ha sido marcado como borrado.

De esta forma se puede revertir las operaciones de ser necesaria.

El borrado físico es la última opción a considerar.

 

Saludos,

hola y en caso querer pasar varias tablas en la consulta parametrizada haciendo un delete


  • 0

#6 the walrus

the walrus

    Member

  • Miembros
  • PipPip
  • 47 mensajes

Escrito 26 octubre 2018 - 07:08

listo ya lo solucione 


  • 0

#7 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.857 mensajes
  • LocationMéxico

Escrito 26 octubre 2018 - 07:18

listo ya lo solucione 

 

Que bien que se ha resuelto tu problemática amigo the walrus, podrías colocar la solución para que cualquier compañero que tuviese tu misma duda le sea de utilidad.

 

Saludos (y)


  • 0

#8 the walrus

the walrus

    Member

  • Miembros
  • PipPip
  • 47 mensajes

Escrito 29 octubre 2018 - 08:21

claro


delphi
  1. begin
  2. nuevo_query.close;
  3. nuevo_query.sql.clear;
  4. nuevo_query.SQL.Add('delete from tabla where campo BETWEEN :fecha1 AND :fecha2 ');
  5. nuevo_query.Parameters.ParamByName('fecha1').DataType := ftdate;
  6. nuevo_query.Parameters.ParamByName('fecha1').Value := Trunc(Datetimepicker1.Date);
  7. nuevo_query.Parameters.ParamByName('fecha2').DataType := ftdate;
  8. nuevo_query.Parameters.ParamByName('fecha2').Value := Trunc(Datetimepicker2.Date);
  9. nuevo_query.ExecSQL;
  10. query_grilla.close;
  11. query_grilla.open;
  12. end;

utilizo dos query por que al querer eliminar registros que estén dentro de una fecha  la grilla queda completamente en blanco y no muestra el resto de los registros en tiempo de ejecución 


  • 1

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.199 mensajes
  • LocationArgentina

Escrito 29 octubre 2018 - 02:08

claro


delphi
  1. begin
  2. nuevo_query.close;
  3. nuevo_query.sql.clear;
  4. nuevo_query.SQL.Add('delete from tabla where campo BETWEEN :fecha1 AND :fecha2 ');
  5. nuevo_query.Parameters.ParamByName('fecha1').DataType := ftdate;
  6. nuevo_query.Parameters.ParamByName('fecha1').Value := Trunc(Datetimepicker1.Date);
  7. nuevo_query.Parameters.ParamByName('fecha2').DataType := ftdate;
  8. nuevo_query.Parameters.ParamByName('fecha2').Value := Trunc(Datetimepicker2.Date);
  9. nuevo_query.ExecSQL;
  10. query_grilla.close;
  11. query_grilla.open;
  12. end;

utilizo dos query por que al querer eliminar registros que estén dentro de una fecha  la grilla queda completamente en blanco y no muestra el resto de los registros en tiempo de ejecución 

 

Ese efecto en blanco se debe a que la grilla como el query utilizado están vinculados al mismo datasource mientras se ejecuta la instrucción.

Si la idea es mantener en pantalla y operar con los mismos registros a la vez se debe de mantener un dataset y datasource adicional o paralelo. De esta forma con uno se traen los datos y con el otro se realiza la operación ABM en cuestión.

 

No quisiera ser pesado pero insisto con mi observación inicial: ¡Ten cuidado con el borrado físico! Lo habitual es aplicar borrado lógico: que no es más que un UPDATE sobre el registro en cuestión sobre un campo dedicado para guardar el estado en cuestión: ALTA, MODIFICADO, BORRADO, etc.

 

Saludos,


  • 1