Deixar aqui como um exemplo de possibilidades.
WITH OBJECT cnMySql
:cSql := "SELECT LPAD( IDESTOQUE, 6, '0' ) AS ID, ESITEM, ESDATLAN, ESCLIFOR, ESCFOP, ESPEDIDO, ESNUMDOC, ESTIPLAN, " + ;
" ESQTDE * IF( JPITEM.IEQTDCOM < 1, 1, JPITEM.IEQTDCOM ) AS QTDE," + ;
" ESVALOR / IF( JPITEM.IEQTDCOM < 1, 1, JPITEM.IEQTDCOM ) AS VALOR," + ;
" JPITEM.IEUNID AS UNIDADE, JPITEM.IEANP AS ANPPRO," + ;
" JPCADASTRO.CDCNPJ AS CADCNPJ," + ;
" JPCIDADE.CIIBGE AS IBGE," + ;
" JPANPLOC.ALANP AS ANPLOC," + ;
" JPANPINS.AIANP AS ANPINS," + ;
" JPANPAGE.AAANP AS ANPAGE," + ;
" JPANPATI.ATCNAE AS ANPATI," + ;
" JPANPOPE.AOANPREG AS ANPOPEREG," + ;
" JPANPOPE.AOANPNREG AS ANPOPENREG, " + ;
" JPANPOPE.AOANPOUT AS ANPOPEOUT" + ;
" FROM JPESTOQUE" + ;
" LEFT JOIN JPITEM ON JPITEM.IDITEM=JPESTOQUE.ESITEM" + ;
" LEFT JOIN JPCADASTRO ON JPCADASTRO.IDCADASTRO=JPESTOQUE.ESCLIFOR" + ;
" LEFT JOIN JPCIDADE ON JPCADASTRO.CDUF=JPCIDADE.CIUF AND JPCADASTRO.CDCIDADE=JPCIDADE.CINOME" + ;
" LEFT JOIN JPANPLOC ON JPANPLOC.ALIBGE=JPCIDADE.CIIBGE" + ;
" LEFT JOIN JPANPINS ON JPANPINS.AICNPJ=IF( LENGTH( JPCADASTRO.CDCNPJ ) = 18," + ;
" CONCAT( CONCAT( CONCAT( CONCAT( SUBSTR( JPCADASTRO.CDCNPJ, 1, 2 ), " + ;
" SUBSTR( JPCADASTRO.CDCNPJ, 4, 3 ) ), SUBSTR( JPCADASTRO.CDCNPJ, 8, 3 ) ), " + ;
" SUBSTR( JPCADASTRO.CDCNPJ, 12, 4 ) ), SUBSTR( JPCADASTRO.CDCNPJ, 17, 2 ) ), 'X' )" + ;
" LEFT JOIN JPANPAGE ON JPANPAGE.AACNPJ=IF( LENGTH( JPCADASTRO.CDCNPJ ) = 18," + ;
" CONCAT( CONCAT( SUBSTR( JPCADASTRO.CDCNPJ, 1, 2 ), SUBSTR( JPCADASTRO.CDCNPJ, 4, 3 ) ), SUBSTR( CDCNPJ, 8, 3 ) ), 'X' )" + ;
" LEFT JOIN JPANPOPE ON JPANPOPE.AOCFOP=JPESTOQUE.ESCFOP" + ;
" LEFT JOIN JPANPATI ON JPANPATI.ATCNAE=LEFT(JPCADASTRO.CDCNAE,5)" + ;
" WHERE ESDATLAN BETWEEN CAST( " + DateSql( dDataInicial ) + " AS DATE )" + ;
" AND CAST( " + DateSql( dDataFinal ) + " AS DATE )"
:cSql += " AND JPITEM.IEANP IN ( " + ProdutoAnp( "", .T. ) + " )"
:cSql += " AND ESQTDE <> 0"
:cSql += " ORDER BY ESDATLAN"
:Execute()
Esse é daqueles fontes demorados pra converter total.
Anulei várias vezes as alterações, porque os totais não batiam.
Acabei usando um método radical: comecei com SELECT *, demorado mas pelo menos com total batido, funcionando.
Devagar fui substituindo um pedaço do fonte por mais um pedaço de comando SQL, e testando se continuava batido.
Até agora tudo certo.
E o SELECT * agora virou um SELECTÃO kkkk
Mas o fonte... simplificou muuuito.
Isso tem a ver com o arquivo enviado pra ANP (Agência Nacional do Petróleo).
Eles tem tabela pra quase tudo que é tranqueira, e tem que enviar com o código deles, e não o do sistema.
Ainda vou tentar fazer mais ajustes, pra eliminar mais fonte PRG...