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)
-   -   ERROR index out of bounds (15) (https://www.clubdelphi.com/foros/showthread.php?t=69419)

MikyVato 17-08-2010 04:18:45

ERROR index out of bounds (15)
 
Hola a todos, recurro de nuevo a uds tengo un problema logre conectarme con la DB tanto local como remotamente atravez de un ODBC (uno para cada DB, son 2). Leo los datos de un tabla en particular de forma local y los subo de forma remota en la otra DB, la tabla tiene 24 Campos recupero los datos con un Query de la Paleta BDE pero no me permite subir todo los campo me muestra el error :EListError with message List index out of bounds (15) Alguien me puede ayudar??: :confused::confused:

MikyVato 17-08-2010 05:09:49

comparto el codigo quizas puedan encontrar el hueco.

Primero obtengo los datos usando un Query que se conecta localmente
Código Delphi [-]
 QPrincipal.Active := False; 
 QPrincipal.SQL.Clear; 
 QPrincipal.SQL.Text := 'select * from historico_avl_1008 where ORDER_ID > '''+idlocal+'''';
 QPrincipal.Active := True;

Despues asigno los valores obtenidos a los string
Código Delphi [-]
while (not QPrincipal.Eof) do
  begin
    v1 := QPrincipal.Fields[0].AsString;
    v2 := QPrincipal.Fields[1].AsString;
    v3 := QPrincipal.Fields[2].AsString;
       .    
       .
       .
    v24 := QPrincipal.Fields[23].AsString;

// Hago el Insert Remoto
QInsercion.SQL.Clear;
QInsercion.SQL.Add ('INSERT INTO `TablaRemota`');
QInsercion.SQL.Add ('(Campos de la Tabla');
QInsercion.SQL.Add ('VALUES  ('''+v1+''','''+v2+''','''+v3+'''...'''+v24+'''');
try
  QInsercion.ExecSQL;
except
   LError.Caption := 'No se Subieron Datos!!!';
end;
QPrincipal.Next;
end;

Bueno espero sirva de algo....:D

Al González 17-08-2010 06:02:59

Pues así, de bote pronto, es como si QPrincipal no tuviera más de 15 campos. ¿En qué línea del programa se detiene al aparecer el error?

MikyVato 17-08-2010 06:18:14

El error aparace en la linea v15 := QPrincipal.Fields[14].AsString; realmente no entiendo porque estaba funcionando, intente usando 2 Query supuse que quizas sea un problema de memoria o algo asi pero no igual da el error, pero si coloco hasta 14 items cualquiera sea anda de LUX... Espero su ayuda realmente me esta sacando este problema

Al González 17-08-2010 06:23:18

¿Cambiaste de base de datos o algo así? ¿Seguro que se trata de la misma tabla que cuando funcionaba bien?

¿Por qué no lo haces con una rejilla DBGrid asociada a esa consulta (sin definirle columnas a la rejilla) y miras cuántos campos se muestran realmente?

MikyVato 17-08-2010 06:56:07

segui tu concejo coloque el DBGrid y me estan faltando columnas cuando el Select que estoy arrojando tiene * esto me ha dejado desconcertado totalmente.... comparo el DBGrid directamente con la DB y me están faltando campos en el DBGrid no lo entiendo??????

ElDioni 17-08-2010 08:37:11

He visto que has abierto otro hilo con el mismo tema en conexiones de base de datos, ese seguramente te lo cierren porque no se pueden crear hilos con la misma cuestión.
Yo creo que el error es lo que te comenta AlGonzalez, la tabla a la que estás accediendo no tiene más de 15 fields, te lo digo porque a mi me ha pasado a veces de hacer una copia de la bbdd para no tocar la original, hacerle cambios a la copia y cuando apunto a la original me sale el error porque la original no lleva los campos nuevos.
¿Porque no pruebas con la propiedad fielcount a ver si te sigue dando error en lugar de poner tu el número de fields a mano?

Un salduo.

MikyVato 17-08-2010 15:35:00

En realidad ya he chquedo lo que propones, la Tabla tiene 24 campos pero al hacer el SELECT * solo muestra 15 de esos campos en el BGRID... La verdad estoy que no se que hacer lo único que se me ocurre es que puede ser un problema en el conector ODBC

Caro 17-08-2010 16:30:14

Hola MikyVato, revisa si no tienes campos persistentes (docle click sobre tu Query), si los tienes puede que solo tengas 15 campos ahí y aunque hagas el "Select * From....", al tenerlos como persistentes solo te va a reconocer los que tengas como persistentes.

Y no repitas hilos por favor.

Saluditos

MikyVato 18-08-2010 05:57:16

Solucionado
 
Bueno Bueno ya encontre el Problema estaba utilizando MySQL ODBC 5.1 Drivers para crear los ODBC instale una version anterior la 3.1 y ya se puede leer toda la DB el porque no lo se si alguien se entera me avisa... Les pido disculpas por haber creado dos hilos pero en ocasiones uno pierde la calma por la falta de soluciónes... Bueno ahora a pagar mi deuda dejo el código de lo que estuve armando hasta el momento

Componentes que utilizo:
From - 3 BitBotton - 1 Edit - 1 DBGrid - 3 Query - 1 DataSource - 2 DataBase y algunos Label donde muestro algo de info...

Código Delphi [-]
//Saco el tiempo asignado por defecto en el Timer y lo muestro en Edit
procedure TForm1.FormCreate(Sender: TObject);
var
  aux :integer;
begin
  aux := (Intervalos.Interval) div 1000;
  ETiempo.Text := IntToStr(aux);
end;

//Pregunto si esta seguro que desea salir
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if MessageDlg ('Desea Salir del Sistema?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
     Close;
end;

//Botón replicar copia los datos de modo local y los envía a internet
procedure TForm1.BBReplicarClick(Sender: TObject);
var
  idlocal, v2, v3, v4, v5, v6, v7, v8, v9, v10 :string;
  v11, v12, v13, v14, v15, v16, v17, v18, v19 :string;
  v20, v21, v22, v23, v24 :string;
begin
  //obtengo el ultimo ID da la tabla externa
      QidExterno.Active := False;
      QidExterno.SQL.Clear;
      QidExterno.SQL.Text := 'select * from TablaRemota order by ORDER_ID desc';
      try
        QidExterno.Active := True;
        idlocal := QidExterno.Fields[0].AsString;
      except
        LTiempo.Caption := 'Error para obtener ID ServerWeb!!';
      end;
     
      //obtengo los registros pendientes de subir de la Tabla Local
        QPrincipal.Active := False;
        QPrincipal.SQL.Clear;
        QPrincipal.SQL.Text := 'select * from TablaLocal where ORDER_ID > '+idlocal+'';
        QPrincipal.Active := True;
        //Estos datos son visibles en el DBGrid

        while (not QPrincipal.Eof) do
          begin
            idlocal := QPrincipal.Fields[0].AsString;
            v2 := QPrincipal.Fields[1].AsString;
            v3 := QPrincipal.Fields[2].AsString;
            v4 := QPrincipal.Fields[3].AsString;
            v5 := QPrincipal.Fields[4].AsString;
            v6 := QPrincipal.Fields[5].AsString;
            v7 := QPrincipal.Fields[6].AsString;
            v8 := QPrincipal.Fields[7].AsString;
            v9 := QPrincipal.Fields[8].AsString;
            v10 := QPrincipal.Fields[9].AsString;
            v11 := QPrincipal.Fields[10].AsString;
            v12 := QPrincipal.Fields[11].AsString;
            v13 := QPrincipal.Fields[12].AsString;
            v14 := QPrincipal.Fields[13].AsString;
            v15 := QPrincipal.Fields[14].AsString;
            v16 := QPrincipal.Fields[15].AsString;
            v17 := QPrincipal.Fields[16].AsString;
            v18 := QPrincipal.Fields[17].AsString;
            v19 := QPrincipal.Fields[18].AsString;
            v20 := QPrincipal.Fields[19].AsString;
            v21 := QPrincipal.Fields[20].AsString;
            v22 := QPrincipal.Fields[21].AsString;
            v23 := QPrincipal.Fields[22].AsString;
            v24 := QPrincipal.Fields[23].AsString;
              QInsercion.SQL.Clear;
              QInsercion.SQL.Add ('INSERT INTO `TablaRemota`');
              QInsercion.SQL.Add ('(Campos de una Tabla)');
              QInsercion.SQL.Add ('VALUES ('''+idlocal+''','''+v2+''','''+v3+''',....'''+v24+''',');
            try
              QInsercion.ExecSQL; 
              LTiempo.Caption := ' '+DateToStr (Date)+'  '+TimeToStr (Time)+'';
            except
              LTiempo.Caption := 'No se Subieron Datos!!!';
            end;
              QPrincipal.Next;
          end;
end;

//Evento del Timer que llama al Boton Replicar
procedure TForm1.IntervalosTimer(Sender: TObject);
begin
  BBReplicar.Click;
end;

//Controla que solo pueda ingresar numeros en Edit que modifica Timer
procedure TForm1.ETiempoKeyPress(Sender: TObject; var Key: Char);
begin
   if not (Key in ['0'..'9',#8]) then
     Key :=#0
end;

//Cdo modifico el tiempo del Timer
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if StrToInt (ETiempo.Text) > 5 then
    begin
      Intervalos.Interval := StrToInt(ETiempo.Text) * 1000;
      ShowMessage('Se modifico el tiempo correctamente');
    end
  else
    ShowMessage('Debe Ingresar un valor mayor a 5!!!')
end;

procedure TForm1.ETiempoEnter(Sender: TObject);
begin
  ETiempo.Text := '';
end;


Ahora solo me falta crear un isntalador para la aplicacion que debe crear los ODBC y copiar los archivos necesarios para que la Aplicacion funcione sin la necesidad de que instale Delphi en la maquina que la verdad no tengo idea de como hacerlo pero eso es otro Hilo que ya vendra pronto pronto... por ahora gracias y muchas x su ayuda...

movorack 18-08-2010 15:35:28

no he seguido el hilo, solo leí tu ultimo mensaje... y veo que estás trabajando con ODBC, que no es malo, pero teninendo librerias de acceso directo a MySQL como Zeos creo que podrias planteartelo como alternativa.

saludos y buena por haber compatido tu solución.


La franja horaria es GMT +2. Ahora son las 06:12:19.

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