Ir para conteúdo
Fórum Script Brasil
  • 0

ApplyUpdate ou Commit não gravam nas estações


geovanepc

Pergunta

Bom dia à todos.

Utilizo o clássico trio: DBExpress+Firebird+Delphi7.

com o quarteto: SQLDataSet + DataSetProvider + ClientDataSet + DataSource.

Devidamente configurados, a internet tá cheia de exemplos para configurações desse tipo.

No ícone mostra Firebird Versão 2.0, mas quando mostrada na janela do aplicativo a versão é 2.1.0.17798.

O driver de acesso é o UIBFirebird15.dll com fbclient.dll

Gostaria de saber se existe algum problema com esse driver, porque fiz um sistema, aparentemente tava funcionando à

contento, mas quando coloquei pra rodar nas estações, veio a surpresa, um registro gravado na estação A não é

atualizado na estação B e no servidor.

Abro o IBExpert e dou um Refresh na Tabela, mais não mostra a atualização, só vai mostrar depois de um COMMIT.

No delphi já coloquei:

Evento no botão GRAVAR:

procedure TForm1.BitBtn9Click(Sender: TObject);

begin

DM.DataModule1.CDS_Local.ApplyUpdates(0);

DM.DataModule1.CDS_Local.Refresh;

end;

Ou assim:

procedure TForm1.BitBtn49Click(Sender: TObject);

var

TD: TTransactionDesc;

begin

TD.TransactionID:=1;

TD.IsolationLevel:=xilREADCOMMITTED;

DataModule1.SQLConnection1.StartTransaction(TD);

try

DataModule1.CDS_Horarios.ApplyUpdates(0);

DataModule1.SQLConnection1.Commit(TD);

except

DataModule1.SQLConnection1.Rollback(TD);

end;

end;

É isso aí, já não sei mais o que fazer, estou até pensando em conseguir outro driver pra acessar o Firebird ou mudar de banco

definitivamente.

Se alguém dispuser de tempo pra tentar me ajudar,

Desde já agradeço.

Um forte abraço à todos.

Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

Desta maneira é usada para Interbase ... veja que não existe diferença, a não ser no componente usado

Com o IBDatabase1 e o IBTransaction1 funciona perfeitamente

DataModule1.CDS_Horarios.Post;
 DataModule1.CDS_Horarios.ApplyUpdates(-1);
 MessageDlg('Alterações efetuadas com sucesso! ', mtInformation, [mbOK], 0);
 //ATUALIZAR OS DADOS PARA A REDE
 IBTransaction1.Commit;
 IBTransaction1.StartTransaction;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
usando essa arquitetura SQLDataSet + DataSetProvider + ClientDataSet + DataSource, qual seria a forma de salvar os dados corretamente?

A estrutura que te passei tambem serve para o Firebird

mas eu optaria por usar IBDatabase, IBTransaction, IBQuery + DataSetProvider + ClientDataSet + DataSource

só que ao invéz de conectar o interbase será o firebird

Tenho alguns sistemas com essa configuração funcionando em rede e não tenho tido problema nenhum

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

O SQLConnection é apenas a conexão com o banco de dados, trocaria pelo IBDatabase.

O SQLDataSet trocaria pelo IBQuery.

Agora o IBTransaction não sei usá-lo, eu teria que ficar controlando todas as transações, tipo gerando números de transações diferentes

pra nunca coincidir com a de uma estação diferente?

Tabelas do tipo Nested, mudaria alguma coisa?

O ClientDataSet navegaria normalmente pelos registros dentro de um DBGrid, lógico que com uma quantidade controlada (ondemand).

É parece fácil, mais é difíííííííííííícil.

Tenho que colocar um IBTransaction pra cada tabela é?

Desculpa pela enchorrada de perguntas Jhonas, te agradeço muito pela atenção.

Link para o comentário
Compartilhar em outros sites

  • 0

Ok Douglas, o restante são todos iguais? ou vai ter que mudar algo nos códigos? Gravar/Deletar/Etc...

Obrigado.

O IBTransaction não tá reconhecendo o banco do Firebird (extensão .FDB) só do Interbase (.GDB).

Não sei se entendi bem, vou ter que mudar o bando de dados pra Interbase?

Obrigado.

Desculpe, digo IBDatabase.

Link para o comentário
Compartilhar em outros sites

  • 0
Agora o IBTransaction não sei usá-lo, eu teria que ficar controlando todas as transações, tipo gerando números de transações diferentes pra nunca coincidir com a de uma estação diferente?
Não ... isso é automatico para cada estação e nunca vão coincidir

O ClientDataSet navegaria normalmente pelos registros dentro de um DBGrid, lógico que com uma quantidade controlada (ondemand).

Sim

Tenho que colocar um IBTransaction pra cada tabela é?
Não ... apenas um para um grupo de tabelas

Exemplo:

DataModule1.CDS_Horarios.Post;
DataModule1.CDS_Horarios.ApplyUpdates(-1);

DataModule1.CDS_Cadastro.Post;
DataModule1.CDS_Cadastro.ApplyUpdates(-1);

DataModule1.CDS_Pagamentos.Post;
DataModule1.CDS_Pagamentos.ApplyUpdates(-1);

MessageDlg('Alterações efetuadas com sucesso! ', mtInformation, [mbOK], 0);

//ATUALIZAR OS DADOS PARA A REDE
IBTransaction1.Commit;
IBTransaction1.StartTransaction;
o restante são todos iguais? ou vai ter que mudar algo nos códigos? Gravar/Deletar/Etc...
Talvez tenha mudar pouquissimas coisas
Não sei se entendi bem, vou ter que mudar o bando de dados pra Interbase?
Não ... voce vai usar o firebird
Tabelas do tipo Nested, mudaria alguma coisa?
Tabela Nested É uma tabela que é representada como uma coluna dentro de outra tabela. É um conjunto não ordenado de elementos do mesmo tipo. Tem uma única coluna e o tipo da coluna é um tipo pré-definido ou um tipo de objeto.
create table EMPREGADOS  
(Nome VARCHAR2(25), 
CPF NUMBER, 

Telefones TELEFONES_NT )

NESTED TABLE Telefones store as TELEFONES_ST; 

create type TELEFONES_NT as table of VARCHAR2(14)

Se tiver que mudar será apenas na maneira de fazer o relacionamentos entre as tabelas

OBS: Qualquer outra duvida, faça uma pesquisa no forum pela palavra Firebird

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia a todos, Jhonas o código do botão gravar é muito simples, eu estou testando um pequeno cadastro só pra verificar o funcionamento.

Eu tenho um servidor instalado o Firebird nele, e na estação não vai instalado o Firebird não, eu apenas copiei as DLLs pra pasta do executável.

MIDAS.DLL

FBCLIENT.DLL

UIBFIREBIRD15.DLL

GDS32.DLL

DBEXPUIBFIRE15.DLL

Faço a conexão por ip, testo a mesma, o resultado é:

Attempting to connect to:

172.16.1.249:D:\Discador\Database\DISCADOR.FDB

Connecting... Passed!

Server version: WI-V6.3.2.18118 Firebird 2.1

Attempting to connect to services manager... Passed!

Disconnecting from database... Passed!

No DataModule tenho:

SQLConnection1

SQLDS_Aparelhos

DSP_Aparelhos

CDS_Aparelhos

DS_Aparelhos

Lá no banco de dados, na tabela APARELHOS tenho os códigos ID como Autoincremento, logo no SQLDS_Aparelhos e CDS_Aparelhos a configuração é:

Table: APARELHOS

Fields

-----------------------------------------------------------------

Name Type Domain Not Null

ID INTEGER RDB$76 NOT NULL

MARCA VARCHAR(30) RDB$77

MODELO VARCHAR(30) RDB$78

NUM_SERIE VARCHAR(40) RDB$97

DESCRICAO VARCHAR(50) RDB$79

SQLDS_Aparelhos

-----------------------

CommandText=Select * From Aparelhos

No ID da tabela:

-----------------------

ProviderFlags=pflnUpdate=False

pflnWhere=True

pflnkey=False

pflnHidden=False

Required=False

Pronto, eles estão todos ligados corretamente.

Agora no Botão Gravar eu estou usando o seguinte código:

procedure TForm1.BitBtn28Click(Sender: TObject);

begin

DM.DataModule1.CDS_Aparelhos.ApplyUpdates(0);

DM.DataModule1.CDS_Aparelhos.Refresh;

end;

Ele grava no banco de dados direitinho, o que aconteçe é que não atualiza os DBGrids das estações.

Já tinha colocado no botão gravar:

DM.DataModule1.CDS_Post;

DM.DataModule1.CDS_Aparelhos.ApplyUpdates(0);

DM.DataModule1.CDS_Aparelhos.Refresh;

Como não tratei o dsInsert e dsEdit tava dando erro, ele gravava uma vez e na próxima dava um erro por causa do Refresh.

Inclusive no botão Deletar, eu preciso dar um Refresh no final pra poder gerar as atualizações no banco de dados.

Botão Delete:

procedure TForm1.BitBtn27Click(Sender: TObject);

begin

DM.DataModule1.CDS_Aparelhos.Delete;

DM.DataModule1.CDS_Aparelhos.ApplyUpdates(0);

DM.DataModule1.CDS_Aparelhos.Refresh;

end;

É basicamente isso aí.

Um forte abraço a todos.

Desde já agradeço.

MSN: geo_mvinicius@hotmail.com

Link para o comentário
Compartilhar em outros sites

  • 0
Ele grava no banco de dados direitinho, o que aconteçe é que não atualiza os DBGrids das estações.

As atualizações dos DBGrids não são automáticas nas estações, a menos que um comando seja dado:

por exemplo: alguém na rede inseriu um registro ... após o Post e o ApplyUpdates é necessario realizar o Commit para atualizar os dados para a rede.

Mas para que outro usuário veja essa atualização, é necessario que seja exetudado pelo menos um comando na tabela.

DM.DataModule1.CDS_Cadastro.Post;
DM.DataModule1.CDS_Aparelhos.ApplyUpdates(-1);

MessageDlg('Alterações efetuadas com sucesso! ', mtInformation, [mbOK], 0);

//ATUALIZAR OS DADOS PARA A REDE
IBTransaction1.Commit;
IBTransaction1.StartTransaction;

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

Ok Jhonas, então o sistema tá gravando direitinho, achei que os DBGrids eram atualizados também no momento da gravação igual no antigo PARADOX.

Tipo abrindo e fechando as tabelas ou gerando um Refresh.

Eu preciso atualizar esses DBGrids, porque o sistema é pra telemetria e esta estação não tem operador e tem que trabalhar com dados atualizados

constantemente.

Tem alguma sugestão?

Link para o comentário
Compartilhar em outros sites

  • 0
Ok Jhonas, então o sistema tá gravando direitinho, achei que os DBGrids eram atualizados também no momento da gravação igual no antigo PARADOX.

Tipo abrindo e fechando as tabelas ou gerando um Refresh.

funciona do mesmo jeito para o Firebird

Eu preciso atualizar esses DBGrids, porque o sistema é pra telemetria e esta estação não tem operador e tem que trabalhar com dados atualizados constantemente.

Tem alguma sugestão?

Use um Timer para ficar atualizando de tempos em tempos os dados no DBgrid

abraço

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...