SELECT INATIVOS
Rogério,
Quando você coloca:
Você não está buscando o intervalo de -10 dias e sim uma única data que seria a data menos 10 dias anteriores. No meu ver, se vc fizer o seu SELECT hoje o mesmo esta fazendo isso:
é realmente isso que você quer? Porque isso não está em um intervalo de 10 dias.
Se a query está lenta, é porque existe um gargalo na consulta e isso terá que ser tratado. Para vc descobrir rapidamente onde esta o gargalo, execute o Execution Plain, veja o exemplo em anexo.
Quando você coloca:
AND H1.DT_RECEBIDO < GETDATE() -10
Você não está buscando o intervalo de -10 dias e sim uma única data que seria a data menos 10 dias anteriores. No meu ver, se vc fizer o seu SELECT hoje o mesmo esta fazendo isso:
AND H1.DT_RECEBIDO < 2014-07-01
é realmente isso que você quer? Porque isso não está em um intervalo de 10 dias.
Se a query está lenta, é porque existe um gargalo na consulta e isso terá que ser tratado. Para vc descobrir rapidamente onde esta o gargalo, execute o Execution Plain, veja o exemplo em anexo.
Esqueci de postar,
Para acabar com o problema de aspas na sua consulta, comece a utilizar o StringBuilder, é mais prático e também acho que deixa o código mais limpo. E também facilita na hora de passar parâmetros. Segue exemplo abaixo:
Obs.: O StringBuilder vai concatenar a string, então tome cuidado com os espaços entre as linhas, pois se não houver vai ficar tudo junto.
Para acabar com o problema de aspas na sua consulta, comece a utilizar o StringBuilder, é mais prático e também acho que deixa o código mais limpo. E também facilita na hora de passar parâmetros. Segue exemplo abaixo:
System.Text.StringBuilder sb = new System.Text.StringBuilder
string _DataCombo = ComboBox.SelectedValue;
sb.Append([Ô]SELECT DISTINCT CEN.ID_CENTRAL AS Conta, CEN.RAZAO, H1.CD_EVENTO AS Evento,[Ô]);
sb.Append([Ô]CAST(H1.DT_RECEBIDO AS SMALLDATETIME) AS Data[Ô]);
sb.Append([Ô] FROM HISTORICO_ARME AS H1[Ô]);
sb.Append([Ô] INNER JOIN (SELECT CD_CLIENTE, MAX(CD_HISTORICO_ARME) AS COD[Ô]);
sb.Append([Ô] FROM HISTORICO_ARME [Ô]);
sb.Append([Ô] GROUP BY CD_CLIENTE) AS H2 ON H1.CD_HISTORICO_ARME = COD[Ô]);
sb.Append([Ô] INNER JOIN dbCENTRAL AS CEN ON CEN.CD_CLIENTE = H1.CD_CLIENTE[Ô]);
sb.Append([Ô] WHERE CEN.FG_ATIVO = [ô]1[ô][Ô]);
sb.Append([Ô] AND H1.DT_RECEBIDO BETWEEN DATEADD(DAY,[Ô]);
sb.Append(_DataCombo);
sb.Append([Ô], GETDATE()) AND GETDATE()[Ô]);
sb.Append([Ô] ORDER BY CAST(H1.DT_RECEBIDO AS SMALLDATETIME) DESC[Ô]);
Obs.: O StringBuilder vai concatenar a string, então tome cuidado com os espaços entre as linhas, pois se não houver vai ficar tudo junto.
Opa, Valeu Rodrigo!
Vou testar. Sobre a consulta é isso mesmo que eu quero quero saber, quais os clientes não tem evento nos últimos 10 dias e depois poder escolher no combo nos últimos 30 ou 60. O que estou fazendo é um painel para mostrar os clientes [Ô]Inativos[Ô] ou seja, se não tem eventos nos últimos 10 dias está inativo.
Estaria correto o
Vou pesquisar sobre o stringBuilder.
Obrigado!
Vou testar. Sobre a consulta é isso mesmo que eu quero quero saber, quais os clientes não tem evento nos últimos 10 dias e depois poder escolher no combo nos últimos 30 ou 60. O que estou fazendo é um painel para mostrar os clientes [Ô]Inativos[Ô] ou seja, se não tem eventos nos últimos 10 dias está inativo.
Estaria correto o
WHERE H1.DT_RECEBIDO < GETDATE() -10
?Vou pesquisar sobre o stringBuilder.
Obrigado!
Rogério,
O correto mesmo é utilizar o Between mesmo, pois desse modo que vc esta fazendo, vc não está pegando os últimos 10 dias e sim tudo da tabela a partir de 10 dias anteriores.
O correto mesmo é utilizar o Between mesmo, pois desse modo que vc esta fazendo, vc não está pegando os últimos 10 dias e sim tudo da tabela a partir de 10 dias anteriores.
caro ROGERIOAZEVEDO, conforme mencionei você pode estar fazendo a tratativa por parâmetros conforme abaixo!
Coloque em um form os seguintes objetos:
- Listbox - lstClientes
- Button - btnCarregar
- ComboBox - cboDias
- TextBox - txtEvento
Importe para o form namespace abaixo
using System.Data.SqlClient;
No evento Click do botão coloque o seguinte código
No textoBox digitar o evento que esta tentando localizar.
No combobox colocar as quantidades de dias com o sinal de negativo na frente. prefiro que especifique o LABEL e deixe sem o sinal
Fonte: http://www.macoratti.net/09/07/c_adn_7.htm
Coloque em um form os seguintes objetos:
- Listbox - lstClientes
- Button - btnCarregar
- ComboBox - cboDias
- TextBox - txtEvento
Importe para o form namespace abaixo
using System.Data.SqlClient;
No evento Click do botão coloque o seguinte código
private void btnCarregar_Click(object sender, EventArgs e)
{
//Verifica se foi selecionada a quantidade de dias para subtrair
if (cboDias.SelectedIndex == -1)
{
MessageBox.Show([Ô]Selecione quantos dias deve ser subtraido.[Ô]);
return;
}
//limpa o controle ListBox
lstClientes.Items.Clear();
//define os objetos connection e datareader
SqlConnection conn = null;
SqlDataReader reader = null ;
try
{
//instancia e abre uma conexão
conn = new SqlConnection(@[Ô]Server=.\SQLEXPRESS;DataBase=SeuBanco;Integrated Security=SSPI;User Id=SA;Password=SuaSenha;[Ô]);
conn.Open();
// 1. instrução SQL com parâmetros
string vSQL = @[Ô]
SELECT id_Cliente,Nome,Evento,Data
FROM TABELA
WHERE UPPER(EVENTO) = @EVENTO
AND DATA BETWEEN @DTINICAIL AND @DTFINAL
GROUP BY id_Cliente,Nome,Evento,Data
[Ô];
// 2. declara o objeto command com parâmetro
SqlCommand cmd = new SqlCommand(vSQL, conn);
// 3. declara as variáveis para passagem de parâmetros
int dias = Convert.ToInt32(cboDias.Text.Replace([Ô]-[Ô], [Ô][Ô]).Trim());
DateTime dtinicial = DateTime.Now - dias;
DateTime dtfinal = DateTime.Now;
// 4. define os parêmetros usados no objeto command
cmd.Parameters.Add(new SqlParameter([Ô]@EVENTO[Ô], txtEvento.Text.ToUpper()));
cmd.Parameters.Add(new SqlParameter([Ô]@DTINICAIL[Ô], dtinicial));
cmd.Parameters.Add(new SqlParameter([Ô]@DTFINAL[Ô], dtfinal));
// obtem os dados
reader = cmd.ExecuteReader();
// exibe no listbox os dados para o codigo do cliente, empresa e nome do contato
while (reader.Read())
{
lstClientes.Items.Add(reader[[Ô]id_Cliente[Ô]].ToString() + [Ô]-[Ô] + reader[[Ô]Nome[Ô]] + [Ô] (Evento: [Ô] + reader[[Ô]Evento[Ô]] + [Ô] - Data: [Ô] + reader[[Ô]Data[Ô]].ToString() + [Ô])[Ô]);
}
}
catch (Exception ex)
{
MessageBox.Show([Ô]Erro : [Ô] + ex.Message);
}
finally
{
// fecha o leitor
if (reader != null)
{
reader.Close();
}
// fecha a conexão
if (conn != null)
{
conn.Close();
}
}
}
No textoBox digitar o evento que esta tentando localizar.
No combobox colocar as quantidades de dias com o sinal de negativo na frente. prefiro que especifique o LABEL e deixe sem o sinal
Fonte: http://www.macoratti.net/09/07/c_adn_7.htm
Boa noite!
Pegando a sua ideia Filman quase consegui o que eu preciso, mas funciona apenas com o SelectedIndex ainda não consegui fazer com o texto do Combobox.
Fiz da seguinte forma:
SQL
Tentei como faço com outros parametros SQL mas deu erro
Conversion failed when converting date and/or time from character string.
Pegando a sua ideia Filman quase consegui o que eu preciso, mas funciona apenas com o SelectedIndex ainda não consegui fazer com o texto do Combobox.
Fiz da seguinte forma:
private void Carregar()
{
try
{
using (SqlCommand Cmd01 = new SqlCommand())
{
Cmd01.CommandTimeout = 0;
if (rbArme.Checked)
{
Cmd01.CommandText = Classes.Querrys.Cli_Inat;
Cmd01.Parameters.Add(new SqlParameter([Ô]@data[Ô], cbxData.SelectedIndex));
}
else
{
Cmd01.CommandText = Classes.Querrys.Cli_Inat2;
Cmd01.Parameters.Add(new SqlParameter([Ô]@data[Ô], cbxData.SelectedIndex));
}
//Exibe os dados no Chart
DataView Dados = new DataView(Classes.Conexao.GetBuscaSigma(Cmd01));
dgvInativos.DataSource = Dados;
SQL
SELECT DISTINCT CEN.ID_CENTRAL AS Conta,
CEN.PARTICAO AS Part, H1.CD_EVENTO AS Evento,
CAST(H1.DT_RECEBIDO AS SMALLDATETIME) AS Data,
CEN.RAZAO AS Razão
FROM HISTORICO_ARME AS H1
INNER JOIN (SELECT CD_CLIENTE, MAX(CD_HISTORICO_ARME) AS COD
FROM HISTORICO_ARME
GROUP BY CD_CLIENTE) AS H2 ON H1.CD_HISTORICO_ARME = COD
INNER JOIN dbCENTRAL AS CEN ON CEN.CD_CLIENTE = H1.CD_CLIENTE
WHERE CEN.FG_ATIVO = [ô]1[ô]
AND H1.DT_RECEBIDO < GETDATE() -@data
ORDER BY CAST(H1.DT_RECEBIDO AS SMALLDATETIME) DESC
Tentei como faço com outros parametros SQL mas deu erro
Cmd01.Parameters.Add(new SqlParameter([Ô]@data[Ô], cbxData.Text.ToString()));
Conversion failed when converting date and/or time from character string.
Consegui usando o seguinte...
Agora o resultado esperado é mostrado, no entanto na primeira vez que abre da esse erro:
A cadeia de caracteres de entrada não estava em um formato incorreto.
---------------------------
OK
---------------------------
Depois que dou OK fica de boa.
Cmd01.Parameters.Add(new SqlParameter([Ô]@data[Ô], Convert.ToInt32(cbxData.Text.ToString())));
Agora o resultado esperado é mostrado, no entanto na primeira vez que abre da esse erro:
A cadeia de caracteres de entrada não estava em um formato incorreto.
---------------------------
OK
---------------------------
Depois que dou OK fica de boa.
O que você faz no load do Form?
Veja se ao entrar no load você esta executando as informações corretas ou se todos os dados preenchidos estão corretos no inicialização do Form.
Veja se ao entrar no load você esta executando as informações corretas ou se todos os dados preenchidos estão corretos no inicialização do Form.
Rogerio, não uso o C# e sim o vb.net, mas resumindo é mais ou menos isso que voce quer:
voce precisará de duas datas: Data Hoje e DataLimite as date
passe a data de hoje para DataHoje
para montar a data limite faca o seguinte: DataLimite= DataHoje.AddDays([Ô]-[Ô] & Combo.text)
sua consulta fica assim:
[Ô]SELECT * FROM Tabela WHERE Evento <> [ô]401[ô] AND Data BETWEEN #[Ô] & DataHoje & [Ô]# AND #[Ô] & DataLimite & [Ô]#[Ô]
voce precisará de duas datas: Data Hoje e DataLimite as date
passe a data de hoje para DataHoje
para montar a data limite faca o seguinte: DataLimite= DataHoje.AddDays([Ô]-[Ô] & Combo.text)
sua consulta fica assim:
[Ô]SELECT * FROM Tabela WHERE Evento <> [ô]401[ô] AND Data BETWEEN #[Ô] & DataHoje & [Ô]# AND #[Ô] & DataLimite & [Ô]#[Ô]
Bom dia!
Filman,
Estava funcionando como eu preciso, mas apresentava o erro na abertura no form, pois eu coloquei o a função que executa o comando no evento LOAD, eu imagino que o erro apresentado apenas informava que antes de ser usada a variável estava em formato incorreto, e por isso eu precisava converter como fiz, o que fiz, foi apenas remover a função do LOAD e deixar que o usuário escolha primeiramente o intervalo desejado, e depois de escolhido o erro não é mais apresentado. Obrigado a todos pelas contribuições. Como preciso escolher apenas 1 na solução, me perdoem mas escolherei o Filman pois a minha solução foi de trechos do que ele sugeriu.
Filman,
Estava funcionando como eu preciso, mas apresentava o erro na abertura no form, pois eu coloquei o a função que executa o comando no evento LOAD, eu imagino que o erro apresentado apenas informava que antes de ser usada a variável estava em formato incorreto, e por isso eu precisava converter como fiz, o que fiz, foi apenas remover a função do LOAD e deixar que o usuário escolha primeiramente o intervalo desejado, e depois de escolhido o erro não é mais apresentado. Obrigado a todos pelas contribuições. Como preciso escolher apenas 1 na solução, me perdoem mas escolherei o Filman pois a minha solução foi de trechos do que ele sugeriu.
Cmd01.Parameters.Add(new SqlParameter([Ô]@data[Ô], Convert.ToInt32(cbxData.Text.ToString())));
Tópico encerrado , respostas não são mais permitidas