Página 1 de 1

selecionar conforme array

Enviado: 05 Jan 2020 14:13
por JoséQuintas
Lembro de ter passado por isso nas pesquisas da internet, mas agora tá difícil encontrar.

É algo do tipo procurar em ( a, b, c ) e substituir por ( 1, 2, 3 ) conforme a posição.

Por enquanto usei o CASE WHEN e foi.

Código: Selecionar todos

      :cSql := "SELECT LPAD( IDCADASTRO, 6, '0' ) AS ID, " + ;
         " CDNOME, CDCEP, CDENDERECO, CDBAIRRO, CDCIDADE, CDCEP, " + ;
         " MAXEMI.DATA," + ;
         " " + RegiaoList() + " AS REGIAO" + ;
         " FROM JPCADASTRO" + ;
         " LEFT JOIN ( SELECT FICLIFOR, MAX(FIDATEMI) AS DATA FROM JPFINAN GROUP BY FICLIFOR ) AS MAXEMI ON MAXEMI.FICLIFOR=JPCADASTRO.IDCADASTRO" + ;
         " WHERE YEAR( MAXEMI.DATA ) > 2012" + ;
         " ORDER BY REGIAO"
a montagem é aqui, e com certeza a lista completa é bem maior:

Código: Selecionar todos

FUNCTION RegiaoList()

   LOCAL oRegioes := {}, oElement, cSql

   AAdd( oRegioes, { "B2", "010", "CENTRO (SE E REPUBLICA)" } )
   AAdd( oRegioes, { "B2", "011", "BOM RETIRO" } )

   cSql := " CASE"
   FOR EACH oElement IN oRegioes
      cSql += " WHEN LEFT( CDCEP, 3 ) = " + StringSql( oElement[ 2 ] ) + " THEN " + StringSql( oElement[ 1 ] + "-" + oElement[ 3 ] )
   NEXT
   cSql += " ELSE ''"
   cSql += " END"

   RETURN cSql
O SELECT é pra trazer os clientes, indicando a qual região cada um pertence.
Talvez até melhor gravar isso em tabela no MySQL pra simplificar, e pro cliente adicionar regiões...
É que na época foi só teste... não sei se futuramente pode ser usado pra valer... mas como estou convertendo tudo.... até testes estou convertendo...

selecionar conforme array

Enviado: 05 Jan 2020 14:23
por JoséQuintas
Nota sobre o comando anterior:

Se não usar a sub-query, o troço fica uma carroça, não sei dizer quanto tempo demora, porque em todas as vezes cancelei antes de terminar kkk
Com a sub-query, fica instantâneo.

selecionar conforme array

Enviado: 05 Jan 2020 14:31
por JoséQuintas
Só de curiosidade, em DBF, antes da alteração:

Código: Selecionar todos

   LOCAL cRegiao, cTmpFile

   IF ! AbreArquivos( "jpfinan", "jpcadastro" )
      RETURN
   ENDIF
   cTmpFile := { MyTempFile( "cdx" ), MyTempFile( "csv" ) }
   SELECT jpfinan
   OrdSetFocus( "cliente" )
   SET FILTER TO Year( jpfinan->fiDatEmi ) > 2012
   SELECT jpcadastro
   INDEX ON pTesCodigoRegiao( jpcadastro->cdCep ) + jpcadastro->cdCep TO ( cTmpFile[ 1 ] )
   SET FILTER TO TemMovimento()
   GOTO TOP
...
FUNCTION pTesCodigoRegiao( cCep )

   LOCAL oRegioes := {}, cRegiao := "XX", oElement

   AAdd( oRegioes, { "B2", "010", "CENTRO (SE E REPUBLICA)" } )
   AAdd( oRegioes, { "B2", "011", "BOM RETIRO" } )
   
   FOR EACH oElement IN oRegioes
      IF Substr( cCep, 1, 3 ) == oElement[ 2 ]
         cRegiao := Pad( oElement[ 1 ] + " - " + oElement[ 3 ], 50 )
         EXIT
      ENDIF
   NEXT

   RETURN cRegiao

STATIC FUNCTION TemMovimento()

   LOCAL nSelect, lReturn

   nSelect := Select()
   SELECT jpfinan
   SEEK jpcadastro->idCadastro
   lReturn := ( ! "***" $ jpcadastro->cdNome .AND. ! Eof() )
   SELECT ( nSelect )

   RETURN lReturn
Agora vi que faltou uma coisa: retirar clientes com *** no nome.

selecionar conforme array

Enviado: 05 Jan 2020 14:40
por JoséQuintas
Adicionei isto:

Código: Selecionar todos

         " LEFT JOIN JPCLISTA ON JPCLISTA.IDCLISTA=JPCADASTRO.CDSTATUS" + ;
         " WHERE NOT JPCLISTA.CSBLOQUEIO = '0'" + ;
         " AND YEAR( MAXEMI.DATA ) > 2012" + ;
         " AND NOT JPCADASTRO.CDNOME LIKE '***%'" + ;
já elimina clientes desativados/bloqueados e os com asterisco (este último só pra compatibilidade com versões anteriores).
Coloquei o where numa ordem que achei ser mais rápida pra decidir, mas NÃO sei se faz diferença pro MySQL.