Fórum Problema com lógica... Data Vigência #347421
16/10/2007
0
To com um problema de lógica simples mas que meu tico e teco já está travado....
Preciso verificar se o usuário informou um período que não tenha sido informado...
Ex:
Cadastrei um registro com período de vigência igual a 16/10/2007 até 16/10/2007. Depois criei um novo registro, com data de início de vigência igual a 17/10/2007 e sem data de fim. Depois voltei no primeiro registro e alterei a data de fim para 18/10/2007. Não deveria permitir, pois já existe um registro vigente nesta data.
Como q eu posso solucionarrr!! rsrs..
Obrigado desde já!
Diegus
Curtir tópico
+ 0Posts
16/10/2007
Marco Salles
voce poderia dar uma outra explicação ... Eu fiqui na duvida :cry: :cry:
Gostei + 0
17/10/2007
Diegus
voce poderia dar uma outra explicação ... Eu fiqui na duvida :cry: :cry:[/quote:47e1e2f81f]
Deixa eu tentar então
Campos no banco: Data_inicio, Data_Fim, Codg_Sequencia, Codg_Email
Chaves: Codg_Sequencia, Codg_Email
Entrei na tela...
Informo:
1ª registro:
codg_email = 1
codg_sequencia = 1
data inicio = 16/10/2007
data fim = 16/10/2007
2ª registro
codg_email = 1
codg_sequencia = 2
data inicio = 17/10/2007
data fim = null (não tem fim)
Após estes dois registros gravados...
Vou editar o primeiro..
codg_email = 1
codg_sequencia = 1
data inicio = 16/10/2007
data fim = 18/10/2007
(Não poderia gravar esta edição com data fim 18/10... pois o 2º registro informa q já tem essa data informada...)
O select q tenho hoje soh consigo (e olhe lá) travar com a data inicial...
DECLARE @DATA DATETIME
SET @DATA = :rtv_DATA
SELECT
*
FROM
CONFIG_EMAILS_CONSULTORES
WHERE (1=1)
AND CODG_EMAIL = :rtv_CODG_EMAIL
AND @DATA >= DATA_INICIO
AND ((DATA_FIM IS NULL) OR (@DATA <= DATA_FIM))
Preciso acertar este select....
Gostei + 0
17/10/2007
Marco Salles
Gostei + 0
17/10/2007
Diegus
Isso....
Utilizo 3 camadas - COM+
No client o cds e antes de salvar ele vai no servidor e faz as verificações pelo BeforeUpdateRecord do DataSetProvider...
se estiver inserindo:
//Não pode existir mais de um registro de configuração //vigente no mesmo período para o mesmo e-mail adoq_VerificaDataVigencia.Close; adoq_VerificaDataVigencia.Parameters.ParamByName(´rtv_DATA´ ).Value := DeltaDS.FieldByName(´DATA_INICIO´).asDateTime; adoq_VerificaDataVigencia.Parameters.ParamByName(´rtv_CODG_EMAIL´).Value := DeltaDS.FieldByName(´CODG_EMAIL´ ).AsInteger; adoq_VerificaDataVigencia.Open; if not adoq_VerificaDataVigencia.IsEmpty then Raise Exception.Create(´Já existe um registro de configuração vigente para esse e-mail no período informado.´);
Se estiver modificando:
if not VarIsEmpty(DeltaDS.FieldByName(´DATA_INICIO´).NewValue) then begin if DeltaDS.FieldByName(´DATA_INICIO´).OldValue <> DeltaDS.FieldByName(´DATA_INICIO´).NewValue then begin adoq_VerificaDataVigencia.Close; adoq_VerificaDataVigencia.Parameters.ParamByName(´rtv_DATA´ ).Value := DeltaDS.FieldByName(´DATA_INICIO´).NewValue; adoq_VerificaDataVigencia.Parameters.ParamByName(´rtv_CODG_EMAIL´).Value := DeltaDS.FieldByName(´CODG_EMAIL´ ).Value; adoq_VerificaDataVigencia.Open; if not adoq_VerificaDataVigencia.IsEmpty then Raise Exception.Create(´Já existe um registro de configuração vigente para esse e-mail no período informado.´); end; end;
esse adoq_VerificaDataVigencia eh a query q eu coloquei no post anterior.. ela precisa ser alterada.... e realmente estou meio q em parafuso já...
Não posso ter duas configurações de e-mails com a mesma data de vigência...
Gostei + 0
17/10/2007
Marco Salles
old com new gerando uma exceção quando for conveniente.. Ja pensou nisso ??? Não daria para o que voce quer ???
Gostei + 0
18/10/2007
Diegus
old com new gerando uma exceção quando for conveniente.. Ja pensou nisso ??? Não daria para o que voce quer ???[/quote:6a4100d9a0]
Como ficaria a lógica da trigger?!
Já tentei com esta query....mas não funcionou 100¬
DECLARE @DATA_INICIO DATETIME DECLARE @DATA_FIM DATETIME DECLARE @CODG_EMAIL NUMERIC(18,0) SET @DATA_INICIO = ´20071017´--Null--:rtv_DATA_INICIO SET @DATA_FIM = ´20071022´--:rtv_DATA_FIM SET @CODG_EMAIL = 1 --:rtv_CODG_EMAIL SELECT TOP 1 1 FROM CONFIG_EMAILS_CONSULTORES WHERE (1=1) AND CODG_EMAIL = @CODG_EMAIL AND @DATA_INICIO >= DATA_INICIO AND ((DATA_FIM IS NULL) OR (@DATA_INICIO >= DATA_FIM + ´ 23:59:59´ )) UNION SELECT TOP 1 1 FROM CONFIG_EMAILS_CONSULTORES WHERE (1=1) AND CODG_EMAIL = @CODG_EMAIL AND @DATA_FIM + ´23:59:59´ <= DATA_INICIO AND ((DATA_FIM IS NULL) OR (@DATA_FIM + ´ 23:59:59´ >= DATA_INICIO))
Tenho estes registros na tabela...
Um exemplo de que não está funcionando... é pegar o primeiro e editar colocando a data fim = 23/10/2007...
Deveria retornar um registro... pois o segundo registro diz q temos uma configuração a partir do dia 19 pra frente... ta tenso..
CODG_EMAIL CODG_SEQUENCIA DATA_INICIO DATA_FIM ---------------------------------------------------------------------------- 1 1 2007-10-18 00:00:00.0002007-10-18 00:00:00.000 1 2 2007-10-19 00:00:00.000NULL
Gostei + 0
18/10/2007
Marco Salles
[b:449f1d18d0]Pensei que fosse isto e voce ate tinha concordado[/b:449f1d18d0] :
quer dizer , indepente da dataIni e DataFim Dos Demais Registros..
:cry: :cry: :cry:
Mas parece que não é bem assim , pois Voce disse no Ultimo Post que não
poderia modificar o Primeiro Registro porque no segundo Registro ja
tem uma configuração a partir do dia 19 pra frente..
veja , este seu ultimop post foi diferente da suam colocação inicial ....
então para fazer uma lógica certa tem que entender o que se quer de fato fazer :cry: :cry:
Gostei + 0
18/10/2007
Diegus
[b:df1daf28fa]Pensei que fosse isto e voce ate tinha concordado[/b:df1daf28fa] :
quer dizer , indepente da dataIni e DataFim Dos Demais Registros..
:cry: :cry: :cry:
Mas parece que não é bem assim , pois Voce disse no Ultimo Post que não
poderia modificar o Primeiro Registro porque no segundo Registro ja
tem uma configuração a partir do dia 19 pra frente..
veja , este seu ultimop post foi diferente da suam colocação inicial ....
então para fazer uma lógica certa tem que entender o que se quer de fato fazer :cry: :cry:[/quote:df1daf28fa]
Complicado até para explicar..rsrsrs... blz.. vou tentar mais uma vez..
Tenho um cadastro... nelte tem data inicial e data final...
A questão é:
Não posso cadastrar um intervalo de data dentro de outro intervalo ja cadastrado...
Agora... como faço isso no SQL?!
Consegui!? rsrs.. Desde já agradeço Marco..
Gostei + 0
19/10/2007
Marco Salles
imagine este[color=darkred:0d26c7a92b][u:0d26c7a92b][b:0d26c7a92b] pseudo código [/b:0d26c7a92b][/u:0d26c7a92b][/color:0d26c7a92b]e me diga se ele te [b:0d26c7a92b][u:0d26c7a92b]atende[/u:0d26c7a92b][/b:0d26c7a92b]
[b:0d26c7a92b]para Inserção[/b:0d26c7a92b]
veja Tem um Parametro [u:0d26c7a92b]DataFimMax[/u:0d26c7a92b] , este parametro sera Obtido com uma determinada consulta No Banco
Se NovaDataFim <> Vazio entao Se (NovaDataIni < (DataFimMax)and(NovaDataFim < DataFimMax)and (NovaDataIni) < (NovaDataFim) entao permitir inserção else erro else se (NovaDataFim < DataFimMax) enta permitir Inserçaõ else erro
[b:0d26c7a92b]Ediçaõ[/b:0d26c7a92b]
Do Mesmo Modo que a Inserção , aqui temos um Parametro [b:0d26c7a92b]ProximaDataIni[/b:0d26c7a92b] ... Que tb sera Obtido com uma [u:0d26c7a92b]Consulat[/u:0d26c7a92b] Adequada na
Base De Dados
Se DataFim <> Vazio Entao se (NovaDataIni < NovaDataFim)and (NovaDataFim < ProximaDataIni) entao permitir Edicao else erro else se (NovaDataIni < ProximaDataIni) entao permitir Edicao else erro
Analise estas duas situaçoes e veja se este pesudocodigo , determinando
DataFimMax e ProximaDataIni , para os casos de Inserção e Edição
respectivamente [b:0d26c7a92b]te Atende[/b:0d26c7a92b]
Foi isto que eu consegui entender do nosso Dialigo :oops: :oops:
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)