none
Como detener un procedimiento almacenado cuando la tabla esta vacia? RRS feed

  • Pregunta

  • Buenas noches,

    Tengo un metodo que utilizo para obtener el total de compras de mi tabla de compras. Mientras mi tabla tenga registros funciona correctamente, pero si mi tabla se encuentra vacia, me arroja el error de que "Este metodo no se puede utilizar cuando el resultado es NULL". Como podria hacer para validar que sea null y entonces detenerlo o poner un resultado por default?

    Este es mi metodo:

    if(@Operacion=3)
    begin
    SELECT 'RD$' + CONVERT(varchar,CAST(sum(Total)  AS MONEY),1)
    AS TotalCompras FROM Tab_comprasdetalles
    
    END

    Y de esta forma lo invoco dentro de mi aplicacion windows forms c#:

    private void Topcompras()
            {
    
                using (SqlConnection cn = Claseconexion.ObtenerConexion())
                {
    
                    cn.Open();
                    cmd = new SqlCommand("SP_DASHBOARDVENTAS", cn);
                    cmd.CommandType = CommandType.StoredProcedure;
    
                    cmd.Parameters.Add(new SqlParameter("@Operacion", SqlDbType.Int));
                    cmd.Parameters["@Operacion"].Value = 3;
    
                    dr = cmd.ExecuteReader();
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            totalcompras = dr.GetString(0);
                        }
                    }
                    else
                    {
                        totalcompras = "TOTAL";
                    }
                    
                    lbltotalcompras.Text = totalcompras.ToString();
                    dr.Close();
                    cn.Close();
                }
    
            }
    Gracias de antemano,

     

    samuel


    martes, 20 de octubre de 2020 4:49

Respuestas

  • Hola Samuel Ignacio,

    if(@Operacion=3)
    begin
    	if EXISTS (SELECT * FROM Tab_comprasdetalles)
    	begin
    	SELECT 'RD$' + CONVERT(varchar,CAST(sum(Total)  AS MONEY),1) AS TotalCompras FROM Tab_comprasdetalles
    END
    end

    Espero que te sea de ayuda. Por favor no olvides marcar una respuesta si resolviste tu consulta (debajo de cada post hay una opción que dice “Marcar como Respuesta”). Quedo pendiente de cualquier actualización. Gracias por levantar tu consulta en los foros de msdn.

     

    Saludos cordiales

    Gabriel Castro

     ____________________________ 

    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. 


    martes, 20 de octubre de 2020 13:10
    Moderador

Todas las respuestas

  • Hola Samuel Ignacio,

    if(@Operacion=3)
    begin
    	if EXISTS (SELECT * FROM Tab_comprasdetalles)
    	begin
    	SELECT 'RD$' + CONVERT(varchar,CAST(sum(Total)  AS MONEY),1) AS TotalCompras FROM Tab_comprasdetalles
    END
    end

    Espero que te sea de ayuda. Por favor no olvides marcar una respuesta si resolviste tu consulta (debajo de cada post hay una opción que dice “Marcar como Respuesta”). Quedo pendiente de cualquier actualización. Gracias por levantar tu consulta en los foros de msdn.

     

    Saludos cordiales

    Gabriel Castro

     ____________________________ 

    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. 


    martes, 20 de octubre de 2020 13:10
    Moderador
  • Hola Gabriel Castro R,

    No entiendo bien tu código, veo que es para utilizarlo desde SQL.

    Te explicare una vez mas mi problema.

    Mi metodo procedimiento almacenado me retorna la suma de mis compras desde mi tabla de compras, lo casteo como Varchar para poder agregarle el formato de moneda de mi pais (RD$). El procedimiento funcion bien, pues, hace correctamente lo que programe. Estoy probando mi sistema ya que lo termine, estoy haciendo una especie de testing por asi decirlo, le hice un "Truncate table" a todas mis tablas para usarlo desde cero y ver su comportamiento. Justo aqui cuando mis tablas estan vacias, en especifico la de compras, y el procedimiento intenta ejecutarse, me arroja el error de que no puede ejecutarse porque esta recibiendo NULL como retorno de la consulta. Eso es lo que quiero detener, quiero que cuando las tabla este vacia, poder aplicar un valor por default para mostrar al usuario en pantalla, algo como "Total 0", porque al momento que se registre una compra el procedimiento se ejecutara correctamente (ya lo probe). Solo necesito una forma de condicionar el procedimiento para cuando la tabla este vacia.

    Si eso es lo que realiza el codigo que me compartiste mas arriba, realmente no entiendo como lo hace, no entiendo donde poner mi consulta, etc. Podrias ser mas especifico o adaptarlo en base a mi procedimiento que puse mas arriba.


    samuel


    martes, 20 de octubre de 2020 17:27
  • if(!reader.IsDBNull(0))

    { totalcompras = dr.GetString(0);

    }

    martes, 20 de octubre de 2020 17:46
  • Invalid attempt to read when no data is present

    samuel

    martes, 20 de octubre de 2020 18:09
  • Hola Gabriel, 

    Ya determine la respuesta correcta, basandome en tu codigo. Simplemente faltaba agregar el "begin" luego de cada condicion y su respectivo "end".

    Quedaria asi:

    if(@Operacion=3)
    begin
    	if EXISTS (SELECT * FROM Tab_comprasdetalles)
    	begin
    	SELECT 'RD$' + CONVERT(varchar,CAST(sum(Total)  AS MONEY),1) AS TotalCompras FROM Tab_comprasdetalles
    END
    end
    

    Si deseas edita tu respuesta anterior y agrega los  "begin" donde van. Voy a marcarla como respuesta , pero recuerda que debes de editarla por si alguien en un futuro no le suceda el error que me sucedia a mi.

    Gracias por todo 


    samuel

    martes, 20 de octubre de 2020 18:48