Luiz Fernando Posted April 6, 2014 Report Share Posted April 6, 2014 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 Quote Link to comment Share on other sites More sharing options...
miragerr Posted April 7, 2014 Report Share Posted April 7, 2014 Ola Luiz Tem como voce mostra como fica a query montada. Voce ja tentou realizar direto em um Front do mysql ? Fico no aguardo. Quote Link to comment Share on other sites More sharing options...
alex2002 Posted April 7, 2014 Report Share Posted April 7, 2014 Olá Luis, Tente: /// cCodi := ""for y:=1 to len(aCli) cCodi += "'"+ANY2SQL( aCli[y,1] ) + "',"nextcCodi := 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 Quote Link to comment Share on other sites More sharing options...
Erciley Junior Posted April 7, 2014 Report Share Posted April 7, 2014 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 "," Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted April 15, 2014 Author Report Share Posted April 15, 2014 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 + ") " Quote Link to comment Share on other sites More sharing options...
kleyber Posted April 15, 2014 Report Share Posted April 15, 2014 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. Quote Link to comment Share on other sites More sharing options...
Erciley Junior Posted April 15, 2014 Report Share Posted April 15, 2014 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 ? Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted April 15, 2014 Author Report Share Posted April 15, 2014 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/ Quote Link to comment Share on other sites More sharing options...
Erciley Junior Posted April 15, 2014 Report Share Posted April 15, 2014 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. Quote Link to comment Share on other sites More sharing options...
kleyber Posted April 15, 2014 Report Share Posted April 15, 2014 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. Quote Link to comment Share on other sites More sharing options...
kleyber Posted April 15, 2014 Report Share Posted April 15, 2014 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. Entendi. Então blz. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.