GARANTIR DESCONTO

Fórum Firebir na Rede - Autalizar em tempo real #350965

21/12/2007

0

Ola amigos !!


É o seguinte... eu tenho um sistema rodando em Firebird 2.0 com componentes de acesso da palheta Interbase... há 3 máquinas acessando o banco de dados ao mesmo tempo... todas conseguem visualizar e alterar dados... porém... as alterações que qualquer máquina faça só vai ser vista pela outra quando o usuário fechar o sistema e abri-lo novamente... o que é muito chato ! Como eu faço para que as alterações que qualquer terminal faça seja refletido automaticamente para os demais ? Sou inicante neste ramo de programação Cliente-Servidor, então se por gentileza alguem me puder ajudar passo a passo agradeço muito...


Grato pela atenção de todos...


Tiagojmilam

Tiagojmilam

Responder

Posts

21/12/2007

Techsoft

Como está fazendo para gravar os dados? qual o comando usado?

Eu usei interbase já tem um tempo, mas você pode usar transações, uma vez que faça o commit da transação, os dados garantidamente serão visíveis aos demais usuários do sistema.


Responder

Gostei + 0

21/12/2007

Tiagojmilam

Olá amigo !

Eu estou dando um commitretaming no transaction que está ligado a base de dados... mas mesmo assim... não atualiza nas outras estações...


Valew !


Responder

Gostei + 0

22/12/2007

Aasn

Vc só vai conseguir atualizar os terminais de duas formas:

1) através de um timer, a cada intervalo dá um refresh nos dados;

ou

2) capturando os eventos do BD através do IBEvent, que é bem mais complicado.

caso contrário, nada feito!

[]´s
AASN


Responder

Gostei + 0

22/12/2007

Tiagojmilam

Cheguei a pensar em colocar sim um Timer ! mas naum sabia o que fazer neste Timer... abrir e fechar a tabela que não era senão ia dar xabu... nem xeguei a pensar em um Refresh...

O que eu devo colocar de código nees timer ? e vai ser um timer só pra todo o aplicativo .. ou tem que ser um pra cada Query ?


Valew !!!


Responder

Gostei + 0

22/12/2007

Luciano.badoe

[b:6e90c25949]TiagoJmilam[/b:6e90c25949]

Eu faço da seguinte forma utilizando 3 procedures do Luciano Pimenta:

Para iniciar a transação:
procedure TDM.Start; begin Transc.IsolationLevel := xilREADCOMMITTED; Transc.TransactionID := StrToInt(IDTransaction); SQLConnection1.StartTransaction(Transc); end;


Auxiliar de Start
function IDTransaction: string; var i: integer; const str = ´0123456789´; begin for i := 1 to 2 do begin Randomize; Result := Result + str[Random(Length(str))+1]; end; end;


Para comitar transação pendente
procedure TDM.Comit; begin SQLConnection1.Commit(Transc); end;


Para cancelar a transação pendente
procedure TDM.Rollback;
begin
  SQLConnection1.Rollback(Transc);
  raise Exception.Create(MSG_ERRO);
end;


Eu uso a START antes de um bloco try/except com Store Procedure para
persistir os dados no DB e em seguida uso a COMMIT para comitar a transação.
Caso ocorra algum problema, no except uso o ROLLBACK.

É pratico e funciona 100¬.

Abraço.


Responder

Gostei + 0

22/12/2007

Micheus

porém... as alterações que qualquer máquina faça só vai ser vista pela outra quando o usuário fechar o sistema e abri-lo novamente... o que é muito chato ! Como eu faço para que as alterações que qualquer terminal faça seja refletido automaticamente para os demais ? Sou inicante neste ramo de programação Cliente-Servidor, então se por gentileza alguem me puder ajudar passo a passo agradeço muito...
Isto está relacionado às configurações da sua transação.

Dê um duplo click no seu componente TIBTransaction e veja como está sua configuração.
Por ex., se você configurar como Snapshot, os dataset ligados a esta transação ´irão tirar uma foto´ no momento de sua abertura (open ou active) não ´enxergando´ alterações de qualquer outra transação.

Se vc nunca mexeu nele, na tela que aparece, não deve haver um tipo de transação setada.
Vou sugerir uma opção que utilizo (customizada), assim, não se preocupe me selecionar qualquer umas das disponíveis. Coloque na caixa de texto [i:73250798ad]Settings[/i:73250798ad] os seguintes parâmetros (é só copiar e colar):
[i:73250798ad]read,
write,
read_committed,
rec_version,
nowait[/i:73250798ad]

Tem um artigo sobre o assunto que pode ser interessante ler: ´Entendendo os tipos e configurações das transações´ (Autor: Claudio Valderrama; Tradução/Adaptação : Carlos Henrique Cantu - FireBase)
É necessário registrar-se no site [url=http://www.firebase.com.br/fb/]FireBase[/url] para acessá-lo, vou deixar uma versão em PDF neste [url=http://www.4shared.com/file/24569384/88e77aca/Entendendo_os_tipos_e_configuracao_de_transacoes.html]link[/url]


Responder

Gostei + 0

23/12/2007

Tiagojmilam

Olá micheus !

Eu dei dois cliques no Transaction e realmente das opções que há lá não estão nenhuma delas selecionadas .. e há um campo para digitação, lá eu coloquei estas instruções que me passou e não selecionei nenhuma opção !

read,
write,
read_committed,
rec_version,
nowait

Porém quando eu dou um RUN no projeto ele dá o seguinte erro :

TPB Constant () is unknown


Porque será que deu esse erro ?


Valew pela ajuda !!!


Responder

Gostei + 0

25/12/2007

Micheus

Eu dei dois cliques no Transaction e realmente das opções que há lá não estão nenhuma delas selecionadas .. e há um campo para digitação, lá eu coloquei estas instruções que me passou e não selecionei nenhuma opção ! read, write, read_committed, rec_version, nowait Porém quando eu dou um RUN no projeto ele dá o seguinte erro : TPB Constant () is unknown Porque será que deu esse erro ?
significa que uma destas constantes não foi reconhecida pela rotina que inicializa a sua transação.
Pelo que andei investigando, muito provavelmente seria [i:fcc14add68]rec_version[/i:fcc14add68]. Aparentemente o componente da paleta IBX não o reconhece desta forma (é que eu utilizo os componentes MDO, e neste caso não há problemas), então escreva ele assim: [i:fcc14add68]record_version[/i:fcc14add68]
e tente novamente.

Este texto, será depois convertido para um número (constante a ser utilizada na inicialização da transação). Dá para ver [url=http://www.koders.com/noncode/fid4E63A32C796CA2049C3F42D1F6413049E28102F4.aspx]nesta[/url] codificação que este texto será trocado pela constante [i:fcc14add68]isc_tpb_rec_version[/i:fcc14add68].

Um artigo que fala um pouco sobre estes níveis de isolamento: [url=http://www.guiadodelphi.com.br/ler.php?codigo=1103]O que é uma transação?[/url] (ref. Guia do Delphi)

Abraços


Responder

Gostei + 0

26/12/2007

Pestana_

Ola [b:8dc55a6b6f]Micheus[/b:8dc55a6b6f], é muito importante o que você postou. Para atualizar registro em uma outra máquina não basta somente (fazer um refresh ou abrir e fechar) o dataset é preciso utilizar as configurações da transação. Acredito que este assunto gera muita dúvida.

Aproveitando o tópico eu agradeceria muito se você me respondesse uma dúvida minha, já procurei na web, mas eu não consegui entender as configurações (read e write) qual o efeito em relação aplicação?

estou utilizando um Transaction na aplicação.

Obrigado,
Pestana.


Responder

Gostei + 0

26/12/2007

Micheus

Acho que este artigo lhe ajudará: [url=http://www.comunidade-firebird.org/cflp/downloads/CFLP_O026.PDF]Trabalhando com Transaction Parameter Buffer[/url] (ref. Comunidade Firebird de Lingua Portuguesa).

Além dos links que postei anteriormente, há mais este artigo, [url=http://www.comunidade-firebird.org/cflp/downloads/CFLP_T032.PDF]Como travar um registro em Interbase/Firebird[/url] (ref. Comunidade Firebird), bastante interessante e de onde tiro o trecho abaixo, visto que envolve parte das configurações que sugeri:
[color=blue:4019ebf16d][i:4019ebf16d](...) Você poderia usar o nível de isolamento read_commited rec_version junto
com o modo de espera (wait), mas não é bom usar esse recurso dessa forma. Em tese, o
read_commited / rec_version / wait garantem 100¬ que você vai obter os resultados necessários.
Mas este modo de travamento requer mais atenção durante o projeto de acesso aos dados. (...)[/i:4019ebf16d][/color:4019ebf16d]


Responder

Gostei + 0

26/12/2007

Pestana_

[b:9532820582]Micheus[/b:9532820582] não estou querendo abusar de você é que estou meio confuso e não estou conseguindo entender.

Eu estava olhando alguns artigos ´inclusive a que você sugeriu´ e não estou conseguindo entender o porque da existência de mais de uma transação (p. ex.: uma transação para escrita (inserir, atualizar e deletar registros) e outra somente leitura (select)).

Neste [url=http://scriptbrasil.com.br/forum/index.php?showtopic=81370]tópico[/url] você citou que utiliza duas transações uma para (Read) e outra para (Update). Porque você utiliza este método, qual o objetivo?

estou tentando montar uma configuração de transação que seja mais adequada para meu sistema.
no sistema, tenho dbgrid e edits:
1- os dados são apresentados no dbgrid como somente leitura.
2- utilizo edits para incluir, alterar e excluir registros (não utilizo componentes dataware exceto o dbgrid).


Responder

Gostei + 0

27/12/2007

Khundalini

Pra resolver isso daí, o SGBD teria que ficar ser inteligente pra identificar quando os dados consultados por uma estação fossem alterados por outra estação. E isso, acredito eu, nenhum SGBD faz isso.

O que teria que fazer é um refresh periodico nos dados. O problema se agrava ainda mais se usarmos ClientDataSet, uma vez que os dados são consultados uma única vez ao servidor, e a conexão é fechada (isso se estiver usando dbExpress com a propriedade KeepConnection = False, para garantir mais performance).

Sds.,
Rubem Rocha
Manaus, AM


Responder

Gostei + 0

27/12/2007

Pestana_

Pra resolver isso daí, o SGBD teria que ficar ser inteligente pra identificar quando os dados consultados por uma estação fossem alterados por outra estação. E isso, acredito eu, nenhum SGBD faz isso. O que teria que fazer é um refresh periodico nos dados. O problema se agrava ainda mais se usarmos ClientDataSet, uma vez que os dados são consultados uma única vez ao servidor, e a conexão é fechada (isso se estiver usando dbExpress com a propriedade KeepConnection = False, para garantir mais performance). Sds., Rubem Rocha Manaus, AM


não sei se entendi, mas estou querendo que a Transação faça esse trabalho, depois eu atualizo o DataSet (abrir e fechar ou refresh) atravês de Eventos do FB, com isso acho que não precisava atualizar periodicamente o DataSet.

se eu estiver errado alguem por favor me corrija.


Responder

Gostei + 0

27/12/2007

Khundalini

Abrir e fechar ou efetuar um refresh depois de incluir/alterar/excluir um registro é válido. Agora, e se um outro usuário tiver feito uma dessas operações, e outra pessoa não tiver feito nada, e esta outra pessoa necessitar ´enxergar´ os mesmos dados atualizados?

Saiba vc que o método Refresh(), nas classes descendentes de TDataSet (ex.: TClientDataSet) funcionam de maneiras diferentes.

Sds.,
Rubem Rocha
Manaus, AM


Responder

Gostei + 0

27/12/2007

Pestana_

[b:8038f89542]Micheus[/b:8038f89542] não estou querendo abusar de você é que estou meio confuso e não estou conseguindo entender. Eu estava olhando alguns artigos ´inclusive a que você sugeriu´ e não estou conseguindo entender o porque da existência de mais de uma transação (p. ex.: uma transação para escrita (inserir, atualizar e deletar registros) e outra somente leitura (select)). Neste [url=http://scriptbrasil.com.br/forum/index.php?showtopic=81370]tópico[/url] você citou que utiliza duas transações uma para (Read) e outra para (Update). Porque você utiliza este método, qual o objetivo? estou tentando montar uma configuração de transação que seja mais adequada para meu sistema. no sistema, tenho dbgrid e edits: 1- os dados são apresentados no dbgrid como somente leitura. 2- utilizo edits para incluir, alterar e excluir registros (não utilizo componentes dataware exceto o dbgrid).


[b:8038f89542]Micheus[/b:8038f89542] andei estudando os tópicos que você sugeriu e acho que as configurações para o IBTransaction seria essas: está correto?

[i:8038f89542]read_committed,
rec_version,
nowait[/i:8038f89542]

estou querendo montar as configurações de acordo com está citação acima.

me ajude a salvar está semana hshshshs

agradeço antecipadamente,
Pestana.


Responder

Gostei + 0

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

Aceitar