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

Quickreport


Eder

Pergunta

Ola..pessoal..

Fiz um relatorio aparentemente simples no quickreport.....está relacionado na query 2 tabelas...(masterDetalhes)

Na banda sumary coloquei um

qrexp = SUM(query1.KM)
pra somar a km do vendedor percorreu....

então o relatorio fica com o seguinte layout:

primeiro coloca o dia

logo abaixo nome do vendedor...ao lado a data e o km...

logo abaixo lista as visitas que efetuou ao cliente naquele dia acima.

no final existe a banda sumary que tem um qrexpre que totaliza o KM do periodo....o problema é queo KM conta o KM * o nr de registros inseridos.....

exemplo: se o camarada fez 10 km e efetuou 3 visitas ele conta km=30

Algguem poderia me dizer porque acontece isto??

segue codigo abaixo que gera o relatorio:

procedure TFormR11CVisita.XiButton1Click(Sender: TObject);

var Txt:String;

begin

If DateTimePicker2.Date < DateTimePicker1.Date Then

begin

ShowMessage('Intervalo de datas Inválido, a data Inicial é maior que a data Final!');

DateTimePicker2.Date := DateTimePicker1.Date;

exit;

end;

IF DbVendedor.Text = 'TODOS' THEN

Begin

TXT := 'Select * from VISITA, IT_VISITA where '+

'(Visita.codigo = It_visita.CodVisita) and '+

'(Visita.data between :datai and :dataf) order '+

'by Visita.Vendedor, Visita.data';

end

else

Begin

TXT := 'Select * from VISITA, IT_VISITA where '+

'(Visita.codigo = It_visita.CodVisita) and '+

'(Visita.Vendedor = ' + QuotedStr(DbVendedor.text)+ ') and '+

'(Visita.data between :datai and :dataf) order '+

'by Visita.Vendedor, Visita.data';

End;

FormR1CVisita.Query1.Close;

FormR1CVisita.Query1.SQL.Text := Txt;

FormR1CVisita.Query1.ParamByName('datai').AsDate := DateTimePicker1.Date;

FormR1CVisita.Query1.ParamByName('dataf').AsDate := DateTimePicker2.Date;

FormR1CVisita.Query1.Open;

//

If FormR1CVisita.Query1.IsEmpty Then

begin

ShowMessage('Nenhum Registro Encontrado!');

exit;

end;

FormR1CVisita.quickrep1.preview;

END;

Grato

Link para o comentário
Compartilhar em outros sites

21 respostass a esta questão

Posts Recomendados

  • 0

Olá Eder,

No caso, cada visita seria um registro???

o que está acontecendo, é que sua select esta repetindo o campo KM pra cada registro de visita, tipo:

vendedor1----visita1----10

vendedor1----visita2----10

vendedor1----visita3----10

E talvez a solução seria dividir essa select em duas Queryes.

abraços. Progr'amador.

B)

Link para o comentário
Compartilhar em outros sites

  • 0

E ai...Programador..beleza?

Carinha

No caso, cada visita seria um registro???

Resposta: não....eu lanço primeiro o
vendedor, data e o km

e abaixo atraves de uma tabela masterdetalhes eu lanço as visitas:

exemplo:

============================

VENDEDOR: ZE DATA: 25/02/2007 KM: 210

============================

VISITA-ITEM_VISITA-CLIENTE - PRODUTO

-------------------------------------------------

000001 0001 LOJA DO ZE FEIJÃO

000001 0002 BAZAR MA ARROZ

000001 0003 BAR DO K CERVEJA

ai você diz em: E talvez a solução seria dividir essa select em duas Queryes.

Como fazer isto?

Poderias da uma ajudinha...não fiz com duas queries???

Mas não tem jeito com apenas uma query?? parece tão simplinho o relatorio!!!

muito Grato..t+

Link para o comentário
Compartilhar em outros sites

  • 0
No caso, cada visita seria um registro???
Resposta: não....eu lanço primeiro o
vendedor, data e o km

e abaixo atraves de uma tabela masterdetalhes eu lanço as visitas:

exemplo:

============================

VENDEDOR: ZE DATA: 25/02/2007 KM: 210

============================

VISITA-ITEM_VISITA-CLIENTE - PRODUTO

-------------------------------------------------

000001 0001 LOJA DO ZE FEIJÃO

000001 0002 BAZAR MA ARROZ

000001 0003 BAR DO K CERVEJA

Olá Eder,

Era isso que eu tava falando,

diga uma coisa: em que tabela fica esses campos? seria KM em tabela VISITA e as visitas na tabela IT_VISITA?

Sua select é essa: Select * from VISITA, IT_VISITA where ...

Se for, sua select está resultando assim:

VENDEDOR  DATA          KM   VISITA  ITEM_VISITA   CLIENTE         PRODUTO
ZE        25/02/2007    210  000001  0001          LOJA DO ZE      FEIJÃO
ZE        25/02/2007    210  000001  0002          BAZAR MA        ARROZ
ZE        25/02/2007    210  000001  0003          BAR DO K-       CERVEJA

abraços Progr'amador.

B)

Link para o comentário
Compartilhar em outros sites

  • 0
Sim...é exatamente como você colocou.....por isto ele pega o km x o nr de registros....

Mas..Programador....você teria alguma idéia pra resolver este probleminha??

Grato

Olá Eder,

Como eu já havia dito, a solução é usar duas Querys uma pra tabela VISITA e outra pra tabela IT_VISITA

Qualquer dúvida, posta aí!

abraços Progr'amador.

B)

Link para o comentário
Compartilhar em outros sites

  • 0
Como eu já havia dito, a solução é usar duas Querys uma pra tabela VISITA e outra pra tabela IT_VISITA

Qualquer dúvida, posta aí!

Ok..isto entendi...porem eu gostaria se você puder é claro...que você me desse uma dica, um exemplo de como trabalhar com duas queries no mesmo relatorio...EU NUNCA FIZ ISTO..nem imagino...pois sei que o quickrep1 é igual a apenas uma QUERY....então não sei como resolver..

Poderias me ajudar??

Abraços..e muito Grato :unsure:

Link para o comentário
Compartilhar em outros sites

  • 0
..., um exemplo de como trabalhar com duas queries no mesmo relatorio...EU NUNCA FIZ ISTO..nem imagino...pois sei que o quickrep1 é igual a apenas uma QUERY....então não sei como resolver..
Sem querer interferir, mas só para ir adiantando, você poderia utilizar o mesmo conceito do item 2 neste post

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Micheus

beleza??

Obrigado em responder..

Carinha....tentei...tentei e não consigui fazer funcionar...acredito que é por causa do meu layout do quick ou algo parecido...codigo de impressão....sei lá.

Particularmente não gosto de trabalhar com Table no quick.....não sei mexer muito bem com este componente no quick...gosto da query...acho mais facil e pratica...pra mim que sou fã de delphi..porem não sou programador(conhecedor). apenas faço algumas aplicações aqui na empresa...para resolver problemas com falta de informações....bom....................

Não teria uma maneira de fazer este processo mais simples com query???

Veja bem....agora eu tenho um leyout prontinho....do quick...ligado a uma query=quickrep1

e num outro form anterior a este eu processo o relatorio atraves de um botão de IMPRIMIR...neste botão tenho o seguindo codigo:

IF DbVendedor.Text = 'TODOS' THEN

Begin

TXT := 'Select * from VISITA, IT_VISITA where '+

'(Visita.codigo = It_visita.CodVisita) and '+

'(Visita.data between :datai and :dataf) order '+

'by Visita.Vendedor, Visita.data';

end

else

Begin

TXT := 'Select * from VISITA, IT_VISITA where '+

'(Visita.codigo = It_visita.CodVisita) and '+

'(Visita.Vendedor = ' + QuotedStr(DbVendedor.text)+ ') and '+

'(Visita.data between :datai and :dataf) order '+

'by Visita.Vendedor, Visita.data';

End;

FormR1CVisita.Query1.Close;

FormR1CVisita.Query1.SQL.Text := Txt;

FormR1CVisita.Query1.ParamByName('datai').AsDate := DateTimePicker1.Date;

FormR1CVisita.Query1.ParamByName('dataf').AsDate := DateTimePicker2.Date;

FormR1CVisita.Query1.Open;

//

If FormR1CVisita.Query1.IsEmpty Then

begin

ShowMessage('Nenhum Registro Encontrado!');

exit;

end;

FormR1CVisita.quickrep1.preview;

END;

Eu costumo trabalhar com o codigo direto no botão...é claro que devido a complexidade do relatorio as vezes tenho que fazer algumas modificações...acredito que este do tópico ..também tenho que mudar algo....

Tens alguma idéia pra aproveitar o meu raciocinio.....pra não ter que começar do zero o relatorio já que só falta este detalhe da KM sair duplicando??

Agora se não tiver ai.......hehehe...ai to ferrado....

B0m É isto ai....amigão...um abraço e muito grato mais uma vez....

:D

Link para o comentário
Compartilhar em outros sites

  • 0
Não teria uma maneira de fazer este processo mais simples com query???

Olá Eder,

Em Tutoriais & Dicas, tem um exemplo bem simples usando DUAS Queryes (Link abaixo), siga passa a passo usando as suas tabelas que vai da certo, observe todos os detalhes sem pressa. Procure fazer do zero (Um novo relatorio), e não esqueça de fazer um backup antes. ;)

Criando Um Relatório no QuickReport Passo a Passo

abraços Progr'amador.

B)

Link para o comentário
Compartilhar em outros sites

  • 0

Programador...amigão..não está fácil...tou tentando....dentro do seu exemplo fiz e deu certo...mas no meu caso ...não está dando......

mas tudo bem....deixa pra lá.....

Valeu a tentativa....obrigado a você e o Michel...

Talvez outro dia dou mais uma olhada.....hoje já tou com a cuca cheia...agora...não me conforme com o seguinte ...tenho o relatorio prontinho....certinho.....ele relaciona por dia o que o vendedor visitou de clientes.....um relatorio bonitinho,,,mas só por causa do km....duplicar....bom deixa pra lá........tenho que descansar um pouco ...senão vou pirar....rsrsrs;

t+;;abraços;.

Link para o comentário
Compartilhar em outros sites

  • 0
Programador...amigão..não está fácil...tou tentando....dentro do seu exemplo fiz e deu certo...mas no meu caso ...não está dando......

mas tudo bem....deixa pra lá.....

Valeu a tentativa....obrigado a você e o Michel...

Talvez outro dia dou mais uma olhada.....hoje já tou com a cuca cheia...agora...não me conforme com o seguinte ...tenho o relatorio prontinho....certinho.....ele relaciona por dia o que o vendedor visitou de clientes.....um relatorio bonitinho,,,mas só por causa do km....duplicar....bom deixa pra lá........tenho que descansar um pouco ...senão vou pirar....rsrsrs;

t+;;abraços;.

Não!!!, não desista!

Vamos fazer o seguinte:

Use o mesmo relatorio que você tava usando, (faça um Backup antes)

Vamos muda um pouco a estrutura dele.

Adicione outra Query, vou chamar as Queryes de QryVisita e QryItVisita e um Data Source (DataSource1) ligado à QryVisita.

Na opção DataSet do QuickRep1 coloque a query QryViSita.

E nas Querys coloque (no Object Inspector):

------------------------------------------------------

QryViSita:

SQL:

Select * from VISITA

where vendedor like :vendedor and

data between :datai and :dataf

order by Vendedor, data

Params:
vendedor : ftString

datai : ftDate

dataf : ftDate

------------------------------------------------------

QryItVisita:

SQL:

Select * from VISITA where CodVisita = :codigo
Params:
codigo : ftInteger

DataSource : DataSource1

------------------------------------------------------

Substitua os DataSet dos seus QRDBText de acordo com as suas Querys

e o codigo a baixo:

var vendedor : string;
begin
  if DbVendedor.Text = 'TODOS' then
     vendedor := '%'
  else vendedor := DbVendedor.Text;

  with FormR1CVisita do begin
     QryVisita.Close;
     QryVisita.ParamByName('datai').AsDate := DateTimePicker1.Date;
     QryVisita.ParamByName('dataf').AsDate := DateTimePicker2.Date;
     QryVisita.Open;

     QryItVisita.Close;
     QryItVisita.Open;

     if QryVisita.RecordCount > 0 then
         QuickRep1.Preview
     else begin
        ShowMessage('Nenhum Registro Encontrado!');
        exit;
     end;
  end;
ou se preferir montar as querys em tempo de execução:
var txt1, txt2, vendedor : string;
begin
  if DbVendedor.Text = 'TODOS' then
      vendedor := '%'
  else vendedor := DbVendedor.Text;

  txt1 := 'Select * from VISITA ' +
          'where vendedor like '+QuotedStr(vendedor)+' and ' +
          '      data between :datai and :dataf' +
          'order by Vendedor, data';

  txt2 := 'Select * from VISITA ' +
          'where CodVisita = :cod';

  with FormR1CVisita do begin
     QryVisita.Close;
     QryVisita.SQL.Clear;
     QryVisita.SQL.Add(txt1);
     QryVisita.ParamByName('datai').AsDate := DateTimePicker1.Date;
     QryVisita.ParamByName('dataf').AsDate := DateTimePicker2.Date;
     QryVisita.Open;

     QryItVisita.Close;
     QryItVisita.SQL.Clear;
     QryItVisita.SQL.Add(txt2);
     QryItVisita.ParamByName('cod').AsInteger := QryVisita.FieldByName('codigo').AsInteger;
     QryItVisita.Open;

     if QryVisita.RecordCount > 0 then
        QuickRep1.Preview
     else begin
        ShowMessage('Nenhum Registro Encontrado!');
        exit;
     end;
  end;

quaisquer dúvidas em um dos pontos, pode perguntar mesmo!

abraços Progr'amador.

B)

abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Beleza...Amigão...sua reposta me deixou animado......então fiz o exemplo porem aqui você diz que:

QryItVisita:

SQL:

QUOTE

Select * from VISITA where CodVisita = :codigo

Resposta: aqui não seria: a tabela ITVISITA ???

Então coloquei esta ITVISITA e usei o codigo no botão:

procedure TFormR11CVisita.XiButton1Click(Sender: TObject);

var vendedor : string;

begin

if DbVendedor.Text = 'TODOS' then

vendedor := '%'

else vendedor := DbVendedor.Text;

with FormR1CVisita do begin

QryVisita.Close;

QryVisita.ParamByName('datai').AsDate := DateTimePicker1.Date;

QryVisita.ParamByName('dataf').AsDate := DateTimePicker2.Date;

QryVisita.Open;

QryItVisita.Close;

QryItVisita.Open;

if QryVisita.RecordCount > 0 then

QuickRep1.Preview

else begin

ShowMessage('Nenhum Registro Encontrado!');

exit;

end;

end;

END;

ai testei o relatorio e ele me informou que NÃO EXISTE REGISTRO..mas existe

AI TESTEI o outro codigo em tempo de execução:

também mudei este codigo achei que tava errado né?

txt2 := 'Select * from VISITA ' +

'where CodVisita = :cod';

referencia a tabela ITVISITA

ai deu erro na hora de clicka no botão:

qryvisita parameto dataf não encontrado, mas está la....

Olhei o resto e parece que está tudo certinho...repassei todos os seus passos e também esta ok...

:unsure:

Link para o comentário
Compartilhar em outros sites

  • 0
Resposta: aqui não seria: a tabela ITVISITA ???
Isso mesmo, foi erro meu.

ai testei o relatorio e ele me informou que NÃO EXISTE REGISTRO..mas existe
já ocorreu comigo (não sei se era bug) um fato desse, de ter registro e o RecordCount esta com valor -1 :huh:

Então faz da forma você tinha feito, usando a função IsEmpty:

If Query1.IsEmpty Then begin
   ShowMessage('Nenhum Registro Encontrado!');
  exit;
end;

quickrep1.preview;

Quanto ao erro: qryvisita parameto dataf não encontrado deve esta faltando algum atributo aí!

Tenta ai a primeira opção.

abraços Progr'amador.

B)

Link para o comentário
Compartilhar em outros sites

  • 0

Carinha...beleza???

Mudei como havia me dito e dei umas 3 olhadas gerais...passo a passo em todos os itens...e não achei nada de diferente......mas agora a mensagem dizendo que não existe não aparece mais ....em contrapartida...o relatorio sai vazio.....sem dados..MAS TEM DADOS nas tabelas...

codigo:

procedure TFormR11CVisita.XiButton1Click(Sender: TObject);

var vendedor : string;

begin

if DbVendedor.Text = 'TODOS' then

vendedor := '%'

else vendedor := DbVendedor.Text;

with FormR1CVisita do begin

QryVisita.Close;

QryVisita.ParamByName('datai').AsDate := DateTimePicker1.Date;

QryVisita.ParamByName('dataf').AsDate := DateTimePicker2.Date;

QryVisita.Open;

QryItVisita.Close;

QryItVisita.Open;

If QryVisita.IsEmpty Then

QuickRep1.Preview

else begin

ShowMessage('Nenhum Registro Encontrado!');

exit;

end;

end;

END;

Estranho Né?

Acontece coisas em programação...que não da pra entender!!

Mudei até o layout do quickrep...pois era diferente do seu....fiz igual ao seu...mas não sai os dados....olhei os qrtexts emfim já nem sei mais o que olhar...

:(

Link para o comentário
Compartilhar em outros sites

  • 0
...mas agora a mensagem dizendo que não existe não aparece mais ....em contrapartida...o relatorio sai vazio.....sem dados..

...
  If QryVisita.IsEmpty Then 
    QuickRep1.Preview
  else begin
    ShowMessage('Nenhum Registro Encontrado!');
    exit;
  end;
...
Estranho Né? Acontece coisas em programação...que não da pra entender!!
Não é estranho não. você fez o contrário do que o Progr'amador sugeriu. Tem que ser assim:
...
  If NOT QryVisita.IsEmpty Then 
    QuickRep1.Preview
  else begin
    ShowMessage('Nenhum Registro Encontrado!');
    exit;
  end;
...

Observe o Not Empty - visualiza se não estiver vazio.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Ops...Michel...Troquei as bolas aqui...na verdade colei incorretamente....

você Tem razão.....Porem o relatorio não funca mesmo....ele me diz que NÃO EXISTE REGISTRO porem existe.......

codigo completinho:

procedure TFormR11CVisita.XiButton1Click(Sender: TObject);

var vendedor : string;

begin

if DbVendedor.Text = 'TODOS' then

vendedor := '%'

else vendedor := DbVendedor.Text;

with FormR1CVisita do begin

QryVisita.Close;

QryVisita.ParamByName('datai').AsDate := DateTimePicker1.Date;

QryVisita.ParamByName('dataf').AsDate := DateTimePicker2.Date;

QryVisita.Open;

QryItVisita.Close;

QryItVisita.Open;

If NOT QryVisita.IsEmpty Then

QuickRep1.Preview

else begin

ShowMessage('Nenhum Registro Encontrado!');

exit;

end;

end;

End;

Não sei mais o que pensar..... :(

Link para o comentário
Compartilhar em outros sites

  • 0

ola...segue abaixo pra ajudar a estrutura das tabelas...

Tabela: VISITA.DB

codigo

data

filial

vendedor

km

Tabela> ITVISITA.DB

CodItem

CodVisita (relacionamento)

TipoVisita

Clientes

etc...........................

Bom é isto ai colegas...se tiverem mais alguma ideia..por favor manda ai....vou tentando por aqui também.....muito grato a todos....t+

Link para o comentário
Compartilhar em outros sites

  • 0

opa......beleza??

Na opção DataSet do QuickRep1 coloque a query QryViSita.
Com certeza.

Amigão..só não entendi o seguinte.....aonde esta o relacionamento...entre a a tabela visita e itvisita?

na QryItVisita NOS parametros?? é isto??

Select * from ITVISITA where CodVisita = :codigo

Será que eu não poderia te mandar via email as tabelas e parte do aplicativo pra você dar uma olhadinha?? porque não sei mas aonde mexer..

Bom..é isto ai...valeu..e otima semana de trampo..t+

Link para o comentário
Compartilhar em outros sites

  • 0

Amigão..só não entendi o seguinte.....aonde esta o relacionamento...entre a a tabela visita e itvisita?

na QryItVisita NOS parametros?? é isto??

Select * from ITVISITA where CodVisita = :codigo

Olá Eder,

você colocou na opção DataSource da QryItVisita o DataSource1 que esta ligado a QryVisita???

é isso que fará o relacionamento.

Será que eu não poderia te mandar via email as tabelas e parte do aplicativo pra você dar uma olhadinha?? porque não sei mas aonde mexer..
Pode mandar.

elienai@tj.ro.gov.br

Obs. Esse e-mail tem bloqueios para certos arquivos, então se você mandar zipado (.ZIP), tem que renomear mudando o tipo de arquivo para txt por exemplo, tipo Projeto.zip para Projeto.txt, aí quando eu for abrir aqui eu renomeio para ZIP dinovo.

Entendeu??? ;)

Bom..é isto ai...valeu..e otima semana de trampo..t+
Ok, Valeu! tudo de bom pra você tambem :D

abraços Progr'amador.

B)

Link para o comentário
Compartilhar em outros sites

  • 0
você colocou na opção DataSource da QryItVisita o DataSource1 que esta ligado a QryVisita???

é isso que fará o relacionamento.

Resposta: eu já emaginava erá só pra ter certeza...eu tinha feito

Obs. Esse e-mail tem bloqueios para certos arquivos, então se você mandar zipado (.ZIP), tem que renomear mudando o tipo de arquivo para txt por exemplo, tipo Projeto.zip para Projeto.txt, aí quando eu for abrir aqui eu renomeio para ZIP dinovo.

Resposta: ok fiz como você me instruiu

muito Grato :D

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,2k
×
×
  • Criar Novo...