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

(Resolvido) Instrução SQL


Eder

Pergunta

Ola..

Tenho esta instrução sql:

Qry1 :='SELECT PAG_CNPJ, PAGADOR_NOME, '+
    'SUM(VALOR_FRETE) AS VALOR_FRETE_TOTAL, '+
    'SUM(CONTADOR) AS CONTADOR_TOTAL, '+
    'SUM(KG_CALCULO) AS KG_CALCULO_TOTAL, '+
    'SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL '+
    'FROM CTRC WHERE (SITUACAO_CTRC <> "C") '+
    'AND DATA_EMISSAO between :datai and :dataf '+
    'AND NOME_VENDEDOR = ' + QuotedStr(COMBOBOX1.text) + ' GROUP BY PAG_CNPJ, PAGADOR_NOME ORDER BY 3 DESC';

Notem que ela agrupa por GROUP BY PAG_CNPJ, PAGADOR_NOME e me mostra estes dados no relatorio....

assim:

CLIENTE.....CNPJ....................VALORES

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

AAAAAA 22222222222222

XXXXXX 00000000000000

YYYYYYY 66666666666666

MAS agora tem um problema...HOuve um cadastro do cliente alterado no meio do ano......

o cadastro no inicio do ano tava assim:

AAAAAA

E agora foi alterado assim(razão social):

AAAAAA SA

ai o relatorio começou a mostrar assim:

CLIENTE............CNPJ....................VALORES

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

AAAAAA 22222222222222

AAAAAA SA 22222222222222

XXXXXX 00000000000000

YYYYYYY 66666666666666

Notem que por causa do SA ele não juntou os dados, porque esta diferente ......

Como é que eu faço pra Juntar os registros, desconsiderando o NOME DO CLIENTE(PAGADOR_NOME) SÓ fazendo o filtro pelo CNPJ DO CLIENTE(PAG_CNPJ).

Mas o nome do cliente deve aparece no relatorio

Grato

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

Oi Eder... a primeira maneira de resolver isto seria usando um componente QRDBText para cada campo, desta forma o SA poderia ser truncado, e se voce quiser que apareça bastaria então aumentar a largura do campo no QR

se voce estiver usando somente um campo concatenado, é o que parece, então voce deve tratar o espaçamento usando uma função que replica caracteres brancos depois do nome do cliente para depois jogar o CNPJ

exemplo:

Edit1.Text := 'jose antonio'

Edit2.Text := '111221212122'

jose antonio..........111221212122 // 10 espaços entre nome e cnpj

pedro carvalho......112323434545 // 6 espaços

o primeiro nome tem 12 caracteres e voce quer que cnpj começe na coluna 22

então 22 - length('jose antonio') = 10

entretanto voce tem que usar uma fonte com espaçamentos iguais entre os caracteres ( Courrier )

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

function Replicate( Caracter:String; Quant:Integer ): String;
{Repete o mesmo caractere várias vezes}
var I : Integer;
begin
Result := '';
  for I := 1 to Quant do
  Result := Result + Caracter;
end;

procedure TForm1.Button1Click(Sender: TObject);
var s : string; tam , n : integer;
begin
   tam := length(trim(Edit1.Text));
   n := 20 - tam;
   s := (trim(Edit1.Text) + replicate(' ',n) + trim(edit2.text);
   memo1.Lines.Append(s);
end;

end.

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Ola..Jonas..eu uso dois campos QrDbText um pro Nome_Cliente e outro pro Cnpj_Cliente

O programa é que no codigo ele agrupa pelos dois campos......e como esta com a razão social diferente não ta juntando..

Não tem uma maneira de fazer Funcionar via codigo??

Tentei tirar da Group o PAGADOR_NOME pra não agrupar ...mas como esta na select da erro.....e como eu precise que ele aparece no relatorio....ai fiquei com as mãos atadas.

Acho que agora expliquei melhor....era isto que você também tinha entendido??

Grato

Link para o comentário
Compartilhar em outros sites

  • 0

o codigo que te passei é para concatenar dois ou mais campos e mante-los alinhados, então neste caso, voce teria que uma fonte com espaçamentos iguais e ai imprimiria somente um campo

como voce falou que esta usando 2 QrDbText, neste caso, não precisa concatenar os campos, basta coloca-los um ao lado do outro no QR, fica ate mais facil, e determinar a largura de cada campo, que vai ficar certinho.

ficaria ssim na banda de delalhe. observe que a propriedade AutoSize = false

_____________________________________________________

[QrDbText1.........espaço.......] [QrDbText2........espaço......]

_____________________________________________________

abraço

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

  • 0

Jonas....acho que você não ta me entendendo!!!hehehe.

mas beleza....

como voce falou que esta usando 2 QrDbText, neste caso, não precisa concatenar os campos, basta coloca-los um ao lado do outro no QR, fica ate mais facil, e determinar a largura de cada campo, que vai ficar certinho.

ficaria ssim na banda de delalhe. observe que a propriedade AutoSize = false

_____________________________________________________

[QrDbText1.........espaço.......][QrDbText2........espaço......]

_____________________________________________________

R.: já esta assim........eu já utilizo desta forma.

o problema...é que como na tabela foi cadastrado assim:

registro:

CLIENTE CNPJ

AAAAAA SA 22222222222222

até meio do ano o pessoal alimentou os registros com o nome do cliente assim:

AAAAAA SA

depois alguém mudou o nome do cliente pra:

AAAAAA(sem o SA)

certo?

como faço a group by em cima dos campos:

GROUP BY PAG_CNPJ, PAGADOR_NOME

a consulta ta entendendo que são dois CLIENTES DIFERENTES e ta me mostrando separados....

Na verdade são clientes iguais....

então eu tenho duas alternativas....uma forma de consulta onde junte, ou pegar a tabela paradox e alterar tudo pra um nome igual......

você. Compreendeu o problema????é isto que você ta me passando

o esquema de concatenar não fiz ...mas os dos qrdbtext já esta assim...e não junta os registros.....

pois existe dois nomes de clientes diferentes....

Pro sistema ....são dois clientes distintos......

Achei que seu eu fizesse a consulta em cima do campo de filtro por cnpj ai resolveria o problema..mas eu tenho que mostrar o nome do cliente ao lado.

Grato

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, Eder! pelo que entendi está havendo a impressão em linha separada entre o

AAAAAA 22222222222222 e o

AAAAAA SA 22222222222222, pois o agrupamento considerou-os de forma diferente.

sua solução passa por um de dois passos a seguir:

1 - normalizar corretamente o seu banco de dados. colocando AAAAAA e AAAAAA SA como um único registro em outra tabela, de maneira que haja um relacionamento que aponte de forma correta para o que precisas e facilite a manutenção do cadastro em questão. (Esta é a maneira mais correta, pois este tipo de problema não se repetirá mais)

2 - Se seu banco de dados contém PAG_CNPJ para representar igualmente AAAAAA e AAAAAA SA, então retire o campo PAGADOR_NOME da cláusula GROUP BY, mantendo o PAG_CNPJ. O resultado será o mesmo. Se precisar de ordenação então utilize o PAGADOR_NOME na cláusula ORDER BY.

No início do select utilize o FIRST(PAGADOR_NOME) para que ele pegue o primeiro registro com o nome desejado (assim não ocasionará erro no resultado do SELECT por causa da cláusula GROUP BY.

Em suma, faça assim:

SELECT PAG_CNPJ, FIRST(PAGADOR_NOME), '+
    'SUM(VALOR_FRETE) AS VALOR_FRETE_TOTAL, '+
    'SUM(CONTADOR) AS CONTADOR_TOTAL, '+
    'SUM(KG_CALCULO) AS KG_CALCULO_TOTAL, '+
    'SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL '+
'FROM CTRC ' +
'WHERE (SITUACAO_CTRC <> "C") '+
    'AND DATA_EMISSAO between :datai and :dataf '+
    'AND NOME_VENDEDOR = ' + QuotedStr(COMBOBOX1.text) + 
'GROUP BY PAG_CNPJ ' +  
'ORDER BY 3 DESC';

att

Denis Courcy

Editado por Denis Courcy
Link para o comentário
Compartilhar em outros sites

  • 0

Ola...Deniz..Grato em responder.

Oi, Eder! pelo que entendi está havendo a impressão em linha separada entre o

AAAAAA 22222222222222 e o

AAAAAA SA 22222222222222, pois o agrupamento considerou-os de forma diferente.

sua solução passa por um de dois passos a seguir:

1 - normalizar corretamente o seu banco de dados. colocando AAAAAA e AAAAAA SA como um único registro em outra tabela, de maneira que haja um relacionamento que aponte de forma correta para o que precisas e facilite a manutenção do cadastro em questão. (Esta é a maneira mais correta, pois este tipo de problema não se repetirá mais)

R.: neste caso aqui tenho apenas uma tabela chamado Ctrc......sem nenhum relacionamente...pois este ctrc.db foi gerado apartir de um *.csv

2 - Se seu banco de dados contém PAG_CNPJ para representar igualmente AAAAAA e AAAAAA SA, então retire o campo PAGADOR_NOME da cláusula GROUP BY, mantendo o PAG_CNPJ. O resultado será o mesmo. Se precisar de ordenação então utilize o PAGADOR_NOME na cláusula ORDER BY.

No início do select utilize o FIRST(PAGADOR_NOME) para que ele pegue o primeiro registro com o nome desejado (assim não ocasionará erro no resultado do SELECT por causa da cláusula GROUP BY.

Em suma, faça assim:

CODE

SELECT PAG_CNPJ, FIRST(PAGADOR_NOME), '+

'SUM(VALOR_FRETE) AS VALOR_FRETE_TOTAL, '+

'SUM(CONTADOR) AS CONTADOR_TOTAL, '+

'SUM(KG_CALCULO) AS KG_CALCULO_TOTAL, '+

'SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL '+

'FROM CTRC ' +

'WHERE (SITUACAO_CTRC <> "C") '+

'AND DATA_EMISSAO between :datai and :dataf '+

'AND NOME_VENDEDOR = ' + QuotedStr(COMBOBOX1.text) +

'GROUP BY PAG_CNPJ ' +

'ORDER BY 3 DESC';

R.: Ok....fiz o que me sugeriu mais deu erro:

CAPABILITY NOT SUPORTED

Será que é por causa de ser Paradox a Tabela??

muito Grato

Link para o comentário
Compartilhar em outros sites

  • 0
Ola...Deniz..Grato em responder.

Será que é por causa de ser Paradox a Tabela??

muito Grato

Creio que sim. Pois o SQL que passei é padrão e utilizável em quase todos tipos de bancos de dados.

Então use a opção 1. Dará mais trabalho no ínício (para modificar as tabelas), mas você não terá mais este tipo de problema.

att

Denis Courcy

Link para o comentário
Compartilhar em outros sites

  • 0
Então use a opção 1. Dará mais trabalho no ínício (para modificar as tabelas), mas você não terá mais este tipo de problema.

att

Denis Courcy

R:Denis só existe uma tabela paradox com estes dados......estes dados são originados de uma conversão de um arquivo *.csv que importei.

então não da pra fazer da maneira como fala.....eu entendi perfeitamente como você mencionou..só que neste caso....é uma unica tabela.

acho que eu vou ter que entrar nela e filtrar este cnpj e alterar todos os registros para que fiquem com a mesma razão social....pois não to vendo solução....achei que teria via consulta sql...mas não parece que não tem jeito.

Grato

Link para o comentário
Compartilhar em outros sites

  • 0
Notem que ela agrupa por GROUP BY PAG_CNPJ, PAGADOR_NOME e me mostra estes dados no relatorio....

assim:

CLIENTE.....CNPJ....................VALORES

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

AAAAAA 22222222222222

XXXXXX 00000000000000

YYYYYYY 66666666666666

MAS agora tem um problema...HOuve um cadastro do cliente alterado no meio do ano......

o cadastro no inicio do ano tava assim:

AAAAAA

E agora foi alterado assim(razão social):

AAAAAA SA

ai o relatorio começou a mostrar assim:

CLIENTE............CNPJ....................VALORES

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

AAAAAA 22222222222222

AAAAAA SA 22222222222222

XXXXXX 00000000000000

YYYYYYY 66666666666666

Notem que por causa do SA ele não juntou os dados, porque esta diferente ......

Como é que eu faço pra Juntar os registros, desconsiderando o NOME DO CLIENTE(PAGADOR_NOME) SÓ fazendo o filtro pelo CNPJ DO CLIENTE(PAG_CNPJ).

Mas o nome do cliente deve aparece no relatorio

Eder, acho que a opção simples é:

- remova o nome do cliente da sua consulta, agrupe apenas pelo CNPJ. Isto resolve o problema da duplicação;

- utilize uma consulta para buscar o nome do cliente apenas, onde o parâmetro de filtro é o CNPJ que você terá da consulta inicial.

A cada impressão da linha detalhe (onde estiver sendo impresso o CNPJ), você pode, então, executar a consulta através do CNPJ atualmente selecionado na consulta principal e pegar o primeiro resultado para mover para o label que mostrará o nome da empresa no relatório.

Se você estivesse utilizando o QuickReport, eu lhe diria para utilizar o evento BeforePrint, mas como você está agora utilizando o FreeReport, então acho que você é capaz de achar o evento correto.

Inclusive, se você parametrizar sua segunda consulta e definir o nome do parâmetro igual ao da coluna CNPJ da consulta principal, você poderá apenas ligar esta consulta a principal via propriedade DataSource. Feito isto, ao abrir sua consulta (antes de mostrar o relatório), logo a seguir você abre esta segunda consulta (automaticamente, a cada linha movida na consulta principal, a consulta secundária será refeita. Com isto, você pode ligar a coluna nome da empresa desta consulta a um componente tipo QRDBText que ela apresentará o cliente correto)

A explicação pode estar um pouco complicada, mas analisando com calma, você verá que é simples de implementar. ;)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Ola...Micheus...beleza?

remova o nome do cliente da sua consulta, agrupe apenas pelo CNPJ. Isto resolve o problema da duplicação
R: OK...

a sua idéia eu até peguei.....

tentei resolve-la mas não consegui....

você quer dizer que eu insiro mais uma query e nela a consulta parametrizada(com o filtro nela) né?

Ai eu ligo esta query a um QrLabel na mesma band que imprimi o cnpj do cliente atraves do BeforiPrint com um codigo no OnPrint do QrLabel.

acho que é assim né?

porem não consegui montar o codigo na query ou até mesmo no Onprint.

se for isto poderias me detalhar como montaria este codigo?

Haaa....

Se você estivesse utilizando o QuickReport, eu lhe diria para utilizar o evento BeforePrint, mas como você está agora utilizando o FreeReport, então acho que você é capaz de achar o evento correto.

R.:Neste caso aqui eu tou usando o Quickreport.......na verdade uso agora o Quickreport e o Freereport, dependendo da situação. Neste caso o relatorio já estava pronto é apenas uma correção.

Abraço :D

Link para o comentário
Compartilhar em outros sites

  • 0
a sua idéia eu até peguei.....

tentei resolve-la mas não consegui....

você quer dizer que eu insiro mais uma query e nela a consulta parametrizada(com o filtro nela) né?

Sim.

Ai eu ligo esta query a um QrLabel na mesma band que imprimi o cnpj do cliente atraves do BeforiPrint com um codigo no OnPrint do QrLabel.

acho que é assim né?

Na verdade um QRDBText para não ter que mover o valor para o label.

porem não consegui montar o codigo na query ou até mesmo no Onprint.

se for isto poderias me detalhar como montaria este codigo?

você monta ele junto com o outro (se em run-time) ou direto no componente (se em design-time)

Seu SELECT de totalização ficou assim, não foi:

SELECT PAG_CNPJ, '+
    'SUM(VALOR_FRETE) AS VALOR_FRETE_TOTAL, '+
    'SUM(CONTADOR) AS CONTADOR_TOTAL, '+
    'SUM(KG_CALCULO) AS KG_CALCULO_TOTAL, '+
    'SUM(VALOR_N_FISCAL) AS VALOR_N_FISCAL_TOTAL '+
'FROM CTRC ' +
'WHERE (SITUACAO_CTRC <> "C") '+
    'AND DATA_EMISSAO between :datai and :dataf '+
    'AND NOME_VENDEDOR = ' + QuotedStr(COMBOBOX1.text) +
'GROUP BY PAG_CNPJ ' +  
'ORDER BY 2 DESC';

O outro SELECT (no segundo dataset tipo query) ficaria:

SELECT FIRST(PAGADOR_NOME)

FROM CTRC

WHERE PAG_CNPJ = :PAG_CNPJ

- Daí, você liga a propriedade DataSource deste último query, ao datasource que você conectou a propriedade dataset a sua query principal. Isto fará com que o parâmetro PAG_CNPJ seja obtido daquele dataset onde há um campo exatamente com este nome;

- Quando você abre a consulta principal, logo após você abre esta segunda consulta (lá no início mesmo, antes do preview);

- Uma vez utilizado um QRDBText para mostrar o nome do cliente, basta que você referencie ele com este último dataset e o respectivo campo (PAGADOR_NOME);

- não vai precisar utilizar qualquer evento para isto.

R.:Neste caso aqui eu tou usando o Quickreport.......
bom, as instruções acima, já levam isto em conta.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Grande Micheus..Deu certo. :D

Só nesta parte aqui que mudei:

SELECT FIRST(PAGADOR_NOME)
FROM CTRC
WHERE PAG_CNPJ = :PAG_CNPJ
para
SELECT PAGADOR_NOME
FROM CTRC
WHERE PAG_CNPJ = :PAG_CNPJ

tirei o First

pois da erro ...acho que o paradox não suporta pois deu o erro:

CAPACIDADE NÃO SUPORTADA.

Demais deu certinho..

valeu Carinha...mais uma vez muito Grato

abraços

:D

Link para o comentário
Compartilhar em outros sites

  • 0
Só nesta parte aqui que mudei:

SELECT FIRST(PAGADOR_NOME)
FROM CTRC
WHERE PAG_CNPJ = :PAG_CNPJ
para
SELECT PAGADOR_NOME
FROM CTRC
WHERE PAG_CNPJ = :PAG_CNPJ

tirei o First

pois da erro ...acho que o paradox não suporta pois deu o erro:

CAPACIDADE NÃO SUPORTADA.

Eder, o erro foi meu. :ph34r:

Basta não utilizar o parênteses, porque FIRST não é uma função. Ficaria apenas:

SELECT FIRST PAGADOR_NOME

Teste, deve funcionar.

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