Clipper On Line • Ver Tópico - selecionar conforme array

selecionar conforme array

Discussão sobre SQL

Moderador: Moderadores

 

selecionar conforme array

Mensagempor JoséQuintas » 05 Jan 2020 14:13

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.

      :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:
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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

selecionar conforme array

Mensagempor JoséQuintas » 05 Jan 2020 14:23

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

selecionar conforme array

Mensagempor JoséQuintas » 05 Jan 2020 14:31

Só de curiosidade, em DBF, antes da alteração:

   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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes

selecionar conforme array

Mensagempor JoséQuintas » 05 Jan 2020 14:40

Adicionei isto:
         " 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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18152
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1215 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 8 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro