selecionar conforme array

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

selecionar conforme array

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

selecionar conforme array

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

selecionar conforme array

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

selecionar conforme array

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