Criar View para saber todas as Segundas e Terças do Ano
Olá pessoal tudo bem?
Sou novato aqui no fórum e estou fazendo uma aplicação que está quase concluída. Estou desenvolvendo em Delphi + Firebird e possuo uma rotina própria de backup do banco em
arquivos .sql onde vou inserindo os scripts de INSERT com todos os dados contidos nos registros do banco. Essa rotina está funcionando perfeitamente para backup manual,
ou seja, acionado pelo usuário, porém, quero também que ela seja executada automaticamente aos sábados e o conteúdo das tabelas que serão considerados, devem conter apenas os registros da semana de segunda a sábado. (Domingo não há expediente no local que roda o sistema).
Estava fazendo esse procedimento pelo Delphi mesmo, mas vai ficar meio confuso. Como eu estou utilizando muito STORED PROCEDURE para inserir, alterar e deletar os registros no banco além de views para as consultas e relatórios pelo Quick Report, gostaria de fazer isso também pelo Database e apenas chamar pelo Delphi para comparar com as datas dos registros, fazendo um range. Basicamente preciso da seguinte estrutura exibida quando fizer um select nessa View:
Ex:
Coluna_Segunda | Coluna_Sabado
16/09/2013 21/09/2013
23/09/2013 27/09/2013
...... .......
Isso precisa ser dinâmico, tipo, não engessado somente no ano de 2013, tem que pegar por ano, mas para não ficar enorme, exibir apenas as segundas e sábados do ano corrente. Já quebrei a cabeça aqui e não consigo pensar numa lógica para esse procedimento. Alguém teria uma ideia por aí?
Desde já, agradeço!
Sou novato aqui no fórum e estou fazendo uma aplicação que está quase concluída. Estou desenvolvendo em Delphi + Firebird e possuo uma rotina própria de backup do banco em
arquivos .sql onde vou inserindo os scripts de INSERT com todos os dados contidos nos registros do banco. Essa rotina está funcionando perfeitamente para backup manual,
ou seja, acionado pelo usuário, porém, quero também que ela seja executada automaticamente aos sábados e o conteúdo das tabelas que serão considerados, devem conter apenas os registros da semana de segunda a sábado. (Domingo não há expediente no local que roda o sistema).
Estava fazendo esse procedimento pelo Delphi mesmo, mas vai ficar meio confuso. Como eu estou utilizando muito STORED PROCEDURE para inserir, alterar e deletar os registros no banco além de views para as consultas e relatórios pelo Quick Report, gostaria de fazer isso também pelo Database e apenas chamar pelo Delphi para comparar com as datas dos registros, fazendo um range. Basicamente preciso da seguinte estrutura exibida quando fizer um select nessa View:
Ex:
Coluna_Segunda | Coluna_Sabado
16/09/2013 21/09/2013
23/09/2013 27/09/2013
...... .......
Isso precisa ser dinâmico, tipo, não engessado somente no ano de 2013, tem que pegar por ano, mas para não ficar enorme, exibir apenas as segundas e sábados do ano corrente. Já quebrei a cabeça aqui e não consigo pensar numa lógica para esse procedimento. Alguém teria uma ideia por aí?
Desde já, agradeço!
Perinaldo Filho
Curtidas 0
Respostas
Perinaldo Filho
20/09/2013
Me desculpem pessoal, eu me equivoquei no título do post. É para saber todas as Segundas e Sábados e não terças. Considerem apenas a descrição do post e não seu título.
GOSTEI 0
Alex Lekao
20/09/2013
Ola Perinaldo, boa tarde!!!!
Nao entendi muito bem...
mas o que vc quer eh fazer o backup usando uma stored procedure?
ou vc quer simplesmente uma rotina de copia de seguranda do arquivo fdb(nao me recordo se eh essa a extencao dos arquivos do firebird...r srsr) do firebird?
Se for somente copiar, o arquivo eu te sugeriria usar o Cobian Backup, ele tem o que vc precisa.
Se nao me engano tem uma outra ferramenta tbm que eh a sql backup.
Agora so mais uma coisa, seu servidor do firebird eh linux ou windows?
Abraco.
Alex - Lekao
Nao entendi muito bem...
mas o que vc quer eh fazer o backup usando uma stored procedure?
ou vc quer simplesmente uma rotina de copia de seguranda do arquivo fdb(nao me recordo se eh essa a extencao dos arquivos do firebird...r srsr) do firebird?
Se for somente copiar, o arquivo eu te sugeriria usar o Cobian Backup, ele tem o que vc precisa.
Se nao me engano tem uma outra ferramenta tbm que eh a sql backup.
Agora so mais uma coisa, seu servidor do firebird eh linux ou windows?
Abraco.
Alex - Lekao
GOSTEI 0
Perinaldo Filho
20/09/2013
Oi amigo.
Não na verdade eu já possuo a rotina de backup da base onde eu salvo os scripts em arquivo de texto salvando com extensão SQL. Prefiro assim, pois ao término dessa rotina de backup, o sistema envia pra um servidor FTP via Upload o conteúdo desse backup, portanto, arquivos de texto são mais leves do que a cópia da base, que tem a tendência de crescer cada vez mais e o FTP tem limite de tamanho de arquivos, além da demora que ia ser enviar pra mim o banco todo a cada semana, seria muito custoso.
O que preciso é apenas saber todas as segundas e sábados do ano numa View, considerando o ano corrente, ou seja, só passar para 2014 quando for dia 01/01/2014 e por ai vai, pra poder utilizar depois em minhas necessidades.
Grato.
Não na verdade eu já possuo a rotina de backup da base onde eu salvo os scripts em arquivo de texto salvando com extensão SQL. Prefiro assim, pois ao término dessa rotina de backup, o sistema envia pra um servidor FTP via Upload o conteúdo desse backup, portanto, arquivos de texto são mais leves do que a cópia da base, que tem a tendência de crescer cada vez mais e o FTP tem limite de tamanho de arquivos, além da demora que ia ser enviar pra mim o banco todo a cada semana, seria muito custoso.
O que preciso é apenas saber todas as segundas e sábados do ano numa View, considerando o ano corrente, ou seja, só passar para 2014 quando for dia 01/01/2014 e por ai vai, pra poder utilizar depois em minhas necessidades.
Grato.
GOSTEI 0
Alex Lekao
20/09/2013
Da uma olhada neste Artigo e ve se te ajuda.
https://www.devmedia.com.br/criando-uma-stored-procedure-em-firebird-para-retornar-o-proximo-dia-util/2564
encontrando mais alguma coisa eu posto...
https://www.devmedia.com.br/criando-uma-stored-procedure-em-firebird-para-retornar-o-proximo-dia-util/2564
encontrando mais alguma coisa eu posto...
GOSTEI 0
Alex Lekao
20/09/2013
da uma olhada neste tbm e ve se ajuda.
http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-extract.html
http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-extract.html
GOSTEI 0
Alex Lekao
20/09/2013
veja esta tbm... rsrsr
http://firebirdpt.wordpress.com/2005/11/22/date-functions/
acho que ja da para vc conseguir bastante coisa e os posts estao ficando redundantes... rsrsr
Espero ter ajudado.
Abraco.
Alex - Lekao
http://firebirdpt.wordpress.com/2005/11/22/date-functions/
acho que ja da para vc conseguir bastante coisa e os posts estao ficando redundantes... rsrsr
Espero ter ajudado.
Abraco.
Alex - Lekao
GOSTEI 0
Deivison Melo
20/09/2013
Utilize em sua VIEW a seguinte instrução SQL:
SELECT EXTRACT(WEEKDAY FROM CURRENT_DATE) Dia
FROM RDB$DATABASE
Você terá como retorno o valor inteiro referente ao dia da semana!
Exemplo: 1=Segunda, 2=Terça e assim por diante …
Veja o valor dos dias desejados e proceda com a geração DO seu código!
Aqui na empresa não utilizo o firebird, portante qualquer erro de sintaxe
desculpe-me!
Qualquer dúvida em relação a confecção de sua VIEW me procure que posso
ajudá-lo.
Abração!
Emanoel Deivison
Recife - PE
SELECT EXTRACT(WEEKDAY FROM CURRENT_DATE) Dia
FROM RDB$DATABASE
Você terá como retorno o valor inteiro referente ao dia da semana!
Exemplo: 1=Segunda, 2=Terça e assim por diante …
Veja o valor dos dias desejados e proceda com a geração DO seu código!
Aqui na empresa não utilizo o firebird, portante qualquer erro de sintaxe
desculpe-me!
Qualquer dúvida em relação a confecção de sua VIEW me procure que posso
ajudá-lo.
Abração!
Emanoel Deivison
Recife - PE
GOSTEI 0
Deivison Melo
20/09/2013
Entendendo o função EXTRACT( ) os seus argumentos, Tipos e Restrições
ELEMENT Tipo LIMITS DIALECT 1 DATE DATE TIME
YEAR SMALLINT 0–5400 Valid Valid Not valid
MONTH SMALLINT 1–12 Valid Valid Not valid
DAY SMALLINT 1–31 Valid Valid Not valid
HOUR SMALLINT 0–23 Valid Not valid Valid
MINUTE SMALLINT 0–59 Valid Not valid Valid
SECOND DECIMAL(6,4) 0–59.9999 Valid Not valid Valid
WEEKDAY SMALLINT 0–6† Valid Valid Not valid
YEARDAY SMALLINT 1–366 Valid Valid Not valid
Então a função WEEKDAY do EXTRACT só compreende valores de 0 a 6, onde "0" (zero)
seria o domingo!
Qualquer dúvida estou à disposição!
Emanoel Deivison
Recife - PE
ELEMENT Tipo LIMITS DIALECT 1 DATE DATE TIME
YEAR SMALLINT 0–5400 Valid Valid Not valid
MONTH SMALLINT 1–12 Valid Valid Not valid
DAY SMALLINT 1–31 Valid Valid Not valid
HOUR SMALLINT 0–23 Valid Not valid Valid
MINUTE SMALLINT 0–59 Valid Not valid Valid
SECOND DECIMAL(6,4) 0–59.9999 Valid Not valid Valid
WEEKDAY SMALLINT 0–6† Valid Valid Not valid
YEARDAY SMALLINT 1–366 Valid Valid Not valid
Então a função WEEKDAY do EXTRACT só compreende valores de 0 a 6, onde "0" (zero)
seria o domingo!
Qualquer dúvida estou à disposição!
Emanoel Deivison
Recife - PE
GOSTEI 0
Deivison Melo
20/09/2013
Entendendo o função EXTRACT( ) os seus argumentos, Tipos e Restrições
Então a função WEEKDAY do EXTRACT só compreende valores de 0 a 6, onde "0" (zero)
seria o domingo!
Qualquer dúvida estou à disposição!
Emanoel Deivison
Recife - PE
ELEMENT Tipo LIMITS DIALECT 1 DATE DATE TIME YEAR SMALLINT 0–5400 Valid Valid Not valid MONTH SMALLINT 1–12 Valid Valid Not valid DAY SMALLINT 1–31 Valid Valid Not valid HOUR SMALLINT 0–23 Valid Not valid Valid MINUTE SMALLINT 0–59 Valid Not valid Valid SECOND DECIMAL(6,4) 0–59.9999 Valid Not valid Valid WEEKDAY SMALLINT 0–6† Valid Valid Not valid YEARDAY SMALLINT 1–366 Valid Valid Not valid
Então a função WEEKDAY do EXTRACT só compreende valores de 0 a 6, onde "0" (zero)
seria o domingo!
Qualquer dúvida estou à disposição!
Emanoel Deivison
Recife - PE
GOSTEI 0
Perinaldo Filho
20/09/2013
Cara, não consegui fazer da forma que queria, mas acabei pensando numa lógica aqui bem mais simples. Consegui o que queria no final das contas apenas com uma view
simples com um case. Obrigado pela ajuda!
simples com um case. Obrigado pela ajuda!
GOSTEI 0
Perinaldo Filho
20/09/2013
Cara, não consegui fazer da forma que queria, mas acabei pensando numa lógica aqui bem mais simples. Consegui o que queria no final das contas apenas com uma view
simples com um case. Obrigado pela ajuda!
simples com um case. Obrigado pela ajuda!
GOSTEI 0
Perinaldo Filho
20/09/2013
Cara, não consegui fazer da forma que queria, mas acabei pensando numa lógica aqui bem mais simples. Consegui o que queria no final das contas apenas com uma view
simples com um case. Obrigado pela ajuda!
simples com um case. Obrigado pela ajuda!
GOSTEI 0
Joel Rodrigues
20/09/2013
Poderia postar o código que usou?
GOSTEI 0
Alex Lekao
20/09/2013
Cara, não consegui fazer da forma que queria, mas acabei pensando numa lógica aqui bem mais simples. Consegui o que queria no final das contas apenas com uma view
simples com um case. Obrigado pela ajuda!
simples com um case. Obrigado pela ajuda!
Acreidito que de qqr forma vc teria que usar o Case... para qdo for 0 escrever domingo e assim por diante... rsrs
Posta o Codigo para a gente ver como foi feito e servidor de consulta para a galera... rsrs
GOSTEI 0
Deivison Melo
20/09/2013
As versões mais novas do firebird suportam o comando: DECODE que funciona da mesma forma do case, mas bem mas enxuto e de fácil entendimento!
Exemplo simples:
PS. É interessante que post sempre o resultado da sua dúvida, assim ajudará outras pessoas que por ventura compartilham da mesma dúvida!
Abração e bons Códigos!
Emanoel Deivison
Recife - PE
Exemplo simples:
select decode( sexo, 'M', 'Masculino', 'F', 'Feminino', 'Desconhecido' ) Sexo from pessoa
PS. É interessante que post sempre o resultado da sua dúvida, assim ajudará outras pessoas que por ventura compartilham da mesma dúvida!
Abração e bons Códigos!
Emanoel Deivison
Recife - PE
GOSTEI 0
Perinaldo Filho
20/09/2013
No final das contas, eu vi que não necessitava daquele esquema todo que falei. Resolvi simplificar a View dessa forma:
CREATE OR ALTER VIEW VW_RETORNASEGUNDA(
SEGUNDA)
AS
SELECT
CASE
WHEN (EXTRACT(WEEKDAY FROM CURRENT_DATE) = 6) THEN CURRENT_DATE-5
WHEN (EXTRACT(WEEKDAY FROM CURRENT_DATE) = 5) THEN CURRENT_DATE-4
WHEN (EXTRACT(WEEKDAY FROM CURRENT_DATE) = 4) THEN CURRENT_DATE-3
WHEN (EXTRACT(WEEKDAY FROM CURRENT_DATE) = 3) THEN CURRENT_DATE-2
WHEN (EXTRACT(WEEKDAY FROM CURRENT_DATE) = 2) THEN CURRENT_DATE-1
ELSE
CURRENT_DATE
END
FROM RDB$DATABASE;
Dessa forma acima eu trago a segunda independentemente do dia em que estiver sendo consultado e o meu grande problema na verdade era pegar a segunda, pois dependendo
do mês, simplesmente pedir pra diminuir x dias poderia dar errado se fosse todo manual, mas como eu estou consultando o database, ele mesmo se encarrega de gerenciar as datas,
então, isso já supre minhas necessidades. Quando for chamar pelo Delphi ou até mesmo por outro Select, eu só preciso por exemplo fazer isso:
SELECT *
FROM
CADASTRO C,
VW_RETORNASEGUNDA RS
WHERE
C.DATACAD BETWEEN RS.SEGUNDA AND CURRENT_DATE;
Vlw pessoal!
CREATE OR ALTER VIEW VW_RETORNASEGUNDA(
SEGUNDA)
AS
SELECT
CASE
WHEN (EXTRACT(WEEKDAY FROM CURRENT_DATE) = 6) THEN CURRENT_DATE-5
WHEN (EXTRACT(WEEKDAY FROM CURRENT_DATE) = 5) THEN CURRENT_DATE-4
WHEN (EXTRACT(WEEKDAY FROM CURRENT_DATE) = 4) THEN CURRENT_DATE-3
WHEN (EXTRACT(WEEKDAY FROM CURRENT_DATE) = 3) THEN CURRENT_DATE-2
WHEN (EXTRACT(WEEKDAY FROM CURRENT_DATE) = 2) THEN CURRENT_DATE-1
ELSE
CURRENT_DATE
END
FROM RDB$DATABASE;
Dessa forma acima eu trago a segunda independentemente do dia em que estiver sendo consultado e o meu grande problema na verdade era pegar a segunda, pois dependendo
do mês, simplesmente pedir pra diminuir x dias poderia dar errado se fosse todo manual, mas como eu estou consultando o database, ele mesmo se encarrega de gerenciar as datas,
então, isso já supre minhas necessidades. Quando for chamar pelo Delphi ou até mesmo por outro Select, eu só preciso por exemplo fazer isso:
SELECT *
FROM
CADASTRO C,
VW_RETORNASEGUNDA RS
WHERE
C.DATACAD BETWEEN RS.SEGUNDA AND CURRENT_DATE;
Vlw pessoal!
GOSTEI 0
Deivison Melo
20/09/2013
Se utilizarmos o decode ao invés do case sua view ficaria da seguinte forma:
Obrigado por postar sua solução!
Abração e bons códigos!
CREATE OR ALTER VIEW VW_RETORNASEGUNDA(SEGUNDA) AS select decode(extract(weekday from current_date), 6, CURRENT_DATE-5, 5, CURRENT_DATE-4, 4, CURRENT_DATE-3, 3, CURRENT_DATE-3, 2, CURRENT_DATE-1, CURRENT_DATE) RETORNASEGUNDA from RDB$DATABASE;
Obrigado por postar sua solução!
Abração e bons códigos!
GOSTEI 0