GARANTIR DESCONTO

Fórum Criar View para saber todas as Segundas e Terças do Ano #455952

20/09/2013

0

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!
Perinaldo Filho

Perinaldo Filho

Responder

Posts

20/09/2013

Perinaldo Filho

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.
Responder

Gostei + 0

20/09/2013

Alex Lekao

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
Responder

Gostei + 0

20/09/2013

Perinaldo Filho

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.
Responder

Gostei + 0

20/09/2013

Alex Lekao

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...
Responder

Gostei + 0

20/09/2013

Alex Lekao

da uma olhada neste tbm e ve se ajuda.

http://www.firebirdsql.org/refdocs/langrefupd21-intfunc-extract.html
Responder

Gostei + 0

20/09/2013

Alex Lekao

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
Responder

Gostei + 0

20/09/2013

Deivison Melo

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


Responder

Gostei + 0

20/09/2013

Deivison Melo

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
Responder

Gostei + 0

20/09/2013

Deivison Melo

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
Responder

Gostei + 0

20/09/2013

Perinaldo Filho

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!
Responder

Gostei + 0

20/09/2013

Joel Rodrigues

Poderia postar o código que usou?
Responder

Gostei + 0

20/09/2013

Alex Lekao

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!


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
Responder

Gostei + 0

20/09/2013

Deivison Melo

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:

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

Responder

Gostei + 0

20/09/2013

Perinaldo Filho

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!
Responder

Gostei + 0

20/09/2013

Deivison Melo

Se utilizarmos o decode ao invés do case sua view ficaria da seguinte forma:

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!

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar