Editando dados

Imprime só o conteúdo de texto desta página.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!!!

1999 - CA-Clipper Website - Anderson Cardoso Silva
Downloads | Dicas | Know-how | Caça-Fantasmas | Impressoras | Erros do Clipper | Fórum | Aprenda Clipper! | Livro de Visitas |Contato
Numerabilis Folder | Numerabilis Website