PDA

Ver la Versión Completa : Busquedas utilizando ADO


tenporal
17-07-2007, 21:48:52
Saludos a tod@s, mi pregunta es la siguiente:

¿Habra otra opcion diferente a LOCATE para busquedas utilizando un ADOTABLE?


Código Delphi [-] (http://www.clubdelphi.com/foros/#)
if Adotable1.Locate('cvemateria',mcvemateria,[]) = false then


beginShowMessage('La clave de la materia no existe') end else


begin
Adotable1.edit;
end;










He estado buscando ejemplos pero no los he encontrado, se agradeceria la ayuda a esta pregunta.

tenporal
17-07-2007, 21:52:56
Saludos a tod@s, mi pregunta es la siguiente:

¿Habra otra opcion diferente a LOCATE para busquedas utilizando un ADOTABLE?

if Adotable1.Locate('cvemateria',mcvemateria,[]) = false then
begin
ShowMessage('La clave de la materia no existe')
end else
begin
Adotable1.edit;
end;


He estado buscando ejemplos pero no los he encontrado, se agradeceria la ayuda a esta pregunta.

Caral
17-07-2007, 22:08:07
Hola
Yo lo hago por filtro asi:

procedure TFBuscaArticulo.Edit1Change(Sender: TObject);
var Filtro : String;
begin
If (Edit1.Text <> '') then
begin
Adotable1.Filtered := False;
Filtro := 'cvemateria Like '''+Edit1.Text + '*'''
Adotable1.Filter := Filtro;
Adotable1.Filtered := True
end
else
ShowMessage('La clave de la materia no existe')
Adotable1.Filtered := False;
end;

O tambien por sql, hay muchas formas de hacerlo.
Saludos

saldanaluis
17-07-2007, 23:18:41
Caral,
Disculpa pero no entendí tu código... ¿Como es que con el Filter se puede saber si se tiene al menos un registro ó no se tiene ningun registro de respuesta, como para poner el mensaje de que no existe la clave de la materia?
En un .locate, al menos la respuesta es un true ó false, y con eso sabes si el locate fue exitoso o no, pero no veo como hacerlo con el filter.
Gracias por tu explicación.

vtdeleon
18-07-2007, 01:30:59
Saludos

Cual es el inconveniente de usar Locate? Existen otras maneras de busqueda FindKey u otras con sentencias Sql.

Caral
18-07-2007, 03:17:36
Hola saldanaluis
Tienes razon en cuestionarme, eso pasa por tratar de parecer un programador.
Con un filter, una sentencia sql, un locate, etc y una simple sentencia if o case, se puede hacer casi cualquier cosa, bueno, si eres programador, algo que no soy.
Por eso, tienes razon en cuestionar.:)
Saludos

egostar
18-07-2007, 03:28:40
Hola saldanaluis
Tienes razon en cuestionarme, eso pasa por tratar de parecer un programador.
Con un filter, una sentencia sql, un locate, etc y una simple sentencia if o case, se puede hacer casi cualquier cosa, bueno, si eres programador, algo que no soy.
Por eso, tienes razon en cuestionar.:)
Saludos

Yo creo que tu respuesta es buena, porque además le comentaste que podía usar SQL o muchas otras formas, que yo sepa un filtro es eso, solo te muestra los registros que cumplan la comparación del filtro (0, 1 o más) y esa fué la pregunta incial.

Así que no veo el porque te sientas mal amigo Carlos.

Salud OS.

Caral
18-07-2007, 03:34:41
Hola
Gracias por el animo Amigo, egostar.
La verdad, a veces creo que mejor ya no contesto mas hilos por que creo que lo estoy haciendo mal, ultimamente me siento un poco fuera de lugar, la edad quizas.
Pero lo que importa en realidad es el apoyo y amistad de personas como tu, gracias.
Saludos

egostar
18-07-2007, 03:55:01
Caral,
Disculpa pero no entendí tu código... ¿Como es que con el Filter se puede saber si se tiene al menos un registro ó no se tiene ningun registro de respuesta, como para poner el mensaje de que no existe la clave de la materia?
En un .locate, al menos la respuesta es un true ó false, y con eso sabes si el locate fue exitoso o no, pero no veo como hacerlo con el filter.
Gracias por tu explicación.

Solo para responder a tu cuestionamiento, usando filter como te lo decia nuestro amigo Carlos, puedes validar de esta forma:


ADOTable1.Filter = 'campo = algo';
if ADOTable1.RecordCout > 0 then begin
//Hay al menos un registro
end
else begin
//NO hay registros con ese filtro
end;


Con eso puedes saber si fué exitoso o no.

Salud OS.

tenporal
18-07-2007, 04:59:45
Gracias por responder a este hilo, mas que nada el codigo que coloque al inicio del hilo, era para conocer si habia mas formas de validar cuando se esta insertando en una tabla que tiene un indice primario y que muestra la informacion en un campo dbedit, ya que si se trata de agregar una clave que ya existe en la tabla, manda un mensaje de error.

Caral, a lo mejor no me explique bien cuando puse codigo, se supone que tienes un boton para agregar un nuevo registro, pero antes de darle el
adotable1.insert

Ya que inserta un registro en blanco y luego manda el error de excepcion, por eso debo verificar antes en la tabla si no existe una clave igual que la que se quiere introducir en ese momento, lo que se dice validar la insercion.

En alguna parte vi que se podia utilizar la funcion SEEK, pero no se como se utiliza en delphi con los ADOTABLE.

De antemano gracias por su ayuda.

roman
18-07-2007, 05:12:17
Si quieres verificar la existencia de una clave antes de la inserción, quizá lo más adecuado sería una consulta SQL del estilo:


select count(clave) from tabla
where clave = clave_a_buscar


y examinar si el valor del registro que te regresa es mayor que cero. Por otra parte, quizá quieras considerar que el error que obtienes no es "malo", a fin de cuentas es otra manera de verificar lo mismo, sólo que lo hace a posteriori.

Como lo propones es:


IF ExisteRegistro THEN
MuestraError
ELSE
InsertaRegistro


De la otra forma es:


InsertaRegistro;
IF RegistroDuplicado THEN
MuestraError;


O sea, virtualmente es lo mismo, lo que cambia es el momento en que se controla el error. Además, en este caso, quien hace la verificación es el servidor, y normalmente será más eficiente.

// Saludos

poliburro
18-07-2007, 05:16:20
Hola
Gracias por el animo Amigo, egostar.
La verdad, a veces creo que mejor ya no contesto mas hilos por que creo que lo estoy haciendo mal, ultimamente me siento un poco fuera de lugar, la edad quizas.
Pero lo que importa en realidad es el apoyo y amistad de personas como tu, gracias.
Saludos


Pero amigo caral, para nada debes sentirte fuera de lugar, al contrario, tus aportaciones son tan valiosas como las de cualquiera de nosotros.

:D Animo amigo.

Al González
18-07-2007, 06:14:05
¡Hola a todos!

Caral: En lo personal, tus intervenciones me parecen de lo más sensatas. Tampoco debe uno tomarse los comentarios de otros en plan negativo. Confío en que te seguiremos viendo por estos rumbos.

Un abrazo positivo.

Al González. :)

tenporal
18-07-2007, 08:46:14
Gracias por sus comentarios,

Originalmente escrito por Roman
virtualmente es lo mismo, lo que cambia es el momento en que se controla el error. Además, en este caso, quien hace la verificación es el servidor, y normalmente será más eficiente.


Al inicio tuve problemas con Access, ya que al ejecutar adotable1.insert, mandaba un mensaje de error, al querer insertar una llave duplicada, en tu comentario indicas que el servidor debe verificar la informacion que se introduce, ¿como la realiza si tengo en una forma 3 dbedit, el primero maneja el campo llave del registro, utilizando adotable, para que no me ocurra un error de duplicidad en la llave del registro al ejecutar el insert ?

por otra parte, ¿solo se puede utilizar adotable.locate para localizar registros?
¿no existe otra funcion, como por ejemplo seek? ya que en delphi 7 me marca error al querer utilizar adotable.findkey? no me acuerdo bien en este momento pero lo ultimo era la palabra key.


Gracias por sus comentarios

Caral
18-07-2007, 17:42:36
Hola
Gracias por los comentarios de apoyo, me hacen sentir que si aporto algo, se que me equivoco, pero, quien no.:)
No logro entender bien lo que busca hacer Temporal, se habla de una llave duplicada, pero tambien de insertar un registro, me parece.
Bueno, si es un asunto de tratar de insertar un registro y hacer la comprobacion de que no este repetido, aqui tienes un pedacito de un codigo de mi programa que hace eso, analizalo, tal vez sea lo que buscas.

procedure TFSelCodigo.BitBtn1Click(Sender: TObject);
begin
If Edit1.Text <> '' then
Begin
AdoQuery1.Parameters[0].Value := Edit1.Text;
AdoQuery1.Active := true;
IF Adoquery1CodParte.AsString = Edit1.Text then
MessageDlg('Código ya existe, favor seleccionar otro',mtError,[mbOK],0)
else Begin
Codigo:= Edit1.text;
Cancelar:=False;
Close;
end;
AdoQuery1.Active := false;
end
else MessageDlg('El código no debe estar en blanco, si desea cancelar presione escape.',mtError,[mbOK],0)
end;
Espero que te sirva aunque sea para aprender algo nuevo.
Saludos

tenporal
19-07-2007, 18:29:03
Saludos a tod@s,
Originalmente escrito por Caral
No logro entender bien lo que busca hacer Temporal, se habla de una llave duplicada, pero tambien de insertar un registro, me parece.
Bueno, si es un asunto de tratar de insertar un registro y hacer la comprobacion de que no este repetido

Hola caral, como indique anteriormente se trata de validar que no se pueda introducir un registro con una clave que ya exista en la b.d., para ser mas especifico, estoy mostrando los datos en campos dbedit, y cuando se de click en el boton agregar, verifique esa condicion.

Anteriormente Roman, comento que se podia dejar que sea el servidor el que se encargue de manejar los campos llave, pero no se como implementarlo, actualmente estoy manejando access, como manejador de b.d.

De antemano, gracias por sus comentarios

saldanaluis
19-07-2007, 20:59:08
Primero que nada una disculpa para nuestro amigo Caral por haber sonado muy negativo.
Lo que pasa es que realmente no sabía como hacer lo que se buscaba y no entendí como se lograba con el código que muy amablemente nos proporcionó Caral. Realmente yo soy el que no es programador y como quiero aprender pues trato de entender el código que me llega a la mano.
Como pueden ver, soy relativamente nuevo e inclusive no creo yo tener buenas respuestas para los compañeros del foro, pero lo que si tengo son muchas preguntas!!!
Espero seguir contando con el favor de sus respuestas.
Luis

Caral
19-07-2007, 21:21:08
Hola saldanaluis
Para nada las disculpas, lo que dije es totalmente cierto, no soy programador y aunque trato de ayudar, muchas, pero muchas veces me equivoco, por eso dije que hacias bien en dudar de mi codigo, que de paso no ha terminado de eliminar las dudas de temporal.
No te preocupes de mas, y en cuanto a ayudarte, con mucho gusto, si esta a mi alcance te haré ver por lo menos algo nuevo, seguro aprenderemos mas todos, aqui hay muchos maestros en esto.
Saludos

kaeltas
31-03-2010, 02:06:12
Hola
Yo lo hago por filtro asi:
Código Delphi [-] (http://www.clubdelphi.com/foros/#)procedure TFBuscaArticulo.Edit1Change(Sender: TObject); var Filtro : String; begin If (Edit1.Text <> '') then begin Adotable1.Filtered := False; Filtro := 'cvemateria Like '''+Edit1.Text + '*''' Adotable1.Filter := Filtro; Adotable1.Filtered := True end else ShowMessage('La clave de la materia no existe') Adotable1.Filtered := False; end;

O tambien por sql, hay muchas formas de hacerlo.
Saludos

Mil Mil Mil Mil Gracias este pedazo de codigo me ayudo muchisisimo, gracias gracias gracias gracias, enserio gracias por esta pagina y gracias a esta comunidad, gracias a todos los que aportan su granito de arena enserio mil gracias.

aqui les pongo un cacho de mi codigo que hice usando esto:

procedure TForm1.Label18Click(Sender: TObject);
var Filtro : String;
begin
Filtro := 'Descripcion=''Short'' and Estilo Like '''+'22mn'+ '*''';
AdoTable1.Filter := Filtro;
Adotable1.Filtered := True;
end;

Como pueden ver, pueden hacer lo que quieran con las sentencias, en mi caso es una BD en mysql y esto me deja filtrar las tablas a placer :P

Gracias!