FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
problemas al pasar un código SQL al selectSQL
Hola,
Uso delphi 6, interbase 7, dialecto3. Estoy intentando usar el siguiente código SQL, en un IBDataSet. Cita:
Se lo estoy intentando pasar de la siguiente forma: Cita:
El problema es que al compilar me da fallo, por que me pide unos campos que necesito tener declarados en la tabla, pero que aquí no se como incluir. ¿alguna idea? Muchas gracias a todos por la ayuda. Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
#2
|
|||
|
|||
Hola:
Si te da fallo al compilar, supongo que el error estará en la línea: nAux2 := FrmDModule.TbEconoIMPORTE.value; puesto que ese campo TbEconoIMPORTE no lo tienes definido desde Delphi. Para evitarlo, prueba a usar el método, FieldByName de la tabla en cuestión. El compilador no protestará, sólo saltará un error en ejecución si no se halla dicho campo en el Dataset correspondiente: nAux2 := FrmDModule.TbEcono.FieldByName('IMPORTE').value; Un saludo
__________________
Guía de Estilo |
#3
|
|||
|
|||
Cita:
Si no es éste el error, sería bueno que Virginia digera en que linea le da el error y cual es el error que le da |
#4
|
|||
|
|||
Hola,
Cita:
Cita:
En cuanto al error que me da, es como si en este procedure buscase campos, que tengo declarados en el IDDataSet, que son de la tabla, pero que en este caso no necesito, y no he declarado en el select del SQL. Por ejemplo. El campo ASIENTO, lo tengo declarado en la tabla econo. Si le paso a la propiedad SelectSQL con el código, quote: -------------------------------------------------------------------------------- TRY dbPos := FrmDmodule.TbEcono.Getbookmark; FrmDmodule.TbEcono.Disablecontrols; FrmDModule.TbEcono.Close; //borramos el contenido de la propiedad SelectSQL FrmDModule.TbEcono.SelectSQL.Clear; //le asignamos el SQL que tenía al inicio la tabla FrmDModule.TbEcono.SelectSQL.Add('select NUMCLI, SUM(0 - econo.impdebe + econo.imphaber) IMPORTE'); FrmDModule.TbEcono.SelectSQL.Add('from econo'); FrmDModule.TbEcono.SelectSQL.Add('WHERE NUMCLI =:NUMCLI’); FrmDModule.TbEcono.SelectSQL.Add('GROUP BY NUMCLI’); FrmDModule.TbEcono.SelectSQL.Add('ORDER BY NUMCLI '); FrmDModule.TbEcono.Open; nAux2 := FrmDModule.TbEcono.FieldByName('IMPORTE').value; lblSaldo.Caption := formatFloat('#,##0.00 €',nAux2); FINALLY FrmDmodule.TbEcono.GotoBookmark(dbPos); FrmDmodule.TbEcono.FreeBookmark(dbpos); FrmDmodule.TbEcono.EnableControls; END; -------------------------------------------------------------------------------- No estoy incluyendo dicho campo en la la consulta SQL, y me resulta el siguiente error: Cita:
¿Hay alguna manera de que no me los pida? Tal vez todo esto tenga que ver con que estoy trabajando con un DataModule en el que tengo un IBDataSet, TbEcono, al que le cambio el código del selectSQL, cuando quiero cambiar de consulta , en vez de crearme otro IBDataSet nuevo, para la nueva consulta. De este IBDataSet tira un DBGrid, (por eso necesito tener declarados los campos), y a la vez pretendo que me haga, de un modo puntual, estas consultas que os he puesto, para que me calcule si el usuario debe dinero o no. Muchas gracias por todo, Saludos, Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
#5
|
|||
|
|||
Hola Virginia
Por lo que entiendo de tu explicación, este TIBDataSet tiene campos persistentes declarados, cierto? Si es así, la consulta SQL que lances en él, deberá devolver esos campos, ni más ni menos. Si no puedes omitir la declaración de los campos persistentes y, sólo necesitas lanzar este tipo de SQL de vez en cuando, te propongo 2 alternativas 1.- Pones un TIBQuery en el DataModule sin campos persistentes y, en él lanzas las consultas SQL (temporales) que necesites en cada momento. 2.- Dependiendo el diseño de la aplicación, la opción 1 no será válida, por lo que, esta segunda opciónsería la que convendría. Ésta es, crear tu misma el componente en ejecución de forma local al procedimiento o función (es la que yo utilizo para evitarme posibles errores) Código:
procedure ElQueSea; var Q : TIBQuery; begin Q := TIBQuery.Create(Self); Q.Database := MyDataBase; try // lanzo la consulta SQL que necesite finally FreeAndNil(Q); end; end; |
#6
|
|||
|
|||
Hola,
Cita:
He probado el código que me comentas, code:-------------------------------------------------------------------------------- procedure ElQueSea; var Q : TIBQuery; begin Q := TIBQuery.Create(Self); Q.Database := MyDataBase; try // lanzo la consulta SQL que necesite finally FreeAndNil(Q); end; end; -------------------------------------------------------------------------------- Lo tengo de la siguiente forma en mi procedure, Cita:
Cita:
nAux2 := Q.FieldByName('IMPORTE').Value; Si en vez de poner .Value, pongo .asvariant, o .asinteger también me da error. ¿Podría ser que necesita que el campo "IMPORTE" sea un campo persistente? Gracias por la ayuda. Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
#7
|
||||
|
||||
Cita:
// Saludos |
#8
|
|||
|
|||
Algún comentario más (a parte de lo indicado por Román de verificar que no sea null)
A la query le estas pasando una variable. De donde la sacas? no veo que se la asignes!!! Por qué haces el DisabledControls si no lo tienes ligado a ningún componente visual?? Eso sí, lo más importante es que verifiques que la consulta devuelva algún valor y que no sea nulo antes de hacer asignaciones |
#9
|
|||
|
|||
Hola,
Este es el código con el que consigo que no me de fallos, y me abra la aplicación, Cita:
Cita:
Cita:
Gracias por todo, a todos, Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) Última edición por Giniromero fecha: 24-10-2003 a las 11:23:07. |
#10
|
|||
|
|||
Cita:
Código:
if not Q.IsEmpty and not Q.FieldByName('Importe').IsNull then // hacer asignación o lo que sea else // Query sin valores o campo nulo |
#11
|
||||
|
||||
Hola.
Cita:
Para solucionarlo, debes utilizar alguna función que te sustituya el nulo por un 0. Por ejemplo, la función COALESCE : select NUMALU, SUM(0 - COALESCE(econo.impdebe, 0) + COALESCE(econo.imphaber,0)) as IMPORTE from econo where NUMALU = :Parametro GROUP BY NUMALU ORDER BY NUMALU El problema es que esto te funcionará en Firebird 1.5, pero creo que Interbase 7 no soporta esta función. En ese caso la tendrás que sustituir por una UDF. La semana pasada hablamos precisamente de este mismo problema en otro hilo, si lo buscas encontrarás información sobre como utilizar una UDF. Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#12
|
|||
|
|||
Gracias por la ayuda,
Voy a ver si con lo que me has ido facilitando soluciono esto. Saludos Virginia
__________________
Sonrie al mundo, y el mundo te sonreirá :) |
|
|
|