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

Problemas com Squ no Quick Reports


Carlos Rocha

Pergunta

Ola pessoal, estou usando essa consulta no MySql Front e retorna direitinho os valores

select P.CodigoProduto, P.Referencia, P.Descricao, P.PrecoUni, (I.Quantidade * P.PrecoUni) As Soma, I.Tamanho As Tamanho
from Produtos P
left outer join Itens I on (I.NumeroPedido=2 and  I.CodigoProduto = P.CodigoProduto)
No Delphi, na query produtos, to usando o seguinte:
select P.CodigoProduto, P.Referencia, P.Descricao, P.PrecoUni, (I.Quantidade * P.PrecoUni) As Soma, I.Tamanho As Tamanho
from Produtos P
left outer join Itens I on (I.NumeroPedido=:NumeroPedido and  I.CodigoProduto = P.CodigoProduto)
Usando como parametro
NumeroPedido = QryPedidos.CodigoPedido 
na atribuição de valor ao parametro nas propriedades da query
Meu QuickReports, ta no dataset QryItens e todos os QRDBText's, estão setados para receberem valor dos campos do QryProdutos. O que esta acontecendo: Os campos da QryProdutos que teem atribuição na QryItens estão recebendo valor mas os campos da QryProdutosque não teem atribuição na QryItens não estão recebendo valor. Como por exemplo:
(I.Quantidade * P.PrecoUni) As Soma, I.Tamanho As Tamanho

No Mysql Front da certinho mas n o Quick não!

O que fazer pra corrigir isso?

Onde estou errando?

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0

Por Favor atente para as regras do Forum

3.8 Não é permitida a postagem de mensagens com a finalidade de manter o tópico no início da lista (up), nem de mensagens que não se refiram ao assunto do tópico (flood). Caso isso ocorra, as mensagens serão excluídas e os autores, advertidos.

OBS: Tenha paciência e espere alguém lhe responder.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
No Delphi, na query produtos, to usando o seguinte:

select P.CodigoProduto, P.Referencia, P.Descricao, P.PrecoUni, (I.Quantidade * P.PrecoUni) As Soma, I.Tamanho As Tamanho
from Produtos P
left outer join Itens I on (I.NumeroPedido=:NumeroPedido and  I.CodigoProduto = P.CodigoProduto)
Usando como parametro
NumeroPedido = QryPedidos.CodigoPedido 
na atribuição de valor ao parametro nas propriedades da query

Carlos Rocha, este é o conteúdo de QryProdutos, então? Se é, não seria esta a informação a ser listada no seu quickreport?

Meu QuickReports, ta no dataset QryItens e todos os QRDBText's, estão setados para receberem valor dos campos do QryProdutos.
Sendo as respostas as questões acima - SIM, o dataset de seu Quick deveria ser QryProdutos e não QryItens, e são os campos daquele dataset que devem estar nos QRDBText's.

No Mysql Front da certinho mas n o Quick não!
Justamente porque a consulta que você executa no MySQL Front (QryProdutos) não é a que você está utilizando para lista no quick (QryItens)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Eu troquei o dataset do Quickreports e do dos QRDBText's.

O objetivo era acrescer à query Produtos, valores do query itens?

Mas.

se eu faço

select I.CodigoProduto, I.Referencia, P.Descricao, I.PrecoUni, (I.Quantidade * I.PrecoUni) As Soma, 
I.Tamanho As Tamanho, I.Quantidade As Quantidade, I.NumeroPedido As NumeroPedido
from Produtos P
left outer join Itens I on (I.NumeroPedido=1 and P.CodigoProduto =  I.CodigoProduto)
No MySql Front, a resposta é certa mas, se eu atribuo um valor de consulta(Até confiro depois e o delphi retorna certinho) no Delphi assim>
select I.CodigoProduto, I.Referencia, P.Descricao, I.PrecoUni, (I.Quantidade * I.PrecoUni) As Soma, 
I.Tamanho As Tamanho, I.Quantidade As Quantidade, I.NumeroPedido As NumeroPedido
from Produtos P
left outer join Itens I on (I.NumeroPedido=NumeroPedido and P.CodigoProduto =  I.CodigoProduto)
Não retorna correto. Observe que eu resgato o numero do pedido da taela ítens com a expressão:
...
I.NumeroPedido As Numero Pedido
...

Veja:

Tela no Delphi

http://www.carcleo.com/delphi.jpg

Tela no MySql Front

http://www.carcleo.com/MySqlFront.jpg

A ideia é, alem dos itens do pedido que foram escolhidos no ato do preenchimento do pedido sairem o relatorio, o cliente quer tb que saiam os itens(são poucos) que não foram escolhidos porem, esses, sairam apenas com os campos nativos preenchidos(Id, Referencia, Nome, PreçoUni), os demais campos, como por exemplo, o quantidade e total, o proprio c ara ira preencher à mão mesmo caso(no cliente dele) haja a nescessidade de escolher(inserir ao pedido) um novo produto na lista do pedido.

Editado por Carlos Rocha
Link para o comentário
Compartilhar em outros sites

  • 0
select I.CodigoProduto, I.Referencia, P.Descricao, I.PrecoUni, (I.Quantidade * I.PrecoUni) As Soma, 
I.Tamanho As Tamanho, I.Quantidade As Quantidade, I.NumeroPedido As NumeroPedido
from Produtos P
left outer join Itens I on (I.NumeroPedido=NumeroPedido and P.CodigoProduto =  I.CodigoProduto)
Não retorna correto.
Se a querie estiver deste jeito, realmente não retornará correto. Por acaso, esta consulta não deveria trazer todos os produtos e informações daqueles que foram incluídos no pedido (os itens)? E sendo assim, o Numero do Pedido não deveria ser parametrizado? Então, onde estão os ":" depois do sinal de "=" e antes do nome do parâmetro? Para ser mais específico: left outer join Itens I on (I.NumeroPedido= : NumeroPedido and P.CodigoProduto = I.CodigoProduto)
Observe que eu resgato o numero do pedido da taela ítens com a expressão:
...
I.NumeroPedido As Numero Pedido
...

Estes aliases não seriam necessários, já que você dá o mesmo nome dos campos:

I.Tamanho As Tamanho, I.Quantidade As Quantidade, I.NumeroPedido As NumeroPedido

O objetivo era acrescer à query Produtos, valores do query itens?

A ideia é, alem dos itens do pedido que foram escolhidos no ato do preenchimento do pedido sairem o relatorio, o cliente quer tb que saiam os itens(são poucos) que não foram escolhidos porem, esses, sairam apenas com os campos nativos preenchidos(Id, Referencia, Nome, PreçoUni), os demais campos, como por exemplo, o quantidade e total, o proprio c ara ira preencher à mão mesmo caso(no cliente dele) haja a necessidade de escolher(inserir ao pedido) um novo produto na lista do pedido.
Carlos Rocha, a querie produtos, como foi montada, justamente estará listando todos os produtos no seu cadastro. Além disto, para os produtos que foram refenciados nos itens do pedido, estará buscando as informações como quantidade, valor unitário e outros.

Como resultado, haverão no relatório, linhas (produtos) onde haverão as colunas quatidade, valor, ... preenchidos e outras que ficarão em branco.

A questão é, que para o que você está querendo como relatório final, você está querendo utilizar uma consulta só nos itens (QryItens) que não tem a menor necessidade de existir (neste caso específico).

Você precisará apenas mostrar os dados do Pedido (QryPedidos) e associado a ele os produtos e itens (QryProdutos - onde há um join de produtos e itens do pedido).

Para que você possa eventualmente utilizar este relatório para imprimir uma lista de pedidos (vários, e não um só de cada vez), sugiro que você utilize uma banda Detail para os dados do pedido, logo, neste caso, você definiria como dataset do seu quickrep a QryPedidos. E para listar os produtos/itens, você usaria uma banda SubDetail, onde a propriedade dataset dela seria definida com QryProdutos e nesta banda, você colocaria os campos deste dataset.

Informe-me, se o pedido a ser impresso será filtrado, ou seja, o usuário seleciona um determinado pedido ou se será impresso o pedido que está correntemente selecionado em um DBGrid.

Uma vez definido na QryProdutos o parâmetro NumeroPedido, este dataset deve ter sua propriedade DataSource ligado a um componente datasource que tenha como dataset a consulta QryPedidos. Assim, os itens do produto serão filtrados de acordo com o NumeroPedido na consulta QryPedido.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Acho que consegui, mas ainda tenho um problema.

O que eu fiz:

Esse é o código que uso para filtrar o numero do pedido(Esta no menu principal do programa)

function IsNumeric(const S: String): Boolean;
var
    x: SmallInt;
begin
    Result:= True;
    For x:= 1 to Length(S) do
    begin
        if not(S[x] in['0'..'9']) then
        begin
            Result:= False; Break;
        end;
    end;
end;

procedure TFormPrincipal.Impressao1Click(Sender: TObject);
var
  NumPedido : Integer;
  Texto: String;
begin
        Texto := '';
        if InputQuery('Digite o Numero Pedido','Impressão do Pedido',Texto) then
         begin
            If Texto = '' then
              begin
                    ShowMessage('Qual o Numero do Pedido para o Relatório? Você não preencheu!');
                    Exit;
              end;

            if not(IsNumeric(Texto)) then
              begin
                    ShowMessage('Aqui, somente números são permitidos');
                    Exit;
              end;
            if Length(Texto) > 6 then
                begin
                    ShowMessage('Os Numeros de Pedidos teem no maximo 6 digitos');
                    Exit;
                end;
            try
                NumPedido := StrToInt(Texto);
            except
                ShowMessage('Pedido inválido!');
                Exit;
            end;
         end
         else
           begin
            Exit;
           end;
         Application.CreateForm(TRPedidos,RPedidos);
         if not RPedidos.QryPedidos.Locate('CodigoPedido', NumPedido, []) then
            begin
                RPedidos.Close;
                ShowMessage('Registro não encontrado!');
                Exit;
            end
          else
            begin
                RPedidos.QryItens.Filter     := 'NumeroPedido = ' + inttostr(NumPedido);
                RPedidos.QryItens.Filtered   := true;
                RPedidos.QuickRepPedidos.PreviewModal;
                RPedidos.Free;
              end;
end;
La no quick, fiz o que voce falou:
Informe-me, se o pedido a ser impresso será filtrado, ou seja, o usuário seleciona um determinado pedido ou se será impresso o pedido que está correntemente selecionado em um DBGrid.

Uma vez definido na QryProdutos o parâmetro NumeroPedido, este dataset deve ter sua propriedade DataSource ligado a um componente datasource que tenha como dataset a consulta QryPedidos. Assim, os itens do produto serão filtrados de acordo com o NumeroPedido na consulta QryPedido.
A query ficou assim(E até bem mais simples)
select * From produtos p
left outer join Itens I on (I.NumeroPedido=:NumeroPedido and P.CodigoProduto = I.CodigoProduto)
E no parametro
QryItens.NumeroPedido

Agora ta funcionando legal.

Mas. Volte no inicio e observe a procidure que usei para informar qual vai ser o pedido a ser impresso

Quando escolha la por exemplo o Pedido 2, abre o QuikReport por 2 segundos +ou- e depois sim aparece o prewil. Isso o cliente vendo.

Como resolver isso?

Link para o comentário
Compartilhar em outros sites

  • 0
A query ficou assim(E até bem mais simples)

select * From produtos p
left outer join Itens I on (I.NumeroPedido=:NumeroPedido and P.CodigoProduto = I.CodigoProduto)
E no parametro
QryItens.NumeroPedido

Agora ta funcionando legal.

Acho estranho que esteja. Com esta consulta alterada, voce estará apenas listando os produtos no seu relatório - sem as quantidades daqueles produtos que tenham sido pedidos. :blink:

Mas. Volte no inicio e observe a procidure que usei para informar qual vai ser o pedido a ser impresso

Quando escolha la por exemplo o Pedido 2, abre o QuikReport por 2 segundos +ou- e depois sim aparece o prewil. Isso o cliente vendo.

Como resolver isso?

Desculpe, mas acho que faltou explicar o que é que tem que ser resolvido - não conseguir entender qual é o problema.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

O Pedido é filtrado sim. A partir do menu.

Seguinte:

Quando o cliente, la na confecção dele, abre o programa e quer ver o que foi especifiado no pedido, por exemplo 2. Ele vai no menu->Imprimir Pedido e quando poe na caixa de dialogo "informe o numero do pedido" o numero 2, abre o formulario do QuikReport(O form mesmo. Mostrando as Qry's os Qrdbtexts e os outros componentes) por +ou- 2 segundos e depois sim aparece o prewil. Isso o cliente vendo.

Como resolver isso?

Não sei se tem alguma coisa a ver com como se faz o filtro por isso colequei o código la do menu.

Esse é o código que uso para filtrar o numero do pedido(Esta no menu principal do programa)

function IsNumeric(const S: String): Boolean;
var
    x: SmallInt;
begin
    Result:= True;
    For x:= 1 to Length(S) do
    begin
        if not(S[x] in['0'..'9']) then
        begin
            Result:= False; Break;
        end;
    end;
end;

procedure TFormPrincipal.Impressao1Click(Sender: TObject);
var
  NumPedido : Integer;
  Texto: String;
begin
        Texto := '';
        if InputQuery('Digite o Numero Pedido','Impressão do Pedido',Texto) then
         begin
            If Texto = '' then
              begin
                    ShowMessage('Qual o Numero do Pedido para o Relatório? Você não preencheu!');
                    Exit;
              end;

            if not(IsNumeric(Texto)) then
              begin
                    ShowMessage('Aqui, somente números são permitidos');
                    Exit;
              end;
            if Length(Texto) > 6 then
                begin
                    ShowMessage('Os Numeros de Pedidos teem no maximo 6 digitos');
                    Exit;
                end;
            try
                NumPedido := StrToInt(Texto);
            except
                ShowMessage('Pedido inválido!');
                Exit;
            end;
         end
         else
           begin
            Exit;
           end;
         Application.CreateForm(TRPedidos,RPedidos);
         if not RPedidos.QryPedidos.Locate('CodigoPedido', NumPedido, []) then
            begin
                RPedidos.Close;
                ShowMessage('Registro não encontrado!');
                Exit;
            end
          else
            begin
                RPedidos.QryItens.Filter     := 'NumeroPedido = ' + inttostr(NumPedido);
                RPedidos.QryItens.Filtered   := true;
                RPedidos.QuickRepPedidos.PreviewModal;
                RPedidos.Free;
              end;
end;

Editado por Carlos Rocha
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,3k
×
×
  • Criar Novo...