Ir para conteúdo
Fórum Script Brasil
  • 0

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


Lazaruz

Pergunta

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?

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 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

Link para o comentário
Compartilhar em outros 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.

 

Editado por Lazaruz
complemento
Link para o comentário
Compartilhar em outros 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

Link para o comentário
Compartilhar em outros 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

 

Link para o comentário
Compartilhar em outros 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.

 

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...