Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta SQL por Mes y Año (https://www.clubdelphi.com/foros/showthread.php?t=61123)

lKinGl 27-10-2008 01:58:40

Consulta SQL por Mes y Año
 
Salu2 amigos foristas

necesito realizar de una u otra forma una consulta sql donde el usuario pueda especificar el mes y año que quiere obtener los resultados, los resultados deben salir en un quickreport...

Tengo un datatimepicker donde aparecen los meses ej. Enero, Febrero

Tengo un Edit donde sale el numero de mes marcado en el datatimepicker
ejemplo: 01...12

tengo el quickreport armado con 1 Query direccionado a la tabla costosygastos

en el formulario donde selecciono el mes y escribo el año hay un boton que tiene este codigo:

Código Delphi [-]
with Form45.Query1 do begin
   Close;
   SQL.Clear;
   SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber from costosygastos.db where fecha >= "01/"+QuotedStr(edMes.Text)+"/"+QuotedStr(edAno.Text)+"';
   Open;
end;
form45.QuickRep1.Preview;

pero al presionar el boton me sale un error que dice lo siguiente:

"Project Project1.eae raised exception class EDBE EngineError with message 'Unexpected end of command. Token:"
Line Number: 1'. Process stopped. Use Step or Run to continue.

gracias adelantadas por su ayuda y si tienen alguna otra forma de hacerlo que funcione como deseo, tambien sirve :D

egostar 27-10-2008 02:23:37

Hola

Código Delphi [-]
SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber from costosygastos.db where fecha >= "01/"'+
            QuotedStr(edMes.Text)+'"/"'+QuotedStr(edAno.Text);

Aunque yo lo haría así

Código Delphi [-]
SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber from costosygastos.db where fecha >= '+
            QuotedStr('01/'+edMes.Text+'/'+edAno.Text);

Salud OS

lKinGl 27-10-2008 02:42:05

Gracias Egostar de la segunda forma si me funcionó[IMG]file:///C:/Users/Rey/AppData/Local/Temp/moz-screenshot.jpg[/IMG]

lKinGl 27-10-2008 03:01:19

Cita:

Empezado por egostar (Mensaje 322510)
Hola

Código Delphi [-]SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber from costosygastos.db where fecha >= "01/"'+ QuotedStr(edMes.Text)+'"/"'+QuotedStr(edAno.Text);


Aunque yo lo haría así

Código Delphi [-]SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber from costosygastos.db where fecha >= '+ QuotedStr('01/'+edMes.Text+'/'+edAno.Text);


Salud OS


oye egostar pero el codigo que me diste sirve pero solo para buscar los 1 del mes que seleccione como seria para buscar en todo el mes?

Delphius 27-10-2008 03:04:11

Cita:

Empezado por lKinGl (Mensaje 322513)
Gracias Egostar de la segunda forma si me funcionó[IMG]file:///C:/Users/Rey/AppData/Local/Temp/moz-screenshot.jpg[/IMG]

lkinGl,
Si deseas mostrarnos una imagen debes subirla a un sitio que ofrezca el "alojamiento" de imágenes, como lo es ImageShack. Te registras, subes la imagen y luego la seleccionas y presionas en forum codes o algo así (no tengo abierto ImageShack en estos momentos). Te mostrará un cuadro de diálogo en donde estará el Code BB para que después lo pegues aquí.

Saludos,

lKinGl 27-10-2008 03:05:58

Cita:

Empezado por Delphius (Mensaje 322517)
lkinGl,
Si deseas mostrarnos una imagen debes subirla a un sitio que ofrezca el "alojamiento" de imágenes, como lo es ImageShack. Te registras, subes la imagen y luego la seleccionas y presionas en forum codes o algo así (no tengo abierto ImageShack en estos momentos). Te mostrará un cuadro de diálogo en donde estará el Code BB para que después lo pegues aquí.

Saludos,

disculpa pero no queria poster imagenes, es que tenia esa url copiada y sin querer preione ctrl+v

Delphius 27-10-2008 03:09:58

Cita:

Empezado por lKinGl (Mensaje 322516)
oye egostar pero el codigo que me diste sirve pero solo para buscar los 1 del mes que seleccione como seria para buscar en todo el mes?

Disculpa lKinGl pero la consulta que muestra Egostar dice algo así:

"Traeme todos los costos y gastos mayores o iguales a la fecha 01/Mes/Año" Donde Mes y Año son los dos "parámetros" que le indicas a la consulta.

¿Seguro que te devuelve solo las de fechas correspondiente al primer día del més?:confused:

Habría que ver...

Saludos,

lKinGl 27-10-2008 03:18:09

Cita:

Empezado por Delphius (Mensaje 322520)
Disculpa lKinGl pero la consulta que muestra Egostar dice algo así:

"Traeme todos los costos y gastos mayores o iguales a la fecha 01/Mes/Año" Donde Mes y Año son los dos "parámetros" que le indicas a la consulta.

¿Seguro que te devuelve solo las de fechas correspondiente al primer día del més?:confused:

Habría que ver...

Saludos,


ponga el mes que ponga me saca el registro que tengo en la tabla

que por cierto la fecha del registro que tengo para la prueba es de


10/01/2008

si pongo cualquier mes igual me muestra el registro

salu2

lKinGl 27-10-2008 03:19:36

pero caundo cambio de año 2008 no me muestra el registro

eso quiere decir que me muestra todos los registros de 2008

Delphius 27-10-2008 03:32:32

Pues la verdad no entiendo. :confused:
No veo error en la consulta.

Si tu le pides que muestre las fechas mayores o iguales a 01/05/2008 (por poner un ejemplo) y en tu base de datos existen registros con las fechas:

01/04/2008
17/12/2008
01/05/2008
10/06/2007

Claramente debería mostrar sólo dos:
17/12/2008
01/05/2008

Tal vez esté digo una tontera pero... ¿te aseguraste de que el formato que guarda en la base de datos es dd/mm/aaaa y no mm/dd/aaaa?

La verdad es que me resulta raro de que una consulta tan elemental falle.
Saludos,

lKinGl 27-10-2008 03:40:27

Cita:

Empezado por Delphius (Mensaje 322525)
Pues la verdad no entiendo. :confused:
No veo error en la consulta.

Si tu le pides que muestre las fechas mayores o iguales a 01/05/2008 (por poner un ejemplo) y en tu base de datos existen registros con las fechas:

01/04/2008
17/12/2008
01/05/2008
10/06/2007

Claramente debería mostrar sólo dos:
17/12/2008
01/05/2008

Tal vez esté digo una tontera pero... ¿te aseguraste de que el formato que guarda en la base de datos es dd/mm/aaaa y no mm/dd/aaaa?

La verdad es que me resulta raro de que una consulta tan elemental falle.
Saludos,

si men estoy seguro que en la bd se guarda dd/mm/yyyy

pero yo no quiero que me muestre las fechas mayores o iguales a..

yo quiero que me muestre los registros de ese mes y de ese año ejemplo

los registros de Enero 2008

Delphius 27-10-2008 03:54:55

¿Qué motor estás empleando?
Dependiendo del motor que uses, se puede emplear un CAST , un CONVERT, EXTRACT. Cada motor ofrece distintos medios para convertir o extraer el mes, año, dia...

Saludos,

lKinGl 27-10-2008 03:55:32

Cita:

Empezado por Delphius (Mensaje 322529)
¿Qué motor estás empleando?
Dependiendo del motor que uses, se puede emplear un CAST , un CONVERT, EXTRACT. Cada motor ofrece distintos medios para convertir o extraer el mes, año, dia...

Saludos,

uso paradox BDE delphius

Caro 27-10-2008 04:45:12

Hola lking, puedes probar con Extract.

Código Delphi [-]
SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber '+
             'from costosygastos.db '+
             'where Extract(month from fecha) = '+MonthOf(DateTimePicker.Date)+
             ' and Extract(year from fecha) = '+YearOf(DateTimePicker.Date);

Saluditos

Delphius 27-10-2008 04:45:46

Ummm, sobre Paradox digamos que estoy cero a la izquierda:(.
Pero si no estoy muy errado, creo (digo creo, no estoy totalmente seguro) que la SQL que buscas debe ser algo así:

Código SQL [-]
SELECT tus_campos from tu_tabla
WHERE (MONTH(Fecha) = tu_mes) AND (YEAR(Fecha) = tu_año)

MONTH y YEAR son dos funciones que como es de esperar cada una extrae el mes y el año de un campo DATE.

Saludos,

lKinGl 27-10-2008 04:50:00

Cita:

Empezado por Caro (Mensaje 322541)
Hola lking, puedes probar con Extract.

Código Delphi [-]SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber '+ 'from costosygastos.db '+ 'where Extract(month from fecha) = '+MonthOf(DateTimePicker.Date)+ ' and Extract(year from fecha) = '+YearOf(DateTimePicker.Date);


Saluditos

me sale un error que dice incompatible types con string and word y otro con string and integer

Caro 27-10-2008 04:56:00

Cita:

Empezado por lKinGl (Mensaje 322543)
me sale un error que dice incompatible types con string and word y otro con string and integer

Tienes que convertir a string lo que te devuelve las funciones de YearOf y MonthOf.

Código Delphi [-]
SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber '+
             'from costosygastos.db '+
             'where Extract(month from fecha) = '+IntToStr(MonthOf(DateTimePicker.Date))+
             ' and Extract(year from fecha) = '+IntToStr(YearOf(DateTimePicker.Date));

Saluditos

lKinGl 27-10-2008 04:59:12

Cita:

Empezado por Delphius (Mensaje 322542)
Ummm, sobre Paradox digamos que estoy cero a la izquierda:(.
Pero si no estoy muy errado, creo (digo creo, no estoy totalmente seguro) que la SQL que buscas debe ser algo así:

Código SQL [-]SELECT tus_campos from tu_tabla WHERE (MONTH(Fecha) = tu_mes) AND (YEAR(Fecha) = tu_año)


MONTH y YEAR son dos funciones que como es de esperar cada una extrae el mes y el año de un campo DATE.

Saludos,

tambien me da un error Token Fecha algo asi

lKinGl 27-10-2008 05:03:25

Cita:

Empezado por Caro (Mensaje 322544)
Tienes que convertir a string lo que te devuelve las funciones de YearOf y MonthOf.

Código Delphi [-]SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber '+ 'from costosygastos.db '+ 'where Extract(month from fecha) = '+IntToStr(MonthOf(DateTimePicker.Date))+ ' and Extract(year from fecha) = '+IntToStr(YearOf(DateTimePicker.Date));


Saluditos

asi si me sirve caro, pero con un datatime picker que muestra dias meses años, hay forma de que este datatime picker me muestre solo mes y año?

o con 2 combobox 1 que muestre los meses y otro con los años

combobox 1 con formato 99 y el combobox2 con formato 9999

¿se puede?

gracias adelantadas

Delphius 27-10-2008 05:17:17

Bueno lKinGl, he aclarado que no se de Paradox, yo al menos ofrecí una idea... no esperaba que sea perfecto:mad:

Por un lado estaba pensado en jugarme con EXTRACT, pero a ultimo momento se me ocurrió que podría contar con esas funciones:D

Desconozco si el DateTimePicker tiene alguna propiedad para hacer que muestre u oculte el día, o el mes o el año... tendría que fijarme. No tengo Delphi abierto en estos momentos.

Tal vez exista un componente de tercero que haga lo que pides... eso ya es cuestión de burcar.

No veo el drama de emplear Combos, excepto si son muchos los años. En lo personal evito los combos cuando son muchos... no es demasiado estético tener un combo que despliega más de 10 items.

Puedes emplear el componente que deses lKinGl. Ya será cuestión de hacer la conversión que sea necesaria cuando armes la consulta.

Saludos,

Caro 27-10-2008 05:32:42

Cita:

Empezado por lKinGl (Mensaje 322547)
hay forma de que este datatime picker me muestre solo mes y año?

o con 2 combobox 1 que muestre los meses y otro con los años

combobox 1 con formato 99 y el combobox2 con formato 9999

Hola como te dice Marcelo, es depende de como tu quieras mostrar. Con el DateTimePicker mostrar solo mes y año en el calendario no se puede, pero si le puedes dar formato en la propiedad Format -> MM/yyyy , ahora si tu quieres muestras en Combos o un MaskEdit con el formato que dices o utilizar un combo para los meses y un SpinEdit para los años, donde le asignarias un valor minimo y maximo en sus propiedades MinValue y MaxValue.

Saluditos

lKinGl 27-10-2008 05:53:26

Salu2,

gracias al código de caro he podido hacer unas modificaciones y adaptaciones algo engorrosas pero que cumplen exactamente con lo que quiero.... esto fue lo que hice

Combobox1 agregando en Items Enero, Febrero, MArzo, Abril, Mayo, Junio, Julio.....Diciembre

Combobox2 Agregando en Items 2008...2015

1 Edit (Aqui se muestra la fecha).

un boton aceptar que saca el calculo de la fecha y el quick report ;)

Código del Botón
Código Delphi [-]
//Declaro las variables mes y año de tipo String
edit1.visible:=false;
if ComboBox1.Text='Enero' then
  begin
    mes:='01';
  end;
if ComboBox1.Text='Febrero' then
  begin
    mes:='02';
  end;
if ComboBox1.Text='Marzo' then
  begin
    mes:='03';
  end;
if ComboBox1.Text='Abril' then
  begin
    mes:='04';
  end;
if ComboBox1.Text='Mayo' then
  begin
    mes:='05';
  end;
if ComboBox1.Text='Junio' then
  begin
    mes:='06';
  end;
if ComboBox1.Text='Julio' then
  begin
    mes:='07';
  end;
if ComboBox1.Text='Agosto' then
  begin
    mes:='08';
  end;
if ComboBox1.Text='Septiembre' then
  begin
    mes:='09';
  end;
if ComboBox1.Text='Octubre' then
  begin
    mes:='10';
  end;
if ComboBox1.Text='Noviembre' then
  begin
    mes:='11';
  end;
if ComboBox1.Text='Diciembre' then
  begin
    mes:='12'
  end;

ano:=ComboBox2.Text;
edit1.Text:='01'+'/'+mes+'/'+ano;

with Form45.Query1 do begin
   Close;
   SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber '+
             'from costosygastos.db '+
             'where Extract(month from fecha) = '+IntToStr(MonthOf(StrToDate(Edit1.Text)))+
             ' and Extract(year from fecha) = '+IntToStr(YearOf(StrToDate(Edit1.Text)));
   Open;
end;
form45.QuickRep1.Preview;

de esa forma funciona como quiero :D gracias por su ayuda amigos, ha sido de mucha utilidad ;)

Caro 27-10-2008 06:01:38

Hola lking, en vez de preguntar por cada mes puedes utilizar la propiedad ItemIndex del ComboBox y tampoco necesitas hacer la conversión a fecha si ya tienes mes y año en variables.

Código Delphi [-]
  mes := IntToStr(ComboBox1.ItemIndex+1);
  ........................
   
  anyo:=ComboBox2.Text;
  edit1.Text:='01'+'/'+mes+'/'+ano;

with Form45.Query1 do begin
   Close;
   SQL.Text := 'Select Fecha,grupo,des_cu,debe,haber '+
             'from costosygastos.db '+
             'where Extract(month from fecha) = '+mes+
             ' and Extract(year from fecha) = '+anyo;
   Open;
end;
................................

Saluditos

Delphius 27-10-2008 06:03:40

¿Y que te parece si a esos ifs los reducimos?

Código Delphi [-]
procedure Tform1.ComboBox1Change(Sender: TObject);
begin
  mes := IntToStr(ComboBox1.ItemIndex + 1);
end;

No estoy seguro si es ItemIndex, o Index... no tengo Delphi a mano. La idea es que cuando selecciona una opción del combo, en mes (alguna variable global) quede guardado el string.

Siempre y cuando los meses estén ordenados del 1 al 12 va a funcionar.

Saludos,

lKinGl 27-10-2008 06:03:51

Gracias por la sugerencia caro ;) no sabia que se podia obtener de esa forma y por eo recurri a codigo brutal jejejej

Caro 27-10-2008 06:05:44

Cita:

Empezado por Delphius (Mensaje 322556)
¿Y que te parece si a esos ifs los reducimos?

Te he ganado Marcelo :D.

Saluditos

lKinGl 27-10-2008 06:06:16

jaja si los 2 hicieron el mismo codigo :D

Delphius 27-10-2008 06:07:00

Hoy estoy lerdo,
Cada vez que posteo me doy con que nuestra compañera Caro ya se me adelantó.:eek:

Bueno, como dice el dicho, primero las damas.;)
Saludos,

Delphius 27-10-2008 06:19:12

Cita:

Empezado por Caro (Mensaje 322558)
Te he ganado Marcelo :D.

Saluditos

Cita:

Empezado por lKinGl (Mensaje 322559)
jaja si los 2 hicieron el mismo codigo :D

Se aprovechan de que estoy con sueñito:D
Ya se me cierran los ojitos, y además con el calorcito que está haciendo va a ser difícil dormir bien.:mad:

No se si ir a jugar al Harvest Moon un ratito en la PC de mi hermanita:D o intentar dormir... de cualquier manera me tengo que desperar temprano:mad:. Son las 03:22 AM en Salta; 04:22 en Buenos Aires y a pesar del sueño, el calor me obliga a despegarme de la cama.

Saludos,

Caro 27-10-2008 06:27:59

Cita:

Empezado por Delphius (Mensaje 322561)
Se aprovechan de que estoy con sueñito:D
Ya se me cierran los ojitos, y además con el calorcito que está haciendo va a ser difícil dormir bien.:mad:

No se si ir a jugar al Harvest Moon un ratito en la PC de mi hermanita:D o intentar dormir... de cualquier manera me tengo que desperar temprano:mad:. Son las 03:22 AM en Salta; 04:22 en Buenos Aires y a pesar del sueño, el calor me obliga a despegarme de la cama.

Yo creo que mejor a dormir ya es muy tarde, por estos lados son las 2:30 am.

Saluditos

hecospina 27-10-2008 13:17:17

Hola
El problema que tienes es que estas comparando numeros enteros que es lo que te devuelve el extract con campos de tipo texto que es lo que tienes en los meses
Con la solucion de egostar te aparecia todo pues enero, febrero... es mayor o igual a 01,02 ..etc

Lo que debes hacer es el nombre del mes por el numero del mes, por ejemplo enero por 01, febrero por 02....

El sql no tiene problemas:)


La franja horaria es GMT +2. Ahora son las 21:44:45.

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