PDA

Ver la Versión Completa : codigo sql en filtro de TIBTable


Giniromero
04-08-2003, 12:24:45
Hola,

EStoy usando D6, IB7, y necesito poner el código SQL siguiente, en un filtro de un TIBTAble.

(NUMGRUP = 'lo que hay en TbGruposNUMGRUP') AND (CAUBAJA = 1)

Tengo puesto esto, y por algún motivo que no alcanzo a comprender, me da error a partir de and

TbMatri.Filter := 'NUMGRUP= ' + TbGruposNUMGRUP.AsString + 'AND CAUBAJA = 1';

Me da un error de:
Dynamic SQL Error
SQL Error Code =-104
Token unKnown - line2, char 15
AND.

Alguien puede ayudarme??

Gracias a todos

Virginia Romero

__cadetill
04-08-2003, 14:23:13
NUMGRUP es alfa o numerico? Si es alfa, le faltarian las comillas (te aconsejo utilizar QuotedStr para ese menester)

TbMatri.Filter := 'NUMGRUP= ' + QuotedStr(TbGruposNUMGRUP.AsString) + 'AND CAUBAJA = 1';

Espero te sirva

PD: Por cierto, al final has decidido utilizar TIBTables en lugar de TIBDatasets?

Giniromero
04-08-2003, 14:57:34
Hola cadetill!

Por cierto, al final has decidido utilizar TIBTables en lugar de TIBDatasets?

En realidad no, pero tengo que hacer que me funcione lo que tengo hasta ahora, para comenzar el cambio sin errores que me hagan no saber donde estoy fallando, pues aunque me parece la mejor opción no lo controlo aun demasiado para diferenciar los errores de código mios con los errores relaccionados con el IBDataSet:(

NUMGRUP es alfa o numerico?
es numérico, ¿cambia la forma de insertar el código?

Por cierto, cuando tienes algo escrito en algún campo, como ModigySQL del IBDataSet, si quieres cambiar en código su valor, ¿cómo lo haces? se que se usa el add , por que me lo pusiste en un ejemplo, pero, ¿cómo va lo de los + para unir esos add, cuando tengo que poner en varios add un trozo de código?

Por otro lado, para asignar un código a una propiedad como filter o selectsql ¿Tienes que borrar primero lo que hay escrito?
¿si escribes código nuevo con el add sin haber borrado, ¿se añade el código a lo que ya tenía esa propiedad , o tienes que escribirlo siempre entero?

Gracias por la ayuda, como siempre

Virginia

__cadetill
04-08-2003, 15:43:26
Hola

Bueno, lo de alfanumerico o numerico era solo para saber si necesitabas ponerlo entre comillas como te indicaba.
Bien, otro posible error (no se si sera de hacer copy-paste o si realmente lo tienes asi) es que no dejas espacio entre el valor del campo y el AND siguiente

El tema del TIBDataset


// si se utiliza ADD, primero hay que limpiar el contenido anterior
IBDataSet1.DeleteSQL.Clear;
// luego se añade lo que se quiera
IBDataSet1.DeleteSQL.Add('delete from tabla');
IBDataSet1.DeleteSQL.Add('where id = : old_id');


Tambien puedes utilizar el Text en lugar de el add debido a que es una propiedad de tipo TStrings. En este caso, no hace falta limpiar el contenido previo, pero si unir las cadenas de texto si se hace en varias lineas


IBDataSet1.DeleteSQL.Text := 'delete from tabla ' +
'where id = : old_id';


Pero si lo haces en una sola, no pasaria nada


IBDataSet1.DeleteSQL.Text := 'delete from tabla where id = : old_id';


Lo que pasa es que, personalmente me gusta mas verlo en varias lineas y, a parte, en una sola linea, aqui en los foros aparece el scroll horizontal (que tampoco me gusta ;))

Lo explicado aqui, te servira tanto para el SelectSQL, como el DeleteSQL como las demas

Bueno, espero te sirva

PD: entre los : y old he dejado un espacio para que no me saliera el smile :o

kinobi
04-08-2003, 18:07:32
Hola,

Posteado originalmente por cadetill
PD: entre los : y old he dejado un espacio para que no me saliera el smile :o

a la hora de responder a un mensaje tienes, justo debajo del cuadro donde editas tu respuesta, un checkbox titulado: "Deshabilitar los smilies" ... y asunto arreglado.

Saludos

Giniromero
04-08-2003, 18:18:24
otro posible error (no se si sera de hacer copy-paste o si realmente lo tienes asi) es que no dejas espacio entre el valor del campo y el AND siguiente

he separado el and, pero eso no lo soluciona. Voy a intentar tirar de backup, de antes de pasar a este form de paradox a interbase, y a partir de esto, a ver si con un IBDataSet, bien definido se me soluciona el tema.

Muchas gracias por tu ayuda,

Virginia:)

__cadetill
04-08-2003, 18:56:52
Posteado originalmente por kinobi
a la hora de responder a un mensaje tienes, justo debajo del cuadro donde editas tu respuesta, un checkbox titulado: "Deshabilitar los smilies" ... y asunto arreglado.
Totalmente cierto, pero no me acorde :p

Posteado originalmente por kinobi
Voy a intentar tirar de backup, de antes de pasar a este form de paradox a interbase, y a partir de esto, a ver si con un IBDataSet, bien definido se me soluciona el tema.

Ya nos contaras a ver que tal va el tema ;)

Giniromero
06-08-2003, 17:43:22
Hola,

Efectivamente comencé a cambiar el form de TTables a IBDataset, y aunque parece que algunas cosillas se solucionan, me han comenzado a dar otros errores, y a surgir dudas.

Por ejemplo,

1) ¿Cual es la diferencia, entre el ON POST, y el ON SERVER dentro de las propiedades del IBDataSet, generatorField, Apply Event? Por que, si uso 'on new record', veo que si antes del post, cancelo, el número que se le había asignado al nuevo registro, (ejem 1200) se "pierde", y al próximo registro que queramos insertar, se le asignará un número más que el que cancelamos, (esto es, el 1201), provocándose "huecos" en el campo auto numérico.

Pero en el caso del 'on post' y 'on server', la única diferencia que veo es que, en el on post, se muestra el valor directamente en su campo, cosa que, si quiero que el 'on server' haga, tengo que cerrar y volver a abrir el IBDataSet, para que me muestre el nuevo registro, con su valor correspondiente, en su campo correspondiente, (no funciona, en este caso, el refresh).

Lo que no sé, es si, a la hora de trabajar con estas opciones, afectará en algo más, una vez la aplicación este funcionando en varios puestos al mismo tiempo.


2) Tengo una "Tabla" en la aplicación, que sólo quiero usar para insertar nuevos registros. ¿es necesario que me muestre todos los registros o hay alguna manera de acotar los registros que muestra al mínimo posible?

3) en uno de los campos que tengo, en uno de mis form, necesito que sólo figure la hora, pero me aparece la fecha y la hora, lo cual es un problema para mi aplicación. ¿Hay alguna manera de que sólo me muestre, en el TDBEdit, lo que pido?

He probado con EditMask de las propiedades del propio campo, dentro de la tabla, pero no sirve de nada, sigue saliendo día y hora.



Muchas gracias,

Virginia

__cadetill
06-08-2003, 19:33:42
Posteado originalmente por Giniromero
1) ¿Cual es la diferencia, entre el ON POST, y el ON SERVER dentro de las propiedades del IBDataSet, generatorField, Apply Event?

Sacado de la ayuda de Delphi


Indicates when the TIBGeneratorField instance calls the server to generate a value for the associated field.

type TIBGeneratorApplyEvent = (gamOnNewRecord, gamOnPost, gamOnServer);
property ApplyEvent : TIBGeneratorApplyEvent;

Description

Set TIBGeneratorApplyEvent to indicate when the server generates field values using this generator. ApplyEvent has one of the following values:

Value Meaning

gamOnNewRecord The dataset calls the server to generate the field value immediately after it inserts or appends a new record (before the OnNewRecord event).
gamOnPost The dataset calls the server to generate the field value immediately before it posts a record to the server (before the BeforePost event).
gamOnServer The dataset does not need to call the server to generate field values: the server generates these values automatically. When ApplyEvent is gamOnServer, TIBGeneratorField serves primarily to ensure that the user is not required to enter a value in the field.

Note: Regardless of the value of ApplyEvent, applications can generate the field value at any time by calling the Apply method.

Si utilizas el gamOnServer, no veras los cambios hasta que no comfirmes la transaccion con un commit o un commitretaining

Posteado originalmente por Giniromero
2) Tengo una "Tabla" en la aplicación, que sólo quiero usar para insertar nuevos registros. ¿es necesario que me muestre todos los registros o hay alguna manera de acotar los registros que muestra al mínimo posible?

No entiendo lo que quieres hacer. Podrias mirar de explicarlo algo mas?

Posteado originalmente por Giniromero
3) en uno de los campos que tengo, en uno de mis form, necesito que sólo figure la hora, pero me aparece la fecha y la hora, lo cual es un problema para mi aplicación. ¿Hay alguna manera de que sólo me muestre, en el TDBEdit, lo que pido?

He probado con EditMask de las propiedades del propio campo, dentro de la tabla, pero no sirve de nada, sigue saliendo día y hora.

Utiliza el DisplayFormat con algo como hh:nn

Espero te sirva

Giniromero
07-08-2003, 10:04:39
Hola,

diferencia, entre el ON POST, y el ON SERVER

Bueno, creo que no me expliqué bien. Ya había visto lo que pone en la ayuda de delphi, pero ahí no aclara lo que a mi me preocupa, mi duda, espero que más claramente, es ¿si uso el método 'on post', para una aplicación que va a usarse en varios puestos a un mismo tiempo, ¿puedo tener problemas a la hora de asignar nº a los registros que puedan crearse en mi tabla, desde dos puestos distintos, a un mismo tiempo?, (que de el mismo nº a los dos o algo así) o tal vez dicho de otro modo
Cuando se recomienda usar uno y cuando el otro. (el 'on new record' directamente lo descarto).


En cuanto a:


2) Tengo una "Tabla" en la aplicación, que sólo quiero usar para insertar nuevos registros. ¿es necesario que me muestre todos los registros o hay alguna manera de acotar los registros que muestra al mínimo posible?


vamos a ver... una de las tablas que tengo creadas en mi interbase, sólo me sirve para que yo le añada nuevos registros desde mi aplicación, en el form concreto en el que está ubicada, no la necesito para que me muestre registros, por lo tanto, como quiera que el IBDataSet, por lo que tengo entendido, funciona mejor cuanto menos registros "muestra", como hacer para no tener una definición en el select, que a efectos de funcionamiento, no sea como un TIBTable, que me esté "mostrando" todos los registros que tiene guardados


En cuanto a:
Utiliza el DisplayFormat con algo como hh:nn

Esto lo había intentado, pero me confundí de formato, y le estaba poniendo hh:mm :D , y así pasaba... ahora parece que funciona. Sólo muestra la hora, aunque en la base de datos me guarda también la fecha, pero parece que mi aplicación lo ignora. (Sólo se ve la fecha que se guarda cuando quieres modificar ese campo)

Gracias por la ayuda

Virginia

__cadetill
07-08-2003, 11:08:16
Posteado originalmente por Giniromero
Cuando se recomienda usar uno y cuando el otro. (el 'on new record' directamente lo descarto).

Yo normalmente utilizo el On Post de forma que mi transaccion dure lo menos posible, es decir


try
IBDataset.Post
IBTransaction.Commit; // o CommitRetaining
except
IBTransaction.Rollback;
end;

y en el BeforePost es donde asigno el codigo. De esta manera, no recojo número hasta justo antes de acceptar el registro y mi transaccion es lo mas corta posible haciendo que los demas usuarios vean las modificaciones y no cause problemas

Posteado originalmente por Giniromero
como hacer para no tener una definición en el select, que a efectos de funcionamiento, no sea como un TIBTable, que me esté "mostrando" todos los registros que tiene guardados

Bueno, si en lugar de tener un DBGrid tienes DBEdits (o lo que sea), ya no estaras mostrando todos los registros. A parte, tambien puedes utilizar la clausula where de la sentencia SQL y, si no recuerdo mal, la propiedad BufferChunks del TIBDataset tambien podria ayudarte.
Otra solución es no tener el IBDataset y tener Edits normales y, en el boton de aceptar, lanzar un SQL de Insert con un TIBQuery.

Posteado originalmente por Giniromero
le estaba poniendo hh:mm :D

es que las "m" se refieren a los meses :D

Posteado originalmente por Giniromero
aunque en la base de datos me guarda también la fecha
como te comenta kinobi en otro hilo, a partir de la version 6 de IB, existe el tipo de dato Time (con dialecto 3)

Giniromero
07-08-2003, 16:21:57
como te comenta kinobi en otro hilo, a partir de la version 6 de IB, existe el tipo de dato Time (con dialecto 3)
aunque en la base de datos me guarda también la fecha

si, pero eso sólo funciona cuando el tipo de SQL es 3, y yo estoy usando el 1


Yo normalmente utilizo el On Post de forma que mi transaccion dure lo menos posible,
y en el BeforePost es donde asigno el codigo. De esta manera, no recojo número hasta justo antes de acceptar el registro y mi transaccion es lo mas corta posible haciendo que los demas usuarios vean las modificaciones y no cause problemas


Disculpa, pero no entiendo que quieres decir con 'de forma que mi transaccion dure lo menos posible', bueno, en realidad, no entiendo muy bien lo que me quieres decir con todo esto.

Gracias por la ayuda

virginia

__cadetill
07-08-2003, 18:23:51
Posteado originalmente por Giniromero
Disculpa, pero no entiendo que quieres decir con 'de forma que mi transaccion dure lo menos posible', bueno, en realidad, no entiendo muy bien lo que me quieres decir con todo esto.


Yo tengo una tabla de contadores. Por trigger (AfterInsert) doy el nuevo numero a la fila que estoy insertando (esto se realiza al hacer el Post en el TIBDataSet). Como justo despues del Post hago un Commit de la transaccion, el espacio de tiempo en que no son "visibles" los cambios en la tabla de contadores para los demas usuarios es practicamente nulo

En mi caso, yo utilizo una tabla de contadores, pero tu puedes utilizar lo que mas te guste (un generador, una consulta SQL,....)

Bueno, espero esto sea algo mas explicatorio

Giniromero
11-08-2003, 09:21:25
Creo que esta vez me ha quedado claro.

Gracias por la ayuda.

Saludos

Virginia

;)