PDA

Ver la Versión Completa : Excepción: El proc. o la func. 'Insertar' esperaba el param. @Mi, que no se ha espec.


javicho_villa
19-01-2018, 22:15:56
Buenas tardes, Gracias por la atención:
Tengo un problema al usar un procedimiento almacenado, uso la versión delphi XE8 con SQL 2012, uso los componentes ADO.
He revisado todo pero no encuentro el error al comienzo me salia un mensaje 'Tparameters', leyendo el foro encontré Parameter.ParseSQL pero no entiendo bien el uso de este, despues puse solamente un parameter.Refresh despues de definir los parametros y me sale este mensaje "Excepción: El procedimiento o la función 'ProductoInsertar' esperaba el parametro @MiMensaje, que no se ha especificado.".

También he revisado el procedimiento almacenado en SQL pero lo he ejecutado desde el mismo sql y funciona correctamente, también pense que estaba mal planteado el uso del Try // Except // Finally pero no estoy seguro que sea eso, pero todo apunta a que es la definición de los parametros.

Por favor les pido me den alguna luz para poder resolver este problema, muchas gracias nuevamente


procedure TProductoDatoForm.AceptarClick(Sender: TObject);
var CadLimpio,MiMsj,MiMsjBD:String;
MyClass: TComponent;
t,i:integer;
begin
MiMsj := self.Consistencia;
MiMsjBD := '';
CadLimpio := Trim(Copy(UpperCase(self.TipoComboBox.Text),1,50));
if length(MiMsj)>0 then Application.MessageBox(PChar(MiMsj),'Error de ingreso de información ...',Mb_ok+mb_IconExclamation)
else begin
MyClass := TComponent.Create(Self);
if ledita=false then
begin
try
try
with Datos.DatosDM.PrincipalADOStoredProc do
begin
Close;
Parameters.Clear;
//Parameters.ParseSQL(TRUE);
ProcedureName := 'ProductoInsertar';
Parameters.CreateParameter('@Nombre',ftString,pdInput,100,0); //1
Parameters.CreateParameter('@Titulo',ftString,pdInput,50,0); //2
Parameters.CreateParameter('@TituloPT',ftString,pdInput,50,0); //3
Parameters.CreateParameter('@Circular',ftBoolean,pdInput,0,0); //4
Parameters.CreateParameter('@Costo',ftFloat,pdInput,0,0); //5
Parameters.CreateParameter('@Precio',ftFloat,pdInput,0,0); //6
Parameters.CreateParameter('@TipoProducto',ftString,pdInput,50,0); //7
Parameters.CreateParameter('@Id_Parametro_TipoProducto',ftInteger,pdInput,0,0); //8
Parameters.CreateParameter('@Id_Parametro_UnidadMedida',ftInteger,pdInput,0,0); //9
Parameters.CreateParameter('@Id_Parametro_Fibra',ftInteger,pdInput,0,0); //10
Parameters.CreateParameter('@Id_Parametro_Hilatura',ftInteger,pdInput,0,0); //11
Parameters.CreateParameter('@Id_Parametro_Color',ftInteger,pdInput,0,0); //12
Parameters.CreateParameter('@Id_Parametro_Torsion',ftInteger,pdInput,0,0); //13
Parameters.CreateParameter('@Id_Parametro_Procedencia',ftInteger,pdInput,0,0); //14
Parameters.CreateParameter('@Id_Parametro_Familia',ftInteger,pdInput,0,0); //15
Parameters.CreateParameter('@Id_Parametro_Diseno',ftInteger,pdInput,0,0); //16
Parameters.CreateParameter('@Id_Parametro_Talla',ftInteger,pdInput,0,0); //17
Parameters.CreateParameter('@Id_Parametro_Acabado',ftInteger,pdInput,0,0); //18
Parameters.CreateParameter('@MiMensaje',ftString,pdOutput,100,0); //19
Parameters.Refresh;
///--- Valor de los Parametros ----///
Parameters.ParamByName('@Nombre').Value := self.NombreEdit.Text; //1
Parameters.ParamByName('@Costo').Value := StrToFloat(self.CostoEdit.Text); //2
Parameters.ParamByName('@Precio').Value := StrToFloat(self.PrecioEdit.Text); //3
Parameters.ParamByName('@TipoProducto').Value := CadLimpio; //4
Parameters.ParamByName('@Id_Parametro_TipoProducto').Value := StrToInt(Trim(Copy(UpperCase(self.TipoComboBox.Text),58,length(self.TipoComboBox.Text)))); //5
Parameters.ParamByName('@Id_Parametro_UnidadMedida').Value := StrToInt(Trim(Copy(UpperCase(self.UMedidaComboBox.Text),58,length(self.UMedidaComboBox.Text)))); //6

if UpperCase(CadLimpio)='MATERIA PRIMA' then
begin
Parameters.ParamByName('@Titulo').Value := self.TituloEdit.Text; //7
Parameters.ParamByName('@Id_Parametro_Fibra').Value := StrToInt(Trim(Copy(UpperCase(self.FibraComboBox.Text),58,length(self.FibraComboBox.Text)))); //8
Parameters.ParamByName('@Id_Parametro_Hilatura').Value := StrToInt(Trim(Copy(UpperCase(self.HilaturaComboBox.Text),58,length(self.HilaturaComboBox.Text)))); //9
Parameters.ParamByName('@Id_Parametro_Color').Value := StrToInt(Trim(Copy(UpperCase(self.ColorComboBox.Text),58,length(self.ColorComboBox.Text)))); //10
Parameters.ParamByName('@Id_Parametro_Torsion').Value := StrToInt(Trim(Copy(UpperCase(self.TorsionComboBox.Text),58,length(self.TorsionComboBox.Text)))); //11
Parameters.ParamByName('@Id_Parametro_Procedencia').Value := StrToInt(Trim(Copy(UpperCase(self.ProcedenciaComboBox.Text),58,length(self.ProcedenciaComboBox.Text) ))); //12
///--- Demas valores de Producto Terminado por defecto ----///
Parameters.ParamByName('@TituloPT').Value := ''; //13
Parameters.ParamByName('@Id_Parametro_Familia').Value := 0; //14
Parameters.ParamByName('@Id_Parametro_Diseno').Value := 0; //15
Parameters.ParamByName('@Id_Parametro_Acabado').Value := 0; //16
Parameters.ParamByName('@Id_Parametro_Talla').Value := 0; //17
Parameters.ParamByName('@Circular').Value := 0; //18
end
else if UpperCase(CadLimpio)='PRODUCTO TERMINADO' then
begin
Parameters.ParamByName('@TituloPT').Value := self.TituloPTEdit.Text;
Parameters.ParamByName('@Id_Parametro_Familia').Value := StrToInt(Trim(Copy(UpperCase(self.FamiliaComboBox.Text),58,length(self.FamiliaComboBox.Text))));
Parameters.ParamByName('@Id_Parametro_Diseno').Value := StrToInt(Trim(Copy(UpperCase(self.DiseñoComboBox.Text),58,length(self.DiseñoComboBox.Text))));
Parameters.ParamByName('@Id_Parametro_Acabado').Value := StrToInt(Trim(Copy(UpperCase(self.AcabadoComboBox.Text),58,length(self.AcabadoComboBox.Text))));
if self.CircularRadioButton.Checked then Parameters.ParamByName('@Id_Parametro_Talla').Value := 0
else Parameters.ParamByName('@Id_Parametro_Talla').Value := StrToInt(Trim(Copy(UpperCase(self.TallaComboBox.Text),58,length(self.TallaComboBox.Text))));
Parameters.ParamByName('@Circular').Value := self.CircularRadioButton.Checked;
///--- Demas valores de Materia Prima por defecto ----///
Parameters.ParamByName('@Titulo').Value := '';
Parameters.ParamByName('@Id_Parametro_Fibra').Value := 0;
Parameters.ParamByName('@Id_Parametro_Hilatura').Value := 0;
Parameters.ParamByName('@Id_Parametro_Color').Value := 0;
Parameters.ParamByName('@Id_Parametro_Torsion').Value := 0;
Parameters.ParamByName('@Id_Parametro_Procedencia').Value := 0;
end;
lacepta := true;
end;
Datos.DatosDM.PrincipalADOStoredProc.Prepared := true;
Datos.DatosDM.PrincipalADOStoredProc.ExecProc;
finally
if not VarIsNull(Datos.DatosDM.PrincipalADOStoredProc.Parameters.ParamByName('@MiMensaje').Value) then
begin
MiMsjBD := Datos.DatosDM.PrincipalADOStoredProc.Parameters.ParamByName('@MiMensaje').Value;
end;
MyClass.Free;
end;

Except
ON Error: Exception DO ShowMessage ('Excepción: '+Error.Message);
end;

end
if length(MiMsjBD)>0 then Application.MessageBox(PChar(MiMsjBD),'Error de ingreso de información ...',Mb_ok+mb_IconExclamation)
else if lacepta then close;

end;

javicho_villa
19-01-2018, 23:05:49
El problema se centra en el parametro de salida @MiMensaje, pero no se que mas hacer, mil disculpas por colocar un código tan extenso.
nuevamente gracias por la atención prestada.

javicho_villa
20-01-2018, 00:27:51
Gracias de antemano por leer este item.
La solución era super sencilla, a pesar de que es un parametro de salida, siempre se le tiene que asignar un valor, la verdad me he leido tantos hilos en este foro y en internet tantas paginas que ya me estaba desesperando, el código, la linea de solución es:



with Datos.DatosDM.PrincipalADOStoredProc do
begin
Close;
Parameters.Clear;
Parameters.ParseSQL('ProductoInsertar',TRUE);
ProcedureName := 'ProductoInsertar';
Parameters.CreateParameter('@Nombre',ftString,pdInput,100,0); //1
.......
Parameters.CreateParameter('@Id_Parametro_Acabado',ftInteger,pdInput,0,0); //18
Parameters.CreateParameter('@MiMensaje',ftString,pdOutput,100,0); //19
Parameters.Refresh;
///--- Valor de los Parametros ----///
Parameters.ParamByName('@MiMensaje').Value := '';
Parameters.ParamByName('@Nombre').Value := self.NombreEdit.Text; //1
Parameters.ParamByName('@Costo').Value := StrToFloat(self.CostoEdit.Text); //2


También el refresh, me ayudo bastante, les recomiendo usarlo.

Gracias nuevamente, si alguien sabe usar el Parameter.ParseSql por fa, explíquenme por favor para que sirve que me he quedado con la duda.

Saludos.