PDA

Ver la Versión Completa : Problema con añadir registro a base de datos


sdiaz1983
09-01-2008, 04:28:52
Buen dia a todos, antes que nada quiero que observen este codigo

procedure TFrmClientes.BtGuardarClick(Sender: TObject);
begin
TblCliente.Active:=True;
QryCliente.SQL.Text:='select * from cliente where Cedula=:P1 and Nombre=:P2 and Apellido=:P3 and Telefono=:P4 and Direccion=:P5';
QryCliente.Params[0].AsString:=EdtCedula.Text;
QryCliente.Params[1].AsString:=EdtNombre.Text;
QryCliente.Params[2].AsString:=EdtApellido.Text;
QryCliente.Params[3].AsString:=EdtTelefono.Text;
QryCliente.Params[4].AsString:=EdtDireccion.Text;
QryCliente.Active:=True;
if (QryCliente.RecordCount>0) then
ShowMessage('REGISTRO YA ESTA: '+IntToStr(QryCliente.RecordCount)+'')
else
ShowMessage('PAILAS');
QryCliente.AppendRecord([EdtCedula.Text]);
QryCliente.Active:=False;
TblCliente.Active:=False;
end;
end.


Lo que estoy tratando de hacer(inicialmente a manera de prueba) es que por ejemplo yo ingreso unos datos en un formulario, si me lo encuentra listo me muestra el mensaje Registro ya esta, eso ya funciona, el problema que tengo es listo ingreso los datos de un registro que no este en la base de datos me bota el mensaje pailas y lo que quiero a manera de prueba es que a manera de prueba me agregue lo que esta en ese Edt (EdtCedula) al la base de datos, segun la ayuda el metodo appenrecord me permite agregar registros al final de la base de datos, pero el erro que me bota dice mas o menos "QryCliente: No se puede modificar un Dataset de solo lectura"( es mas o menos mi traduccion ya que el mensaje en ingles no recuerdo pero se relaciona con esto), el problema es si con ese metodo me ahorro el usar la sentencia sql de insert (insert into .... values....), que tengo que corregir del codigo.

Mil Gracias por su ayuda.

jachguate
09-01-2008, 05:09:55
Antes de activar el query, poné esto:


QryCliente.RequestLive := True;


hasta luego.

;)

sdiaz1983
09-01-2008, 14:26:00
Mil Gracias Por Su Ayuda Ya Me Funciono, uan pregunta el registro me lo esta agregando al principio de la tabla, queria preguntarle como hago oque propiedad tengo que hacer para que me lo agregue al final.

Gracias uan vez mas

jachguate
09-01-2008, 15:19:57
En las bases de datos SQL no existe una secuencia en los registros de una tabla, en otras palabras no existe tal cosa como "primer registro" o "último registro" de una tabla, que son conceptos usuales en manejadores de archivos de escritorio.

Para que el servidor te entregue los registros en un orden particular, existe la clausula "order by", que podes añadir a tu sentencia SQL.

Hasta luego.

;)

AzidRain
09-01-2008, 18:30:46
O lo que es lo mismo, debes definir un índice para tu tabla que servirá para que tu motor te entregue los registros ordenados de una cierta manera por default. Puedes usar un campo autoincrementado para llevar un secuencia según el orden en que fueron ingresados los registros.

jachguate
09-01-2008, 18:43:29
O lo que es lo mismo, debes definir un índice para tu tabla que servirá para que tu motor te entregue los registros ordenados de una cierta manera por default. Puedes usar un campo autoincrementado para llevar un secuencia según el orden en que fueron ingresados los registros.

Lo siento, pero no estoy de acuerdo con eso. Por mucho que definas un índice, si haces un simple:


select *
from tabla


El motor te devolverá los datos en un orden no definido.

Por el contrario, si lanzás un query con la clausula order by, aún cuando el motor no tenga índices en que apoyarse, te entregará los datos perfectamente ordenados.

El hecho de que existan o no índices, es un tema que tiene que ver con el desempeño de la base de datos, pero no con el ordenamiento de los resultados que devuelve un motor.

AzidRain, no es conveniente generalizar en este tema, pues mientras algún motor probablemente se base en un índice (por ejemplo, el de la llave primaria) para entregar datos ordenados, el estándar SQL no le impone la obligación de hacerlo, con lo que el comportamiento podría variar entre versiones, y definitivamente varía entre motores.

Dado que no estamos hablando de ningún motor en particular... es mejor hacer afirmaciones apegadas al estándar, y dejar que cada quien compruebe si su base de datos lo cumple o no.

Hasta luego.

;)

maeyanes
09-01-2008, 18:49:12
Hola...

mmm tal vez AzidRain quiso referirse al indice de la llave (o clave) primaria de la tabla...

Por que siempre que haces un select * from Tabla, esta se ordena de acuerdo al campo sobre el cual está definida la llave primaria...


Saludos...

Edit:

Eso me pasa por leer de prisa xDDD

Puede que si sea diferente en distintos motores, pero al menos en los que he usado, si se cumple del que el orden predeterminado lo da la llave primaria...


Saludos de nuevo... :D

jachguate
09-01-2008, 18:58:49
Puede que si sea diferente en distintos motores, pero al menos en los que he usado, si se cumple del que el orden predeterminado lo da la llave primaria...
mmm... ¿cuales son los que vos has usado?

Hasta luego.

;)

maeyanes
09-01-2008, 19:10:38
Pues principalmente Interbase/Firebird...

Y un tiempo usé MS SQL Server...

Aunque claro, no hay que descartar que sea la aplicación cliente quien ordene los resultados de ese modo cuando no existe la clausula order by... ;)


Saludos (ordenados diría Al Gonzalez :D)

jachguate
09-01-2008, 21:20:22
Pues principalmente Interbase/Firebird...

Y un tiempo usé MS SQL Server...

Aunque claro, no hay que descartar que sea la aplicación cliente quien ordene los resultados de ese modo cuando no existe la clausula order by... ;)


Saludos (ordenados diría Al Gonzalez :D)

Puedo garantizar que ninguna de las versiones de Interbase o Firebird con las que he trabajado ordena de la manera que vos lo describís. Según recuerdo son:


Interbase 5.5
Interbase 6
Firebird 1 y 1.01
Firebird 1.5.x
Firebird 2.0.x


Puedo probarlo únicamente ahora en Firebird.

http://img147.imageshack.us/img147/3457/isqlnoordenadomt8.jpg (http://img147.imageshack.us/my.php?image=isqlnoordenadomt8.jpg)

Como ves, el resultado no está ordenado por cliente. El hecho de que seleccione solamente los primeros 20 registros no afecta el ordenamiento. He hecho una consulta de la tabla completa y funciona tal como lo he dicho.

Ahora no tengo tiempo suficiente para probarlo con SQL Server... si lo tengo en un rato, ya postearé mis resultados.

Hasta luego.

;)

maeyanes
09-01-2008, 21:36:02
Hola...

Creo que el link de la imagen que pusiste está mal... veo una imagen muy pequeña (el tumbnail) y no puedo ver bien el resultado...

Y bueno, yo no uso el cliente de línea de comandos de Firebird, y como comenté arriba, puede que el cliente sea el que ordena los registros por medio de la clave primaria cuando no se especifica un order by...

Aquí un SS de una consulta desde EMS SQL Manager:

Screen Shot (http://img.villagephotos.com/p/2003-5/197966/selectfrom.jpg)


Saludos...

maeyanes
09-01-2008, 21:44:22
Bueno...

Haciendo una pueba desde ISQL Firebird 2.0...

Screen Shot (http://img.villagephotos.com/p/2003-5/197966/selecfromisql.jpg)

El campo clave e indexado es ID_RAMO y los datos están ordenados de acuerdo a ese campo...


Saludos...

maeyanes
09-01-2008, 21:55:07
Haciendo una prueba con una tabla más grande, veo el comportamiento que indicas...

Y bueno, veo que he estado equivocado al respecto... :) ;)


Saludos...

jachguate
09-01-2008, 22:26:31
En firebird, eso mismo puede pasar también con una tabla pequeña. Sobre todo si sufre constantemente de borrados e inserciones.

Hasta luego.

;)