Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   en query -- ExcecSQL y Open (https://www.clubdelphi.com/foros/showthread.php?t=68994)

marareta 20-07-2010 07:04:18

en query -- ExcecSQL y Open
 
Hola amigos, aca otra vez molestandolos, tengo un pequeño problemita, tengo una tabla pacientes en donde los voy agregando, y al momento de llenar los datos en mi aplicacion le doy guardar y todo perfecto, el problema viene cuando inmediatamente despues intento guardar otro paciente ya no me respeta cuando intento validar si el paciente existe. Aqui les va el codigo:

En el boton de guardar tengo otras cosas pero aqui es donde tengo el problema.
Esto esta al principio para checar si el usuario existe:
Código Delphi [-]
 
Querypac.Close;
querypac.SQL.Clear;
Querypac.Sql.Text := 'Select * From pacientes';
Querypac.Open;
if ((Querypac.FieldValues['nombre']= edit3.Text)) then //edit 3 es donde pongo el nombre del paciente
   begin
   showmessage('El usuario ya existe');
   exit;
   end
  end;
Inmediatamente despues ya que se que el usuario no existe lo ingreso a la tabla con el siguiente codigo:
Código Delphi [-]
 
QueryPac.Close;
QueryPac.SQL.Clear;
QueryPac.SQL.Add('Insert into pacientes(nombre,edad) values'
            +chr(39)+edit71.Text+chr(39)+','+chr(39)+edit72.Text+chr(39)+')');
QueryPac.ExecSQL;
showmessage('El paciente se agregó correctamente');

Hasta aquí todo bien, el problema es si intento guardar otro paciente, le pongo el mismo nombre y no me dice que está duplicado.
Antes tenia el código cuando lo voy a insertar envez de tener:
Código Delphi [-]
 
QueryPac.ExcecSQL;
//tenia
QueryPac.Open;
pero me decia "Error creating cursor handle"
y por eso se lo cambie, no se si exista una instrucción como para despues de utilizar ExcecSQL poder cancelar o algo asi porque siento que esa es la instruccion que me esta danmdo problemas.
ojalá me pudieran ayudar porque me estoy volviendo loco por no poder resolver esto, como siempre muchas gracias de antemano

olbeup 20-07-2010 09:00:06

En la primera sentencia que haces, no esta bien por que te traes todos los pacientes y solo te compara uno, de los xx que te trae.
Cita:

Querypac.Close;
querypac.SQL.Clear;
Querypac.Sql.Text := 'Select * From pacientes';
Querypac.Open;
if ((Querypac.FieldValues['nombre']= edit3.Text)) then //edit 3 es donde pongo el nombre del paciente
begin
showmessage('El usuario ya existe');
exit;
end
end;
Lo correcto seria:
Código Delphi [-]
Querypac.Close;
querypac.SQL.Clear;
Querypac.Sql.Text := 'Select count(*) AS Existe From pacientes where nombre = ' + QuotedStr(edit3.Text);
Querypac.Open;
if (Querypac.FieldValues['Existe'] > 0) then // Si el valor devuelto es mayor que 0 (cero) el paciente ya existe
   begin
   showmessage('El usuario ya existe');
   exit;
   end
  end;
Un saludo.

afunez2007 20-07-2010 17:29:47

Hola Amigo

Solo hacerte un par de comentarios:

1.- Siempre que vas a utilizar una query debes desactivarla antes de cambiarle el sql text, en vez de utilizar open / close, a mi en lo particular me da mejores resultados:

Código Delphi [-]
Querypac.Active:=False;
Querypac.SQL.Clear; 
Querypac.Sql.Text := 'Select * From pacientes where nombre ='+QuotedStr(edit3.Text);
Querypac.Active:=True;
  if Querypac.RecordCount>0 then
   begin
     showmessage('El paciente ya existe');
     exit;
  end;

2.- Por una practica sana si utilizas una query para checar la existencia del cliente, utiliza otra para hacer el insert
Código Delphi [-]
QueryPac2.Sql.Clear;
QueryPac2.SQL.Text:='Insert into pacientes(nombre,edad)  values('
                    +QuotedStr(edit71.Text)+','+QuotedStr(edit72.Text)+')';
QueryPac2.ExecSQL;
showmessage('El paciente se agregó correctamente');

Espero te sirvan este par de comentarios y como veras he cambiado un poco el texto en ambas querys, yo utilizo este tipo de cosas rutinariamente y con esto no me falla

Saludos

radenf 21-07-2010 00:59:36

Estimado marareta :

Otro comentario.
Yo también programo aplicaciones para uso con pacientes y es sorprendente la cantidad de pacientes que tienen el mismo nombre. Si utilizas este criterio para incluir nuevos registros en tu base de datos probablemente tendrás problemas.
A mi me ha resultado de mayor utilidad utilizar un número único de identificación, que puede ser el Nº de la ficha del paciente o su RUT, NIF o como se llame en tu país.

Saludos y ojalá este comentario te sirva

Casimiro Notevi 21-07-2010 03:01:54

Totalmente de acuerdo con radenf, usa el DNI o algún identificador único, porque como uses nombres... ya veo extirpándole el apéndice al que fue a curarse una picadura de mosquito, y amputarle el pié al que fue por una gripe :confused::confused::confused:


La franja horaria es GMT +2. Ahora son las 22:05:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi