Editando
dados
Imprime
A regra do
Clipper é bloquear o registro antes de gravar os dados, mas
observe que há mais coisas entre o céu e a terra do que prega
nossa mera filosofia...!
Veja um exemplo:
- // o (//) é comentário
- // Abertura de arquivo
- USE CLIENTE ALIAS CLI
SHARED NEW
- SET INDEX TO CODCLI
- // Definicao de variaveis
- // técnica: letra inicial
da variavel igual ao tipo da variavel: c = caracter
- cCODCLI := SPACE(6)
- DO WHILE .T.
- ___CLS
- ___@ 10,10 SAY "Código do
Cliente:" GET cCODCLI VALID EVAL( { || cCODCLI :=
STRZERO(cCODCLI,6), .T.} ) //
__Entendeu o valid?! Não?
Veja na página de Know-How.
- ___READ
- ___IF LASTKEY() = 27 //ESC
- _____EXIT
- ___ENDIF
- ___IF !CLI->(DBSEEK(cCODCLI)) // !
é .NOT.
- _____ALERT("CODIGO NAO ENCONTRADO")
- _____LOOP
- ___ENDIF
- ___CLI->(DBLOCKREC())
// Função bloqueia o registro em uso (necessário em
rede ao alterar registro), veja a função mais abaixo e
comentários sobre a posição da mesma. Insira sempre
esta função imediatamente antes de disponibilizar os
dados p/ alteração.
- ___cCLI := CLI->NOME
- ___cEND := CLI->ENDERECO
- ...
-
- ___@ 11,10 SAY
"CLIENTE:" GET cCLI
- ___@ 12,10 SAY
"ENDERECO:" GET cEND
- ...
- ___READ
- ___@ 20,10 SAY
"CONFIRMA ALTERACAO? (S/N)" GET cSN VALID UPPER(cSN)
$ "SN"
- ___READ
- ___IF cSN = "N"
- _____LOOP
- ___ENDIF
- ___// Não ponha o CLI->(DBLOCKREC())
aqui! (Veja explicação).
- ___CLI->NOME := cCLI
- ___CLI->ENDERECO := cEND
- ___CLI->(DBUNLOCK()) // libera o
registro p/ uso
- ___CLI->(DBCOMMIT()) // assegura
a integridade do DBF
- ENDDO
...
- FUNCTION DBLOCKREC()
// Esta função é definida pelo usuário, não
é nativa do Clipper!
- DO WHILE !RLOCK()
- ENDDO
- RETURN
Explicação: Você não deve bloquear os registros
imediatamente antes de alterar os campos do registro porque você
incidirá no problema
da atualização perdida. Exemplo: duas estações estão executando o
mesmo programa; caso ambas leiam o mesmo registro e introduzam
mudanças a serem gravadas, qual será o estado do registro? Que
mudanças do usuário foram gravadas? Resposta: As
alterações do usuário que gravou pela última vez, a do
primeiro se perde, são sobreescritas!
Comentários: O nosso programa acima resolve o problema
da atualização perdida, mas já pensou se alguém desse
nosso programa começasse a editar um registro e depois se
afastasse de sua máquina, digamos, para tomar uns três
cafezinhos ou fosse para casa?! Os dados ficariam inacessíveis
aos outros por muito tempo!!!
Agora veja um
exemplo PROFISSIONAL:
Use um campo assinatura
Inclua um campo novo em cada base de
dados de seu sistema chamado de assinatura (assinatura, N, 3, 0). Ele existirá apenas para permitir que a
codificação da atualização verifique se os campos foram
alterados. Veja como ficaria o nosso programa exemplo supracitado
reconstruído:
- // o (//) é comentário
- // Abertura de arquivo
- USE CLIENTE ALIAS CLI
SHARED NEW
- SET INDEX TO CODCLI
- // Definicao de variaveis
- // técnica: letra inicial
da variavel igual ao tipo da variavel: c = caracter
- cCODCLI := SPACE(6)
- DO WHILE .T.
- ___CLS
- ___@ 10,10 SAY "Código do
Cliente:" GET cCODCLI VALID EVAL( { || cCODCLI :=
STRZERO(cCODCLI,6), .T.} ) //
Entendeu o valid?! Não?
Veja na página de Know-How.
- ___READ
- ___IF LASTKEY() = 27 //ESC
- _____EXIT
- ___ENDIF
- ___IF !CLI->(DBSEEK(cCODCLI)) // !
é .NOT.
- _____ALERT("CODIGO NAO ENCONTRADO")
- _____LOOP
- ___ENDIF
-
- ___CLI->(DBLOCKREC())
- ___CLI->ASSINATURA++
- ___nASS :=
ASSINATURA
// Representa as informacoes atuais do
registro (p/ comparar depois).
- ___CLI->(DBUNLOCK())
- ___CLI->(DBCOMMIT())
-
- ___cCLI := CLI->NOME
- ___cEND := CLI->ENDERECO
- ...
- ___@ 11,10 SAY
"CLIENTE:" GET cCLI
- ___@ 12,10 SAY
"ENDERECO:" GET cEND
- ...
- ___READ
- ___@ 20,10 SAY
"CONFIRMA ALTERACAO? (S/N)" GET cSN VALID UPPER(cSN)
$ "SN"
- ___READ
- ___IF cSN = "N"
- _____LOOP
- ___ENDIF
-
- ___IF nASS #
CLI->ASSINATURA
- ______ALERT("Registro
já alterado por outro usuário, suas alterações serão
perdidas!")
- ______LOOP
- ___ENDIF
-
- ___CLI->(DBLOCKREC())
- ___CLI->NOME := cCLI
- ___CLI->ENDERECO := cEND
- ___CLI->ASSINATURA := 0
- ___CLI->(DBUNLOCK()) // libera o
registro p/ uso
- ___CLI->(DBCOMMIT()) // assegura
a integridade do DBF, gravando do Buffer para
arquivo.
- ENDDO
Acredite se
quiser, mas muitas grandes SoftHouses
ainda não fazem isso... FAÇA A DIFERENÇA!!!