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

(Resolvido) Problema com campo DATE nulo e uso da propriedade Fil


Carlos Rocha

Pergunta

Bom, de repente apareceu uma 2 dúvidas que to um tempão e não consigo resolver;

É o seguinte:

Na tabela cadastro, tem o campo datacadastro que é tipo DATE.

No evento onnewrecord do ZQuery, puz:

QryClientesDataCadastro.AsDateTime:= Date;
Bom, na hora que cliko no botão "novo", aparerce a data certinha do dia,' 22/02/2008', no Banco, gravo 1899-12-30. Porem, quando abro o formulario de cadastro e somente visualiso os registros, la estão todos os campos da tabela: Nome, Cpf, Endereco, menos o campo DataCadastro que retorna vazio. Se eu for e trocar a correspondencia do DBedit por exermplo para mostrar o nome, ele aparece. Mas a data,essa não. O que fazer? A outra situação é a seguinte: To abrindo o relatorio com o código:
procedure TfrmPrincipal.ImprimirClick(Sender: TObject);
// var
//  Dia: Integer;
//  Texto: String;
begin
        Texto := '';
        if InputQuery('Digite o Dia para recebimento','Impressão para Recebimento em casa',Texto) then
         begin
            try
                Dia := StrToInt(Texto);
            except
                ShowMessage('Dia inválido!');
                Exit;
            end;
         end
         else
           begin
             Exit;
           end;
         Application.CreateForm(TfrmRelatorio,frmRelatorio);
         if not frmRelatorio.QryClientes.Locate('MelhorDia', Dia, []) then
            begin
                frmRelatorio.Close;
                ShowMessage('Registro não encontrado!');
                Exit;
            end
          else
            begin
                frmRelatorio.QryClientes.Filter   := 'MelhorDia =  ' + inttostr(Dia);
                frmRelatorio.QryClientes.Filtered := true;
           //     frmRelatorio.QryClientes.Filter   := 'ReceberCasa =  SIM';
            //    frmRelatorio.QryClientes.Filtered := true;
                frmRelatorio.QuickRepListagem.PreviewModal;
                frmRelatorio.Free;
            end;
end;
Detalhes:
o texto comentado:
[code]
// var
//  Dia: Integer;
//  Texto: String;
Essas variaveis tiveram que serem declaradas como globais pois na procidure tava dando que elas nunca foram usadas; E... Preciso por essa parte pra funcionar:
//     frmRelatorio.QryClientes.Filter   := 'ReceberCasa =  SIM';
            //    frmRelatorio.QryClientes.Filtered := true;

A query cliente filtrat tb o ReceberCasa com o valor SIM, e do jeito que puz não ta retornando valor mas quando comento, ai retorna.

Como resolver isso?

Editado por Micheus
Título do tópico alterado. Não observação do item 3.6 das regras do forum.
Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

QryClientesDataCadastro.AsDateTime:= Date;

menos o campo DataCadastro que retorna vazio.

experimenta usar

QryClientesDataCadastro.AsDate:= Date;

var

Dia: Integer;

Texto: String;

Essas variaveis tiveram que serem declaradas como globais pois na procidure tava dando que elas nunca foram usadas

isto não é erro, somente um aviso de que elas não foram inicializadas com algum valor.

A query cliente filtrat tb o ReceberCasa com o valor SIM, e do jeito que puz não ta retornando valor mas quando comento, ai retorna.

frmRelatorio.QryClientes.Filter := 'ReceberCasa = SIM';

frmRelatorio.QryClientes.Filtered := true;

Tenta dessa maneira:

frmRelatorio.QryClientes.Filter   := 'ReceberCasa = '+'''SIM''';
frmRelatorio.QryClientes.Filtered := true;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Desse jeito,

begin
                frmRelatorio.QryClientes.Filter   := 'MelhorDia =  ' + inttostr(Dia);
                frmRelatorio.QryClientes.Filtered := true;
//              frmRelatorio.QryClientes.Filter   := 'ReceberCasa =  SIM';
                frmRelatorio.QryClientes.Filter   := 'ReceberCasa = '+'''SIM''';
                frmRelatorio.QryClientes.Filtered := true;
                frmRelatorio.QuickRepListagem.PreviewModal;
                frmRelatorio.Free;
            end;

ele esta desconsiderando o o primeiro filtro MelhorDia, só ta filtrando o SIM

Link para o comentário
Compartilhar em outros sites

  • 0

Tenta dessa maneira:

begin

frmRelatorio.QryClientes.Filter := 'MelhorDia = ' + inttostr(Dia);

frmRelatorio.QryClientes.Filter := 'ReceberCasa = '+'''SIM''';

frmRelatorio.QryClientes.Filtered := true;

frmRelatorio.QuickRepListagem.PreviewModal;

frmRelatorio.Free;

end;

exemplo:

procedure TForm1.Button1Click(Sender: TObject);
var a : integer;
begin
   a := 2;
   query1.Filter := 'PAPEL = ' + '''não CONSTA''';   /// primeiro campo da tabela
   query1.Filter := 'NUM = ' + inttostr(a);               /// ultimo campo da tabela
end;

OBS: Veja qual campo vem primeiro.... a inversão os campos pode não dar os resultados esperados

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Seguinte:

Na tabela

14º campo ReceberCasa

15º campo MelhorDia

fiz assim

procedure TfrmPrincipal.ImprimirClick(Sender: TObject);
var
  Dia: Integer;
  Texto: String;
begin
        Texto := '';
        if InputQuery('Digite o Dia para recebimento','Impressão para Recebimento em casa',Texto) then
         begin
            try
                Dia := StrToInt(Texto);
            except
                ShowMessage('Dia inválido!');
                Exit;
            end;
         end
         else
           begin
             Exit;
           end;
         Application.CreateForm(TfrmRelatorio,frmRelatorio);
         if not frmRelatorio.QryClientes.Locate('MelhorDia', Dia, []) then
            begin
                frmRelatorio.Close;
                ShowMessage('Registro não encontrado!');
                Exit;
            end
          else
            begin
                frmRelatorio.QryClientes.Filter := 'ReceberCasa = '+'''SIM''';
                frmRelatorio.QryClientes.Filtered := true;                
                frmRelatorio.QryClientes.Filter   := 'MelhorDia =  ' + inttostr(Dia);
                frmRelatorio.QryClientes.Filtered := true;
                frmRelatorio.QuickRepListagem.PreviewModal;
                frmRelatorio.Free;
            end;
end;

Continua desconsiderando o SIM.

Compila sem erro, roda sem erro mas não filtra o SIM

Link para o comentário
Compartilhar em outros sites

  • 0

No exemlo que te passei, funciona certinho ...

Como esta é pra funcionar

begin
   frmRelatorio.QryClientes.First;

   frmRelatorio.QryClientes.Filtered := true;   
   frmRelatorio.QryClientes.Filter := 'ReceberCasa = '+'''SIM''';
   frmRelatorio.QryClientes.Filter := 'MelhorDia = ' + inttostr(Dia);

   frmRelatorio.QuickRepListagem.PreviewModal;
   frmRelatorio.Free;
end;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
Bom, de repente apareceu uma 2 dúvidas que to um tempão e não consigo resolver;
A título de sugestão a todos que lêem este tópico, e procurando facilitar futuras pesquisas por outros colegas em busca de solução, eu sugeriria que quando as dúvidas forem de assuntos distintos que sejam postadas separadamente. ;)

Na tabela cadastro, tem o campo datacadastro que é tipo DATE.

No evento onnewrecord do ZQuery, puz:

QryClientesDataCadastro.AsDateTime:= Date;
Bom, na hora que cliko no botão "novo", aparerce a data certinha do dia,' 22/02/2008', no Banco, gravo 1899-12-30. Porem, quando abro o formulario de cadastro e somente visualiso os registros, la estão todos os campos da tabela: Nome, Cpf, Endereco, menos o campo DataCadastro que retorna vazio.
1899-12-30 é a data quando o campo tipo DATE está nulo ou é 0 (zero), o que implica que esta atribuição não está sendo aplicada. É estranho que num segundo cadastro funcione, já que esta atribuição ocorrerá sempre após um Insert ou Append. Deve haver algum detalhe que você esteja esquecendo...
To abrindo o relatorio com o código:
procedure TfrmPrincipal.ImprimirClick(Sender: TObject);
// var
//  Dia: Integer;
//  Texto: String;
begin
        Texto := '';
        if InputQuery('Digite o Dia para recebimento','Impressão para Recebimento em casa',Texto) then
         begin
            try
                Dia := StrToInt(Texto);
            except
                ShowMessage('Dia inválido!');
                Exit;
            end;
...
end;
Essas variaveis tiveram que serem declaradas como globais pois na procidure tava dando que elas nunca foram usadas;
Como disse o Jhonas, é só um aviso. E se você olhar bem para o código, você realmente não faz nada com elas. Até está atribuindo um valor a Dia, mas não a usa para mais nada, logo, o compilador lhe adverte (warning) para que você verifique de que é realmente isto que você quer.
Desse jeito,
begin
    frmRelatorio.QryClientes.Filter   := 'MelhorDia =  ' + inttostr(Dia);
    frmRelatorio.QryClientes.Filtered := true;
//    frmRelatorio.QryClientes.Filter   := 'ReceberCasa =  SIM';
    frmRelatorio.QryClientes.Filter   := 'ReceberCasa = '+'''SIM''';
    frmRelatorio.QryClientes.Filtered := true;
    frmRelatorio.QuickRepListagem.PreviewModal;
    frmRelatorio.Free;
end;
ele esta desconsiderando o o primeiro filtro MelhorDia, só ta filtrando o SIM
Esta questão do filtro, me parece estar sendo mau compreendida. Observem que a propriedade Filter é sobre-escrita a cada atribuição, logo, apenas a última será aplicada. Para aplicar mais que uma condição, seria necessário fazer a composição delas em uma única atribuição. Algo como:
frmRelatorio.QryClientes.Filter   := '(MelhorDia = ' + IntToStr(Dia) + ') AND (ReceberCasa = '+'''SIM'')';

Mas, se você está utilizando esta query apenas para o relatório (é o que parece), prefira fazer este filtro utilizando a cláusula WHERE da instrução SQL. Assim, você estará restringindo o resultado, retornando apenas os registros que satisfazem esta condição. Da forma como está, você busca muito mais registro e depois aplica um filtro em run-time sobre o resultado. O Filter é bastante útil quando você trabalha com componentes do tipo Table.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Michaels :blink:

Da uma luz ai de como ficaria esse filtro c om clausula were?
Carlos, pressupondo que você adicionou em design-time a instrução SQL que seleciona os dados do cliente na propriedade SQL do componente QryClientes e como não sei exatamente o que lá tem, vou exemplificar apenas (não siga ao pé da letra). Acrescente à sua instrução SQL esta parte:

SELECT ....
WHERE MelhorDia = :Dia
  AND ReceberCasa = "SIM"
ORDER BY ....
depois no código, você inicializa o parâmetro Dia do modo como sempre aparece por aqui no forum:
begin
  with frmRelatorio do
  begin
   // inicializamos o parâmetro
    QryClientes.ParamByName('Dia').AsInteger  := Dia;
   // usar o Open aqui, caso você não o coloque na inicialização do relatório
    QryClientes.Open;
   // mostramos o relatório
    QuickRepListagem.PreviewModal;
    Free;
end;

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Tentei dessa forma e ainda não deu.

Retorna vazio o Relatorio. Porem, se eu tirar o ReceberCasa = SIM, ai ele retorna o valor

procedure TfrmPrincipal.ImprimirClick(Sender: TObject);
var
  Dia: Integer;
  Texto: String;
  Receber : String;
begin
        Texto := '';
        if InputQuery('Digite o Dia para recebimento','Impressão para Recebimento em casa',Texto) then
         begin
            try
                Dia := StrToInt(Texto);
            except
                ShowMessage('Dia inválido!');
                Exit;
            end;
         end
         else
           begin
             Exit;
           end;
         Application.CreateForm(TfrmRelatorio,frmRelatorio);
         if not frmRelatorio.QryClientes.Locate('MelhorDia', Dia, []) then
            begin
                frmRelatorio.Close;
                ShowMessage('Registro não encontrado!');
                Exit;
            end
          else
            begin
            frmRelatorio.QryClientes.First;
            frmRelatorio.QryClientes.SQL.Add('Select * from Clientes where MelhorDia = :Dia AND ReceberCasa = Receber order by Bairro');
            Receber := 'SIM';
            with frmRelatorio do
              begin
               // inicializamos o parâmetro
                frmRelatorio.QryClientes.ParamByName('Dia').AsInteger  := Dia;
               // usar o Open aqui, caso você não o coloque na inicialização do relatório
              //  frmRelatorio.QryClientes.Open;
               // mostramos o relatório
                QuickRepListagem.PreviewModal;
                Free;
              end;
          end;
end;

Link para o comentário
Compartilhar em outros sites

  • 0

Consegui>

Como não consegui fazer emitir 2 filtros a partir do frmPrincipal para lança-lo nio frmRelatorio, isei:

frmPrincipal:

Apenas 1 filtro

frmRelatorio.QryClientes.Filter   := 'MelhorDia =  ' + inttostr(Dia);
                frmRelatorio.QryClientes.Filtered := true;
                frmRelatorio.QuickRepListagem.PreviewModal;
                frmRelatorio.Free;
E no frmRelatorio, na qryClientes de la puz na propriedade Sql:
Select * from clientes where ReceberCasa= "Sim"

Ai deu certo.

Obrigado a todos.

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
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...