Ajuda com rotina
Enviado: 28 Fev 2012 17:49
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.)