Página 1 de 1

Apenas exemplo Substr()

Enviado: 05 Jan 2020 15:18
por JoséQuintas
Pelo que pesquisei, no MySQL 8.x tem a opção de usar REGEX no select, mas nos anteriores não.
Deixar aqui como um exemplo de possibilidades.

Código: Selecionar todos

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

Apenas exemplo Substr()

Enviado: 06 Jan 2020 01:47
por JoséQuintas
Aconteceu uma coisa interessante nesse troço... aliás... mais de uma.

Tinha código duplicado nos CNAEs... isso multiplicava registros. Acrescentei rotina pra eliminar duplicados.

O mais interessante:
Relaciono quase tudo pelo número de pedido mas....
De estoque direto para nota... problema... porque tem estoque sem pedido e nota sem pedido, acabam sendo relacionados e multiplicando 853 registros pra mais de 80.000

Solução: outro relacionamento
Relacionei estoque com pedido, e pedido com nota fiscal
Ao relacionar com pedido, número zerado não encontra pedido, e ao relacionar pedido com nota fiscal, também não encontra nota fiscal - fim do problema com zerados
Foi uma idéia que deu certo.