Jump to content
Fivewin Brasil

Ajuda com uma query


Luiz Fernando

Recommended Posts


Colegas preciso fazer uma coisa que na logica seria simples mais não da certo, pelo código abaixo será que alguém copnsegue vizualizar aonde estou errando...obrigado

cCodi := ""

for y:=1 to len(aCli)

     cCodi += ANY2SQL( aCli[y,1] ) + ","

next

cCodi := Left(cCodi,Len(cCodi)-1)  // Para retirar a Ultima ","

cSql:="SELECT v.cliente"

cSql+=" FROM vendas as v"

cSql+=" WHERE v.data >= "+Any2Sql(dt1)

cSql+=" AND v.data <= "+Any2Sql(dt2)

cSql+=" AND v.cliente IN (" + cCodi + ") "

o resultado disto é zero, agora se eu deixar so where do campo v.data, ou so o where do campo v.cliente da certo, mais preciso filtrar os dois, o v.data e o v.cliente

tentei fazer algo como abaixo mais tb não deu certo

cCodi:=" where ("
for i=1 to len(aCli)
     if i > 1
        cCodi += "or("
     endIf
     cCodi += "v.cliente='"+aCli[i,1]+"' and v.data >= "+Any2Sql(dt1)+" and v.data <="+Any2Sql(dt1)+" )"
next
cSql="SELECT v.cliente"
cSql+=" FROM vendas as v"
cSql+=cCodi

Obrigado

Luiz Fernando

Link to comment
Share on other sites

Olá Luis,

Tente:

///

cCodi := ""

for y:=1 to len(aCli)

cCodi += "'"+ANY2SQL( aCli[y,1] ) + "',"

next

cCodi := Left(cCodi,Len(cCodi)-1) // Para retirar a Ultima ","

//

//

cSql:="SELECT v.cliente"

cSql+=" FROM vendas as v"

cSql+=" WHERE v.data >= "+Any2Sql(dt1)

cSql+=" AND v.data <= "+Any2Sql(dt2)

cSql+=" AND v.cliente IN (" + cCodi + ") "

//

veja se funciona

Link to comment
Share on other sites

Luis, pra resolver isto basta você por um MSGGET após montar a String do SELECT, e verá se tem ou não algum erro ^^ (óbviousssss )

Ou talvez, dentro do período estipulado, não tenha registro para os clientes que estão no IN(...), e por isso nada é retornado.

E isso de retirar a última vírgula..... faça assim:

cCodi:=''
 
for y:=1 to len(aCli)
   cCodi:=IF( EMPTY(cCodi) , '' , ',' )
 
   cCodi+=SQLNTRIM( aCli[y,1] ) // ANY2SQL( aCli[y,1] ) + "," ----- não uso esse Any2sql, então dei tchau pra ele ^^
next
 
// NÃO PRECISA DISSO, SÓ CONFUNDE------ cCodi := Left(cCodi,Len(cCodi)-1)  // Para retirar a Ultima ","
Link to comment
Share on other sites

Colegas obrigado pela ajuda, tinha desistido da rotina por não chegar a um resultado, ontem voltei a mexer nela, e estava com erro de lógica, queria analisar as ultimas vendas de um período e depois verificar os últimos três meses de compra desses cliente, só que na integração do sistema de dbf para mysql não integrei o campo ultima venda, por isto o resultado era sempre 0...

o código final ficou assim

cSql="SELECT cod_client,razao,fantasia,date_format(ultvenda,'%d/%m/%Y')"
cSql+=" FROM cliente"
cSql+=" WHERE ultvenda >= "+Any2Sql(dt1)
cSql+=" AND ultvenda <= "+Any2Sql(dt2)
SqlExecute("commit")    
aCli:=sqlArray(cSql)

 cCodi := ""
 for y:=1 to len(aCli)
      cCodi += ANY2SQL( aCli[y,1] ) + ","
 next
 cCodi := Left(cCodi,Len(cCodi)-1)  // Para retirar a Ultima ","
 
 cSql:="SELECT extract(month from v.data) AS mes"
 cSql+=",extract(year from v.data) AS ano"
 cSql+=",sum(v.total),v.cliente,count(*)"
 cSql+=",c.razao"
 cSql+=" FROM vendas as v"
 cSql+=" LEFT JOIN cliente as c on v.cliente = c.cod_client"
 cSql+=" WHERE v.data >= "+Any2Sql(dt_inicio)
 cSql+=" AND v.data <= "+Any2Sql(dt_final)
 cSql+=" AND v.cliente IN (" + cCodi + ") "
 
Link to comment
Share on other sites

Luis Fernando,

Só um detalhe: Depois de um SELECT você não precisa executar SqlExecute("commit"). Somente se houver inserções, atualizações ou exclusões em que houverem transação.

Creio que ela faça isso devido "particularidades da SQLLIB.

Luiz, lembro o pq vc faz isso...... mas não deveria fazer após o sqlArray ?

Link to comment
Share on other sites

Luis Fernando,

Só um detalhe: Depois de um SELECT você não precisa executar SqlExecute("commit"). Somente se houver inserções, atualizações ou exclusões em que houverem transação.

Colega sobre o sqlcommit é um assunto que já deve mais de um topico do assunto no forum sem reposta, aonde a unica solução para contornar o problema foi com a dica do Erciley usando o sqlcommit antes de cada sqlarray...

Abraços

Luiz Fernando

http://fivewin.com.br/index.php?/topic/21111-sqllib/

Link to comment
Share on other sites

Colega sobre o sqlcommit é um assunto que já deve mais de um topico do assunto no forum sem reposta, aonde a unica solução para contornar o problema foi com a dica do Erciley usando o sqlcommit antes de cada sqlarray...

Abraços

Luiz Fernando

http://fivewin.com.br/index.php?/topic/21111-sqllib/

Verdade...... foi dito para usar "antes", para finalizar a transação criada no ID atual, para aí fazer um novo select pegando as informações atualizados no banco.

Link to comment
Share on other sites

Ok, tudo bem, mas o SqlCommit é para execuções que envolvam transação. Se não houver um BEGIN TRANSACTION/END TRANSACTION definido, não vejo necessidade. Não acompanhei o tópico citado, mas se a solução foi essa realmente deve ser alguma particularidade da SQLLIB, pois normalmente em SQL não precisamos disto nessa situação.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...