[RESOLVIDO] Erro com sc_exec_sql

Pessoal, mais um erro estranho…

Eu estou pegando informações de um arquivo css para poder importar para um banco MySQL… parece que estou tendo problemas em importar decimais…

O arquivo CSS está assim:

ELEMENTAR,PRECO
“00001”,“54”
“00002”,“7.35”
“00003”,“7.969”
“00004”,“3.616”
“00005”,“6.41”
“00006”,“8.98”
“00007”,“1.829”

Eu ajustei o programa para não ler a primeira linha, do cabeçalho…

Os dados estão chegando ok, conforme observamos no código:

$handle = fopen($uploadfile,“r”);

while (($data = fgetcsv($handle,1000,",",’"’)) !== FALSE)
{
if(trim($data[0])!=“ELEMENTAR”)
{
$insert_sql = “INSERT INTO tb_emop_elementar (emel_tx_versao, emel_tx_elementar, emel_vl_preco) VALUES (’”.$tx_versao."’,’" . $data[0] . “’,” . $data[1].");";

   //$uploadfile e $tx_versão referen-se, respectivamente, ao nome do arquivo csv e a versão dele
					
    sc_exec_sql($insert_sql);
}			

}

O sql fica assim: INSERT INTO tb_emop_elementar (emel_tx_versao, emel_tx_elementar, emel_vl_preco) VALUES (‘0416’,‘00001’,54);

Acontece que quando eu jogo isso direto no banco mysql o código funciona normalmente, mas por dentro do ScriptCase, não!
Ele só funciona se eu RETIRAR emel_vl_preco e o seu valor da string SQL… muito louco isso… já tentei colocar o valor entre aspas simples, tudo em aspas duplas, os dados de texto em aspas duplas, etc… o banco, no campo emel_vl_preco está como decimal (21,4) ou seja, está com 4 casas decimais… eu vou precisar completar as 4 casas decimais??? Já tentei também colocar a formatação de número com vírgula e, claro, deu erro…

Será um bug do scriptcase ou eu que estou ficando maluco?

Veja se ele esta montando a string de insert Corretamente:

while (($data = fgetcsv($handle,1000,",",’"’)) !== FALSE)
{
if(trim($data[0])!=“ELEMENTAR”)
{
$insert_sql = “INSERT INTO tb_emop_elementar (emel_tx_versao, emel_tx_elementar, emel_vl_preco) VALUES (’”.$tx_versao."’,’" . $data[0] . “’,” . $data[1].");";

    echo 'SQL = '.$insert_sql."<BR>";

   //$uploadfile e $tx_versão referen-se, respectivamente, ao nome do arquivo csv e a versão dele
              
    // sc_exec_sql($insert_sql);
}         

}

break;

A sql estava sendo gerada certinha sim… já tinha visto… mandei um number_format($vl_preco,4,’.’,’’) e joguei o valor de $data[1] assim: $vl_preco=$data[1]; agora está falando que eu estou usando number_format em uma variável que não é de número… mas o insert funcionou… vou ver o que faço agora pra essa mensagem sumir da tela… agora eu não entendi o porque da macro sc_exec_sql me OBRIGAR a inserir os dados com 4 casas decimais… muito louco isso… não deveria funcionar assim, penso…

Ainda tive que dar um floatval na variável… ficou assim:

$handle = fopen($uploadfile,“r”);

while (($data = fgetcsv($handle,1000,",",’"’)) !== FALSE)
{

$tx_elementar=$data[0];
$vl_preco=floatval($data[1]);

$insert_sql = "INSERT INTO
                         tb_emop_elementar  
                         (emel_tx_versao, 
                         emel_tx_elementar,
		     emel_vl_preco) 
		VALUES
		     ('".$tx_versao."','".
		     $tx_elementar . "'," . 
		     number_format($vl_preco,4,'.','') . 
		     ");";

sc_exec_sql($insert_sql);
sc_commit_trans();       

}

Não entendi o porque disso não, mas tudo bem…

Usa a conexão PDO também, ela normaliza os dados para o SGDB.

Fui até dar uma conferida… estou usando PDO… uso normalmente assim…

Carlos,

Ao que parece na hora de gerar o comando INSERT, os valores estão sendo considerados como INTEIROS, não pegando a parte decimal. Experimente criar uma variável com o valor que deseja e coloque no INSERT.