Ir al contenido


Foto

[RESUELTO] Insertar registros por medio de un Zquery


  • Por favor identifícate para responder
24 respuestas en este tema

#1 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 02 julio 2009 - 09:53



delphi
  1. begin
  2.  
  3.     DMmonitoreo.ztCENTRAL.Insert;
  4.     DMmonitoreo.ztCENTRALcsid.Value := trim(csid);
  5.     DMmonitoreo.ztCENTRALbuffer.Value := buffer;
  6.     DMmonitoreo.ztCENTRALformato.Value := formato;
  7.     DMmonitoreo.ztCENTRALEVENTO.Value := trim(EVENTO);
  8.     DMmonitoreo.ztCENTRALDETALLE.Value := detalle;
  9.     Dmmonitoreo.ztCENTRALfechan.Value := now;
  10.     DMmonitoreo.ztCENTRAL.Post;
  11.  
  12.     if DMmonitoreo.ZQcentralTIPO.AsString = 'A'  then
  13.     begin
  14.       DMmonitoreo.ZTacti.Insert;
  15.       DMmonitoreo.ZTactiCSID.Value := DMmonitoreo.ztCENTRALcsid.Value;
  16.       DMmonitoreo.ZTactiEVENTO.Value := DMmonitoreo.ztCENTRALEVENTO.Value;
  17.       Dmmonitoreo.ZTactiFECHAN.Value := dmmonitoreo.ztCENTRALfechan.Value;
  18.       DMmonitoreo.ZTacti.post;
  19.     end;



Quiero hacer esto pero usando un Zquery  y con Parametros creados en la ejecucion.

Arranque con esto



delphi
  1. begin
  2.   Dmmonitoreo.ZQcentral.close;
  3.   Dmmonitoreo.ZQcentral.SQL.Clear;
  4.   Dmmonitoreo.ZQcentral.SQL.Add('insert into central(:csid,:buffer,:formato,:evento,:detalle,:fechan)');
  5.   Dmmonitoreo.ZQcentral.Parambyname('csid').asstring    :=trim(csid);
  6.   Dmmonitoreo.ZQcentral.ParamByName('buffer').AsString  :=buffer;
  7.   Dmmonitoreo.ZQcentral.ParamByName('formato').AsString  :=formato;
  8.   Dmmonitoreo.ZQcentral.ParamByName('evento').AsString  :=trim(evento);
  9.   Dmmonitoreo.ZQcentral.ParamByName('detalle').AsString  :=detalle;
  10.   Dmmonitoreo.ZQcentral.ParamByName('fechan').AsDateTime :=now;
  11.   Dmmonitoreo.ZQcentral.ExecSQL;



solo puse los valores, ya que lei que va a insertar valores en todos los campos de la tabla, no es necesario mencionar los campos.

Pero me da el siguiente error:

Imagen Enviada

http://img80.imagesh.../apro3error.jpg

  • 0

#2 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 03 julio 2009 - 08:39

Has intentado colocar los nombre de los campos?, revisa tambien la propiedad request live en true
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 03 julio 2009 - 08:49

Pero...... que no debe ser asi el INSERT ????



delphi
  1.   Dmmonitoreo.ZQcentral.SQL.Add(' INSERT INTO central(csid, buffer, formato, evento, detalle, fechan) ');
  2.   Dmmonitoreo.ZQcentral.SQL.Add(' VALUES (:csid, :buffer, :formato, :evento, :detalle, :fechan) ');



Salud OS
  • 0

#4 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 03 julio 2009 - 09:41

Tenias Razon Egostar asi es que va el insert. Pero lei en un manual que podia hacerlo si el nombre de los campos, siempre y cuando no dejara ninguno vacio. pero como ahi uno autoincrementable, talvez por ahi sea el problema.

Gracias Egostar

EDUARCOL , Creo que me estoy poniendo ciego pero no encuentro la propiedad

Has intentado colocar los nombre de los campos?, revisa tambien la propiedad request live en true


No la veo en el Object Inspector del Zquery.





  • 0

#5 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 03 julio 2009 - 09:51

Tenias Razon Egostar asi es que va el insert. Pero lei en un manual que podia hacerlo si el nombre de los campos, siempre y cuando no dejara ninguno vacio. pero como ahi uno autoincrementable, talvez por ahi sea el problema.
...


Definitivamente eso es algo que causa problemitas... los autoincrementables, en esos casos, yo he tenido que especificar los campos y sus respectivos valores a insertar...

Saludos,
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 03 julio 2009 - 09:56

Tenias Razon Egostar asi es que va el insert. Pero lei en un manual que podia hacerlo si el nombre de los campos, siempre y cuando no dejara ninguno vacio. pero como ahi uno autoincrementable, talvez por ahi sea el problema.


Si es correcto, pero en todo caso debe ser de esta forma



delphi
  1.   Dmmonitoreo.ZQcentral.SQL.Add(' INSERT INTO central ');
  2.   Dmmonitoreo.ZQcentral.SQL.Add(' VALUES (:csid, :buffer, :formato, :evento, :detalle, :fechan) ');



Sobre el asunto del autoincrementable que me imagino es :csid, puedes intentar con esto:



delphi
  1.   Dmmonitoreo.ZQcentral.SQL.Add(' INSERT INTO central ');
  2.   Dmmonitoreo.ZQcentral.SQL.Add(' VALUES (null, :buffer, :formato, :evento, :detalle, :fechan) ');



Al pasar el dato nulo automáticamente deberia de asignarte el valor en tu base de datos, ¿que base de datos estas utilizando?

Salud OS
  • 0

#7 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 03 julio 2009 - 10:04

Gracias egostar por tu respuesta

Estoy utilizando Firebird.

El campo autoincrementable no esta mencionado en la consulta es entradadatos. No lo menciono porque el sistema lo inserta automaticamente. voy a probar como me dices poniendo el valor null en la parte del campo autoincrementable. Porque el problema pudo ser que al dejar de mencionar uno de los campos en la consulta, esta me daba el error.

Nota: Egostar donde esta la propiedad Requestlive del Zquery. La pongo true en donde?

Gracias de nuevo

Eduarcol, gracias por tu respuesta tambien, se me olvido agradecerte antes


  • 0

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 03 julio 2009 - 10:10

Hola

La propiedad RequestLive te sirve para cambiar un SELECT en un Query que es de solo lectura a escritura, pero no es tu caso porque estas usando INSERT con ExecSQL.

Esta propiedad solo la trae el TQuery "normalito" de la carpeta BDE, me imagino que Zeos no la utiliza.

Salud OS

  • 0

#9 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 03 julio 2009 - 10:28

Gracias De nuevo Egostar.

Te comento que esta forma si me funciona y el autoincrementable se pone solito, ya que en esta aclaro los valores que quiero cambiar. En las otras dos que me pusiste donde no escribo el nombre de los campos o en la que le pongo null al campo autoincrementable, me da un error similar al que me daba y que indico en mi primera pregunta.

Pero...... que no debe ser asi el INSERT ????



delphi
  1.   Dmmonitoreo.ZQcentral.SQL.Add(' INSERT INTO central(csid, buffer, formato, evento, detalle, fechan) ');
  2.   Dmmonitoreo.ZQcentral.SQL.Add(' VALUES (:csid, :buffer, :formato, :evento, :detalle, :fechan) ');



Salud OS


pero asi me funciona bien, asi que no hay problema.

Por otro lado el asunto del request live me intereza porque se supone que con eso me evito el estar haciendo refresh. Como actualizo el Zquery si no tengo esa propiedad.


Ultima pregunta. El Dbgrid lo estoy llenando con otro Zquery, ya que con el que hago el insert, me sale en blanco,
debido a que no estoy solicitando ninguna informacion, sino insertando registros. Puedo o debo utilizar el mismo zquery y si es asi como hago para que aparezcan los datos en el dbgrid.








  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 03 julio 2009 - 10:47

Hola

Si el zQuery tuviese una propiedad ApplyUpdates podrí­a darte el resultado que esperas, de otra forma tendrias que hacerlo manualmente:

  • Después de Agregar Datos
  • Cierra el zQuery del Select
  • Abres el zQuery del Select

Salud OS
  • 0

#11 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 03 julio 2009 - 10:48

no puedes utilizar el mismo zQuery en el dbgrid, para que te aparezcan los datos luego de insertados deberas refrescar la consulta.

Con lo del requestlive es una propiedad que deberas buscar en el inspector.
  • 0

#12 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 03 julio 2009 - 11:11

Puede usar el mismo zQuery como algo así­ no ???



delphi
  1. procedure TfmNieto.BotonClick(Sender: TObject);
  2. begin
  3.     with dam.Query do
  4.     begin
  5.       close;
  6.       sql.clear;
  7.       sql.Add('insert into tabla_prueba');
  8.       sql.Add('values (8,'+quotedstr('gaby')+','+quotedstr('olivas')+')');
  9.       execsql; // hasta aquí­ hace la inserción
  10.       close; // cierra la consulta
  11.       sql.text := 'select * from tabla_prueba'; // genera el select
  12.       open; // vuelve a abrir la consulta
  13.     end; 
  14.  
  15. end;



Saludos

P.D. Ojalá vuelvan las etiquetas de Delphi pronto  :(
  • 0

#13 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 03 julio 2009 - 08:21

Gracias fenareth por tu respuesta.

Si realmente funciona bien asi. El problema es que lo que buscaba con hacer el insert por medio de un query, era precisamente no tener que hacer refresh.

Eduarcol me ha indicado en otras ocasiones que es mejor asi. Pero ahora no encuentro la propiedad request live en
el query de zeos y por lo tanto estoy en lo mismo que si lo hiciera con una tabla.

EDUARCOL enviame un ejemplito de un Zquery con la propiedad request live en true, porque realmente no se donde esta.
  • 0

#14 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 03 julio 2009 - 08:39

no te des mala vida por el request live si no lo tienes me imagino que es una version mas nueva que la mia, con respecto al ejemplo cual necesitas porque hay muchas formas de hacer un insert
  • 0

#15 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 03 julio 2009 - 09:11


Gracias Eduarcol por tu respuesta.

Segun el insert con parametros que estoy haciendo, como hago para que me aparezcan los datos actualizados en el dbgrid con este query como indica fenareth o con otro query.

Lo que no quiero es hacer los refresh. Porque tienes razon en que hacen mas lento el proceso.

Pero si es obligatorio hacer el refresh, me gustaria saber como hacer la consulta en firebird donde solo me de los ultimos 10 registros de la tabla. Con esto el refresh va a ser mas rapido.

lo intente con:


delphi
  1. dmmonitoreo.zqcentral.text := 'select top 10 * from central order by entradadatos desc



pero esta consulta no funciona en firebird

  • 0

#16 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 03 julio 2009 - 09:15

esas sentencias las utilizo muy poco, pero creo que en lugar de TOP deberias colocar FIRST si no es asi deja que lleguen los que si saben.

Sigue asi que vas bien
  • 0

#17 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 03 julio 2009 - 09:24

.......me gustaria saber como hacer la consulta en firebird donde solo me de los ultimos 10 registros de la tabla. Con esto el refresh va a ser mas rapido.

lo intente con:


delphi
  1. dmmonitoreo.zqcentral.text := 'select top 10 * from central order by entradadatos desc



pero esta consulta no funciona en firebird


Debes usar



sql
  1. SELECT FIRST 10 * FROM central ORDER BY entradadatos DESC



Salud OS
  • 0

#18 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 03 julio 2009 - 10:18

Gracias por sus respuestas.

Es correcto la consulta es asi. El problema es que cuando sale en el dbgrid, el ultimo registro esta arriba y me gustaria que estuviera abajo.

ejemplo

1010
1009
1008
1007

quisiera que saliera
1007
1008
1009
1010

gracias de nuevo




  • 0

#19 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 03 julio 2009 - 10:21

Gracias por sus respuestas.

Es correcto la consulta es asi. El problema es que cuando sale en el dbgrid, el ultimo registro esta arriba y me gustaria que estuviera abajo.

ejemplo

1010
1009
1008
1007

quisiera que saliera
1007
1008
1009
1010

gracias de nuevo


Y si le quitas el desc ????



sql
  1. SELECT FIRST 10 * FROM central ORDER BY entradadatos



Salud OS
  • 0

#20 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 03 julio 2009 - 11:36

La consulta es de esta manera que funciona:


delphi
  1. dmmonitoreo.zqcentral.text := ' SELECT first 10 * from (select first 10 * from central order by entradadatos desc) order by entradadatos'; 




  • 0




IP.Board spam blocked by CleanTalk.