geovanepc Postado Setembro 3, 2009 Denunciar Share Postado Setembro 3, 2009 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.dllGostaria 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 bancodefinitivamente.Se alguém dispuser de tempo pra tentar me ajudar,Desde já agradeço.Um forte abraço à todos. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 3, 2009 Denunciar Share Postado Setembro 3, 2009 Desta maneira é usada para Interbase ... veja que não existe diferença, a não ser no componente usadoCom o IBDatabase1 e o IBTransaction1 funciona perfeitamenteDataModule1.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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 geovanepc Postado Setembro 3, 2009 Autor Denunciar Share Postado Setembro 3, 2009 Jhonas então usando essa arquitetura SQLDataSet + DataSetProvider + ClientDataSet + DataSource, qual seria a forma de salvar os dados corretamente?Pode me passar um exemplo?Já que esse tipo é usado para Interbase.Desde já agradeço. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 3, 2009 Denunciar Share Postado Setembro 3, 2009 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 Firebirdmas eu optaria por usar IBDatabase, IBTransaction, IBQuery + DataSetProvider + ClientDataSet + DataSourcesó 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 nenhumabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 geovanepc Postado Setembro 3, 2009 Autor Denunciar Share Postado Setembro 3, 2009 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 diferentespra 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Douglas Soares Postado Setembro 3, 2009 Denunciar Share Postado Setembro 3, 2009 Eu faço assim: adiciono um IBDataBase, um IBTransaction, configuro o IBDatabase, e em default transaction ponho o IBTransaction, e no IBTransaction, em default database é só por o IBDatabase!, mais nada!Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 geovanepc Postado Setembro 3, 2009 Autor Denunciar Share Postado Setembro 3, 2009 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 3, 2009 Denunciar Share Postado Setembro 3, 2009 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 coincidirO ClientDataSet navegaria normalmente pelos registros dentro de um DBGrid, lógico que com uma quantidade controlada (ondemand).SimTenho que colocar um IBTransaction pra cada tabela é?Não ... apenas um para um grupo de tabelasExemplo: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 tabelasOBS: Qualquer outra duvida, faça uma pesquisa no forum pela palavra Firebirdabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Douglas Soares Postado Setembro 4, 2009 Denunciar Share Postado Setembro 4, 2009 :blink: To impressionado! :wacko: , o Jhonas sabe tudo, o cara é um crânio, ehehehe... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 geovanepc Postado Setembro 9, 2009 Autor Denunciar Share Postado Setembro 9, 2009 Obrigado pela ajuda, mais ainda não deu certo. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 9, 2009 Denunciar Share Postado Setembro 9, 2009 Amigo ... como voce não postou o seu código, não dá nem prá imaginar do jeito que voce fez ... dessa maneira fica dificil alguém te ajudarabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 geovanepc Postado Setembro 17, 2009 Autor Denunciar Share Postado Setembro 17, 2009 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.DLLFBCLIENT.DLLUIBFIREBIRD15.DLLGDS32.DLLDBEXPUIBFIRE15.DLLFaç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:SQLConnection1SQLDS_AparelhosDSP_AparelhosCDS_AparelhosDS_AparelhosLá 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: APARELHOSFields-----------------------------------------------------------------Name Type Domain Not NullID INTEGER RDB$76 NOT NULLMARCA VARCHAR(30) RDB$77MODELO VARCHAR(30) RDB$78NUM_SERIE VARCHAR(40) RDB$97DESCRICAO VARCHAR(50) RDB$79SQLDS_Aparelhos-----------------------CommandText=Select * From AparelhosNo 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 18, 2009 Denunciar Share Postado Setembro 18, 2009 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 geovanepc Postado Setembro 19, 2009 Autor Denunciar Share Postado Setembro 19, 2009 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 atualizadosconstantemente.Tem alguma sugestão? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Setembro 20, 2009 Denunciar Share Postado Setembro 20, 2009 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 FirebirdEu 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 DBgridabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
geovanepc
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
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.