Jump to content
Fórum Script Brasil
  • 0
Lazaruz

(Resolvido) Lazaruz - Propriedade Required da Query não surte efeito

Question

Olá!

 

 Ao utilizar Delphi eu assignava true na propriedade Required dos campos de Query e em modo runtime barrava situação  de campo em branco automaticamente

sem ter de escrever nada nos edits. É um recurso prático e simples.

 Isto não esta fazendo efeito no Lazaruz 1.6. com ZQuery.

 alguém saberia se tenho que setar mais algo?

Share this post


Link to post
Share on other sites

6 answers to this question

Recommended Posts

  • 0

Voce leu o Help sobre essa informação ?

Specifies whether a nonblank value for a field is required. 

Delphi syntax:

property Required: Boolean;

C++ syntax:

__property bool Required = {read=FRequired, write=FRequired, default=0};

Description

Use Required to find out if a field requires a value or if the field can be blank.

If a field is created with the Fields editor, this property is set based on the 
underlying table. Applications that set Required to true for fields that must 
have values (for example, a password or part number), but for which the underlying 
table does not require the field, must write an OnValidate event handler to enforce
the property. 

When the Required property reflects a property of the underlying database table, 
trying to post a null value causes an exception to be raised. Applications that 
set the Required property to true when the underlying table does not require the 
field, should raise an EDatabaseError exception on null values in the OnValidate 
event handler in order to achieve the same result.
Os aplicativos que configuram Required como true para campos que 
devem ter valores (por exemplo, uma senha ou número de peça), mas
para os quais a tabela subjacente não exige o campo, devem gravar 
um manipulador de eventos OnValidate para impor a propriedade.
Evento OnValidate

Descrição

Escreva um manipulador de eventos OnValidate para validar as alterações 
feitas nos dados no campo, imediatamente antes de os dados serem gravados 
no buffer de registro atual. A propriedade EditMask permite a validação 
dos dados caractere por caractere enquanto está sendo inserido pelo usuário. 
OnValidate permite que um aplicativo valide os dados como um todo.

Quando o valor de um componente de campo é atribuído programaticamente, 
a validação pelo EditMask é ignorada, pois não há controle com reconhecimento 
de dados para impor a adesão à máscara. OnValidate permite que um aplicativo 
valide esses dados antes de serem postados na tabela do banco de dados.

Para rejeitar o valor atual do campo do manipulador de eventos OnValidate, 
crie uma exceção.

Ao gravar o valor de um campo no buffer de registro atual, ocorrem as seguintes etapas:

1 O manipulador de eventos OnValidate é chamado para validar os dados.
2 Se o manipulador de eventos OnValidate não gerar uma exceção, os dados 
serão gravados no buffer de registro atual.
3 Se a gravação dos dados não gerar uma exceção, o manipulador de eventos do 
OnChange é chamado para permitir uma resposta à alteração.

abraço

Share this post


Link to post
Share on other sites
  • 0

Não sei porque esses compiladores mais novos não faz mais como antes. Tem coisas que não  da para entender. No D-5 era so mesmo eu assignar o required e vinha MSG padrão, dai era só traduzir o arquivo de mensagens.  Bem.... vamos lá..

 

|Para testar campo mandatório

tentei isto, mas  não funcionou.

 

procedure ZQueryTIPOValidate(Sender: TField);
begin

 if ZQuery.FieldByName('TIPO').Required then
       begin

           if ZQuery.FieldByName('TIPO').IsNull then
           begin
                Raise exception.create('CAMPO OBRIGATORIO.'#10);

           end;

       end;

  

end;

 

  Obs : Não estou  utilizando nenhum componente TEdit,    e  somente edição em DBgrid.

 

Edited by Lazaruz
complemento

Share this post


Link to post
Share on other sites
  • 0

Para que isso funcione, o campo da sua tabela  no  seu banco de dados, deve estar configurado como Not Null

ou então utilize o evento OnColEnter do DbGrid

nesse evento, quando voce sair da coluna, voce testa se o campo está vazio. 

abraço

Share this post


Link to post
Share on other sites
  • 0

ok... voce pode usar esse evento tambem, mas eu prefiro usar o evento OnColEnter

vou dar um exemplo:

vamos imaginar que a coluna 4  do seu dbgrid seja o campo "TIPO" e que seja necessario que ele sempre tenha algum valor

Então quando o Cursor entrar na coluna 5, voce testa para saber se existe algum valor no campo da coluna 4.  Se não existir, voce mostra uma mensagem e retorna o cursor para o campo da coluna 4.

if DBGrid1.SelectedIndex = 5 then   
   begin
      if CDS_TabelaTIPO.Value = '' then
         begin
            MessageDlg('DIGITE UM VALOR PARA TIPO',
                  mtInformation,[mbOk], 0);
            DBGrid1.SelectedIndex := 4;  
            EXIT;
          end;   
   end;

oBS: Veja que estou testando o campo da tabela pelo ClientDataSet que esta linkado a um componente DataSetProvider e um Zquery, mas voce pode fazer a mesma coisa somente  pelo Zquery

abraço

 

Share this post


Link to post
Share on other sites
  • 0

Obrigado Jhonas, realmente este procedimento irei precisar mais a frente, mas é bom saber que da para fazer por ele.

Eu já ia mesmo apresentar o meu resultado baseado no DOC que postou , onde diz que em resumo entende-se que não só assignar Required só, não faz o efeito, tendo  então eu adaptei um ex. que vi em algum outro lugar e ficou bem simples e construi em um função global que agente pode reuzar em qualquer DataSet:

               //Se for em um arquivo de funcoes simples:

unit UnFUNCOES;
 
{$mode objfpc}{$H+}

interface

USES  
 Classes, sysutils,Dialogs,ZDataset,Forms,Db{TField};   
  //Declara:
     function ValidaEntradas(Dset:TDataSet): Boolean;

      //Varre todos os campos do DataSet e Checa quais tem Required
function ValidaEntradas(Dset:TDataSet): Boolean;
var
  i :Integer;
  Campos :TStrings;
begin

  try
    Campos := TStringList.Create;  //Cria cx de MSGs e guardo os campos 
                                   //requeridos depois mostro a lista
    for i:=0 to Dset.Fields.Count-1 do
    begin
      if Dset.Fields[i].Required then
      begin
         if (Dset.Fields[i].AsString=EmptyStr) then
            Campos.Add(Dset.Fields[i].DisplayName);
      end;
    end;

    if (Campos.Text<>Emptystr) then
    begin    //indice é a posicao na lista.
      Campos.Insert(0, '  Campos mantatórios:');
      Campos.Insert(1, EmptyStr);

      ShowMessage(Campos.Text);

      result := false;
    end

    else result := true;

  finally

    Campos.Free;

  end;

 end;

END.

Usando dentro de um Datamodule:
procedure TDataModule1.Query1BeforePost(DataSet: TDataSet);
BEGIN

  if not ValidaEntradas(DataModule1.Query1) then
  Abort; //congela e mantem tela de edicao, mesmo se for no Grid


END;

Agora ficou universal e perfeito.

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.




  • Forum Statistics

    • Total Topics
      148383
    • Total Posts
      643767
×
×
  • Create New...