Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problemas con filtro... (y otros) (https://www.clubdelphi.com/foros/showthread.php?t=6784)

sitrico 21-01-2004 21:32:06

Problemas con filtro... (y otros)
 
Se que la solución es simple, tanto que no la encuentro.

Tengo una aplicación que guarda 2 bases de datos paradox con información del usuario, (El sistema permite realizar consultas de información en textos y permite al usuario poner marcadores a los diferentes temas encontrados).

Inicialmente solo se podía exportar la tabla del usuario a excel, pero a sujerencia (y solicitud de varios usuarios) tengo que incorporar la capacidad de exportar e importar las tablas (para ser intercambiadas por los usuarios).

La exportacion no tiene problemas (aunque me enrede tratando de exportar los datos en formato XLS (Pido mis disculpas a roman por ponerlo a trabajar en un hilo anterior) ) para exportar simplemente copio los archivos al Disco\directiorio de destino.

La importación no es tan simple, ya que tengo que evitar que se repitan los datos ya existentes. Y la cosa se complica más cuando debo importar desde diferentes bases de datos ( estructura origen = estructura destino) por lo que la verificación o búsqueda que realize debe ser creada en tiempo de ejecución.

Esto es más o menos lo que quiero hacer

Código:

// El alias, tablename y demás propiedades de las tablas estan OK
// t := Tabla exportada
// a := Tabla que recibe los datos
        While not t.Eof do
            Begin
            Existe := False;
            Filtro := '';
            // Crear un filtro para el registro
            for i := 0 To t.Fields.Count-1 do
              If t.Fields.Fields[i].DataType in
                  [ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat,
                  ftCurrency, ftDate, ftTime, ftDateTime] Then
                  If t.Fields.Fields[i].DataType = ftString Then
                      filtro := Filtro + t.Fields.Fields[i].FieldName+' = "'+t.Fields.Fields[i].AsString+'" And '
                  Else
                      filtro := Filtro + t.Fields.Fields[i].FieldName+' = '+t.Fields.Fields[i].AsString+' And ';
            // Quitar el ultimo ' and '
            Delete(Filtro,Length(Filtro)-4,5);
            a.Filter := Filtro; // Me genera un error de filtro
            a.First;
            Existe := a.RecordCount > 0; // si no hay no existe
            If Not(existe) Then // si no existe lo creo
              Begin
              a.Insert;
              for i := 0 To a.Fields.Count-1 do
                  If a.Fields.Fields[i].DataType <> ftAutoInc Then
                    a.Fields.Fields[i].Value := t.Fields.Fields[i].Value;
              a.Post;
              End;
            t.Next;
            End;
        t.close;
        a.close;

La tabla tiene datos de varios tipos incluyendo Tdbmemo y un TAutoInc por eso comparo todos los campos uno a uno en lugar de validar la clave (el AutoInc las haría diferentes).

El Filtro que me genera es:

Código:

'Partida = "2106.90.90.90" And Descripcion = "---Los demas" And
Gravamen = "20" And RegimenLegal = "no" And Observaciones =
"B.system fat burner (CIP=393)"'

Me dice que es una expresion de filtro invalida ''' ???

Probe la instrucción SQL en dbExplorer:

Código:

Select *from arancel where
Partida = "2106.90.90.90" And Descripcion = "---Los demas" And
Gravamen = "20" And RegimenLegal = "no" And
Observaciones = "B.system fat burner (CIP=393)"

y funciona perfecto

Nota: No he querido usar la sentencia SQL porque toda la aplicación está basada en TTable (no he usado TQuery) y ma parece que de hacerlo aumentaría bastante el tamaño de la aplicación, por eso las complicaciones ¿insecesarias? de hacerlo con un filtro y una tabla

marcoszorrilla 21-01-2004 21:52:12

Aquí tienes un ejemplo probado y funcionado correctamente:

Código:

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Table1.Filter:='company =''Unisco'' And Addr1 =''PO Box Z-547'' and City = ''Freeport''';
Table1.filtered:=True;
end;

Me da la impresión que en vez de utilizar el apóstrofe doble '' estás utilizando comillas ".

Un Saludo.


La franja horaria es GMT +2. Ahora son las 07:51:25.

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