Cita:
Empezado por Casimiro Notevi
Que yo sepa no se puede, ¿en qué casos puedes necesitar hacerlo así?
|
Bueno la razón mas obvia sería cuando se tiene que
insertar muchos registros(no pocos) en una tabla si se lo quiere hacer de una sola vez.
Por ejemplo: Supongamos que tenemos la tabla
> Artículo (ID,Nombre); lo normal para insertar datos es hacerlo asi:
Código SQL
[-]Insert into Artículo values (1,'Arroz');
Insert into Artículo values (2,'Azucar');
Insert into Artículo values (3,'Fideo');
Insert into Artículo values (4,'Frejol');
Insert into Artículo values (5,'Avena');
...
Si nos damos cuenta es un poco tedioso, por tal motivo algunos servidores de Bases de datos (MySQL por ejemplo) soportan las
inserciones masivas, de tal manera que cuando se quiera insertar miles de registro de un golpe, sencillamente se puede utilizar una sintaxis SQL parecida a la siguiente:
Código SQL
[-]Insert into Artículo (ID,Nombre) values(1,'Arroz'),(2,'Azucar'),(3,'Fideo'),(4,'Frejol'),(5,'Avena'),...;
.
Si nos damos cuenta ésto nos permite ahorrar sintaxis y sobre todo evitamos la saturación de estar insertardo uno a uno los registro, es éste caso se insertar todos de una sola vez. desde luego es recomendable utilizar transacciones para hacer las inserciones masivas, ya que cuando se está hablando de muchos registros, puede ocurrir que cuando nuestro servidor esté guardando la insercion ocurra un fallo y tengamos problemas, de ahí que es conveniente usar transacciones, O en todo caso si se tiene que insertar miles de registro, pues
dividir la insercion en bloques por ejemplo de 1000 registros cada una para mayor seguridad.
En lo personal he implementado desde delphi una inserción masiva, para lo cual he encontrado
dos formas de hacerlo; en mi caso yo mando todos los registros a insertar dentro de una lista(un objeto
TObjectList) a una funcion en la que hago es ir creando mi consulta SQL con los elementos de esa lista.
A continuacion describo las dos formas con las que he logrado implememtar con mi funcion en particular:
Primera forma de hacerlo: Creando muchos parámetros en la consulta SQL:
Código Delphi
[-]function TDet_Req_Dinero.InsertarLista(L: TObjectList): Boolean;
var I:Integer;
aux:TDet_Req_Dinero;
Query:TZQuery;
n,p:String;
begin
Result:=True;
if L.Count>0 then Begin
Result:=False;
Query:=TZQuery.Create(nil); try
with Query do
begin
Connection:=DataModule1.ZConnection1; SQL.Add('Insert into Req_Dine(Item,Nro_Req,MontoEnBs,MontoEnSus,Motivo)values '); for I:=0 to L.Count-1 do
begin
aux:=TDet_Req_Dinero(L.Items[i]); n:=IntToStr(I); p:='(:I'+n+',:Nro'+n+',:Bs'+n+',:Sus'+n+',:Moti'+n+')'; if (i=L.Count-1) then SQL.Add(p+';')
else SQL.Add(p+',');
ParamByName('I'+n).AsInteger:=aux.Item;
ParamByName('Nro'+n).AsInteger:=aux.Nro_R;
ParamByName('Bs'+n).AsFloat:=aux.MontoBs;
ParamByName('Sus'+n).AsFloat:=aux.MontoSus;
ParamByName('Moti'+n).AsString:=aux.Motivo;
end;
ExecSQL; Result:=True;
end;
finally
Query.Free;
end;
end;
end;
Segunda forma de hacerlo: Usando la funcion
Format de la unidad SysUtils, en este caso no se crea ningun parámetro en la consulta SQL, sino mas bien se arma la consulta SQL manualmente:
Código Delphi
[-]function TDet_Req_Dinero.InsertarLista2(L: TObjectList): Boolean;
var I:Integer;
aux:TDet_Req_Dinero;
Query:TZQuery;
s:String;
begin
Result:=True;
if L.Count>0 then Begin
Result:=False;
Query:=TZQuery.Create(nil); try
with Query do
begin
Connection:=DataModule1.ZConnection1; DecimalSeparator:='.';
SQL.Add('Insert into Req_Dine(Item,Nro_Req,MontoEnBs,MontoEnSus,Motivo)values '); for I:=0 to L.Count-1 do
begin
aux:=TDet_Req_Dinero(L.Items[i]);
s:=Format('(%d,%d,%f,%f,''%s'')',[aux.Item,aux.Nro_R,aux.MontoBs,aux.MontoSus,aux.Motivo]);
if (i=L.Count-1) then SQL.Add(s+';')
else SQL.Add(s+','); end;
ExecSQL; Result:=True;
end;
finally
Query.Free;
DecimalSeparator:=','; end;
end;
end;
Espero que le sirva como ejemplo al amigo
santiago14.
.
Saludos...