Ver Mensaje Individual
  #1  
Antiguo 01-07-2011
Perenquen Perenquen is offline
Miembro
 
Registrado: jul 2003
Posts: 27
Reputación: 0
Perenquen Va por buen camino
Recorrer ADOQUery y update.

Buenos a todos. Hace un par de días que empecé a trabajar con MySQL en Delphi y se me plantean un par de dudas.

Estoy intentando recorrer una tabla y modificar otra dependiendo del valor encontrado.

El problema es que el el primer bucle se ejecuta el UPDATE de forma correcta, pero después me da un error: 'Cannot perform this operation on a closed dataset' refiriéndose al ADOQ_Destinos. Está claro que el EXEQSQL desactiva el ADO, pero entonces no se como trabajar con este tipo de procedimiento.

- ¿Debería primero preparar toda la consulta y hacer un único EXECSQL? Pero claro pueden ser muchos registros.
- ¿Debería en vez de cargar toda la tabla, hacer un SELECT a la tabla destinos en cada instancia del bucle?. ¿No sería demasiado lento?

Si alguien tiene alguna idea de como encaminar esta consulta estaría muy agradecido. Recuerdo que esto es nuevo para mi e igual estoy un poco viciado con las tablas planas y tengo que cambiar un poco el chip.

Dejo el código por si sirve de algo,

Código Delphi [-]

var
  ADOQ_DIALPLAN,ADOQ_Prefijos, ADOQ_Destinos : TAdoQuery;
  conexion : string;
  comienzo : TTime;
  filtro : string;
begin
  RELog.Clear;
  conexion := 'DRIVER={MySQL ODBC 5.1 Driver};SERVER=localhost;DATABASE=;USER=Admin;PASSWORD=admin;OPTION=3';
  Informar2(false,RElog,0,0,'Actualizando el Dial Plan','',0);

  ADOQ_DIALPLAN := TADOQuery.Create(nil);
  ADOQ_DIALPLAN.ConnectionString := conexion;
  ADOQ_DIALPLAN.SQL.Text := 'SELECT * FROM V.dialingplan';

  ADOQ_Prefijos := TADOQuery.Create(nil);
  ADOQ_Prefijos.ConnectionString := conexion;
  ADOQ_Prefijos.SQL.Text := 'SELECT * FROM V.prefijos';

  ADOQ_Destinos := TADOQuery.Create(nil);
  ADOQ_Destinos.ConnectionString := conexion;
  ADOQ_Destinos.SQL.Text := 'SELECT * FROM V.destinos';

  ADOQ_DIALPLAN.Open;
  ADOQ_Prefijos.Open;
  ADOQ_Destinos.open;

  ADOQ_DIALPLAN.First;
  filtro := char(39) + 'zz' + char(39);
  while not ADOQ_DIALPLAN.Eof do
    begin
      if not ADOQ_Prefijos.Locate('Prefijo',ADOQ_DIALPLAN.FieldByName('telephone_number').asstring,[]) then
        begin
          filtro := filtro + ',' + char(39) + ADOQ_DIALPLAN.FieldByName('telephone_number').asstring + char(39);
        end
      else
        begin
          if ADOQuery_Destinos.Locate('ID',ADOQ_Prefijos.FieldByName('id_destino').value,[]) then
            begin
              if ADOQ_Destinos.FieldByName('nombre').asstring <> ADOQ_DIALPLAN.FieldByName('nombre').asstring then
                begin
                  ////****////// El problema creo que está en que ExecSQL desactiva la tabla.
                  ADOQ_Destinos.SQL.Text := 'UPDATE voipswitch.dialingplan ' +
                                            'SET nombre = ' +
                                            char(39) + ADOQuery_Destinos.FieldByName('nombre').asstring + char(39) +
                                            ' WHERE telephone_number = ' +
                                            ADOQ_DIALPLAN.FieldByName('telephone_number').asstring;
                  ADOQ_Destinos.ExecSQL;
                  ////****//////
                end;
            end;
        end;
      ADOQ_DIALPLAN.Next;
    end;
  ADOQ_DIALPLAN.SQL.Text := 'DELETE FROM voipswitch.dialingplan WHERE telephone_number IN (' + filtro + ')';
  ADOQ_DIALPLAN.ExecSQL;
end;

Un saludo y gracias de antemano.
Responder Con Cita