PDA

Ver la Versión Completa : Validar insercion en BD con tquery


Elite237
28-10-2008, 16:40:33
Hola de nuevo, fijense que tengo una duda...como puedo validar al guardar un usuario con tquery, osea que si ya existe que me mande un aviso de que no se puede guardar pues ya existe en la BD(lo se hacer con table, con un locate, pero con tquery no, y no puedo cambiarlo puesto que asi me lo piden). Tengo que hacer un procedimiento? o una funcion?

este es el codigo que uso, pero no me funciona correctamente, ya que cuando lo uso no me deja guardar.

Esta es mi funcion:

function TForm1.VerificarGuardar: Boolean;
begin
with query1 do
begin
close;
sql.clear;
sql.add('select * from tevaluacion');
sql.add('where eval_descripcion='''+ednombre.text+'''');
open;
if recordcount<>0 then
begin

application.messagebox('El nombre de la evaluacion ya existe','Error de entrada',mb_Ok+mb_IconExclamation);
end;
end;
end;


Asi la uso en mi boton y no me deja guardar:

procedure TForm1.BitBtnAPGuardarClick(Sender: TObject);
var
evalua:string;
begin
evalua:=copy(cmbEvaluacion.text,0,pos('-',cmbEvaluacion.text)-1); //Sacamos la clave del combo de la evaluacion
if verificarguardar = false then
begin
query2.close;
query2.sql.clear;
query2.sql.add('insert into det_evaluacion(det_eval,det_version,det_clave,det_pregunta,det_tipo,det_valor)');
query2.sql.add('values(:det_eval,:det_version,:det_clave,:det_pregunta,:det_tipo,:det_valor)');
query2.ParamByName('det_eval').AsString:=evalua;
query2.ParamByName('det_version').AsString:=edversion.text;
query2.ParamByName('det_clave').AsString:=edclave.text;
query2.ParamByName('det_pregunta').AsString:=edpregunta.text;
query2.ParamByName('det_tipo').AsString:=edtipo.text;
query2.ParamByName('det_valor').AsString:=edvalor.text;
try
query2.execsql
except
end;
edversion.Clear;
edclave.Clear;
edpregunta.Clear;
edtipo.Clear;
edvalor.clear;
application.messagebox('Los datos se guardaron correctamente','Mensaje de confirmación',mb_OK+mb_IconInformation);
LlenarGridPreguntas(sender);
end;
end;

Caral
28-10-2008, 17:31:59
Hola
A ver asi:


procedure TForm1.BitBtnAPGuardarClick(Sender: TObject);
begin
query2.SQL.Text := 'select * from tevaluacion where eval_descripcion= :Nom';
query2.ParamByName('Nom').AsString:= ednombre.text;
query2.Open;
If query2.Fields[0].AsString = ednombre.text then
begin
MessageDlg('El nombre de la evaluacion ya existe','Error de entrada',mtError,[mbOK],0);
ednombre.SetFocus;
query2.Close;
end
else
begin
query2.sql.clear;
query2.sql.add('insert into det_evaluacion(det_eval,det_version,det_clave,det_pregunta,det_tipo,det_valor)');
query2.sql.add('values(:det_eval,:det_version,:det_clave,:det_pregunta,:det_tipo,:det_valor)');
query2.ParamByName('det_eval').AsString:=evalua;
query2.ParamByName('det_version').AsString:=edversion.text;
query2.ParamByName('det_clave').AsString:=edclave.text;
query2.ParamByName('det_pregunta').AsString:=edpregunta.text;
query2.ParamByName('det_tipo').AsString:=edtipo.text;
query2.ParamByName('det_valor').AsString:=edvalor.text;
query2.execsql
edversion.Clear;
edclave.Clear;
edpregunta.Clear;
edtipo.Clear;
edvalor.clear;
application.messagebox('Los datos se guardaron correctamente','Mensaje de confirmación',mb_OK+mb_IconInformation);
LlenarGridPreguntas(sender);
end;
end;
Saludos

Elite237
28-10-2008, 17:57:13
Excelente Caral..ya lo validó.Muchas gracias por tu respuesta y mas por tu tiempo.Te queda bien el color de pelo de la foto(digo yo que eres tu)

Delphius
28-10-2008, 18:09:38
Te queda bien el color de pelo de la foto(digo yo que eres tu)
Elite237, yo que vos me cuido:D. La foto de Caral es su hija.
Y por si preguntas, Caral es hombre.

Saludos,

Elite237
28-10-2008, 18:14:34
:eek:Disculpa caral.....en serio mil disculpas,no sabia(ahora lo se).En ocasiones las fotos que colocan son las mismas personas que contestan.En serio disculpa.:o

Delphius
28-10-2008, 18:22:26
:eek:Disculpa caral.....en serio mil disculpas,no sabia(ahora lo se).En ocasiones las fotos que colocan son las mismas personas que contestan.En serio disculpa.:o
No es necesario que te disculpes, no creo que eso le moleste.
No eres el primero que lo confunde con una mujer, mejor dicho con su hija.

Nomás yo te decía en broma que debes cuidarte. En todo caso soy yo quien debe pedir disculpa.

Saludos,

Caral
28-10-2008, 18:35:44
Hola
Elite237 me alegro que te funcionara.
No te preocupes, como dice Delphius no es la primera vez y no me molesta.
Saludos

Elite237
28-10-2008, 23:32:14
Una duda, solo es para confirmar..a que se refiere ese :Nom' que usaste?Digo por si lo quiero usar mas adelante..



eval_descripcion= :Nom';
query2.ParamByName('Nom').AsString:= ednombre.text;

y aqui a que se hace referencia? es a un arreglo?me refiero
especificamente en el query2.fields[0]

If query2.Fields[0].AsString = ednombre.text then

Caral
29-10-2008, 01:39:46
Hola
Una duda, solo es para confirmar..a que se refiere ese :Nom' que usaste?Digo por si lo quiero usar mas adelante..


eval_descripcion= :Nom';
query2.ParamByName('Nom').AsString:= ednombre.text;



Nom es un parametro, te explico:
Los parametros se usan en una consulta sql para hacer referencia a algun dato o para hacer comparaciones.
Estos pueden tener cualquier nombre y están precedidos por dos puntos.
Igual que use :Nom, podria usar :Pato o :XXXX o el nombre que sea.


y aqui a que se hace referencia? es a un arreglo?me refiero
especificamente en el query2.fields[0]

If query2.Fields[0].AsString = ednombre.text then


Aqui lo que se hace es tomar un dato de un campo.
Query2 es el query
Fields es el campo.
[0] hace referencia al primer campo.
AsString es el tipo de dato
No es ningún arreglo ni nada complicado, eso se lo dejo a los maestros.
Saludos

Caro
29-10-2008, 01:44:44
Hola Elite237, no te guarda porque tu función VerificarGuardar no esta devolviendo ningún resultado, por lo tanto te devolvera siempre True y al preguntar tu por False nunca entrara a ese bloque.

Tu función debería quedar así:


function TForm1.VerificarGuardar: Boolean;
begin
with query1 do
begin
close;
sql.clear;
sql.add('select * from tevaluacion');
sql.add('where eval_descripcion='''+ednombre.text+'''');
open;
if recordcount<>0 then
begin
application.messagebox('El nombre de la evaluacion ya existe','Error de entrada',mb_Ok+mb_IconExclamation);
Result := True;
end
else
Result := False;
end;
end;


inclusive puedes preguntar por Query.IsEmpty.


........................
open;
if Not IsEmpty then
begin
application.messagebox('El nombre de la evaluacion ya existe','Error de entrada',mb_Ok+mb_IconExclamation);
Result := True;
end
else
Result := False; //No existe
......................



Sobre tus ultimas preguntas, :nom significa que nom es un parametro, y al hacer query2.ParamByName('Nom').AsString:= ednombre.text; estamos llenando con el valor de ednombre.text ese parametro. Y sobre query2.fields[0] , si es un arreglo de campos, cuando tu haces en la consulta select * From... , con ese * te trae todos los campos en el orden que los tienes en tu tabla "Fields[0]" se refiere al primer campo. En en tu caso ya no sería necesario ese if "If query2.Fields[0].AsString = ednombre.text then
", ya que en tu consulta estas filtrando por ese nombre y solo sería preguntar si hay resultados o no con IsEmpty.

Saluditos