PDA

Ver la Versión Completa : editar campos por codigo


anubis
19-08-2012, 17:14:53
Hola amigos,

Cuando empiezo un programa tengo la costumbre de, en las propiedades de zconnection le pongo la ruta de la base de datos, y con los zquery hago lo mismo, le asigno en propiedades todo lo que puedo, para ir viendo en tiempo de diseño como va quedando. No se si esto es una buena práctica, pero de momento me ha funcionado.

En zquery tambien edito los campos y ahi los asigno y tambien le meto calculados.

El problema surge cuando ya por codigo, asigno la base de datos, el protocolo y todo lo demas, pero cuando hago eso y ejecuto, los campos calculados y los demas me arroja el error que no existen.

Mi pregunta es, como puedo asignar todo eso, editar campos del zquery pero por codigo porque no lo he visto por ninguna parte.


Y ya que pregunto esto, tambien el por que despues de haber creado un campo calculado ya no puedo modificarlo desde ahi.
Por si no me explique bien, el editar campos es cuando en el zquery le das doble click.

gracias y perdon por las molestias

Casimiro Notevi
19-08-2012, 18:18:01
Y ya que pregunto esto, tambien el por que despues de haber creado un campo calculado ya no puedo modificarlo desde ahi.
Por si no me explique bien, el editar campos es cuando en el zquery le das doble click.

Hola, cuando en modo diseño haces doble click en el componente (y estando conectado) se crean los campos.
Entonces en ejecución los campos están creados, no tienes que volver a crearlos porque ya lo están.

Creo que no he entendido el problema que tienes :(

anubis
20-08-2012, 05:20:28
Gracias por contestar,

A ver si me se explicar mejor.

Por alguna casualidad que desconozco, cuando creo esos campos tal y como dices pero en las propiedades del zconnection en el apartado de database( inspector de objetos) donde meto a "mano" la ruta de la base de datos no tengo problema ninguno, pero si en vez de hacerlo asi lo meto por codigo:

zconnection1.database:='c:\basededatos.db';
zconnection1.connected:=true;
zquery1.active:=true;
asi si me da error porque me dice que hay un error de sql o la basededatos esta desaparecida.

ya probe a poner el paramcheck a false y otras tantas cosas.

Solo me funciona dejando en el zconnection en su propiedad database (en el cuadro inspector de objetos) la ruta completa.

Si en el zquery dejo el añadir los campos en blanco, vamos que no pongo ninguno si puedo poner el codigo anterior porque si me funciona.

No entiendo el por qué pasa esto. :(

Casimiro Notevi
20-08-2012, 09:31:44
Solo me funciona dejando en el zconnection en su propiedad database (en el cuadro inspector de objetos) la ruta completa.

Es así, aunque luego por código puedes cerrar la BD y abrir otra igual a esa que tienes asignada en modo diseño.
En ese caso funcionará bien, ¿no?.

anubis
20-08-2012, 13:52:42
Gracias de nuevo,

Si entendí bien lo que me dices, le meto un zconnectio2, y la otra no la uso?
Así no sería la forma coherente de programar, según veo.
Lo digo más que nada porque, a parte de hacer programas que funcionen y seguir aprendiendo, hacer el código de forma elegante y sin "chapuzas".;).

O como lo haceis vosotros en estos casos.

saludos y gracias

Casimiro Notevi
20-08-2012, 14:12:34
Creo que me he perdido :o

Exactamente, ¿qué es lo que quieres hacer?, ¿conectar a dos BD al mismo tiempo?

anubis
20-08-2012, 15:17:13
No no, queria asignar la base de datos al zconnection por codigo en vez de usar el inspector de objetos, pero al hacer esto ultimo, los campos calculados asignados en añadir campos del zquery me dice que no existen.

Lo que te comentaba en el anterior post pense que iba relacionado con crear otra base de datos, pero no entendi cuando me comentabas que asignara la base de datos y luego por codigo la cerrara y abriera otra igual.

A parte, de si era esto correcto a la hora de programar.

Casimiro Notevi
20-08-2012, 15:25:49
A ver... pongamos un ejemplo.
Estamos creando un programa de contabilidad y hemos creado una base de datos que se llama plantilla-conta.fdb
Tenemos nuestro componente de base de datos, otro de transacciones, varios datasets y datasources. Lo normal.
El componente de BD tiene asociado plantilla-conta.fdb y creamos el programa con esa BD, creamos campos calculados, campos persistentes, etc. lo que haga falta.
Nuestro programa de contabilidad va a poder manejar distintas empresas y ejercicios, con nombres como (ejemplos):
emp-001-ejer-2012.fdb
emp-001-ejer-2011.fdb
emp-002-ejer-2011.fdb
etc.

Estas BDs son una copia de plantilla-conta.fdb y que se crean cada vez que el usuario crea un nuevo ejercicio/empresa.

Desde el programa debemos poder conectar a una empresa u otra, y también a un ejercicio u otro.
Para ello se desconecta de la BD a la que esté conectado y se conecta a otra.

Las bases de datos son iguales, evidentemente.

¿Es a esto a lo que te refieres?

anubis
20-08-2012, 17:27:54
Con todo este asunto he debido tener algun problema, acabo de crear algo basico para probar lo que preguntaba en el primer post.

procedure TForm1.FormCreate(Sender: TObject);
begin
zconnection1.Database:='d:\program cheques\elcheques.ib6';
zconnection1.Protocol:='sqlite-3';
zconnection1.Connected:=true;
zquery1.Connection:=zconnection1;
zquery1.SQL.Text:='select * from tcuentas';
zquery1.Active:=true;
datasource1.DataSet:=zquery1;
dbgrid1.DataSource:=datasource1;
end;

y funciona, tanto como si añado campos en tiempo de ejecucion, como si los pongo mal, no me da error en ningun sitio, ni me dice que no existen asi que voy a revistar el otro programa en el que tengo varios querys.

Gracias y perdon por las molestias

Casimiro Notevi
20-08-2012, 18:00:42
Ya nos dirás, a ver si descubres el problema :)

anubis
21-08-2012, 01:54:11
Ya está solucionado.

Al asignar la base de datos por código, tuve que quitar todas las referencias en el inspector de objetos a dicha base de datos y asignarlas todas por código asi no me da error.

Entiendo que al asignar por código la base de datos y tener las referencias en el inspector de objetos, éstas buscaban primero la base de datos y todavía no estaba asignada.

Muchas gracias Casimiro.