Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Insertar y/o modificar un campo con decimales (https://www.clubdelphi.com/foros/showthread.php?t=46267)

rafita 27-07-2007 13:41:07

Insertar y/o modificar un campo con decimales
 
Hola a todos,

Nuevamente necesito de vosotros para seguir adelante.

Desde hace un tiempo me he acostumbrado a hacer las inserciones/modificacioens en las bases de datos sin utilizar campos permanentes, simplemente monto la sentencia SQL antes de ejecutarla y le añado los campos que se insertan o modifican:

Código:

SqlText:='INSERT INTO Proyectos (Descripcion, Importe) VALUES ('QuotedStr(AnsiUpperCase(Edit2.Text))
+ ', ' + CurrencyEdit1.Text + ')';  // El importe es numérico por eso no va entre comillas
 ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add(SqlText);
try
  ADOQuery1.ExecSQL;
except
  ShowMessage('Error de ejecución en la sentecia SQL'+#13+sqltext);
end;

Realmente me resulta cómodo pero tengo el problema del uso de decimales, por ejemplo, un insert con la sentencia anterior sería:

INSERT INTO Proyectos (Descripcion, Importe) VALUES ('PRUEBA', 125,85)
como podeís ver, la coma decimal del importe me convierte ese importe en dos valores para la sentencia SQL y da error (porque tengo dos campos y tres valores).

¿Alguién me puede dar un consejo?
Muchas gracias anticipadas.

Mick 27-07-2007 14:04:13

Salva algunas casos muy especiales nunca se deben montar las queries de ese modo, siempre siempre hay que usar parametros, por motivos de eficiencia y seguridad.

Saludos

rafita 27-07-2007 14:04:42

Solucionado
 
Era simple pero no se me ocurría, basta con sustituir las comas por puntos en el momento de preparar la sentencia.

Donde ponía CurrencyEdit1, sustituirlo por
StringReplace(CurrencyEdit1.Text, ',', '.', [rfReplaceAll])

Así todo funciona perfectamente.

supongo que habrá algún otro método más ajustado pero el caso es que funcione.

Saludos a todos.

ContraVeneno 27-07-2007 17:01:02

Si hay un método mejor, utilizar parámetros.
Si utilizaras parámetros no tendrías que hacer eso truquitos para guardar decimales. :)

Y tambien podrías ahorrarte la variable SQLText.

Ejemplo:

Código Delphi [-]
With AdoQuery1 do begin
 If Active then Close;
 SQL.Clear;
 SQL.Add('INSERT INTO Proyectos (Descripcion, Importe)');
 SQL.Add('VALUES (:Descripcion, :Importe)');
 Parameters.ParamByName('Descripcion').AsString := Edit2.Text;
 Parameters.paramByName('Importe').AsCurrency := CurrencyEdit1.AsCurrency;
 Try
  ExecSQL;
 Except on E:EDBEngineError do begin
   If E.ErrorCode = 902 then  //902 es solo como ejemplo
     showmessgae('error 902'+' en:'+SQL.Text');
  end; //Except
 end; //Try
end; //with

Gabo 27-07-2007 17:54:49

Cita:

Si hay un método mejor, utilizar parámetros.
Si utilizaras parámetros no tendrías que hacer eso truquitos para guardar decimales. :)

Y tambien podrías ahorrarte la variable SQLText.
Y tanto que es mejor, recuerdo cuando empecé y hacía lo que nuestro amigo... Claro, cuando eran un par de controles valía, pero, ¿y si eran 10 o más?, el enredo que se formaba de concatenaciones (+ " ' ,). Eso es muy lioso y de un golpe de vista dificil de ver cuando lo revisas al tiempo despues...

Por cierto, esto me recuerda este artículo ...

http://www.clubdelphi.com/foros/show...en+programador

rafita 30-07-2007 10:41:28

Muchas gracias a todos por vuestras aportaciones.
Disculpad la tardanza pero este fin de semana ha sido "off line".

Los motivos de montar las sentencias así son dos: primero mi falta de conocimiento, y segundo el que un compañero empezó a hacerlo así.

Inicialmente me definía los campos de forma permanente, pero me complicaba la vida tener que introducir una sentencia sólo para poder definir los campos, aunque tenía sus ventajas como ponerles las propiedades a los campos (título, formato, ... ). Además, mis compañeros no controlaban esta forma y no sabían modificar los que yo creaba, así que lo mejor me acoplé yo a su forma.

Le agradezco a ContraVeneno que haya traducido mi codigo poniendole parámetros. Tomo nota y me pongo a cambiar el código que estoy haciendo.

Y también me tomo nota del artículo. Todo lo que sea aprender me parece bien (aunque me pilla viejo).

Saludos.


La franja horaria es GMT +2. Ahora son las 19:24:52.

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