none
obtener el valor de un parametro de salida en c# RRS feed

  • Debate general

  • hola buenas tardes......estoy trabajando con c#  y trabajo en n Capas, en la capaNegocios estan todos mis metodos, en la capa comunes estan mis datos comunes get y set y la capa de vista pues mis ventanas . la bd es sql server. la pregunta es la sigueinte:

    tengo mi procedimiento almacenado para la inserción es :

    ALTER PROCEDURE [dbo].[spcnIngresaComprobante2]
    @dnIdOficina smallint,
    @dnIdTipoComprobante smallint,
    @ddFechaComprobante date,
    @dnTCOficial decimal(16, 6),
    @dcRefGeneral varchar(100),
    @dvGlosa varchar(200),
    @dnTipoOperacionCmp smallint,
    @dnTipoProceso smallint,
    @dnEstado smallint,
    @dnIdUsuarioCreacion smallint,
    @dnNumeroComprobante int OUTPUT


    AS
    BEGIN 
    ---DECLARE  @dnNumeroComprobante int 
     select @dnNumeroComprobante=isnull(max(dnNumeroComprobante),0)  from CNCOMPROBANTES WHERE dnIdOficina=@dnIdOficina AND dnIdTipoComprobante=@dnIdTipoComprobante
     set @dnNumeroComprobante= @dnNumeroComprobante+1

     print @dnNumeroComprobante
    INSERT INTO [dbo].[CNCOMPROBANTES]
    (
    dnIdOficina,
    dnIdTipoComprobante,
    dnNumeroComprobante,
    ddFechaComprobante,
    dnTCOficial,
    dcRefGeneral,
    dvGlosa,
    dnTipoOperacionCmp,
    dnTipoProceso,
    dnEstado,
    dnNumeroComprobanteReferencia,
    ddFechaCreacion,
    ddHoraCreacion,
    dnIdUsuarioCreacion

    )
         VALUES
    (
    @dnIdOficina,
    @dnIdTipoComprobante,
    @dnNumeroComprobante,
    @ddFechaComprobante,
    @dnTCOficial,
    @dcRefGeneral,
    @dvGlosa,
    @dnTipoOperacionCmp,
    @dnTipoProceso,
    @dnEstado,
    0,
    GETDATE(),
    convert(varchar(8), getdate(), 108),
    @dnIdUsuarioCreacion
    )
    END

    En mi capa de negocios esta mi método de inserción:

    public bool IngresoComprobante(Comunes.clsDEtalleComprobante comprobante) 
             {
                 try
                 {              
                        CapaDatos.StoreProcedure registra = new CapaDatos.StoreProcedure("spcnIngresaComprobante2");      

                                registra.AgregarParametro("@dnIdOficina", comprobante. dnIdOficina);   
                                registra.AgregarParametro("@dnIdTipoComprobante", comprobante.dnIdTipoComprobante);
                            
                              
                             registra.AgregarParametro("@dnNumeroComprobante", comprobante.dnNumeroComprobante, SqlDbType.Int, ParameterDirection.Output);
                                registra.AgregarParametro("@ddFechaComprobante",comprobante. ddFechaComprobante); 
                                registra.AgregarParametro("@dnTCOficial",comprobante.dnTCOficial); 
                                registra.AgregarParametro("@dcRefGeneral",comprobante.dcRefGeneral); 
                                registra.AgregarParametro("@dvGlosa",comprobante.dvGlosa); 
                                registra.AgregarParametro("@dnTipoOperacionCmp",comprobante.dnTipoOperacionCmp); 
                                registra.AgregarParametro("@dnTipoProceso",comprobante.dnTipoProceso); 
                                registra.AgregarParametro("@dnEstado",comprobante.dnEstado);
                                registra.AgregarParametro("@dnIdUsuarioCreacion",comprobante.dnIdUsuarioCreacion);



                   //       if (!registra.EjecutarStoreProcedure(Comunes.Parametros.ConexionCOSAFI()))
                         if (!registra.EjecutarStoreProcedure(@"Data Source=MIKY-PC;Initial Catalog=COSAFI_DES;Integrated Security=True"))
                         throw new Exception("Error al registrar  Comprobante" + registra.Error);
              
                    return true;
                 
                 }
                 catch (Exception ex)
                 {
                     Bitacora.LogInformacion(LogManager.GetCurrentClassLogger(), ex.Message);
                     Mensaje = "Surgio un problema con el ingreso comuniquese con el administrador";
                     return false;
                 }
             }

    y mi  capa comunes tento lo siguiente:

     public class clsComprobantesDetalleDE
        {
            public int dnIdOficina { get; set; }
            public int dnIdTipoComprobante { get; set; }
            public int dnNumeroComprobante { get; set; }
            public DateTime ddFechaComprobante { get; set; }
            public decimal dnTCOficial { get; set; }
            public int dnIdUnidad { get; set; }
            public string dvGlosa { get; set; }
            public int dnTipoOperacionCmp { get; set; }
            public int dnTipoProceso { get; set; }
            public int dnEstado { get; set; }
            public int dnIdUsuarioCreacion { get; set; }
            public string dnNumeroComprobanteReferencia { get; set; }

            public int dnItem { get; set; }
            public string dnIdCuentaContablemal { get; set; }
            public decimal dndebeBs { get; set; }
            public decimal dnhaberBs { get; set; }
            public decimal dnDebeSus { get; set; }
            public decimal dnHaberSus { get; set; }
            public string dcReferencia { get; set; }
            
            public string dcDescripcionCuenta { get; set; }
        }

    y Esta es mi capa Vista:

        private void btnGuardarComp_Click(object sender, RoutedEventArgs e)
               {
                   if (txtTotalDebe.Text == txtTotalHaber.Text)
                   {
                       Comunes.clsDEtalleComprobante comprobantes = new Comunes.clsDEtalleComprobante 
                          {
                              dnIdOficina = ((Comunes.TablaBDlocal)cbxOficinaComp.SelectedItem).ids,                       
                              dnIdTipoComprobante = ((Comunes.TablaBDlocal)cbxTipoComp.SelectedItem).ids,          
                               dnNumeroComprobante = Convert.ToInt32(txtNumCompro.Text),
                          //  txtNumCompro.Text = ("@dnNumeroComprobante").Value.ToString,
                                
                              ddFechaComprobante = Convert.ToDateTime(dtpFecha.Text),                              
                              dnTCOficial = Convert.ToDecimal(txtTipoCambio.Text),                                 
                              dcRefGeneral="SEÑORES CONTABILIDAD",
                              dvGlosa = txtGlosa.Text,                                                             
                              dnTipoOperacionCmp = 1,                                                              
                              dnTipoProceso = 1,                                                                   
                              dnEstado = 1,                                                  
                              dnIdUsuarioCreacion = 1

                          };

                 
     
                     int varNumCompro;                
                     txtNumCompro.Text = Convert.ToString(CapaNegocios.Comprobantes.GetNumCompro());          

                       string numCompor;

                       CapaNegocios.Comprobantes comprobanteNeg1 = new CapaNegocios.Comprobantes();
                       Comunes.clsDEtalleComprobante compr = comprobanteNeg1.GetNumCompro(numCompor);

                       if (compr != null)
                       {
                           txtTipoCambio1.Text = Convert.ToString(compr.dnNumeroComprobante);

                       }
                       else
                       {
                           MessageBox.Show("Error al taer los datos: " + comprobanteNeg1.Mensaje);
                       }

    la verdad me sale error al hacer clik en guardar y no puedo mostrar ese paramentro de salida que es el numero de comprobante....espero me ayuden gracias


    lunes, 4 de diciembre de 2017 21:45

Todas las respuestas

  • Para leer el valor del parámetro de salida, tienes que leerlo DESPUËS de hacer el ExecuteNonQUery (que me imagino que lo tienes metido dentro de la subrutina EjecutarStoreProcedure) y ANTES de cerrar la conexión. Después de cerrarla ya no se puede leer el parámetro.

    Por lo tanto, si tu método EjecutarStoreProcedure abre la conexión, ejecuta el procedimiento y luego cierra la conexión, entonces el parámetro de salida tienes que leerlo dentro de ese método, porque después de cerrar la conexión ya no es accesible.

    En cuanto al otro tema "... me sale error al hacer clik en guardar ...": ¡Prohibido! Nunca digas "me sale error" en los foros. Siempre hay que decir cuál es exactamente el error que sale, copiando el mensaje de la excepción completo, exacto y detallado, y señalando la línea exacta del código en la que ocurre.

    lunes, 4 de diciembre de 2017 22:02
  • Bueno.....

    como debería mostrar el dato output en mi caja de texto numero de Comprobante???                                                                                                                               

               private void btnGuardarComp_Click(object sender, RoutedEventArgs e)
               {
                   if (txtTotalDebe.Text == txtTotalHaber.Text)
                   {
                       Comunes.clsDEtalleComprobante comprobantes = new Comunes.clsDEtalleComprobante 
                          {
                              dnIdOficina = ((Comunes.TablaBDlocal)cbxOficinaComp.SelectedItem).ids,                       
                              dnIdTipoComprobante = ((Comunes.TablaBDlocal)cbxTipoComp.SelectedItem).ids,          
                               dnNumeroComprobante = Convert.ToInt32(txtNumCompro.Text),
                          //  txtNumCompro.Text = ("@dnNumeroComprobante").Value.ToString,

                              ddFechaComprobante = Convert.ToDateTime(dtpFecha.Text),                              
                              dnTCOficial = Convert.ToDecimal(txtTipoCambio.Text),                                 
                              dcRefGeneral="SEÑORES CONTABILIDAD",
                              dvGlosa = txtGlosa.Text,                                                             
                              dnTipoOperacionCmp = 1,                                                              
                              dnTipoProceso = 1,                                                                   
                              dnEstado = 1,                                                  
                              dnIdUsuarioCreacion = 1

                          };



                       //  txtTipoCambio.Text = CapaNegocios.Comprobantes.TipoCambio(1);  

                      // int varNumCompro;                
                      // txtTipoCambio.Text = Convert.ToString(CapaNegocios.Comprobantes.GetNumCompro());          



                       CapaNegocios.Comprobantes empresaNeg = new CapaNegocios.Comprobantes();
                       if (empresaNeg.IngresoComprobante(comprobantes))
                       {
                           MessageBox.Show("Se guardo Correctamente el Empleado");
                          // txtNumCompro.Text = Convert.ToString("@dnNumeroComprobante");
                         //  txtNumCompro.Text =("@dnNumeroComprobante").Value.ToString;

                       }

    lunes, 4 de diciembre de 2017 22:25
  • como debería mostrar el dato output en mi caja de texto numero de Comprobante???     

    Bueno, me pierdo un poco en tu código porque no conozco la estructura entera del programa, pero más o menos a grandes rasgos lo que hay que hacer es esto:

    - En la capa de presentación:

    txtNumCompro.Text = ValorDevueltoPorLaCapaDeNegocio;

    - En la capa de Negocio:

    Llamar a la capa de datos, y el valor devuelto por ésta devolverlo a su vez hacia la capa de presentación.

    - En la capa de datos:

    1) Abrir Conexión.

    2) Llamar al procedimiento almacenado

    3) Leer el parámetro de salida y guardarlo en una variable

    4) Cerrar conexión

    5) Devolver la variable hacia la capa de negocio.

    Es importante el orden de los pasos 2,3,4. Si el paso 3 se hace en otro sitio, no funciona.

    martes, 5 de diciembre de 2017 7:50