Fórum Atualizar tabela automaticamente #211250

03/02/2004

0

Olá.
Possuo duas tabelas em Paradox7: [u:de01652107]TabArea[/u:de01652107] e [u:de01652107]TabSetor[/u:de01652107].
[u:de01652107]TabArea[/u:de01652107] possui um campo: [i:de01652107]AreaNome[/i:de01652107]; [u:de01652107]TabSetor[/u:de01652107] possui um campo: [i:de01652107]SetorArea[/i:de01652107].
Estou usando um [i:de01652107]DBLookupComboBox[/i:de01652107] para chamar um dado de [u:de01652107]TabArea [/u:de01652107]e atribuir a [u:de01652107]TabSetor[/u:de01652107].
O problema está na hora de atualizar. Se um dado de [u:de01652107]TabArea[/u:de01652107] for modificado, gostaria que todos fossem alterados automaticamente em [u:de01652107]TabSetor[/u:de01652107], onde fazem referência.
Já tentei a seguinte instrução, que não roda:
....
[b:de01652107]with [/b:de01652107][i:de01652107]QuerySetor[/i:de01652107] [b:de01652107]do[/b:de01652107]
[b:de01652107]Begin[/b:de01652107]
Close;
SQL.Clear;
SQL.Add(´Update [u:de01652107]TabSetor[/u:de01652107]);
SQL.Add(´Set [i:de01652107]SetorArea[/i:de01652107] = [i:de01652107]NovaArea[/i:de01652107]´); // Acho que o problema está aqui!
SQL.add(´Where [i:de01652107]SetorArea[/i:de01652107] Like:Varea´);
Parambyname(´Varea´).value:=[i:de01652107]AntigaArea[/i:de01652107];
open;
[b:de01652107]End[/b:de01652107];

Obs: [i:de01652107]AntigaArea[/i:de01652107] e [i:de01652107]NovaArea[/i:de01652107] são variaveis do tipo String.
Valeu, por qualquer ajuda.


Capristo

Capristo

Responder

Posts

03/02/2004

Rodolpho123

Olá amigo!

Bem, qual é a ferramenta que você está usando? Se for uma Table, essas alterações são feitas automaticamentes, desde que a propriedade AutoRefresh esteja setada para True, porém, se vc estiver usando uma Query, esta propriedade não funciona, forçando assim o fechamento e depois a abertura da Query para poder ter dados atualizados. Existe també uma propriedade na Query chamada Request Live. Setando esta propriedade para True, a Query deixa de trabalhar com os dados na memória e passa a trabalhar diretamente no BD, como uma Table, permitindo o uso dos eventos Append,Edit,Cancel,Post...etc. Mas se vc rodar o SQL Monitor, vc vai ver que esta opção cria muitas linhas de código, onde compromete um pouco a aplicação, cujo o nosso objetivo é a performance.
Espero tê-lo ajudado
Abraços.......!


Responder

Gostei + 0

05/02/2004

Capristo

Obrigado pela dica, mas não deu certo.
Aparentemente há dois problemas:
O [b:38fc208c84]segundo[/b:38fc208c84], referente ao código, é que não criei um relacionamento entre as duas tabelas. Originalmente são totalmente distintas. O objetivo do código é atualizar os dados automaticamente, para que o usuário não faça isso na ´unha´, mas é uma instrução que será muito pouco utilizada, pois as atualizações não serão frequentes.
O [b:38fc208c84]primeiro[/b:38fc208c84] é minha inesperiência. Não sou programador e por isso estou apanhando. Participar desse forum é uma das formas que encontrei para melhorar isso.

Valeu de novo.


Responder

Gostei + 0

05/02/2004

Bolus

Caro Colega,
Observando o seu Código, somente inclua os 2 pontos antes do NovaArea
ou seja:
Antes :
with QuerySetor do 
Begin 
  Close; 
  SQL.Clear; 
  SQL.Add(´Update TabSetor); 
  SQL.Add(´Set SetorArea = NovaArea´); // Acho que o problema está aqui! 
  SQL.add(´Where SetorArea Like:Varea´); 
  Parambyname(´Varea´).value:=AntigaArea; 
  open; 
End;


Depois, como fica :

with QuerySetor do 
Begin 
  Close; 
  SQL.Clear; 
  SQL.Add(´Update TabSetor); 
  SQL.Add(´Set SetorArea = :NArea´); // Esta linha foi alterada
  SQL.add(´Where SetorArea = :Varea´); 
  Parambyname(´Varea´).asString :=AntigaArea; 
  Parambyname(´Narea´).asString :=NovaArea;  // Esta linha foi incluida
  open; 
End; 


Obs.: Quando você sabe o que esta procurando no SQL, nunca coloque o Like, pois ele é mais demorado, sempre utilize o igual (=).

Isso deve resolver seu problema


Responder

Gostei + 0

05/02/2004

Capristo

Ainda não deu!
O programa dá a seguinte mensagem de erro:
[color=darkred[b:01dd72ca47]]´Error creating cursor handle.´[/b:01dd72ca47][/color]
Ah! Obrigado pela dica do Like.


Responder

Gostei + 0

09/02/2004

Capristo

Alguem tem mais alguma dica?


Responder

Gostei + 0

09/02/2004

Tnaires

Cara, minha sugestão é vc realmente criar os relacionamentos entre as tabelas e deixar o SGBD cuidar da integridade dos dados. Com os relacionamentos (e se assim vc ajustar), alterações em uma tabela refletirão na outra.


Responder

Gostei + 0

09/02/2004

Wolverine

Para q complicar se pode facilitar,
Amigo, o mais fácil é
Na tabela TabSetor crie um campo Cod_Area, pronto, é so isso, pois, oq estará guardado na TabSetor é o código da TabArea, se vc fizer alteração na tabArea ñ vai influir na TabSetor pq oq interessa é saber qual a sua Área,no caso o Cod_Area, as informações da área estão na TabArea, entao só atualize lá.
(Só armazene na TabSetor os códigos da tabArea)


Responder

Gostei + 0

09/02/2004

Djjunior

kra tipo eu concordo em parte com o [b:6fa348d2f0]tnaires [/b:6fa348d2f0] a minha única resalva é a seguinte, mude de bd, eu já tive uma esperiencia por deveras desagradável com o poradox e na minha opinião eu nunca vi banco pra dar mais problemas com relacionamento do que essa porcaria (não é a toa que a borland o abandonou, e olha que isso já tem uns 5 anos + ou -)
passe pra um access da vida que é muiiiiiito melhor, mais intuitivo, mais estavel, mais... tudo (isso tudo em comparação somente com paradox por favor não confunda!!)

espero ter ajudado !


Responder

Gostei + 0

09/02/2004

Tnaires

É verdade, o Paradox não gerencia os relacionamentos. Tem q mudar d bbanco msm.
Ei galera, ouvi um boato q o Access aceita no máximo 65536 registros, alguém confirma essa informação pra mim?


Responder

Gostei + 0

10/02/2004

Capristo

Optei por criar o código na Tabela. Já está rodando ´belléss´.
Quando a mudar de BD, é o que pretendo futuramente.

Valeus, à todos !!!


Responder

Gostei + 0

10/02/2004

Aroldo Zanela

Colega,

O único erro aqui foi utilizar Open, quando o correto seria ExecSQL:

with QuerySetor do 
Begin 
  Close; 
  SQL.Clear; 
  SQL.Add(´Update TabSetor); 
  SQL.Add(´Set SetorArea = :NovaArea´); 
  SQL.add(´Where SetorArea = :Varea´); 
  Parambyname(´Varea´).value:=AntigaArea; 
  Parambyname(´NovaArea´).value:=NovaArea; 
  ExecSQL; // e não open; Open é apenas para SELECT
End;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar