This is what im doing on C# :
public static decimal ObterSaldoEstoqueEntrarProdutosFamilia(this IRepositorio<SaldoEstoqueProduto> saldoEstoqueRepositorio, string empresaUsuario, Int64 tipoEstoqueUsuario, string filial, string familia)
{
//TODO: Trocar por consulta pelo LINQ quando os objetos de programação estiverem criados no C#
decimal resultado = 0;
try
{
string connString = saldoEstoqueRepositorio.StringConexao();
SqlConnection conexaoSql = new SqlConnection(connString);
StringBuilder queryItens = new StringBuilder();
queryItens.Append("SELECT isnull(SUM(T2.ProTrfQtd - T2.ProTrfCol),0) as Saldo ");
queryItens.Append("FROM EST250 T1 (NOLOCK) ");
queryItens.Append("INNER JOIN EST2501 T2 (NOLOCK) ON T2.EmpCod = T1.EmpCod AND T2.EstTip = T1.EstTip AND T2.ProTrfNum = T1.ProTrfNum AND T2.FilOriCod = T1.FilOriCod AND T2.FilDstCod = T1.FilDstCod ");
queryItens.Append("LEFT JOIN EST2503 T3 (NOLOCK) ON T3.EmpCod = T1.EmpCod AND T3.EstTip = T1.EstTip AND T3.ProTrfNum = T1.ProTrfNum AND T3.FilOriCod = T1.FilOriCod AND T3.FilDstCod = T1.FilDstCod ");
queryItens.Append("LEFT JOIN NTF006 T4 (NOLOCK) ON t4.EmpCod = t3.EmpCod and t4.FisOpe = 'E' and t4.FilCod = t3.FilOriCod and t4.FisEspCod = t3.ProTrfEspC and t4.FisSerCod = t3.ProTrfSerC and t4.FisEntCod = t3.ProTrfFisE and t4.FisCod = t3.ProTrfFisC and t4.NopCod = t3.ProTrfNopC ");
queryItens.Append("LEFT JOIN EST020 T5 (NOLOCK) ON T5.EmpCod = t2.EmpCod and t5.EstTip = t2.EstTip and t5.ProCod = t2.ProCod ");
queryItens.Append("LEFT JOIN EST023 T6 (NOLOCK) ON T6.EmpCod = t2.EmpCod and t5.EstTip = t2.EstTip and t6.ProFamCod = t5.ProFmlCod ");
queryItens.Append("WHERE T1.EmpCod = @EmpCod AND T1.EstTip = @EstTip AND T1.FilDstCod = @FilCod AND");
queryItens.Append(" ( ");
queryItens.Append(" T6.ProFamCod like @ProFamCodLike OR T6.ProFamCod = @ProFamCod ");
queryItens.Append(" ) ");
queryItens.Append("AND T1.ProTrfOdfC = 0 AND T2.ProTrfQtd > T2.ProTrfCol AND ");
queryItens.Append(" ( ");
queryItens.Append(" (T1.ProTrfSta = 1 OR T1.ProTrfSta = 2 OR T1.ProTrfSta = 4 OR T1.ProTrfSta = 7 OR T1.ProTrfSta = 9) ");
queryItens.Append(" OR (T1.ProTrfSta = 6 AND t4.FisSta in (1, 2, 3, 4, 5, 6, 12)) "); //Não considera o saldo a entrar de notas que estão em conclusão pendente, pois esta saldo já está contando no lógico,ou das programações Em recebimento que não possuem nota relacionada
queryItens.Append(" ) ");
conexaoSql.Open();
SqlCommand comando = new SqlCommand(queryItens.ToString(), conexaoSql);
comando.Parameters.AddWithValue("@EmpCod", empresaUsuario);
comando.Parameters.AddWithValue("@EstTip", tipoEstoqueUsuario);
comando.Parameters.AddWithValue("@ProFamCod", familia);
comando.Parameters.AddWithValue("@ProFamCodLike", familia + ".%" );
comando.Parameters.AddWithValue("@FilCod", filial);
resultado = Convert.ToDecimal(comando.ExecuteScalar());
conexaoSql.Close();
}
catch (Exception)
{
}
return resultado;
}
The comando.ExecuteScalar()
takes 4 seconds to execute. But if i get the sql generated and execute on SQL Server with same parameters it takes just 1 second.
Someone know whats can be? There is a way to solve it?