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.