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)
-   -   Parametros sql genericos (https://www.clubdelphi.com/foros/showthread.php?t=27019)

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

jachguate 09-11-2005 23:17:07

Mirá si existe ParamByName('xx').Value.

Saludos.

AbcXxx 10-11-2005 00:31:59

lo mas parecido que encontre fue esto
Código:

fbQuery.Params.Values['xxx']:='hola';
pero me arrojo el mismo mensaje de error, 'propiedad de solo lectura'

aunque se me ocurre otra idea, solo necesito saber de que tipo es un determinado campo de una tabla dbf, si puedo obtenerlo creo que podre solucionar esto con un CASE, seguire intentando

muchas gracias jachguate


La franja horaria es GMT +2. Ahora son las 10:28:04.

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