Código automático ou facultativo

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Código automático ou facultativo

Mensagem por MARCELOG »

Alô colegas,
preciso das suas experiências para saber como proceder.
Estou criando um sistema que, inicialmente, gera automaticamente o código para os registros manipulados pelo mesmo.
Esse código é armazenado em um arquivo texto à parte, que vai sendo incrementando conforme o número de registros válidos incluídos.
Ao apresentar os "primeiros passos" desse sistema, com codificação automática de registros, sugeriram que o código dos registros fossem facultativos.
Como o sistema é jurídico, por exemplo, ao invés de relacionar o código 000001 a uma AÇÃO TRABALHISTA, o usuário poderia usar algo mais amistoso e facilmente "lembrável", do tipo ACATRA, ACAOTR, TRABAL, etc.
Sugeriram também que a codificação automática fosse mantida no caso do código ficar em branco (numa inclusão por exemplo), para poder ser eventual e futuramente mudado.
Fácil!?
Não sei. O sistema funciona em rede e a duplicidade de códigos, detonando os relacionamentos pode ocorrer.
Alguém pode me ajudar a decidir?
Informem suas experiências, isso pode me ajudar, bem como aos demais integrantes do forum.

Atenciosamente.

MGS
gransoft
Usuário Nível 3
Usuário Nível 3
Mensagens: 321
Registrado em: 06 Jul 2004 17:48
Localização: UBERLÂNDIA-MG
Contato:

Controle de Numeração

Mensagem por gransoft »

ARAGUARI-MG, 3 de agosto de 2005.

Prezado Marcelo,

Segue uma sugestão:

Crie um arquivo, DOC.DBF com apenas um campo alfanumérico com 6 dígitos:

NUMLAN, C,6

Para solicitar um novo número, utilize esta chamada:

cDocumento := GeraNDoc("I",SPACE(06))

Ao excluir um documento, para aproveitar o número para próximo documento:

GeraNDoc("E",cDocumento)

Código: Selecionar todos

/*

FUNCTION PARA GERAR NUMERO SEQUENCIAL DE DOCUMENTOS, REAPROVEITANDO
OS QUE EVENTUALMENTE FOREM EXCLUIDOS, SEM REPETICAO.

*/

FUNCTION GeraNDoc(cVar,cNL)
*
LOCAL nArq, nNl, cNumLan := SPACE(06)  && 700000 ...
*
IF (VALTYPE(cVar) <> "C") .OR. (cVar == NIL)
   RETURN(cNumLan)
END
*
cVar := ALLTRIM(cVar)
*
IF (cVar <> "I") .AND. (cVar <> "E")
   RETURN(cNumLan)
END
IF (cVar == "E") .AND. ((VALTYPE(cNL) <> "C") .OR. (cNL == NIL))
   RETURN(cNumLan)
END
*
nArq := Arquivo("NUMDOC")
*
IF Abre_Dbf(aDbfNtx[nArq,01],aAlias[nArq],lMono,5)
   && Abre_Ntx(nArq)
ELSE
   SETCOLOR(cCor5)
   Mensagem("*** O "+aMsgArq[nArq,01]+" NAO ESTA DISPONIVEL ***")
   Retorno()
   RETURN(cNumLan)
END
*
IF     cVar = "I"  && Inclusao ...
   IF     LASTREC() = 0
      GOTO BOTTOM
      nNl     := 1
      cNumLan := STRZERO(nNl,6)
      APPEND BLANK
      REPLACE NUMLAN WITH CD(cNumLan)
   ELSEIF LASTREC() = 1
      GOTO 1
      nNl     := VAL(DC(NUMLAN))+1
      cNumLan := STRZERO(nNl,6)
      REPLACE NUMLAN WITH CD(cNumLan)
   ELSEIF LASTREC() >= 2
      GOTO 2
      nNl     := VAL(DC(NUMLAN))
      cNumLan := STRZERO(nNl,6)
      DELETE
      PACK
   END
ELSEIF cVar = "E"  && Exclusao ...
   GOTO BOTTOM
   APPEND BLANK
   REPLACE NUMLAN WITH CD(cNL)
END
*
COMMIT
CLOSE NUMDOC
*
RETURN(cNumLan)
***
Observe que será criado uma seqüência, e armazenado no primeiro registro o número atual. Em caso de exclusões, os demais registros serão utilizados nas próximas chamadas da função.

Como o arquivo é chamado rapidamente em modo EXCLUSIVO, não haverá duplicidades na seqüência.

PS: "Código Facultativo" é problema premeditado ...

Atenciosamente,
Janis Peters Grants.

Skype: gransoft
http://www.gransoft.com.br
gransoft@zipmail.com.br
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

Valeu!
Vamos aos testes.

MGS
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Olá,

Concordo com Janis qdo ele diz que código facultativo é problema premeditado!!

Quando um cliente pede algo deste tipo, eu particularmente, trabalho inserindo o código automático, em geral numerico e em ordem sequencial crescente, e deixando a opção para ele cadastrar um segundo código, o "código interno", de uso da empresa.

Certo cliente me pediu ha pouco tempo para sempre que excluir um produto ou cliente ( ou algum registro de outro arquivo ) reutilizar seu código para o próximo a ser cadastrado... Só pensei comigo "Nada bom isso..."
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

Vou na do Stanis,

Eu tambem tive problemas com a questão de reutilização de código, pois se houver algum dado do cliente antigo no sistema ou em backup, ai vem uma confusão, sempre uso um codigo onde pego o RECCOUNT e procuro pelo codigo, no caso dele existir incremento até achar um codigo que não esteja cadastrado, este codigo nunca muda e nunca está disponivel para o usuario, é apenas interno para o programa relacionar as informações referentes a este cliente.

Um outro campo codigo fica a disposição do cliente, sendo incrementado como ele escolher.
Sem mais
Wagner Nunes
www.vagucs.com.br
Responder