Página 3 de 4

Enviado: 27 Jul 2007 19:09
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.

Enviado: 27 Jul 2007 19:12
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......

Enviado: 27 Jul 2007 19:15
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.

Enviado: 27 Jul 2007 19:36
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...

Enviado: 27 Jul 2007 19:42
por Maligno
Semana que vem eu vou lá e vejo. Depois te digo.

Enviado: 27 Jul 2007 19:50
por sygecom
Blz......Agradeço Antecipadamente !!!

Enviado: 27 Jul 2007 19:54
por Maligno
Dinada.
Aliás, acho que vou ver isso amanhã. Dependo de uma ligação do cliente. Mas depois volto ao assunto.

ola amigos.

Enviado: 30 Jul 2007 10:02
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

Enviado: 30 Jul 2007 10:32
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.

Enviado: 30 Jul 2007 10:34
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.

a sim..

Enviado: 30 Jul 2007 14:49
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

Enviado: 30 Jul 2007 14:55
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.

sim a técnica do afunilamento saquei.

Enviado: 30 Jul 2007 15:37
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

Enviado: 30 Jul 2007 15:52
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ê. :(

Enviado: 01 Ago 2007 00:34
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...