Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-03-2005
dakar dakar is offline
Registrado
 
Registrado: mar 2005
Posts: 7
Poder: 0
dakar Va por buen camino
Angry Es Posible que a nadie le haya pasado?

Tengo un problema que lo encuentro bastante común y he buscado en
varios foros la solución para éste, pero parece que ha nadie le ha pasado

Lo que hago o necesito hacer es bastante simple, ejecuto una consulta Sql

"Select campo1,sum(campo2) monto, sum(campo3) dscto from tabla
group by campo1".

Y los resultados los traspaso a una tabla de paso. El problema es que al
traspasar los datos me da el siguiente error:
"=" is not a valid floating point value for field 'DSCTO'.

He tratado de solucionarlo de varias formas Actualmente me encuentro
trabajando con componentes SqlConnection, sqlClientDatase y sqlDataset.
También he probado con componentes Interbase,pero me da el mismo error,
he cambiado el dialect del componente entre 2 y 3 pero no se solucuina el
problema.
Lo otro tomé el sql (aunque es muy simple) desde la depuración del sistema
y lo pase al IBConsole y éste lo ejecuta y muestra los valores sin problema.

Agradeceré cualquier aporte, consulta o regaño ya que no se me ocurre
nada mas que hacer para solucionar el problema.

ahAa! el servidor de base de datos es firebird 1.5.1.

Gr@ci@s.
Responder Con Cita
  #2  
Antiguo 15-03-2005
AdrianD AdrianD is offline
Miembro
 
Registrado: may 2003
Ubicación: San Juan - Argentina
Posts: 113
Poder: 21
AdrianD Va por buen camino
Nunca me ocurrio nada parecido, pero no estará corrompida la base de datos?
Responder Con Cita
  #3  
Antiguo 15-03-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile Problema en el transpaso

¡Buen día a todos!

Dakar:

Dudo mucho que el problema se encuentre en la sentencia SQL (y menos tratándose de una base de datos tan estable como Firebird).

Para mi que el problema está en el procedimiento que hace el paso de los datos a la tabla auxiliar. ¿Cómo lo haces?

Seguimos en contacto.

Al González.
Responder Con Cita
  #4  
Antiguo 15-03-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 22
Crandel Va por buen camino
Primero que nada, antes de intentar llevar tus procedimientos a un programa siempre tenes que probarlos ejecutando la instruccion en una consola como wisql o ibcomsole (como lo estas haciendo) antes de pasar con los componentes.
La ejecución se realiza como vos decis, por lo que la instrucción esta bien.
Luego decis que cargas una tabla auxiliar, que sucede con esta?
Ejecutá en la consola para ver si cargo bien la tabla auxiliar y nos contas

Suerte

y explicate un poquito mas con la tabla auxiliar si ahi esta el problema

Crandel
__________________
[Crandel]
Responder Con Cita
  #5  
Antiguo 15-03-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Si tienes esa consulta o los resultados "ligados" a controles visuales prueba a desconectarlos y volver a lanzar la consulta.
Sospecho que puedes tener un problema con las máscaras, ¿Has definido máscaras en algun DBGrid que tengas "enganchado" a esa consulta o sobre algun DBEdit?
Sobre todo en los refrente a puntos y comas para decimales.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 15-03-2005
dakar dakar is offline
Registrado
 
Registrado: mar 2005
Posts: 7
Poder: 0
dakar Va por buen camino
Unhappy

Primero que nada gracias a todos por sus respuestas y su interes en mi
problema.
Bien voy a tratar de aclarar un poquito mas el problema según me lo han
pedido, y no me van a creer que tan simple es lo que hago y el error que me
está dando, por eso mi pregunta de ver si a alguien le ha pasado lo mismo.

En primer lugar no consideren la tabla de paso, el codigo exacto que tengo
para probar que valores me está arrojando la consulta es el siguiente:
////////////////
cSql := 'SELECT vendedor, Sum(monto) monto, Sum(devol) devol'+
' FROM Movim GROUP BY vendedor';
Q.CommandText:= cSql; //Q = SqlClientDataset
Q.open;
while not Q.Eof do
begin
ShowMessage('Valor Devol: [ '+Q.fieldbyname('devol').AsString+' ]');
q.Next;
end;
q.Close;

/////////////

Así de simple, y cuando me muestra los valores en pantalla del campo
"devol" me muestra:


Es decir a devol le pasa un valor "=" que obviamente al tratar de traspasarlo
a una vairable entera me arroja el error mencionado en mi primer mensaje.
Los campos monto y devol en la base de datos son integer y no existe
ningún valor Null; para la mayoria de los vendedores la sumatoria de "Devol"
corresponde a 0 y existe un vendedor que tiene Valor en Devol y la
sumatoria corresponde a 25000, pero al verlo en pantalla me los muestra
así:


Como ven es para no creerlo, no se si es algún problema con delphi, la
instalación, el componente, no se; lo cierto es que, por cambio de equipo,
he tenido que reinstalar el Delphi (6) e igual continua el problema, existen
2 parches de esta versión y también se los instalé.

Bueno espero que les haya quedado claro y, si no tienen alguna respuesta,
-como yo no la tengo- igual agradezco su interés.

Gracias.

¿Es posible que ha nadie le haya pasado?
Responder Con Cita
  #7  
Antiguo 15-03-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile Cacemos a esa liebre

¡Buen día a todos!

Dakar:

Descartando que hayas puesto accidentalmente un símbolo de igual (=) en la llamada la función ShowMessage, podemos decir que evidentemente la expresión
Código Delphi [-]
Q.FieldByName ('devol').AsString
está regresando un cadena de caracteres con el sufijo '='.

Cacemos a esa liebre :

Pregunta 1. ¿Qué sucede si en lugar de la columna devol indicas la columna monto?
Código Delphi [-]
ShowMessage ('Valor Monto: [ ' + Q.FieldByName ('monto').AsString + ' ]');
Esperamos respuesta.

Al González.

Última edición por Al González fecha: 15-03-2005 a las 19:29:48.
Responder Con Cita
  #8  
Antiguo 15-03-2005
dakar dakar is offline
Registrado
 
Registrado: mar 2005
Posts: 7
Poder: 0
dakar Va por buen camino
O.K.
Poniendo el codigo que me escribes en tu respuesta, me surgieron varias
ideas de ir descartando el problema (acorralando la liebre).
Al poner el codigo me muestra la sumatoria de cada vendedor, del campo
monto, sin problemas;entonces me dije- "a lo mejor, por alguna
informatica(no entendible) razon, desde la sumatoria del segundo campo en
adelante me da el problema"-cambié mi SQL y puse "..sum(devol) devol,
sum(monto) monto..", pero sigue igual, es decir los montos me los muestra bien y devol me los muestra mal. también pensé-"a lo mejor cuando existen
valores en 0 está el problema o mejor aún cuando un vendedor tiene una
sumatoria en 0 los demás presentan problemas"-Como el campo "monto"
siempre tiene valores, los cambié y dejé algunos vendedores con todos sus
montos en 0, a otros con algunos montos en 0 y a otros con los montos
normales; lo probé, mostré los valores de la sumatoria del campo "monto" y
se muestrán bien; si me pude dar cuenta que cuando la sumatoria es 0
siempre arroja un signo "=", pero cuando la sumatoria es mayor la muestra
bien (esto podría ser subsanable al momento de traspasarlo a una tabla de
paso) el problema es que "devol" lo sigue mostrando mal, es decir el único
vendedor que tiene como sumatoria 25000 me lo muestra como "2500=".

Gracias.
Responder Con Cita
  #9  
Antiguo 17-03-2005
dakar dakar is offline
Registrado
 
Registrado: mar 2005
Posts: 7
Poder: 0
dakar Va por buen camino
Para Finalizar

Hola a Todos:

Habiendo tenido un tiempo, y luego de cambiar la programación de mi proceso completo en donde necesitba obtener la sumatoria de los campos
mencionados en este hilo, estuve revisando los componentes FIBPlus de los
cuales había leido pero no los había utilizado. Bajé e instalé los
componentes y luego hice la misma consulta, largamente mencionada, en un
SqlClientDataset(1) y en un FibDataset(2); al mostrar en pantalla los datos
generados por ambos componentes (específicamente el campo devol con
valor "25000") el componente 1 me mostraba "2500=" y el 2 "25000"; es
decir, existe un problema con el SqlClientDataset del DbExpress.

Si alguien sabe de éste problema o algún comentario al respecto me
gustaría escucharlo ya que cada vez que traté de buscar la solución a
través de los distintos foros parece que a nadie le había sucedido. Además
la idea de usar los Componentes DbExpress es que, en el posible cambio
de la base de datos a otro motor, no tenga necesidad de cambiar los
componentes de acceso a ésta.

Espero algún comentario.
Responder Con Cita
  #10  
Antiguo 17-03-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile TSimpleDataSet

¡Buen día a todos!


Cita:
Empezado por dakar
...en un SqlClientDataset(1) y en un FibDataset(2); al mostrar en pantalla los datos generados por ambos componentes (específicamente el campo devol con valor "25000") el componente 1 me mostraba "2500=" y el 2 "25000"; es decir, existe un problema con el SqlClientDataset del DbExpress...
No se si esto sirva de algo, pero:
Cita:
Empezado por Ayuda de Delphi 7
The dbExpress page of the Component palette includes TSimpleDataSet for use with simple, two-tier database applications (TSimpleDataSet replaces TSQLClientDataSet).
¿Qué versión de Delphi utilizas? Sería interesante probar esto mismo con TSimpleDataSet.

Espero esto sea de utilidad, seguimos en contacto.

Al González.
Responder Con Cita
  #11  
Antiguo 17-03-2005
dakar dakar is offline
Registrado
 
Registrado: mar 2005
Posts: 7
Poder: 0
dakar Va por buen camino
Hola a todos nuevamente,

Al González, creo haberlo mencionado por ahí, utilizo el Delphi 6 por lo que
no cuento con el TSimpleDataset. Habría sido una buena alternativa haber
podido probar ese componente para descartar definitivamente el problema.
Ahora, lo que yo no sé es si alguien (en el foro ) ha trabajado con las mismas
herramientas que yo menciono y si tiene algunas consultas a la base de datos
similar a la que yo expongo y que no tenga problemas; así podría ir
descartando otras variables externas, o no tanto, al Delphi como: instalación,
Sistema Operativo, Parches, etc. La idea es, como tu has dicho AL, "Cazar la
liebre".
Responder Con Cita
  #12  
Antiguo 17-03-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile Cazando a la liebre

¡Buen día a todos!

Dakar:

Pregunta 2. ¿Ocurre lo mismo si en lugar de utilizar un componente TSQLClientDataSet, utilizas un TSQLQuery o TSQLDataSet?

También puede ser que algún manejador de evento u otro tipo de establecimiento le esté metiendo ruido a la consulta. Prueba aislando por completo la consulta en una aplicación limpia (nueva), dónde sólo tengas los componentes esenciales involucrados en este caso.

Seguimos en contacto.

Al González.
Responder Con Cita
  #13  
Antiguo 18-03-2005
dakar dakar is offline
Registrado
 
Registrado: mar 2005
Posts: 7
Poder: 0
dakar Va por buen camino
Hola a todos,

Al Gonzalez:
Me pareció una buena idea lo que planteaste, de hecho lo tenía pendiente,
pero por problemas de tiempo no lo había probado; aunque en realidad no
me tomó nada de tiempo hacer ésta prueba que creo debió ser la primera
que tendría que haber hecho. OK, traspasé la misma consulta a los tres
componentes y mostré los datos de los tres al mismo tiempo; el código es
el siguiente;
[ delphi ]
procedure TForm1.Button1Click(Sender: TObject);
var
cSql : string;
begin
SQLQuery.SQL.Clear;

cSql := 'SELECT vendedor, Sum(devol) devol, Sum(monto) monto'+
' FROM Mov_NOTA GROUP BY vendedor';

SQLDSet.CommandText := cSql;
SQLClDSet.CommandText := cSql;
SQLQuery.SQL.Add(cSql);

SQLDSet.open;
SQLClDSet.Open;
SQLQuery.Open;
while not SQLDSet.Eof do
begin
ShowMessage('Devol SQLDSet: [' + SQLDSet.fieldbyname('devol').AsString+']'+
' - Devol SQLClDSet : [' + SQLClDSet.fieldbyname('devol').AsString+']'+
' - Devol SQLQuery : [' + SQLQuery.fieldbyname('devol').AsString+']');
SQLDSet.Next;
SQLClDSet.Next;
SQLQuery.Next;
end;
SQLDSet.Close;
SQLClDSet.Close;
SQLQuery.Close;
end;
[/delphi ]

Ojalá se vea bien el código ya que soy nuevo en el foro y estoy usando
por primera vez las etiquetas "[delphi]" (cualquier problema lo escribiré
nuevamente).
Bueno pongo aquí también mi ventana de diseño para despejar cualquier
duda:


El resultado de la prueba de la sumatoria del campo devol que debe mostrar
"25000" es el siguiente (los resultados está entre paréntecis cuadrados para
visualizarlos mejor):


, sin palabras.
Responder Con Cita
  #14  
Antiguo 18-03-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
dakar:

Para que funcionen bien las etiquetas [delphi] debes omitir los espacios entre el nombre de la etiqueta y los paréntesis cuadrados.

En cuanto a tu problema, la versión 1.5.x de FireBird es bastante reciente así que pudiera ser que el driver de dbExpress no funcione correctamente con ella.

Upscene tiene un driver para dbExpress que dicen funciona para Delphi 6 y 7 y FireBird 1 y 1.5.

No es gratutito pero puedes probar su versión trial para al menos determinar si es un problema con el driver que actualmente uses.

En alguna ocasión tuve problemas también extraños al acceder a MySql con DBExpress y se corrigieron al cambiar el driver.

// Saludos
Responder Con Cita
  #15  
Antiguo 18-03-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile Cazando a la liebre

¡Buen día a todos!

Después de ver los extraños resultados, coincido con Román en que el problema puede estar en el controlador (driver) utilizado, o bien en algún defecto de la clase ancestral común TCustomSQLDataSet.

Sería interesante hacer una depuración profunda del proceso para detectar en qué momento se añade el símbolo de igual ("=") a la cadena de resultado.

Pregunta 3. ¿Cuál es la clase del componente campo Devol? Para saberlo puedes utilizar la propiedad ClassName tal y como utilizas AsString.

Pregunta 4. ¿Ocurre lo mismo si usas campos persistentes? (creados en tiempo de diseño dando doble clic sobre el componente y agregando los elementos en el editor de campos)

Pregunta 5. ¿Qué valores te devuelven las propiedades Value, AsInteger, AsFloat, AsVariant? (quizá el problema está en la implementación interna de AsString)

Pregunta 6. ¿Qué valores arroja el campo si en la sentencia SQL utilizas otro alias que no sea "devol"?

Pregunta 7. ¿Qué ocurre si en la sentencia SQL aplicas una función diferente a Sum sobre el campo Devol?

Seguimos en contacto.

Al González. .
Cursos Delphi a distancia
Responder Con Cita
  #16  
Antiguo 23-03-2005
dakar dakar is offline
Registrado
 
Registrado: mar 2005
Posts: 7
Poder: 0
dakar Va por buen camino
Hola a todos, esperaba responder antes, pero no he tenido tiempo.

Bueno, a continuación paso a responder las preguntas planteadas por Al Gonzalez:

3- la clase del componente devol es TFMTBCDField.
4- con los campos persistentes ocurre lo mismo .
5- devuelven excepctions del Delphi, a diferencia del AsVariant que me devuelve el
mismo valor de AsString.
6- Esto ya lo había intentado y continua el problema independiente del nombre
del campo que se le de.
7- A ver, aquí me voy a detener un poquito más; ejecuté la consulta aplicando un
AVG al campo Devol y para sorpresa mia me mostró bien el valor para el único
Vendedor que tiene valor:


La cantidad de registros del venedor son 24 por lo que 25000/24 = 1041 (truncando
los decimales). Como el resultado lo mostró bien, agrege un valor de 15000 al
campo devol correspondiente a un registro de otro vendedor, ejecuté nuevamente la
consulta y efectivamente el primer valor continuaba mostrandolo bien, pero el nuevo
valor generado lo muestra así:


El segundo vendedor tiene 17 registros por lo que 15000/17=882, pero como Uds.
pueden ver, me lo muestra como 88?.

En vista de todas las pruebas realizadas y según lo conversado yo también
creo que lo más lógico es que el problema esté en el driver como lo dice
Roman con lo cual coincide también Al Gonzalez. Por el momento, para consultas
de éste tipo, me valgo de componentes InterBase (IBDatabase, IBTable...)
que hasta el momento me funcionan bien con ese tipo de consultas.
Recuerden que la idea de quere usar los componentes DbExpress es que,
en el posible e inminente cambio de Base de Datos, las modificaciones al
código y diseño que me correspondan realizar sean mínimos.

Gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 01:28:02.


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
Copyright 1996-2007 Club Delphi