Página 1 de 1

Ajuda com rotina

Enviado: 28 Fev 2012 17:49
por Softwhouse
Tenho uma rotina de um browse que funcionava perfeitamente no xHarbour 0.99.70 e simplesmente deixou de funcionar nas versões posteriores. Se alguém puder ajudar dando uma olhada agradeço pois já fiz diversas alterações e não conseguí fazer funcionar. O demo está prontinho, é só compilar e testar. A idéia é ir acrescentando campos no browse, quando chegar na última coluna, teclando ENTER é adicionado um novo registro, mas parece que o xHarbour não está reconhecendo a variável Hitbottom e não acrescenta o novo registro. Os campos estão validados para não ficarem em branco. Abaixo o código que depois de acertado poderá ir para área de downloads e ajudar muitos. Grato.

Código: Selecionar todos


Function Main()
#include 'inkey.ch'

If !File('BRWTMP.DBF')
   aStructure:={}
   AADD(aStructure,{'NUMERO'    ,'C',   05, 0})
   AADD(aStructure,{'ITEM'      ,'C',   03, 0})
   AADD(aStructure,{'UNID'      ,'C',   02, 0})
   AADD(aStructure,{'QTD'       ,'N',   08, 2})
   AADD(aStructure,{'DESCRICAO' ,'C',   20, 0})
   AADD(aStructure,{'VALOR'     ,'N',   08, 2})
   AADD(aStructure,{'TOTITEM'   ,'N',   09, 2})
   DbCreate('BrwTmp.dbf',aStructure)
EndIf

Scroll()

Tabela(06,01,19,78)
Return(.T.)

STATIC FUNCTION Tabela(nT,nL,nB,nR,lRet)
Local GetList:={}
Local aCampos:={}
Local oTab
Local i
Local nKey
Local nRow,nCol

Use BrwTmp.DBF New

AADD(aCampos,{'Item'     ,{||BrwTmp->Item}})
AADD(aCampos,{'Unid'     ,{||BrwTmp->Unid}})
AADD(aCampos,{'Descri‡Æo',{||SubStr(BrwTmp->Descricao,1,58)}})
AADD(aCampos,{'Quant'    ,{||BrwTmp->Qtd}})
AADD(aCampos,{'Unit rio' ,{||BrwTmp->Valor}})
AADD(aCampos,{'Total'    ,{||BrwTmp->TotItem}})

@ nT,nL To nB,nR
oTab:=TbrowseDb(nT+1,nL+1,nB-1,nR-1)
For i = 1 To Len(aCampos)
    oTab: AddColumn(TbColumnNew(aCampos[i,1],aCampos[i,2]))
Next

oTab:HeadSep:=Chr(196)+Chr(194)+Chr(196)      
oTab:ColSep :=Chr(032)+Chr(179)+Chr(032)          
oTab:FootSep:=Chr(196)+Chr(193)+Chr(196)      
   
Do While .T.

   If LastRec()==0
      DbAppend()
   EndIf

   Do While !oTab:Stabilize()
   EndDo

   If oTab:hitbottom() .And. nKey=K_ENTER
      If Empty(Item) .Or. Empty(Unid) .Or. Empty(Descricao) .Or.;
         Empty(Qtd)  .Or. Empty(Valor)
         otab:Left()
         oTab:PanLeft()
      Else
         DbAppend()
         oTab:GoBottom()
         oTab:RefreshAll()
         nKey:=Inkey()
      EndIf
   Else
      nKey:=Inkey(0)
   EndIf
 
   If nKey==K_ENTER
      If oTab:ColPos==oTab:ColCount
         oTab:Down()
         oTab:PanHome()
      Else
         oTab:Right()
      EndIf

   ElseIf nKey == K_DOWN
      oTab:Down()
   ElseIf nKey == K_UP
      oTab:Up()
   ElseIf nKey == K_PGDN
      oTab:PageDown()
      oTab:RefreshAll()
   ElseIf nKey == K_PGUP
      oTab:PageUp()
      oTab:RefreshAll()
   ElseIf nKey==K_CTRL_PGUP
      oTab:GoTop()
   ElseIf nKey == K_CTRL_PGDN
      oTab:GoBottom()
   ElseIf nKey == K_RIGHT
      oTab:Right()
   ElseIf nKey == K_LEFT
      oTab:Left()
   ElseIf nKey == K_HOME
      oTab:Home()
   ElseIf nKey == K_END
      oTab:End()
   ElseIf nKey==K_CTRL_LEFT
      oTab:PanLeft()
   ElseIf nKey==K_CTRL_RIGHT
      oTab:PanRight()
   ElseIf nKey==K_CTRL_HOME
      oTab:PanHome()
   ElseIf nKey==K_CTRL_END
      oTab:PanEnd()
   ElseIf nKey==K_ESC
      Exit
   ElseIf nKey > 31 .And. nKey < 256
      If oTab:ColPos==oTab:ColCount
         KeyBoard Chr(K_DOWN)
         KeyBoard Chr(K_ENTER)
      Else
         KeyBoard Chr(K_ENTER)
         KeyBoard Chr(nKey)
         GetEdit(oTab)
         oTab:Right()
      EndIf
   ElseIf nKey==-3 .Or. nKey==K_DEL
      If Alert('Confirma a exclusÆo deste item ?',{'Sim','NÆo'})==1
         DbDelete()
         Pack
         oTab:RefreshAll()
      EndIf
   EndIf
EndDo
Return(NIL)


STATIC FUNCTION GetEdit(oTab)
Local GetList:={}
Local nColPos:=oTab:ColPos
Local nRowPos:=oTab:RowPos
If nColPos==1
   @ Row(),Col() Get Item Picture '99!X' Valid !Empty(Item)
ElseIf nColPos==2
   @ Row(),Col() Get Unid Picture '@!' Valid !Empty(Unid) 
ElseIf nColPos==3
   @ Row(),Col() Get Descricao Picture '@!' Valid !Empty(Descricao)
ElseIf nColPos==4
   @ Row(),Col() Get Qtd Picture '99999.99'    Valid Totaliza(Qtd,Valor,oTab)
ElseIf nColPos==5
   @ Row(),Col() Get Valor Picture '999999.99' Valid Totaliza(Qtd,Valor,oTab)
EndIf
Read
oTab:RefreshCurrent()
ReadExit(.T.)
Return(NIL)


STATIC Function Totaliza(Qtd,Valor,oTab)
Local nRowPos:=oTab:RowPos
Local nColPos:=oTab:ColPos
Local nRecno :=Recno()
mTotal :=0
If Qtd <> NIL .And. Valor <> NIL
   Eval({||BrwTmp->TotItem:=Qtd*Valor})
EndIf
DbEval({||mTotal:=mTotal+TotItem},,,,,,.F.)
DbGoTo(nRecno)
SetPos(nRowPos,nColPos)
Return(.T.)




Ajuda com rotina

Enviado: 29 Fev 2012 10:08
por Itamar M. Lins Jr.
Ola!
Compilei seu exemplo no Harbour SVN ChangeLog 17299 2012-02-29 08:59:21Z

Depois que teclei o <ENTER> na ultima coluna ele mudou para a linha de baixo, sem a necessidade de teclar <DOWN>.

Saudações,
Itamar M. Lins Jr.