DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:
 
 

Fórum DevMedia


Autor
Mensagem
VALDELIR ANTONIO CASTANHEIRO
 

País: Brasil
Estado: SC
Cidade: CAÇADOR
Mensagens: 49
 Postado em: 11/3/2010 8:49:45 AM

Gostaria de fazer um comando sql para que entre um periodo de data ele liste as data que estão faltando lançamento em um determinado arquivo. é possivel fazer isto?


ThiiaGuinho
 
 


País: Brasil
Estado: SE
Cidade: Aracaju
Mensagens: 331
 Postado em: 11/3/2010 9:27:25 AM
Valdelir existe sim essa possibilidade, basta fazer o Select pegando o intervalo entre as datas e vê se o campo de lançamento que não sei como é sua tabela é null ou seja vazio! Caso vc não esteja conseguindo efetuar sua consulta poste aí a estrutura das suas tabelas e explique mais detalhadamente o que vc deseja para que possamos te ajudar!
AbraçoO

 
Emerson
 
 


País: Brasil
Estado: SP
Cidade: São Paulo
Mensagens: 938
 Postado em: 11/3/2010 9:57:43 AM
"Gostaria de fazer um comando sql para que entre um periodo de data ele liste as data que estão faltando lançamento em um determinado arquivo. é possivel fazer isto?"

onde lê-se arquivo deve ser tabela, certo?

se for tabela e se eu entendi sua necessidade, creio ser possível somente com stored procedure.

CREATE PROCEDURE FALTADATA (
    tabela varchar(50),
    campo varchar(50),
    dataini date,
    datafim date)
returns (
    dia date)
as
declare variable sql varchar(200);
declare variable diamov date;
begin
  sql = 'select distinct ' || campo || ' from ' || tabela ||
        ' where ' || campo ||  ' between ''' ||
        cast(dataini as varchar(10)) || ''' and ''' || cast(datafim as varchar(10)) || ''' ' ||
        ' order by ' || campo;

  dia = dataini;
  for execute statement sql
      into :diamov
  do
  begin
    while (dia < diamov) do
    begin
      suspend;
      dia = dia + 1;
    end
    dia = diamov + 1;
  end
  if (diamov is null) then
    while (dia <= :datafim) do
    begin
      suspend;
      dia = dia + 1;
    end
end


essa stored faz o que você precisa. você informa qual tabela e qual campo serão analisados, e ainda o período a ser analisado.

sintaxe:
SELECT * FROM FALTADATA('caixa', 'data', '01.01.2009', '31.01.2009')
SELECT * FROM FALTADATA('creceber', 'dtemissao', '01.02.2014', '15.02.2014')

se você quiser avaliar sempre uma única tabela, suprima os parâmetros da stored procedure e faça o select diretamente, pois não haverá necessidade em usar o comando execute statement e nem a variável para a instrução SQL.

assim:

CREATE PROCEDURE FALTADATA (
    dataini date,
    datafim date)
returns (
    dia date)
as
declare variable diamov date;
begin
  dia = dataini;
  for select distinct CAMPO_DATA from SUA_TABELA
      where
CAMPO_DATA between :dataini and :datafim
      order by
CAMPO_DATA
      into :diamov
  do
  begin
    while (dia < diamov) do
    begin
      suspend;
      dia = dia + 1;
    end
    dia = diamov + 1;
  end
  if (diamov is null) then
    while (dia <= :datafim) do
    begin
      suspend;
      dia = dia + 1;
    end
end


sintaxe:
SELECT * FROM FALTADATA('01.01.2009', '31.01.2009')
SELECT * FROM FALTADATA('01.02.2014', '15.02.2014')

espero que te ajude com seu problema.

 
VALDELIR ANTONIO CASTANHEIRO
 

País: Brasil
Estado: SC
Cidade: CAÇADOR
Mensagens: 49
 Postado em: 11/3/2010 9:59:26 AM
Seguinte: tenho uma tabela de lançamento com os campos agencia e datalote, nesta tabela so tem um lançamento na agencia=1 datalote=03/09/2010, eu queria listar as datas que estão faltando lançar nesta tabela no caso que ele liste 01/03/2010, 02/03/2010..... menos a data de 03/10/2010 que ja esta lançada.

Abraços




 
ThiiaGuinho
 
 


País: Brasil
Estado: SE
Cidade: Aracaju
Mensagens: 331
 Postado em: 11/3/2010 10:12:54 AM
Amigo se vc quer selecionar as datas que estão faltando listar é só fazer um select simples tipo:

Select  Agencia, datalote from Lancamento where Lancameto.datalote is null

Então irá listar todos os registros onde a datalote está vazio, então significa que não foi lançado!
É isso que vc precisa?
Espero ter ajudado!

 
Martins
 
 


País: Brasil
Estado: MA
Cidade: Pindaré Mirim
Mensagens: 276
 Postado em: 12/3/2010 2:30:50 PM
Foram colocadas possíveis soluções para seu problema, mas vc poderia ser um pouco mais claro, caso nenhum dos exemplos dados anteriormente sejam satisfatórios?
 
Vc tem em sua tabela esses campos, agencia, lotedata, etc...
 
Mas na tabela vc não tem as datas  que vão de 01/03/2010 a 31/03/2010, vc tem apenas algumas destas datas, tipo, 09/03/2010, 10/03/2010, etc... É isso?
 
Então vc quer com base nas informações de sua tabela ver quais datas estão faltando lançamento, q no caso seria de 01/03/2010 a 08/03/2010 e de 11/03/2010 a 31/03/2010, mais ou menos isso?

 
VALDELIR ANTONIO CASTANHEIRO
 

País: Brasil
Estado: SC
Cidade: CAÇADOR
Mensagens: 49
 Postado em: 12/3/2010 2:36:53 PM
É exatamente esta colocação que você expos



 
Emerson
 
 


País: Brasil
Estado: SP
Cidade: São Paulo
Mensagens: 938
 Postado em: 12/3/2010 4:02:47 PM
e o exemplo que eu postei abaixo não atende?

 
VALDELIR ANTONIO CASTANHEIRO
 

País: Brasil
Estado: SC
Cidade: CAÇADOR
Mensagens: 49
 Postado em: 12/3/2010 4:10:36 PM
Não funcionou,ele traz a data de 09/03/2010 que não era para trazer e ainda não traz as datas ate o final do periodo, no caso ele teria q listar de 01/03/2010 ate 08/03/2010 e 10/03/2010 a 31/03/2010, deixando de fora dia 09/03/2010, neste exemplo ele lista tudo ate 08/03/2010 e não lista do dia 10/03/2010 em diante.


 
Emerson
 
 


País: Brasil
Estado: SP
Cidade: São Paulo
Mensagens: 938
 Postado em: 12/3/2010 4:47:12 PM
como vc está executando a SP?

 
VALDELIR ANTONIO CASTANHEIRO
 

País: Brasil
Estado: SC
Cidade: CAÇADOR
Mensagens: 49
 Postado em: 12/3/2010 4:51:32 PM
Estou executando dentro da Stored Procedure, la eu passo os parametros da data inicial e data final



 
VALDELIR ANTONIO CASTANHEIRO
 

País: Brasil
Estado: SC
Cidade: CAÇADOR
Mensagens: 49
 Postado em: 12/3/2010 5:27:00 PM
Seguinte: o unico erro que esta ocorendo neste exemplo e que ele esta retornando o periodo de 01/03/2010 a 31/03/2010, ele teria que listar 01/03/2010 a 08/03/2010 e 10/03/2010 a 31/03/2010 ai ficaria correto. a data 09/03/2010 esta grava na tabela e não deveria retornar, não sei se fui claro.

 
Martins
 
 


País: Brasil
Estado: MA
Cidade: Pindaré Mirim
Mensagens: 276
 Postado em: 13/3/2010 2:08:05 PM
Emerson, sua procedure é interessante sim, mas se entendi bem, o que o colega quer é que ela verifique quais datas estão lançadas na tabela e não as mostre, mostre apenas as datas de determinado período que não tem lançamento.
Ex:
Data      
09/03/2009  - tem lançamento na tabela, então ela não deve aparecer
12/03/2009 - a mesma coisa
 
Listando apenas de 01/03/2009 a 08/03/2009, 10/03/2009 a 11/03/2009, 13/03/2009 a 31/03/2009
 
creio que seja mais ou menos isso.
 
Estou viajando e não tenho que tentar modificar sua procedure pq estou sem pc.
 
 
 

 
Emerson
 
 


País: Brasil
Estado: SP
Cidade: São Paulo
Mensagens: 938
 Postado em: 14/3/2010 1:03:10 AM
eu entendi o problema e o que a stored procedure faz é exatamente o que o colega solicitou.

nos meus testes, para alguns meses deixei gravadas algumas datas e para outros meses não coloquei data nenhuma.

em todos os casos o resultado exibido foi o correto, por isso pedi para o colega listar exatamente como está executando a stored procedure.

select * from faltadata('01.03.2010', '31.03.2010')

ou

select * from faltadata('01/03/2010', '31/03/2010')

???

porque em todos os os testes que eu fiz o resultado foi o correto.




 
VALDELIR ANTONIO CASTANHEIRO
 

País: Brasil
Estado: SC
Cidade: CAÇADOR
Mensagens: 49
 Postado em: 15/3/2010 8:14:01 AM
o comando que eu estou executando SELECT * FROM FALTADATA('01.03.2009', '31.03.2009') e ele esta retornando a data de 09/03/2010 que não deveria, a procedure eu copie e coloquei aquele exemplo que vc mandou e so mudei o nome do campo e a tabela na select. Alias ele retorna todas as datas do dia 01/03/2010 a 31/03/2010. Nesta tabela eu so tenho um registro gravado q é a data de 09/03/2010. Não sei te explicar porque q com vc funciona e aqui não.

Se vc me passar eu teu e-mail eu mando o print screen da tela.




 
Emerson
 
 


País: Brasil
Estado: SP
Cidade: São Paulo
Mensagens: 938
 Postado em: 15/3/2010 8:58:22 AM
meu e-mail:
emerson.en@ig.com.br

mande também a stored procedure extamente como a gravou e também a estrutura da sua tabela (nomes e tipos dos campos).

 
VALDELIR ANTONIO CASTANHEIRO
 

País: Brasil
Estado: SC
Cidade: CAÇADOR
Mensagens: 49
 Postado em: 15/3/2010 9:00:40 AM
seguinte eu fiz mais teste e a procedure esta fazendo o seguinte: eu tenho um registro na tabela com data de 09/03/2010 quando eu excuto o comando SELECT * FROM FALTADATA('01.03.2010', '31.03.2010')ele retorna somente ate o dia 01/03/2010 a 08/03/2010 e o resto dos dias do mês não retorna nda

01/03/2010
02/03/2010
03/03/2010
04/03/2010
05/03/2010
06/03/2010
07/03/2010
08/03/2010

este é o resultado da select


ele teria q continuar com 10/03/2010 .....



 
Emerson
 
 


País: Brasil
Estado: SP
Cidade: São Paulo
Mensagens: 938
 Postado em: 15/3/2010 9:21:23 AM
é verdade!

stored procedures corrigidas:


"Gostaria de fazer um comando sql para que entre um periodo de data ele liste as data que estão faltando lançamento em um determinado arquivo. é possivel fazer isto?"

onde lê-se arquivo deve ser tabela, certo?

se for tabela e se eu entendi sua necessidade, creio ser possível somente com stored procedure.

CREATE PROCEDURE FALTADATA (
    tabela varchar(50),
    campo varchar(50),
    dataini date,
    datafim date)
returns (
    dia date)
as
declare variable sql varchar(200);
declare variable diamov date;
begin
  sql = 'select distinct ' || campo || ' from ' || tabela ||
        ' where ' || campo ||  ' between ''' ||
        cast(dataini as varchar(10)) || ''' and ''' || cast(datafim as varchar(10)) || ''' ' ||
        ' order by ' || campo;

  dia = dataini;
  for execute statement sql
      into :diamov
  do
  begin
    while (dia < diamov) do
    begin
      suspend;
      dia = dia + 1;
    end
    dia = diamov + 1;
  end

--  if (diamov is null) then
  if (dia < datafim) then
    while (dia <= :datafim) do
    begin
      suspend;
      dia = dia + 1;
    end
end


essa stored faz o que você precisa. você informa qual tabela e qual campo serão analisados, e ainda o período a ser analisado.

sintaxe:
SELECT * FROM FALTADATA('caixa', 'data', '01.01.2009', '31.01.2009')
SELECT * FROM FALTADATA('creceber', 'dtemissao', '01.02.2014', '15.02.2014')

se você quiser avaliar sempre uma única tabela, suprima os parâmetros da stored procedure e faça o select diretamente, pois não haverá necessidade em usar o comando execute statement e nem a variável para a instrução SQL.

assim:

CREATE PROCEDURE FALTADATA (
    dataini date,
    datafim date)
returns (
    dia date)
as
declare variable diamov date;
begin
  dia = dataini;
  for select distinct CAMPO_DATA from SUA_TABELA
      where
CAMPO_DATA between :dataini and :datafim
      order by
CAMPO_DATA
      into :diamov
  do
  begin
    while (dia < diamov) do
    begin
      suspend;
      dia = dia + 1;
    end
    dia = diamov + 1;
  end
--  if (diamov is null) then
  if (dia < datafim) then
    while (dia <= :datafim) do
    begin
      suspend;
      dia = dia + 1;
    end
end


sintaxe:
SELECT * FROM FALTADATA('01.01.2009', '31.01.2009')
SELECT * FROM FALTADATA('01.02.2014', '15.02.2014')

espero que te ajude com seu problema.

 
Emerson
 
 


País: Brasil
Estado: SP
Cidade: São Paulo
Mensagens: 938
 Postado em: 16/3/2010 4:11:41 PM
funcionou?

ah, disponha. estamos aqui pra ajudar...

 
VALDELIR ANTONIO CASTANHEIRO
 

País: Brasil
Estado: SC
Cidade: CAÇADOR
Mensagens: 49
 Postado em: 16/3/2010 4:22:42 PM
Desculpa não ter dados retorno, funcionou tudo blz obrigado pela ajuda, Valeu

Abraços

 
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03