Apenas exemplo Substr()

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Apenas exemplo Substr()

Mensagem 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...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Apenas exemplo Substr()

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder