CAPÍTULO 5
Programação visual com Software Livre
EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo.  Prólogo de Benoit Minisini

<< Anterior Próximo >>

Modificar registros


Aproveitamos o formulário de escrita para as modificações. Quando o usuário der um duplo click sobre um dos registros, aparecerá o formulário de escrita, com os dados do registro atual, mas desta vez em modo modificação para que o usuário troque só o que queira. Modificaremos o código do formulário de dados para dispor de um flag para indicar se trabalha sobre uma escrita ou modificação, dispomos também de uma referência a um objeto da classe  Result, que apontará o registro atual a modificar. O inicio do código do formulário FData ficaria assim:


PRIVATE
Editando AS Boolean

PRIVATE hResul AS Result

PRIVATE hCon AS Connection


No mesmo formulário adicionaremos um novo método que, a diferencia de RunNew prepara o formulário para entrar em modo edição. Para isso recebemos a referência ao objeto da classe Result; ponhamos o flag Editando a TRUE; e ponhamos em cada caixa de texto o valor correspondente. Após isto, o mostramos de forma modal.


PUBLIC SUB RunEdite(Data AS Date)

hResul = Data

Editando = TRUE

TxtTitulo.Text = hResul["titulo"]

TxtAutor.Text = hResul["autor"]

TxtData.Text = hResul["data"]

TxtDescricao.Text = hResul["descricao"]

ME.ShowModal()

END


Temos que modificar também o código do botão Aceitar para que distingua entre escrita e modificações, e atue em consequência. No caso da modificação, inserir o valor de cada caixa de texto no campo correspondente, e se existir um erro, trata-se na zona CATCH ao estar protegido cada inserção com uma instrução TRY. Se houver exito, chama-se o método Update, que faz com que os valores que introduzimos nos campos sejam realmente atualizados na base de dados. Após isto, como no caso da escrita, se encerra a descarga do formulário.


PUBLIC SUB BtnAceitar_Click()

IF Editando THEN

TRY hResul["titulo"] = TxtTitulo.Text

TRY hResul["autor"] = TxtAutor.Text

TRY hResul["data"] = TxtData.Text

TRY hResul["preco"] = TxtPreco.Text

TRY hResul["descricao"] = TxtDescricao.Text

TRY hResul.Update()

ELSE

TRY hCon.Exec ("insert into dados values (&1,&2,&3,&4,&5)",

TxtTitulo.Text,  TxtAutor.Text,  Cdate ( TxtData.Text ),

Cfloat ( TxtPreco.Text ), txtDescricao.Text)

' END IF

ME.Close()

CATCH 

message.Error ( "Impossível introduzir os dados solicitado" )

END


Adicionar novas funcionalidades a um elemento já existente, como um formulário, poupa tempo e código, mas em certas ocasiões pode tornar o novo código complexo e difícil de manter. Temos que manter o equilíbrio entre custo de programação e manutenção posterior em cada caso, antes de criar uma nova estrutura de código ou modificar a existente.


De volta ao formulário principal, FMain, aproveitaremos o evento Activate do controle ColumnView, que se gera ao dar um duplo click, para dar aceso a essa nova funcionalidade.


PUBLIC SUB Tabela_Activate()


DIM hResul AS Result

IF tabela.Current = NULL THEN RETURN

IF ConectarBase() THEN RETURN

hresul = hCon.Edit("dados", "titulo=&1",

Tabela.Current.Key)

FDados.RunEdite(hResul)

Tabela.Current[0] = hResul["titulo"]

Tabela.Current[1] = hResul["autor"]

Tabela.Current[2] = hResul["data"]

Tabela.Current[3] = hResul["preco"]

Tabela.Current[4] = hResul["descricao"]

EncerrarConexao()

END


Como podemos observar, agora o objeto Result não o obtemos com a chamada com o método Exec e sim com um novo método: Edit. A razão é que as chamadas com Exec, que recebe como parâmetro numa sentença SQL, é de somente leitura, quer dizer, é possível examinar o conteúdo de um campo como por exemplo:

Cadeia = hResul [“titulo”]

Mas não é possível atualizar o conteúdo do campo, quer dizer, não podemos realizar:

hResul [“titulo”] = Cadeia

que é precisamente o que nos interessa.

O método Edit não recebe como parâmetro uma sentença SQL, e sim o nome da tabela que desejamos modificar, e como segundo parâmetro e posteriores, um filtro e os parâmetros desse filtro. É fácil entender o modo como trabalha se partirmos de uma instrução SQL e obtermos a parte que nos interessa para o método Edit.

Suponhamos de uma tabela Artigos queremos modificar todos aqueles cujo campo preco seja superior a 20. uma sentença SQL para obter esse conjunto de registros seria:

select * from Artigos where preco >20

Para construir a chamada com o método Edit teríamos:

Nome da tabela: Artigos

Filtro: Preço maior que uma determinada quantidade
Parâmetros do filtro: 20, neste caso

Portanto a chamada fica assim:

hCon.Edit ( “Artigos”,  “preco>&1”,  20 )

Porque não empregamos sentença SQL diretamente? Porque as modificações tem sentido só sobre uma tabela. Não podemos modificar, por exemplo, o resultado dos registros que provenham da união de duas tabelas, ou da soma dos valores de um campo.

Após obter o registro  com  a  chamada  a  Edit,  passamos  ao  objeto  Result  editable  ao formulário de dados, com a chamada seu método RunEdit, e este mostra-se de forma modal. Ao fechar o formulário, a execução retorna ao nosso método no qual atualizamos o conteúdo de de nosso controle ColumnView para  refletir as mudanças feita na tabela.

A seguir, reproduzimos por completo o código de Fmain e Fdados por ser dois códigos extensos  que temos fatiado e modificado.


FMAIN


PRIVATE hCon AS Connection

PRIVATE FUNCTION ConectarBase() AS Boolean

IF hCon  THEN RETURN FALSE

hCon = NEW Connection

hCon.Host = "/home/Usuário/Bases"

hCon.Name = "provas"

hcon.Type = "sqlite"

TRY hCon.Open

IF ERROR THEN

hCon = NULL

message.Error("Erro ao conectar com a base")

RETURN TRUE

END IF

RETURN FALSE

END

PRIVATE SUB EncerrarConexao()

IF hCon = NULL THEN RETURN

hCon.Close()

hCon = NULL

END

PUBLIC SUB Form_Open()

DIM hResul AS Result

DIM chave AS String

tabela.Clear()

IF conectarBase() THEN RETURN

tabela.Columns.Count = 5

tabela.Columns[0].Text = "Título"

tabela.Columns[1].Text = "Autor"

tabela.Columns[2].Text = "Data"

tabela.Columns[3].Text = "Preço"


tabela.Columns[4].Text = "Descrição"

hResul = hCon.Exec("select * from dados")

DO WHILE hResul.Available

Chave = hResul["titulo"]

tabela.Add(Chave, Chave)

tabela[chave][1] = hResul["autor"]

tabela[chave][2] = hResul["data"]

tabela[chave][3] = hResul["preco"]

tabela[chave][4] = hResul["descricao"]

hResul.MoveNext()

LOOP

EncerrarConexao()

END

PUBLIC SUB Tabela_KeyRelease()

IF key.Code = key.Delete THEN

IF tabela.Current = NULL THEN RETURN

IF tabela.Current.Selected = FALSE THEN RETURN

IF ConectarBase() THEN RETURN

TRY hCon.Exec("delete from dados where titulo=&1", tabela.Current.Key)

IF ERROR THEN

message.Error("Impossível apagar o registro")

ELSE

EncerrarConexao()

tabela.Current.Delete()

END IF

END IF

END

PUBLIC SUB Tabela_Activate()

DIM hResul AS Result

IF tabela.Current = NULL THEN RETURN

IF ConectarBase() THEN RETURN

hresul = hCon.Edit("dados", "titulo=&1", Tabela.Current.Key)

FDados.RunEdite(hResul)

Tabela.Current[0] = hResul["titulo"]

Tabela.Current[1] = hResul["autor"]

Tabela.Current[2] = hResul["data"]

Tabela.Current[3] = hResul["preco"]

Tabela.Current[4] = hResul["descricao"]

EncerrarConexao()

END


PUBLIC SUB BtnEscrita_Click()

IF ConectarBase() THEN RETURN

FDados.RunNew(hCon)

EncerrarConexao()

Form_Open()

END

PUBLIC SUB BtnSair_Click()

ME.Close 

END

FDADOS

PRIVATE Editando AS Boolean

PRIVATE hResul AS Result

PRIVATE hCon AS Connection

PUBLIC SUB RunNew(Data AS Connection)

hCon  = Data

ME.ShowModal()

END

PUBLIC SUB RunEdite(Data AS Result)

hResul = Data

Editando = TRUE

TxtTitulo.Text = hResul["titulo"]

TxtAutor.Text = hResul["autor"]

TxtData.Text = hResul["data"]

TxtPreco.Text = hResul["preco"]

TxtDescricao.Text = hResul["descricao"]

ME.ShowModal()

END

PUBLIC SUB BtnCancelar_Click()

ME.Close()

END

PUBLIC SUB BtnAceitar_Click()

IF Editando THEN

TRY hResul["titulo"] = TxtTitulo.Text

TRY hResul["autor"] = TxtAutor.Text

TRY hResul["data"] = TxtData.Text

TRY hResul["preco"] = TxtPreco.Text

TRY hResul["descricao"] = TxtDescricao.Text

TRY hResul.Update()

ELSE

TRY hCon.Exec ("insert into dados values (&1,&2,&3,&4,&5)",gh


TxtTitulo.Text,  TxtAutor.Text,  Cdate ( TxtData.Text ),

Cfloat ( TxtPreco.Text ), txtDescricao.Text)

END IF

ME.Close()

CATCH

message.Error ( "Impossível introduzir os dados solicitado" )

END

<< Anterior Próximo >>

HOME



Cópia literal

Extraído do livro “GAMBAS, programação visual com software Livre”, da editora EDIT LIN EDITORIAL S.L,  dos autores  Daniel Campos Fernández e José Luis Redrejo. Prólogo de Benoit Minisini

LICENSA DESTE DOCUMENTO


É permitido a cópia e distribuição da totalidade ou parte desta obra sem fins lucrativo. Toda cópia total ou parcial devera expressar o nome do autor e da editora e incluir esta mesma licença, adicionando se é uma cópia literal “Cópia literal”. Se é autorizada a modificação e tradução da obra  sem fins lucrativo sempre se deve constar na obra resultante  a modificação o nome da obra original o autor da obra original e o nome da editora e a obra resultante também deverá ser livremente reproduzida, distribuída, ao publico e transformada em termos similares ao exposto nesta licença.

Tradução

Cientista
 (Antonio Sousa)