Problemas com interbase com edit

Firebird

08/01/2004

Olha só não sei se o problema é comigo ou é um bug do delphi
minha aplicação é delphi7 + interbase 6.5, crieu a minha base de dados com várias tabelas é nessas tabelas existem campo que são NOT NULL , porem quando eu insiro vazio o interbase aceita e não critica, dai vou olhar no interbase esta com se eu tivesse colocado espaço ao invés de << null>> que é assim que fica o interbase quando o campo é null,a minha insersão é através do código SQL para Inserir Insert into ...., delete ...., update ...., e a máquina que eu estou usando é muito fraca se eu usar dbedit o programa fica muito pesado, será que o problema esta comigo !!!!!, desde já muitissimo obrigado


Felipemarinho

Felipemarinho

Curtidas 0

Respostas

Afarias

Afarias

08/01/2004

| será que o problema esta comigo

99¬ de chance q sim. como é o código (no delphi) de insert/update que está com problema??


T+


GOSTEI 0
Felipemarinho

Felipemarinho

08/01/2004

no evento on click do botao gravar

procedure TF_Entrada.Gravar_LaudoClick(Sender: TObject);
Const

SQL = ´INSERT INTO PACIENTE ´+
´VALUES(:COD_PAC,:NOME)´;
SQL1 = ´UPDATE PACIENTE ´+
´SET NOME = :NOME ´+
´WHERE CODIGO = :CODIGO´;

Begin
DM.Q_Insere_Convenio.Close;
DM.Q_Insere_Convenio.SQL.Clear;
If Tipo = 1 // tipo variavel que indica se eu estou alterando ou incluindo 1= incluindo 2 = alterando
Case TIPO Of
1 : DM.Q_Insere_Convenio.SQL.Text := SQL;
2 : DM.Q_Insere_Convenio.SQL.Text := SQL1;
End;
DM.Q_Insere_Convenio.ParamByName(´COD_PAC´).AsInteger := StrToInt(Edit1.Text);
DM.Q_Insere_Convenio.ParamByName(´NOME´).AsSTRING := Edit2.Text;
DM.Q_Insere_Convenio.ExcSql;

Os campo cod_pac e nome est~çao declarados como not null;
porem se eu não digitar nada no nome ele aceita normalmente o código é gravado sem o nome, e quando eu vou a tabela no interbase o campo esta gravado com o código porem sem o nome. no campo codigo se ficar vazio ele reclama porque o vazio não é um número válido pois se meu codigo fosse string ele aceitaria numa boa, eu não consiguo entender.


GOSTEI 0
Afarias

Afarias

08/01/2004

Veja::

´´ é diferente de NULO -- ok??

então, quando vc faz:;

DM.Q_Insere_Convenio.ParamByName(´NOME´).AsSTRING := Edit2.Text;

Vc *não* está deixando o campo NULO, vc poderia fazer::

[code]
if (Edit2.Text <> EmptyStr) then
DM.Q_Insere_Convenio.ParamByName(´NOME´).AsSTRING := Edit2.Text;
[code]


ou::

[code]
if (Edit2.Text <> EmptyStr) then
DM.Q_Insere_Convenio.ParamByName(´NOME´).AsSTRING := Edit2.Text
else
DM.Q_Insere_Convenio.ParamByName(´NOME´).Clear;
[code]


T+


GOSTEI 0
Felipemarinho

Felipemarinho

08/01/2004

Valeu muito obrigado ,porem se eu fizer isso para todos os campos string do meu banco, para que declarar na tabela que o banco de dados é not null, assim eu estou verificando a integridade do meu banco por dentro do programa, ai vai por água abaixo tudo o que eu aprendi na faculdade, além disso dá uma trabalheira.

olha só !! não sei se já aconteceu isso com tigo .
a mesma coisa se você colocar>>>

Edit1.Text := IntToStr(Query.RecordCount.Asinteger); ou

Edit1.Text := IntToStr(Query.RowAfect.Asinteger);

no edit1.Text Ficará -1;

Quando eu faço numa query comum (BDE) isso não acontece.

não sei se isso acontece so comigo, por esta fazendo de maneira errada, pois eu faço desta mesma maneira com o bde e nada disso acontece.

não esqueça que tudo isso esta sendo feito numa IBQuery


GOSTEI 0
Afarias

Afarias

08/01/2004

|porem se eu fizer isso para todos os campos string do meu banco, para
|que declarar na tabela que o banco de dados é not null, assim eu estou
|verificando a integridade do meu banco por dentro do programa, ai vai
|por água abaixo tudo o que eu aprendi na faculdade, além disso dá uma
|trabalheira.

Bom Felipe, creio q está havendo alguns equívocos aqui::

1º -- o código q passei não representa em nenhum momento uma ´verificação de integridade´ -- mas apenas, ´transforma´ um valor (´´) em um NULO

Como já havia dito, uma ´string vazia´ (´´) é diferente de NULO -- nulo não é valor, é um estado q pode significar ´desconhecido´.

O NOT NULL no banco de dados só funciona se vc tentar informar um valor nulo, de outra forma, não há como ser diferente.

Algo como o procedimento q passei só é ´necessário´ pelo fato da abordágem de programação q vc está usando, e q poderia então ser revista (uma implementação OO por exemplo, ou até algo mais simples como encapsular o código q passei em uma função ou procedimento)

O 2º equívo é q, MESMO SE este procedimento caracterizase uma validação a nível de cliente, vc talvês tenha visto na faculdade também q em tudo é necessário ser razoável, mesmo os maiores seguidores dos grandes ´mestres´ dos SGBDR (como C.J. Date por exempo) -- concordam q, trazer pequenas ´regras de validação´ para a aplicação cliente pode ser uma boa prática. Validação de NULOS é um exemplo, já q não exige processos e geralmente nunca mudam com o tempo -- em contra-partida, a ´economia´ de rede conseguida, faz valer bastante sua utilização.


|olha só !! não sei se já aconteceu isso com tigo .
|a mesma coisa se você colocar>>>
|Edit1.Text := IntToStr(Query.RecordCount.Asinteger); ou

(esse AsInteger não existe)

RecordCount deve ser usado com muito cuidado (ou não deve ser usado) -- 1º ele funciona diferente para cada implementação de dataset, 2º no IBX, ele informa apenas quantos registros estão no Buffer do DataSet (TQuery por exemplo) -- para ele te informar o total de registros trazidos pelo SELECT, antes vc deve chamar um FetchALL (o q em alguns casos não é uma boa idéia)


|Edit1.Text := IntToStr(Query.RowAfect.Asinteger);

(aqui tb não existe esse as integer)

RowsAffected informam quantos registros foram ´afetados´ por uma (última executada) instrução UPDATE, DELETE OU INSERT -- sendo assim, só faz sentido chamá-lo após executar uma instrução dessas -- de outra forma seu valor será sempre -1


|Quando eu faço numa query comum (BDE) isso não acontece.

É verdade, o BDE não tem a mesma otimização de rede q o IBX


|não sei se isso acontece so comigo, por esta fazendo de maneira errada,
|pois eu faço desta mesma maneira com o bde e nada disso acontece.

Vc deve se deparar com pequenas diferenças entre o BDE e o IBX, todas elas, esteja certo, mesmo q não pareça no início mas são devido ao IBX ser ´melhor projetado´ (para sistemas C/S)


T+


GOSTEI 0
Marbravo

Marbravo

08/01/2004

Afarias você falou que:
RecordCount deve ser usado com muito cuidado (ou não deve ser usado) -- 1º ele funciona diferente para cada implementação de dataset, 2º no IBX, ele informa apenas quantos registros estão no Buffer do DataSet (TQuery por exemplo) -- para ele te informar o total de registros trazidos pelo SELECT, antes vc deve chamar um FetchALL (o q em alguns casos não é uma boa idéia)


Se eu usar uma TIBTable eu tenho esse Porblema usando o recordCount?


Obrigado


GOSTEI 0
Afarias

Afarias

08/01/2004

|Se eu usar uma TIBTable eu tenho esse Porblema usando o
|recordCount?

Assumo que SIM (nunca testei) -- Mas não é verdadeiramente um problema desde q você tenha conhecimento que o valor de retorno representa apenas os registros no Buffer.

Aproveitando, se estiver desenvolvendo um sistema para rodar em rede/multi-usuário... sugiro q não use IBTables -- componentes Table não são projetados para este tipo de aplicação.


T+


GOSTEI 0
Marbravo

Marbravo

08/01/2004

Meu Sistema tem muitos problemas que após ter analisado as resposta que obtive no forúm chequei a conclusão:

1 - Migrar do Interbase6.0 para Firebird 1.0.3

O interbase 6.0 tem muitos bugs que já foram corrigidos no Firebird e migrar para o 1.0.3 e não para o 1.5 por que o 1.0.3 é mais parecido com o interbase sem falar que para mudar de um para o outro o unico trabalho que vou ter é desinstalar o IB e instalar o FB(me corrija se eu estiver errado).

2 - Mudar de TTable, Tquery para TIBTable, tIBQuery, enfim para os componentes IBX:

Quando comecei a Desenvolver meu sistema de Automação Comercial que para meus padrões, é bastante grande, não tinha muita experiencia comecei usando paradox então migrei para o Interbase mas não mudei as TTables por TIBQuerys e IBX em geral, porque eu tinha pressa e para não ter que refazer toda a parte de cadastro que tinha seus campos como dbedit TTable, onde essa, creio eu, é a explicação para os erros totalmente sem explicação que ocorre no meu sistema(me corrija tambem se eu estiver errado).

Afarias disse que:
´se estiver desenvolvendo um sistema para rodar em rede/multi-usuário... sugiro q não use IBTables -- componentes Table não são projetados para este tipo de aplicação.´

O que vc sugere, levando em conta que eu não posso mudar todo meu sistema para TIBQuery por que demoraria muito, e eu não posso fazer isso por já ter usuarios ultilizando o sistema.

Uso generators para campos auto-incremente houvi dizer que generators não são confiaveis. Isso é verdade?

Qual a sua opnião sobre as modificações e qual sua sugestão para me ajudar?



GOSTEI 0
Afarias

Afarias

08/01/2004

|sem falar que para mudar de um para o outro o unico trabalho que vou
|ter é desinstalar o IB e instalar o FB(me corrija se eu estiver errado).

está correto


|2 - Mudar de TTable, Tquery para TIBTable, tIBQuery, enfim para os
|componentes IBX:

IBQuery, IBDataSet e IBSQL são os componentes q deve procurar usar


|e para não ter que refazer toda a parte de cadastro que tinha seus
|campos como dbedit TTable, onde essa, creio eu, é a explicação para os
|erros totalmente sem explicação que ocorre no meu sistema(me corrija
|tambem se eu estiver errado).

Não sei quais os erros q vc enfrenta, então não tenho como confirmar ou corrigir aqui. Não entendi o lance de vc falar dobre ´campos como dbEdit ...´ -- pode explicar??


|O que vc sugere, levando em conta que eu não posso mudar todo meu
|sistema para TIBQuery por que demoraria muito, e eu não posso fazer
|isso por já ter usuarios ultilizando o sistema.

Vá fazendo aos poucos... mude um cadastro/módulo aqui... depois outro ali... Se suas tabelas são ´editáveis´ mude para IBDataSet e não para IBQuery... assim vc poupa 1 componente a mais (IBUpdateSQL)


|Uso generators para campos auto-incremente houvi dizer que
|generators não são confiaveis. Isso é verdade?

De forma alguma! São plenamente confiáveis.


|Qual a sua opnião sobre as modificações e qual sua sugestão para me
|ajudar?

Acho q vc está indo no caminho certo. Sei bem como é ter q mudar e não ter o tempo disponível necessário... sendo assim, vá realizando a mudança aos poucos. O importante é q seu sistema não pare de rodar e não pare de evoluir.


T+


GOSTEI 0
Marbravo

Marbravo

08/01/2004

Não sei quais os erros q vc enfrenta, então não tenho como confirmar ou corrigir aqui. Não entendi o lance de vc falar dobre ´campos como dbEdit ...´ -- pode explicar??


Minhas telas de cadastro de lojas, clientes, produtos, etc... Tem campos DBEdit e não edit. Por isso seria muito dificil mudar para TIBQuery que teria que substituir os campos DBEdit por edit e colocar codigos SQL para Inserir, Atualizar, Deletar.
Então pensei em mudar as TTable para TIBTable que seria só substituir, mas vc disse para usar TIBDataset, Seria só substituir tambem?
Lembrando que eu só uso Querys para Consultas(select) e Tables para cadastros.

Obrigado


GOSTEI 0
Afarias

Afarias

08/01/2004

|Minhas telas de cadastro de lojas, clientes, produtos, etc... Tem campos
|DBEdit e não edit. Por isso seria muito dificil mudar para TIBQuery que
|teria que substituir os campos DBEdit por edit e colocar codigos SQL
|para Inserir, Atualizar, Deletar.

Isso não é necessário... vc não tem q deixar de usar componentes DataWare (DBEdit, etc...) quando usa IBX.

Vc pode usar IBDataSets (ou IBQuery + IBUpdateSQL) exatamente como usa TABLES... a única diferença é q vc define um SELECT para consultar apenas os registros necessários


|Então pensei em mudar as TTable para TIBTable que seria só substituir,
|mas vc disse para usar TIBDataset, Seria só substituir tambem?

Claro!!

Veja este exemplo::

http://delphiforum.icft.com.br/forum/viewtopic.php?t=30575


T+


GOSTEI 0
Marbravo

Marbravo

08/01/2004

´Isso não é necessário... vc não tem q deixar de usar componentes DataWare (DBEdit, etc...) quando usa IBX. ´

mas e quanto a usar como rede/multi-usuario funciona blz?

Dois usuarios podererão acessar a mesma tela e cadastrar registros simultanêamente?

Ou para funcionar desse modo só TIBQuery?



Obrigado


GOSTEI 0
Afarias

Afarias

08/01/2004

|mas e quanto a usar como rede/multi-usuario funciona blz?

SIM

|Dois usuarios podererão acessar a mesma tela e cadastrar registros
|simultanêamente?

SIM


Mas, a única resalva é:: MANTENHA AS TRANSAÇÕES CURTAS.

Um método/abordágem ou outro quem deve avaliar é vc qual o melhor.
O q digo é:: AMBOS FUNCIONAM.


T+


GOSTEI 0
Larry

Larry

08/01/2004

Oi,

Gostaria de saber quais são as desvantagens em usar objetos table, uma vez que funcionam? estou usando no momento em multi-usuario, que problemas eles me trarão?

Abraços.


GOSTEI 0
Marbravo

Marbravo

08/01/2004

Como Posso usar IBSQL, para que serve. Eu procurei e não intendi qual a vantagem de ultilizar?


GOSTEI 0
Ander

Ander

08/01/2004

Gente, me assustei ao ler aqui neste tópico que o componente TTable não é muito confiável em Rede/Multi...
Utilizo este componente em todos os meus sistemas, a não ser em consultadas com resultados em Grid, quando uso TQuery.

Agora, quero passar a utilizar ou MySQL ou Interbase. Antes estava mais querendo é utilizar o MySQL por (acredito eu) ser parecido com o SQL Server, no modo de programar, mas descobri que ele não é free, aí então resolvi instalar o InterBase, mas não tenho a menor noção de como utilizar ele (estou pegando as dicas aqui no forum) mas pensava em utilizar o IBTable, pra poder utilizar os mesmos padrões que utilizo nos outros sistemas.
Resumindo, é melhor utilizar o IBQuery e todas as rotinas de Inclusão, Alteração, Exclusão e Consultas utilizar Insert, Update e Delete do SQL ?

No InterBase existe índices ou faço como no SQL Server, crio no Order By do IBQuery ?


GOSTEI 0
Afarias

Afarias

08/01/2004

Gostaria de saber quais são as desvantagens em usar objetos table, uma vez que funcionam?


A grande vantagem de sistemas C/S (como SGDBs) é a redução do uso da rede visto q este é um grande gargalho ainda (está melhorando agora com as redes Gigabits)

Quando vc usa TABLES vc não pode usar desta vantagem pois não tem como limitar a informação q precisa -- dai, é como se vc estivesse unsando um gerenciador de arquivos ordinário como xBase ou Paradox.


estou usando no momento em multi-usuario, que problemas eles me trarão?


Baixa performance.


Como Posso usar IBSQL, para que serve. Eu procurei e não intendi qual a vantagem de ultilizar?


IBSQL é um componente ´leve´ que serve apenas para execução de SQL. Estes componentes são mais eficientes que Querys pq não tem todo o peso de implementar um DataSet como por exemplo manter um buffer bi-direcional.


Gente, me assustei ao ler aqui neste tópico que o componente TTable não é muito confiável em Rede/Multi...


Veja a resposta acima. Não é questão de ser confiável ou não. TABLES não foram projetadas para bancos Cliente/Servidor, sendo assim, não aproveitam as vantagens desta arquitetura.


Utilizo este componente em todos os meus sistemas, a não ser em consultadas com resultados em Grid, quando uso TQuery.


Se vc não usa um sistema Cliente/Servidor, mas sim um GA (ex: Paradox ou xBase) então, está muito correto usar TABLES.


Agora, quero passar a utilizar ou MySQL ou Interbase. Antes estava mais querendo é utilizar o MySQL por (acredito eu) ser parecido com o SQL Server,


Nem de perto parecido!


no modo de programar, mas descobri que ele não é free,


Muito bem citado!! Ao contrário do Interbase OS e do Firebird (e mais recentemente do Ingres que está sendo movido para Open Source) -- o MySQL não pode ser usado por sistemas de código fechado sem pagamento de licença.


aí então resolvi instalar o InterBase, mas não tenho a menor noção de como utilizar ele (estou pegando as dicas aqui no forum) mas pensava em utilizar o IBTable, pra poder utilizar os mesmos padrões que utilizo nos outros sistemas.


Se vc trabalhava com gerenciadores de arquivo está caminhando para usar um Sistema de Gerenciamento de Bancos de Dados como o IB, terá q estudar toda um ´novo´ conceito.

Nada difícil ou complicado, mas as idéias são um pouco diferentes -- neste ´novo mundo´, TABLES são ´persona non grata´


Resumindo, é melhor utilizar o IBQuery e todas as rotinas de Inclusão, Alteração, Exclusão e Consultas


SIM -- ou IBDataSet


No InterBase existe índices ou faço como no SQL Server, crio no Order By do IBQuery ?


Claro q existem índices -- mas estes (como em qualquer SGBD) não servem para dar ordenação -- vc terá de usar ORDER BY


T+


GOSTEI 0
Ander

Ander

08/01/2004

A.Farias, no InterBase posso utilizar uma rotina de Alteração do mesmo modo como utilizava n MS-SQL Server ? Utilizava um UpdateSQL e, na opção ModifySQL, colocava o seguinte código dentro :

update ALIMENTO
set
CODIGO = :CODIGO,
DESCRICAO = :DESCRICAO,
ORG = :ORG,
GRUPO = :GRUPO
where
CODIGO = :OLD_CODIGO


Te pergunto isso em relação a minha dúvida anterior sobre índices no InterBase, assim não precisaria me preocupar em ficar criando índices e não mudaria tanto assim o meu padrão de costume...

A.Farias, me desculpe se as minhas dúvidas estão sendo um tanto bobas, é que na empresa em que trabalho, estamos utilizando um sistema de faturamento em Clipper e todos os meus sistemas de estoque e outros puxam informações de arquivos DBF. Se utilizo Querys para consultas, fica muito demorado e, dependendo da quantidade de registros de resposta, chega a travar as outras estações da rede. Criei um arquivo em clipper para me gerar índices NDX para poder trabalhar com eles, mas o nosso sistema trabalha com NTX, o que me força a ficar indexando os NDX para atualizar as informações. E o problema que estamos tendo agora é que o faturamento está perdendo os índices muitas vezes por dia, e tendo que parar toda a produção para indexar ( o que demora 15 minutos) e o sistema já está ficando com poucos recursos, tipo relatórios, algumas manutenções que poderiam melhorar o serviço do pessoal e outras coisas. O meu medo é que, o arquivo de itens dos pedidos tem hoje, 124Mb e uns 1.000.000 de registros... Tenho medo de montar um outro sistema

GOSTEI 0
Ander

Ander

08/01/2004

e dar problemas em relação a essa quantidade de registros...
GOSTEI 0
Afarias

Afarias

08/01/2004

A.Farias, no InterBase posso utilizar uma rotina de Alteração do mesmo modo como utilizava n MS-SQL Server ? Utilizava um UpdateSQL


SIM


Te pergunto isso em relação a minha dúvida anterior sobre índices no InterBase, assim não precisaria me preocupar em ficar criando índices e não mudaria tanto assim o meu padrão de costume...


Se preocupe SIM em criar índices!! Eles são sempre usados nos WHERE


Se utilizo Querys para consultas, fica muito demorado e, dependendo da quantidade de registros de resposta, chega a travar as outras estações da rede.


GAs são completamente diferentes (no funcionamento) de SGBDs -- Enquanto TABLES são a melhor opção com GAs, são terríveis para SGBDs.


Criei um arquivo em clipper para me gerar índices NDX para poder trabalhar com eles, mas o nosso sistema trabalha com NTX, o que me força a ficar indexando os NDX para atualizar as informações.


Os índices em SGBDs são ´um pouco´ diferentes - vc não terá esse tipo de problema usando um SGBD como o IB ou FB.


Tenho medo de montar um outro sistema e dar problemas em relação a essa quantidade de registros...


Quanto maior a quantidade de registros e o número de usuários na rede, MELHOR o uso de SGBDs no lugar de GAs.

Se vc seguir os conceitos de uma aplicação C/S verá q seu sistema não apresentará nenhum problema como os q enfrenta hoje e ainda será bem mais rápido.



T+


GOSTEI 0
POSTAR