Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Problema con Modificar Tabla desde Delphi (https://www.clubdelphi.com/foros/showthread.php?t=64688)

Memo6015 14-04-2009 22:54:20

Problema con Modificar Tabla desde Delphi
 
Hola Amigos de clubcdelphi la verdad es que tengo un problema con la modificacion de una tabla en SQL, tengo un programa que modifica la tabla a traves de un procedimiento almacenado llamado ModificaProductos

la tabla que esta en sql contiene los campos
Codigo de tipo entero,
NombreProducto de tipo varchar y
Cantidad de tipo varchar

por ejemplo

Tabla Productos

Codigo NombreProducto Cantidad
1 fierro 20
2 cobre 30
3 acero 20,7

ok, tengo el procedimiento almacenado que se llama modificaproducto, este procedimiento recibe dos parametros que son el codigo del producto y la cantidad, si lo invoco en SQL server asi modificaproducto 1,'45,8' me cambiaria sin problema la cantidad de fierro por 45,8. Pero cuando lo llamo en delphi de sta forma

Código Delphi [-]
                   CodigoProducto:=StrToInt('1');
                   ValorModificadoProducto:=48,5;
                   
                   Query:='SP_MODIFICA_PRODUCTO '
                            + IntToStr(CodigoProducto) + ','
                            + FloatToStr(ValorModificadoProducto);
                     Q_ModificaProducto.SQL.Clear;
                     Q_ModificaProducto.SQL.Add(query);
                     Q_ModificaProducto.ExecSQL;

me arroja un error por que delphi cree que van mas parametros de los que soporta el procedimiento me explico: si

CodigoProducto = 1 y
ValorModificadoProducto = 45,6

SQL cree que delphi manda el procedimiento de esta forma
ModificaProducto 1,45,6 y si se dan cuenta en vez de haber solos dos parametros sql lo toma como si fuesen 3 el numero 45,6 lo toma como dos parametros y no todo junto como un string no se si me entienden, debido a esto no puedo modificar lso productos por que claro sql me reclama el error


amigos alguien me podria ayudar con el procedimiento para cuando vaya un valor con coma se tome asi ModificaProducto 1,'45,8' y no asi
ModificaProducto 1,45,8. Espero que me hayan entendido intente ser lo mas claro y conciso posible

gracias por todo espero sus respuestas
Ojo: la cantidad la declare como varchar y no como real por que todo el trabajo lo hago en el programa y le retorno un string al campo cantidad, al declararlo como real tenia problema con los puntos y las comas y como no quiero cambiar la configuracion regional por que eso no seria justo con otros programas lo hice asi

Neftali [Germán.Estévez] 15-04-2009 09:48:32

Se me ocurre que manualmente modifiques la cadena antes de enviarla, o si te es últil, cambies los parámetros para toda la aplicación.
En mi caso utilizo un procedimiento similar a este:

Código Delphi [-]
begin
  // Comenzamos
  Application.UpdateFormatSettings := True;
  // Asignamos los nuestros
  SysUtils.DecimalSeparator := CHAR_POINT;
  c := SysUtils.DecimalSeparator;
  SysUtils.ThousandSeparator := CHAR_COMMA;
  c := SysUtils.ThousandSeparator;
  // Acabamos
  Application.UpdateFormatSettings := False;

pcicom 15-04-2009 16:15:05

Los STORE PROCEDURES deben de ser invocados con otro METODO


Código Delphi [-]
  with spMODIFICAPRODUCTO do
  begin
       StoredProcName := 'SP_MODIFICAPRODUCTO'; 
       ParamByName('pCodigoProducto').AsString := sCodigo;
       ParamByName('pValorModificado').AsInteger := nValor;
       ExecProc;
  end;

En lugar de usar el componente QUERY debes de usar un componente STOREPROCEDURE..

ContraVeneno 15-04-2009 17:08:01

La recomendación de pcicom me parece es la más adecuada y la que deberías utilizar.

Pero podrías probar:
Código Delphi [-]
Query:='SP_MODIFICA_PRODUCTO '
 + IntToStr(CodigoProducto) + ','
 + QuotedStr(FloatToStr(ValorModificadoProducto));

Insisto, lo que propone pcicom es lo más adecuado.

Memo6015 15-04-2009 18:59:01

amigos disculpenme si los hice perder el tiempo, es que a veces la solucion es tan facil y esta ahi mismo pero uno no se imagina como hasta que me di cuenta de una cosa bueno ojala esto e sirva a otra persona para no estar cambiando la configuracion regional

lo que pasa es que la tabla tiene

Codigo de tipo entero,
NombreProducto de tipo varchar y
Cantidad de tipo varchar

la cantidad es de tipo varchar o sea string entonces lo mas logico es que yo al modificar al tabla con los datos listos para enviar, deberia mandar un dato de tipo string no un real convertido a string, si se fijan en el ejemplo que di, desde delphi puse esto:
Código Delphi [-]
                   CodigoProducto:=StrToInt('1');
                   ValorModificadoProducto:=48,5;
                   
                   Query:='SP_MODIFICA_PRODUCTO '
                            + IntToStr(CodigoProducto) + ','
                            + FloatToStr(ValorModificadoProducto);
                     Q_ModificaProducto.SQL.Clear;
                     Q_ModificaProducto.SQL.Add(query);
                     Q_ModificaProducto.ExecSQL;

como ven estoy transformando el valor de un reala un string pero claro me va a reclamar por que le estoy mandando 3 parametros en vez de dos y como sql separa en sus procedimientos por comas esto no poria ser jamas, bueno la solucion era muy facil solo habia que cambiar el FloatToStr(ValorModificadoProducto); por + Chr(39) + ValorModificadoProducto + Chr(39); con esto el digo al procedimiento que todo lo que este entre Chr(39) quede como string ya que Chr(39) es el codigo ascci de el caracter '

bueno deje el procedimiento asi

Código Delphi [-]
Query:='SP_MODIFICA_PRODUCTO '
                            + IntToStr(CodigoProducto) + ','
                            + Chr(39) + ValorModificadoProducto   + Chr(39);
                     Q_ModificaProducto.SQL.Clear;
                     Q_ModificaProducto.SQL.Add(query);
                     Q_ModificaProducto.ExecSQL;

con eso quedaria asi SP_MODIFICA_PRODUCTO 1,'dsdad' ok
eso seria muchas gracias por la ayuda que me dieron, espeor le sirva a alguien eso

gracias a todos ya resolvi el problema

pcicom 15-04-2009 20:21:31

Al final de cuentas no le veo sentido a que uses store procedures para una modificacion de este tipo ya que lo puedes usar directamente, salvo que tengas mas acciones dentro del STOREPROCEDURE realices mas acciones.

Código SQL [-]

   UPDATE tablaARTICULOS SET valor=Nuevovalor WHERE codigo=xCodigo

que segun tu codigo seria
Código Delphi [-]

CodigoProducto:=StrToInt('1');
                   ValorModificadoProducto:='48,5';
                   
                   Query:='UPDATE tablaARTICULOS SET valor =' +                         + QuotedStr( FloatToStr(ValorModificadoProducto) );
                     Q_ModificaProducto.SQL.Clear;
                     Q_ModificaProducto.SQL.Add(query);
                     Q_ModificaProducto.ExecSQL;

En fin, al final de cuentas siempre se pueden inventar muchos caminos para llegar a ROMA...

Jejeje

SAUDOS..

Memo6015 16-04-2009 01:56:28

hola no sabia que existia el storedprocedure para ejecutar procedimientos de sql es que la verdad es que me manejo de manera bastante pobre en delphi no asi en java que es mi fuerte y como todo es tan diferente en java a como lo es en delphi y de delphi la verdad no he visto hace bastante tiempo, aun tengo instalada la version 6 y que es la que mas me gusta jejeje pero como aca en el trabajo estan haciendo cosas en delphi me sirvio para recordar este lenguaje, bueno agradezco la ayuda, gracias por los consejos

y si tienes mucha razon hay muchos caminos para llegar a roma

jejjejeeje


saludos


La franja horaria es GMT +2. Ahora son las 08:25:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi