sobre leitor de código de barra..desafio.

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

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

Mensagem por Maligno »

Compensaria se não houvessem tantas marcas de relógios. Daria pra fazer algo até melhor e sairiam muitas vendas. Mas não é o caso.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Pois é...se esse povo usase um tipo só de comunicação...um unico software....seria Monopolio.....hehe...cara tem muitos clientes com problema de relogio ponto...esses povo que venda esses relogio...vende e depois nunca mais aparecem...hehe...pos-venda.....zero......
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Depedendo da empresa, isso acontece em qualquer negócio. Por isso é preciso pesquisar. Não sei qual é a marca do relógio do meu cliente, mas ele diz que está satisfeito. Em 10 anos juntos, sei que esse é o apenas o segundo relógio dele.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Puxa...se souber a Marca me diz...em 10 Anos...somente dois...tenho clientes...que em Um ano jah deve ter trocado uns 5....hehe...essa marca vai fazer sucesso por aqui...
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Semana que vem eu vou lá e vejo. Depois te digo.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Blz......Agradeço Antecipadamente !!!
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Dinada.
Aliás, acho que vou ver isso amanhã. Dependo de uma ligação do cliente. Mas depois volto ao assunto.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
scom
Usuário Nível 3
Usuário Nível 3
Mensagens: 133
Registrado em: 15 Nov 2004 10:49
Localização: Dourados/MS

ola amigos.

Mensagem por scom »

bom dia a todos..estava viajando esse final de semana.

primeiremante o brigado a todos pela força e principalmente a maligno e sysgecon.

Será necessário apenas criar uma função que seja a única chamadora de InKey() em todo o programa. Ao receber o tal código de tecla "extra", que identifica uma seqüência de teclas vindas do leitor de código de barras, essa própria rotina chamaria uma função de registro do funcionário. Se não for o tal caractere "extra", ela passa o código da tecla pra frente, como se ela própria fosse a InKey(). Não é necessário pendurar nada em background.


bom eu não sei se entendi bem mas, pelo que entendi seria que o leitor alem de ler o código de barra vai passar junto um caracter "extra" . tipo :

000021A OU 000021ACK onde os 6 primeiros é o código do funcionário e o restante a tecla exta?

agora sobre a função to mais perdido ainda...como faria essa função??? funcionar em todo o programa???

pois o usuário esta por exemplo em um tela de cadastro com varios GETS e como esta hoje ele tecla o [F6] abre a tela do ponto e [ESC] volta ao GETS onde estava anteriormente.

to confuso....mas a lógica eu entendi só não to conseguindo coloca-la em prática.

Se puder me dar um exemplo dessa função.

é cada coisa que nós temos que passar, cada cliente, mas vou tenter se der beleza se não o cliente vai ter que aceitar assim mesmo.


atenciosamente

Robson
S COM INFORMÁTICA
CLIPPER 5.3 / FIVEWIN 2.0 / BLINKER 7
XHARBOUR/ BCC582
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

000021ACK
Seria +/- isso. Mas o código extra deveria vir primeiro, já que ao detectá-lo, a função especial saberia o que esperar. A função em si é simples. Se chamaria, por exemplo, MyInKey(). Nela você teria um while, por exemplo. Dentro deste, uma chamada à InKey() original. Lido o caractere, se não for o caractere especial, você simplesmente sai do while e retorna com o código da tecla que veio. Sendo o caractere especial, você saberia que estão pra chegar outros 13 caracteres do código do funcionário (EAN13). Uma vez que tenham vindo todos esses caracteres, de posse do número, você chama a função que faz o registro, lhe passando esse código. Assim que ela retornar, o while de sua MyInKey() continua.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Em tempo: <ACK> é um código de um byte apenas. Significa acknowledged ou "reconhecido". Ele é representado por Chr(6). Mas você pode escolher o que quiser.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
scom
Usuário Nível 3
Usuário Nível 3
Mensagens: 133
Registrado em: 15 Nov 2004 10:49
Localização: Dourados/MS

a sim..

Mensagem por scom »

ok maligno entendi agora o caractere especial.

e tambem a função que pegaria o inkey() e verificaria o caractere especial só não consegui ainda é quando e como faço isso. sendo que o usuário pode estar em um menu, dbedit,prompt, etc...como faço para que essa função fique ativa o tempo todo no sistema?

me desculpe mas ainda não consegui pensar em nada para fazer essa idéia funcionar....para que como vc me explicou a MYINKEY() ficar ativa no sistema!!

como faria isso?

Robson
S COM INFORMÁTICA
CLIPPER 5.3 / FIVEWIN 2.0 / BLINKER 7
XHARBOUR/ BCC582
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Pense na técnica como se fosse um afunilamento. Tudo passa por InKey(). São várias chamadas a esta função no seu programa. Substituindo todas essas chamadas por chamadas à sua MyInKey(), você forçará todos os pontos do seu programa a se "afunilarem", a passarem por esta nova função. Haverá então, apenas uma chamada à InKey(). Dentro da sua MyInKey(). Portanto, nela você terá controle total sobre tudo o que for digitado. Inclusive, através desta técnica você consegue fazer muito mais do que detectar um código especial de controle. Eu próprio uso isso para executar várias funções "diferentes", como screen saver, log-out automático, checagens periódicas, etc.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
scom
Usuário Nível 3
Usuário Nível 3
Mensagens: 133
Registrado em: 15 Nov 2004 10:49
Localização: Dourados/MS

sim a técnica do afunilamento saquei.

Mensagem por scom »

o maligno a técnica do afunilamento eu saquei o problema é que eu não faço varias chamadas da função INKEY(), uso geralmente quando abro uma tela somente para visualizção de dados ai eu uso o inkey() para parar.

no caso teria que acionar essa função toda a vez que uma tecla fosse acionada. por exemplo nos gets seria facil indetificar a tecla especial pois nudaria no GETSYS pois ja testei e ficou beleza, mas se o sistema tiver parado em um PROMPT, ACHOICE e DBEDIT. ou seja não to usando inkey() !

*-)

ou seja a lógica seria interceptar a tecla antes de qualquer coisa.

agora como deixar isso ativo.



Robson
S COM INFORMÁTICA
CLIPPER 5.3 / FIVEWIN 2.0 / BLINKER 7
XHARBOUR/ BCC582
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Eu não uso nada disso. Meu menu é customizado. Mas então a coisa fica difícil desta forma. Mas por aí você vê a complicação desnecessária que é ter duas vias diferentes para receber uma entrada via teclado. A função InKey() deveria ser a única via de entrada, mesmo em alto nível. Mas a AChoice(), que acabei de ver no NG, parece usar uma função customizada.

Se tudo utilizasse InKey() como via de entrada, seria fácil, como eu comentei. Mas você pode fazer um teste pra confirmar. De repente, essas funções integradas, como é a AChoice(), fazem uma chamada à InKey(). Acho difícil, mas não custa tentar. Crie uma MyInKey() como eu disse e não faça nada além de tocar um bip curto a cada tecla pressionada, retornando com o código da tecla sem alteração. Assim, se na execução de AChoice() você ouvir um bip, já sabe que é possível implementar sua MyInKey(). Mas ainda duvido que dê. :(
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
dbsh
Usuário Nível 3
Usuário Nível 3
Mensagens: 128
Registrado em: 14 Jul 2004 14:19
Localização: ES

Mensagem por dbsh »

/*
Nao deu para testar meu CCD queimou, extrai do meu sistema apenas o que foi necessario, se der erro.. :( post ou mande um e-mail para deboni@ibest.com.br

CCD Teclado:
Recomendo você usar um micro separado, pois cada vez que alguem passar o cartão e tiver sendo usado, ira atrabalhar o trabalho podendo gerar erro.
EXEMPLO:
*/

Código: Selecionar todos

STATIc nPortaSerial := 0

#command DEFAULT <var> TO <def> [, <varn> TO <defn>]     =>  ;
         <var> := if(<var> = nil,<def>,<var>) [; <varn> := if(<varn> = nil,<defn>,<varn>)]


function ExTeclado()
local Test := Space(20), UltCartaoLido := "", GetList := {}

SetKey( 255, {|| UltCartaoLido := LerCartao() } )

KEYB chr(255) //colocado para testar chamada

WHIL !LastKey() = 27
    @ 10, 10 say "Esperando passar cartao" Get Test
    READ
ENDDO

RETU .T.

FUNCTION LerCartao()
LOCAL sStrCartao := ""

WHIL NextKey() > 0
    sStrCartao += Inkey()
ENDDO

Alert( "Passou Cartao: " + sStrCartao )   //retirar este Alert apos teste

RETU sStrCartao
/*
CCD Serial:
Recomendo você usar em precesso separado, um novo EXE no mesmo micro que tenha o leitor de CCD, não deu para testar meu CCD queimou, mas qualquer duvida e so postar ou mandar para deboni@ibest.com.br

EXEMPLO SEM BGEvents:
*/

Código: Selecionar todos

Function ExSerial( nPorta, nIrq, nIo, nBufferIn, nBufferOut, lTrapMode, nBaud, sPar, nBit, nStop )
LOCAL UltCartaoLido := "", nWait := 500

//nWait - Muito Alto demora a ler CodBarra, Muito Baixo (trava ou deixa lenta) a maquina

DEFA nPorta TO 1
DEFA nIrq TO 4
DEFA nIo TO "03F8"
DEFA nBufferIn TO 1000
DEFA nBufferOut TO 1000
DEFA lTrapMode TO .T.
DEFA nBaud TO 9600
DEFA sPar TO "N"
DEFA nBit TO 8
DEFA nStop TO 1

IF !AbreCom( nPorta, nIrq, nIo, nBufferIn, nBufferOut, lTrapMode, nBaud, sPar, nBit, nStop )
    nPortaSerial := 0
    RETU .F.
ENDIF

nPortaSerial := nPorta

WHILE .T.
    UltCartaoLido := LeSerial()
    IF !Empty(UltCartaoLido)
        //salva em DBF ou TXT
    ENDIF
    IF LastKey() = 27
        IF Alert("Sair", {"Nao", "Sim"} ) = 2 //procure trocar esta funcao por uma que se passar nSegundos sem pressionar qualquer tecla volta a fazer o monitoramento
            RETU .T.
        ENDIF
    ENDIF
    millisec( nWait )
ENDDO

RETU .T.

Function LeSerial()
LOCAL CodBarra := "", TimeOut := 0, Cod := "", Cod1 := ""

IF !Com_Count( nPortaSerial ) > 0
    RETU ""
ENDIF

TimeOut := Seconds() + 2

WHILE .T.
    IF Com_Count( nPortaSerial ) > 0
        Cod := com_read( nPortaSerial, 1)
        Cod1 := Asc(Cod)
        IF Cod1 = 13 //ENTER ENCONTRADO FIM DE CODBARRA, configure o CCD para sinalizar FIM com Chr(13)
            Com_Flush( nPortaSerial ) //limpa porta caso tenha algum lixo
            EXIT
        ENDIF
        CodBarra += Cod
    ELSEIF Seconds() > TimeOut
        //TIMEOUT na porta COM" + cStr(CCDPortaCom), 79)
        Com_Flush( nPortaSerial )
        CodBarra := ""
        EXIT
    ENDIF
    MILLISEC(5)
ENDDO

RETU CodBarra

//Generica pode ser usada independente, abre COM com tratamento de erro
function AbreCom( nPorta, nIrq, nIo, nBufferIn, nBufferOut, lTrapMode, nBaud, sPar, nBit, nStop )

DEFA nPorta TO 1
DEFA nIrq TO 4
DEFA nIo TO "03F8"
DEFA nBufferIn TO 1000
DEFA nBufferOut TO 1000
DEFA lTrapMode TO .T.
DEFA nBaud TO 9600
DEFA sPar TO "N"
DEFA nBit TO 8
DEFA nStop TO 1

//definir antes de abrir a porta
IF !com_setirq( nPorta, nIrq ) //util para multserial como NETMOS que so funciona se definir IRQ/IO
    ALERT( "NAO FOI POSSIVEL ALTERAR IRQ - " + LTrim(Str( nIrq )) + " - PORTA COM" + LTrim(Str( nPorta)) )
    RETU .F.
ENDIF

//definir antes de abrir a porta
IF !com_setio( nPorta, nIo )
    ALERT( "NAO FOI POSSIVEL ALTERAR ENDERECO I/O - " + LTrim(Str(nIo)) + " - PORTA COM" + LTrim(Str( nPorta) ))
    RETU .F.
ENDIF

/*
nBufferIn=buffer de entrada - padrao=100 byte
nBufferOut=buffer de saida - padrao=quantidade sendo enviada
lTrapMode=Interompe tramissao em caso de erro
*/
IF !Com_Open( nPorta, nBufferIn, nBufferOut, lTrapMode )
    ALERT( "NAO FOI POSSIVEL ABRIR A PORTA COM" + LTrim(Str( nPorta )) )
    RETURN .F.
ENDIF

//controle por SOFT ou HARD de dados, de preferencia a SOFT
com_soft( nPorta, .T. )
//com_hard( nPorta, .T. )

/*
Inicializa porta com valores, que difere de acordo com periferico conectado
nPorta= 300, 600, 1200, 2400, 4800, 9600, 19200 - padrao=300
nBaud = (E)ven, (O)dd, (M)ark, (S)pace, (N)one - padao=N
nBit=8, 7 - padrao=8
nStop=1, 2 - padrao=1
*/
IF !com_init( nPorta, nBaud, sPar, nBit, nStop )
    com_close( nPorta )
    ALERT( "NAO FOI POSSIVEL INICIALIZAR A PORTA COM" + lTrim(Str( nPorta )) ;
        + "," + LTrim(Str(nBaud)) ;
        + "," + Upper(sPar) ;
        + "," + LTrim(Str(nBit)) ;
        + " " + LTrim(Str(nStop)))
    RETURN .f.
ENDIF

COM_FLUSH( nPorta ) //limpa porta

RETURN .T.
/*
EXEMPLO com BGEvents:

EXBGEvents - inicializa monitor desativado
AtivaCCD - Ativa e Desativa leitura CCD
LeCCD - funcao que contera o processamento
*/

Código: Selecionar todos

#INCLUDE "bgevents.ch"

Function ExBGEvent( nPorta, nIrq, nIo, nBufferIn, nBufferOut, lTrapMode, nBaud, sPar, nBit, nStop )
LOCAL UltCartaoLido := "", nWait := 500

//nWait - Muito Alto demora a ler CodBarra, Muito Baixo (trava ou deixa lenta) a maquina

DEFA nPorta TO 1
DEFA nIrq TO 4
DEFA nIo TO "03F8"
DEFA nBufferIn TO 1000
DEFA nBufferOut TO 1000
DEFA lTrapMode TO .T.
DEFA nBaud TO 9600
DEFA sPar TO "N"
DEFA nBit TO 8
DEFA nStop TO 1

IF !AbreCom( nPorta, nIrq, nIo, nBufferIn, nBufferOut, lTrapMode, nBaud, sPar, nBit, nStop )
    nPortaSerial := 0
    RETU .F.
ENDIF

nPortaSerial := nPorta

AtivaCCD( .f. )

RETU .T.

Function LeCCD()
LOCAL sCodBarra := ""

sCodBarra := LeSerial()
IF !Empty(sCodBarra)
    //incluir aqui salvar CODBARRA
ENDIF

RETU .T.

FUNC AtivaEventoCCD()

STATIC lAtivado := .f.

IF lAtivado
    RETU .t.
ENDIF

lAtivado := .t.

//nao retire, desativa monitoramento quanto esta debugando
IF IsDebug()
    background events debug off
    SetReEntrant(.F.)
ELSE
    SetReEntrant(.T.)
ENDIF

BACKGROUND EVENTS AUTOACTIVATE
BACKGROUND EVENTS EXECUTE ALL

Define backgroundevent Action LeCCD() interval .5 name ccd

RETU .T.

Function AtivaCCD( lSet )

DEFA lSet TO .T.

AtivaEventoCCD()

IF lSet
    BGE_Start()
ELSE
    BGE_Stop()
ENDIF

RETU .T.
Maligno, achei como colocar no modo codigo, valeu...
Editado pela última vez por dbsh em 01 Ago 2007 21:06, em um total de 2 vezes.
Responder