Exemplo Metódo Pessimista com componetes IBX

Firebird

04/08/2005

Olá a todos, ja consegui fazer o metódo pessimista, só que quer com a vossa ajuda, por robustez no código abaixo para que fique a 100¬ e fique como apoio ao iniciantes, então aqui vai o código que fiz para obter o método.

Componentes que colocoquei
IBDatabase IBTransaction ->Param read_committed rec_version nowait o nowait é para dar logo erro para dizer que o reg. esta sendo usado. IBDataset -> SelectSQl = select * from MENU -> ModifSQL = update MENU set CODIGO = :CODIGO, ORDEM = :ORDEM, TEXTO = :TEXTO, GRUPO = :GRUPO, TIPO = :TIPO, LINK = :LINK, NIVEL = :NIVEL where CODIGO = :OLD_CODIGO -> InsertSQL = insert into MENU(CODIGO, ORDEM, TEXTO, GRUPO, TIPO, LINK, NIVEL) values (:CODIGO, :ORDEM, :TEXTO, :GRUPO, :TIPO, :LINK, :NIVEL)


//Botão Gravar
procedure TForm1.btGravarClick(Sender: TObject);
begin
  try
   IBDataSet1.Post;
   ibtransaction1.CommitRetaining;
  except
    ShowMessage(´ERRO: ao gravar o registo´);
  end;
  IBDataSet1.Close;
  IBDataSet1.Close;
  IBDataSet1.SelectSQL.Clear;
  IBDataSet1.SelectSQL.Add(´select * from MENU´);
  IBDataSet1.Prepare;
  IBDataSet1.Open;
end;

//Botão Editar
procedure TForm1.bteditarClick(Sender: TObject);
var strsql:string;
begin
  strsql := ´select * from MENU where codigo = ´ + dbcodigo.Text +  ´ with lock´;
  IBDataSet1.Close;
  IBDataSet1.SelectSQL.Clear;
  IBDataSet1.SelectSQL.Add(strsql);
 try
  IBDataSet1.Prepare;
  IBDataSet1.Open;
  IBDataSet1.Edit;
 except
  strsql := stringreplace(strsql,´with lock´,´´,[rfReplaceAll]);
  IBDataSet1.Close;
  IBDataSet1.SelectSQL.Clear;
  IBDataSet1.SelectSQL.Add(strsql);
  IBDataSet1.Prepare;
  IBDataSet1.Open;
  showmessage(´Registro Bloqueado´);
 end;
end;


[color=green:9b4dd1964d]Movido de Delphi para Interbase/Firebird[/color:9b4dd1964d]


Porty

Porty

Curtidas 0

Respostas

Porty

Porty

04/08/2005

Fiz mais algumas alterações

procedure TForm1.btGravarClick(Sender: TObject);
var codigo: integer;
begin
  if IBDataSet1.State in dseditmodes then
  try
   codigo := IBDataSet1Codigo.Value;
   IBDataSet1.Post;
   ibtransaction1.CommitRetaining;
  except
    ShowMessage(´ERRO: ao gravar o registo´);
  end;
  IBDataSet1.Close;
  IBDataSet1.Close;
  IBDataSet1.SelectSQL.Clear;
  IBDataSet1.SelectSQL.Add(´select * from MENU´);
  IBDataSet1.Prepare;
  IBDataSet1.Open;
  IBDataSet1.Locate(´CODIGO´, CODIGO, []);
end;

procedure TForm1.bteditarClick(Sender: TObject);
var strsql:string;
var codigo: integer;
begin
  codigo := IBDataSet1Codigo.Value;
  strsql := ´select * from MENU where codigo = ´ + dbcodigo.Text +  ´ with lock´;
   try
     if ibtransaction1.InTransaction then
        ibtransaction1.Commit;
     except
       ibtransaction1.Rollback;
  end;
  IBDataSet1.Close;
  IBDataSet1.SelectSQL.Clear;
  IBDataSet1.SelectSQL.Add(strsql);
 try
  ibtransaction1.StartTransaction;
  IBDataSet1.Prepare;
  IBDataSet1.Open;
  IBDataSet1.Edit;
 except
  ibtransaction1.Rollback;
  //strsql := stringreplace(strsql,´with lock´,´´,[rfReplaceAll]);
  strsql := ´select * from menu´;
  IBDataSet1.Close;
  IBDataSet1.SelectSQL.Clear;
  IBDataSet1.SelectSQL.Add(strsql);
  IBDataSet1.Prepare;
  IBDataSet1.Open;
  IBDataSet1.Locate(´CODIGO´, CODIGO, []);
  showmessage(´Registro Bloqueado´);
 end;
end;

//botão cancelar
procedure TForm1.btCancelarClick(Sender: TObject);
begin
 if IBDataSet1.state in dseditmodes then
  begin
     IBDataSet1.cancel;
     ibtransaction1.Rollback;
  end;
end;



GOSTEI 0
Porty

Porty

04/08/2005

Não se esqueça deste tópico, vamos dar um exemplo prático para todos os iniciantes em delphi + firebird.

Cumprimentos


GOSTEI 0
Mordred

Mordred

04/08/2005

Só uma perguntinha um tanto quanto ingênua...
Qual é a diferença entre eu simplesmente dar um Open na tabela e eu dar um Open usando Prepare antes? Qual a vantagem de trabalhar nessa segunda forma?


GOSTEI 0
Afarias

Afarias

04/08/2005

|Qual é a diferença entre eu simplesmente dar um Open na tabela e eu
|dar um Open usando Prepare antes?

Usando IBX?? Nenhuma mesmo!


T+


GOSTEI 0
Mordred

Mordred

04/08/2005

E usando outros sistemas de banco de dados? Qual é a diferença?


GOSTEI 0
Beppe

Beppe

04/08/2005

O Prepare é paro o banco pré-compilar a query e traçar o plano de execução. É muito bom no caso de consultas parametrizadas, em qualquer banco. No exemplo, o SQL é mexido a cada Prepare, o que realmente é dispensável.


GOSTEI 0
Comodelphi

Comodelphi

04/08/2005

O uso de instruções SQL preparadas aplica-se quando for repetir essas instruções várias vezes, o sistema gerenciador de banco de dados irá alocar os recursos necessários para esse prepare uma vez só. Mas a eficiência desse recurso só se percebe quando se manipula uma quantidade realmente grande de registros.


GOSTEI 0
Afarias

Afarias

04/08/2005

Bem complementado pelos colegas... e sendo mais claro:

O banco sempre prepara a consulta antes de ser executada.

Um PREPARE só tem sentido ser explicitamente chamado quando um determinado SQL (parametrizado) será executado repetidas vezes, no mais o prepare (e unprepare) é automaticamente realizado.

Quando chamado o prepare explicitamente, é boa prática chamar o unprepare ao final do processo.

Um prepare não ´sobrevive´ em situações como a alteração do texto do SQL ou o commit/rollback da transação.


T+


GOSTEI 0
Mordred

Mordred

04/08/2005

Legal, muito obrigado pelos esclarecimentos :D


GOSTEI 0
Porty

Porty

04/08/2005

Em relação ao coódigo que foi feito o que acham, pode ser melhorado mais alguma coisa?


GOSTEI 0
POSTAR