Perenquen |
01-07-2011 13:58:57 |
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
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.
|