AbcXxx |
09-11-2005 22:01:55 |
Parametros sql genericos
buen dia
estoy migrando tablas dbf a firebird y no utilizo ninguna utilidad porque quiero filtrar algunos campos y registros originales en el proceso, es por eso que estoy montando una aplicacion que lo haga
utilizo ado para acceder a las dbf y uib para acceder a firebird con delphi 2005
la duda es esta
cuando empece a trabajar con una sola tabla todo funcionaba bien, formaba una sentencia sql 'insert into articulos (a,b,etc...) values (:a,:b,:etc...)' e iba recorriendo la tabla dbf y asignando los valores de los parametros de la siguiente manera
Código:
with fbQuery.Params do begin
ByNameAsString['art_id']:=adoquery1.FieldByName('art_id').AsString;
ByNameAsString['fab_id']:=adoquery1.FieldByName('fab_id').AsString;
ByNameAsSmallint['alm_id']:=ADOQuery1.FieldByName('alm_id').AsInteger;
ByNameAsString['fab_descr']:=ADOQuery1.FieldByName('fab_descr').AsString;
ByNameAsString['art_descr']:=ADOQuery1.FieldByName('art_descr').AsString;
ByNameAsCurrency['art_prec']:=ADOQuery1.FieldByName('art_prec').AsCurrency;
ByNameAsCurrency['art_pp']:=ADOQuery1.FieldByName('art_pp').AsCurrency;
ByNameAsCurrency['art_exist']:=ADOQuery1.FieldByName('art_exist').AsCurrency;
ByNameAsCurrency['art_ucosto']:=ADOQuery1.FieldByName('art_ucosto').AsCurrency;
ByNameAsString['art_nod']:=ADOQuery1.FieldByName('art_nod').AsString;
ByNameAsCurrency['art_costoe']:=ADOQuery1.FieldByName('art_costoe').AsCurrency;
ByNameAsCurrency['art_costop']:=ADOQuery1.FieldByName('art_costop').AsCurrency;
ByNameAsCurrency['art_cospes']:=ADOQuery1.FieldByName('art_cospes').AsCurrency;
ByNameAsString['art_apdesc']:=ADOQuery1.FieldByName('art_apdesc').AsString;
ByNameAsString['art_obser1']:=adoquery1.FieldByName('art_obser1').AsString;
ByNameAsString['art_inter1']:=adoquery1.FieldByName('art_inter1').AsString;
ByNameAsString['art_inter2']:=adoquery1.FieldByName('art_inter2').AsString;
end;
fbTrans.StartTransaction;
ahora lo quiero hacer generico para cualquier tabla que le asigne mediante un stringlist como sigue
Código:
with lista do
begin
Clear;
Add('ARTICUL'); //tabla dbf
Add('ARTICULOS'); //tabla firebird
Add('ART_ID'); //campos a copiar
Add('FAB_ID');
Add('ALM_ID');
Add('FAB_DESCR');
Add('ART_DESCR');
Add('ART_PREC');
Add('ART_PP');
Add('ART_EXIST');
Add('ART_UCOSTO');
Add('ART_NOD');
Add('ART_COSTOE');
Add('ART_COSTOP');
Add('ART_COSPES');
Add('ART_APDESC');
Add('ART_OBSER1');
Add('ART_INTER1');
Add('ART_INTER2');
end;
strSQL:='insert into '+lista[1]+' (';
for i:=2 to lista.Count-1 do
strSQL:=strSQL+lista[i]+', ';
strSQL:=LeftStr(strSQL,Length(strSQL)-2)+') values (:';
for i:=2 to lista.Count-1 do
strSQL:=strSQL+lista[i]+', :';
strSQL:=LeftStr(strSQL,Length(strSQL)-3)+')';
todo muy bien hasta aqui, el problema se presento cuando quise asignarle los valores a los parametros, quise hacer algo como esto
Código:
for i:=2 to lista.Count-1 do
fvUIBQuery1.Params.ByNameAsVariant[lista[i]]:=adoquery1.FieldByName(lista[i]).AsVariant;
que me genera un error
[Error] Migracion.pas(134): E2129 Cannot assign to a read-only property
Alguna idea de como puedo resolver esto?
Mil gracias
|