Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Bucle While para Comprobar Fecha en Base de Datos (https://www.clubdelphi.com/foros/showthread.php?t=85676)

Edwardfeliz 16-04-2014 16:45:15

Bucle While para Comprobar Fecha en Base de Datos
 
Saludos a todos aca! :rolleyes:
he estado mirando este club y me gusto su forma de trabajar, los felicito!
Ya se fijaron de que soy nuevo acá, no soy experto pero espero que lo poco que pueda aportar ayudar en algo! :D

Y por si acaso 'Leí la guía de estilo' XD :cool:

entremos en materia:
Tengo un bucle para comprobar un dato de una columna de registro para que me diga los articulos que estan para reordenar con el siguiente bucle:
Código Delphi [-]
begin
DM.AQProductos.First;
While not DM.AQProductos.Eof Do
Begin
if DM.AQProductos.FieldByName('Reordenar').Value <= Fconfiguracion.DBEreordenar.text
then
Memo1.Lines.Add(DM.AQProductos.FieldByName('Descripcion').Text+' Para reordenar'+#13#10);
DM.AQProductos.Next;
end;

de la misma forma en el Form de configuración tengo otro campo que se llama fecha de vencimiento,
Como hago otro bucle para comprobar que la fecha de vencimiento le quedan de hoy a 15 días para llegar?
y que pueda poner la cantidad de días en configuración.

-- Base de datos Access --
-- Componentes Ado --

Saludos a todos! :cool:

Casimiro Notevi 16-04-2014 16:51:17

Cita:

Empezado por Edwardfeliz (Mensaje 475212)
Y por si acaso 'Leí la guía de estilo' XD :cool:

^\||/^\||/^\||/
Bienvenido :)

newtron 16-04-2014 17:18:38

Cita:

Empezado por Edwardfeliz (Mensaje 475212)
de la misma forma en el Form de configuración tengo otro campo que se llama fecha de vencimiento,
Como hago otro bucle para comprobar que la fecha de vencimiento le quedan de hoy a 15 días para llegar?
y que pueda poner la cantidad de días en configuración.

No estoy seguro si es por lo que preguntas pero si restas a la fecha de vencimiento el día actual te da el número de días entre una y otra.

Saludos

mamcx 16-04-2014 17:25:36

Eso lo puedes hacer de forma mas eficiente usando el mismo SQL, del tipo:

Código SQL [-]
SELECT [campos] FROM [tabla] WHERE Reordenar <= ?param

Date una estudiada de como se usa SQL en especial para tu motor de base de datos.

Edwardfeliz 16-04-2014 17:33:04

Cita:

Empezado por newtron (Mensaje 475215)
No estoy seguro si es por lo que preguntas pero si restas a la fecha de vencimiento el día actual te da el número de días entre una y otra.

Saludos

No es restarla, es sumarla, es decir: es como si se fuera a poner en un Datetimerpicker (Now+Fconfiguracion.Editdiasdevencimiento).

Saludos!

Edwardfeliz 16-04-2014 17:33:56

Cita:

Empezado por Casimiro Notevi (Mensaje 475213)
^\||/^\||/^\||/
Bienvenido :)

Gracias .-. :D

Edwardfeliz 16-04-2014 17:45:24

Cita:

Empezado por mamcx (Mensaje 475216)
Eso lo puedes hacer de forma mas eficiente usando el mismo SQL, del tipo:

Código SQL [-]
SELECT [campos] FROM [tabla] WHERE Reordenar <= ?param

Date una estudiada de como se usa SQL en especial para tu motor de base de datos.

llevo la idea pero no entiendo la salida
Algo mas o menos asi?
Código Delphi [-]
With DM.Productos Do
begin
Close;
SQL.Clear;
SQL.Add('Select Fecha_vencimiento');
SQL.Add('From Productos');
SQL.Add('Where Fecha_vencimiento <= :fechaparavencer');
Parameters.ParamByName('fechaparavencer').Value := Datetimepicker1.Date;
 ExecSQL;


Saludos.

ecfisa 16-04-2014 17:51:58

Hola Edwardfeliz.

Como para darte una idea, fijate si te sirve de este modo:
Código Delphi [-]
procedure AReordenar(const Fech: string; Qry: TADOQuery; ME: TMemo);
begin
  with Qry do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT FECHA_VENCIMIENTO FROM PRODUCTOS');
    SQL.Add('WHERE FECHA_VENCIMIENTO <= :FECHA');
    Parameters.ParamByName('FECHA').Value := Fech;
    Open;
    while not Eof do
    begin
      ME.Lines.Add(FieldByName('FECHA_VENCIMIENTO').AsString);
      Next;
    end;
  end;
end;

procedure Faltan15(const Fech: string; Qry: TADOQuery; ME: TMemo);
begin
  with Qry do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT FECHA_VENCIMIENTO FROM PRODUCTOS');
    SQL.Add('WHERE DATEADD("d", 16, FECHA_VENCIMIENTO) = :FECHA');
    Parameters.ParamByName('FECHA_VENCIMIENTO').Value := Fech;
    Open;
    while not Eof do
    begin
      ME.Lines.Add(FieldByName('ORDERNO').AsString);
      Next;
    end;
  end;
end;

Ejemplo de uso:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  AReordenar('12/05/2013', ADOQuery1, Memo1);
  Memo2.Clear;
  Faltan15('10/02/2014', ADOQuery1, Memo2);
end;

Saludos :)

Edwardfeliz 16-04-2014 18:11:06

Cita:

Empezado por ecfisa (Mensaje 475222)
Hola Edwardfeliz.

Como para darte una idea, fijate si te sirve de este modo:
Código Delphi [-]
procedure AReordenar(const Fech: string; Qry: TADOQuery; ME: TMemo);
begin
  with Qry do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT FECHA_VENCIMIENTO FROM PRODUCTOS');
    SQL.Add('WHERE FECHA_VENCIMIENTO <= :FECHA');
    Parameters.ParamByName('FECHA').Value := Fech;
    Open;
    while not Eof do
    begin
      ME.Lines.Add(FieldByName('FECHA_VENCIMIENTO').AsString);
      Next;
    end;
  end;
end;

procedure Faltan15(const Fech: string; Qry: TADOQuery; ME: TMemo);
begin
  with Qry do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT FECHA_VENCIMIENTO FROM PRODUCTOS');
    SQL.Add('WHERE DATEADD("d", 16, FECHA_VENCIMIENTO) = :FECHA');
    Parameters.ParamByName('FECHA_VENCIMIENTO').Value := Fech;
    Open;
    while not Eof do
    begin
      ME.Lines.Add(FieldByName('ORDERNO').AsString);
      Next;
    end;
  end;
end;

Ejemplo de uso:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  AReordenar('12/05/2013', ADOQuery1, Memo1);
  Memo2.Clear;
  Faltan15('10/02/2014', ADOQuery1, Memo2);
end;

Saludos :)

no entendi mucho XD
pero Quizás no me eh explicado bien.

en La base de datos, en la tabla productos hay una columna llamada Fecha de vencimiento, lo que quiero hacer es agregar al memo, los productos de los cuales las fechas de vencimiento sean menor a la cantidad de dias que esta puesta en el Formulario de Configuración que estará en un DBEedit, esto es para que se pueda configurar la cantidad de dias a los cuales yo quiero que el programa me avise que van a vencer, es decir que el edit va a tener solo dos digitos ( ejemplo: '15' o '30' ).

Saludos!

ecfisa 16-04-2014 18:32:56

Cita:

Empezado por Edwardfeliz (Mensaje 475225)
no entendi mucho XD
pero Quizás no me eh explicado bien.

en La base de datos, en la tabla productos hay una columna llamada Fecha de vencimiento, lo que quiero hacer es agregar al memo, los productos de los cuales las fechas de vencimiento sean menor a la cantidad de dias que esta puesta en el Formulario de Configuración que estará en un DBEedit, esto es para que se pueda configurar la cantidad de dias a los cuales yo quiero que el programa me avise que van a vencer, es decir que el edit va a tener solo dos digitos ( ejemplo: '15' o '30' ).

Saludos!

Hola Edwardfeliz.

Es decir que la fecha de referencia es la actual y vos le envias los días que deseas, ¿ Es así ?

Entonces sería:
Código Delphi [-]
procedure FaltanNDias(const Dias: string; Qry: TADOQuery; ME: TMemo);
begin
  with Qry do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT FECHA_VENCIMIENTO FROM PRODUCTOS');
    SQL.Add('WHERE DATEADD("d", :DIAS, FECHA_VENCIMIENTO) = DATE()');
    Parameters.ParamByName('DIAS').Value := Dias;
    Open;
    while not Eof do
    begin
      ME.Lines.Add(FieldByName('FECHA_VENCIMIENTO').AsString);
      Next;
    end;
  end;
end;

Uso:
Código Delphi [-]
FaltanNDias(DBEdit_de_dias.Text, ADOQuery1, Memo2);

Saludos :)

Edwardfeliz 16-04-2014 18:41:41

Cita:

Empezado por ecfisa (Mensaje 475227)
Hola Edwardfeliz.

Es decir que la fecha de referencia es la actual y vos le envias los días que deseas, ¿ Es así ?

Entonces sería:
Código Delphi [-]
procedure FaltanNDias(const Dias: string; Qry: TADOQuery; ME: TMemo);
begin
  with Qry do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT FECHA_VENCIMIENTO FROM PRODUCTOS');
    SQL.Add('WHERE DATEADD("d", :DIAS, FECHA_VENCIMIENTO) = DATE()');
    Parameters.ParamByName('DIAS').Value := Dias;
    Open;
    while not Eof do
    begin
      ME.Lines.Add(FieldByName('FECHA_VENCIMIENTO').AsString);
      Next;
    end;
  end;
end;

Uso:
Código Delphi [-]
FaltanNDias(DBEdit_de_dias.Text, ADOQuery1, Memo2);

Saludos :)

No hace nada .-.

ecfisa 16-04-2014 18:44:54

Hola.
Cita:

Empezado por Edwardfeliz (Mensaje 475230)
No hace nada .-.

Habría que ver que datos tenes en tu bd y que valores estas enviando como argumento, en mi caso funciona correctamente.

Saludos :)

Edwardfeliz 16-04-2014 18:50:45

Cita:

Empezado por ecfisa (Mensaje 475231)
Hola.

Habría que ver que datos tenes en tu bd y que valores estas enviando como argumento, en mi caso funciona correctamente.

Saludos :)

En el Form de configuracion esta el DBEDiasVencimiento

Base de datos: access.
Tabla: Productos.
Campos:
Codigo
Descripcion
...
Fecha_Vencimiento

Saludos.

ecfisa 16-04-2014 19:14:45

1 Archivos Adjunto(s)
Hola.

Te adjunto un demo basado en el campo "saledate" del archivo orders de dbdemos.mdb (que viene con Delphi e incluyo) para que puedas analizarlo con tranquilidad.

Crea una carpeta y descomprimilo en ella para las pruebas.

Saludos :)

Edito: Como el archivo es muy antiguo modifiqué las últimas fechas para que fueran razonables con la fecha actual, podes hacer lo mismo sobre el DBGrid.

Edwardfeliz 16-04-2014 21:18:05

Cita:

Empezado por ecfisa (Mensaje 475235)
Hola.

Te adjunto un demo basado en el campo "saledate" del archivo orders de dbdemos.mdb (que viene con Delphi e incluyo) para que puedas analizarlo con tranquilidad.

Crea una carpeta y descomprimilo en ella para las pruebas.

Saludos :)

Edito: Como el archivo es muy antiguo modifiqué las últimas fechas para que fueran razonables con la fecha actual, podes hacer lo mismo sobre el DBGrid.

Estudie el ejemplo que me diste aun estoy perdido, observa el comportamiento, en el siguiente codigo:
Código Delphi [-]
procedure FaltanNDias(const Dias: string; Qry: TADOQuery; ME: TMemo);
begin
  with Qry do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT ORDERNO, SALEDATE FROM ORDERS');
    SQL.Add('WHERE DATEADD("d", :DIAS, SALEDATE) <= DATE()');
    Parameters.ParamByName('DIAS').Value := Dias;
    Open;
    while not Eof do
    begin
      ME.Lines.Add(Format('%s - %s',[FieldByName('ORDERNO').AsString,
        FieldByName('SALEDATE').AsString]));
      Next;
    end;
  end;
end;

Resta a la fecha actual el contenido del edit y muestra las fechas de ahi hacia abajo.


en el siguiente:
Código Delphi [-]
procedure FaltanNDias(const Dias: string; Qry: TADOQuery; ME: TMemo);
begin
  with Qry do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT ORDERNO, SALEDATE FROM ORDERS');
    SQL.Add('WHERE DATEADD("d", :DIAS, SALEDATE) >= DATE()');
    Parameters.ParamByName('DIAS').Value := Dias;
    Open;
    while not Eof do
    begin
      ME.Lines.Add(Format('%s - %s',[FieldByName('ORDERNO').AsString,
        FieldByName('SALEDATE').AsString]));
      Next;
    end;
  end;
end;

Resta a la fecha actual el contenido del edit y muestra las fechas de ahi hacia arriba.

y lo que yo quiero es que a la fecha actual(Ejemplo: 16/04/2014) y se le sume la cantidad del edit(ejemplo: 5) y muestre los registro que estén desde 16/04/2014 hasta 21/04/2014

Saludos. :confused::confused:

Casimiro Notevi 16-04-2014 21:18:46

Cita:

Empezado por ecfisa (Mensaje 475235)
..

^\||/^\||/^\||/

ecfisa 16-04-2014 21:47:58

Hola Edwardfeliz.
Cita:

Empezado por Edwardfeliz (Mensaje 475239)
...lo que yo quiero es que a la fecha actual(Ejemplo: 16/04/2014) y se le sume la cantidad del edit(ejemplo: 5) y muestre los registro que estén desde 16/04/2014 hasta 21/04/2014

Ahora si está mas claro...
Código Delphi [-]
procedure FaltanNDias(const Dias: string; Qry: TADOQuery; ME: TMemo);
begin
  with Qry do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT ORDERNO, SALEDATE FROM ORDERS');
    SQL.Add('WHERE SALEDATE >= DATE() AND SALEDATE <= DATE() + :DIAS');
    Parameters.ParamByName('DIAS').Value := Dias;
    Open;
    while not Eof do
    begin
      ME.Lines.Add(Format('%s - %s',[FieldByName('ORDERNO').AsString,
        FieldByName('SALEDATE').AsString]));
      Next;
    end;
  end;
end;

Saludos :)

Edwardfeliz 16-04-2014 22:50:16

Cita:

Empezado por ecfisa (Mensaje 475242)
Hola Edwardfeliz.


Ahora si está mas claro...
Código Delphi [-]
procedure FaltanNDias(const Dias: string; Qry: TADOQuery; ME: TMemo);
begin
  with Qry do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT ORDERNO, SALEDATE FROM ORDERS');
    SQL.Add('WHERE SALEDATE >= DATE() AND SALEDATE <= DATE() + :DIAS');
    Parameters.ParamByName('DIAS').Value := Dias;
    Open;
    while not Eof do
    begin
      ME.Lines.Add(Format('%s - %s',[FieldByName('ORDERNO').AsString,
        FieldByName('SALEDATE').AsString]));
      Next;
    end;
  end;
end;

Saludos :)

Perfecto ;) Con ese mismo hice unas modificacionsitas e hice el de los artículos a reordenar también.

Saludos! :)


La franja horaria es GMT +2. Ahora son las 15:28:04.

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