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