Página 1 de 1

Nome do cnpj raiz mais recente

Enviado: 10 Jul 2020 15:12
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.

Nome do cnpj raiz mais recente

Enviado: 10 Jul 2020 16:08
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.

Nome do cnpj raiz mais recente

Enviado: 10 Jul 2020 16:10
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.

Nome do cnpj raiz mais recente

Enviado: 10 Jul 2020 16:14
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()

Nome do cnpj raiz mais recente

Enviado: 10 Jul 2020 16:20
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.