Fatal error: Call to a member function Close()

Olá

Estou com um problema quando tento inserir um registro.
Este problema começou quando tive que mudar a base de dados de Mysql para Firebird.
Estou fazendo a migração de um sistema feito em Delphi para o Scriptcase. Tentei usar o Mysql para substituir o Firebird, nao tive sucesso por causa das limitações de Triggers que o Mysql tem.
A aplicação ja estava num estágio avançado em Mysql quando decidi mudar para o Firebird.
Mantive o mesmo nome da conexão e sincronizei todas as tabelas para nao ter erro.
Depois disto alguns formularios (não todos) passaram a gerar a mensagem de erro (Fatal error… igual esta abaixo).
Tentei resolver revendo tudo, sem sucesso, deletei os forms com erro e estou reconstruindo.
Todos tinham dado certo ate chegar neste que voltou a dar o erro abaixo mesmo tendo refeito do zero.

Fatal error: Call to a member function Close() on a non-object in C:\Program Files (x86)\NetMake\v5\wwwroot\scriptcase\app\SisCompras\form_classficacao_produto\form_classficacao_produto_apl.php on line 2114

Agora não sei o que fazer, porque nao sei a causa do problema.

Alguem pode me ajudar?

poe a aplicação no modo debug … deve ser algum comando diferente … vamos ver.

Diogo,

olha o que acontece

(firebird): select count(*) from CLASSFICACAO_PRODUTO where CD_CLASS = -104: Dynamic SQL Error SQL error code = -104 as approximate floating-point values in SQL dialect 1, but as 64-bit

     ADOConnection._Execute(select count(*) from CLASSFICACAO_PRODUTO where CD_CLASS = , false) % line  172, file: adodb-ibase.inc.php
  ADODB_ibase._Execute(select count(*) from CLASSFICACAO_PRODUTO where CD_CLASS = , false) % line 1010, file: adodb.inc.php

ADOConnection.Execute(select count(*) from CLASSFICACAO_PRODUTO where CD_CLASS = ) % line 1864, file: form_classficacao_produto_apl.php
form_classficacao_produto_apl.nm_acessa_banco() % line 793, file: form_classficacao_produto_apl.php
form_classficacao_produto_apl.controle() % line 1221, file: form_classficacao_produto.php

Fatal error: Call to a member function Close() on a non-object in C:\Program Files (x86)\NetMake\v5\wwwroot\scriptcase\app\SisCompras\form_classficacao_produto\form_classficacao_produto_apl.php on line 1872

Diogo,

Coloquei o codigo manual e ele aceitou numa boa, é algum problema com o autoincremento do SC com o firebird. O estranho é que com algumas tabelas a coisa funciona normal outras não.
Caso tenha alguma dica sobre isto, será muito bem vinda.

[]´s

Juliano Caetano

Diogo,

Coloquei “Auto Incremento (manual) – A aplicação gerada simulará um auto incremento no campo. Para a inclusão o valor do campo será calculado automaticamente pela aplicação.”

Olha que louco, acho que é por causa do Ajax, ele pega o numero do ultimo codigo + 1, so que como fiz varios testes, o generator do firebird esta em 132 o ultimo registro é 124, o SC coloca o codigo do novo como 125. Quando atualizo ele esta 132.
Quando tento excluir ele da a seguinte msg:
ERRO
Erro ao excluir na base de dados - Registro inexistente
E agora?
Parece que tem um bug do SC com generator do firebird, mas so acontece e algumas tabelas.

[]´s

Juliano

Rapaz um brother meu teve este problema com tabelas migradas para o firebird. Acontecia que o indice de auto-increment ficou errado na migração. Parece que ele teve que reconfigurar o indice no FB. Não sei como ele fez isso. Mas não tinha nada a ver que o SC.

Não estou afirmando que não é erro do SC + FB, estou dizendo que no problema descrito o SC não era utilizado.

Cleyton,

Pra ter certeza disto, fiz alguns teste e ta funcionando normal o insert do php sem o SC, resumindo. O erro esta no SC.
Veja o codigo pra insert no php

<? $conexao = ibase_connect("127.0.0.1:C:\Global\Pregao\Dados\Controle.fdb","SYSDBA","masterkey"); $sql = "insert into CLASSFICACAO_PRODUTO (NM_CLASSF) values ('inserte teste 222')"; $resultado = ibase_query($conexao, $sql); ibase_close($conexao); ?>

Eu queria entender pq o SC busca o codigo num count() nao tem pq ele fazer isto.
(firebird): select count(
) from CLASSFICACAO_PRODUTO where CD_CLASS = -104: Dynamic SQL Error SQL error code = -104 as approximate floating-point values in SQL dialect 1, but as 64-bit
Este é o debug do SC, se tivesse como desabilitar esta linha, tava resolvido.

Como vc está passando o auto-increment para o FB?

No mySQL basta deixar na table o campo com auto incremento e no SC deixar auto incremento automático. Tudo funciona numa boa. Já no PostGree este processo não funciona. Como nunca usei o FireBird não posso afirmar.

Acho que o problema pode estar ai.

Cleyton,

Auto Incremento (automático) – Permite utilizar o incremento gerado pelo banco de dados. Usado apenas quando o campo do banco de dados é do tipo AUTO INCREMENT ou similar. Para os bancos de dados que utilizam sequência, tais como Oracle, PostGres e Firebird, é necessário informar o nome da sequência.

Estou informando o nome da sequencia (generators). O mais estranho disto tudo é que existe 2 ou mais tabelas que isto funciona.
Ja apaquei e refiz várias vezes o Generators pra ter certeza. Ja comparei com as tabelas que funciona, resumindo ja fiz de tudo. Estou muito desanimado o serviço não rende.

Ainda continuo não entendendo o Erro, veja só:
ADOConnection._Execute(select count(*) from CLASSFICACAO_PRODUTO where CD_CLASS = , false) % line 172, file: adodb-ibase.inc.php
pq o SC tenta fazer um “select count” com a opção “where CD_CLASS =” ta errado isto.

Realmente é de desanimar.

Eu tentei uma vez usar o PostGres para uma base que utilizava Georeferenciamento. Entre está dificuldade que vc está tendo, outras me fizeram disistir de usar esse banco, posto que não era pre-requisito e era um projeto secundário. Como estava até a tampa de prioridades, deixei pra lá.

Tenho reparado que o SC sempre usa um COUNT em tudo. Não entendo o por que disto. Talvez o Harold, que tem mais experiência, possa nos dar uma luz.

O basico é para proteger os comandos sql te tentar dar um update num registro nao existente devido o concorrencia ou tentar abrir um registro que nao existe na base.

No Postgres acho muito bom a estrutura dele e bem rapidinho.
E é como julianoo falou, no Postgres voce tem que criar um objeto sequencia para que possamos pegar o nextval, currval…http://www.postgresql.org/docs/7.4/interactive/functions-sequence.html

O julianoo … esse teu campo que ta dando esse erro … no teu form tem algum campo marcado como chave unica?

Tá explicado!!!

Diogo,

Putz, foi so tirar chave unica que funcionou redondo.
Agora pirei de vez, vi, mas não me pergunte onde, que não era possivel executar form sem uma chave única definida.
Por isto, passei a colocar todas as Primary key como chave unica, santa ignorância.

Mas valeu, obrigado Diogo, obrigado Cleyton pela atenção;

Podem contar comigo.

nao po … chave primaria por si so ja eh unica.

Vamos colocar uma proteção, obvio … mas identificado o problema ja.

ao tentar inserir … ele ia checar no banco se o registro ja existia, por coincidencia era o proprio campo auto increment(o qual nao tem valor antes do insert) … e deu XABUM :-p

putz …

Cabelo de sapo, como diz o Arteiro.