Clipper On Line • Ver Tópico - Nome do cnpj raiz mais recente

Nome do cnpj raiz mais recente

Discussão sobre SQL

Moderador: Moderadores

 

Nome do cnpj raiz mais recente

Mensagempor JoséQuintas » 10 Jul 2020 15:12

parcial:

      :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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Nome do cnpj raiz mais recente

Mensagempor JoséQuintas » 10 Jul 2020 16:08

Moleza, SQL é phoda.

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

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Nome do cnpj raiz mais recente

Mensagempor JoséQuintas » 10 Jul 2020 16:10

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Nome do cnpj raiz mais recente

Mensagempor JoséQuintas » 10 Jul 2020 16:14

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

   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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Nome do cnpj raiz mais recente

Mensagempor JoséQuintas » 10 Jul 2020 16:20

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

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

list a->campo, b->campo, c->campo, d->campo, e->campo


considere que a parte do JOIN, é igual ao dbase, relacionando

SET RELATION TO  codigo into B


considere que a parte do WHERE, é igual ao dbase, do FOR

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

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro