Cara jah pensei em validar estas coisas simples no cliente, soh que 
estou pensando em quando surgir uma situação destas com um campo mais 
importante e que tenha de ser validado do lado servidor, mas acho que 
consegui resolver o problema, não sei se foi da forma correta mas dah 
uma olhada no que fiz.

Criei uma transação e coloquei o ApplyUpdates dentro dela se houver 
exceção agora posso dar um Rollback e nada vai ser gravado.

procedure TForm1.btGravarClick(Sender: TObject);
var
  TD: TTransactionDesc;
begin
  Application.ProcessMessages;
  TD.TransactionID := 1;
  TD.IsolationLevel := xilREADCOMMITTED;
  conBase.StartTransaction(TD);
  try
    cdsPessoa.ApplyUpdates(0);
    conBase.Commit(TD);
  except
    conBase.Rollback(TD);
  end;
end;


Tah correto isso que eu fiz?
xilREADCOMMITTED eh o tipo mais indicado para esta operação?

[ ]'s Rodrigo


Francisco Thiago de Almeida escreveu:

> Dando uma olhada por cima.....
> Tente ao invés de pegar o valor retornado de NewValue.. tente capturar o
> Valor de AsDateTime....
> E ao invés de jogar uma EDataBaseError, jogue uma que descenda de
> Exception....
>
> Interessante é que tenho códigos assim e o raise funciona perfeitamente...
>
> Não sei como você está fazendo as validações.. mas esta da data não 
> poderia
> ser feita no cliente?
>
>
> ----- Original Message -----
> From: "Rodrigo Schiavo" <[EMAIL PROTECTED]>
> To: <delphi-br@yahoogrupos.com.br>
> Sent: Wednesday, January 26, 2005 1:58 PM
> Subject: Re: [delphi-br] Problema com Master-Detail
>
>
> >
> >
> >
> > Olá Francisco obrigado pela ajuda, seu e-mail foi muito útil pois
> > modifiquei a forma como o código estava sendo gerado para o Mestre e o
> > Detalhe porém meu problema na validação dos campos persiste.
> >
> > Obs: eu tb estou tentando usar n-tier seguindo o exemplo do Bruno que
> > foi publicado na edição 56 da revista ClubeDelphi, porém estas dúvidas
> > estão me prendendo aqui
> >
> > Veja abaixo o exemplo do meu problema e como ficou o procedimento
> > modificado ( a parte em negrito é onde esta a minha dor de cabeça):
> >
> > procedure TForm1.dspPessoaBeforeUpdateRecord(Sender: TObject;
> >  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet;
> >  UpdateKind: TUpdateKind; var Applied: Boolean);
> > const
> >  {$J+} // Ativa constantes tipadas
> >  CODIGO: Integer = -1;
> >  {$J-} //Desativa constantes tipadas
> > begin
> >  if (UpdateKind in [ukInsert, ukModify]) then
> >    with DeltaDS do
> >    begin
> >      {
> >       Se esta exceção ocorrer nada é gravado na base de dados e o CDS
> > fica em
> >       modo de edição, por que o campo VALIDADE pertence a tabela MESTRE
> >      }
> >      // Verifica se VALIDADE é maior que o dia atual
> >      if Assigned(FindField('VALIDADE')) then  //Se o campo estiver
> > presente no Delta
> >        if not VarIsEmpty(FindField('VALIDADE').NewValue) then //Se o
> > campo não estiver vazio
> >          if (FindField('VALIDADE').NewValue<=Date) then //Se o valor do
> > campo for menor que a data atual
> >            raise EDatabaseError.Create('A data de validade do cadastro
> > deve ser '+
> >              'posterior à '+DateToStr(Date)+'!');*
> >
> >      {
> >       O problema esta aqui, se esta exceção ocorrer os dados da tabela
> > Mestre (PESSOA)
> >       são gravados na base de dados, a exceção é gerada, o registro
> > fica em modo de
> >       edição, porém se o usuário cancelar a operação, os dados da
> > tabela mestre que ja foram
> >       gravados ficam na base de dados sem os detalhes por que SALARIO
> > pertence a tabela DETALHE
> >      }
> >      // Verifica se SALARIO é maior que 0
> >      if Assigned(FindField('SALARIO')) then  //Se o campo estiver no
> > Delta*
> > *        if not VarIsEmpty(FindField('SALARIO').NewValue) then   //Se o
> > campo não estiver vazio*
> > *          if (FindField('SALARIO').NewValue<=0) then   //Se o valor do
> > salário for menor que 1
> >            raise EDatabaseError.Create('Salário deve ser um valor maior
> > do que 0!');
> >
> >    *end;
> >
> >  if (UpdateKind=ukInsert) then
> >    with DeltaDS do
> >    begin
> >      Edit;
> >      // Se é o mestre gera código
> >      if SourceDS = sqlPessoa then
> >      begin
> >        sqlGeraID.Open;
> >        CODIGO := sqlGeraID.FieldValues['CODIGO']+1;
> >        sqlGeraID.Close;
> >      end;
> >      FieldByName('CODIGO').AsInteger := CODIGO;
> >      Post;
> >    end;
> > end;
> >
> >
> > Francisco Thiago de Almeida escreveu:
> >
> >> Olá Rodrigo!
> >>
> >> Tudo bem? Espero que sim
> >>
> >> Veja bem, a melhor forma de fazer o mestre - detalhe com DBX e CDs é da
> >> seguinte forma:
> >>
> >> SQLMestre
> >> Select * from Mestre
> >>
> >> SQLDetalhe
> >> Select * from Detalhe
> >> where campo_fk = :campo_pk // Este campo deve ter o MESMO nome do campo
> >> chave na tabela Mestre
> >>
> >> Feito isso, adicione um DataSource ao seu DM..e faça o seguinte
> >>
> >> TDataSource
> >> DataSet = sqlMestre
> >>
> >> E na propriedade DataSource do sqlDetalhe aponte para o DataSource
> >> criado!
> >> Vóilà! está criado o mestre detalhe...
> >>
> >> Adicione um DataSetProvider e aponte a propriedade DataSet para o
> >> SQLMestre...
> >> Adicione um Cds e aponte a propriedade Provider para o Provider criado
> >> anteriormente. Adicione todos os campo.. Observe dentre os campos,
> >> aparecerá
> >> um sqlDetalhe.
> >> Adicione outro dataset... e na propriedade DataSetFields, infome o
> >> sqlDetalhe que aparecerá na listagem...
> >>
> >> Agora... Detalhe... Em aplicações Multicamadas (SOAP no meu caso) 
> só isso
> >> não funcionou... tive de escrever o seguinte método no 
> BeforeUpdateRecord
> >>
> >> const
> >>   {$J+}  // Ativa constantes tipadas
> >>   qg:Integer = -1;
> >>   {$J-}//Desativa constantes tipadas
> >> begin
> >>   if UpdateKind in [ukInsert] then // Repare que executo isso só na
> >> Inserção.. em edição, o CDS já atribui o valor de chave automaticamente
> >>   begin
> >>     if SourceDS = sqlCad_Crediario then // Se é o mestre...
> >>     begin
> >>       UpdateRecordAutoInc (Sender,SourceDS,DeltaDS,UpdateKind,Applied,
> >>         DeltaDS.FieldByName('CCRED_CODIGO').Index);  // procedure 
> de auto
> >> incremento
> >>       qg := DeltaDS.FieldByName('CCRED_CODIGO').NewValue // armazena o
> >> valor
> >> de chave na constante
> >>     end
> >>     else if qg <> -1 then
> >>       DeltaDS.FieldByName('CCRED_CODIGO').NewValue := qg; // chave nos
> >> detalhes
> >>   end;
> >>
> >> É isso ae.. espero ter ajudado
> >>
> >> ----- Original Message -----
> >> From: "Rodrigo Schiavo" <[EMAIL PROTECTED]>
> >> To: <delphi-br@yahoogrupos.com.br>
> >> Sent: Wednesday, January 26, 2005 9:52 AM
> >> Subject: [delphi-br] Problema com Master-Detail
> >>
> >>
> >> >
> >> > Bom dia galera.
> >> >
> >> > Surgiu um probleminha meio urgente aqui.
> >> >
> >> > Estou ulizando componentes DBX com ClientDataSets.
> >> >
> >> >
> >> >
> >> > Estou fazendo as validações dos dados tanto do mestre como do 
> detalhe
> >> > no
> >> > evento BeforeUpdateRecord do DataSetProvider porém o Delphi faz o 
> Post
> >> > do Mestre antes dos detalhes e se houver algum erro de validação nos
> >> > detalhes os dados do mestre já foram gravados no banco de dados e não
> >> > tenho como cancelar a operação.
> >> >
> >> > Como vocês lidam com esta situação?
> >> >
> >> > Será que o jeito vai ser fazer todas as verificações no momento 
> em que
> >> > o
> >> > usuário clicar no botão GRAVAR antes de chamar o ApplyUpdates??
> >> >
> >> >
> >> > [ ]'s Rodrigo Schiavo
> >> >
> >> >
> >> > --
> >> > <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>
> >> >
> >> > Para ver as mensagens antigas, acesse:
> >> > http://br.groups.yahoo.com/group/delphi-br/messages
> >> >
> >> > Para falar com o moderador, envie um e-mail para:
> >> > [EMAIL PROTECTED] ou [EMAIL PROTECTED]
> >> >
> >> > Links do Yahoo! Grupos
> >> >
> >> >
> >> >
> >> >
> >> >
> >> >
> >> >
> >> >
> >> >
> >>
> >>
> >>
> >>
> >>
> >> --
> >> <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>
> >>
> >> Para ver as mensagens antigas, acesse:
> >> http://br.groups.yahoo.com/group/delphi-br/messages
> >>
> >> Para falar com o moderador, envie um e-mail para:
> >> [EMAIL PROTECTED] ou [EMAIL PROTECTED]
> >>
> >>
> >>
> >> *Yahoo! Grupos, um serviço oferecido por:*
> >>
> >> *
> >> 
> <http://br.rd.yahoo.com/SIG=12asnqujl/M=264105.3931087.6562589.1588051/D=brclubs/S=2137111264:HM/EXP=1106829484/A=2361264/R=6/SIG=10v4acpp0/*http://br.shopping.yahoo.com/>*
> >>
> >>
> >>
> >> 
> ------------------------------------------------------------------------
> >> *Links do Yahoo! Grupos*
> >>
> >>     * Para visitar o site do seu grupo na web, acesse:
> >>       http://br.groups.yahoo.com/group/delphi-br/
> >>
> >>     * Para sair deste grupo, envie um e-mail para:
> >>       [EMAIL PROTECTED]
> >>
> >> <mailto:[EMAIL PROTECTED]>
> >>
> >>     * O uso que você faz do Yahoo! Grupos está sujeito aos Termos do
> >>       Serviço do Yahoo! <http://br.yahoo.com/info/utos.html>.
> >>
> >>
> >
> >
> > --
> > <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>
> >
> > Para ver as mensagens antigas, acesse:
> > http://br.groups.yahoo.com/group/delphi-br/messages
> >
> > Para falar com o moderador, envie um e-mail para:
> > [EMAIL PROTECTED] ou [EMAIL PROTECTED]
> >
> > Links do Yahoo! Grupos
> >
> >
> >
> >
> >
> >
> >
> >
> >
>
>
>
>
>
> -- 
> <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>
>
> Para ver as mensagens antigas, acesse:
> http://br.groups.yahoo.com/group/delphi-br/messages
>
> Para falar com o moderador, envie um e-mail para:
> [EMAIL PROTECTED] ou [EMAIL PROTECTED]
>
>
>
> *Yahoo! Grupos, um serviço oferecido por:*
> <http://br.rd.yahoo.com/SIG=12al69ugd/M=264379.5078783.6203979.1588051/D=brclubs/S=2137111264:HM/EXP=1106842074/A=2191897/R=0/SIG=10vqa2grn/*http://br.diversao.yahoo.com/>
>  
>
> <http://br.rd.yahoo.com/SIG=12al69ugd/M=264379.5078783.6203979.1588051/D=brclubs/S=2137111264:HM/EXP=1106842074/A=2191897/R=1/SIG=10vqa2grn/*http://br.diversao.yahoo.com/>
>  
>       
>
>
> ------------------------------------------------------------------------
> *Links do Yahoo! Grupos*
>
>     * Para visitar o site do seu grupo na web, acesse:
>       http://br.groups.yahoo.com/group/delphi-br/
>        
>     * Para sair deste grupo, envie um e-mail para:
>       [EMAIL PROTECTED]
>       <mailto:[EMAIL PROTECTED]>
>        
>     * O uso que você faz do Yahoo! Grupos está sujeito aos Termos do
>       Serviço do Yahoo! <http://br.yahoo.com/info/utos.html>.
>
>


-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

Para ver as mensagens antigas, acesse:
 http://br.groups.yahoo.com/group/delphi-br/messages

Para falar com o moderador, envie um e-mail para:
 [EMAIL PROTECTED] ou [EMAIL PROTECTED]
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 



Responder a