Número de pedido.

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
momente
Usuário Nível 3
Usuário Nível 3
Mensagens: 496
Registrado em: 03 Mar 2005 11:53
Localização: São Carlos-SP
Contato:

Número de pedido.

Mensagem por momente »

Caros amigos,

Tenho uma rotina que gera pedidos em um sistema, este é usado por tres estações fazendo lançamentos direto, minha questão é a seguinte, como gerar números de pedidos sem conhecidir o mesmo número, não quero usar .mem, estou gravando o ultimo número em um arquivo, mas mesmo assim as vezes gera dois pedidos com o mesmo número. Será que deu pra intender?

Alguem tem alguma idéia melhor?

Por enquanto muito obrigado pela atenção!
:xau
Rogerio L. Momenté
Nada é tão perfeito que não possamos melhorar.
Nunca se explique. Seus amigos não precisam e seus inimigos não vão acreditar.
www.looksystem.com.br
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Prezado Colega

Se você está guardando o número em um arquivo está no caminho certo, você deve gerar e guardar este número no inicio do pedido, para evitar duplicidade, trave o registro ao atribuir o novo número, desta forma não tem como dar errado, pois outro usuário só poderá utlizar o registro quando este estiver liberado. Exemplo básico :

USE ACUMULA SHARED
RLOCK()
MPEDIDO=PEDIDO+1
REPLACE PEDIDO WITH MPEDIDO
DBUNLOCK()

Pronto ! Neste caso o pedido será MPEDIDO e não terá com haver duplicidade.

Espero que tenha entendido.

Óbviamente que isso é um exemplo bem simplório, mas a técnica é que deve ser considerada.

Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Avatar do usuário
momente
Usuário Nível 3
Usuário Nível 3
Mensagens: 496
Registrado em: 03 Mar 2005 11:53
Localização: São Carlos-SP
Contato:

Mensagem por momente »

Marcelo,

Meu muito obrigado!

Na verdade estava querendo confirmar se estava certa a lógica.

Um grande abraço!
Rogerio L. Momenté
Nada é tão perfeito que não possamos melhorar.
Nunca se explique. Seus amigos não precisam e seus inimigos não vão acreditar.
www.looksystem.com.br
Everton
Usuário Nível 3
Usuário Nível 3
Mensagens: 143
Registrado em: 07 Jul 2004 08:53
Localização: Campo Grande - MS

Mensagem por Everton »

Ola Rogeiro.

A forma que o Marcelo lhe explicou dá certo, mas eu trabalho diferente, eu grava o numero no inicio do pedido buscando o ultimo que foi gravado no DBF de pedidos acrecido de 1, na conclusão do pedidos verifico se este numero existe no arquivo de pedidos se não existe ai sim eu gravo, se existe eu acrescento 1 até que não mais exista o numero igual, e assim que faço é deu certo sempre, falou...
Everton Luiz Penteado
Clipper 5.2b - Blink 7.0
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

por semáforo

Mensagem por gvc »

Eu utilizo um arquivo de semáforo para fazer a reserva do número do pedido.
Se o pedido não é fechado (vc fez a reserva mas não vai fazer o pedido ou o mesmo é cancelado por algum motivo que não seja normal), o número reservado volta para a fila.

Então eu tenho a seqüência dos número devolvidos e o número seqüêncial dos pedidos.

A estrutura:
chave, C, 10
tipo, C, 1
valor, C, 10

Chave - indica qual chave seqüêncial vc esta usando. Vc pode ter mais de uma fila em um sistema.

tipo - 1 - valor devolvido para a lista. 2 - seqüência normal. 3 - registro apaga, pode ser utilizado para nova entrada (outro número devolvido).

Assim vc pode reservar um número de pedido. Se o pedido não for gravado, vc devolve ele para a lista.

Se achar a idéia aproveitável, mande um e-mail.
Avatar do usuário
momente
Usuário Nível 3
Usuário Nível 3
Mensagens: 496
Registrado em: 03 Mar 2005 11:53
Localização: São Carlos-SP
Contato:

Mensagem por momente »

Everton e gvc.

Obrigado pela atenção!

Vou testar as idéias, pois achei bastante interessantes, logo darei retorno a vocês.

Valeu!
Rogerio L. Momenté
Nada é tão perfeito que não possamos melhorar.
Nunca se explique. Seus amigos não precisam e seus inimigos não vão acreditar.
www.looksystem.com.br
Avatar do usuário
momente
Usuário Nível 3
Usuário Nível 3
Mensagens: 496
Registrado em: 03 Mar 2005 11:53
Localização: São Carlos-SP
Contato:

Mensagem por momente »

Everton e gvc.

Obrigado pela atenção!

Vou testar as idéias, pois achei bastante interessantes, logo darei retorno a vocês.

Valeu!
Rogerio L. Momenté
Nada é tão perfeito que não possamos melhorar.
Nunca se explique. Seus amigos não precisam e seus inimigos não vão acreditar.
www.looksystem.com.br
Avatar do usuário
momente
Usuário Nível 3
Usuário Nível 3
Mensagens: 496
Registrado em: 03 Mar 2005 11:53
Localização: São Carlos-SP
Contato:

Mensagem por momente »

GVC,

Tudo bem!

Não entendi muito bem o funcionamento do semaforo! vc pode dar mais alguma explanada sobre a rotina?

Obrigado! :?
Rogerio L. Momenté
Nada é tão perfeito que não possamos melhorar.
Nunca se explique. Seus amigos não precisam e seus inimigos não vão acreditar.
www.looksystem.com.br
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

_pedido := reservanumero('PED', 5)

Reserva um número de pedido, chave PER, com cinco dígitos.
Se alguem solicitar uma nova reserva de número de pedido a função retorna outros número.

Se o sistema não gravar o pedido, ou seja, não utilizar o número reservado, vc deverá chamar:

liberanumero('PED', _pedido)

O número reservado será devolvido para a lista. Quando algum usuário solicitar um novo número, os devolvidos estarão em primeiro na lista.

<var num pedido> := reservanumero(<chave>, <tamanho>)
liberanumero(<chave>, <var num pedido>)

Espero ter ajudado. Se tiver problemas, avise.

***
*** Reserva o numero na seqüência.
*** 1 - Devolvido; 2 - Normal; 3 - Apagado
***
function reservanumero(cChave, tamanho)
local cnum, x_x
if !penx1->(dbseek(cchave))
penx1->(dbappend())
penx1->modulo := cChave
penx1->codigo := '2'
penx1->numero := strzero(2, tamanho)
cnum := strzero(1, tamanho)
else
penx1->(rlock())
x_x := at('/', penx1->numero)
cnum := iif(x_x = 0, penx1->numero, left(penx1->numero, x_x - 1))
cnum := strzero(val(cnum), tamanho)
if penx1->codigo = '1'
penx1->modulo := 'zzzzzzzz'
penx1->codigo = '3'
penx1->(dbdelete())
else
penx1->numero := strzero(val(cnum) + 1, tamanho)
end
cnum := cnum
end
penx1->(dbunlock())
return(cNum)

***
*** Libera Reserva da Seqüência
***
function liberanumero(cChave, qual)
local cnum, x_x
set deleted off
cchave := upper(cchave)
cnum := cchave
if penx1->(dbseek('zzzzzzzz' + '3'))
penx1->(rlock())
penx1->(dbrecall())
penx1->modulo := cChave
penx1->codigo := '1'
penx1->numero := qual
else
penx1->(dbappend())
penx1->modulo := cchave
penx1->codigo := '1'
penx1->numero := qual
end
penx1->(dbunlock())
set deleted on
return(cNum)
Avatar do usuário
software_facil
Usuário Nível 3
Usuário Nível 3
Mensagens: 211
Registrado em: 23 Fev 2005 12:19
Localização: Curitiba/PR
Contato:

Mensagem por software_facil »

Prezado Momente,

Mais uma idéia para o que vc deseja :

Crie um DBF contendo um campo do mesmo tipo e tamanho do número do pedido.
EX : CONTAPED.DBF
NUM_PEDIDO N 6
Adicione o número que deseja partir no campo.

Quando estiver na sua rotina de pedidos, abra o CONTAPED.DBF, mas não pegue o número que estiver lá, somente quando realmente for efetivar o pedido, selecione CONTAPED.DBF, trave o registro e pegue o número que ele contém, logo em seguida, some +1 e grave, desbloqueie o registro e use o número para gravar no seu pedido.
Utilizo essa codificação para gerar códigos, e nunca tive 1 registro com chave primária igual, pois no momento em que vc vai travar o registro (isso deve ser feito em loop até conseguir), o número que está lá é novo, e antes de vc liberar o registro, o mesmo já sofreu incremento.

Abraços
messenger : software_facil@hotmail.com
Avatar do usuário
linux.eo
Usuário Nível 1
Usuário Nível 1
Mensagens: 40
Registrado em: 09 Out 2005 19:23

Mensagem por linux.eo »

Achei a forma muito interessante:

USE ACUMULA SHARED
RLOCK()
MPEDIDO=PEDIDO+1
REPLACE PEDIDO WITH MPEDIDO
DBUNLOCK()

Pois realmente você trava no momento de criar o número do seu
pedido, e outro terminal teria qua aguardar a criação.

Mas se você quiser outra opção, que aprendi quando
estudei BASIC.

A gente escrevia as linhas de 10 em 10, pois se tivesse
a necessidade de mudar alguma coisa no meio
do programa, a gente podia inserir outra linha como 15 por exemplo.

Assim, você poderia criar seus Codigos de 10 em 10,
e na hora de criar o código, você pegaria um número
de 0 a 9 aleatório, calculado naquele momento, e somaria
ao número do registro.

Por exemplo:

Registro escolhido: 46, 46*10=460
Numero randômico: 9
Código do item: 469

O proximo registro escolhido seria 47, 47*10 = 470
Numero randômico: 3
Código do item: 473

Caso dois terminais pegassem o mesmo registro
escolhido, exemplo 48, seria muita sorte sortearem
também o mesmo número randômico.

Assim, um seria 484 e outro seria 481, por exemplo.

Pois o número 4 e 1 foram escolhidos ao acaso.

Mas ainda assim, a forma

USE ACUMULA SHARED
RLOCK()
MPEDIDO=PEDIDO+1
REPLACE PEDIDO WITH MPEDIDO
DBUNLOCK()

é mais interessante.

Citei apenas esta outra forma, para somar mais uma,
contar ponto em mensagens enviadas ao fórum,
e... e... deixa eu pensar...

E para que outros novatos possam conhecer formas
diferentes de resolver problemas computacionais.

(y)
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Número de pedido.

Mensagem por Maligno »

momente escreveu: Tenho uma rotina que gera pedidos em um sistema, este é usado por tres estações fazendo lançamentos direto, minha questão é a seguinte, como gerar números de pedidos sem conhecidir o mesmo número
Da forma como você expôs eu acho meio estranho, uma vez que o número do pedido normalmente é informado pelo próprio usuário, uma vez que ele tem à mão um pedido em papel, que já tem um número.

De qualquer forma, se a questão é gerar um número, seja ele de seqüenciamento de pedidos ou mesmo um numerador (ID) interno para registros, eu utilizo a única forma que me satisfez: números aleatórios. Apesar de soar meio estranho, funciona maravilhosamente. Mas eu não vou repetir tudo o que já disse à respeito, pois o assunto já foi tratado n vezes. Clique no link e leia a mensagem que postei, em esclarecimento à duvida de um colega sobre esse tema. Caso não sirva para você, fica uma referência à mais para os colegas.

[]'s
Maligno
http://www.buzinello.com/
Responder