Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Manejo de Fechas de vencimiento en delphi 7 (https://www.clubdelphi.com/foros/showthread.php?t=75765)

luisraad 16-09-2011 18:51:58

necesito ayuda manejo de fechas delphi 7
 
buenas tardes como veran soy novato tanto en la pagina web de delphi como en el programa...
la duda es a siguiente... tengo una base de datos hecha en microsoft access, y conectada con delphi 7 mediante componentes ADOquery, ADOtables DBgrid, y DATAsource, por lo cual estamos desarrollando una aplicacion para una farmacia en la que ingresamos los medicamentos e insertamos la fecha de vencimiento del medicamento para que en el DBgrid nos liste los medicamentos que estan a punto de vencer.
tenemos idea de lo que queremos hacer el problema es como?, nuestro tutor nos dio unos pasos pero en verdad lo que quiero es que al ingresar la fecha de caducidad esta se compare con la fecha del sistema (Datetimepicker), pero no hemos conseguido la manera de que funcione,
osea la idea es que al compararse con el datetimepicker le indicamos mediante la consulta SQL que nos muestre en el DBGrid los medicamentos que les queden minimo de 20 dias antes de ser vencidos, por favor ayudenme no se ni en donde se hace la pregunta por eso lo escribo aqui les agradezco

luisraad 17-09-2011 20:00:07

Manejo de Fechas de vencimiento en delphi 7
 
haber muchachos Buenas Tardes...

Soy estudiantes de programacion de software basico.
estoy realizando una aplicacion, muy parecido a un software de control de inventarios, en donde el usuario podra ingresar el nombre de los medicamentos la fecha de caducidad en una tabla creada en la base de datos de acces ejemplo:

tabla cuarentena tiene los siguientes campos:
COD_MEDICAMENTO, N_MEDICAMENTO, F_CADUCIDAD

la tabla esta conectada a delphi mediante componentes ADO, tengo un DBGrid que es donde me va a listar los medicamentos en peligro de vencerse.

entonces la idea que tengo es colocar un datetimepicker que trae de manera automatica la fecha actual del sistema y esta misma compararla y restarla con el campo F_CADUCIDAD de la base de datos ((el cual suena facil, pero llevo rato sin dar con el codigo)), necesito de su colaboracion, estare atento a la respuesta

gracias

Casimiro Notevi 17-09-2011 20:23:25

¿Pero qué problemas tienes?, exactamente qué necesitas, qué código tienes, en qué parte es en la que necesitas ayuda?

luisraad 17-09-2011 21:56:58

haber. casimiro

el problema es que no tengo un cosigo en si...

quiero que es un DBGRID me liste o muestre los productos que estan a punto de ser vencidos para ello es necesario restar la fecha que se ingresa de vencimiento de los medicamentos a la fecha actual del sistema osea del computador al restar los valores este debe arrojar los dias de difenrecia esos mismos dias serian los restantes para que el medicamento caduque y alli se pone la ocndicion que si esos dias son 2o entonces los liste o muetre en el dbgrid

posdata
trabajo con SQL consulto el campo F_CADUCIDAD y ese mismo lo debo restar con un componente llamado Datetimepicker que trae la fecha actual del sistema y ese me debe dar los dias restantes pero no se como hacerlo creo que fui claro si no me toca darte mi msn y te explico mejor grax por la respuesta men

Casimiro Notevi 17-09-2011 22:23:50

Bien, amigo, pero nada de msn ni email privado, ni nada de eso, porque entonces no sirve de nada los foros. Como bien sabrás, en los foros se hacen preguntas y se contestan para que otras personas con problemas o dudas similares puedan hacer búsquedas y encontrar la respuesta. Si se hace "privadamente" entonces no hay soluciones y los foros no sirven de nada.

Bien, una vez soltado el rollo, y en espera de que hayas leído nuestra guía de estilo ;), vamos al lío:

Tú tienes una tabla en la base de datos con productos y entre los campos están su CODIGO, NOMBRE Y FECHACADUCIDAD.
Ahora quieres consultar los productos que caduquen en xx días a partir de la fecha actual, ¿es eso?

Bien, entonces debes preguntar el número de días que quieras y luego hacer el select, algo así:

Suponemos que el usuario escribe: 20 días, entonces sería:

Código SQL [-]
select * from tbMedicamentos where fechacaducidad < 'now'+20

Ahora bien, si el usuario puede poner cualquier fecha y cualquier cantidad de días, entonces es mejor que te crees el select con parámetros y se los pases, por ejemplo, tienes un query:

Código Delphi [-]
query.close;
query.sql.text:='select * from tbMedicamentos where fechacaducidad < :lafecha + :numerodias';
query.params[0] := tudatetimerpicker.date;
query.params[1] := strtoint(tuedit.text);
query.open;

Evidentemente, el query estará asociado a un datasource y el datasource al dbgrid donde quieras mostrar los datos.

luisraad 17-09-2011 22:45:27

bueno entendi, pero poseemos problemas ejje tienes qe tenerme un poco de pasiencia.

estoy trabajando con componentes ADO cuando copio el codigo le pongo ADO a el query que me posteas en tu ejemplo y me arroja error en el datetimepicker y en los parametros de hecho esos parametros son os que arrojan error

el error dice algo de que se desconoce la palabra 'params'... y el codigo si lo entiendo hasta mira no se me habia ocurrido de que el cliente puede listar escojiendo el mismo los numeros de dias restantes elcodigo lo entiendo pero no se como meterlo a la forma

Casimiro Notevi 17-09-2011 22:49:21

Claro, el código que he puesto antes "no funciona", era sólo como referencia para adaptarlo a lo que estás haciendo tú, que como no tengo ni idea de qué código usas, ni qué componentes, ni nada de nada... es sólo eso, para que te hagas una idea.

luisraad 17-09-2011 22:52:06

bueno mira traduciendo lo que me escribes hago esto


ADOQuery1.close;
ADOQuery1.sql.text:='select * from MEDICAMENTOS where fechacaducidad < :lafecha + :numerodias';
ADOQuery1.Parameters.ParamByName('0') := datetimepicker1.date;
ADOTable1.parameters.parambyname('1') := strtoint(edit1.text);
ADOQUERY1.open

los corchetes que contienen los parametros dan error y los parentesis no... el error da a la asigacion!!!

luisraad 17-09-2011 22:57:31

base de datos hecha en microsoft access
uso delphi 7

esta base de datos esta conectada a delphi mediante componentes ADO y tengo esto:

ADOconection
ADOtable
ADOQuery
(2) dataSource
1 DBGrid

el adoconection esta con el motor de la base de datos o algo asi
el adotable contiene la tabla 'MEDICAMENTOS' de la base de datos
el adoquery pues esta conectado con el adoconection y en el SQL la consuta select* from MEDICAMENTOS F_CADUCIDAD
y el dbgrid asociado al ADOQuery el datasource 2 con el adoquery1 y el datasource1 con el adotable1

de esta manera

oscarac 17-09-2011 23:05:57

cual es la sentencia que estas colocando en el Adoquery?
tiene parametros?

Código Delphi [-]
Adoquery1.close;
Adoquery1.sql.text:='select * from tbMedicamentos where fechacaducidad < :lafecha + :numerodias';
Adoquery1.params[0] := tudatetimerpicker.date;
Adoquery1.params[1] := strtoint(tuedit.text);
Adoquery1.open;

si adecuas tu sentencia a la que te mostro casimiro en el ejemplo anterior, te deberia funcionar

Casimiro Notevi 17-09-2011 23:23:30

Código Delphi [-]
Adoquery1.close; 
Adoquery1.sql.text:='select * from tbMedicamentos where fechacaducidad < :lafecha + :numerodias'; 
Adoquery1.params[0].asdatetime := tudatetimerpicker.date; 
Adoquery1.params[1].asinteger := strtoint(tuedit.text); 
Adoquery1.open;

Creo que falta el tipo de campo, se supone que serán esos, como tampoco lo has dicho.

luisraad 17-09-2011 23:24:05

mira lo cooque asi:

Adoquery1.close;
Adoquery1.sql.text:='select * from MEDICAMENTOS where F_CADUCIDAD < :lafecha + :numerodias';
Adoquery1.Parameters.ParamByName('0') := datetimepicker1.date;
Adoquery1.Parameters.ParamByName('1') := strtoint(edit1.text);
Adoquery1.open;


y en el SQL del ADOQUERY:
select * from MEDICAMENTOS where F_CADUCIDAD < :lafecha + :numerodias

al compilar salen estos errores:
left sides cannot assigned ((supongo que es en la asignacion del datetimepicker1.date caundo se lo asignamos al parambyname('0')..))

incompatible types 'Tparameter and Tdate

la raya roja del error fatal jeje señala las lineas de los parametros

oscarac 17-09-2011 23:32:13

los nombres de los parametros estan mal

pruebalo asi
Código Delphi [-]
Adoquery1.Parameters.ParamByName('Lafecha') := datetimepicker1.date;
Adoquery1.Parameters.ParamByName('numerodias') := strtoint(edit1.text);

luisraad 17-09-2011 23:33:02

haber ya habia practicado con algo de la siguiente forma pero este solo me trae los vencidos y los que estan por vencerse cuando inserto el codigo del medicamento...

que hace???

consulta la tabla y compara el codigo del medicamento, consulta su fecha de caducidad y la compara con un datetimepicker y asi si me funciona... pero quiero hacer lo que vengo explicando desde arriba en el foro


var
c:string;
begin
if (edit1.text<>'')then
begin
c:='';
C:='select MEDICAMENTOS.F_CADUCIDAD from MEDICAMENTOS where MEDICAMENTOS.COD='+comilla.Text + edit1.Text + comilla.text;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(c);
ADOQuery1.Active:=True;
edit2.Text:=ADOQuery1.Fields.Fields[0].AsString;
c:='select MEDICAMENTOS.COD, MEDICAMENTOS.NOMBRE, MEDICAMENTOS.F_CADUCIDAD from MEDICAMENTOS where MEDICAMENTOS.COD='+comilla.Text + edit1.Text + comilla.text;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add(c);
ADOQuery2.Active:=True;

Edit1.Clear;
end;
if Edit2.Text=DateToStr(DateTimePicker1.Date) then
begin
Application.MessageBox('Medicamento Expiró','FarmaSoft',MB_OK);
end
else begin
Application.MessageBox('No Hay Medicamentos Vencidos','FarmaSoft',MB_OK);
end;

end;

el campo comilla.text es un edit que contiene una comilla puesto delphi molesta con las consultas que llevan multiples ' ' espero me entiendan

oscarac 17-09-2011 23:39:10

para el tema de las comillas puedes usar quotedStr()

ejemplo

Código Delphi [-]
Select Codigo from tabla where Codigo = quotedStr(edit1.text)

2 tu codigo me parece algo complicado...
para que se utiliza el edit2?
el c:= '' no es necesario cuando asignas a la variable c la cadena del Query

luisraad 17-09-2011 23:49:28

jajajajaja haber amigo

nuestro profesor nos dijo jaja lo de las comillas que locura ahora fue que vine a darme cuenta.. buen aporte.

lo otro es que ese edit2 es para que se traiga el campo F_CADUCIDAD y este se compate con el datetimepicker imaginate!!! pero aja amigo que hacemos es el concepto de nuestro tutor

Casimiro Notevi 17-09-2011 23:53:53

Recuerda poner etiquetas al código, ejemplo:





.

luisraad 18-09-2011 00:02:33

Bueno ya ensaye varios y no consigo hacerlo...

al parecer nuestro profesornos explico de otra manera distinta y para colmo dificil!! recurri al foro en busca de ayuda pero veo que son muy avanzados por o menos en lo de las comillas es algo que creo que nuestro profesor ni lo sabe

Casimiro Notevi 18-09-2011 00:16:38

Veamos, pega aquí el código que tienes, y no lo cambies, sobre ese código te decimos qué debes cambiar.

luisraad 18-09-2011 00:30:41

Código Delphi [-]
Adoquery1.close;
Adoquery1.sql.text:='select * from MEDICAMENTOS where F_CADUCIDAD < :lafecha + :numerodias';
Adoquery1.Parameters.ParamByName('0') := datetimepicker1.date;
Adoquery1.Parameters.ParamByName('1') := strtoint(edit1.text);
Adoquery1.open;

es asi que lo estoy haciendo y me da error en la parte de (:=) en los parametros


La franja horaria es GMT +2. Ahora son las 22:44:19.

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