Página 1 de 1

Número de pedido.

Enviado: 05 Set 2005 16:53
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

Enviado: 05 Set 2005 17:12
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

Enviado: 06 Set 2005 09:45
por momente
Marcelo,

Meu muito obrigado!

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

Um grande abraço!

Enviado: 06 Set 2005 10:00
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...

por semáforo

Enviado: 06 Set 2005 12:23
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.

Enviado: 06 Set 2005 22:46
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!

Enviado: 06 Set 2005 22:48
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!

Enviado: 08 Set 2005 13:57
por momente
GVC,

Tudo bem!

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

Obrigado! :?

Enviado: 14 Set 2005 16:53
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)

Enviado: 14 Set 2005 17:34
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

Enviado: 11 Out 2005 18:32
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)

Re: Número de pedido.

Enviado: 12 Out 2005 03:41
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/