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