Fórum Criar View para saber todas as Segundas e Terças do Ano #455952
20/09/2013
0
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
Curtir tópico
+ 0Posts
20/09/2013
Perinaldo Filho
Gostei + 0
20/09/2013
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
20/09/2013
Perinaldo Filho
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
20/09/2013
Alex Lekao
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
20/09/2013
Alex Lekao
http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-extract.html
Gostei + 0
20/09/2013
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
20/09/2013
Deivison Melo
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
20/09/2013
Deivison Melo
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
20/09/2013
Deivison Melo
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
20/09/2013
Perinaldo Filho
simples com um case. Obrigado pela ajuda!
Gostei + 0
20/09/2013
Joel Rodrigues
Gostei + 0
20/09/2013
Alex Lekao
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
20/09/2013
Deivison Melo
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
20/09/2013
Perinaldo Filho
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
20/09/2013
Deivison Melo
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
Clique aqui para fazer login e interagir na Comunidade :)