Página 1 de 4

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 08:58
por deividdjs
Bom dia Prezados ..

Gostaria de relatar um problema no qual estou enfrentando depois que atualizei meu sistema de xHarbour para o Harbour 3.2...

Quando entro na tela de pedidos q é um TBROWSER e pressiono a tecla "A" para Alterar .. meu sistema gera um DBF temporario e abre um novo TBROWSER com os itens do pedido .. se simplesmente eu pressionar <ESC> o ponteiro fica corretamente no resgistro em q estava antes de entrar alterando o pedido ... agora se eu se movimentar para baixo dentro dos itens alterados .. e pressionar <ESC> para retornar a tela anterior de pedidos ele move de lugar o ponteiro ... na versão xHarbour não ocorria isso ..

Resumindo .. a mesma quantidade de movimentos que faço pra baixo dentro dos itens é a quantidade de movimentos que o cursor sobre dentro da tela de pedidos .. alguém ja passou por isso ??

Abraço!

CODIGO TELA DE PEDIDOS ...

Código: Selecionar todos


cAlias := "PED"
nOrdem := "PEDCX_02"

db_PED :=  WIN(03,01,22,78, "* * PUNTO DE VENTA * *", WT_AZUL2BRANCO, WD_AZUL2BRANCO)

DB_PEDIDO_VENDA( aCab, aCamp, aPict, cAlias, nOrdem, Regra)
return nil

*---------------------------------------------------------------------*
 function DB_PEDIDO_VENDA( aCab, aCamp, aPict, cAlias, nOrdem, Regra )
*---------------------------------------------------------------------*
local oTAB, oCol, nKey, nRow, nCol, cTela, cArea
local OLDREC, OBROWSE, OCOLUNA, PESQUISA

select( cAlias )
set order to nOrdem
__KEYBOARD(CHR(30)) //(K_CTRL_PGDN)

setcursor(0)
cArea := savescreen( 00, 00, 24, 79 )

X:=aCamp[2]
oTab           := TBrowseDB( 05, 02, 21, 77 ) // GERA UM TBROWSE
oTab:colsep    := CHR(179)
oTab:headsep   := CHR(194)+CHR(196)
oTab:footsep   := CHR(193)+CHR(196)
//						  1  ,  2  ,  3  , 4  ,  5  ,  6  ,  7  ,  8  , 9  , 10 ,  11  , 12 , 13  , 14  , 15  ,  16  , 17  , 18  , 19
oTab:ColorSpec := "N/W*,W+/B+,R+/W*,W+/N,GR+/N,W+/B+,B+/W*,R+/W*,R+/B,G/W*,GR+/R+,W+/G,R+/N+,N*/GR,W+/R+,GR+/B+,GR+/G,GR+/N,GR+/R"
																													 // LETRA + COR DA LINHA
for i = 1 TO len( aCamp )
   if valtype(aCamp[I]) == "B"
       oCol:=TBcolumnNew( aCab[I], ( aCamp[I] ) )
       oCol:Picture:=aPict[I]
   else                                                                                      
      oCol:=TBcolumnNew( aCab[I], FIELDWBLOCK( aCamp[I], SELECT()))                          
      oCol:Picture:=aPict[I]                                                                 
   endif                                                                                     
																                    
   oCol:ColorBlock:={|X| IIF(cc_marcfat = 'C',{15,5},IIF(cc_Mfact = 'û',{13,5},IIF(cc_marcfat = ' ' .and. cc_tipoven # 'D' .and. cc_tipoven # 'T' .and. cc_tipoven # 'O';
   .and. cc_tipoven # 'C' ,{1,5}, IIF(cc_tipoven = 'D' .or. cc_tipoven = 'T',{3,5}, IIF(cc_tipoven = 'O' .or. cc_tipoven = 'C',{10,5},{7,2})))))}
                                                                                 
	oTab:addColumn( oCol )                                                          
next                                                                             
                                                                                 
nCol_Reg := (oTab:nRight-oTab:nLeft+2) / LEN(aCamp) // Para iluminar o TBrowser      // [V] VAREJO             
                                                                                     // [A] ATACADO            
oTab:Freeze := 2 // Definindo Coluna fixa                                            // [O] PRESUPUESTO VAREJO                        
oTab:ColPos := 1                                                                     // [C] PRESUPUESTO VAREJO                        
                                                                                     // [D] DEVLUCION VAREJO                          
do while .T.                                                                         // [T] DEVLUCION ATACADO                         
                                                                                     // [R] REQUISICION                               
    DO WHILE !oTab:Stabilize()                                                       // [S] SERVICIOS                                 
    ENDDO
                                                                                //  LETRA BR + TARJA PT  // LETRA AM + FUNDO PT 
    IF cc_marcfat = ' ' // EM ABERTOS                                                //    W+/N         //  GR+/N 
       oTab:colorRect({oTab:RowPos,1,oTab:RowPos,oTab:ColCount},{4,18}) // linha colorida (BR/PT) , cursor (AM/PT)
	 elseif cc_marcfat = 'û'
       oTab:colorRect({oTab:RowPos,1,oTab:RowPos,oTab:ColCount},{6,16})  
    elseif cc_marcfat = 'C'
       oTab:colorRect({oTab:RowPos,1,oTab:RowPos,oTab:ColCount},{11,19})
	 endif 
	 IF cc_tipoven = 'O' .or. cc_tipoven = 'C'  // OR€AMENTOS
	    oTab:colorRect({oTab:RowPos,1,oTab:RowPos,oTab:ColCount},{12,17}) 
	 ENDIF
	 IF cc_tipoven = 'D' .or. cc_tipoven = 'T'  // DEVOLUیES
	    oTab:colorRect({oTab:RowPos,1,oTab:RowPos,oTab:ColCount},{15,19}) 
	 ENDIF   
    IF cc_Mfact = 'û'
	     oTab:colorRect({oTab:RowPos,1,oTab:RowPos,oTab:ColCount},{13,5})
    ENDIF   

	 oTab:hilite()
	 nKey := Inkey(0)

    setpos( nRow, nCol )
      
    if PED_ret = .T.
       keyboard chr(73)
    endif

     do case

         case lastkey() = 27 // K_ESC
              rstenv(PRINC)
              rstenv(DB_PED)
              set key 274 to
              select(n_Arqant)
              DESAT_TAB()
              MOSTRA_USU()
              exit
 
...... 

        otherwise
     endcase

   setcursor(0)
   oTab:Refreshcurrent()  // Refresca a Tela ou Atualiza os Dados

   if nKey == K_F1
   elseif nKey == K_F2
   elseif nKey == K_F3
   elseif nKey == K_F4
   elseif nKey == K_F5
   elseif nKey == K_F6
   elseif nKey == K_F7
   elseif nKey == K_UP         ; oTab:UP()
   elseif nKey == K_DOWN       ; oTab:DOWN()
   elseif nKey == K_LEFT       ; oTab:LEFT()
   elseif nKey == K_CTRL_LEFT  ; oTab:PANLEFT()
   elseif nKey == K_RIGHT      ; oTab:RIGHT()
   elseif nKey == K_CTRL_RIGHT ; oTab:PANRIGHT()
   elseif nKey == K_PGUP       ; oTab:PAGEUP()
   elseif nKey == K_CTRL_PGUP  ; oTab:GOTOP()
   elseif nKey == K_PGDN       ; oTab:PAGEDOWN()
   elseif nKey == K_CTRL_PGDN  ; oTab:GOBOTTOM()
   elseif nKey == K_HOME       ; oTab:HOME()
   elseif nKey == K_CTRL_HOME  ; oTab:PANHOME()
   elseif nKey == K_END        ; oTab:END()
   elseif nKey == K_CTRL_END   ; oTab:PANEND()
   endif

enddo
return

CODIGO ALTERAÇÃO PEDIDO

Código: Selecionar todos


cAlias := "TMP" // ABRE ARQUIVO TEMPORARIO
nOrdem := " "

ATU_VALOR()

DB_ALTERA_PEDVEN( aCab, aCamp, aPict, cAlias, nOrdem, Regra)
return nil

*----------------------------------------------------------------------*
 function DB_ALTERA_PEDVEN( aCab, aCamp, aPict, cAlias, nOrdem, Regra )
*----------------------------------------------------------------------*
local oTAB, oCol, nKey, nRow, nCol, cTela, cArea
local OLDREC, OBROWSE, OCOLUNA, PESQUISA
LOCAL GETLIST := {}, sav_ord,  Tela_PedVen

select( cAlias )
set order to nOrdem
go top

setcursor(0)
cArea := savescreen( 00, 00, 24, 79 )

X:=aCamp[2]
oTab := TBrowseDB( 09, 01, 20, 78 ) // GERA UM TBROWSE

if (PAR->cc_vendlin) = "N"
   oTab:colsep := " "
   oTab:headsep   := CHR(196)
   oTab:footsep   := CHR(196)
else
   oTab:colsep    := CHR(179)  
   oTab:headsep   := CHR(194)+CHR(196)
   oTab:footsep   := CHR(193)+CHR(196)
endif

oTab:ColorSpec := "N/W,W+/B+,R+/W,R+/N+,GR+/N"

for i = 1 TO len( aCamp )
   if valtype(aCamp[I]) == "B"
       oCol:=TBcolumnNew( aCab[I], ( aCamp[I] ) )
       oCol:Picture:=aPict[I]
   else
      oCol:=TBcolumnNew( aCab[I], FIELDWBLOCK( aCamp[I], SELECT()))
      oCol:Picture:=aPict[I]
   endif
   If Regra # Nil
       oCol:ColorBlock:={|X| If(&(Regra),{3,4},{1,2})}
   EndIf
   oTab:addColumn( oCol )
next

nCol_Reg := (oTab:nRight-oTab:nLeft+2) / LEN(aCamp) // Para iluminar o TBrowser

oTab:Freeze := 2 // Definindo Coluna fixa
oTab:ColPos := 1

do while .T.
   
    oTab:colorRect({oTab:RowPos,1,oTab:RowPos,oTab:ColCount},{})

    DO WHILE !oTab:Stabilize()
    ENDDO

    IF ITEM_SEM_ESTOQUE_PED() == 'N' .and. cc_marcfat = ' ' .and. CC_UND # 'SER'
       oTab:colorRect({oTab:RowPos,1,oTab:RowPos,oTab:ColCount},{4,5})
    else
       oTab:colorRect({oTab:RowPos,1,oTab:RowPos,oTab:ColCount},{2,5})
    endif      
    oTab:hilite()
      
      setpos( nRow, nCol )
      nKey := inkey()

      if oTAB:stable
         if oTAB:hittop
            oTAB:HITTOP := .F.       // INICIO DO ARQUIVO
        elseif oTAB:hitbottom
            oTAB:HITBOTTOM := .F.   // FIM DO ARQUIVO
      endif

        setpos( nRow, nCol )
        nKey := Inkey(0)
     endif

     do case

        case lastkey()=73 .or. lastkey()=105   // INCLUIR ITEM PEDIDO DEFINITIVO                                                                                                                                                                     
             
             ordsetfocus("ptmcx_15") // ordem decrescente de data + hora //  ultimo item fica no top
             
				 oTab:ColPos := 1
				 oTab:Refreshall()

				 sav_ord := indexord() && SALVA ORDEM
				 Tela_PedVen    := SavEnv(10,01,20,78)                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                             
                if PED->cc_marcfat = "û"                                                                                                                                                                                                                                                                                                                                 
                   MSGBOX1("Para Incluir, cancele o faturamento do pedido antes!")                                                                                                                                                                                                                                                                                  
                   select TMP                                                                                                                                                                                                                                                                                                                                       
                   keyboard chr(27)
                endif                                                                                                                                                                                                                                                                                                                                               
                                                                                                                                                                                                                                                                                                                                                                 
                if PED->cc_marcfat = "C"                                                                                                                                                                                                                                                                                                                                 
                   MSGBOX1("Este pedido est  cancelado, imposs¡vel alterar!")                                                                                                                                                                                                                                                                                       
                   select TMP
                   keyboard chr(27)                                                                                                                                                                                                                                                                                                                                
                endif                                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                 
             n_itempar := LOJ->cn_qtditem                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                                 
             select TMP                                                                                                                                                                                                                                                                                                                                          
             sav_ord := indexord() && SALVA ORDEM
         
      ...................
                                
         
         otherwise                                                                                                                                                                                               
      
   endcase
         
   setcursor(0)
   oTab:Refreshcurrent()  // Refresca a Tela ou Atualiza os Dados
         
   if nKey == K_F1
   elseif nKey == K_F2
   elseif nKey == K_F3
   elseif nKey == K_F4
   elseif nKey == K_F5
   elseif nKey == K_F6
   elseif nKey == K_F7
   elseif nKey == K_UP         ; oTab:UP()
   elseif nKey == K_DOWN       ; oTab:DOWN()
   elseif nKey == K_LEFT       ; oTab:LEFT()
   elseif nKey == K_CTRL_LEFT  ; oTab:PANLEFT()
   elseif nKey == K_RIGHT      ; oTab:RIGHT()
   elseif nKey == K_CTRL_RIGHT ; oTab:PANRIGHT()
   elseif nKey == K_PGUP       ; oTab:PAGEUP()
   elseif nKey == K_CTRL_PGUP  ; oTab:GOTOP()
   elseif nKey == K_PGDN       ; oTab:PAGEDOWN()
   elseif nKey == K_CTRL_PGDN  ; oTab:GOBOTTOM()
   elseif nKey == K_HOME       ; oTab:HOME()
   elseif nKey == K_CTRL_HOME  ; oTab:PANHOME()
   elseif nKey == K_END        ; oTab:END()
   elseif nKey == K_CTRL_END   ; oTab:PANEND()
   endif 

enddo    
return


POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 09:50
por Itamar M. Lins Jr.
Olá!
Está misturando as arrays ?
Coloca como local x:=acamp[2]
Alguma coisa nesse sentido.
Não olhei a fundo.

Saudações,
Itamar M. Lins Jr.

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 10:04
por deividdjs
Porque quando eu compilo com xharbour ele funciona bem e não apresenta esse problema ??

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 12:58
por JoséQuintas
deividdjs escreveu:Porque quando eu compilo com xharbour ele funciona bem e não apresenta esse problema ??
Acho que o registro acompanha a movimentação do browse.
Acho que sempre foi assim no Clipper, e continua assim no Harbour.
Pra tirar a dúvida, é testar no Clipper.
Se for diferente, é pedir pra corrigir no harbour.

Não se trata do que é certo ou errado, mas de manter compatibilidade.
Com base nisso: quem vai de Clipper pra xharbour pode ter problemas, mas quem vai pra harbour não.
Quem teve problemas, ajustou pra xharbour, e agora tem que ajustar de volta, porque virou problema de novo, trabalho em dobro.

A partir disso, sempre vai ter alguém pedindo pra ficar igual Clipper ou igual xHarbour, e não dá pra fazer os dois ao mesmo tempo.
A compatibilidade com Clipper está sempre em primeiro lugar, porque sempre vai ter alguém migrando de Clipper.

E pode ter mais coisas diferentes, fazer o que.....

A prova teste é: testar no Clipper
Se estiver igual ao Clipper, não há o que fazer, precisa ajustar a rotina.
Se estiver diferente, aí eles corrigem.

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 14:29
por deividdjs
JoséQuintas escreveu:
deividdjs escreveu:Porque quando eu compilo com xharbour ele funciona bem e não apresenta esse problema ??
Acho que o registro acompanha a movimentação do browse.
Acho que sempre foi assim no Clipper, e continua assim no Harbour.
Pra tirar a dúvida, é testar no Clipper.
Se for diferente, é pedir pra corrigir no harbour.

Não se trata do que é certo ou errado, mas de manter compatibilidade.
Com base nisso: quem vai de Clipper pra xharbour pode ter problemas, mas quem vai pra harbour não.
Quem teve problemas, ajustou pra xharbour, e agora tem que ajustar de volta, porque virou problema de novo, trabalho em dobro.

A partir disso, sempre vai ter alguém pedindo pra ficar igual Clipper ou igual xHarbour, e não dá pra fazer os dois ao mesmo tempo.
A compatibilidade com Clipper está sempre em primeiro lugar, porque sempre vai ter alguém migrando de Clipper.

E pode ter mais coisas diferentes, fazer o que.....

A prova teste é: testar no Clipper
Se estiver igual ao Clipper, não há o que fazer, precisa ajustar a rotina.
Se estiver diferente, aí eles corrigem.
Oi Zé .. acho q vc não entendeu o problema .. registro acompanha a movimentação do browse está correto!! ... o q acontece é q quando estou com a base de pedidos aberta (PED.DBF) em um browse ... e entro alterando o pedido, que abre outra base de dados (TMP.DBF) teoricamente e independente de eu movimentar-me dentro da browser de itens do pedido que está dentro do TMP.DBF .. e retornar pra tela anterior (PED.DBF) o ponteiro deveria estar no mesmo local até porque não movimentei ele com nenhum comando... entende ?? isso q acontece .... se altero e me movimento dentros dos itens do pedido para baixo ... quando voltou para a tela de pedidos .. o ponteiro se movimenta 3 pedidos acima ... ele sai da posição atual ... e isso nunca passou em clipper e nem em xbarbour .. porque voltei e compilei com xharbour e funciona perfeitamente ... só em harbour 3.2 ... é muito raro!

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 18:04
por JoséQuintas
Levei em conta a pergunta e o título do tópico, fonte grande é problema ficar conferindo, quando é parcial piorou, e tudo indica que já conferiu as possibilidades.

Na parte mostrada parece não haver nada que mude posição de pedido.
O problema pode estar na parte não mostrada.

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 18:48
por JoséQuintas
Em fonte grande, fica chato.
pra que um do while tão grandão, obrigando a paginar fonte
logica.png
Se poderia ficar tudo numa página só, e ter visão total.
logica2.png
Pois é....

E o que será que essas funções no final fazem ?
Não se sabe, talvez desposicionem pedido, talvez não.

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 19:46
por Itamar M. Lins Jr.
Olá!
Lembrando que sua assinatura usa o xHarbour antigo... No novo pode está igual ao Harbour.

Saudações,
Itamar M. Lins Jr.

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 19:58
por deividdjs
Tentei mudar a assinatura .. porém não grava a nova assinatura .. trava quando vou gravar...

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 20:02
por deividdjs
JoséQuintas escreveu:Em fonte grande, fica chato.
pra que um do while tão grandão, obrigando a paginar fonte
logica.png
Se poderia ficar tudo numa página só, e ter visão total.
logica2.png
Pois é....

E o que será que essas funções no final fazem ?
Não se sabe, talvez desposicionem pedido, talvez não.
Sim Zé.. eu mandei quase tudo pq vasculhei de todo quanto foi lado ... e não consigo encontrar essa falha .. pensei q poderia ser no arquivo inkey.ch ... mas tbm não é ...

Q doideira !!! Quebrando a cabeça aqui faz dias ...

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 20:20
por JoséQuintas
deividdjs escreveu:Tentei mudar a assinatura .. porém não grava a nova assinatura .. trava quando vou gravar...
O Clipper Clipper tempos atrás descobriu como: é desativar smiles que permite alterar.


Sobre o resto, veja se usa SET RELATION por exemplo, isso movimentaria os pedidos mesmo mexendo em outra área.

Ao que parece usa console:
Outra opção e usar o debug, NÃO LEMBRO SE NO HARBOUR FUNCIONA, mas tem uma opção pra entrar no debug conforme determinada situação.
Por exemplo:
Dê uma olhada no RecNo() do pedido, pelo debug, e defina no debug pra parar quando o RecNo() for diferente desse valor.
A partir daí, é teclar F5, e ele vai te mostrar exatamente quando o registro fica desposicionado.

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 06 Mar 2024 20:27
por JoséQuintas
trace.png
Essa opção aí.
Coloque algo como pedido->( RecNo() ) <> 10
Ou pedido->Numero <> numero

Quando acontecer isso, o programa pára e entra no debug automaticamente, mostrando a posição exata onde isso aconteceu.

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 07 Mar 2024 09:24
por deividdjs
JoséQuintas escreveu:
deividdjs escreveu:Tentei mudar a assinatura .. porém não grava a nova assinatura .. trava quando vou gravar...
O Clipper Clipper tempos atrás descobriu como: é desativar smiles que permite alterar.


Sobre o resto, veja se usa SET RELATION por exemplo, isso movimentaria os pedidos mesmo mexendo em outra área.

Ao que parece usa console:
Outra opção e usar o debug, NÃO LEMBRO SE NO HARBOUR FUNCIONA, mas tem uma opção pra entrar no debug conforme determinada situação.
Por exemplo:
Dê uma olhada no RecNo() do pedido, pelo debug, e defina no debug pra parar quando o RecNo() for diferente desse valor.
A partir daí, é teclar F5, e ele vai te mostrar exatamente quando o registro fica desposicionado.
Opa Zé .. tbm achei q poderia ser o set relation ... elimiei e continou o problema ...

a relação é o seguinte .. eu eu navegar dentro do browser de itens dentro do pedido (TMP.DBF) ele muda a posição a area anterior q é o PED.DBF ... seu eu usar a seta pra baixo uma vez .. ele sobre uma posição no pedido .. se eu der duas setas pra baixo .. ele sobe na posição atual no pedido 2 posições tbm entendeu ? e eu voltar no topo dos itens e voltar para os pedidos .. está fica certo ... doideira!! pior q desde q converti para harbour 3.2 não mudei nada na rotina .. então é alguma coisa q o harbour 3.2 trata diferente .. sei la!!

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 07 Mar 2024 09:27
por deividdjs
JoséQuintas escreveu:
trace.png
Essa opção aí.
Coloque algo como pedido->( RecNo() ) <> 10
Ou pedido->Numero <> numero

Quando acontecer isso, o programa pára e entra no debug automaticamente, mostrando a posição exata onde isso aconteceu.
EU nunca usei o DEBUG .. não faço ideia de como funciona isso .. sempre dubuguei no braço hehehe .. mais vou pesquisar aqui e ver como funciona certinho e fazer o teste ..

Abraço amigo !

POSIÇÃO DO REGISTRO AO RETORNAR PRA TELA ANTERIOR TBROWSER

Enviado: 07 Mar 2024 10:35
por JoséQuintas
deividdjs escreveu:U nunca usei o DEBUG .. não faço ideia de como funciona isso .. sempre dubuguei no braço hehehe .. mais vou pesquisar aqui e ver como funciona certinho e fazer o teste ..
Basicamente é compilar com -b.
Durante o uso do aplicativo, tecle Alt-D, e vai entrar nessa tela.
Por aí consegue ver variáveis, DBFs abertos, e outras coisas.

É como uma IDE de linguagem de programação, vai estar vendo seu fonte, conforme a linha que está sendo executada.

Principais/mais usados:

Alt-D entra no modo debug
Alt_O, path, pra definir o path dos fontes, pode ser mais de um, isso é quando o EXE está em pasta diferente dos fontes
F-8 executa uma linha do aplicativo por vez
Alt-F4 pra dar uma olhada na tela do aplicativo, senão só vê o fonte
F-5 executa de uma vez - pode teclar Alt-D depois, por exemplo nesse browse, ou outro lugar
Alt-X fecha tudo, até aplicativo, aonde estiver
tab ou click pra mover entre as janelas

No fonte, pode marcar uma ou mais linhas de parada usando F9.
Tipo nessa parte do pedido quando o usuário tecla ENTER.
Assim, manda executar o aplicativo e só pára aí onde interessa, não precisa linha a linha até chegar aí.
Isto é interessante quando tem um processo, e só interessa ver quando aquele processo terminou pra frente.

break proint, que é definir qual a situação aonde quer que o programa pare.
Disse que muda a posição do pedido: então vai olhar o número do pedido, e coloque no break proint pedido <> numero
Teclar F5, e assim que o número for diferente do indicado, que é seu problema, vai entrar no debug.
Vai estar parado na linha do fonte seguinte à que causou o problema

Nas opções, tem opção de mostrar todas as variáveis, ou locais, ou private
Numa janela você pode colocar expressão pra consulta, tipo ? alias(), ? variável, etc. pra consulta instantânea

Watch point, é pra ficar acompanhando alguma variável, por exemplo recno() de pedido ou número de pedido.
Vai teclando F8, vai executando uma linha por vez, e olhando os valores que aparecem de uma ou mais variáveis

E por aí vai, só olhar as opções do menu, e testar cada uma pra ver o que acontece.