Problema com lógica... Data Vigência

Delphi

16/10/2007

Boa noite Srs.

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

Diegus

Curtidas 0

Respostas

Marco Salles

Marco Salles

16/10/2007

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

voce poderia dar uma outra explicação ... Eu fiqui na duvida :cry: :cry:


GOSTEI 0
Diegus

Diegus

16/10/2007

[quote:47e1e2f81f=´Marco Salles´]
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.
...

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
Marco Salles

Marco Salles

16/10/2007

Deixa eu ver se entendi... Seu problema esta na [b:cdb8eaf42b]edição[/b:cdb8eaf42b] de algum registro no que se refere a [u:cdb8eaf42b]dataini e datafim[/u:cdb8eaf42b].... isto é se dataIn e DataFim ja tiver sido informado , então não permitir a edição. Seria isto :?: :?:


GOSTEI 0
Diegus

Diegus

16/10/2007

[quote:ad114e1dcc=´Marco Salles´]Deixa eu ver se entendi... Seu problema esta na [b:ad114e1dcc]edição[/b:ad114e1dcc] de algum registro no que se refere a [u:ad114e1dcc]dataini e datafim[/u:ad114e1dcc].... isto é se dataIn e DataFim ja tiver sido informado , então não permitir a edição. Seria isto :?: :?:[/quote:ad114e1dcc]

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
Marco Salles

Marco Salles

16/10/2007

so uma pergunta.... Pq não utiliza uma Trigger de atualização e compara
old com new gerando uma exceção quando for conveniente.. Ja pensou nisso ??? Não daria para o que voce quer ???


GOSTEI 0
Diegus

Diegus

16/10/2007

[quote:6a4100d9a0=´Marco Salles´]so uma pergunta.... Pq não utiliza uma Trigger de atualização e compara
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
Marco Salles

Marco Salles

16/10/2007

com Trigger funciona.. Mas tem que saber o que voce quer

[b:449f1d18d0]Pensei que fosse isto e voce ate tinha concordado[/b:449f1d18d0] :

Seu problema esta na edição de algum registro no que se refere a dataini e datafim.... isto é se dataIn e DataFim ja tiver sido informado , então não permitir a edição. Seria isto


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
Diegus

Diegus

16/10/2007

[quote:df1daf28fa=´Marco Salles´]com Trigger funciona.. Mas tem que saber o que voce quer

[b:df1daf28fa]Pensei que fosse isto e voce ate tinha concordado[/b:df1daf28fa] :

Seu problema esta na edição de algum registro no que se refere a dataini e datafim.... isto é se dataIn e DataFim ja tiver sido informado , então não permitir a edição. Seria isto


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
Marco Salles

Marco Salles

16/10/2007

ta dificil de entender o que relamente voce precisa

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
POSTAR