Autor
Mensagem
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
AbraçoO
"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.
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.
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
Abraços
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!
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?
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.
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.
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.
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.
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.
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.
Se vc me passar eu teu e-mail eu mando o print screen da tela.
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 .....
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 .....
é 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.
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.







