Exceção Específica para Campo Requerido

Quando você tenta postar um registro num TClientDataSet deixando algum campo requerido sem valor, você obtém a seguinte exceção:

EDatabaseError: Field ‘XXX’ must have a value.

EDatabaseError é uma exceção genérica para erros de banco de dados, portanto se quisermos incluir código para tratar apenas exceções de campos requeridos teríamos que tratar a mensagem de erro, que é uma técnica que cheira muito mal. Além disso, a mensagem mostra o DisplayLabel do campo, então se você quiser saber o nome do campo que gerou a exceção você precisa extrair o DisplayLabel da mensagem e fazer um loop em todos os campos do DataSet para descobrir, ou seja, um baita trabalhão e muito propenso a erro.

Uma outra abordagem para tratar isso é não deixar essa exceção do Delphi ser levantada nunca, evitando que um post seja feito caso algum campo esteja vazio. Para isso você teria que fazer um loop nos campos gerando sua própria exceção durante o BeforePost por exemplo. O problema é acrescentar essa verificação em todos seus ClientDataSets. A melhor solução aqui talvez seria criar seu descendente de TClientDataSet com essa checagem adicional.

Mas o melhor mesmo seria que o componente original do Delphi já tivesse esse recurso facilitando ainda mais a nossa vida. Por isso abri a solicitação QC#54379.

Aproveitando o embalo, abri o QC#54380 sobre a mensagem “Field Value Required” que é normalmente levantada quando apenas o TField no servidor está marcado como Required e o ClientDataSet tenta postar o campo nulo. Essa mensagem simplesmente não diz em qual campo está o problema, então temos que ir um por um checando, verificando o código, etc.

Se você quer que o Delphi evolua, não deixe de participar no QC, abrindo solicitações, votando nas suas preferidas, etc.

5 Comments

  • Magno Machado
    8/11/2007 - 10:01 | Permalink

    Gostei da idéia, mas penso que uma exceção para campos requeridos que foram deixados em branco é específica demais, o que também não é muito bom na minha opinião.
    Talvez uma para validação de campos de um modo geral, algo como EFieldValidationError, seria melhor, pois daí poderia ser aproveitada para outras validações além da verificação de obrigatoriedade do campo.

  • 8/11/2007 - 12:18 | Permalink

    Campos deixados em branco é algo extremamente comum e tratado por praticamente todo desenvolvedor que trabalha com banco de dados. Por isso, acho que vale a pena uma exceção específica. Mesmo porque, se não for específica, você vai precisar tratar a mensagem para saber qual o problema. Isso sim é muito ruim.

    Mas acho uma boa idéia que essa exceção para campos requeridos seja descendente de EFieldValidationError.

  • Giba do news Delphi
    19/9/2008 - 09:46 | Permalink

    Pronto Tio, votei nos dois, muito boa idéia,

    [ ]s
    Giba

  • 2/7/2010 - 17:21 | Permalink

    E ai amigo, procurando uma solução para este problema, me deparei com o seu ticket la no QC. Mas pelo visto não vão resolver isso, afinal, já se passaram 2 aniversários, não é?

    Estou com o mesmo problema aqui e até agora não encontrei uma possível solução pra isso.

    Abraço.

  • Marlon Nardi
    24/7/2011 - 11:44 | Permalink

    Bom dia Erich Nascimento,

    Enquanto o Q.C não é solucionado, rsrs, eu fiz da seguinte maneira:

    Antes de chamar o ApplyUpdates, eu valido os Campos do ClientDataSet com os campos Requeridos:

    Verifica(DataSource);

    function Verifica(DS: TDataSource): Boolean;
    var
    I: Integer;
    begin
    Result:= True;
    for I := 0 to DS.DataSet.FieldCount – 1 do
    if DS.DataSet.Fields[i].Required then
    begin
    //ShowMessage(DS.DataSet.Fields[i].Name);
    if DS.DataSet.Fields[i].AsString = EmptyStr then
    begin
    ShowMessage(‘*Campo Obrigatório não Preenchido: ‘+DS.DataSet.Fields[i].DisplayName+’ ‘);
    Result:= False;
    DS.DataSet.Fields[i].FocusControl;
    Break;
    end;
    end;
    end;

    Att, Marlon Nardi

  • Leave a Reply

    Your email address will not be published. Required fields are marked *

    *

    You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>