Ver Mensaje Individual
  #14  
Antiguo 22-07-2013
Avatar de jscubillos5
jscubillos5 jscubillos5 is offline
Miembro
NULL
 
Registrado: jul 2013
Ubicación: Bogotá
Posts: 44
Reputación: 0
jscubillos5 Va por buen camino
Respuesta de la pregunta

Cita:
Empezado por jscubillos5 Ver Mensaje
Siguiendo con la solución de mi problema encontre vía web que solo era cuestión de configurar la propiedad SQLDIALECT pasarla de 1 a 3, y listo, a bueno y en el nombre campo se debe llamar así: Código Delphi [-]NombreCampo:= IBQueryExtraerDatosTablas.FieldList[Index].FieldName;

ya que como lo tenia antes llama es el valor del campo o el valor deñ registro
Hola foro, ya he logrado conseguir que de una base de datos se consulten todas las tablas y pasar los registros de estas tablas a otra base de datos el codigo va así:
Código Delphi [-]
procedure TDataModuleCarga.ExtraerDatos(RutaBaseDatos, ArchivoExcepciones:String); //Creo un método
var NombreTabla, NombreCampo, SentenciaInsertar, ValorCampo, Codigo_Agencia, RutaArchivoSalida: String;
Index: Integer; 
Archivo: TextFile;// Cargo varias variables a usar
begin
  RutaArchivoSalida:= ExtractFilePath(ArchivoExcepciones) + 'Lock.txt'; // Decidi crear un archivo de lock, para saber que inserciones se generan
  IBDatabaseSanGil.DatabaseName:= RutaBaseDatos; //Le asigno la ruta de conexión a una base de datos
  IBQueryObtenerCodigo_Agencia.Open; //Abro una consulta
  Codigo_Agencia:= IBQueryObtenerCodigo_Agencia.fieldbyname('AGENCIA').AsString; //Cargo en una variable el valor de la consulta anterior
  AssignFile(Archivo, RutaArchivoSalida); // Asigno el archivo del lock y la ruta de ubicación del mismo
  Rewrite(Archivo); //Luego lo reescribo si ya existe
  Writeln(Archivo, 'Archivo lock insertaciones'); //Escribo un titulo al archivo
  IBDatabaseSanGil.Open; //Abro la primera consulta para extraer los datos
  try // Lo encierro en un try 
    IBQueryTablas.Open; // Abro la consulta de las tablas
    while not IBQueryTablas.Eof do //Mientras la consulta de las tablas no termine hago
    begin
      NombreCampo:= ''; // Asigno un valor nulo a la variable
      NombreTabla:= Trim(IBQueryTablas.fieldbyname('nombre_tabla').AsString); // Obtengo el nombre de la tabla de la consulta
      IBQueryExtraerDatosTablas.SQL.Text:= 'select * from ' + NombreTabla;
      // Luego cargo los datos de la consulta con la cual voy a extraer todos los campos y datos de la tabla
      IBQueryExtraerDatosTablas.Open; // Abro la consulta
      for Index:= 0 to IBQueryExtraerDatosTablas.FieldCount -1 do // Recorro los campos o nombres de los campos por cada tabla
      begin
        NombreCampo:=NombreCampo + ', ' + IBQueryExtraerDatosTablas.FieldList[Index].FieldName; //Lo asigno a una variable
      end;
      Delete(NombreCampo, 1, 1); 
      //Elimino el primer item de Nombre campo, puesto que es una coma al ejecutar el script arrojara una excepción
      while not IBQueryExtraerDatosTablas.Eof do //Mientras extraer datos no tenga fin hago
      begin
        ValorCampo:= ''; // Al igual que con NombreCampo, inicializo el valor de campo en nulo o vacio
        for Index:= 0 to IBQueryExtraerDatosTablas.FieldCount -1 do
        begin
          ValorCampo:= ValorCampo + ', ' + IBQueryExtraerDatosTablas.FieldList[Index].Text;
          //Al igual que el anterior cargo el valor del campo en una variable string
        end;
        Delete(ValorCampo, 1, 1); //Elimino el primer caracter igual que en el anterior, puesto que es una coma
        if DebeProcesarTabla(ArchivoExcepciones, NombreTabla) then 
        //Valido si la tabla no debe ser procesa, es decir no todas las tablas que estoy recorriendo, deseo insertar los mismos valores
        //El método DebeProcesarTabla es una function retorna verdadero o falso. 
        begin  //Aquí ya realizo el proceso de crear la sentencia de inserción .
          SentenciaInsertar:= 'INSERT INTO ' + NombreTabla + ' ('  + NombreCampo + ', CODIGO_AGENCIA' + ' )' + ' VALUES ' + ' (' + ValorCampo +  ', ' + Codigo_Agencia + ' );'; 
          try
           Writeln(Archivo, SentenciaInsertar); //Escribo la linea en el archivo del lock
           finally
           //CloseFile(Archivo); 
//Comentarie esto por que cada vez que el archivo se iba creando iba generando un error en la proxima vuelta del bucle
           end;
        end
        else
        begin
          SentenciaInsertar:= 'INSERT INTO ' + NombreTabla + ' ('  + NombreCampo + ' )' + ' VALUES ' + ' (' + ValorCampo + ' );';
          try
           Writeln(Archivo, SentenciaInsertar);
           finally
           //CloseFile(Archivo);
           end;
        end;
        IBQueryExtraerDatosTablas.Next; //Para no entrar a un bucle finito
      end;
      IBQueryTablas.Next; //Para no entrar a un bucle finito
    end;
    IBQueryExtraerDatosTablas.Close; //Cierro las consultas
  finally
    CloseFile(Archivo); //Cierro el archivo
    IBDatabaseSanGil.Close; //Cierro la conexión a la base de datos.
  end;
end;

Finalmente seria colocar que por cada inserción se executa una consulta IBQUERY en la base de datos con el SQL.TEXT:= SentenciaInsercion;
Luego se debe ejecutar Consulta.EXEC; y este código deberia ir debajo de cada sentencia de insertar y por encima del archivo del lock, con esto se garantiza que el insert que sea escrito en el lock se haya procesado antes en la base de datos y listo .

Última edición por Casimiro Notevi fecha: 22-07-2013 a las 18:30:36.
Responder Con Cita