FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
Nunca me ocurrio nada parecido, pero no estará corrompida la base de datos?
|
#3
|
||||
|
||||
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. |
#4
|
||||
|
||||
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] |
#5
|
||||
|
||||
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. |
#6
|
|||
|
|||
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? |
#7
|
||||
|
||||
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 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? Esperamos respuesta. Al González. Última edición por Al González fecha: 15-03-2005 a las 19:29:48. |
#8
|
|||
|
|||
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. |
#9
|
|||
|
|||
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. |
#10
|
||||
|
||||
TSimpleDataSet
¡Buen día a todos!
Cita:
Cita:
Espero esto sea de utilidad, seguimos en contacto. Al González. |
#11
|
|||
|
|||
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". |
#12
|
||||
|
||||
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. |
#13
|
|||
|
|||
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. |
#14
|
||||
|
||||
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 |
#15
|
||||
|
||||
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 |
#16
|
|||
|
|||
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. |
|
|
|