Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   ADOCommand con parámetros que no los toma (https://www.clubdelphi.com/foros/showthread.php?t=47464)

saldanaluis 29-08-2007 01:04:01

ADOCommand con parámetros que no los toma
 
Amigos del Foro. Heme aqui nuevamente con una duda que espero me puedan ayudar a resolverla.
Resulta que estoy utilizando un componente TADOCommand en donde le especifico la sentencia SQL que contiene 2 parámetros, que al momento de ejecución le defino los valores y mando su ejecución. El problema es que me regresa el siguiente mensaje de error: "No se han especificado valores para algunos de los parámetros requeridos."
La DB es ACCESS y les muestro el comando de SQL a continuación:

Código SQL [-]
DELETE FROM TRANSAC
WHERE COD_ALM = :Almacen AND Cod_Articulo = :Articulo;




y el codigo donde lo mando a ejecutar es el siguiente:

Código Delphi [-]procedure TFrmTransacs.Elimina_Trans_Alm_Art(pAlmacen, pArticulo: String);
begin
ADOCmd.Parameters.ParamByName('Almacen').Value := pAlmacen;
ADOCmd.Parameters.ParamByName('Articulo').Value := pArticulo;
ADOCmd.Execute;
end;



Gracias de antemano por sus amables respuestas.
Luis

egostar 30-08-2007 19:11:12

Y porque no usas un TADOQuery en lugar del TADOCommand, no he usado nunca ADO pero me parecería mas lógico :)

Salud OS.

Caral 30-08-2007 19:21:41

Hola
Yo tambien soy de la opinion de usar adoquery, pero en tal caso el error lo dice todo, o no?:
Cita:

No se han especificado valores para algunos de los parámetros requeridos
Si lo analizas te daras cuenta que al enviar el parametro, le indicas cual es y le colocas el nombre de donde sacar la comparacion, que es ese nombre un edit supongo, si es asi, le falta el .text.
Código Delphi [-]
Código Delphi [-]procedure TFrmTransacs.Elimina_Trans_Alm_Art(pAlmacen, pArticulo: String);
begin
ADOCmd.Parameters.ParamByName('Almacen').Value := pAlmacen.text;
ADOCmd.Parameters.ParamByName('Articulo').Value := pArticulo.text;
ADOCmd.Execute;
end;
Si por el contrario se saca de otra tabla, donde se especifica eso en el codigo.
O si se localiza en una variable, donde esta esta, es general o que, no le veo la relacion?
Saludos

Caral 30-08-2007 19:39:10

Hola
Hago aclaracion en base a lo que me comenta mi amigo Egostar.
Efectivamente en este caso no se usan edit's, es un error de mi parte mencionarlo, me disculpo por esto y le agradezco a mi amigo la intervencion.
Por otro lado, al desconocer el componente se le ocurre a uno que este almacena las variables, si es asi, habrá que declararlas en algun sitio, mencionarlas, no se, supongo que al no encontrar la referencia al parametro es por no encontrar la definicion de la variable, verdad, o tambien me equivoco.
Ultimamente, no doy una, disculpad.
Saludos

Caral 30-08-2007 19:59:25

Hola
Como soy necio y no me gusta dejar las cosas a medias, quiero ver mas cosas:
Ya revise el componente, es casi como un adoquery y contiene los parametros en la pantalla de los mismos, bien:
Para empezar a esta sentencia le falta:
Código Delphi [-]
DELETE FROM TRANSAC
WHERE COD_ALM = :Almacen AND Cod_Articulo = :Articulo;
Delete que?
Es asi:
Código Delphi [-]
DELETE * FROM TRANSAC
WHERE COD_ALM = :Almacen AND Cod_Articulo = :Articulo;
Luego:
Cita:

No se han especificado valores para algunos de los parámetros requeridos
Si creaste los parametros en la pantalla de los mismos, hay que colocarles un valor, este puede ser 0.
Otra cosa, Access, no reconoce los dos puntos en ciertas ocasiones, incluso no los necesita si estos estan en la pantalla.
Bueno, espero que ya no me equivoque.
Saludos

saldanaluis 30-08-2007 20:00:46

Gracias por sus respuestas.
He efectuado pruebas independientes (un nuevo proyecto, una sola forma, el componente ADOConnect, y un ADOQuery, ademas de un boton en done le asigno el valor del parámetro "hard coded"
(ADOQ.Parameters.ParamByName(Articulo).value := 'GFR23';)
pero me sigue saliendo el mismo error.
He buscado por todos lados con Google y aparentemente hay muchos casos similares con la DB ACCESS, pero no he encontrado respuesta.
¡¡¡Por favor ayudenme a encontrarla!!!
Gracias.
Luis

egostar 30-08-2007 20:30:45

Hola saldanaluis

De casualidad estas creando esa sentencia SQL en tiempo de ejecución?

De ser así te convendría crear los parametros antes de asignar los valores,

No tengo a la mano TADOQuery, pero en un TQuery normalito puedes hacerlo de esta manera:

Código Delphi [-]
  Query1.Params.CreateParam(ftString, 'Almacen', ptInput);
  Query1.Params.CreateParam(ftString, 'Cod_Articulo', ptInput);

De tal forma que quedaría algo así::rolleyes:

Código Delphi [-]
 
begin
   ADOQuery.Parameters.CreateParam(ftString, 'Almacen', ptInput);
   ADOQuery.Parameters.CreateParam(ftString, 'Articulo', ptInput);
   ADOQuery.Parameters.ParamByName('Almacen').Value := pAlmacen;
   ADOQuery.Parameters.ParamByName('Articulo').Value := pArticulo;
   ADOQuey.Execute;
end;

Bueno, pues espero que eso ayude, dejanos saber los resultados.:)

Salud OS.

Caral 30-08-2007 20:58:08

Hola
Como no me gusta equivocarme, lo hice y ya.
Aqui esta, hace lo que necesitas, con parámetros y todo::D
Saludos

saldanaluis 31-08-2007 00:14:18

Muchas Gracias Caral.
Realmente fue de gran ayuda. Con lo que me enviaste me di cuenta que estaba poniendo mal el nombre de uno de los parámetros -- :-( -- y ese era el problema.
Realmente confunde el mensaje de error que envía MSACCESS al mencionar los valores de los parámetros, y no comentar nada acerca de que "no existe el nombre de la columna especificada".
Ya se resolvio.
Gracias nuevamente y saludos...
Luis

saldanaluis 31-08-2007 16:49:42

Caral,
Disculpa que te comente esto, no es para reclamarte, pero el comando de SQL no requiere el * en
Código SQL [-]
DELETE * FROM ....
dado que no se pueden borrar solamente algunas columnas sino que se borra todo el registro que concuerda con lo especificado en el WHERE...
Veo que si funciona con el * pero lo correcto es no ponerlo en la sentencia.
Nuevamente disculpa esta corrección, pero realmente es para agradecerte tu apoyo.
Saludos.
Luis

Saiyan 12-09-2007 01:11:35

Cita:

Y porque no usas un TADOQuery en lugar del TADOCommand, no he usado nunca ADO pero me parecería mas lógico :)
En la ayuda de Delphi 7 al menos.. dice q los Querys son para SELECT solamente.. para INSERTs o UPDATEs se recomienda el uso de COMMANDs..

al menos eso es lo que yo lei en mi delphi..

saldanaluis 12-09-2007 17:05:33

Tienes razón. Aunque con ambos funciona. Lo que hay que tomar en cuenta con el TADOQuery es que no se le puede hacer un ".open", sino que se hace un ".execsql"
Saludos...


La franja horaria es GMT +2. Ahora son las 03:07:21.

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