Amiguinhos,
Vejamos então a novissima versão 2.0(ka, ka, ka) da função PsqControle():
FUNCTION PsqControle( database, _altera_, _ComValor_ )
DEFAULT _altera_:= .t., _ComValor_ := 0
nControle := iif( recco()=0, 1, recco()+(recco()/4) )
OldArea := Select()
if !file("CONTROLE.DBF")
ESTRU_DBF := { { "DATABASE" , "C",12, 0 } , ;
{ "CONTADOR" , "N", 7, 0 } }
DBCREATE( "CONTROLE", ESTRU_DBF )
endIf
If Select("controle") == 0
USE controle NEW SHARED
Else
DbSelectArea("controle")
EndIf
LOCATE FOR UPPER(controle->database) = UPPER(database)
if found()
nControle := controle->contador
if _altera_ = .t. // NIL
if _ComValor_ # 0 // NIL
nControle := _ComValor_
else
nControle := controle->contador + 1
endif
//else
// nControle := controle->contador + 1
controle->( rLock() )
controle->contador := nControle
controle->( dbUnLock() )
controle->( dbCommit() )
endif
else
if _altera_ = .t. // NIL
if _ComValor_ # 0 // NIL
nControle := _ComValor_
endif
endif
controle->( dbAppend() )
controle->database := database
controle->contador := nControle
controle->( dbUnLock() )
controle->( dbCommit() )
endif
SELE (OldArea)
RETURN nControle
Neste caso o segundo parametro sempre será verdadeiro, ou seja, sempre altera a contagem, mas em casos especificos que não se queira que seja alterado o contador automaticamente mas mantenha momentaneamente o ultimo valor, exemplo: estou tentando enviar a NF-e 3000 e tento por 5 vezes, este valor 3000 não se alterará automáticamente até que eu deseje.
No caso do terceiro parametro, coloco o valor provável na nova sequencia, ou seja, estou forçando a contagem à partir do novo numero que coloquei.
Quando acontece um pau e os registros são zerados ou perdidos o cálculo,
nControle := iif( recco()=0, 1, recco()+(recco()/4) ), traz a contagem baseada no número de registros na tabela, ocasionando um numero mais baixo, então
_ComValor_ entraria em ação trazendo o último contador obtido na tabela CONTROLE conforme o indice registrado até o referido PAU.
Exemplo:
M->NF := PsqControle( "NF", .f. ) // Somente carrega numero de nota
cSeekCodigo := M->NF // Variavel temporaria
// Dialogo para configurar o numero da nota
SET _3DLOOK ON
DEFINE DIALOG oNFDlg RESOURCE "dlgPrintNF" TITLE "Imprimindo nota fiscal"
REDEFINE GET oGet101 VAR cSeekCodigo PICTURE "999999" ID 101 OF oNFDlg ;
SPINNER ON UP (cSeekCodigo:=cSeekCodigo+iif(cSeekCodigo>99999,0,1),oGet101:Refresh()) ;
ON DOWN (cSeekCodigo:=cSeekCodigo-iif(cSeekCodigo<00001,0,1),oGet101:Refresh())
REDEFINE BUTTON ID 2 OF oNFDlg ACTION ( lSave := .t. , oNFDlg:End() ) DEFAULT
REDEFINE BUTTON ID 3 OF oNFDlg ACTION ( lSave := .f. , oNFDlg:End() )
ACTIVATE DIALOG oNFDlg CENTERED
if !lSave // Se CANCELei o dialogo volta sem processar mais nada
return .t.
endif
// Se o SEQUENCIAL for o mesmo que o usuário digitou...
if cSeekCodigo = M->NF
// Atualiza o contador
M->NF := PsqControle( "NF" )
endif
// Guarda o numero digitado pelo usuario, seja qual for.
M->NF := cSeekCodigo
Caso eu queira sempre salvar meu último numero digitado manualmente:
// Se o SEQUENCIAL for o mesmo que o usuário digitou...
if cSeekCodigo = M->NF
// Atualiza o contador com o novo numero digitado manualmente
M->NF := PsqControle( "NF", .t., cSeekCodigo )
endif
// Guarda o numero digitado pelo usuario, seja qual for.
M->NF := cSeekCodigo