Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Giuliano Santos

Contagem de registros com firebird

Recommended Posts

Fiz um sistema em PHP para importar dados de um banco Firebird para o MySQL. A importação dos dados esta funcionando perfeitamente.

O que não estou conseguindo fazer é a barra de progressão pois não estou conseguindo contar os registros do banco Firebird.

 

Alguém poderia me ajudar com esse problema?

 

Segue o código que eu fiz:

<?phpset_time_limit(0);//zera o limite de tempo//conexao com mysql$mysql=mysql_connect('192.168.80.4','intranet','intranet');	mysql_select_db("intranet", $mysql);//conexao com firebird$ibase=ibase_connect("127.0.0.1:c:/base/BD","user","key") or die ('Erro ao conectar');$busca=ibase_query($ibase,"select pre.numero as pre_faturamento,				nf.nota as nf,				pv.cod_pedidov as pedido,				pre.data as data,				cli.cod_cliente as cod_cliente,				cli.nome as cliente,				pre.usu_incluiu as usuario_incluiu,				pre.data_expedicao as hora_aprov,				pre.usu_expedicao as usuario_aprovou,				pre.dataconferido as hora_conferido,				pre.userconferido as usuario_conferiu,				sum (pe.quantidade) as qtd			from prefaturamentos pre			inner join pedido_venda pv on pv.pedidov = pre.pedidov			inner join clientes cli on cli.cliente = pre.cliente			inner join produtos_eventos pe on pe.pedido = pv.pedidov			inner join saidas s on s.saida = pe.cod_operacao			inner join nf on nf.cod_operacao = s.saida and nf.tipo_operacao = s.tipo_operacao_s and nf.cancelada = 'F' and nf.estornado = 'F'			where pre.data >= '04.03.2015' and					pre.excluido = 'F'			group by 1,2,3,4,5,6,7,8,9,10,11");$i = 0;$total= count($busca);while ($row=ibase_fetch_object($busca)){    //para deletar o registro antigo e coloca-lo novamente posso usar o REPLACE no lugar de INSERT    $sql =mysql_query("REPLACE into expedicao (	pre_faturamento,						nf,						pedido,						data,						cod_cliente,						cliente,						usuario_incluiu,						hora_aprov,						usuario_aprovou,						hora_conferido,						usuario_conferiu,						qtd					      ) 					      values ('".$row->PRE_FATURAMENTO."',						      '".$row->NF."',						      '".$row->PEDIDO."',						      '".$row->DATA."',						      '".$row->COD_CLIENTE."',						      '".$row->CLIENTE."',						      '".$row->USUARIO_INCLUIU."',						      '".$row->HORA_APROV."',						      '".$row->USUARIO_APROVOU."',						      '".$row->HORA_CONFERIDO."',						      '".$row->USUARIO_CONFERIU."',						      '".$row->QTD."'						     )", $mysql);             $i++;		//Mostra barra de progreção    $largura=($i*100)/$total;//calcula andamento da operação em percentual    $perc= (int) ($largura);    echo "<div style='width:300px; height:20px; background:#fff; border:1px solid #f00; position:absolute; top:55px; left:10px'>          <div style='width:$largura%; height:20px; background:#f00; position:absolute; top:0; left:0'></div>          </div>          <div style='width:100px; height:20px; background:#fff; position:absolute; top:95px; left:155px'>$perc</div>";}if($sql){echo $i." Registros importados <br>";}?>

Alguém poderia me dar alguma dica? Pelo menos o que eu devo procurar na internet.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui fazer a contagem alterando a linha:

$total= count($busca);

por:

while (ibase_fetch_object($busca)){$total++;}

Porem agora ele não executa o while que vem depois:

while ($row=ibase_fetch_object($busca)){
           ..............

O que pode ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia pessoal...

Estou tendo o mesmo problema que o Giuliano Santos so que para validar um retorno de uma consulta.

Quero validar se o select retornou dados e não estou conseguindo. Segue o codigo.

 

Já fiz varias pesquisas na Internet e tambem consultei o manual do php e não encontrar a solução.

 

Variaveis: $conexao : retorna a conexao com o banco.

 

$sql = 'SELECT * FROM USUARIOS';

 

$resultado = ibase_query($conexao,$sql);

 

Nesse momento queria validar se retornou algum registro e unica forma que encontrei foi:

 

$i=0;

while($rown = ibase_fetch_object($resultado)) {

$i++;

}

 

if ($i > 0) {

 

$resultado = ibase_query($conexao,$sql);

 

while($rown = ibase_fetch_object($resultado)) {

$variavel1 = $rown->campo1;

$variavel2 = $rown->campo2;

$variavel3 = $rown->campo2;

...

}

}else{

echo "Não foi encontrado nenhum registro na base de dados!";

}

 

Dessa maneira eu tenho que repetir $resultado = ibase_query($conexao,$sql), nao achei legal isso. Gostaria de saber se tem alguma forma de resolver essa questao. Se eu nao repetir acontece igual ao do amigo Giuliano, ao fazer o laço nao acontece nada.

 

Por exemplo no mysql tem uma função que ja retorna o total de registro no select. mysql, que é mysql_affected_row($resultado). Para interbase/firebird nao existe.

 

Alguem pode ajudar por favor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Firebird >= 2:

SELECT COUNT(*) FROM (select * from table);
Firebird < 2:

create view my_employees as select * from table;
commit;
SELECT COUNT(*) FROM my_employees;
commit;
drop view my_employees;
Fonte:

The Firebird FAQ - How to get record count for any query without executing it?

 

 

Lembrando que, nesse caso, o manual do PHP não é indicado, visto que Firebird não é a mesma coisa que PHP.

 

Obs. 1: ibase_fetch_object move o cursor do resource, por isso o segundo o while não funciona. Além do mais, não é uma boa solução utilizar um while só para contar registros.

 

Obs. 2: Evite "ressuscitar" tópicos antigos, abra um novo conforme as orientações e regras do fórum de PHP

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiramente Gabriel, quero te agradecer pela resposta. Para quem esta começando a conhecer uma linguagem de programação é muito importante essas ajudas.

Eu citei o manual do php porque nele mostra uma função do mysql que faz isso, como eu preciso é do firebird e dele não tem e também porque já vi varias respostas em que a pessoa ao invés de ajudar com alguma ideia simplesmente escreve "já olhou no manual do php?". Isso realmente me deixa chateado porque se não pode ajudar não atrapalhe.

Exatamente o que eu disse na minha duvida, usar o while por duas vezes não achei legal mesmo.

Na questão de ressuscitar o tópico peço minhas sinceras desculpas, não foi minha intenção infringir as regras do forum. Sou uma pessoa que gosta de regras e de segui-las. Estava à procura dessa informação já tem alguns dias que nem me atentei nesse item. Prometo não o faze-la mais.

Grande abraço e parabéns para todos vocês...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.