Exemplo Metódo Pessimista com componetes IBX
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
[color=green:9b4dd1964d]Movido de Delphi para Interbase/Firebird[/color:9b4dd1964d]
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
Curtidas 0
Respostas
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
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
Cumprimentos
GOSTEI 0
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?
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
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+
|dar um Open usando Prepare antes?
Usando IBX?? Nenhuma mesmo!
T+
GOSTEI 0
Mordred
04/08/2005
E usando outros sistemas de banco de dados? Qual é a diferença?
GOSTEI 0
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
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
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+
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
04/08/2005
Legal, muito obrigado pelos esclarecimentos :D
GOSTEI 0
Porty
04/08/2005
Em relação ao coódigo que foi feito o que acham, pode ser melhorado mais alguma coisa?
GOSTEI 0