Hola!
Alguien podría indicarme como calculo el CHECK SUM?
En espera de sus respuestas
Laura E. Hernández H.
CHECK SUM
- Willi Quintana
- Posts: 859
- Joined: Sun Oct 09, 2005 10:41 pm
- Location: Cusco - Perú
- Contact:
Hola, puedes utilizar la funcion vTotal := nStrCrc(vCampo) ; donde nStrCrc, recibe una cadena de caracteres, que puede ser la suma de todos _ de un registro, convirtiendo los numeros, las fechas y campos logicos en caracteres, luego esta funcion propia de FW, te devuelve un numero unico, el cual puedes utilizar opara comparar luego, es decir, si en la primera instancia, la cadena te devuelve un numero, si luego esa cadena es modificada, el numero resultante sera diferente al primero. Ej.
...........
Function OkChkSum(oModo,lAll)
local vRet := .f., vCount := FCount(), vFields := {}, oLbx, vVar
local vChkSum := ""
DEFAULT oModo := 0
DEFAULT lAll := .f.
vFields := LeeRegistro(vFields,vCount) // cargamos el registro al array vfields
vChkSum := ChkSum(vFields)
If Empty(_Field->codv)
oModo := 1
EndIf
If oModo == 0
If _Field->codv <> vChkSum
If !lAll
If MsgNoYes("Este Registro ha sido Alterado fuera de Sistema,,,","Corregir Balance?")
If Rec_Lock(10)
_Field->codv := vChkSum
DbUnLock()
EndIf
EndIf
EndIf
vRet := .f.
EndIf
Else
If Rec_Lock(10)
_Field->codv := vChkSum
DbUnLock()
vRet := .t.
EndIf
EndIf
Return(vRet)
//-----------------------------------------------------------------------------
Function ChkSum(vFields)
local vCont,vLen := Len(vFields) - 1
local vTotal,vCampo := "",lValor
vTotal := 0
For vCont := 1 To vLen
If ValType(vFields[vCont]) = "N"
vCampo := vCampo + AllTrim(Str(vFields[vCont]))
EndIf
If ValType(vFields[vCont]) = "C"
vCampo := vCampo + AllTrim(vFields[vCont])
EndIf
If ValType(vFields[vCont]) = "D"
vCampo := vCampo + DtoS(vFields[vCont])
EndIf
If ValType(vFields[vCont]) = "L"
lValor := vFields[vCont]
vCampo := vCampo + If(&lValor,"t","f")
EndIf
Next vCont
vTotal := nStrCrc(vCampo)
Return(vTotal)
//-----------------------------------------------------------------------------
Function OkChkSumAll()
local vRecno := Recno(), vCampo, lOk
CursorWait()
DbGoTop()
If LastRec() = 0
Return(Nil)
EndIf
While !Eof()
If Recno() <> 0
OkChkSum(0,.t.)
EndIf
DbSkip()
EndDo
DDbGoTo(vRecno)
Return(Nil)
//-----------------------------------------------------------------------------
Salu2
Willi........
...........
Function OkChkSum(oModo,lAll)
local vRet := .f., vCount := FCount(), vFields := {}, oLbx, vVar
local vChkSum := ""
DEFAULT oModo := 0
DEFAULT lAll := .f.
vFields := LeeRegistro(vFields,vCount) // cargamos el registro al array vfields
vChkSum := ChkSum(vFields)
If Empty(_Field->codv)
oModo := 1
EndIf
If oModo == 0
If _Field->codv <> vChkSum
If !lAll
If MsgNoYes("Este Registro ha sido Alterado fuera de Sistema,,,","Corregir Balance?")
If Rec_Lock(10)
_Field->codv := vChkSum
DbUnLock()
EndIf
EndIf
EndIf
vRet := .f.
EndIf
Else
If Rec_Lock(10)
_Field->codv := vChkSum
DbUnLock()
vRet := .t.
EndIf
EndIf
Return(vRet)
//-----------------------------------------------------------------------------
Function ChkSum(vFields)
local vCont,vLen := Len(vFields) - 1
local vTotal,vCampo := "",lValor
vTotal := 0
For vCont := 1 To vLen
If ValType(vFields[vCont]) = "N"
vCampo := vCampo + AllTrim(Str(vFields[vCont]))
EndIf
If ValType(vFields[vCont]) = "C"
vCampo := vCampo + AllTrim(vFields[vCont])
EndIf
If ValType(vFields[vCont]) = "D"
vCampo := vCampo + DtoS(vFields[vCont])
EndIf
If ValType(vFields[vCont]) = "L"
lValor := vFields[vCont]
vCampo := vCampo + If(&lValor,"t","f")
EndIf
Next vCont
vTotal := nStrCrc(vCampo)
Return(vTotal)
//-----------------------------------------------------------------------------
Function OkChkSumAll()
local vRecno := Recno(), vCampo, lOk
CursorWait()
DbGoTop()
If LastRec() = 0
Return(Nil)
EndIf
While !Eof()
If Recno() <> 0
OkChkSum(0,.t.)
EndIf
DbSkip()
EndDo
DDbGoTo(vRecno)
Return(Nil)
//-----------------------------------------------------------------------------
Salu2
Willi........