Nome do cnpj raiz mais recente

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Nome do cnpj raiz mais recente

Mensagem por JoséQuintas »

parcial:

Código: Selecionar todos

      :cSQL := "SELECT IDPEDIDO, PDCADASTRO, PDVENDEDOR, PDTRANSA," + ;
         " CONCAT( RPAD( PRECNPJ.CNPJNOME, 40, ' ' ), LPAD( JPCADASTRO.CDCNPJ, 10, ' ' ) ) AS GRUPOCLIENTE," + ;
         " RPAD( JPCADASTRO.CDCNPJ, 10, ' ' ) AS CNPJRAIZ," + ;
         " FROM JPPEDIDO" + ;
         " LEFT JOIN JPCADASTRO ON JPCADASTRO.IDCADASTRO = JPPEDIDO.PDCADASTRO" + ;
         " LEFT JOIN (" + ;
         " SELECT RPAD( CDCNPJ, 10, ' ' ) AS CNPJPREFIXO, CDNOME AS CNPJNOME FROM JPCADASTRO GROUP BY RPAD( CDCNPJ, 10, ' ' ) ) AS PRECNPJ" + ;
         " ON RPAD( JPCADASTRO.CDCNPJ, 10, ' ' ) = PRECNPJ.CNPJPREFIXO" + ;
problemas:
- tá falhando
- nome pode ser de um cadastro desativado
- se usar a razao social normal, pode ter nome - cidade, e isso causa quebra
- não posso agrupar por cnpj raiz, porque tem níveis, vém sempre detalhado

nova idéia:
um select Max( id ), left( cnpj, 10 ) agrupado por left( cnpj, 10 ), pra pegar o cadastro mais recente.
e mais um select disso com os nomes relacionados, relacionando o resultado no resto.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Nome do cnpj raiz mais recente

Mensagem por JoséQuintas »

Moleza, SQL é phoda.

Código: Selecionar todos

      :cSQL := "SELECT IDPEDIDO, PDCADASTRO, PDVENDEDOR, PDTRANSA," + ;
         " CONCAT( RPAD( B.CDNOME, 40, ' ' ), RPAD( A.CDCNPJ, ' ', 10 ) ) AS GRUPOCLIENTE," + ;
         " CONCAT( RPAD( A.CDNOME, 40, ' ' ), LPAD( PDCADASTRO, 10, ' ' ) ) AS CLIENTE," + ;
         " RPAD( A.CDCNPJ, 10, ' ' ) AS CNPJRAIZ," + ;
         " FROM JPPEDIDO" + ;
         " LEFT JOIN JPCADASTRO AS A ON A.IDCADASTRO = JPPEDIDO.PDCADASTRO" + ;
         " LEFT JOIN (" + ;
            " SELECT RPAD( CDCNPJ, 10, ' ' ) AS CNPJPREFIXO, MAX( IDCADASTRO ) AS IDCNPJ" + ;
            " FROM JPCADASTRO" + ;
            " GROUP BY RPAD( CDCNPJ, 10, ' ' ) ) AS PRECNPJ" + ;
         " ON RPAD( A.CDCNPJ, 10, ' ' ) = PRECNPJ.CNPJPREFIXO" + ;
         " LEFT JOIN JPCADASTRO AS B ON B.IDCADASTRO = PRECNPJ.IDCNPJ" + ;
Parece complicado.... mas nem tanto
Como seria no dbase, supondo que funcione:

Código: Selecionar todos

USE clientes ALIAS matriz INDEX a NEW // idcadastro

use clientes ALIAS cnpj   INDEX b NEW // prefixo cnpj + idcadastro descend
SET RELATION TO idcadastro INTO matriz

use clientes ALIAS a    INDEX c new // idcadastro
SET RELATION TO Left( cdcnpj, 10 ) INTO cnpj

use pedidos new
SET RELATION TO pdcadastro into a

list jppedido->pdcadastro, a->cdnome, cnpj->cdcnpj, matriz->cdnome
Como eu já disse antes, é como se o SQL fosse um dbase melhorado.
Pra quem não lembra, ou não viu, o dbase e o foxpro permitiam isso: digitar consultas pra ter o retorno, igual fazemos no HeidiSQL, mas encima de DBF.

Então... é quase pensar como no dbase... mas juntando vários comandos em um.

Tava aqui pensando....
talvez porque sou do tempo do DBASE tenha facilidade com isso.

Cada vez mais acho o seguinte:
No dbase era só digitar comandos, coisa automática com comandos, em Clipper tinha que fazer programas.
Os programadores falavam: poxa, tão fácil digitar comando, pra que fazer programa?
Aí pegaram o dBASE, que deixou de ser usado, acrescentaram recursos e virou o SQL.

Porque?
Só olhar acima
O que mudou do dbase pro SQL?

1 - juntar comandos em um só
2 - permitir ser usado pelo programa

O resto... foi evolução natural, que acabaria acontecendo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Nome do cnpj raiz mais recente

Mensagem por JoséQuintas »

Aproveitando...

Aos velhinhos do tempo do dbase que nem eu.....
Considerem que o SQL é o dBase, que já conhecem, e sejam felizes.
Não é nada do outro mundo, é só questão de se acostumar com as "novidades".
E ele não morde, pode ir se acostumando, se divertir testando, e depois se divertir usando.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Nome do cnpj raiz mais recente

Mensagem por JoséQuintas »

Só pra curiosidade....
O comando inteiro, que ainda precisa melhorar pra substituir totalmente o temporário que vém depois.

Código: Selecionar todos

   WITH OBJECT cnSQL
      :cSQL := "SELECT IDPEDIDO, PDCADASTRO, PDVENDEDOR, PDTRANSA," + ;
         " PDPEDCLI," + ;
         " IF( JPNOTFIS.NFNOTFIS IS NULL, JPPEDIDO.PDDATEMI, JPNOTFIS.NFDATEMI ) AS DATEMI," + ;
         " IF( JPNOTFIS.NFNOTFIS IS NULL, JPPEDIDO.PDPEDCLI, JPNOTFIS.NFNOTFIS ) AS NOTFIS," + ;
         " JPTRANSA.TRDESCRI AS TRANOME, JPTRANSA.TRREACAO AS REACAO," + ;
         " JPNOTFIS.NFNOTFIS AS NOTFIS," + ;
         " JPITPED.IPPRODUTO," + ;
         " JPITPED.IPQTDE," + ;
         " JPITPED.IPVALCUS, JPITPED.IPVALNOT," + ;
         " JPITEM.IEPRODEP," + ;
         " CONCAT( RPAD( JPVENDEDOR.VDDESCRI, 40, ' ' ), LPAD( PDVENDEDOR, 6, ' ' ) ) AS VENDEDOR," + ;
         " CONCAT( RPAD( JPITEM.IEDESCRI, 40, ' ' ), LPAD( IPPRODUTO, 6, ' ' ) ) AS PRODUTO," + ;
         " CONCAT( RPAD( B.CDNOME, 40, ' ' ), RPAD( A.CDCNPJ, ' ', 10 ) ) AS GRUPOCLIENTE," + ;
         " CONCAT( RPAD( A.CDNOME, 40, ' ' ), LPAD( PDCADASTRO, 10, ' ' ) ) AS CLIENTE," + ;
         " IF( JPITEM.IEQTDCOM = 0, 1, JPITEM.IEQTDCOM ) * JPITPED.IPQTDE AS QTDEMBALAGEM," + ;
         " JPITPED.IPVALNOT - JPITPED.IPVALCUS AS VMARGEM," + ;
         " IF( JPITPED.IPVALNOT = 0, 0, ( JPITPED.IPVALNOT - JPITPED.IPVALCUS ) / JPITPED.IPVALNOT * 100 ) AS PMARGEM," + ;
         " RPAD( A.CDCNPJ, 10, ' ' ) AS CNPJRAIZ," + ;
         " IF( JPTRANSA.TRREACAO LIKE '%DEV%', -1, 1 ) AS FATOR," + ;
         " IF( JPCOMISSAO.CMVALOR IS NOT NULL, JPCOMISSAO.CMVALOR, IF( JPVENDEDOR.VDCOMISSAO IS NULL, 0, JPVENDEDOR.VDCOMISSAO ) ) AS PCOMISSAO," + ;
         " IF( JPCOMISSAO.CMVALOR IS NOT NULL, JPCOMISSAO.CMVALOR, IF( JPVENDEDOR.VDCOMISSAO IS NULL, 0, JPVENDEDOR.VDCOMISSAO ) ) * JPITPED.IPVALNOT / 100 AS VCOMISSAO" + ;
         " FROM JPPEDIDO" + ;
         " LEFT JOIN JPNOTFIS ON JPNOTFIS.NFPEDIDO = JPPEDIDO.IDPEDIDO" + ;
         " LEFT JOIN JPTRANSA ON JPTRANSA.IDTRANSA = JPPEDIDO.PDTRANSA" + ;
         " LEFT JOIN JPITPED ON JPITPED.IPPEDIDO = JPPEDIDO.IDPEDIDO" + ;
         " LEFT JOIN JPITEM ON JPITEM.IDPRODUTO = JPITPED.IPPRODUTO" + ;
         " LEFT JOIN JPCADASTRO AS A ON A.IDCADASTRO = JPPEDIDO.PDCADASTRO" + ;
         " LEFT JOIN JPCOMISSAO ON JPCOMISSAO.CMVENDEDOR = PDVENDEDOR AND CMPRODEP = JPITEM.IEPRODEP" + ;
         " LEFT JOIN JPVENDEDOR ON JPVENDEDOR.IDVENDEDOR = JPPEDIDO.PDVENDEDOR" + ;
         " LEFT JOIN (" + ;
            " SELECT RPAD( CDCNPJ, 10, ' ' ) AS CNPJPREFIXO, MAX( IDCADASTRO ) AS IDCNPJ" + ;
            " FROM JPCADASTRO" + ;
            " GROUP BY RPAD( CDCNPJ, 10, ' ' ) ) AS PRECNPJ" + ;
         " ON RPAD( A.CDCNPJ, 10, ' ' ) = PRECNPJ.CNPJPREFIXO" + ;
         " LEFT JOIN JPCADASTRO AS B ON B.IDCADASTRO = PRECNPJ.IDCNPJ" + ;
         " WHERE PDCONF = 'S'" + ;
         " AND PDTRANSA IN (" + ;
         " SELECT IDTRANSA FROM JPTRANSA AS LISTAA WHERE "
      IF nOpcCompraVenda == 1
         :cSQL += " TRREACAO LIKE '%VENDA%'"
      ELSEIF nOpcCompraVenda == 2
         :cSQL += " TRREACAO LIKE '%COMPRA%'"
      ELSE
         :cSQL += " ( TRREACAO LIKE '%COMPRA%' OR TRREACAO LIKE '%VENDA%' )"
      ENDIF
      IF nOpcDevol == 2
         :cSQL += " AND TRREACAO LIKE '%DEV%'"
      ENDIF
      :cSQL += " )"
      IF nOpcVendedor == 2
         :cSQL += " AND PDVENDEDOR = " + NumberSQL( mIdVendedor )
      ENDIF
      IF nOpcCadastro == 2
         :cSQL += " AND PDCADASTRO IN (" + ;
            " SELECT IDCADASTRO FROM JPCADASTRO AS LISTA WHERE LEFT( CDCNPJ, 10 ) = " + ;
            " ( SELECT LEFT( CDCNPJ, 10 ) FROM JPCADASTRO AS ESCOLHIDO WHERE IDCADASTRO = " + NumberSQL( nIdCadastro ) + " ) )"
      ENDIF
      IF nOpcProduto == 2
         :cSQL += " AND JPITEM.IDPRODUTO = " + NumberSQL( nIdProduto )
      ENDIF
      IF nOpcProDep == 2
         :cSQL += " AND JPITEM.IEPRODEP = " + NumberSQL( nIdProDep )
      ENDIF
      :cSQL += " AND ( JPNOTFIS.NFNOTFIS IS NOT NULL OR NOT" + ;
         " JPPEDIDO.PDTRANSA IN ( SELECT IDTRANSA FROM JPTRANSA AS LISTAB WHERE TRREACAO LIKE '%N+%' OR TRREACAO LIKE '%N-%' ) )" + ;
         " AND IF( JPNOTFIS.NFNOTFIS IS NULL, PDDATEMI, NFDATEMI ) BETWEEN CAST( " + DateSQL( dDataInicial ) + " AS DATE )" + ;
         " AND CAST( " + DateSQL( dDataFinal ) + " AS DATE )"
      :cSQL += " ORDER BY " + aChaveList[ 1 ] + ", " + aChaveList[ 2 ] + ", " + aChaveList[ 3 ] + ", " + aChaveList[ 4 ]
      :Execute()
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Nome do cnpj raiz mais recente

Mensagem por JoséQuintas »

Pra quem não está acostumado.....

Considere que a parte do select, é igual ao dbase, LIST usando ALIAS

Código: Selecionar todos

list a->campo, b->campo, c->campo, d->campo, e->campo
considere que a parte do JOIN, é igual ao dbase, relacionando

Código: Selecionar todos

SET RELATION TO  codigo into B
considere que a parte do WHERE, é igual ao dbase, do FOR

Código: Selecionar todos

FOR a->codigo < 10 .AND. b->nome = "a" .AND. c->data >= datainicial .AND. c->data <= datafinal
considere que a parte do ORDER BY, é igual INDEX ON no final

Código: Selecionar todos

INDEX ON ....
Pronto... igual o dBase/Harbour

As complicações.... não são complicações... são apenas novidades, mais recursos, coisa que temos sempre no Harbour e vamos aprendendo as novidades conforme precisamos/conhecemos.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder