![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
¡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. ![]() |
|
#2
|
|||
|
|||
|
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. |
|
#3
|
||||
|
||||
|
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 |
|
#4
|
||||
|
||||
|
¡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 |
|
#5
|
|||
|
|||
|
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. |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
|