Fórum Conexão ao Banco de Dados #40678

08/12/2003

0

Uso Firebird 1.5. tenho um Data Módulo com um componente IbDatabase, um componente IbDataSet e um componente IbTransaction todos interligados, agora preciso acessar as tabelas do Banco de Dados. Qual componente uso para enxegar as tabelas nos formulários? Gostaria de usar na forma de TTable, é recomendável?


Amilton/pr

Amilton/pr

Responder

Posts

08/12/2003

Afarias

|agora preciso acessar as tabelas do Banco de Dados.

Defina um SELECT na propriedade SelectSQL do IBDataSet


|Qual componente uso para enxegar as tabelas nos formulários?

O componente q ´mantem´ os dados é o IBDataSet (ou poderia ser IBQuery)... vc pode ligar a ele um DataSource e ligar seus componentes (DBEdit, DBGrid, etc...) ao DataSource.


|Gostaria de usar na forma de TTable, é recomendável?

NUNCA -- não é uma boa prática com bancos de dados C/S



T+


Responder

Gostei + 0

08/12/2003

Amilton/pr

Entendi. Então vou ter um IbDataset para cada tabela que vou fazer a manipulação de dados?
E os componentes IbDatabase e IbTransaction são necessários?
Desculpe pela insistência, é que estou usando pela primeira vez . . .


Responder

Gostei + 0

08/12/2003

Afarias

|Entendi. Então vou ter um IbDataset para cada tabela que vou fazer a
|manipulação de dados?

Sim. O IBDataSet mantem os registros de uma consulta SQL (select) em um buffer (inclusive com suporte bi-direcional) e proporciona uma aplicação parecida a um Table


|E os componentes IbDatabase e IbTransaction são necessários?

Sim. O IBDatabase mantem uma conexão com o servidor e a base de dados e o IBTransaction permite q vc controle explicitamente as sua transações (select, update, insert, delete).


|Desculpe pela insistência, é que estou usando pela primeira vez . . .

sem problemas, fórum é pra perguntar, responder, discutir idéias, etc...



T+


Responder

Gostei + 0

08/12/2003

Amilton/pr

Legal. Coloquei a instrução Select na propriedade SelectSql e habilitou os campos da tabela. As demais propriedades SQL do DataSet não estão preenchidas; Coloquei os componentes com Active = true, Agora os dbedits ligados ao Datasource do IbDataSet não habilitaram pra digitação e ainda fui apagar um registro e surgiu a mensagem que não pode deletar no DataSet. Como resolvo isso?


Responder

Gostei + 0

08/12/2003

Afarias

para poder ´operar´ nos registros trazidos pela sua consulta (select) vc terá q preencher as propriedades ModifySQL, DeleteSQL e InsertSQL do IBDataSet --- isso é fácil pois o IBDataSet possui um assistente para auxiliar na tarefa, faça o seguinte::

1 - clique com o botào direito do mouse no IBDataSet
2 - selecione o menu DataSet Editor...
3 - no form q aparece, vc verá duas listas
4 - na lista da esquerda (key fields) selecione apenas o(s) campo(s) chave de sua tabela
5 - na lista da direita selecione todos os campos
6 - clique no botão GENERATE SQL
7 - clique Ok (fecha)


pronto, aconcelho também q use a propriedade GeneratorField para designar um generator para um código automático (auto-incremental) caso deseje.


T+


Responder

Gostei + 0

08/12/2003

Amilton/pr

Muito bom. Funcionou Legal. No caso de precisar usar um campo da tabela para se relacionar com uma chave de outra tabela(relacionamento) daí como seria esse procedimento?


Responder

Gostei + 0

08/12/2003

Amilton/pr

Agora os dados são editados(alterados, apagados), no entanto quando abro o formulário novamente eles não foram modificados, ou seja, a tabela não está gravando os dados. Não estão funcionando o Commit e o RollBack, dá a mensagem de identificação não declarada.


Responder

Gostei + 0

08/12/2003

Afarias

||No caso de precisar usar um campo da tabela para se relacionar com
|uma chave de outra tabela(relacionamento) daí como seria esse
|procedimento?

vc pode usar JOINS no SelectSQL, mas lembre-se q apenas 1 tabela pode ser alterada (vc pode alterar mais se usar alguns IBUpdateSQL)...

Vc pode ter campos LOOKUP também...

Vc pode estabelecer relacionamentos mestre-detalhe normalmente com outro IBDataSet... (+/- como faria com Tables)



|Não estão funcionando o Commit e o RollBack, dá a mensagem de
|identificação não declarada

qual o seu código e a mensagem de erro original??


T+


Responder

Gostei + 0

08/12/2003

Amilton/pr

Botão gravar:
procedure TF_Emp.BitBtn3Click(Sender: TObject);
begin
if (dbedit1.text = ´´) or (dbedit3.text = ´´) then
begin
messagedlg(´Campos não estão devidamente preenchidos. Verifique!´,mtinformation, [mbok],0);
dbedit1.clear;
dbedit1.setfocus;
end
else
begin // Datam é o nome do Data Modulo
try
with Datam.tblmun do // tblmun é o Nome do IbDataSet
Datam.IBDatabase1.startTransction; // Não funciona
Datam.IbDataBase1.ApplyUpdates; // tbém não funciona
DAtam.tblMun.Post;
datam.IBTransaction1.CommitRetaining; // Não grava o registro
// Datam.tblmun.active:=true;
// DAtam.tblMun.refresh;
// Datam.tblMun.Commit; {on success, commit the changes};
DAtam.tblMun.prior; // Volto ao inicio para gravar somente 1 registro
DAtam.tblMun.edit; //insert;
dbedit1.setfocus;
except
Datam.IBTransaction1.Rollback; {on failure, undo the changes}; // tbém não funciona
raise; {raise the exception to prevent a call to CommitUpdates!}
end;
end;
end;

Obs- Primeiro código onde tento gravar um registro com Firebird;


Responder

Gostei + 0

09/12/2003

Afarias

|Datam.IBDatabase1.startTransction; // Não funciona

o StartTransaction é na transação, de forma q vc poderia fazer::

Datam.IBTransaction1.StartTransaction;
ou
Datam.tblmun.Transaction.StartTransaction

como está em um bloco WITH Datam.tblmun DO, vc pode simplesmente::

Transaction.StartTransaction;


|Datam.IbDataBase1.ApplyUpdates

Não há necessidade de usar ApplyUpdates -- A não ser q vc resolva realmente usar ChachedUpdates=True (o q não é bom na mairia dos casos) -- se fosse usar seria no IBDataSet::

Datam.tblmun.ApplyUpdates;

ou, no bloco WITH, simplesmente::

ApplyUpdates;


Mas, como disse não há necessidade - vc não está usando CachedUpdates (suponho) ... basta um POST mesmo.


T+


Responder

Gostei + 0

10/12/2003

Amilton/pr

Entendi, mas e o Commit, onde entra nessa história?
Vou testar dessa forma, no entanto até agora a forma que realmente gravou os dados foi usando AppyUpdates no evento AfterPost do DataSet.


Responder

Gostei + 0

10/12/2003

Afarias

|Entendi, mas e o Commit, onde entra nessa história?

O commit serve para encerrar a transação gravando difinitivamente as alterações realizadas, um exemplo::


with IBDataSet do
begin
  Transaction.StartTransaction;
  try
    Append;
    FieldByName(´tal1´).AsInteger := tal1;
    FieldByName(´tal2´).AsString := tal2;
    Post;
  finally
    Transaction.Commit;
  end;
end;




|Vou testar dessa forma, no entanto até agora a forma que realmente
|gravou os dados foi usando AppyUpdates no evento AfterPost do
|DataSet.

Como disse esqueça o ApplyUpdates. E, se o ApplyUpdates não está dando erro, e a propriedade CachedUpdates = FALSE, então, ATUALIZE JÁ seu IBX, as versões recentes do IBX não deixam isso ocorrer.


T+


Responder

Gostei + 0

11/12/2003

Amilton/pr

Posso colocar esse código no botão nPost do Navigator? Existe úm campo código da tabela que é inserido num edit, então preciso recebe-lo no campo da tabela pra poder gravar e se fizer isso nesse botão acusa a mensagem que o campo está vazio, então recebi no evento BeforePost do Dataset. Está correto?


Responder

Gostei + 0

11/12/2003

Afarias

|Posso colocar esse código no botão nPost do Navigator?

Não... o código mostra um processo ´completo´ com a abertura da transação, Append, definição dos valores dos campos, POST e commit.


não entendi o resto da mensagem...


T+


Responder

Gostei + 0

12/12/2003

Amilton/pr

Tentei dizer o seguinte: Tenho um campo edit no formulário com a propriedade enabled=false.
Então quando gravo o registro quero pegar o número do último registro da tabela e mostrar nesse edit para o usuário ver o código do novo cadastro e ao mesmo tempo gravando esse numero na tabela. Gostaria de fazer isso sem o generator, é possível?


Responder

Gostei + 0

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

Aceitar