Jump to content
Fórum Script Brasil
  • 0

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


Carlos Rocha

Question

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?

Edited by Micheus
Título do tópico alterado. Não observação do item 3.6 das regras do forum.
Link to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
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
      152k
    • Total Posts
      651.5k
×
×
  • Create New...