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)
-   -   Excepción: El proc. o la func. 'Insertar' esperaba el param. @Mi, que no se ha espec. (https://www.clubdelphi.com/foros/showthread.php?t=92753)

javicho_villa 19-01-2018 22:15:56

Excepción: El proc. o la func. 'Insertar' esperaba el param. @Mi, que no se ha espec.
 
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

Código Delphi [-]
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

Solucion
 
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:

Código Delphi [-]

                 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.


La franja horaria es GMT +2. Ahora son las 06:06:17.

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