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

(Resolvido) Relatório usando duas tabelas filhas sem usar tabela


Tatiane.InterArt

Pergunta

Em um relatório semanal de Contas a Pagar, tendo três tabelas, a mãe q é a ContasPagar e duas filhas q são FormaPagto e ItemContPag, preciso gerar um relatório semanal de contas a pagar.

O filtro de pesquisa está perfeito, neste relatório preciso imprimir as tabelas FormaPagto e ItemConPag.

na FormaPagto tenho CodForn, CodContaPg, DataVenc, Valor e Tipo

na ItemContPag tenho CodContaPg, Itens, Qtde.

no meu QuickRep tenho três IBQuerys

IB1 FormaPagto

IB2 ItemContPag

IB3 Fornecedor

estou usando bands separadas pois meu gerente quer que apareça uma linha separando e por conta dos itens também.

então, meu QuickRep está ligado ao IB1, tenho um DataSource ligado a ele também, e o IB2 ligado ao DataSource.

Quando imprimo estou usando as seguintes linhas:

FrmImpRelContPag:=TFrmImpRelContPag.Create(Self);
FrmImpRelContPag.IBQuery1.Close;
FrmImpRelContPag.IBQuery1.SQL.Clear;
FrmImpRelContPag.IBQuery1.SQL.Add('Select * from PagtoContaPg '+Pes+'order by Data');
FrmImpRelContPag.IBQuery1.Open;

FrmImpRelContPag.IBQuery2.Close;
FrmImpRelContPag.IBQuery2.SQL.Clear;
FrmImpRelContPag.IBQuery2.SQL.Add('Select * from ItemContPag where CodContPag='''+FrmImpRelContPag.IBQuery1CodOrc.Value+'''');
FrmImpRelContPag.IBQuery2.Open;

FrmImpRelContPag.IBQuery3.Close;
FrmImpRelContPag.IBQuery3.SQL.Clear;
FrmImpRelContPag.IBQuery3.SQL.Add('Select * from Fornec where CNPJ='''+FrmImpRelContPag.IBQuery1CodForn.Value+'''');
FrmImpRelContPag.IBQuery3.Open;

FrmImpRelContPag.QuickRep1.Preview;

então, não aparece o nome do fornecedor e os itens saem repetidos, alguém poderia me dar uma dica de como posso fazer isso funcionar?

ahnnn esqueci de colocar acima que não estou usando a tabela mãe para este relatório, pois neste caso ela não vai me servir de nada!

antes usava a tabela mãe, o que acontecia é que por cada fornecedor, se tivesse por exemplo vencimento dia 01/01/08 e 10/01/08 e filtrasse período de 10 dias, ficaria por exemplo assim:

Fornecedor: DELMONT

Itens:

Verniz Oracal

Verniz Perfurado

Verniz Transparente

Data Valor

01/01/08 30,00

10/01/08 25,00

Fornecedor: MPEL

Itens:

Sulfite

Data Valor

01/01/08 12,00

e não pode ficar assim, preciso que fique por data, mesmo que repita novamente o fornecedor e itens teria q ficar assim:

Fornecedor: DELMONT

Itens:

Verniz Oracal

Verniz Perfurado

Verniz Transparente

Data Valor

01/01/08 30,00

Fornecedor: MPEL

Itens:

Sulfite

Data Valor

01/01/08 12,00

Fornecedor: DELMONT

Itens:

Verniz Oracal

Verniz Perfurado

Verniz Transparente

Data Valor

10/01/08 25,00

tem que ser tudo o q há de um dia, depois tudo o que há do outro e assim por diante!

Se alguém puder me ajudar neste caso, agradeço!

Editado por Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Tatiane, primeiramente um dica: não use o * em seus selects. Sempre indique apenas os campos que você vai realmente utilizar. Isso evita trafego desnecessário na rede, menos buffer alocado, menos carga para o servidor a cada solicitação.

Ficou meio estranho você citar a tabela FormaPagto e usar PagtoContaPg na querie, e como os campos de ligação são diferentes em ambos (CodContaPg e CodOrc) fica complicado ter certeza do que "falar".

Nesta linha, parece que você monta sua consulta "mestre": FrmImpRelContPag.IBQuery1.SQL.Add('Select * from PagtoContaPg '+Pes+'order by Data');

e Pes provavelmente contém a cláusula WHERE que fará seu fitro principal.

Este dataset também deve ser o dataset de origem de dados para o QuickRep (propriedade DataSet), certo?!

Mas, montar a query das outras consultas "detalhe": rmImpRelContPag.IBQuery2.SQL.Add('Select * from ItemContPag where CodContPag='''+FrmImpRelContPag.IBQuery1CodOrc.Value+'''');

significa limitar o resultado delas apenas à um registro (linha) da consulta "mestre", já e os campo utilizados na concatenação corresponderão aos do primeiro registro na consulta e a string SQL conterá este valor fixo.

Você deverá fazer estas consultas "detalhes" de tal modo que a cada registro da consulta "mestre" que seja selecionado e impresso pelo quickreport, elas seja atualizadas e seus dados impressos corretamente. Para fazer isto, você deve fazer uso da parametrização.

Posts em que já falei sobre isto:

- Relatório Mestre/detalhe Com Adoquery - post#4 e post#8 - tem exemplo).

- Instrução SQL

- Duplica Registros Quickreport, Uma unica tabela trabalhando

- Relatório - Criar Grupos

Basicamente, voce cria as consultas filhas de modo que na cláusula WHERE você define um parâmetro com mesmo nome do campo de onde ele deverá obter a informação (consulta "mestre")

Dê uma olhada nos post e veja se você consegue seguir.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Ahnnn, na verdade acho q não consegui ser bem clara do que preciso no post, então vamos lá, sobre relatório mestre-detalhe consigo fazer bacaninha, tenho vários funcionando, porém este o que necessito mesmo é...

ter os dados do fornecedor, ter a data do vencimento de pagamento respectivo, o valor a ser pago e os itens que foram comprados pela empresa. Um relatório básico de contas a pagar que está me dando a maior dor de cabeça rsrsrsrs.

tenho minhas tabelas no InterBase

ContasPagar

CodPg

CodCli

NumNota

DtEmissao

ValotTot

FormaPagto

CodPg

NumParc

DataVencmto

Valor

Tipo

ItemContPg

CodPg

NumItem

Descricao

Qtde

ValorUni

ValorTot

preciso imprimir neste relatório o que tenho a vencer por dia com subtotal, porém o relatório poderá ser filtrado por períodos de 10,15,20 e 25 dias certo.

digamos que tenho referente a uma única nota fiscal de compra duas parcelas a vencer no mesmo período uma dia 01 e outra dia 10, e tenho outras diferentemente para datas distintas dentro deste período, as informações que preciso poderão sim se repetir - para ser mais clara o exemplo impresso seria:

Credor: MPEL

Origem

Item: Papel Sulfite Qtde:10

Vencimento:01/01/08 Valor:35,00

Credor: RMComercial

Origem

Item: Vinil Oracal Azul Qtde:02

Item: Vinil Oracal Vermelho Qtde:03

Vencimento:01/01/08 Valor:20,00

Subtotal:55,00

Credor: MPEL

Origem

Item: Papel Sulfite Qtde:10

Vencimento:10/01/08 Valor:35,00

Credor:SPMedia

Origem

Item: SP Solvente Flora Qtde:03

Vencimento:10/01/08 Valor:10,00

Subtotal:45,00

Bem, na verdade o que não estou conseguindo é deixar meu relatório exatamente assim, entende, separado por dia, com subtotais, consigo imprimir todas as informações usando mestre-detalhe, mas não consigo fazê-lo ficar desta maneira, como havia dito acima, me indicaram o componente QRGroup, mas não sei usar, estou realmente perdida.

Estava acostumada com programação simples, isso tudo parece um bixo de 7 cabeças para mim!

Bem não sei se agora fui mais clara, se alguém puder me ajudar, agradeço!

Link para o comentário
Compartilhar em outros sites

  • 0

Antes de prosseguir confirme se a origem dos dados, para cada bloco, está correta como eu entendi:

Credor: MPEL // Ref. ao Cliente, vem de ContasPagar - CodCli

Origem

Item: Papel Sulfite Qtde:10 // Ref. ao item, vem de ItemContPg - Descricao, Qtde

Vencimento:01/01/08 Valor:35,00 // Ref. ao total dos itens, vem de FormaPagto - DataVencmto, Valor

Link para o comentário
Compartilhar em outros sites

  • 0
isto mesmo... está sim, porém o nome referente migra da tabela de cliente referente ao código do ContasPagar, mas o restante está perfeitamente correto.
correto, eu só me expressei errado, já que será obtido o código do cliente para buscar seu nome na tabela cliente.

preciso imprimir neste relatório o que tenho a vencer por dia com subtotal, porém o relatório poderá ser filtrado por períodos de 10,15,20 e 25 dias certo.
este é o único filtro aplicado a consulta principal?

Este período é informado como? data de início e data de fim, ou apenas 10 ou 15 dias a partir de hoje?

Link para o comentário
Compartilhar em outros sites

  • 0
Ahnnn, na verdade acho q não consegui ser bem clara do que preciso no post
Talvez eu é quem tenha sido simplista demais. Então, resolvi fazer este "pequeno" tutorial para o seu relatório (mas servirá a outros, tenho certeza) - por favor não desista de lê-lo. :(

Estava acostumada com programação simples, isso tudo parece um bixo de 7 cabeças para mim!
não tem tantas cabeças assim, não. Se você ler direitinho do início ao fim, depois de pronto, você vai ver que é simples. :D

Bom, vamos lá

1) Então, vamos ver se entendemos as consultas...

a - Consulta que retornas os dados que determinarão a seqüência em que o relatório será apresentado, ou seja, ordenado por DataVencmto e viabilizando o agrupamento por esta data (IBQuery1):

SELECT CodPg, DataVencmto, Valor
FROM FormaPagto
WHERE DataVencimento between :DtInicio and :DtTermino
ORDER BY DataVencmto, CodPg
b - Consulta que tem por objetivo buscar, na tabela mestre (ContasPagar), o nome do cliente a ser apresentado no relatório (IBQuery2). Aproveitaremos para buscar, nesta consulta, o nome do cliente:
SELECT C.NomCli
FROM ContasPagar CP, Cliente C
WHERE CP.CodPg = :CodPg
  AND CP.CodCli = C.CodCli
c - Consulta que tem por objetivo retornar todos os itens relacionados com a tabela mestre (ContasPagar), porém através de FormaPagto via campo comum CodPg (IBQuery3):
SELECT Descricao, Qtde
FROM ItemContPg
WHERE CodPg = :CodPg
Obs: buscamos nos SELECTs apenas os campos de que necessitamos. 2) Preparando os componentes de consulta... Como já havia mencionado, as consultas parametrizadas (detalhes) deverão estar vinculadas à consulta principal (mestre). Isto, porque queremos que para cada registro do dataset mestre, impresso, os datasets detalhes sejam atualizados. Para as consultas utilizadas neste projeto, a parametrização funcionará sem problemas não sendo necessário a criação em run-time das strings de consultas SQL. Assim, podemos adicionar estas queries diretamente na propriedade SQL dos datasets IBQuery<n> - isto eliminará linhas de seu código e viabilizará a adição dos campos (Fields) aos datasets (o que parece-me você já o fez). Na seqüência, para cada dataset que fizemos uso da parametrização, acesse a propriedade Params, selecione cada parâmetro na lista e ajuste as propriedades: DataType e ParamType de acordo com o que representam. Por ex., para IBQuery2 no parâmetro CodPg você define DataType = ftInteger e ParamType = ptInput. A próxima etapa é definir nos datasets detalhes, de onde virão os parâmetros para o filtro – sabemos que deverá ser do dataset mestre. Para tanto, selecionamos na propriedade DataSource (origem de dados) dos datasets clientes (IBQuery2 e IBQuery3) o componente DataSource (DataSource1) associado ao dataset mestre (IBQuery1). Como isto funcionará: quando as consultas dos datasets filhos forem executadas pelos respectivos componentes, os parâmetros deverão conter um valor. Este valor pode ser informado manualmente (o comum) ou serem obtidos de outro dataset via propriedade DataSource (nosso caso) e este é o motivo pelo qual é importante que o nome do parâmetro seja exatamente o mesmo nome do campo, no dataset origem, que desejamos fazer a referência. O melhor, disto tudo, é que ele é controlado sozinho (nada de ficar fechando e abrindo a consulta a cada novo valor). 3) Alterações no código para manipulação das consultas... - Levando em conta o que já citei no item anterior, e por questão de organização, vou lhe sugerir criar um procedimento no seu form FrmImpRelContPag para que nos facilite algumas coisas. Este procedimento chamarei ShowPreview. Assim, na unit onde está declarado o seu form faremos as seguintes alterações:
unit ...
Type
  TfrmImpRelContPag = class(TForm)
    ...
  public
    procedure ShowPreview(DtReferencia: TDateTime; QtdDias :Integer);
  end;
...
implementation
...
procedure TfrmImpRelContPag.ShowPreview(DtReferencia: TDateTime; QtdDias :Integer);
begin
 // inicializamos o filtro do período a ser avaliado
  IBQuery1.ParamByName(‘DtInicio’).AsDateTime := DtReferencia;
  IBQuery1.ParamByName(‘DtTermino’).AsDateTime := DtReferencia +QtdDias;
  IBQuery1.Open;
  IBQuery2.Open;
  IBQuery3.Open;
  QuickRep1.Preview;
 // se o seu form eventualmente não é destruído, convém
 // fechar as consultas após concluída a apresentação do relatório
 // do contrário, você pode omitir estas linhas, visto que ao destruir o form
 // os datasets que ESTÃO NELE, serão fechados ao serem destruídos.
  IBQuery1.Close;
  IBQuery2.Close;
  IBQuery3.Close;
end;
- Na unit onde está o form que chama este relatório (vou chamá-lo FrmContPag), supondo que tal evento ocorra ao clicar de um botão (vou chama-lo btnImpContPag) e que a data de referência e número de dias venham de edits (edDataRef e edNumDias) o código deveria ficar:
procedure TFrmContPag.btnImpContPag(Sender :TObject);
begin
  FrmImpRelContPag := TFrmImpRelContPag.Create(Self);
  try
    FrmImpRelContPag.ShowPreview(StrToDate(edDataRef.Text), StrToInt(edNumDias));
  finally
    FrmImpRelContPag.Free;
  end;
end;

4) Preparação do relatório QuickRep...

O componente QuickRep1 deverá ter como tabela guia a nossa consulta mestre, já que queremos que as informações sejam mostradas na ordem que lá determinamos. Assim, selecionamos em sua propriedade DataSet o dataset IBQuery1.

Obs: Para efeito de andamento da impressão, cada vez que é processada uma linha do dataset, a banda detalhe estará sendo “impressa”.

Nós sabemos que para cada linha do dataset mestre, poderá haver várias linhas no dataset detalhe IBQuery3 que representam os n itens relacionados a ele. A isto chamamos de sub-detalhe, de modo que para mostrar estas informações, faremos uso de uma banda SubDetail.

Assim, já teríamos condições de montar o relatório com esta estrutura...:

+- Banda Detail -----------------------------+

|Vencimento: [QRDBText] Valor: [QRDBText]

|Credor: [QRDBText]

| Origem

+- Banda Sub-Detail -------------------------+

|Item: [QRDBText] Qtde: [QRDBText]

+--------------------------------------------+

configuração dos componentes QRDBText:

Vencimento: (dataset: IBQuery1; datafield: DataVencmto)

Valor: (dataset: IBQuery1; datafield: Valor)

Credor: (dataset: IBQuery2; datafield: NomCli)

Item: (dataset: IBQuery3; datafield: Descricao)

Qtde: (dataset: IBQuery3; datafield: Qtde)

... e ter este resultado:

+--------------------------------------------+

|Vencimento: 01/01/08 Valor: 35,00

|Credor: MPEL

|Origem

|Item: Papel Sulfite Qtde:10

+--------------------------------------------+

|Vencimento: 01/01/08 Valor: 20,00

|Credor: RMComercial

|Origem

|Item: Vinil Oracal Azul Qtde:02

|Item: Vinil Oracal Vermelho Qtde:03

+--------------------------------------------+

|Vencimento: 10/01/08 Valor: 35,00

|Credor: MPEL

|Origem

|Item: Papel Sulfite Qtde:10

+--------------------------------------------+

|Vencimento: 10/01/08 Valor: 10,00

|Credor:SPMedia

|Origem

|Item: SP Solvente Flora Qtde:03

+--------------------------------------------+

Obs: infelizmente a tag QUOTE bagunça um pouco as tabulações, removendo os espaços. Mas vale o conceito. ;)

Problema) mostrar a data do vencimento e o valor da conta a pagar após os itens listados, e não antes como temos, já que estão associados à detalhe – mestre.

Solução: isto, deveríamos ter uma espécie de DetailFooter, já que ele supostamente viria depois do SubDetail, mas isto não existe. Então o que fazemos é avaliar a situação e verificar que todos os itens correspondem ao mesmo grupo CodPg. Vamos, então, adicionar um QRGroup (QRGroup1) e definir um grupo baseado neste campo. Assim, configuramos a sua propriedade Expression com IBQuery1.CodPg, porém esta banda é colocada acima da banda Detail e por isso, adicionamos um QRBand e mudamos sua propriedade BandType para rbGroupFooter e renomeamos ela para QRGroupFooter1 e nesta banda colocamos os campos Vencimento e Valor. Na propriedade FooterBand da QRGroup1, devemos selecionar a banda QRGroupFooter1.

A nova estrutura deverá ficar assim:

+- Banda Group1 -----------------------------+

| (deixe a altura desta banda no mínimo – não será “usada”)

+- Banda Detail -----------------------------+

|Credor: [QRDBText]

|Origem

+- Banda Sub-Detail -------------------------+

|Item: [QRDBText] Qtde: [QRDBText]

+- Banda GroupFooter1 -----------------------+

| Vencimento: [QRDBText] Valor: [QRDBText]

+--------------------------------------------+

E ter este resultado, bem próximo do desejado:

+--------------------------------------------+

|Credor: MPEL

|Origem

|Item: Papel Sulfite Qtde:10

| Vencimento: 01/01/08 Valor: 35,00

+--------------------------------------------+

|Credor: RMComercial

|Origem

|Item: Vinil Oracal Azul Qtde:02

|Item: Vinil Oracal Vermelho Qtde:03

| Vencimento: 01/01/08 Valor: 20,00

+--------------------------------------------+

|Credor: MPEL

|Origem

|Item: Papel Sulfite Qtde:10

| Vencimento: 10/01/08 Valor: 35,00

+--------------------------------------------+

|Credor:SPMedia

|Origem

|Item: SP Solvente Flora Qtde:03

| Vencimento: 10/01/08 Valor: 10,00

+--------------------------------------------+

Mas o objetivo é mostrar, ainda, o sub-total agrupado por data do vencimento. Novamente, para colocarmos esta informação ao final do grupo, vamos necessitar de mais um par QRGroup e QRBand. A banda QRGrou2 deverá ter sua propriedade Expression com IBQuery1. DataVencmto e a QRBand deve ter sua propriedade BandType alterada para rbGroupFooter e ser renomeada para QRGroupFooter2. Na propriedade FooterBand da QRGroup2, devemos selecionar a banda QRGroupFooter2.

Você vai observar que este conjunto ficou mais próximo à banda Detail, ou seja, como um grupamento mais interno. Só que, na verdade, queremos que ele seja mais externo. Para resolver isto, clique com o botão direito sobre a QRGroup2 e, no menu de contexto, selecione “Move group up” – pronto, cada coisa no seu lugar.

Obs: Este “probleminha” só ocorreu porque eu estou construindo passo a passo o relatório (de forma didática). Na prática, você poderá evitar isto, adicionando as bandas desejadas antes e depois configurando elas.

A estrutura final do relatório ficará assim:

+- Banda Group2 -----------------------------+

| (deixe a altura desta banda no mínimo – não será “usada”)

+- Banda Group1 -----------------------------+

| (deixe a altura desta banda no mínimo – não será “usada”)

+- Banda Detail -----------------------------+

|Credor: [QRDBText]

|Origem

+- Banda Sub-Detail -------------------------+

|Item: [QRDBText] Qtde: [QRDBText]

+- Banda GroupFooter1 -----------------------+

| Vencimento: [QRDBText] Valor: [QRDBText]

+- Banda GroupFooter2 -----------------------+

|Sub-total: [QRExpr]

|

+--------------------------------------------+

configuração do componente QRExpr:

Sub-total: (Expression: IBQuery1.Valor; ResetAfterPrint: True)

E finalmente, nosso relatório fica com este aspecto:

+--------------------------------------------+

|Credor: MPEL

|Origem

|Item: Papel Sulfite Qtde:10

| Vencimento: 01/01/08 Valor: 35,00

+--------------------------------------------+

|Credor: RMComercial

|Origem

|Item: Vinil Oracal Azul Qtde:02

|Item: Vinil Oracal Vermelho Qtde:03

| Vencimento: 01/01/08 Valor: 20,00

+--------------------------------------------+

|Subtotal:55,00

|

+--------------------------------------------+

|Credor: MPEL

|Origem

|Item: Papel Sulfite Qtde:10

| Vencimento: 10/01/08 Valor: 35,00

+--------------------------------------------+

|Credor:SPMedia

|Origem

|Item: SP Solvente Flora Qtde:03

| Vencimento: 10/01/08 Valor: 10,00

+--------------------------------------------+

| Subtotal: 45,00

|

+--------------------------------------------+

Bom, ele não é infalível, já que não é muito fácil programar virtualmente, mas podemos ir arredondando as coisas, se necessário. ;)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, a estrutura é perfeita, com um pequeno detalhe que me esqueci de comentar nos posts anteriores, acredito que por algum problema na instalação do Delphi ou InterBase não consigo criar tabelas com outro tipo de variável a não ser Varchar(String), tenho um erro de incompatibilidade no momento de add dados, mesmo fazendo conversões, um probleminha que tive que contornar em todo o relatório.

ou seja, minha pesquisa ficou toda papagaiada, tive que converter de sata para string e string para data um milhão de vezes rsrsrsrsrsrs - claro exagero meu.

para montagem da tela de pesquisa utilizei um RadioGroup com os períodos pré-definidos e para a data informada um MaskEdit, bem, dentro da papagaiada q disse rsrsrsrsrs tive que validar variáveis contando dias e retransformar em string no momento da pesquisa, portanto, minha pesquisa está assim mais ou menos, supondo que o período é de Dez dias.

Select Data from FormaPagto where Data='''+Um+''' or Data='''+Dois+''' or Data='''+Tres+''' or Data='''+Quatro+''' or Data='''+Cinco+''' or Data='''+Seis+''' or Data='''+Sete+''' or Data='''+Oito+''' or Data='''+Nove+''' or Data='''+Dez+'''

Bem, sei que é muito inviável, mas por conta do problemão q tive com as declarações de variável, que nem integer ele aceita, para ter idéia até meus códigos são Varchar(String), nessas horas, quem não tem cão, caça até com rato rsrsrsrsrs improvisei da melhor maneira possível.

Considerando tudo, me ajuda bastante, porém no quesito pesquisa não dará certo com certeza, vou tentar fazer adaptações e improvisar como for possível, qualquer coisa volto a postar...

Link para o comentário
Compartilhar em outros sites

  • 0

Bem, algumas coisas funcionaram e outras não, fiz algumas adaptações na minha tela de pesquisa para que pudesse passar a Qtde de dias através de uma variável do tipo string que valida ao clicar no RadioGroup, até aí ficou perfeito, porém, quando executo dá um erro em relação ao Param DataInicio criado no Form FrmImpRelContPag - IBQuery1:Parameter 'DtInicio' not found

Na seqüência, para cada dataset que fizemos uso da parametrização, acesse a propriedade Params, selecione cada parâmetro na lista e ajuste as propriedades: DataType e ParamType de acordo com o que representam. Por ex., para IBQuery2 no parâmetro CodPg você define DataType = ftInteger e ParamType = ptInput.

Não carrega os parâmetros na IBQuery2...

Seguindo uma impressão relativa à pesquisa, usando é claro a mesma linha de raciocínio e sem usar a procedure ShowPreview, separa sim por Fornecedor, mas os Itens carregam repetidos e o Subtotal aparece assim: View Profille IBQuery1.Valor; ResetAfterPrint: True, ou seja não calcula.

Fica a separação por data, porém quebrando inicialmente por Fornecedor e depois por data, assim, primeiro mostra tudo de um Fornecedor depois tudo de outro!

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

Credor: MPEL

Origem

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

Item: Sulfite........................Qtde:10

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

..........................................Vencimento:01/01/08.......Valor:35,00

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

Subtotal: View Profille IBQuery1.Valor; ResetAfterPrint:

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

Credor: MPEL

Origem

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

Item: Sulfite........................Qtde:10

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

..........................................Vencimento:10/01/08.......Valor:25,00

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

Subtotal: View Profille IBQuery1.Valor; ResetAfterPrint:

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

Credor: RMComercial

Origem

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

Item: Vinil Oracal..................Qtde:2

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

..........................................Vencimento:01/01/08.......Valor:15,00

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

Subtotal: View Profille IBQuery1.Valor; ResetAfterPrint:

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

O que pode ser?

Link para o comentário
Compartilhar em outros sites

  • 0

Problemas resolvidos, no meu caso q é um caso isolado por ter tido problemas na instalação do Delphi ou InterBase, precisei usar métodos de seleção diferenciados e referenciais a minha pesquisa da primeira Form, infelizmente com a Procedure não foi possível, mas funcionou redondinho e em observação, achei um exemplo de subtotal e total diferente na internet que funcionou melhor que o QRExpr... aí vai a dica!

Declarar duas variáveis públicas:

VlSub,VlTot:Double {Usei tipo Double por se tratar de valor em moeda, dinheiro}

no evento BeforePrint do QRGroup1 - referente ao Subtotal

VlSub:=0;

no evento BeforePrint do QRGroup2 - referente ao Total

VlTot:=0;

no evento BeforePrint do QRGroupFooter3 - referente ao valor das parcelas

VlSub:=VlSub+StrToFloat(IBQuery1.FieldByName('Valor').AsString);

VlTot:=VlTot+StrToFloat(IBQuery1.FieldByName('Valor').AsString);

no QRGroupFooter1 - referente ao Subtotal

adicionar duas QRLabel

na propriedade Caption da QRLabel1 - Subtotal - colocar negrito na fonte

no evento BeforePrint do QRGroupFooter1 - referente ao Subtotal

QRLabel2.Caption:=FormatFloat('R$ ###,##0.00', VlSub);

no QRGroupFooter2 - referente ao Total

adicionar duas QRLabel

na propriedade Caption da QRLabel1 - Total - colocar negrito na fonte

no evento BeforePrint do QRGroupFooter1 - referente ao Subtotal

QRLabel2.Caption:=FormatFloat('R$ ###,##0.00', VlTot);

Alinhe os campos da forma desejada e pronto! funciona melhor que o QRExpr

Link para o comentário
Compartilhar em outros sites

  • 0
no meu caso q é um caso isolado por ter tido problemas na instalação do Delphi ou InterBase, precisei usar métodos de seleção diferenciados e referenciais a minha pesquisa da primeira Form, infelizmente com a Procedure não foi possível, mas funcionou redondinho e em observação, achei um exemplo de subtotal e total diferente na internet que funcionou melhor que o QRExpr...
Tatiane, que ferramenta você utilizou para criar as tabelas no seu banco de dados? Voce faz uso do IBExpert?

Quanto a solução utilizada, também é válida, mas fazendo uso adequado dos componentes, você precisa programar menos e ter menos pontos de manutenção. ;)

Eu lhe aconselharia a, antes que avance muito no seu sistema com tantas "gambiarras", tentar resolver o problema - vai lhe poupar muito trabalho futuro e manter seu código mais enxuto e, diga-se de passagem, mais profissional.

Se for uma questão de instalação do banco, e como supostamente você já tentou reinstalá-lo - sem resolver o problema, talvez valesse a pena você pensar em utilizar o FireBird. Uma vez que você utiliza os componentes da paleta IB, não terá qualquer problema com o código, a não ser, apenas, com relação a retirada dos campos "enjambrados" (readicionando os corretos) e removendo as "papagaiadas". Eu acredito que isso vala à pena!

Abraços

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...