Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como Empezar?? (https://www.clubdelphi.com/foros/showthread.php?t=39974)

MikyVato 03-02-2007 17:08:53

Como Empezar??
 
Hola, busco una sugerencia porque la verdad estoy un poco atascado, estoy creando un proyecto donde tengo que buscar dentro de una DB 58 reg. los cuales salen de un objeto memo, y luego mostrarlos en un dbGrid

Se me habia ocurrido leer una linea del MEMO comparar con toda la DB hasta encontrar el Reg, si esta lo agrego a otra tabla y asi hasta llegar al final del memo. Al finalizar muestro la tabla resultado

Mi duda es como hacer la busqueda de la manera mas rápida y eficiente.:rolleyes:

Desde ya gracias x la ayuda :)

ContraVeneno 03-02-2007 17:45:59

Bueno, la parte de hacer la consulta es lo sencillo. Un TADOQuery, una consulta SQL, un DBGrid y listo.

Lo que no me queda claro es la parte de que los datos salen de un memo. ¿Que datos? ¿Cuantos? ¿Un memo?

jhonny 03-02-2007 18:00:10

Bueno, la verdad es que particularmente no entiendo muy bien que es lo que tienes en la BD ni que es lo que tienes en el Memo y mucho menos lo que tienes que comparar, pero a juzgar por lo que pude captar podria decirte que para recorrer el Memo solo basta con hacer lo siguiente:


Código Delphi [-]
var
  i :integer;
begin
  for i := 0 to Memo1.Lines.Count -1 do
  begin
    ShowMessage(Memo1.Lines[i]);
  end;
end;


y luego haces un Query en tiempo de ejecución que consulte en tu BD lo que necesitas...

Si mis habilidades mentalistas, astrologicas, budistas y si toda mi experiencia como yogui me engaño al punto de que lo que te dije no te sirve pa un carajo te agradeceria que nos apliaras un poco mas tu duda.

P.D. Y si otra persona entendio la pregunta a la perfeccion por favor decidme el telefono del templo para poder asistir.:D

MikyVato 03-02-2007 21:32:09

JAJA Disculpen no me supe explicar muy bien, pero no estan tan lejos de lo que busco, el tema es asi:

Tengo un archivo de texto el cual cargo en TMEMO, contiene varios códigos de 8 digitos, los que tengo que buscar en la DB y mas tarde mostrarlos por un DBGRID. La idea del Querry me parece genial pero no se como usarlo muy bien, como uso la info del TMEMO en el Querry???

Gracias y prometo que la proxima ves les envio un curso de astrologia o algo por el estilo........ [:D]

MikyVato 05-02-2007 17:07:34

Bueno ya se como usar el TMEMO, creo también que se como utilizar el TQUERRY lo que no estoy seguro es si el TQUERRY mi filtra todos los registros, pues imaginate, la cosa es así:

Yo tengo un memo con por lo menos 58 Lineas de códigos diferentes los cuales tengo que buscar en la DB, me parece que para esta acción no me es útil el TQUERRY os si??. La dificultad esta (por lo menos para mi) en mostrar estos 58 Registros encontrados en un DBGRID. Tendría que crear una Tabla con los Registros Encontrados??


Desde ya Gracias disculpen la Ignorancia, soy un Novato tratando de superarse

jhonny 05-02-2007 19:31:56

En vista he perdido el dinerito... :D
Y ahora a lo que hemos venido...
...No he probado el siguiente código... pero quizá te sirva y porfa nos comentas como te fue...
En un Boton o al OnCreate o en el evento que abras tu Tquery (Lo llamare Query1 para el ejemplo) podrías hacer lo siguiente:
Código Delphi [-]
Query1.Close;
Query1.Open;
Query1.Filtered := False;
Query1.Filtered := True;
Con esas lineas se dispararía el evento OnFilterRecord del TQuery(Query1)
y en el evento FilterRecord deberías tener el siguiente código...
Código Delphi [-]
Accept := (Memo1.Lines.IndexOf(Quer1.FieldByName('codigo').AsString) <> -1);//Esta linea mostraría los 
               //códigos que hay en la 
              //BD que también estén incluidos en el TMemo.

Nota: Si no te funciona así prueba quitando lo que tengas en la propiedad Filter de el TQuery.

Lepe 05-02-2007 20:41:32

Otra forma, quizás algo bestia.... pero muy rápida de hacer :D
Código Delphi [-]

var filtro : string;
begin
filtro := EmptyStr;
for i:= 0 to memo1.lines.count -1 do
  filtro := filtro + ','+QuotedStr(memo1.lines[i]);
delete(filtro,1,1);

query1.sql.text := 'select * from tabla where campo in ('+ filtro+')';
query1.Open;

Saludos

jhonny 05-02-2007 21:02:41

Cita:

Empezado por Lepe
Otra forma, quizás algo bestia

Bueno, aun no he probado el codigo que puse en mi post anterior pero el metodo de Lepe seguro que funcionara. Al punto que siento que el codigo realmente bestia es el mio :D

ContraVeneno 06-02-2007 16:32:38

Tambien podrías utilizar un TstringList, utilizas su propiedad LoadFromFile para leer el archivo de texto y luego utilizas su propiedad "CommanText" para utilizarlo en tu query.

MikyVato 07-02-2007 20:48:43

Chasco
 
Hola yo de nuevo, no logro hacer que funcione ninguno de los 2 códigos ofrecidos :(............
El Primero logra correr pero detiene el programa y larga un men de Error "raised exception class EDatabaseError with Message 'ADOQuerry.Missing SQL property":confused:

El Segundo no corre, me aparece un error de compilacion en la línea que dice:


Código Delphi [-]
 ADOQuerry.SQL.Text := 'select Codigo,Descripcion from Articulo where Codigo = ('+ filtro')';



Marca el concatenado de la cadena con la variable filtro, el men que larga el compilador dice lo siguiente: "Missing operator orsemicolon".:confused:. La verdad no entendi mucho este código, lo que me dejo desconcertado el le línea que dice:

Código Delphi [-]
 filtro := EmptyStr;


No entiendo bien para que sirve lo que estas haciendo, no pude encontrar en la ayuda lo que quiciste hacer, al parecer asignas un estilo de String puede ser??


Tendre que crear una Tabla y agregar en ella los registros que voy encontrando??? :rolleyes:

jhonny 07-02-2007 21:24:18

El código de Lepe lo que hace es concatenar en una sola variable los datos del memo separados por coma (,) y luego asignar a la propiedad Text del Query dichos valores para que los filtre; ahora bien, vos tenes lo siguiente:

Código Delphi [-]
 
ADOQuerry.SQL.Text := 'select Codigo,Descripcion from Articulo where Codigo = ('+ filtro')';

y debe ser

Código Delphi [-]
 
ADOQuerry.SQL.Text := 'select Codigo,Descripcion from Articulo where Codigo in ('+ filtro')';

Fijate en que estas usando el "=" mientras que en el ejemplo de Lepe esta muy claro que debes usar el "in" para buscar en el conjunto de datos alimentado desde la variable de texto llamada "filtro".

En cuanto a la linea que tienes duda:

Código Delphi [-]
 
filtro := EmptyStr;

Esa es una manera de inicializar la variable.

Espero te sirva de algo la explicacion.

ContraVeneno 07-02-2007 23:55:44

a ver... aquí necesitan ponerse las pilas y abrir bien los ojos. No se me desesperen que esto es lo sencillo, mantenga la cabeza fria y ponga antención a lo que estan escribiendo. :D
Código Delphi [-]
ADOQuerry.SQL.Text := 'select Codigo,Descripcion from Articulo where Codigo in ('+ filtro+')';

En la segunda, según tu excepción, el problam esta en el ADOQuerry... será porque es ADOQuery con una "r", no con dos.

jhonny 08-02-2007 00:01:20

Claro ContraVeneno debe tener razon :D, despues de todo aqui si hay un verdadero mentalista :D

Caral 08-02-2007 00:32:39

Hola
A ver si me entrometo un poquito, por favor corrijanme.
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
   ADOQuery1.Close;
   ADOQuery1.SQL.Text:= 'Select * From TuTabla';
   ADOQuery1.Open;
end;
En un boton:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  ADOQuery1.Filter := 'TuCampo = '+QuotedStr(memo1.lines[0]);
  ADOQuery1.Filtered := True;
end;
Filtra el contenido de la primera linea del memo?
Ahora lo que no me explico es para que se necesita colocar la informacion primero en un memo y luego en el dbgrid y no de una vez?
Sera para darle un vistazo previo?
Saludos

jhonny 08-02-2007 00:43:46

Cita:

Empezado por Caral
Ahora lo que no me explico es para que se necesita colocar la información primero en un memo y luego en el dbgrid y no de una vez?


Al principio me pregunte lo mismo pero me respondí solito... Quizá sea porque alguna persona exporta los códigos desde otra aplicación a txt y es ese txt el que el programa de nuestro compañero MikyVato debe leer y compararlo con la base de datos para guardar algún tipo de trazabilidad en los datos de manera pues que queden coherentes.

Lepe 08-02-2007 02:04:47

El commaText del memo o un stringlist no sirve.

Queremos (según mi código) que la consulta quede así:
Código SQL [-]
select * from tabla where codigo in ('codigo1', 'codigo2', 'codigo3');

Si usamos commatext, quedaría así:
Código SQL [-]
select * from tabla where codigo in (codigo1, codigo2, codigo3);
es decir, falta encerrar cada elemento entre comillas simples. Además commaText tiene el horroroso fallo (creo recordar) de usar tambien el espacio como separador de cadenas, así que al tiempo de recuperar los datos destrozaría el invento con un campo que se llame [Nombre Cliente] y si, uso corchetes ya que Access lo permite así.

Código Delphi [-]
var filtro : string;
begin
filtro := EmptyStr;
for i:= 0 to memo1.lines.count -1 do
  filtro := filtro + ','+QuotedStr(memo1.lines[i]);
delete(filtro,1,1);

query1.sql.text := 'select * from tabla where campo in ('+ filtro+')';
query1.Open;

EmptyStr es una constante, es idéntico a la asignación:
Código Delphi [-]
 filtro := '';
Pero el caso es que me gusta mucho el nombre de esa constante jejeje.

Cita:

El Segundo no corre, me aparece un error de compilacion en la línea que dice:
En el código de jhonny el error es que falta un signo de "+" después de la palabra "filtro" (además del comentado adoquerrrrrry jeje).

Debe decir:
Código Delphi [-]
ADOQuerry.SQL.Text := 'select Codigo,Descripcion from Articulo where Codigo = ('+ filtro+')';

jhonny 08-02-2007 14:55:12

Es gracioso como un codigo sencillo nos haga cometer tantos errorsillos de sintaxis :D:D:D

Cita:

Empezado por Lepe
Debe decir:

Código Delphi [-]
ADOQuerry.SQL.Text := 'select Codigo,Descripcion from Articulo where Codigo = ('+ filtro+')';

Si te fijas bien en el codigo sql que acabas de colocar haz cometido tambien un errorsillo de sintaxis y es que en lugar de "=" debe ir "in" :D, y debe ser asi:
Código Delphi [-]
ADOQuerry.SQL.Text := 'select Codigo,Descripcion from Articulo where Codigo in ('+ filtro+')';

Y bueno aun asi podria seguir un error, en caso de que el ADQuerry en realidad si este mal escrito :D

Lepe 08-02-2007 15:26:30

jhonny es que nuestro[modo EGO=on] nivel de abstracción es muy elevado... eso son nimiedades[/modo EGO=off] :D :D

En serio, este tipo de errores son los que nos vuelven locos, siempre pensamos que son otras cosas de más envergadura.

Saludos

MikyVato 08-02-2007 20:38:38

Vaya, el Error del principio es tipografico pero esta solo en el Foro, tanto el "=" como el Querry, voy a colocar el código tal cual lo tengo en mi Soft (Nada como Copiar y Pegar)

Código Delphi [-]
var
 filtro:string;
 i:integer;
begin
   filtro := EmptyStr;

   if OpenArch.Execute then
     begin
       MArch.Lines.LoadFromFile(OpenArch.FileName);
       MArch.Enabled := False;
     End;
   
   for i:=0 to MArch.Lines.count -1 do
      filtro := filtro +', '+QuotedStr(MArch.lines[i]);
   delete(filtro,1,1);

   DMRomaneo.ADOQArticulos.SQL.Text := 'select Codigo,Descripcion from Articulo where Codigo in ('+ filtro+')';
   DMRomaneo.ADOQArticulos.Open;
end;

Tiene que ir en el MEMO por una cuestion de Control, es como dice jhonny, el TXT es generado por otro porg y debe ser comparado con la DB.

Esto es solo a modo aclarativo ya que los primeros errores mensionados ya estan solucionados, faltaba el signo "+" al final, una vez solucionado mi prog corre pero larga un error de ODBC

"no coinciden los tipos de datos en la Expresion de criterio"

Creo que se refiere a que los campos de la Tabla no coinciden, pero lo he verificado y la verdad coinciden hasta con las letras mayusculas, o es por que los tipos no coinciden integer y otro tipo string??

Prometo prender belas y colgar mi proyecto en este hilo solo tiene que funcionar............

Gracias Totales x la buena Onda

jhonny 08-02-2007 21:01:55

Cita:

Empezado por MikyVato
o es por que los tipos no coinciden integer y otro tipo string??

Tu lo haz dicho ;), en ese caso debes quitar las comillas sencillas del codigo otorgado por Lepe osea que la cosa quedaria asi (Y espero no equivocarme de nuevo en la sintaxis :D):

Código Delphi [-]
for i:=0 to MArch.Lines.count -1 do
      filtro := filtro +', '+MArch.lines[i];
   delete(filtro,1,1);
   DMRomaneo.ADOQArticulos.SQL.Text := 'select Codigo,Descripcion from Articulo where Codigo in ('+ filtro+')';
   DMRomaneo.ADOQArticulos.Open;


La franja horaria es GMT +2. Ahora son las 12:18:01.

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