Como tratar reserva de numero de cupom em rede (HELP!!!!!)

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Marcio Antonio Ril
Usuário Nível 1
Usuário Nível 1
Mensagens: 42
Registrado em: 13 Set 2005 11:55

Como tratar reserva de numero de cupom em rede (HELP!!!!!)

Mensagem por Marcio Antonio Ril »

Galera,

Mais uma vez estou eu aqui com duvidas, mais afinal esse é o lugar certo.
Seguinte tenho uma aplicação que controla vendas a vista, com cheque e a prazo de um cliente, acontece que estou tendo problemas para controlar a reserva de numeração, por vezes saem vendas para para diferentes clientes com o mesmo numero.

Estou pegando o numero na hora de gravar ou seja, quando o usuario encerra a venda eu seleciono o arquivo e dou um
GO BOTTOM
WCOD_CON := COD_CON + 1

São 03 micros em rede gerando e imprimindo essas vendas.
Se alguem tiver um exemplo de como tratar isso, por favor me envie.

Vai abaixo um exemplo da rotina de venda a Vista.

Obrigado

Marcio Ril

SETCOLOR("B/W,W/N+,,,B/W")
WKTELA2 := SAVESCREEN(00,00,24,79)

IF !FILE("INDCLI1.IDX")
SELECT 1
USE CLIENTE ALIAS CLIENTE
INDEX ON COD_CLI TO INDCLI1
INDEX ON NOME_CLI TO INDCLI2
SET INDEX TO INDCLI1, INDCLI2
ELSE
SELECT 1
USE CLIENTE ALIAS CLIENTE
SET INDEX TO INDCLI1, INDCLI2
ENDIF

IF !FILE("INDVE1.IDX")
SELECT 3
USE VENDEDOR ALIAS VENDEDOR
INDEX ON COD_VEN TO INDVE1
INDEX ON NOME_VEN TO INDVE2
SET INDEX TO INDVE1, INDVE2
ELSE
SELECT 3
USE VENDEDOR ALIAS VENDEDOR
SET INDEX TO INDVE1, INDVE2
ENDIF

IF !FILE("INDME1.IDX")
SELECT 13
USE MENSAGEM ALIAS MENSA
INDEX ON COD_MEN TO INDME1
SET INDEX TO INDME1
ELSE
SELECT 13
USE MENSAGEM ALIAS MENSA
SET INDEX TO INDME1
ENDIF

IF !FILE("INDCO1.IDX")
SELECT 4
USE CONTRATO ALIAS CONTRATO
INDEX ON COD_CON TO INDCO1
INDEX ON COD_CON + COD_CLI TO INDCO2
SET INDEX TO INDCO1, INDCO2
ELSE
SELECT 4
USE CONTRATO ALIAS CONTRATO
SET INDEX TO INDCO1, INDCO2
ENDIF

IF !FILE("INDCX1.IDX")
SELECT 5
USE CAIXA ALIAS CAIXA
INDEX ON COD_CON TO INDCX1
INDEX ON COD_CON + VALOR_CON TO INDCX2
INDEX ON COD_CON + COD_CLI TO INDCX3
INDEX ON DTEM_CON TO INDCX4
SET INDEX TO INDCX1, INDCX2, INDCX3, INDCX4
ELSE
SELECT 5
USE CAIXA ALIAS CAIXA
SET INDEX TO INDCX1, INDCX2, INDCX3, INDCX4
ENDIF

IF !FILE("INDCA1.IDX")
SELECT 2
USE CARNE ALIAS CARNE
INDEX ON NUM_PAR TO INDCA1
INDEX ON COD_CON TO INDCA2
INDEX ON COD_CLI TO INDCA3
INDEX ON DTVEN_PAR + NUM_PAR TO INDCA4
INDEX ON COD_CON + COD_CLI TO INDCA5
INDEX ON COD_CON + NUM_PAR TO INDCA6
SET INDEX TO INDCA1, INDCA2, INDCA3, INDCA4, INDCA5, INDCA6
ELSE
SELECT 2
USE CARNE ALIAS CARNE
SET INDEX TO INDCA1, INDCA2, INDCA3, INDCA4, INDCA5, INDCA6
ENDIF

IF !FILE("INDCH1.IDX")
SELECT 6
USE CHEQUE ALIAS CHEQUE
INDEX ON NUM_CH TO INDCH1
INDEX ON COD_CLI TO INDCH2
INDEX ON NUM_CH + COD_CLI TO INDCH3
INDEX ON NUM_CH + COD_CON TO INDCH4
INDEX ON COD_CON TO INDCH5
SET INDEX TO INDCH1, INDCH2, INDCH3, INDCH4, INDCH5
ELSE
SELECT 6
USE CHEQUE ALIAS CHEQUE
SET INDEX TO INDCH1, INDCH2, INDCH3, INDCH4, INDCH5
ENDIF

SET DELETED ON
DO WHILE .T.

MENSAGEM("Tecle <ESC> para retornar")

WSOMA := 0
WCOD_CLI := 0
WNOME_CLI := SPACE(30)
WEND_CLI := SPACE(30)
WBAIRRO_CLI := SPACE(15)
WCID_CLI := SPACE(20)
WUF_CLI := SPACE(02)
WRG_CLI := SPACE(12)
WCPF_CLI := SPACE(14)
WLIMITE_CLI := 0
WPAGTO := 0
WPARCELAS := 0
WCOD_CON := 0
WDTEM_CON := DATAATU
WENTRADA := 0
WVL_TOT_CON := 0
WVL_DES_CON := 0
WVL_LIQ_CON := 0
WNUM_PAR := 0
WVL_PAR := 0
WDTVEN_PAR := DATAATU
WVL_PAR_PG := 0
WDT_PAR_PG := DATAATU
WOBS_CON := SPACE(38)
WOBS1_CON := SPACE(38)
WOBS2_CON := SPACE(38)
WOBS3_CON := SPACE(38)
WTP_PG_CON := 0
WCOD_VEN := 0
WSITUA_CLI := SPACE(1)
WULTIMA := 0
WDESC1_MEN := SPACE(30)
WDESC2_MEN := SPACE(30)
WPOSCARNE := 0
WCOD_UNICO := 0
WCONF := "S"

JANELA(02,00,08,79," S I S C R E D I ")
COR("MENU")

// 1 2 3 4 5 6 7 8
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
@ 04,02 SAY "Cliente.:"
@ 05,02 SAY "Endereco:"
@ 06,02 SAY "Bairro..: Cidade:"
@ 07,02 SAY "CPF.....: RG....:"

@ 03,67 TO 07,78
@ 04,68 SAY " Contrato "

// 1 2 3 4 5 6 7 8
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
@ 09,02 SAY "---------- M E N U ------------- ------------ PARCELAMENTOS ------------"
@ 10,02 SAY " "
@ 11,02 SAY " "
@ 12,02 SAY " "
@ 13,02 SAY " "
@ 14,02 SAY " "
@ 15,02 SAY " "
@ 16,02 SAY " "
@ 17,02 SAY " "
@ 18,02 SAY " "
@ 19,02 SAY " ---- POSIۂO FINANCEIRA DO CLIENTE ----"
@ 20,02 SAY " "
@ 21,02 SAY " "

@ 08,01 TO 22,38
@ 08,39 TO 17,78
@ 18,39 TO 22,78

SELE CONTRATO
SET ORDER TO 1
GO BOTTOM
WCOD_CON := COD_CON + 1
WCOD1_CON := WCOD_CON

SELE CLIENTE
SET ORDER TO 1
@ 04,12 GET WCOD_CLI VALID (WCOD_CLI>0) PICT "999999"
READ

IF LASTKEY() = 27
EXIT
CLS
ENDIF

@ 05,71 SAY WCOD_CON PICT "999999"
@ 06,68 SAY WDTEM_CON PICT "@D"

SEEK WCOD_CLI
IF FOUND()
WNOME_CLI := NOME_CLI
WEND_CLI := END_CLI
WCID_CLI := CID_CLI
WBAIRRO_CLI := BAIRRO_CLI
WUF_CLI := UF_CLI
WRG_CLI := RG_CLI
WCPF_CLI := CPF_CLI
WSITUA_CLI := SITUA_CLI
WLIMITE_CLI := LIMITE_CLI
WPENDENTE := "P"
WDADOS1_CLI := DADOS1_CLI
WDADOS2_CLI := DADOS2_CLI
WDADOS3_CLI := DADOS3_CLI

@ 04,20 SAY WNOME_CLI PICT "@!"
@ 05,12 SAY WEND_CLI PICT "@!"
@ 06,12 SAY WBAIRRO_CLI PICT "@!"
@ 06,36 SAY WCID_CLI PICT "@!"
@ 06,62 SAY "-"
@ 06,64 SAY WUF_CLI PICT "@!"
@ 07,12 SAY WCPF_CLI PICT "999.999.999-99"
@ 07,36 SAY WRG_CLI PICT "@!"

ELSE
BEEP()
MENSAGEM("Cliente nÆo Cadastrado",2)
LOOP
ENDIF

POSFIN()
POSFINRODAPE()
DO WHILE .T.

COR("MENU")
// 1 2 3 4 5 6 7 8
// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
@ 09,02 SAY "---------- M E N U ------------- ------------ PARCELAMENTOS ------------"
@ 10,02 SAY " "
@ 11,02 SAY " "
@ 12,02 SAY " "
@ 13,02 SAY " "
@ 14,02 SAY " "
@ 15,02 SAY " "
@ 16,02 SAY " "
@ 17,02 SAY " "
@ 18,02 SAY " "
@ 19,02 SAY " ---- POSIۂO FINANCEIRA DO CLIENTE ----"
@ 20,02 SAY " "
@ 21,02 SAY " "

@ 08,01 TO 22,38
@ 08,39 TO 17,78
@ 18,39 TO 22,78

@ 11,03 PROMPT " VENDA · VISTA "
@ 12,03 PROMPT " VENDA C/CHEQUE PR
Avatar do usuário
C Leonam
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 22 Nov 2005 17:40
Localização: Maceió

Mensagem por C Leonam »

Marcio,

Já tentou depois do GO BOTTOM dar um DBSKIP() para forçar o final do arquivo, e um RLOCK() para evitar que outros incluam, para depois dar um DBAPPEND().
Lembrando é claro de dar um DBCOMMIT() e a seguir um DBUNLOCK(), para liberar novas inclusões.

Ah! Também não esqueça de fazer os outros usuários aguardarem a liberação do final do arquivo.

:xau
Clp52e, Blinker 5.1
Avatar do usuário
rrfsistemas
Usuário Nível 3
Usuário Nível 3
Mensagens: 249
Registrado em: 11 Jul 2004 18:16
Localização: Uberlândia/MG

Mensagem por rrfsistemas »

Caro colega eu usava desta forma mas tive muitos problemas...

O mais correto é vc criar um arquivo de controle com um campo contendo o numero a incrementar.
Trave-o, incremente +1, e depois destrave-o para outro usuário fazer o mesmo processo, sendo assim não havera nros repetidos.


:xau
"Não é a ferramenta que faz o artesão e sim a sua criatividade...""
Renato Ribeiro Ferreira
Tecnologia em Analise de Sistemas de Informação
http://www.rrfsistemas.hd1.com.br
( VFP 9 + MySql e/ou Oracle 11 ) - ...Harbour/MiniGui...
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

É como o rrfsistemas colocou, não existe outro meio, mas será necessário dois numero de controle, sendo que um deles é temporário definido no inicio da venda e o outro oficial colocado no momento da confirmação da venda.

Ou seja voce teria um numero de orçamento o qual voce usaria para vincular os itens, clientes, etc.

Caso a venda não fosse confirmada a numeração de cupom não seria modificada, desta forma não existiria furos na sequencia.

Caso seja confirmada a venda voce grava o numero de cupom oficial na venda e pronto.

Meus arquivos de movimento geralmente tem campos para codigo de orcamento, pedido, notafiscal, solicitação e ordem de produção, pois um mesmo orcamento pode gerar estes mesmos vinculos e portanto não da pra ficar mantendo o mesmo numero para todos, pois um orçamento pode levar dias para ser confirmado e receber um numero de ordem de produção e no final tornar-se um pedido para depois receber um numero de notafiscal.

Caso necessite manter numerações de controle sugiro usar a função de autonumeração que coloquei a disposição neste link.

@braços :?)
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1299
Registrado em: 06 Jul 2004 00:44
Contato:

Mensagem por ANDRIL »

Ola pessoal,

vou expor como uso em poucas palavras:

-trabalho com banco para armazenar o numero da venda.
-Na escolha do primeiro item busco o numero da venda no banco de dados.
-Se o operador desistir da venda guardo este numero em um arquivo texto no pc que tá rodando o sistema.
-Se o operador fizer uma nova venda o sistema procura este arquivo texto e se existir checa o numero que esta gravado no arquivo, caso nao exista busca um novo numero no banco de dados que armazena o numero da venda.

Não uso a tatica GO BOTTOM para o novo numero de venda e adotei o procedimento acima para colocar os numeros de vendas na sequencia sem furos.

O que me levou a fazer o procedimento é em que meu sistema o usuario pode imprimir o cupom (não fiscal) e após desistir da venda. Este fato fazia com que o numero de vendas tivesse furos.

Espero ter ajudado ou complicado,

Abraços
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Mensagem por Poka »

Prezado colega Marcio

Estava dando uma olhada rapidamente na sua rotina e onde voce escreve:

Use contrato alias contrato
index on cod_con to indc01
index on cod_con + codcli to indc02

Voce nao precisa do indice 2, coloque ja no 1
index on cod_con + codcli to indc01

Outra coisa, para emissao de documentos que gera vendas e contas a receber sempre faça a pesquisa pelo numero do documento + codigo do cliente, inclusive nas baixas dos documentos. Ao baixar um documento voce pode pedir para o usuario entrar com o numero do documento e o codigo do cliente, ou melhor ainda, ao entrar o numero do documento voce pesquisa no arquivo se tem + de um mesmo numero.Se nao tiver voce carrega o numero do cliente sem passar pela digitacao do cliente, se tiver documentos repetidos voce mostra na tela para o usuario escolher.
Nunca é pra ter repetido, mas se tiver, voce não terá problemas pois dificilmente será do mesmo cliente.

Já aconteceu comigo de gerar numeros iguais, mas sempre o documento de numero 1, isso porque o arquivo corrompeu-se devido a parada de energia eletrica, então sempre que gero um numero, antes de gravar faço um verificação se ja existe, se existir, envio mensagem para organizar os arquivos.


Um abraço

Poka
Marcio Antonio Ril
Usuário Nível 1
Usuário Nível 1
Mensagens: 42
Registrado em: 13 Set 2005 11:55

Como fzer o TXT

Mensagem por Marcio Antonio Ril »

Amigo Andril, veja o trecho abaixo, quando o usuario teclar ESC o ele estará saindo da venda sem usar o numero reservado, como proceder para esse numero ser gravado dentro e um arquivo TXT.
Poderia colocar um exemplo!

Obrigado,

Marcio Ril

IF LASTKEY() = 27
"guarda o numero reservado dentro do TXT"
EXIT
CLS
ENDIF
Responder