Paradox? Posso utilizar isso ainda?

Delphi

24/11/2007

Amigos, comecei a ´programar´ (hobby) com Delphi 3 e Paradox. Hoje tenho o Delphi 7. Tenho um sistema próprio de minha oficina (sou técnico em eletônica - tenho uma empresa - micro - de assistência técnica autorizada - linha de eletrônicos - tv, dvd, som etc). Comecei a desenvolver esse sistema em Delphi 3 com Paradox. Bem... ao longo do tempo o sistema ficou ´inchado´, já que foi ´adicionando´ cada vez mais funções... e, a cada nova função, como tinha um pouco mais conhecimento, ia incrementando como podia. Agora já não dá mais.... tá uma bagunça danada o sistema e resolvi reescrevê-lo em delphi 7. Até comecei a mexer com firebird, mas, encontrando algumas barreiras e, já tendo bastante conhecimento de utilização de Paradox em rede (´testado e aprovado´ por mais de 4 anos), fico pensando se, adotar um novo banco de dados nesse momento, não seria começar tuuuuudo de novo. Gostaria de algumas opiniões, por favor, fiquem à vontade.... Um abraço a todos. Gilson.


Gilson.pontes

Gilson.pontes

Curtidas 0

Respostas

Edilcimar

Edilcimar

24/11/2007

O único problema com o piradox são os índices, eles se corrompem fácil, apesar disto tenho programas rodando com ele em diversos locais sem nenhum problema. Passar para o firebird é melhor, e como você já está acostumado com ´tabelas´, use a paletra do interbase onde você tem IBTable, que é uma ´tabela´ que pode ser utilizada com o firebird da mesma forma que usa uma tabela com o piradox (a diferença é muito pouca), além disto se usa query, lá também tem IBQuery. O único problema que vai encontrar com o firebird é a inexistência de um campo autoincremento, mas ser olhar por aqui vai ver dezenas de exemplos de criação de uma campo ´autoincremento´


GOSTEI 0
Gilson.pontes

Gilson.pontes

24/11/2007

´PIRADOX´....... ah ah ah..... gostei. Cara, utilizo o paradox há mais de quatro anos em meu sistema e nunca ocorreu essa história de corromper índices..... estranho. Somente no início, qdo ainda estava pouco acostumado, é que andou acontecendo uns problemas qdo ocorria pico de luz e desligamento de máquina, p. exemplo. Mas aí, criei uma rotina p/ salvar fisicamente o registro sempre que havia inserção ou alteração... conforme abaixo:

no after post e no after delete...
//
var i: LongInt;
begin
with Table1 do
begin
i := Fields(0).AsInteger;
Close;
Open;
Locate(´Registro´, i, []);
end;
end;

Comecei a utilizar o Firebird, mas esbarrei, p. exemplo, na situação de duplo acesso.... No paradox, qdo vc coloca a tabela em ´edit´, o paradox não permite que outro usuário tb a coloque em ´edit´. No firebird, isso é permitido e aí...... (?) Também achei um tanto complexa a configuração para utilizá-lo em rede... Não achei muita coisa (que realmente explicasse direitinho) na internet sobre o assunto.

Bem..... vou continuar a pesquisar e fazer experiências com o firebird... pelo visto, terei que aprender esse negócio mesmo.... Tá todo mundo usando.....

Abraço..... e obrigado pela resposta.... té+


GOSTEI 0
Edilcimar

Edilcimar

24/11/2007

as respostas vc acha aqui mesmo no fórum, na parte interbase/firebird


GOSTEI 0
Jocelio

Jocelio

24/11/2007

Olá GILSON.PONTES, tambem tenho um sistema em paradox, não entendi a sua rotina :

no after post e no after delete...
//
var i: LongInt;
begin
with Table1 do
begin
i := Fields(0).AsInteger;
Close;
Open;
Locate(´Registro´, i, []);
end;
end;

Poderia me explicar o porquê do Locate ?

Obrigado.

Jocelio


GOSTEI 0
Jcol_info

Jcol_info

24/11/2007

coloque no evento AfterPost e AfterDelete de cada tabela do seu sistema o comando a seguir:

DbiSaveChanges((DataSet as TTable).Handle);

dessa forma, todos os registros serão salvos em disco após um Post ou um Delete.

Inclua na sessão uses a unit BDE.

Eu uso Paradox desde 1998 e nunca tive corrupção de arquivos.


GOSTEI 0
Gilson.pontes

Gilson.pontes

24/11/2007

Ao amigo Jocelio...

o Locate é para que a tabela volte para o registro em que estava antes de ser fechada. Por isso capturo o Registro (ou código - como queira), salvo em uma variável inteira e depois utilizo o valor que está nessa variável para voltar ao registro. Se não fizer o locate, ao reabrir a tabela, ela simplesmente fica no primeiro registro.

Ao amigo Jco_info...

Não conhecia esse comando. Vou testá-lo. Como diz um progrmador com quem tenho contato de vez em quando, a rotina por mim criada nada mais é que um ´P.O.G.´ (programação orientada a gambiarras)..... uma alusão ao P.O.O. (programação orientada a objeto)...... eh eh eh.... aposto que não é mais ´pogado´ que o windows....

Abraço a todos.


GOSTEI 0
Jcol_info

Jcol_info

24/11/2007

Amigo Gilson,

eu também utilizava uma rotina parecida. Aprendi sobre este comando num santo forum desses por aí!


GOSTEI 0
Daykas

Daykas

24/11/2007

Prezado!
Quanto a poder usar, se quiser, pode usar até arquivos de texto, mas precisa ficar atento para as tecnologias que as atuais necessidades necessitam e, sendo assim, paradox já estaria ultrapassado demais para utilizá-lo.


GOSTEI 0
Jcol_info

Jcol_info

24/11/2007

Concordo em gênero, número e grau com o Daykas. Se vc tem um sistema em paradox e está funcionando ou tem que desenvolver um sistema simples e o paradox serve, td bem!!

Mas se vai desenvolver um sistema novo ou até se pretende melhorar um sistema já existente, estude novas tecnologias, vc terá mais recursos, com toda certeza, abandone o Paradox.

Abraços.


GOSTEI 0
Gilson.pontes

Gilson.pontes

24/11/2007

Muito obrigado a todos..... Já estou batalhando aki com Firebird....

Então... já q estou começando c/ o Firebird... vamos lá...

Criei alguns Trigger´s (opa.... vejam só, progredi, já estou até fazendo trigger... eh eh eh) de autoincremento de ´REGISTRO´ nas diversas tabelas. Até aí tudo bem.... Porém... ao chamar o evento Post, após a inclusão de um cliente, p. exemplo, esse ´REGISTRO´ não aparece, mesmo se, após o evendo post (afterpost) eu puser um CommitRetaining no TIBTransaction..... (a impressão q eu tenho, é que não está sendo gravado fisicamente no disco o registro inserido, por isso ele não está retornando o ´REGISTRO´ gerado pelo trigger).

Nesse caso, ao inserir um novo registro de telefone (que é tabela ´filha´ - detalhe), preciso iniciar (afterinsert) com a atribuição do ´REGISTRO´ da tabela clientes no ´REG_CLIENTE´ da tabela Telefones (p/ manter a integridade referencial)..... certo? Como ainda ´não existe´ o ´REGISTRO´ da tabela Clientes, o ´REG_CLIENTE´ da tabela telefones com valor 0 e dá erro se eu executar Post nela, dizendo que não existe referencia da chave estrangeira da tabela telefones na tabela clientes.

P/ eu começar c/ o pé direito nesse negócio, alguém pode me dar uma ´luz´....

Abraço a todos....


GOSTEI 0
Gandalf.nho

Gandalf.nho

24/11/2007

Que componentes de acesso você está usando?


GOSTEI 0
Gilson.pontes

Gilson.pontes

24/11/2007

Amigo, estou utilizando paleta InterBase (c/ delphi 7). Mas já resolvi o problema....

Há uma propriedade do IBDataSet chamada GeneratorField que ´traz´ o ´REGISTRO´ da tabela ´CLIENTE´ gerado no Genarator do firebird. Aliás, nem precisa fazer nenhuma trigger p/ gerar o ´REGISTRO´, basta essa propriedade estar configurada. Com relação ao ´REG_CLIENTE´ da tabela ´TELEFONES´, nesse caso teria duas opções:

1ª -> Colocar uma IBTable (p/ TELEFONES) que possuem as propriedades ´MasterSource´ e ´MasterField´ - portanto fazem essa dependência - e com isso, gera o ´REG_CLIENTE´ na tabela ´TELEFONES´ automaticamente, a partir do ´REGISTRO´ da tabela ´CLIENTES´.

2ª -> Utilizar o IBDataSet (IBDataSetTelefones), e, no seu evento afterpost, atribuir ao field ´REG_CLIENTE´, o field ´REGISTRO´ da tabela ´CLIENTES´.

De qualquer forma.... agradeço.... e, é claro, continuo aceitando sujestões... essas são SEMPRE bem vindas....


GOSTEI 0
Gilson.pontes

Gilson.pontes

24/11/2007

só encontrei agora um problema......

não consigo editar*, nem deletar*... ele altera/deleta após o post/delete, dou commit (ou commitretraing). Porém, ao abrir a tabela novamente, o registro está lá do mesmo jeito (como se não tivesse feito nada).

(*utilizando IBDataSet) - se eu utilizar o IBTable, consigo salvar edição e/ou deletar registro normalmente.

Viram.... continuo precisando de sujestões....... Eita Firebird..... mas eu não desisto....


GOSTEI 0
Gilson.pontes

Gilson.pontes

24/11/2007

errata................

2ª -> Utilizar o IBDataSet (IBDataSetTelefones), e, no seu evento AFTERINSERT (e não afterpost), atribuir ao field ´REG_CLIENTE´, o field ´REGISTRO´ da tabela ´CLIENTES´.

desculpem-me.....


GOSTEI 0
Gandalf.nho

Gandalf.nho

24/11/2007

Em vez de usar o AfterInsert, use OnNewRecord para atribuir o valor que serve para unir as tabelas.

Quanto ao problema de atualizar/excluir, dê uma conferida nas SQLs geradas para essas propriedades, para ver se estão corretas.


GOSTEI 0
Gilson.pontes

Gilson.pontes

24/11/2007

opa... então aí vai....

Modify

update CLIENTES
set
REGISTRO = :REGISTRO,
NOME = :NOME,
PESSOA = :PESSOA,
ENDERECO = :ENDERECO,
BAIRRO = :BAIRRO,
CIDADE = :CIDADE,
UF = :UF,
CEP = :CEP,
CPF_CNPJ = :CPF_CNPJ,
RG_IE = :RG_IE,
PONTOS = :PONTOS
where
REGISTRO = :OLD_REGISTRO and
NOME = :OLD_NOME and
PESSOA = :OLD_PESSOA and
ENDERECO = :OLD_ENDERECO and
BAIRRO = :OLD_BAIRRO and
CIDADE = :OLD_CIDADE and
UF = :OLD_UF and
CEP = :OLD_CEP and
CPF_CNPJ = :OLD_CPF_CNPJ and
RG_IE = :OLD_RG_IE and
PONTOS = :OLD_PONTOS

Insert

insert into CLIENTES
(REGISTRO, NOME, PESSOA, ENDERECO, BAIRRO, CIDADE, UF, CEP, CPF_CNPJ,
RG_IE, PONTOS)
values
(:REGISTRO, :NOME, :PESSOA, :ENDERECO, :BAIRRO, :CIDADE, :UF, :CEP, :CPF_CNPJ,
:RG_IE, :PONTOS)

Delete

delete from CLIENTES
where
REGISTRO = :OLD_REGISTRO and
NOME = :OLD_NOME and
PESSOA = :OLD_PESSOA and
ENDERECO = :OLD_ENDERECO and
BAIRRO = :OLD_BAIRRO and
CIDADE = :OLD_CIDADE and
UF = :OLD_UF and
CEP = :OLD_CEP and
CPF_CNPJ = :OLD_CPF_CNPJ and
RG_IE = :OLD_RG_IE and
PONTOS = :OLD_PONTOS

Refresh

Select
REGISTRO,
NOME,
PESSOA,
ENDERECO,
BAIRRO,
CIDADE,
UF,
CEP,
CPF_CNPJ,
RG_IE,
PONTOS
from CLIENTES
where
REGISTRO = :REGISTRO and
NOME = :NOME and
PESSOA = :PESSOA and
ENDERECO = :ENDERECO and
BAIRRO = :BAIRRO and
CIDADE = :CIDADE and
UF = :UF and
CEP = :CEP and
CPF_CNPJ = :CPF_CNPJ and
RG_IE = :RG_IE and
PONTOS = :PONTOS

(todos gerados automaticamente pelo botão Generator SQL no DataSet Editor)


GOSTEI 0
Gilson.pontes

Gilson.pontes

24/11/2007

opa............. RESOLVIDO!!!!

alterei p/

modify

update CLIENTES
set
REGISTRO = :REGISTRO,
NOME = :NOME,
PESSOA = :PESSOA,
ENDERECO = :ENDERECO,
BAIRRO = :BAIRRO,
CIDADE = :CIDADE,
UF = :UF,
CEP = :CEP,
CPF_CNPJ = :CPF_CNPJ,
RG_IE = :RG_IE,
PONTOS = :PONTOS
where
REGISTRO = :OLD_REGISTRO and
NOME = :OLD_NOME and
PESSOA = :OLD_PESSOA and
ENDERECO = :OLD_ENDERECO and
BAIRRO = :OLD_BAIRRO and
CIDADE = :OLD_CIDADE and
UF = :OLD_UF and
(CEP = :OLD_CEP or CEP is null) and
(CPF_CNPJ = :OLD_CPF_CNPJ or CPF_CNPJ is null) and
(RG_IE = :OLD_RG_IE or RG_IE is null) and
(PONTOS = :OLD_PONTOS or PONTOS is null)

delete

delete from CLIENTES
where
REGISTRO = :OLD_REGISTRO and
NOME = :OLD_NOME and
PESSOA = :OLD_PESSOA and
ENDERECO = :OLD_ENDERECO and
BAIRRO = :OLD_BAIRRO and
CIDADE = :OLD_CIDADE and
UF = :OLD_UF and
(CEP = :OLD_CEP or CEP is null) and
(CPF_CNPJ = :OLD_CPF_CNPJ or CPF_CNPJ is null) and
(RG_IE = :OLD_RG_IE or RG_IE is null) and
(PONTOS = :OLD_PONTOS or PONTOS is null)

refresh

Select
REGISTRO,
NOME,
PESSOA,
ENDERECO,
BAIRRO,
CIDADE,
UF,
CEP,
CPF_CNPJ,
RG_IE,
PONTOS
from CLIENTES
where
REGISTRO = :REGISTRO and
NOME = :NOME and
PESSOA = :PESSOA and
ENDERECO = :ENDERECO and
BAIRRO = :BAIRRO and
CIDADE = :CIDADE and
UF = :UF and
(CEP = :OLD_CEP or CEP is null) and
(CPF_CNPJ = :OLD_CPF_CNPJ or CPF_CNPJ is null) and
(RG_IE = :OLD_RG_IE or RG_IE is null) and
(PONTOS = :OLD_PONTOS or PONTOS is null)


......ou seja, quanto os campos CEP, CPF_CNPJ, RG_IE e PONTOS, como não são de preenchimento obrigatório, deve-se considerar que podem conter valor null).

vivendo e aprendendo.


GOSTEI 0
POSTAR