Veja como resolvi usando o Harbour + HbWin.
Sabemos que os códigos de um supermercado iniciados com o número "2" geralmente é um produto que deve ser pesado, então:
Código: Selecionar todos
If substr(vPdv02,1,1) = "2" //Verificar se o código digitado/scaneado começa com "2"
If eq->( dbseek(substr(vPdv02,1,5)) )
If len(alltrim(vPdv02)) = 13 //Caso comece com 2 e tenha 13 caracteres não precisa de pegar o peso, já vem na etiqueta!
bValor := val(substr(vPdv02,7,6))/100
vPdv02 := alltrim(str(val(substr(vPdv02,1,5)),5)) //Codigo
oPdv02 : Refresh() //Usando Hwgui atualiza na tela com o peso
Else
bValor := PegaPeso()
vPdv02 := alltrim(str(val(substr(vPdv02,1,5)),5))
oPdv02 : Refresh() //Usando Hwgui atualiza na tela com o peso
lPegouPeso := .t.
EndIf
If Empty(bValor)
MsgStop('Sem Peso.')
return .f.
EndIf
Else
If MsgYesNo('Produto não cadastrado. Deseja procurar ?')
PesquisaPDV(20,10,520,400,'eq',{||vPdv02},"vPdv02","oPdv02",,,"Mercadoria","Cod_Mercad","Avista",,03)
EndIf
return .f.
EndIf
Else
....
*****************
Function PegaPeso
*****************
*
*
Local oDlg, cTitle := 'Lendo o peso da balança...'
LOCAL cString := Chr( 5 )
LOCAL nResult, nPeso
Do While .t.
oWinPort := win_Com():Init( "com1:", WIN_CBR_2400, WIN_NOPARITY, 8, WIN_ONESTOPBIT )
IF ! oWinPort:Open()
MsgStop("Erro lendo peso: " + oWinPort:ErrorText() )
return 0
Else
IF !oWinPort:SetDTR( .T. )
MsgInfo ( "SetDTR( .T. ) Falha:"+ oWinPort:ErrorText() )
ENDIF
IF ( nResult := oWinPort:Write( cString ) ) <> Len( cString ) //Mando o chr(5)
msginfo( "Falha na escrita: "+ str(nResult) + " expected " + str(Len(cString)) )
ENDIF
EndIf
oWinPort:Read( @xString,7)
nPeso := val(substr(xString,2,5))/1000
IF !oWinPort:Purge( .T., .T. )
msginfo( "Falha no comando Purge() :" + oWinPort:ErrorText())
ENDIF
oWinPort:Close()
If empty(nPeso)
MsgStop('Coloque um peso na balança !')
Else
exit
EndIf
EndDo
Return nPeso
Já testado no XP e no Win7.
Não esquecer do #include "hbwin.ch"
Saudações,
Itamar M. Lins Jr.

