PDA

Ver la Versión Completa : Fecha en consulta


fedelphi
03-05-2007, 01:34:10
Hola amigos, estoy tratando de realizar una consulta sobre una tabla pero no me funciona bien. Trabajo con firebird 1.5, delphi 7 y me conecto mediante IBx. Lo que realizo es generar la consulta de esta forma

var
consulta:string;
begin
if ECodigo.Text<>'' then
begin
consulta:='select * from almacen where (nro_ticket='+ECodigo.Text+') AND (fecha_presentacion between '+desde.text+' AND '+hasta.text;

ModuloDatos.IBQBusqueda.SQL.Add(consulta);
ModuloDatos.IBQBusqueda.Active:=True;

desde y hasta son dos MaskEdit y tienen el formato dd/mm/aaaa y ECodigo es un Edit donde coloco el codigo del ticket a buscar entre dos fechas determinadas. Cuando se activa la consulta me tira el error "conversion error from string "0" " Haciendo una consulta el la base veo las fechas con el formato dd.mm.aaaa y si hago que los MaskEdit trabajen con este formato me tira el error "Dynamic SQL error. SQL error code=-104 token unknown line 1, char 81. 0".
Si a esta consulta le saco la cuestion de las fechas funciona perfectamente , con esto quiero resaltar que el error son las fechas y no se como encararlo, es mi primera consulta con fechas en firebird.
Muchas gracias
Fede

Caral
03-05-2007, 01:42:56
Hola fedelphi
Porque usar los maskedit estando los hermosos datetimepicker.
Saludos

egostar
03-05-2007, 01:43:29
Tienes un error en la consulta, no estas cerrando el ultimo parentesis. También te recomiendo que uses QuotedStr para pasar las fechas.

Algo así


consulta:= 'select * from almacen where (nro_ticket = '+ ECodigo.Text+
') AND (fecha_presentacion between '+QuotedStr(desde.text)+
' AND '+QuotedStr(hasta.text)+')';


Salud OS.

fedelphi
03-05-2007, 04:18:30
Muchisima gracias caral y egostar, primero caral tu propuesta es buena pero necesito ingresar la fecha desde teclado por una razon de rapidez, ya que cuando ingresan gran cantidad de datos el teclado es mas rápido, y segundo egostar funciono perfectamente. Muchas gracias a ambos.
Fede

Nasca
03-05-2007, 09:49:18
Para fechas hay algunos componentes interesantes (dataware también) en las jvcl. A la ventaja de contar con un desplegable con el típico selector de fechas no se les resta la rapidez de la introducción de fechas al mas puro estilo de los maskedit.

waly2k1
04-05-2007, 18:17:29
Para campos de tipo fecha en carga de datos te conviene usar un dtpicker
formateando por ej. dd/MM/yyyy y te olvidas de las validaciones de fecha válida, rangos, etc. Y cuando pasas a la consulta debes pasar con formato MM/dd/yyyy en caso de firebird/interbase o Access pero en Access #MM/dd/yyyy#, recordá los # (importante). En SQL Server o motores que soporten el SQL Ansi92 con 'yyyyMMdd', funciona perfectamente, pero tené siempre en cuenta el formato porque si te cambian la configuración regional te puede ocurrir cosas inesperadas.

Saludos y espero te sirva.

RONPABLO
04-05-2007, 20:05:27
En SQL Server o motores que soporten el SQL Ansi92 con 'yyyyMMdd'

Cabe anotar que firebird es SQL ansi 92 compatible... yo normalmente hago mis cast bajo el esquema yyyyMMdd

select * from agenda where fecha = cast('2007-11-21' as date)

fedelphi
05-05-2007, 02:59:20
Bien con eso del formato, para insertarlo la paso a mm/dd/aaaa, pero como controlo lo de la configuracion regional waly2k1? Tambien el punto decimal puede traer problemas, y asi un monton de cosas.
Fede

waly2k1
07-05-2007, 14:00:06
Hay funciones q te informan la config. regional, pero lo optimo seria
cambiar siempre la coma por el punto, creo que la funcion se llama ReplaceStr, no recuerdo bien el nombre y no tengo Delphi acá, pero buscá replace en la ayuda. Para las fechas usá el formato yyyy/MM/dd o MM/dd/yyyy y no te complica si cambian la config. regional.
Salu2

Nasca
07-05-2007, 14:48:01
Al hilo de la última propuesta usa funciones directas para eso, yo al menos las uso para los filtros y todo va ok:

function DateToStr(Date: TDateTime): string; overload;

function DateToStr(const DateTime: TDateTime; const FormatSettings: TFormatSettings): string; overload;

Description

Use DateToStr to obtain a string representation of a date value that can be used for display purposes.

The first form of DateToStr is not thread-safe, because it uses localization information contained in global variables. The second form of DateToStr, which is thread-safe, refers to localization information contained in the FormatSettings parameter. Before calling the thread-safe form of DateToStr, you must populate FormatSettings with localization information. To populate FormatSettings with a set of default locale values, call GetLocaleFormatSettings.

Aunque también deberías tener en cuenta la posibilidad de usar los parámetros y "parámetro".AsDate

RONPABLO
07-05-2007, 20:18:17
Por otro lado y retomando lo que dijo Caral, porque no lo hace con DateTimePickers?? en si estos se pueden manejar por teclado (y mas fácil diría yo), y ademas no construiría la SQL, mas bien mandaría parámetros... algo como el siguiente ejemplo:


var
consulta:string;
begin
if ECodigo.Text<>'' then
begin
consulta:='select * from almacen where nro_ticket=:codigo AND fecha_presentacion between :f1 and :f2';
ModuloDatos.IBQBusqueda.SQL.Add(consulta);
ModuloDatos.IBQBusqueda.ParamByName('codigo').asString := Ecodigo.text;
ModuloDatos.IBQBusqueda.ParamByName('f1').asDate := DateTimePicker1.Date;
ModuloDatos.IBQBusqueda.ParamByName('f2').asDate := DateTimePicker2.Date;
ModuloDatos.IBQBusqueda.Active:=True;