Saltar al contenido principal

 none
Salidas y entradas de inventarios(productos de papeleria) RRS feed

  • Pregunta

  • Quiero saber como puedo formular un código para registrar las salidas de inventario y entradas de productos para una papelería, tengo todas mis tablas de productos y categorías con sus respectivos precios, nombre, proveedor y eso.

    alguien me puede ayudar con eso?

    soy nuevo en sql, PERDON

    martes, 19 de noviembre de 2019 14:29

Todas las respuestas

  • Hola Jon Joestar

     

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que para que la comunidad de foros te pueda asesorar mejor, es necesario que nos compartas el form/code que estas desarrollando. Así la comunidad de este foro podrá ayudarte a corregir errores, sugerir mejoras y resolver dudas.

    Te recordamos que esta comunidad no resuelve tareas o proyectos escolares, ni genera códigos a partir de enunciados. Siempre es un gusto poder atender tus dudas.

     

     

    Gracias por usar los foros de MSDN.

     

    Pablo Rubio

     ____

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

     

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

     

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    miércoles, 20 de noviembre de 2019 17:39
    Moderador
  • Hola Jon Joestar:

    Sin obviar lo que te ha dicho Pablo Rubio, aquí te ayudaremos seguro, pero se explicito con lo que tienes y lo que necesitas.

    Si necesitas código Sql, entonces dirige las preguntas explicitas, con el modelo de tablas que tienes, y lo que esperas al foro de Sql

    https://social.technet.microsoft.com/Forums/es-es/home?forum=sqlserveres&filter=alltypes&sort=lastpostdesc

    Lee primero este link Ayudanos a ayudarte

    No tienes porque cumplir todo a rajatabla, pero si tu escenario es bastante cercano a la realidad, tardaremos mucho menos tiempo y con más precisión en resolver tus dudas.

    Suerte

    miércoles, 20 de noviembre de 2019 18:47
  • este es el stored prosedure que hagarre para hacer mi salidas de inventario, me dijo mi profesor de base de datos que me puede servir para hacer lo mio, lo que quiero saber, es como usarlo, y si tengo que hacer otra cosa antes de hacer el procedimiento.

    Create  PROCEDURE [dbo].[SalidasInventario] (
    --Selecciona uno o varios registros de la tabla dbo.Zonas
       @P_Año char(4)=NULL,
       @P_Mes char(2)=null,
       @P_AnoAux char(4),
       @P_MesAux char(4),
       @P_Cartera bit=NULL,
       @P_CarteraAux bit=NULL,
       @P_Abierto bit=null,
       @P_Error varchar(255) output
    ) AS
    DECLARE @L_Retorno INT, @L_Transaccion INT --Variables de trabajo
    SELECT @L_Retorno=0, @L_Transaccion=0 --Inicializa las variables de trabajo
    --Verifica que el mes en el año actual no existe
    IF (EXISTS(SELECT * FROM dbo.CierreMes WHERE (Ano = @P_Ano) AND (Mes = @P_Mes) AND (Cartera = @P_Cartera)))
    BEGIN
       SELECT @L_Retorno = 2, @P_Error = 'El mes actual ya se encuentra cerrado'
       RETURN @L_Retorno --Retorna porque registro ya existe
    END -- IF (EXISTS(...))
    IF (@L_Retorno<>0) RETURN @L_Retorno --Sale del procedimiento porque no cumple las validaciones
    --Las validaciones fueron correctas, se procede con el manejo de la transaccion
    IF (@@TRANCOUNT>0) SET @L_Transaccion=1 --Si hay transacciones iniciadas, guarda 1 en la variable @L_Transaccion
    IF (@L_Transaccion=0) BEGIN TRANSACTION --Inicia transaccion si no hay otra iniciada
     
     BEGIN TRY
     UPDATE dbo.CierreMes set Cartera = @P_Cartera
     WHERE (Ano = @P_Ano) AND (Mes = @P_Mes)
     INSERT INTO dbo.CierreMes (Ano,Mes,Cartera, Inventario_insumos, Inventario_referencias, Tesoreria_cxp, Tesoreria_Bancos, Produccion, Abierto)
     VALUES(@P_AnoAux,@P_MesAux,@P_CarteraAux, 0, 0, 0, 0, 0, @P_Abierto)
    END TRY
    BEGIN CATCH
       SELECT @L_Retorno = 1, @P_Error = ERROR_MESSAGE() --Ocurrio algun error
    END CATCH
    IF (@L_Transaccion=0) BEGIN --Si este procedimiento Inició una transaccion
       IF (@L_Retorno=0) --Si no ha ocurrido error
          COMMIT TRANSACTION --Confirma la transacción
       ELSE --Ocurrio algun error
          ROLLBACK TRANSACTION --Deshace la transacción
    END --IF (@L_Transaccion=0)

    RETURN @L_Retorno --Instrucción de retorno


    • Editado Jon Joestar jueves, 21 de noviembre de 2019 1:38
    jueves, 21 de noviembre de 2019 1:38
  • este es el stored prosedure que hagarre para hacer mi salidas de inventario, me dijo mi profesor de base de datos que me puede servir para hacer lo mio, lo que quiero saber, es como usarlo, y si tengo que hacer otra cosa antes de hacer el procedimiento.

    Create  PROCEDURE [dbo].[SalidasInventario] (
    --Selecciona uno o varios registros de la tabla dbo.Zonas
       @P_Año char(4)=NULL,
       @P_Mes char(2)=null,
       @P_AnoAux char(4),
       @P_MesAux char(4),
       @P_Cartera bit=NULL,
       @P_CarteraAux bit=NULL,
       @P_Abierto bit=null,
       @P_Error varchar(255) output
    ) AS
    DECLARE @L_Retorno INT, @L_Transaccion INT --Variables de trabajo
    SELECT @L_Retorno=0, @L_Transaccion=0 --Inicializa las variables de trabajo
    --Verifica que el mes en el año actual no existe
    IF (EXISTS(SELECT * FROM dbo.CierreMes WHERE (Ano = @P_Ano) AND (Mes = @P_Mes) AND (Cartera = @P_Cartera)))
    BEGIN
       SELECT @L_Retorno = 2, @P_Error = 'El mes actual ya se encuentra cerrado'
       RETURN @L_Retorno --Retorna porque registro ya existe
    END -- IF (EXISTS(...))
    IF (@L_Retorno<>0) RETURN @L_Retorno --Sale del procedimiento porque no cumple las validaciones
    --Las validaciones fueron correctas, se procede con el manejo de la transaccion
    IF (@@TRANCOUNT>0) SET @L_Transaccion=1 --Si hay transacciones iniciadas, guarda 1 en la variable @L_Transaccion
    IF (@L_Transaccion=0) BEGIN TRANSACTION --Inicia transaccion si no hay otra iniciada
     
     BEGIN TRY
     UPDATE dbo.CierreMes set Cartera = @P_Cartera
     WHERE (Ano = @P_Ano) AND (Mes = @P_Mes)
     INSERT INTO dbo.CierreMes (Ano,Mes,Cartera, Inventario_insumos, Inventario_referencias, Tesoreria_cxp, Tesoreria_Bancos, Produccion, Abierto)
     VALUES(@P_AnoAux,@P_MesAux,@P_CarteraAux, 0, 0, 0, 0, 0, @P_Abierto)
    END TRY
    BEGIN CATCH
       SELECT @L_Retorno = 1, @P_Error = ERROR_MESSAGE() --Ocurrio algun error
    END CATCH
    IF (@L_Transaccion=0) BEGIN --Si este procedimiento Inició una transaccion
       IF (@L_Retorno=0) --Si no ha ocurrido error
          COMMIT TRANSACTION --Confirma la transacción
       ELSE --Ocurrio algun error
          ROLLBACK TRANSACTION --Deshace la transacción
    END --IF (@L_Transaccion=0)

    RETURN @L_Retorno --Instrucción de retorno

    jueves, 21 de noviembre de 2019 1:39
  • Hola Jon Joestar:

    Unas pequeñas matizaciones al stored procedure primero. Ya que si utilizas un parámetro de salida, en el cliente, no tienes que recoger una select.

    Create  PROCEDURE [dbo].[SalidasInventario] (
    --Selecciona uno o varios registros de la tabla dbo.Zonas
       @P_Año char(4)=NULL,
       @P_Mes char(2)=null,
       @P_AnoAux char(4),
       @P_MesAux char(4),
       @P_Cartera bit=NULL,
       @P_CarteraAux bit=NULL,
       @P_Abierto bit=null,
       @P_Error varchar(255) output
    ) AS
    DECLARE @L_Retorno INT, @L_Transaccion INT --Variables de trabajo
    SELECT @L_Retorno=0, @L_Transaccion=0 --Inicializa las variables de trabajo
    --Verifica que el mes en el año actual no existe
    IF (EXISTS(SELECT * FROM dbo.CierreMes WHERE (Ano = @P_Ano) AND (Mes = @P_Mes) AND (Cartera = @P_Cartera)))
    BEGIN
    	SET @P_Error = '2';
       RETURN; --Retorna porque registro ya existe
    END -- IF (EXISTS(...))
    
    /* SI LO QUE QUIERES ES QUE OTRA TRANSACCION NO HAGA NADA CON EL 
    CAMBIA EL NIVEL DE AISLAMIENTO
    */
    
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE  
     BEGIN TRY
    	UPDATE dbo.CierreMes set Cartera = @P_Cartera
    	WHERE (Ano = @P_Ano) AND (Mes = @P_Mes);
    
    	INSERT INTO dbo.CierreMes (Ano,Mes,Cartera, Inventario_insumos, Inventario_referencias, Tesoreria_cxp, Tesoreria_Bancos, Produccion, Abierto)
    	VALUES(@P_AnoAux,@P_MesAux,@P_CarteraAux, 0, 0, 0, 0, 0, @P_Abierto);
    
    	SET @P_Error = '0';
    
    	COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
    	/* tambien puedes echarle un ojo a 
    	https://docs.microsoft.com/es-es/sql/t-sql/language-elements/raiserror-transact-sql?view=sql-server-ver15
    	*/
    	if (@@TRANCOUNT > 0)
    		rollback transaction;
    		set @P_Error = cast(ERROR_NUMBER() as varchar(5));
       THROW; -- En el try sql de c# tendrás el error que ha ocurrido.
    
    END CATCH
    
      
    

    En c#

    try
    {
        string PAnual = "2019";
        string PMes = "10";
        string PMesAux = "11";
        string PAnualAux = "2020";
        bool PCartera = false;
        bool PCarteraAux = true;
        bool PAbierto = true;
        string PError = String.Empty;
    
        int resultado;
        /* TU CADENA DE CONEXIÓN */
        string constr = @"Persist Security Info=False;Integrated Security=true;Initial Catalog=foros;Server=ESQUINERO";
        SqlConnection conn = new SqlConnection(constr);
        using (SqlConnection con = new SqlConnection(constr))
        {
            SqlCommand bd = new SqlCommand("[dbo].[SalidasInventario]");
            bd.CommandType = CommandType.StoredProcedure;
            conn.Open();
    
            bd.Parameters.Add("@P_Año", SqlDbType.Char, 4).Value = PAnual;
            bd.Parameters.Add("@P_Mes", SqlDbType.Char, 2).Value = PMes;
            bd.Parameters.Add("@P_AnoAux", SqlDbType.Char, 4).Value = PAnualAux;
            bd.Parameters.Add("@P_MesAux", SqlDbType.Char, 4).Value = PMesAux;
            bd.Parameters.Add("@P_Cartera", SqlDbType.Bit).Value = PAnual;
            bd.Parameters.Add("@P_CarteraAux", SqlDbType.Bit).Value = PMes;
            bd.Parameters.Add("@P_Abierto", SqlDbType.Bit).Value = PAnualAux;
    
            var parameterSalida = new SqlParameter("@P_Error", SqlDbType.VarChar, 255);
            parameterSalida.Value = String.Empty;
            parameterSalida.Direction = ParameterDirection.Output;
    
            bd.Parameters.Add(parameterSalida);
    
            bd.Connection = conn;
            bd.ExecuteNonQuery();
    
            resultado = Convert.ToInt32(bd.Parameters["@P_Error"].Value);
            if (resultado == 2)
                MessageBox.Show("El mes actual ya se encuentra cerrado");
            else MessageBox.Show("Realizado correctamente");
    
        }
    }
    catch (SqlException e)
    {
        MessageBox.Show("Excepcion sql: " + e.Message);
    }
    catch (Exception e)
    {
        MessageBox.Show("Excepcion : " + e.Message);
    }
    

    Puede contener errores, porque no lo he probado, pero la idea puede ser esta.

    Los parámetros que le vas a enviar, los definí en variables, para usarlos, pero tú los recogerás de tu capa cliente.

    Luego defines, la conexión y el comando, demás dentro de un using, así el sistema libera recursos, sin que tengas que realizar nada.

    Defines los parámetros y el tipo que tengan en Sql. los adjuntas y envias.

    Recoges la salida del procedure, en el parametro out.

    Espero te ayude.

    jueves, 21 de noviembre de 2019 6:07
  • puedo crearlo tanto en sql como en c#?


    viernes, 22 de noviembre de 2019 18:01
  • Hola Jon Joestar:

    Para consumir el procedure en SQL 

    DECLARE  @P_Año char(4)='2019';
    DECLARE  @P_Mes char(2)='01';
    DECLARE  @P_AnoAux char(4)='2019';
    DECLARE  @P_MesAux char(4)='02';
    DECLARE  @P_Cartera bit;
    DECLARE  @P_CarteraAux bit;
    DECLARE  @P_Abierto bit;
    DECLARE  @P_Error varchar(255) ;
    
    EXEC DBO.SalidasInventario @P_Año, @P_mes, @P_AnoAux,@P_MesAux,@P_Cartera,@P_CarteraAux,@P_Abierto,@P_Error;
    
    SELECT @P_Error;

    Si lo que quieres, es hacer el créate procedure en C#, simplemente copias el código integro en un string, tal que:

    try
    {
        string code = "aquí el código del procedure";
        /* TU CADENA DE CONEXIÓN */
        string constr = @"Persist Security Info=False;Integrated Security=true;Initial Catalog=foros;Server=ESQUINERO";
        SqlConnection conn = new SqlConnection(constr);
        using (SqlConnection con = new SqlConnection(constr))
        {
            SqlCommand bd = new SqlCommand(code);
            conn.Open();
            bd.Connection = conn;
            bd.ExecuteNonQuery();
    
        }
    }
    catch (SqlException e)
    {
        MessageBox.Show("Excepcion sql: " + e.Message);
    }
    catch (Exception e)
    {
        MessageBox.Show("Excepcion : " + e.Message);
    }

    sábado, 23 de noviembre de 2019 7:48