Paradox? Posso utilizar isso ainda?
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
Curtidas 0
Respostas
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
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é+
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
24/11/2007
as respostas vc acha aqui mesmo no fórum, na parte interbase/firebird
GOSTEI 0
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
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
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.
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
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.
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
24/11/2007
Amigo Gilson,
eu também utilizava uma rotina parecida. Aprendi sobre este comando num santo forum desses por aí!
eu também utilizava uma rotina parecida. Aprendi sobre este comando num santo forum desses por aí!
GOSTEI 0
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.
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
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.
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
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....
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
24/11/2007
Que componentes de acesso você está usando?
GOSTEI 0
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....
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
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....
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
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.....
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
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.
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
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)
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
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.
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