unrecoverable error 9015 hb_vmdo()

Re: unrecoverable error 9015 hb_vmdo()

Postby karinha » Sun Oct 10, 2021 9:37 pm

É fácil, veja:

Code: Select all  Expand view

   // ESTA EM: IMAGENS2.RES
   REDEFINE BITMAP oBtnProposta ID 120 RESOURCE "PROP212" TRANSPARENT OF oDlg ADJUST

   oBtnProposta:cToolTip := OemToAnsi( "Inclua ou Modifique uma Proposta" )

   // oIncluir := TButton():ReDefine( 301, {||( GETPROPOSTA( .T., oLbx ), oLbx:GoTop(), oLbx:Refresh(), oLbx:DrawSelect() )}, oDlg,,, .F.,,,, .F. )
   REDEFINE BUTTONBMP oIncluir ID 301  OF oDlg RESOURCE "NUEVOBK" TEXTRIGHT  ;
   ACTION ( GETPROPOSTA( .T., oLbx ), oLbx:GoBottom(), oLbx:Refresh(),       ;
                                      oLbx:GoTop() )

   oIncluir:cTooltip := { "Click no Botão Para Incluir",                      ;
                          "Incluir Uma Nova Proposta  ", 1, CLR_WHITE, CLR_CYAN }

   REDEFINE BUTTONBMP oAlterar ID 302  OF oDlg WHEN( lImpProposta )          ;
      RESOURCE "150" TEXTRIGHT ACTION ( GETPROPOSTA( .F., oLbx ),            ;
                          oLbx:SetFocus(), oLbx:Refresh(), oLbx:DrawSelect() )

   oAlterar:cTooltip := { "Click no Botão Para Alterar",                      ;
                          "Alterar Dados da Proposta  ", 1, CLR_WHITE, CLR_CYAN }

   REDEFINE BUTTONBMP oExcluir ID 303  OF oDlg WHEN( lImpProposta )          ;
      RESOURCE "142" TEXTRIGHT ACTION ( EXCLUIR_PROPOSTA( oLbx ),            ;
                          oLbx:SetFocus(), oLbx:Refresh(), oLbx:DrawSelect() )

   oExcluir:cTooltip := { "Click no Botão Para Excluir",                      ;
                          "Excluir Dados da Proposta  ", 1, CLR_WHITE, CLR_CYAN }

   REDEFINE BUTTONBMP oImprimir ID 304  OF oDlg WHEN( lImpProposta )         ;
      RESOURCE "160" TEXTRIGHT ACTION ( GETPROPOSTA( .F., oLbx ),            ;
                          oLbx:SetFocus(), oLbx:Refresh(), oLbx:DrawSelect() )

   oImprimir:cTooltip := { "Click no Botão Para Imprimir",                    ;
                           "Imprimir Dados da Proposta  ", 1, CLR_WHITE, CLR_CYAN }

   REDEFINE BUTTONBMP oDuplicar ID 305  OF oDlg WHEN( lImpProposta )         ;
      RESOURCE "152" TEXTRIGHT ACTION ( DUP_PROPOSTA( .F., oLbx ),           ;
                               oLbx:GoBottom(), oLbx:Refresh(), oLbx:GoTop() )

   oDuplicar:cTooltip := { "Click no Botão Para Duplicar",                   ;
                           "Duplicar Uma das Propostas. ", 1, CLR_WHITE, CLR_CYAN }

   REDEFINE BUTTONBMP oSaida ID 306 OF oDlg RESOURCE "154" TEXTRIGHT         ;
      ACTION ( lLigaBtnPropo := .T., oPropo:Enable(), oPropo:Refresh(),      ;
               lAbrePropo := .F., lFechaJan := .T., oWndBrow:End(), oDlg:End() ) CANCEL

   oSaida:cTooltip := { "Click no Botão Para Sair",                          ;
                        "Saida - Exit - Cancelar ", 1, CLR_WHITE, CLR_CYAN }

   REDEFINE BUTTONBMP oBtnTroca ID 307 OF oDlg RESOURCE "156" TEXTRIGHT      ;
      ACTION ( TROCAR_CODIGO_SERVICO( cAlias ), oLbx:Refresh(), oLbx:SetFocus() )

   oBtnTroca:cTooltip := { "Trocar Código do Serviço da Proposta.",          ;
                           "Trocar Código do Serviço da Proposta.", 1, CLR_WHITE, CLR_CYAN }

   /*
   SET FONT OF oIncluir  TO oFont
   SET FONT OF oAlterar  TO oFont
   SET FONT OF oExcluir  TO oFont
   SET FONT OF oImprimir TO oFont
   SET FONT OF oDuplicar TO oFont
   SET FONT OF oSaida    TO oFont
   */

   // MESMA COISA.
   oIncluir:SetFont( oFont )
   oAlterar:SetFont( oFont )
   oExcluir:SetFont( oFont )
   oImprimir:SetFont( oFont )
   oDuplicar:SetFont( oFont )
   oSaida:SetFont( oFont )
   oBtnTroca:SetFont( oFont )

   // oDlg:bStart:= {|| SKIN( oDlg, "blue_skin" ) } - Ficou lento.

   ACTIVATE DIALOG oDlg...
 


Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: unrecoverable error 9015 hb_vmdo()

Postby Antonio Linares » Mon Oct 11, 2021 5:01 am

Build your app using Harbour and your error should get solved :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42099
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: unrecoverable error 9015 hb_vmdo()

Postby Edman » Mon Oct 11, 2021 11:53 pm

obrigado Karinha.

vou trocar.
Edman
 
Posts: 20
Joined: Wed Oct 06, 2021 8:19 pm

Re: unrecoverable error 9015 hb_vmdo()

Postby Edman » Tue Oct 12, 2021 8:35 pm

o tsbutton que utilizo é exatamente o recomendado por vc.

Coisas estranhas acontecem... Consigo compilar meus prgs utilizando o TsButton e o Buttonbmp, porem não consigo compilar com o Button do FWH ???????
com o TSButton acontece aquele erro aleatório 9015 Hb_vmdo() com o ButtonBmp roda liso e com o Button nem compila.

Estou a mais de um mês estudando o que poderia ser...
Será alguma limitação quanto tamanho do prg ou quantidade de buttons ou algo a ver com os rcs (resources)???? ou alguma outra limitação de vezes que eu possa fazer alguma coisa???

O Linares, pelo jeito desistiu e me recomendou tentar o Harbour. Mas teria tantos ajustes a fazer que meu cliente fatalmente me dispensaria.
Edman
 
Posts: 20
Joined: Wed Oct 06, 2021 8:19 pm

Re: unrecoverable error 9015 hb_vmdo()

Postby Edman » Tue Oct 12, 2021 9:26 pm

Obrigado!
vou preparar e já te envio.
Edman
 
Posts: 20
Joined: Wed Oct 06, 2021 8:19 pm

Re: unrecoverable error 9015 hb_vmdo()

Postby Edman » Wed Oct 13, 2021 3:25 pm

ola Karinha!
Boa Tarde

Não sei se tem alguma relação com o erro 9015
mas ao trocar SBUTTON por BUTTON a coisa fica maluca...

Segue o prg (em vermelho no final e o erro.log (em azul) onde ocorre ao incluir um obj BUTTON "a mais".

Se ficar só "um" BUTTON o programa roda normalmente.

1 - O erro apresentado ao se incluir mais um obj button:

Application
===========
Path and name: I:\CUSMOL\CUSMOL.EXE (32 bits)
Size: 1,243,648 bytes
Time from start: 0 hours 1 mins 51 secs
Error occurred at: 13/10/2021, 11:33:35
Error description: Warning BASE/1005 Message not found: TBUTTON:_LHELPICON

Stack Calls
===========
Called from: source\rtl\tobject.prg => TBUTTON:ERROR(172)
Called from: source\rtl\tobject.prg => TBUTTON:MSGNOTFOUND(205)
Called from: source\rtl\tobject.prg => TBUTTON:_LHELPICON(0)
Called from: I:\CUSMOL\CADPLAN.PRG => CADPLAN(428)
Called from: I:\CUSMOL\A.PRG => (b)FPRINCIPAL(308)
Called from: ..\SOURCE\CLASSES\TSBUTTON.PRG => TSBUTTON:CLICK(852)
Called from: d:\fwh\source\classes\control.prg => TCONTROL:HANDLEEVENT(1447)
Called from: ..\SOURCE\CLASSES\TSBUTTON.PRG => TSBUTTON:HANDLEEVENT(1296)
Called from: d:\fwh\source\classes\window.prg => _FWH(3394)
Called from: => WINRUN(0)
Called from: d:\fwh\source\classes\window.prg => TWINDOW:ACTIVATE(978)
Called from: I:\CUSMOL\A.PRG => FPRINCIPAL(378)
Called from: I:\CUSMOL\A.PRG => MAIN(194)

System
======
CPU type: Pentium(R) Dual-Core CPU E5300 @ 2.60GHz 2600 Mhz
Hardware memory: 2048 megs

Free System resources: 90 %
GDI resources: 90 %
User resources: 90 %

Compiler version: xHarbour build 1.2.1 Intl. (SimpLex) (Rev. 6714)
Windows version: 6.2, Build 9200

Windows total applications running: 35
1 MSCTFIME UI
2 Default IME
3 Medidor de Bateria
4 Network Flyout
5 Window
6 Sistema de Custos v.21.07 - Molpark Ind.e Com. Molas e Aramados
7 I:\ - Altap Salamander 4.0 (x64)
8 CALCULADORA DE SENHAS DO CHEQUETOTAL
9 Multi-Edit - [I:\CUSMOL\A.PRG]
10 Gerenciador de Ajuda
11 Preview de Impressão
12 Page Setup
13 HintInfoWindow
14 Ir para
15 Lista de Funções
16 String Editor
17 Editor
18 Localizar em Arquivo(s)
19 Confirmar Substituição
20 xDev Studio v0.72 - [file:///I:/XDEVSTUDIOBLACK/HOME/INDEX.HTML (Leitura)]
21 GDI+ Window (XDEVSTUDIO.EXE)
22 I:\CUSMOL\Error.log - Viewer
23 DDE Server Window
24 Monitor de Recursos
25 100% concluído(s)
26 GDI+ Window (Explorer.EXE)
27 SecurityHealthSystray
28 MS_WebcheckMonitor
29 BluetoothNotificationAreaIconWindowClass
30 Windows Push Notifications Platform
31 Task Host Window
32 DWM Notification Window
33 Microsoft Text Input Application
34 Configurações
35 Program Manager

Variables in use
================
Procedure Type Value
==========================
TBUTTON:ERROR
Param 1: C "Message not found"
Param 2: C "TBUTTON"
Param 3: C "_LHELPICON"
Param 4: N 1005
Local 1: U
Local 2: O Class: TBUTTON
Local 3: N 16
TBUTTON:MSGNOTFOUND
Param 1: C "_LHELPICON"
Param 2: O Class: TBUTTON
TBUTTON:_LHELPICON
Param 1: L .F.
CADPLAN
Local 1: U
Local 2: U
Local 3: O Class: TBRUSH
Local 4: U
Local 5: U
Local 6: L .F.
Local 7: N 1
Local 8: C ""
Local 9: C "- Utilize a roda do mouse para selecionar o registro desejado ou clique nos botões de movimentação acima e a esquerda!


- Digite os primeiros caracteres do dado desejado para seleciona-lo automáticamente (obedecendo a ordenação atual).

- Clique com o botão da esquerda do mouse sobre a lista e sem solta-lo arraste-o para ver paginas seguintes e anteriores.

- Clique com o botão da direita na área dos "CABEÇALHOS" para incluir/excluir colunas apresentadas.

Efeitos de Teclas nesta tela: ("teclas de atalho")
-------------------------------------------------------------------------------------------------------------------------------------
F2 - Informa os parâmetros de filtragem. (se houverem).

Del ou Alt+E - Exclui a planilha atualmente marcada pela barra luminosa.
Ins ou Alt+I - Inclui uma nova planilha.
Alt+R - Revisa a planilha atualmente marcada pela barra luminosa.
Alt+X - Gera planilhas Excel em diversos formatos.
Enter ou Alt+V ou Duplo Clique sobre a linha - Visualiza a planilha atualmente marcada pela barra luminosa.
Alt+F - Filtra a lista de planilhas.
Ctrl+seta dir. - Vai para o fim da linha atualmente selecionada.
Ctrl+seta esq. - Vai para o início da linha atualmente selecionada.

Busca de dados por digitação ("Busca Incremental"): Posiciona o cursor no item desejado apenas digitando as letras ou nºs iniciais do dado procurado.
-------------------------------------------------------------------------------------------------------------------------------------
Pressione a tecla "Ctrl" junto com a tecla da letra "L" para preparar para uma nova busca por digitação .
Primeiro selecione a "ORDEM DE APRESENTAÇÃO" dos dados da lista.
Depois basta digitar as primeiras letras ou digitos do dado procurado.

Obs.: Se a ordem for a de "NÚMEROS DE PLANILHA" digite a seguinte sequencia:
Primeiro digite os dois algarismos do ANO desejado depois, os QUATRO NÚMEROS da planilha.

Obs.: Se a ordem for a de "SITUAÇÃO DA PLANILHA" digite A para Aprovadas, C para Cancelada, G para Aguardando Aprovação,
O para Outras, R para Reprovada, T para Cotando Mat.Prima e V para Analisando Viabilidade, -.

Se for informado que o dado procurado não existe: A função pesquisadora ficará pronta para outra pesquisa.
Para cancelar a pesquisa enquanto estava digitando: pressione a tecla Ctrl junto com a tecla L."
(b)FPRINCIPAL
Param 1: O Class: TSBUTTON
TSBUTTON:CLICK
Local 1: O Class: TSBUTTON
TCONTROL:HANDLEEVENT
Param 1: N 2048
Param 2: N 0
Param 3: N 0
Local 1: O Class: TSBUTTON
Local 2: U
TSBUTTON:HANDLEEVENT
Param 1: N 2048
Param 2: N 0
Param 3: N 0
Local 1: O Class: TSBUTTON
_FWH
Param 1: N 0
Param 2: N 2048
Param 3: N 0
Param 4: N 0
Param 5: N 3
Local 1: O Class: TSBUTTON
WINRUN
Param 1: N 1443428
TWINDOW:ACTIVATE
Param 1: C "NORMAL"
Param 2: U
Param 3: B {|| ... }
Param 4: U
Param 5: U
Param 6: U
Param 7: B {|| ... }
Param 8: B {|| ... }
Param 9: U
Param 10: U
Param 11: U
Param 12: U
Param 13: U
Param 14: U
Param 15: U
Param 16: U
Param 17: B {|| ... }
Param 18: U
Param 19: U
Local 1: O Class: TWINDOW
Local 2: U
Local 3: U
FPRINCIPAL
Local 1: U
Local 2: U
Local 3: U
Local 4: U
Local 5: N 310
Local 6: N 32
Local 7: N 132
Local 8: N 52
Local 9: N 42
Local 10: N 226
Local 11: N 800
Local 12: N 600
Local 13: N 295.50
Local 14: N 237.50
Local 15: U
Local 16: O Class: TBRUSH
Local 17: O Class: TSBUTTON
Local 18: O Class: TSBUTTON
Local 19: O Class: TSBUTTON
Local 20: L .T.
Local 21: U
MAIN

Linked RDDs
===========
DBF
DBFFPT
DBFBLOB
DBFCDX
DBFNTX

DataBases in use
================

1: LOGADOS RddName: DBFCDX
==============================
RecNo RecCount BOF EOF
1 3 .F. .F.

Indexes in use TagName
=> nomelog LOGADOS

Relations in use

2: => PLANILHA RddName: DBFCDX
==============================
RecNo RecCount BOF EOF
159 158 .F. .T.

Indexes in use TagName
descend (subs(nridplan,5,2)+ subs(nNRIDPLAN
upper(DOCORCAM) DOCORCAM
upper(CLIENTE) CLIENTE
(cliente+desenho+desmestre+item) PCLDSDMI
(cliente+desmestre+desenho+item) PCLDMDSI
(desenho+desmestre+item) PLDSDMIT
(desmestre+desenho+item) PLDMDSIT
dtanalise PLDTANAL
DESCEND (subs(nridplan,5,2)+subs(nrPLIDPLAI
=> subs(nridplan,5,2)+subs(nridplan,1,PLIDPLAN
situacao+descend(dtos(dtanalise)) PLSITUAC

Relations in use

Classes in use:
===============
1 ERROR
2 HASHENTRY
3 HBCLASS
4 HBOBJECT
5 TWINDOW
6 TDIALOG
7 TBRUSH
8 TFONT
9 TCURSOR
10 TCONTROL
11 TSAY
12 TRADMENU
13 TRADIO
14 TGET
15 GET
16 TCLIPGET
17 TBUTTON
18 TMETER
19 TREG32
20 TGROUP
21 TICON
22 TSKINBUTTON
23 TMENU
24 TMENUITEM
25 TMSGBAR
26 TRECT
27 TMSGITEM
28 TTIMER
29 TSBUTTON
30 TCOMBOBOX
31 TXBROWSE
32 TXBRWCOLUMN

Memory Analysis
===============
226 Static variables

Dynamic memory consume:
Actual Value: 0 bytes
Highest Value: 0 bytes[/color]

Code: Select all  Expand view

[b]2 - PRG ONDE OCORRE O ERRO[/b]

[color=#BF0000]****************************************************
* CADPLAN.PRG - CADASTRO DAS PLANILHAS DE CUSTOS   *
* CHAMADA DE A.PRG                                 *
****************************************************
#include "fivewin.ch"
#include "xbrowse.ch"
#include "vkey.ch"
#include "inkey.ch"
#include "dbinfo.ch"
#include "Dbstruct.ch"

************
func cadplan
************
local ob
local nrecno
local obrush
local ocursorp
local nordem
local ldbfnaovazio := .f.
local areaberta    := select()
local cstate       := ''
local vobsemovs    :=  '- Utilize a roda do mouse para selecionar o registro desejado ou clique nos botões de movimentação acima e a esquerda!'+CRLF+CRLF+;
                       '- Digite os primeiros caracteres do dado desejado para seleciona-lo automáticamente (obedecendo a ordenação atual).'+CRLF+CRLF+;
                       '- Clique com o botão da esquerda do mouse sobre a lista e sem solta-lo arraste-o para ver paginas seguintes e anteriores.'+CRLF+CRLF+;
                       '- Clique com o botão da direita na área dos "CABEÇALHOS" para incluir/excluir colunas apresentadas.'+CRLF+CRLF+;
                       'Efeitos de Teclas nesta tela: ("teclas de atalho")'+CRLF+;
                       '-------------------------------------------------------------------------------------------------------------------------------------'+CRLF+;
                       'F2 - Informa os parâmetros de filtragem. (se houverem).'+CRLF+CRLF+;
                       'Del ou Alt+E - Exclui a planilha atualmente marcada pela barra luminosa.'+CRLF+;
                       'Ins ou Alt+I - Inclui uma nova planilha. '+CRLF+;
                       'Alt+R - Revisa a planilha atualmente marcada pela barra luminosa.'+CRLF+;
                       'Alt+X - Gera planilhas Excel em diversos formatos.'+CRLF+;
                       'Enter ou Alt+V ou Duplo Clique sobre a linha - Visualiza a planilha atualmente marcada pela barra luminosa.'+CRLF+;
                       'Alt+F - Filtra a lista de planilhas.'+CRLF+;
                       'Ctrl+seta dir. - Vai para o fim da linha atualmente selecionada.'+CRLF+;
                       'Ctrl+seta esq. - Vai para o início da linha atualmente selecionada.'+CRLF+CRLF+;
                       'Busca de dados por digitação ("Busca Incremental"): Posiciona o cursor no item desejado apenas digitando as letras ou nºs iniciais do dado procurado.'+CRLF+;
                       '-------------------------------------------------------------------------------------------------------------------------------------'+CRLF+;
                       'Pressione a tecla "Ctrl" junto com a tecla da letra "L" para preparar para uma nova busca por digitação .'+CRLF+;
                       'Primeiro selecione a "ORDEM DE APRESENTAÇÃO" dos dados da lista. '+CRLF+;
                       'Depois basta digitar as primeiras letras ou digitos do dado procurado.'+CRLF+CRLF+;
                       'Obs.: Se a ordem for a de "NÚMEROS DE PLANILHA" digite a seguinte sequencia:'+CRLF+;
                       'Primeiro digite os dois algarismos do ANO desejado depois, os QUATRO NÚMEROS da planilha.'+CRLF+CRLF+;
                       'Obs.: Se a ordem for a de "SITUAÇÃO DA PLANILHA" digite A para Aprovadas, C para Cancelada, G para Aguardando Aprovação,'+CRLF+;
                       'O para Outras, R para Reprovada, T para Cotando Mat.Prima e V para Analisando Viabilidade, -.'+CRLF+CRLF+;
                       'Se for informado que o dado procurado não existe: A função pesquisadora ficará pronta para outra pesquisa.'+CRLF+;
                       'Para cancelar a pesquisa enquanto estava digitando: pressione a tecla Ctrl junto com a tecla L.'

priva obtcancelap, obtmostrap, obtprintp
priva nttinic     := 0
priva ntt         := nttfiltr := 0
priva i           := 0
priva obtanterior,obtprimeiro,obtseguinte,obtultimo
priva obtinclui    // inclui
priva obtexclui    // exclui
priva obtrevisa    // revisa
priva obtfiltra    // filtra
priva obtcancfi    // cancela filtro
priva obtprocura   // procura
priva obtrepproc   // repete ultima procura
priva odlgplan     // esta variavel tem que ser private
priva olstbplan
priva v_escolha   := ' nº planilha - da +nova para +antiga '
priva n_escolha
priva ocombordem
priva ostemfilt
priva ostipselemb  // 5713     // este objeto deve ficar nesta rotina

priva obtinfs      // 1140
priva vdatavalid
priva nrpos := 0
priva nx

procutoque  := ''
vtipoforesc := 0
vtiposecesc := 0

USE planilha;
    INDE pcldsdmi,pcldmdsi,pldsdmit,pldmdsit,pldtanal,plidplai,plidplan,plsituac;
    ALIAS planilha ;
    NEW ;
    SHARED
planilha->( dbsetorder('plidplan') )
planilha->( orddescend( ,, .t. ) )
ldecend := .t.

   // pcldsdmi,pcldmdsi,pldsdmit,pldmdsit,pldtanal,plidplai,plidplan,plsituac ;
   // planilha->( orddescend( ,, .t. ) )  se antes era .f. seta para .t. mas retorna como estava antes
   // ORDKEY(),                            = 'subs(nridpla,5,2)+subs(nridpla,1,4)+subs(nridpla,7,2)'
   // indexkey(0)                          = 'subs(nridpla,5,2)+subs(nridpla,1,4)+subs(nridpla,7,2)'
   // 'ORDNUMBER()',ORDNUMBER()            =  7
   // indexord()                           =  7
   // planilha->( dbsetorder('plidplan') ) =  seta indice para PLIDPLAN
   // OrdSetFocus('plidplan')              =  seta indice para PLIDPLAN
   // planilha->( dbsetorder(7)          ) =  seta indice para PLIDPLAN
   // DBORDERINFO(5)                       =  PLIDPLAN   (o indice atual)


planilha->( dbgotop() )

if file('statbrw.sys')  //  arquivo de registro dos tamanhos das colunas
    restore from statbrw.sys addi
   cstate   := a_cstate
   a_cstate := ''
endif


* VERIFICAR O NUMERO DE REGISTROS APARENTES
  // ntt := 0
  // count to ntt for !deleted()
  // if ntt # 0
  //    ldbfnaovazio := .t.
  // endif
  // ?ntt     OU TAMBEM COMO ABAIXO...
  nttinic := planilha->( dbeval( {|| ++ntt },{|| planilha->(!eof()) } ))


define dialog odlgplan;
       resource 'rcadplan';
       color  cor_pret,cor_cinz_;
       font ofntprinc;
       title 'CADASTRO DAS PLANILHAS DE CUSTOS'


   redefine say id 6002 color cor_pret,cor_cinz_


   // SELECÁO DOS INDEXADORES
   redefine combobox ocombordem;
            var v_escolha;
            items    {  v_escolha                              ,;
                       ' nº planilha - da +antiga para +nova ' ,;
                       ' cliente+desenho+desmestre+item      ' ,;
                       ' cliente+desmestre+desenho+item      ' ,;
                       ' desenho+desmestre+item              ' ,;
                       ' desmestre+desenho+item              ' ,;
                       ' data da analise                     ' ,;
                       ' situação e data                     ' };
            on change ( procutoque   := ''         ,;
                        nrecno:=planilha->(recno()),;
                        fselordem(ocombordem:nat)  ,;
                        planilha->(dbgotop())      ,; //planilha->(dbgoto(nrecno)) ,;
                        olstbplan:vupdateall()     ,;
                        olstbplan:refresh()        ,;
                        olstbplan:setfocus()       );
            id 6003;
            of odlgplan;
            update;
            color cor_azule,cor_azulff

            ocombordem:ocursor := ocursorp

   redefine say ostemfilt;
            prompt if( !empty(planilha->(dbfilter())),'  A RELAÇÃO ABAIXO ESTÁ FILTRADA! ','');
            id 6001;
            of odlgplan;
            color cor_vermt,cor_cinz_;
            font ofntbold;
            update
   /*
   redefine dynamic say ostemfilt ;
            prompt if( !empty(planilha->(dbfilter())),'  A RELAÇÃO ABAIXO ESTÁ FILTRADA! ','');
            id 6001;
            of odlgplan;
            color cor_vermt,cor_cinz_;
            font ofntbold;
            update;
            blinking
   */


   define brush obrush resource "paper"

   redefine xbrowse olstbplan alias planilha->( alias() ); // autosort footers fastedit
            lines cell;
            fields (subs(planilha->nridplan,1,4)+'/'+;
                    subs(planilha->nridplan,5,2)+'-'+;
                    subs(planilha->nridplan,7,2))   ,;
                    oemtoansi(planilha->cliente)    ,;
                    fmostrsit(planilha->situacao)   ,;
                    oemtoansi(planilha->desenho)    ,;
                    oemtoansi(planilha->desmestre)  ,;
                    planilha->item,;
                    trans(1000*planilha->quantpedd,'@e 999,999,999'),;
                    planilha->descricao  ,;  // oemtoansi(planilha->descricao)  ,;
                    planilha->tipomola   ,; // oemtoansi(planilha->tipomola)   ,;
                    oemtoansi(alltrim(planilha->material)),;
                    planilha->tiposecao             ,;
                    oemtoansi(planilha->forneced)   ,;
                    planilha->celula,;
                    trans(planilha->custotpla,'@e 999,999,999.99'),;
                    trans(planilha->Totvdpla ,'@e 999,999,999.99'),;
                    oemtoansi(planilha->analista)   ,;
                    oemtoansi(planilha->solicita)   ,;
                    trans(planilha->dtanalise,'99/99/9999'),;
                    trans(planilha->validade,'99')+' dias';
            id 1001;
            of odlgplan;
            on change ( olstbplan:setfocus() );
            font ofntprinc;
            update

            olstbplan:ajustify               := {.f.,.f.,.f.,.f.,.f.,.f.,.t.,.f.,.f.,.f.,.f.,.f.,.f.,.t.,.t.,.f.,.f.,.f.,.f.}
            olstbplan:nRowDividerStyle := 0 // no LINES
            olstbplan:nColDividerStyle := 4 // cinza claro
            olstbplan:nmarqueestyle          := MARQSTYLE_HIGHLROW // 4
            olstbplan:nfreeze                := 2
            olstbplan:bclrstd                := { ||{ cor_azule, if( ( olstbplan:calias )->( ordkeyno() ) %2 == 0, cor_azulf, cor_azulff ) } }
            olstbplan:nheaderlines           := 1
            olstbplan:nfooterlines           := 0
            olstbplan:ndatalines             := 1
            olstbplan:lfooter                := .f.
            olstbplan:acols[ 1]:cheader      := 'nº/ano-rev.'
            olstbplan:acols[ 1]:odatafont    := ofntbold
            olstbplan:acols[ 1]:bclrselfocus := {||{cor_amar,cor_azule}}  // olstbplan:acols[ 1]:obrush := obrush
            olstbplan:acols[ 2]:cheader      := 'CLIENTE'
            olstbplan:acols[ 2]:odatafont    := ofntprinc
            olstbplan:acols[ 3]:cheader      := 'SITUACAO'
            olstbplan:acols[ 3]:bclrselfocus := { ||{ if( (olstbplan:calias)->situacao==UPPER('A'), cor_amar,cor_azulf),cor_azule }}
            olstbplan:acols[ 3]:odatafont    := if( (olstbplan:calias)->situacao==UPPER('A'),ofntbold,ofntprinc)
            olstbplan:acols[ 4]:cheader      := 'DESENHO'
            olstbplan:acols[ 4]:odatafont    := ofntprinc
            olstbplan:acols[ 5]:cheader      := 'DES.MESTRE'
            olstbplan:acols[ 5]:odatafont    := ofntprinc
            olstbplan:acols[ 6]:cheader      := 'ITEM'
            olstbplan:acols[ 7]:cheader      := 'QUANT PEDD'
            olstbplan:acols[ 8]:cheader      := 'DESCRIÇÃO'
            olstbplan:acols[ 9]:cheader      := 'TIPO PROD'
            olstbplan:acols[10]:cheader      := 'MATERIAL'
            olstbplan:acols[11]:cheader      := 'TIPO SEÇÃO'
            olstbplan:acols[12]:cheader      := 'FORNECEDOR'
            olstbplan:acols[13]:cheader      := 'CÉLULA'
            olstbplan:acols[14]:cheader      := 'CUSTO INDUST.'
            olstbplan:acols[15]:cheader      := 'TOT.VENDA'
            olstbplan:acols[16]:cheader      := 'ANALISTA'
            olstbplan:acols[17]:cheader      := 'SOLICITA'
            olstbplan:acols[18]:cheader      := 'DT ANALISE'
            olstbplan:acols[19]:cheader      := 'VALIDADE'

            // olstbplan:bseek                  := {|carac| buscadig( carac, olstbplan ) }

            /* Era
            * registro das larguras das colunas do txbrowse
            for i := 1 to len(ar_cadplan)
               olstbplan:acols[i]:nwidth := ar_cadplan[i]
            next
            */


            * duplo clique numa linha => mostra a planilha
            olstbplan:bLDblClick := { || if( planilha->(lastrec())>0,; // mostrapl(@olstbplan,odlgplan,'cadplan'),   ),;
                                             mostrapl(@olstbplan,odlgplan,'cadplan'),   ),;
                                             olstbplan:setfocus() }

            // olstbplan:bRClicked := { || if( l_testando , owndprinc:end(), ) }

            olstbplan:bRClicked := { || if( l_testando , prtbreak(), ) }
            olstbplan:bkeydown  := {|nkey| if( nkey==27, procutoque:= '', fteclei(nkey,olstbplan)) }


   // INCLUI
   redefine button obtinclui;
            id 1010;
            of odlgplan;
            prompt '&INCLUI NOVA';
            update;
            action if( v_operad=='adm',;
                       ( if(inrevpla('inclusao',@odlgplan), ((++ntt,++nttinic),frefreshbt(''),olstbplan:refresh()) ,olstbplan:refresh() ));
                         ,olstbplan:refresh() )


/*

   // EXCLUI
   redefine button obtexclui;
            id 1020;
            prompt '&EXCLUI';
            of odlgplan;
            update;
            action if(v_operad=='adm',(if(fexcluipla(olstbplan), ((--ntt,--nttinic),frefreshbt('')), )),)


   // REVISA
   redefine button obtrevisa;
            id 1030;
            prompt '&REVISA';
            of odlgplan;

            //action if(v_operad=='adm', (if( planilha->(lastrec())>0 ,;
            //          if(inrevpla('revisao',@odlgplan),(++ntt,++nttinic,olstbplan:refresh()),), ),;
            //             olstbplan:refresh(), olstbplan:setfocus(),olstbplan:refresh()),)


   // VISUALIZA PLANILHA
   redefine button obtmostrap;
            id 1040;
            prompt '&VISUALIZA';
            of odlgplan;

            //action  mostrapl(olstbplan,odlgplan,'cadplan')

            // if( planilha->(lastrec()) > 0 , mostrapl(olstbplan,odlgplan,'cadplan'), )




   // IMPRIME PLANILHA
   redefine button obtprintp;
            id 1050;
            prompt 'Imprime Planilha' ;
            of odlgplan;

           //action prtwind() cancel

            // if(planilha->(lastrec())>0,prtwind() , )


   // PROCURA PLANILHA
   redefine button obtprocura;
            id 1070;
            of odlgplan;
            prompt '&Procura';
            action procupla(odlgplan)

   // REPETE PROCURA
   redefine sbutton obtrepproc;
            id 1071;
            update;
            of odlgplan;
            action if( repete() , olstbplan:refresh() , obtrepproc:disable ); // CONCLUIR
            tooltip 'Busca por mais ocorrencias da ultima procura';
            font ofntprinc;
            colors corbotaoazul1,corbotaoazul2;
            W97 ROUNDRECT

   // FILTRA PLANILHA
   redefine button obtfiltra;
            id 1080;
            of odlgplan;
            update;
            action ( if( frotfiltro(), ( olstbplan:keycount      ,;
                                         ostemfilt:refresh()     ,;
                                         obtfiltra:disable()     ,;
                                         obtcancfi:enable()      ,;
                                         olstbplan:vupdateall()) ,  ),;
                      olstbplan:gotop()                          ,;
                      olstbplan:refresh()                        ,;
                      olstbplan:setfocus() )


   // CANCELA FILTRO
   redefine button obtcancfi;
            id 1081;
            of odlgplan;
            update; // when !empty(planilha->( dbfilter()))
            action ( planilha->( dbsetfilter() ) ,;
                     ostemfilt:refresh()         ,;
                     obtfiltra:enable()          ,;
                     obtcancfi:disable()         ,;
                     olstbplan:vupdateall()      ,;
                     olstbplan:gotop()           ,;
                     olstbplan:refresh()         ,;
                     ntt := nttinic              ,;
                     olstbplan:setfocus() )

   // VAI PARA PRIMEIRO REGISTRO
   redefine button obtprimeiro;
            id 1100;
            of odlgplan;
            update;
            prompt 'Topo da Lista'+CRLF+'[Ctrl+Home]';
            action ( olstbplan:gotop(),frefreshbt('primeiro'),olstbplan:setfocus())

            //obtprimeiro:ocursor := ocursorp

   redefine button obtanterior;
            id 1110;
            of odlgplan;
            update;
            prompt 'Planilha Anterior'+CRLF+'[seta p/cima]';
            action ( olstbplan:goup(),frefreshbt(''),olstbplan:setfocus())


            // obtanterior:ocursor := ocursorp

   redefine button obtseguinte;
            id 1120;
            of odlgplan;
            update;
            prompt 'Planilha Seguinte'+CRLF+'[seta p/baixo]';
            action (olstbplan:godown(),frefreshbt(''),olstbplan:setfocus())

            // obtseguinte:ocursor := ocursorp

   redefine button obtultimo;
            id 1130;
            of odlgplan;
            update;
            prompt 'Final da Lista'+CRLF+'[Ctrl+End]';
            action (olstbplan:gobottom(), frefreshbt('ultimo'),olstbplan:setfocus())

            //obtultimo:ocursor := ocursorp

   redefine button obtinfs;
            id 1140;
            of odlgplan;
            action (msgalert(vobsemovs,'Ações e Movimentações:'),olstbplan:setfocus());
            cancel;
            update

            // obtinfs:ocursor := ocursorp

   redefine button obtcancelap;
            id 5000;
            of odlgplan; // tooltip 'Retorna a tela anterior'
            prompt 'RETORNA &A TELA INICIAL';
            update;
            action odlgplan:end();
            cancel

            // obtcancelap:ocursor := ocursorp

*/


    odlgplan:lhelpicon := .f.

    odlgplan:bkeydown  := {|nt|  if( nt==27, procutoque := '', fteclei(nt,olstbplan)) }

activate dialog odlgplan centered;//         on paint poenotopo(odlgplan);
         on right click if( l_testando ,(ondestou(procfile()),owndprinc:end()), );
         on init ( odlgplan:lballoon:= .t., owndprinc:hide(),;
                   olstbplan:restorestate(cstate),;
                   cfiltrotela := ''             ,;
                   ostemfilt:refresh()           ,; // obtanterior:disable(),; obtfiltra:enable()            ,; obtcancfi:disable()           ,; // if(alltrim(v_operad)#'adm',(obtinclui:disable(),; obtexclui:disable(),; obtrevisa:disable()),),;
                   olstbplan:gotop()             ,;
                   olstbplan:setfocus()          ,;
                   olstbplan:refresh()     );
         valid (cstate:=olstbplan:savestate(),.t.)

a_cstate := cstate

save to statbrw.sys all like a_cstate

// as_cadplan := asave(ar_cadplan)
// save to colunas.sys all like as_*

dbcloseall()
sele (areaberta)
owndprinc:show()
retu nil

*******************
stat func fmostrsit()
*******************
if     planilha->situacao == 'A'
   retu padr('APROVADO',22 )
elseif planilha->situacao == 'V'
   retu padr('ANALISANDO VIABILIDADE',22 )
elseif planilha->situacao == 'G'
   retu padr('AGUARDANDO APROVAÇÃO',22 )
elseif planilha->situacao == 'C'
   retu padr('CANCELADO',22 )
elseif planilha->situacao == 'T'
   retu padr('COTANDO MATÉRIA-PRIMA',22 )
elseif planilha->situacao == '0'
   retu padr('OUTRAS',22 )
elseif planilha->situacao == 'R'
   retu padr('REPROVADO',22 )
endif
retu space(22)

*********************
stat func fmostrtip()
*********************
if     planilha->tipomola == 1
   retu 'COMPRESSÃO'
elseif planilha->tipomola == 2
   retu padr('TRAÇÃO',10)
elseif planilha->tipomola == 3
   retu padr('TORÇÃO',10)
elseif planilha->tipomola == 4
   retu padr('ARTEFATO',10)
endif
retu 0


*****************************
stat func fselordem(vordsele) // seleciona a ordem de apresentaçao dos registros
*****************************
n_escolha := vordsele

if vordsele==1
   planilha->( dbsetorder( 'plidplan'))
   ldescend := planilha->( orddescend(,,.t.) )
elseif vordsele==2
   planilha->( dbsetorder( 'plidplan' ))
   ldescend := planilha->( orddescend(,,.f.) )
elseif vordsele==3
   planilha->( dbsetorder('pcldsdmi' ))
elseif vordsele==4
   planilha->( dbsetorder('pcldmdsi' ))
elseif vordsele==5
   planilha->( dbsetorder('pldsdmit' ))
elseif vordsele==6
   planilha->( dbsetorder('pldmdsit' ))
elseif vordsele==7
   planilha->( dbsetorder('pldtanal' ))
elseif vordsele==8
   planilha->( dbsetorder('plsituac' ))
endif
retu nil

****************************
stat func fexcluipla(olstbox)
****************************

   // pcldsdmi,pcldmdsi,pldsdmit,pldmdsit,pldtanal,plidplai,plidplan,plsituac ;
   // planilha->( orddescend( ,, .t. ) )   se antes era .f. seta para .t. mas retorna como estava antes
   // ORDKEY(),                            = 'subs(nridpla,5,2)+subs(nridpla,1,4)+subs(nridpla,7,2)'
   // indexkey(0)                          = 'subs(nridpla,5,2)+subs(nridpla,1,4)+subs(nridpla,7,2)'
   // ORDNUMBER()                          =  7
   // indexord()                           =  7
   // planilha->( dbsetorder('plidplan') ) =  seta indice para PLIDPLAN
   // OrdSetFocus('plidplan')              =  seta indice para PLIDPLAN
   // planilha->( dbsetorder(7)          ) =  seta indice para PLIDPLAN
   // DBORDERINFO(5)                       =  PLIDPLAN

local nreg_atual := planilha->( recno() )        // registro atual
local regdepois  := planilha->( recno() )
local ultimo_reg := planilha->( lastrec() )
local fil_atual  := planilha->( dbfilter() )     // filtro atual
local nind_atual := planilha->( indexord() )     // indice principal atual
local ldescendo  := planilha->(DbOrderInfo(DBOI_ISDESC))     // ordenaçao atual (descendente ou ascendente )
local n_revisao  := subs(planilha->nridplan,1,6) // numero da revisao atual da planilha

local l_resp     := .f.
local lretu      := .f.

planilha->( dbsetorder('plidplan') ) // seta indice para PLIDPLAN
planilha->( orddescend(,,.f.) )      // seta para numero de planilha ascendente
planilha->( dbskip() )

if planilha->( eof() )
   * COMO JÁ ESTA NO ULTIMO REGISTRO - NAO HAVERÃO REGISTROS POSTERIORES A SEREM DELETADOS - ENTÃO: VOLTA PARA O TOPO
   planilha->( dbgoto(nreg_atual) )
   planilha->( dbgobottom() )
   regdepois := planilha->( recno() )
else
   regdepois := nreg_atual
endif

planilha->( dbgoto(nreg_atual) )

* SE EXISTIR FILTRO ATIVO: CANCELA-LO (PARA QUE AS REVISOES DA PLANILHA SELECIONADA APAREÇAM)
if ! empty( fil_atual )
   planilha->( dbsetfilter())
   planilha->( dbgoto(nreg_atual))
endif

* REODENA PELA ORDEM NATURAL DE PLIDPLAN
planilha->( dbsetorder('plidplan') )
planilha->( orddescend( ,, .f. ) )
planilha->( dbgotop() )
planilha->( dbgoto(nreg_atual))

* CHECA SE É A ULTIMA REVISAO (pois só ela pode ser deletada!!!)
planilha->( dbskip() )
if subs(planilha->nridplan,1,6) == n_revisao .and.  planilha->( !eof() )
      msgalert('Só será possível excluir uma planilha a partir de sua última revisão!')
      planilha->( dbskip(-1) )
      regdepois := nreg_atual
      lretu := .f.
else // E SE FOR A ULTIMA REVISAO...
   planilha->( dbgoto( nreg_atual ) )

   l_resp := msgnoyes('A operação de  exclusão  elimina  definitivamente  o registro da' + CRLF+;
                      'planilha selecionada.                                           ' + CRLF+;
                      '                Responda a pergunta abaixo.                     ' + CRLF+;
                      '                                                                ' + CRLF+;
                      'Voce tem certeza que deseja excluir a planilha: ' +  trans(nridplan,'@r 9999/99-99'), 'Atenção!!!' )

   if l_resp

    if alltrim(v_operad)=='adm'
         if planilha->( flock()  )
            planilha->( dbdelete() )
            planilha->( dbunlock() )
            //planilha->( dbpack() )  // não é possivel packear com shared e preciso do shared para o procupla.prg
            planilha->( dbcommit() )
            lretu := .t.
         else
            msgstop( "O registro selecionado está em uso!", "Por favor, tente novamente mais tarde!" )
            regdepois := nreg_atual
            lretu := .f.
         endif
      else
         regdepois := nreg_atual
         lretu := .f.
      endif
   else
      lretu := .f.
   endif
endif

* RESTAURA FILTRO (SE EXISTIR)
if ! empty( fil_atual )
   planilha->( dbsetfilter( {|| &fil_atual}, fil_atual) )
endif

* VOLTA PARA O INDICE E A ORDEM QUE ESTAVAM SELECIONADOS
planilha->( dbsetorder(nind_atual ))
planilha->( orddescend(,,ldescendo) )
planilha->( dbgoto(regdepois) )
olstbplan:vupdateall()
olstbox:refresh()
olstbox:setfocus(.t.)
retu lretu

/*
*****************************
stat func regprod(vforma_reg)
*****************************
if vforma_reg == 'inclusao'
   appe blan
endif
planilha->nomeprod := cnomeprod
planilha->( dbcommit() )
retu .t.

******************
stat func procprod
******************
local obtproccr,obtokprcr
local ogetncr,ogetnmcr
local osayncr,osaynmcr
local odlgproccr

cnomeprod := space(35)

define dialog odlgproccr;
       resource 'rcadpro_pr';
       color cor_pret,cor_cinz_;
       font ofntprinc;
       title 'PROCURA DESCRIÇÃO';

redefine say;
         id 010;
         color cor_verm,cor_amar

redefine get ogetnmcr;
         var cnomeprod;
         id 101;
         picture '@k!'

         ogetnmcr:ctooltip := 'Informe a descrição (ou parte dela)'

redefine button obtokprcr;
         id 300;
         action if( procurprod(ogetnmcr) ,;
                  ( olstbplan:refresh(),;
                    odlgproccr:end()) ,)

redefine button obtproccr;
         id 200;
         action odlgproccr:end();
         cancel

   odlgproccr:lhelpicon := .f.

activate dialog odlgproccr center; //   on paint poenotopo();
         on right click if( l_testando ,(ondestou(procfile()),owndprinc:end()), )

olstbplan:setfocus(.t.)
retu nil
*/


*******************************
stat func procurprod(objorigem)
*******************************

local nregatual  := planilha->(recno())

if !empty(cnomeprod)

   locate for alltrim(cnomeprod) $ planilha->nomeprod

   if planilha->(found())

      if !planilha->(eof())

         obtrepproc:show()
         obtrepproc:enable()

      endif

      retu .t.

   endif

   msgalert( 'Descrição não encontrada!')

   planilha->(dbgoto(nregatual))

   retu .f.

endif
retu .f.

/*
******************
stat func repete()
******************
local nregatual  := planilha->(recno())
local areawork   := select()

sele planilha

continue

sele (areawork)

if planilha->(found())

   if !planilha->(eof())

      obtrepproc:show()
      obtrepproc:enable()

   endif

   olstbplan:refresh()
   olstbplan:setfocus(.t.)

   retu .t.

endif

msgalert('Nao foram encontradas mais ocorrencias do dado procurado')
planilha->(dbgoto(nregatual))
obtrepproc:disable()
olstbplan:setfocus(.t.)
retu .f.
*/


/*
*****************************
stat func regtamcol(ncolunas)
*****************************
local i := 0
ar_cadplan := {}
for i := 1 to ncolunas
   aadd(ar_cadplan, olstbplan:acols[i]:nwidth )
next
retu .t.
*/


**************************
stat func frefreshbt(vpos)
**************************
local nrecno := planilha->( recno() )

if empty(vpos)
   planilha->( dbskip(1) )
   if planilha->( eof() )
      vpos := 'ultimo'
      planilha->( dbgobottom() )
   else
      vpos := ''
      planilha->( dbgoto(nrecno) )
      planilha->( dbskip(-1) )
      if planilha->( bof() )
         vpos := 'primeiro'
         planilha->( dbgotop() )
      else
         vpos := ''
         planilha->( dbgoto(nrecno) )
      endif
   endif
endif

if     vpos == 'primeiro'
   obtprimeiro:disable()
   obtanterior:disable()
   obtseguinte:enable()
   obtultimo:enable()
elseif vpos == 'ultimo'
   obtprimeiro:enable()
   obtanterior:enable()
   obtseguinte:disable()
   obtultimo:disable()
else
   obtprimeiro:enable()
   obtanterior:enable()
   obtseguinte:enable()
   obtultimo:enable()
endif
retu nil

********************
stat func frotfiltro
********************
local lretu := .f.

* O FILTRO ESTÁ VAZIO ?

// SIM
if empty(  planilha->(dbfilter())   )

     // FILTROU E VERIFICOU SE EXISTEM REGISTROS QUE ATENDAM AO FILTRO?
     if filtropl(olstbplan) // SIM
        lretu := .t.
     endif

// NÃO
else

     * DESEJA LIMPAR O FILTRO ATUAL E REALIZAR OUTRA FILTRAGEM ?

     // SIM
     if flimpafilt()

           * CRIOU O FILTRO - APLICOU - E ENCONTROU REGISTROS QUE ATENDAM AO FILTRO?

          // SIM
          if filtropl(olstbplan)
             lretu := .t.

          // NÃO
          else

             * ZERA O FILTRO E FINALIZA
             cfiltrotela := ''
             planilha->( dbsetfilter() )
             planilha->( dbgotop() )
             lretu := .t.

          endif

     // NÃO
     else

       lretu := .f.

     endif

endif
retu lretu

********************
stat func flimpafilt
********************

local lretu := .f.

if empty(cfiltrotela) //  este if não é obrigatório - só o fiz para uma eventualidade do texto do filtro ficar vazio
   cfiltrotela := planilha->( dbfilter() )
endif

if simnao( 'A relação (apresentada acima) já está filtrada para:!' +CRLF+CRLF+;
            cfiltrotela +CRLF+CRLF+ 'Deseja cancelar este filtro e iniciar um outro?' )

   cfiltrotela := ''
   planilha->( dbsetfilte() )
   planilha->( dbgotop() )
   lretu := .t.

else
   lretu := .f.
endif
retu lretu

*******************************
stat func fteclei(ntecla,olstb)
*******************************
local lretu   := .f.
local vindkey
local lfield

* SE LOCALIZADOR DO MOUSE ESTIVER ATIVO ...
if ntecla == VK_CONTROL
   procutoque := ''
   retu nil
endif

* NAO TIRE O TRECHO ABAIXO DAQUI*********************************
if upper(chr(ntecla)) == upper('L') .and. GetKeyState(VK_CONTROL)
   msgwait('Busca por digitação pronta para nova pesquisa!',,1)
   procutoque := ''
   olstb:gotop()
   retu nil
endif

//MOSTRA - VISUALIZA
if ntecla == VK_RETURN .or. ntecla==13 .or. ntecla==K_ALT_V
   procutoque := ''
   obtmostrap:setfocus()
   eval(obtmostrap:baction)
   retu nil
//FILTRA
elseif ntecla == K_ALT_F
   procutoque := ''
   obtfiltra:setfocus()
   eval(obtfiltra:baction)
   retu lretu
//INCLUI
elseif (ntecla==K_INS .or. ntecla==K_ALT_I .or. ntecla==VK_INSERT) .and. v_operad#'adm'
   procutoque := ''
   retu .t.
elseif (ntecla==K_INS .or. ntecla==K_ALT_I .or. ntecla==VK_INSERT) .and. v_operad=='adm'
   procutoque := ''
   obtinclui:setfocus()
   eval(obtinclui:baction)
   retu lretu
//EXCLUI
elseif (ntecla==K_ALT_E .or. ntecla==K_DEL .or. ntecla==VK_DELETE) .and. v_operad#'adm'
   procutoque := ''
   retu .t.
elseif (ntecla==K_ALT_E .or. ntecla==K_DEL .or. ntecla==VK_DELETE) .and. v_operad=='adm'
   procutoque := ''
   obtexclui:setfocus()
   eval(obtexclui:baction)
   retu lretu
//REVISA
elseif (ntecla==K_ALT_R ) .and. v_operad#'adm'
   procutoque := ''
   retu .t.
elseif (ntecla==K_ALT_R ) .and. v_operad=='adm'
   procutoque := ''
   obtrevisa:setfocus()
   eval(obtrevisa:baction)
   retu lretu
elseif ntecla==VK_UP
   procutoque := ''
   olstb:goup()
   if olstb:bof .or. olstb:nat == 1
      olstb:gotop()
      frefreshbt('primeiro')
   endif
elseif ntecla==VK_DOWN
   procutoque := ''
   olstb:godown()
   if olstb:eof
      olstbpla:gobottom()
      frefreshbt('ultimo')
   endif
elseif ntecla== VK_HOME
   procutoque := ''
   olstb:gotop()
   frefreshbt('primeiro')
elseif ntecla== VK_END
   procutoque := ''
   olstb:gobottom()
   frefreshbt('ultimo')
elseif ntecla==VK_F2
   procutoque := ''
   msginfo( if(!empty(planilha->(dbfilter())), cfiltrotela , 'Nemhum filtro ativo!'), 'Parâmetros do Filtro:' )
   retu nil
elseif ntecla >= 96 .and. ntecla <=105 // se digitar no teclado numerico "keypad"
   * caracter "0" -> ascii = 48
   ntecla = ntecla - 48
endif

 // pcldsdmi,pcldmdsi,pldsdmit,pldmdsit,pldtanal,plidplai,plidplan,plsituac
 //     1       2        3        4        5        6        7        8
if (indexord()= 7 .or. indexord()= 6) .and. ! chr(ntecla)$'1234567890'  // PLIDPLAN
   alerta( 'Para a atual ordem de apresentação: '+ v_escolha +CRLF+CRLF+;
           'Voce deve digitar ANO + Nº DA PLANILHA + Nº DA REVISAO'+CRLF+CRLF+;
           'no formato  AANNNRR     '+CRLF+CRLF+;
           'Ou selecionar a ordem de apresentação relativa ao dados pesquisado !!!')
   procutoque:=''
   retu nil
elseif alltrim(str(indexord())) $ '12348' .and. chr(ntecla)$ '1234567890'
   alerta( 'Para a atual ordem de apresentação: '+ v_escolha +CRLF+CRLF+;
           'Voce deve digitar, sómente, CARACTERES ALFABETICOS E PONTUAÇÕES'+CRLF+CRLF+;
           'Ou selecionar a ordem de apresentação relativa ao dados pesquisado !!!')
   procutoque:=''
   retu nil

elseif indexord()=5
   alerta( 'Para a atual ordem de apresentação: '+ v_escolha+CRLF+CRLF+;
           'Não é possível fazer pesquisa incremental'+CRLF+CRLF+;
           'Utilize o botão "PROCURA" ou o botão "FILTRA" !!!')

   procutoque:=''
   retu nil
endif

if (upper(chr(ntecla)) $ ' _ABCÇDEFGHIJKLMNOPQRSTUVWXYZ1234567890/<>*"&¨@(){}[]#$%-+.,:;?' .or.;
         chr(ntecla) == "'" .and.;
   !empty(indexkey()) .and. fieldtype(fieldnum(indexkey())) $ upper('CN') )

   flocadig(upper(chr(ntecla)),@olstb)
   ntecla := nil

endif
retu nil

***********************************
stat func flocadig(toquelocal,olbx)
***********************************
local atregs
//local indextual := planilha->(indexord())   //OrdBagName()
priva ultimapos := planilha->(recno())
procutoque      := procutoque + toquelocal

msgwait(procutoque,,.5)

if ! planilha->(  dbseek(  procutoque) )
    alerta('O dado digitado nao esta cadastrado!')
    planilha->( dbgoto(ultimapos) )
    olbx:refresh()
    procutoque := ''
else
   atregs := recno()
   olbx:gotop()
   planilha->( dbgoto(atregs) )
   olbx:refresh()
endif
retu .t.
 
Edman
 
Posts: 20
Joined: Wed Oct 06, 2021 8:19 pm

Re: unrecoverable error 9015 hb_vmdo()

Postby karinha » Wed Oct 13, 2021 3:32 pm

Me chame no skype, fica mais fácil.

Se não tiver skype ainda, instale e me envie um convite.

https://www.skype.com/pt-br/get-skype/

Regards, saludos
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: unrecoverable error 9015 hb_vmdo()

Postby karinha » Wed Oct 13, 2021 3:49 pm

Vamos começar, até que você tenha um skype:

Retire(Exclua) do Módulo, tudo que você comentou com /*... */ por exmplo:


/*

// EXCLUI
redefine button obtexclui;
id 1020;
...

*/

O compilador não entende muito bem quando você faz um comentãrio tão longo, marque o BLOCO e leve para RESTO.PRG por exemplo, mas não deixe no módulo, o que você não vai USAR, entende?

Depois, vou ensiná-lo a IDENTAR seus módulos para a LEITURA ficar simples e prática e muito mais rápida.

Reagrds, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: unrecoverable error 9015 hb_vmdo()

Postby Edman » Wed Oct 13, 2021 4:22 pm

OK ...vou fazer suas sugestões....e providenciar o skype. até +


Um detalhe... a maior parte que está comentada é por causa do erro ... na verdade preciso de todos os BUTTONS que estão comentados.
Mas , como disse, ao utilizar mais de um button dá o erro acima
Edman
 
Posts: 20
Joined: Wed Oct 06, 2021 8:19 pm

Re: unrecoverable error 9015 hb_vmdo()

Postby Edman » Wed Oct 13, 2021 4:25 pm

fiz um acréscimo no post anterior .
obrigado por enquanto
Edman
 
Posts: 20
Joined: Wed Oct 06, 2021 8:19 pm

Re: unrecoverable error 9015 hb_vmdo()

Postby karinha » Wed Oct 13, 2021 4:27 pm

Veja seu módulo por outro PRISMA. Agora, vá adionando 1 por 1(step by step) o que eu retirei que estavam entre /*...*/ e vá compilando para ver se tem retorno de erros, ok?

Code: Select all  Expand view

// ***************************************************
// CADPLAN.PRG - CADASTRO DAS PLANILHAS DE CUSTOS *
// CHAMADA DE A.PRG * - MODIFICADO: 13/10/2021 - Joao.
// ***************************************************
#include "fivewin.ch"
#include "xbrowse.ch"
#include "vkey.ch"
#include "inkey.ch"
#include "dbinfo.ch"
#include "Dbstruct.ch"

FUNCTION Cadplan()

   // SOMENTE USE PRIVATE, SE FOR CHAMAR UM OBJETO EM OUTRAS FUNCTIONS
   // ABUSE DAS LOCALS.
   LOCAL obtinclui, obtexclui, obtrevisa, obtfiltra, obtcancfi
   // TROQUE TUDO FOR PRIVATE POR LOCAL SE FOR LOCAL, entende?

   LOCAL ob
   LOCAL nrecno
   LOCAL obrush
   LOCAL ocursorp
   LOCAL nordem
   LOCAL ldbfnaovazio := .F.
   LOCAL areaberta := Select()
   LOCAL cstate := ''
   LOCAL vobsemovs := '- Utilize a roda do mouse para selecionar o registro desejado ou clique nos botões de movimentação acima e a esquerda!' + CRLF + CRLF + ;
      '- Digite os primeiros caracteres do dado desejado para seleciona-lo automáticamente (obedecendo a ordenação atual).' + CRLF + CRLF + ;
      '- Clique com o botão da esquerda do mouse sobre a lista e sem solta-lo arraste-o para ver paginas seguintes e anteriores.' + CRLF + CRLF + ;
      '- Clique com o botão da direita na área dos "CABEÇALHOS" para incluir/excluir colunas apresentadas.' + CRLF + CRLF + ;
      'Efeitos de Teclas nesta tela: ("teclas de atalho")' + CRLF + ;
      '-------------------------------------------------------------------------------------------------------------------------------------' + CRLF + ;
      'F2 - Informa os parâmetros de filtragem. (se houverem).' + CRLF + CRLF + ;
      'Del ou Alt+E - Exclui a planilha atualmente marcada pela barra luminosa.' + CRLF + ;
      'Ins ou Alt+I - Inclui uma nova planilha. ' + CRLF + ;
      'Alt+R - Revisa a planilha atualmente marcada pela barra luminosa.' + CRLF + ;
      'Alt+X - Gera planilhas Excel em diversos formatos.' + CRLF + ;
      'Enter ou Alt+V ou Duplo Clique sobre a linha - Visualiza a planilha atualmente marcada pela barra luminosa.' + CRLF + ;
      'Alt+F - Filtra a lista de planilhas.' + CRLF + ;
      'Ctrl+seta dir. - Vai para o fim da linha atualmente selecionada.' + CRLF + ;
      'Ctrl+seta esq. - Vai para o início da linha atualmente selecionada.' + CRLF + CRLF + ;
      'Busca de dados por digitação ("Busca Incremental"): Posiciona o cursor no item desejado apenas digitando as letras ou nºs iniciais do dado procurado.' + CRLF + ;
      '-------------------------------------------------------------------------------------------------------------------------------------' + CRLF + ;
      'Pressione a tecla "Ctrl" junto com a tecla da letra "L" para preparar para uma nova busca por digitação .' + CRLF + ;
      'Primeiro selecione a "ORDEM DE APRESENTAÇÃO" dos dados da lista. ' + CRLF + ;
      'Depois basta digitar as primeiras letras ou digitos do dado procurado.' + CRLF + CRLF + ;
      'Obs.: Se a ordem for a de "NÚMEROS DE PLANILHA" digite a seguinte sequencia:' + CRLF + ;
      'Primeiro digite os dois algarismos do ANO desejado depois, os QUATRO NÚMEROS da planilha.' + CRLF + CRLF + ;
      'Obs.: Se a ordem for a de "SITUAÇÃO DA PLANILHA" digite A para Aprovadas, C para Cancelada, G para Aguardando Aprovação,' + CRLF + ;
      'O para Outras, R para Reprovada, T para Cotando Mat.Prima e V para Analisando Viabilidade, -.' + CRLF + CRLF + ;
      'Se for informado que o dado procurado não existe: A função pesquisadora ficará pronta para outra pesquisa.' + CRLF + ;
      'Para cancelar a pesquisa enquanto estava digitando: pressione a tecla Ctrl junto com a tecla L.'

   // SE NAO FOREM PRIVATES, MUDE PARA LOCAL, PRIVATES E PUBLIC, OCUPAM MEMORIA.
   PRIVA obtcancelap, obtmostrap, obtprintp
   PRIVA nttinic := 0
   PRIVA ntt := nttfiltr := 0
   PRIVA i := 0
   PRIVA obtanterior, obtprimeiro, obtseguinte, obtultimo

   /* // LOCAL
   PRIVA obtinclui // inclui
   PRIVA obtexclui // exclui
   PRIVA obtrevisa // revisa
   PRIVA obtfiltra // filtra
   PRIVA obtcancfi // cancela filtro
   */


   // SE NAO FOREM PRIVATES, MUDE PARA LOCAL, PRIVATES E PUBLIC, OCUPAM MEMORIA.
   PRIVA obtprocura // procura
   PRIVA obtrepproc // repete ultima procura
   PRIVA odlgplan // esta variavel tem que ser private
   PRIVA olstbplan
   PRIVA v_escolha := ' nº planilha - da +nova para +antiga '
   PRIVA n_escolha
   PRIVA ocombordem
   PRIVA ostemfilt
   PRIVA ostipselemb // 5713 // este objeto deve ficar nesta rotina
   PRIVA obtinfs // 1140
   PRIVA vdatavalid
   PRIVA nrpos := 0
   PRIVA nx
   // ABUSE DAS LOCAIS E EVITE EXCESSO DE PRIVATES E PUBLICS.

   procutoque := ''
   vtipoforesc := 0
   vtiposecesc := 0

   // .NTX? PASSE URGENTE PARA .CDX, infinitamete melhoe e mais rapido.
   USE planilha ;
      INDEX pcldsdmi, pcldmdsi, pldsdmit, pldmdsit, pldtanal, plidplai,  ;
            plidplan, plsituac ;
      ALIAS planilha NEW SHARED

   planilha->( dbSetOrder( 'plidplan' ) )
   planilha->( ordDescend( ,, .T. ) )
   ldecend := .T.

   planilha->( dbGoTop() )

   IF File( 'statbrw.sys' ) // arquivo de registro dos tamanhos das colunas
      RESTORE FROM statbrw.sys addi
      cstate := a_cstate
      a_cstate := ''
   ENDIF

   nttinic := planilha->( dbEval( {||++ntt }, {|| planilha->( !Eof() ) } ) )

   DEFINE DIALOG odlgplan resource 'rcadplan' COLOR cor_pret, cor_cinz_      ;
      title 'CADASTRO DAS PLANILHAS DE CUSTOS'

   font ofntprinc // EVITE use FONTE no LOCAL: SAY, GETS, etc.

   odlgplan:lhelpicon := .F.  // LUGAR CORRETO

   redefine SAY id 6002 COLOR cor_pret, cor_cinz_ UPDATE


   // SELECÁO DOS INDEXADORES
   redefine combobox ocombordem;
      VAR v_escolha;
      items { v_escolha, ;
      ' nº planilha - da +antiga para +nova ', ;
      ' cliente+desenho+desmestre+item ', ;
      ' cliente+desmestre+desenho+item ', ;
      ' desenho+desmestre+item ', ;
      ' desmestre+desenho+item ', ;
      ' data da analise ', ;
      ' situação e data ' };
      ON change ( procutoque := '', ;
      nrecno := planilha->( RecNo() ), ;
      fselordem( ocombordem:nat ), ;
      planilha->( dbGoTop() ), ; // planilha->(dbgoto(nrecno)) ,;
      olstbplan:vupdateall(), ;
      olstbplan:refresh(), ;
      olstbplan:setfocus() );
      id 6003;
      of odlgplan;
      update;
      COLOR cor_azule, cor_azulff

   ocombordem:ocursor := ocursorp

   redefine SAY ostemfilt;
      PROMPT if( !Empty( planilha->( dbFilter() ) ), ' A RELAÇÃO ABAIXO ESTÁ FILTRADA! ', '' );
      id 6001;
      of odlgplan;
      COLOR cor_vermt, cor_cinz_;
      font ofntbold;
      update

   define brush obrush resource "paper"

   redefine xbrowse olstbplan ALIAS planilha->( Alias() ); // autosort footers fastedit
      lines cell;
      FIELDS ( subs( planilha->nridplan, 1, 4 ) + '/' + ;
      subs( planilha->nridplan, 5, 2 ) + '-' + ;
      subs( planilha->nridplan, 7, 2 ) ), ;
      oemtoansi( planilha->cliente ), ;
      fmostrsit( planilha->situacao ), ;
      oemtoansi( planilha->desenho ), ;
      oemtoansi( planilha->desmestre ), ;
      planilha->item, ;
      trans( 1000 * planilha->quantpedd, '@e 999,999,999' ), ;
      planilha->descricao, ; // oemtoansi(planilha->descricao) ,;
      planilha->tipomola, ; // oemtoansi(planilha->tipomola) ,;
      oemtoansi( AllTrim( planilha->material ) ), ;
      planilha->tiposecao, ;
      oemtoansi( planilha->forneced ), ;
      planilha->celula, ;
      trans( planilha->custotpla, '@e 999,999,999.99' ), ;
      trans( planilha->Totvdpla, '@e 999,999,999.99' ), ;
      oemtoansi( planilha->analista ), ;
      oemtoansi( planilha->solicita ), ;
      trans( planilha->dtanalise, '99/99/9999' ), ;
      trans( planilha->validade, '99' ) + ' dias';
      id 1001;
      of odlgplan;
      ON change ( olstbplan:setfocus() );
      font ofntprinc;
      update

   olstbplan:ajustify := { .F., .F., .F., .F., .F., .F., .T., .F., .F., .F., .F., .F., .F., .T., .T., .F., .F., .F., .F. }
   olstbplan:nRowDividerStyle := 0 // no LINES
   olstbplan:nColDividerStyle := 4 // cinza claro
   olstbplan:nmarqueestyle := MARQSTYLE_HIGHLROW // 4
   olstbplan:nfreeze := 2
   olstbplan:bclrstd := {|| { cor_azule, if( ( olstbplan:calias )->( ordKeyNo() ) % 2 == 0, cor_azulf, cor_azulff ) } }
   olstbplan:nheaderlines := 1
   olstbplan:nfooterlines := 0
   olstbplan:ndatalines := 1
   olstbplan:lfooter := .F.
   olstbplan:acols[ 1 ]:cheader := 'nº/ano-rev.'
   olstbplan:acols[ 1 ]:odatafont := ofntbold
   olstbplan:acols[ 1 ]:bclrselfocus := {|| { cor_amar, cor_azule } } // olstbplan:acols[ 1]:obrush := obrush
   olstbplan:acols[ 2 ]:cheader := 'CLIENTE'
   olstbplan:acols[ 2 ]:odatafont := ofntprinc
   olstbplan:acols[ 3 ]:cheader := 'SITUACAO'
   olstbplan:acols[ 3 ]:bclrselfocus := {|| { if( ( olstbplan:calias )->situacao == Upper( 'A' ), cor_amar, cor_azulf ), cor_azule } }
   olstbplan:acols[ 3 ]:odatafont := if( ( olstbplan:calias )->situacao == Upper( 'A' ), ofntbold, ofntprinc )
   olstbplan:acols[ 4 ]:cheader := 'DESENHO'
   olstbplan:acols[ 4 ]:odatafont := ofntprinc
   olstbplan:acols[ 5 ]:cheader := 'DES.MESTRE'
   olstbplan:acols[ 5 ]:odatafont := ofntprinc
   olstbplan:acols[ 6 ]:cheader := 'ITEM'
   olstbplan:acols[ 7 ]:cheader := 'QUANT PEDD'
   olstbplan:acols[ 8 ]:cheader := 'DESCRIÇÃO'
   olstbplan:acols[ 9 ]:cheader := 'TIPO PROD'
   olstbplan:acols[ 10 ]:cheader := 'MATERIAL'
   olstbplan:acols[ 11 ]:cheader := 'TIPO SEÇÃO'
   olstbplan:acols[ 12 ]:cheader := 'FORNECEDOR'
   olstbplan:acols[ 13 ]:cheader := 'CÉLULA'
   olstbplan:acols[ 14 ]:cheader := 'CUSTO INDUST.'
   olstbplan:acols[ 15 ]:cheader := 'TOT.VENDA'
   olstbplan:acols[ 16 ]:cheader := 'ANALISTA'
   olstbplan:acols[ 17 ]:cheader := 'SOLICITA'
   olstbplan:acols[ 18 ]:cheader := 'DT ANALISE'
   olstbplan:acols[ 19 ]:cheader := 'VALIDADE'

   // olstbplan:bseek := {|carac| buscadig( carac, olstbplan ) }

   // duplo clique numa linha => mostra a planilha
   olstbplan:bLDblClick := {|| if( planilha->( LastRec() ) > 0, ; // mostrapl(@olstbplan,odlgplan,'cadplan'), ),;
      mostrapl( @olstbplan, odlgplan, 'cadplan' ), ), ;
      olstbplan:setfocus() }

   olstbplan:bRClicked := {|| if( l_testando, prtbreak(), ) }
   olstbplan:bkeydown := {| nkey | if( nkey == 27, procutoque := '', fteclei( nkey, olstbplan ) ) }

   // INCLUI - USE LOCAL, nao precisa ser PRIVATE.
   REDEFINE BUTTON obtinclui id 1010 of odlgplan ;
      PROMPT '&INCLUI NOVA' update               ;
      action if( v_operad == 'adm',              ;
      ( if( inrevpla( 'inclusao', @odlgplan ),   ;
      ( ( ++ntt, ++nttinic ), frefreshbt( '' ),  ;
      olstbplan:refresh() ), olstbplan:refresh() ) ), olstbplan:refresh() )

   // odlgplan:lhelpicon := .F.  // LUGAR ERRADO

   odlgplan:bkeydown := {| nt | if( nt == 27, procutoque := '', fteclei( nt, olstbplan ) ) }

   ACTIVATE DIALOG odlgplan centered;// on paint poenotopo(odlgplan);
      ON right click if( l_testando, ( ondestou( ProcFile() ), owndprinc:end() ), );
      ON INIT ( odlgplan:lballoon := .T., owndprinc:hide(), ;
      olstbplan:restorestate( cstate ), ;
      cfiltrotela := '', ;
      ostemfilt:refresh(), ; // obtanterior:disable(),; obtfiltra:enable() ,; obtcancfi:disable() ,; // if(alltrim(v_operad)#'adm',(obtinclui:disable(),; obtexclui:disable(),; obtrevisa:disable()),),;
      olstbplan:gotop(), ;
      olstbplan:setfocus(), ;
      olstbplan:refresh() );
      VALID ( cstate := olstbplan:savestate(), .T. )

   a_cstate := cstate

   SAVE TO statbrw.sys ALL LIKE a_cstate

   // as_cadplan := asave(ar_cadplan)
   // save to colunas.sys all like as_*

   dbCloseAll()
   SELE ( areaberta )
   owndprinc:show()

RETURN NIL

STATIC FUNCTION fmostrsit()

   IF planilha->situacao == 'A'
      RETURN PadR( 'APROVADO', 22 )
   ELSEIF planilha->situacao == 'V'
      RETURN PadR( 'ANALISANDO VIABILIDADE', 22 )
   ELSEIF planilha->situacao == 'G'
      RETURN PadR( 'AGUARDANDO APROVAÇÃO', 22 )
   ELSEIF planilha->situacao == 'C'
      RETURN PadR( 'CANCELADO', 22 )
   ELSEIF planilha->situacao == 'T'
      RETURN PadR( 'COTANDO MATÉRIA-PRIMA', 22 )
   ELSEIF planilha->situacao == '0'
      RETURN PadR( 'OUTRAS', 22 )
   ELSEIF planilha->situacao == 'R'
      RETURN PadR( 'REPROVADO', 22 )
   ENDIF

RETURN( Space( 22 ) )

STATIC FUNCTION fmostrtip()

   IF planilha->tipomola == 1
      RETU 'COMPRESSÃO'
   ELSEIF planilha->tipomola == 2
      RETU PadR( 'TRAÇÃO', 10 )
   ELSEIF planilha->tipomola == 3
      RETU PadR( 'TORÇÃO', 10 )
   ELSEIF planilha->tipomola == 4
      RETU PadR( 'ARTEFATO', 10 )
   ENDIF

RETURN NIL  // 0?

STATIC FUNCTION fselordem( vordsele ) // seleciona a ordem de apresentaçao dos registros

   n_escolha := vordsele  // LOCAL?

   IF vordsele == 1
      planilha->( dbSetOrder( 'plidplan' ) )
      ldescend := planilha->( ordDescend(,, .T. ) )
   ELSEIF vordsele == 2
      planilha->( dbSetOrder( 'plidplan' ) )
      ldescend := planilha->( ordDescend(,, .F. ) )
   ELSEIF vordsele == 3
      planilha->( dbSetOrder( 'pcldsdmi' ) )
   ELSEIF vordsele == 4
      planilha->( dbSetOrder( 'pcldmdsi' ) )
   ELSEIF vordsele == 5
      planilha->( dbSetOrder( 'pldsdmit' ) )
   ELSEIF vordsele == 6
      planilha->( dbSetOrder( 'pldmdsit' ) )
   ELSEIF vordsele == 7
      planilha->( dbSetOrder( 'pldtanal' ) )
   ELSEIF vordsele == 8
      planilha->( dbSetOrder( 'plsituac' ) )
   ENDIF

RETURN NIL

// ***************************

STATIC FUNCTION fexcluipla( olstbox )

   LOCAL nreg_atual := planilha->( RecNo() ) // registro atual
   LOCAL regdepois := planilha->( RecNo() )
   LOCAL ultimo_reg := planilha->( LastRec() )
   LOCAL fil_atual := planilha->( dbFilter() ) // filtro atual
   LOCAL nind_atual := planilha->( IndexOrd() ) // indice principal atual
   LOCAL ldescendo := planilha->( dbOrderInfo( DBOI_ISDESC ) ) // ordenaçao atual (descendente ou ascendente )
   LOCAL n_revisao := subs( planilha->nridplan, 1, 6 ) // numero da revisao atual da planilha

   LOCAL l_resp := .F.
   LOCAL lretu := .F.

   planilha->( dbSetOrder( 'plidplan' ) ) // seta indice para PLIDPLAN
   planilha->( ordDescend(,, .F. ) ) // seta para numero de planilha ascendente
   planilha->( dbSkip() )

   IF planilha->( Eof() )
      // COMO JÁ ESTA NO ULTIMO REGISTRO - NAO HAVERÃO REGISTROS POSTERIORES A SEREM DELETADOS - ENTÃO: VOLTA PARA O TOPO
      planilha->( dbGoto( nreg_atual ) )
      planilha->( dbGoBottom() )
      regdepois := planilha->( RecNo() )
   ELSE
      regdepois := nreg_atual
   ENDIF

   planilha->( dbGoto( nreg_atual ) )

   // SE EXISTIR FILTRO ATIVO: CANCELA-LO (PARA QUE AS REVISOES DA PLANILHA SELECIONADA APAREÇAM)
   IF ! Empty( fil_atual )
      planilha->( dbSetFilter() )
      planilha->( dbGoto( nreg_atual ) )
   ENDIF

   // REODENA PELA ORDEM NATURAL DE PLIDPLAN
   planilha->( dbSetOrder( 'plidplan' ) )
   planilha->( ordDescend( ,, .F. ) )
   planilha->( dbGoTop() )
   planilha->( dbGoto( nreg_atual ) )

   // CHECA SE É A ULTIMA REVISAO (pois só ela pode ser deletada!!!)
   planilha->( dbSkip() )

   IF subs( planilha->nridplan, 1, 6 ) == n_revisao .AND. planilha->( !Eof() )
      msgalert( 'Só será possível excluir uma planilha a partir de sua última revisão!' )
      planilha->( dbSkip( - 1 ) )
      regdepois := nreg_atual
      lretu := .F.
   ELSE // E SE FOR A ULTIMA REVISAO...
      planilha->( dbGoto( nreg_atual ) )

      l_resp := msgnoyes( 'A operação de exclusão elimina definitivamente o registro da' + CRLF + ;
         'planilha selecionada. ' + CRLF + ;
         ' Responda a pergunta abaixo. ' + CRLF + ;
         ' ' + CRLF + ;
         'Voce tem certeza que deseja excluir a planilha: ' + trans( nridplan, '@r 9999/99-99' ), 'Atenção!!!' )

      IF l_resp

         IF AllTrim( v_operad ) == 'adm'
            IF planilha->( FLock() )
               planilha->( dbDelete() )
               planilha->( dbUnlock() )
               planilha->( dbCommit() )
               lretu := .T.
            ELSE
               msgstop( "O registro selecionado está em uso!", "Por favor, tente novamente mais tarde!" )
               regdepois := nreg_atual
               lretu := .F.
            ENDIF
         ELSE
            regdepois := nreg_atual
            lretu := .F.
         ENDIF
      ELSE
         lretu := .F.
      ENDIF
   ENDIF

   // RESTAURA FILTRO (SE EXISTIR)
   IF ! Empty( fil_atual )
      planilha->( dbSetFilter( {|| &fil_atual }, fil_atual ) )
   ENDIF

   // VOLTA PARA O INDICE E A ORDEM QUE ESTAVAM SELECIONADOS
   planilha->( dbSetOrder( nind_atual ) )
   planilha->( ordDescend(,, ldescendo ) )
   planilha->( dbGoto( regdepois ) )
   olstbplan:vupdateall()
   olstbox:refresh()
   olstbox:setfocus( .T. )

RETURN( lretu )

STATIC FUNCTION procurprod( objorigem )

   LOCAL nregatual := planilha->( RecNo() )

   IF !Empty( cnomeprod )

      LOCATE FOR AllTrim( cnomeprod ) $ planilha->nomeprod

      IF planilha->( Found() )

         IF !planilha->( Eof() )

            obtrepproc:show()
            obtrepproc:enable()

         ENDIF

         RETURN( .T. )

      ENDIF

      msgalert( 'Descrição não encontrada!' )

      planilha->( dbGoto( nregatual ) )

      RETURN( .F. )

   ENDIF

   RETURN( .F. )

STATIC FUNCTION frefreshbt( vpos )

   LOCAL nrecno := planilha->( RecNo() )

   IF Empty( vpos )
      planilha->( dbSkip( 1 ) )
      IF planilha->( Eof() )
         vpos := 'ultimo'
         planilha->( dbGoBottom() )
      ELSE
         vpos := ''
         planilha->( dbGoto( nrecno ) )
         planilha->( dbSkip( - 1 ) )
         IF planilha->( Bof() )
            vpos := 'primeiro'
            planilha->( dbGoTop() )
         ELSE
            vpos := ''
            planilha->( dbGoto( nrecno ) )
         ENDIF
      ENDIF
   ENDIF

   IF vpos == 'primeiro'
      obtprimeiro:disable()
      obtanterior:disable()
      obtseguinte:enable()
      obtultimo:enable()
   ELSEIF vpos == 'ultimo'
      obtprimeiro:enable()
      obtanterior:enable()
      obtseguinte:disable()
      obtultimo:disable()
   ELSE
      obtprimeiro:enable()
      obtanterior:enable()
      obtseguinte:enable()
      obtultimo:enable()
   ENDIF

   RETURN NIL

STATIC FUNCTION frotfiltro

   LOCAL lretu := .F.

   // O FILTRO ESTÁ VAZIO ?

   // SIM
   IF Empty( planilha->( dbFilter() ) )

      // FILTROU E VERIFICOU SE EXISTEM REGISTROS QUE ATENDAM AO FILTRO?
      IF filtropl( olstbplan ) // SIM
         lretu := .T.
      ENDIF

   // NÃO
   ELSE

      // DESEJA LIMPAR O FILTRO ATUAL E REALIZAR OUTRA FILTRAGEM ?

      // SIM
      IF flimpafilt()
         // CRIOU O FILTRO - APLICOU - E ENCONTROU REGISTROS QUE ATENDAM AO FILTRO?
         // SIM
         IF filtropl( olstbplan )
            lretu := .T.

         // NÃO
         ELSE

            // ZERA O FILTRO E FINALIZA
            cfiltrotela := ''
            planilha->( dbSetFilter() )
            planilha->( dbGoTop() )
            lretu := .T.

         ENDIF
         // NÃO
      ELSE

         lretu := .F.

      ENDIF

   ENDIF

RETURN( lretu )

STATIC FUNCTION flimpafilt

   LOCAL lretu := .F.

   IF Empty( cfiltrotela ) // este if não é obrigatório - só o fiz para uma eventualidade do texto do filtro ficar vazio
      cfiltrotela := planilha->( dbFilter() )
   ENDIF

   IF simnao( 'A relação (apresentada acima) já está filtrada para:!' + CRLF + CRLF + ;
         cfiltrotela + CRLF + CRLF + 'Deseja cancelar este filtro e iniciar um outro?' )

      cfiltrotela := ''
      planilha->( dbSetFilte() )
      planilha->( dbGoTop() )
      lretu := .T.

   ELSE
      lretu := .F.
   ENDIF

RETURN( lretu )

STATIC FUNCTION fteclei( ntecla, olstb )

   LOCAL lretu := .F.
   LOCAL vindkey
   LOCAL lfield

   // SE LOCALIZADOR DO MOUSE ESTIVER ATIVO ...
   IF ntecla == VK_CONTROL
      procutoque := ''
      RETURN NIL
   ENDIF

    // NAO TIRE O TRECHO ABAIXO DAQUI*********************************
   IF Upper( Chr( ntecla ) ) == Upper( 'L' ) .AND. GetKeyState( VK_CONTROL )
      msgwait( 'Busca por digitação pronta para nova pesquisa!',, 1 )
      procutoque := ''
      olstb:gotop()
      RETURN NIL
   ENDIF

   // MOSTRA - VISUALIZA
   IF ntecla == VK_RETURN .OR. ntecla == 13 .OR. ntecla == K_ALT_V
      procutoque := ''
      obtmostrap:setfocus()
      Eval( obtmostrap:baction )
      RETURN NIL
      // FILTRA
   ELSEIF ntecla == K_ALT_F
      procutoque := ''
      obtfiltra:setfocus()
      Eval( obtfiltra:baction )
      RETURN( lRetu )
   // INCLUI
   ELSEIF ( ntecla == K_INS .OR. ntecla == K_ALT_I .OR. ntecla == VK_INSERT ) .AND. v_operad # 'adm'
      procutoque := ''
      RETURN( .T. )
   ELSEIF ( ntecla == K_INS .OR. ntecla == K_ALT_I .OR. ntecla == VK_INSERT ) .AND. v_operad == 'adm'
      procutoque := ''
      obtinclui:setfocus()
      Eval( obtinclui:baction )
      RETURN( lRetu )
   // EXCLUI
   ELSEIF ( ntecla == K_ALT_E .OR. ntecla == K_DEL .OR. ntecla == VK_DELETE ) .AND. v_operad # 'adm'
      procutoque := ''
      RETURN( .T. )
   ELSEIF ( ntecla == K_ALT_E .OR. ntecla == K_DEL .OR. ntecla == VK_DELETE ) .AND. v_operad == 'adm'
      procutoque := ''
      obtexclui:setfocus()
      Eval( obtexclui:baction )
      RETURN( lRetu )
   // REVISA
   ELSEIF ( ntecla == K_ALT_R ) .AND. v_operad # 'adm'
      procutoque := ''
      RETURN( .T. )
   ELSEIF ( ntecla == K_ALT_R ) .AND. v_operad == 'adm'
      procutoque := ''
      obtrevisa:setfocus()
      Eval( obtrevisa:baction )
      RETURN( lRetu )
   ELSEIF ntecla == VK_UP
      procutoque := ''
      olstb:goup()
      IF olstb:bof .OR. olstb:nat == 1
         olstb:gotop()
         frefreshbt( 'primeiro' )
      ENDIF
   ELSEIF ntecla == VK_DOWN
      procutoque := ''
      olstb:godown()
      IF olstb:eof
         olstbpla:gobottom()
         frefreshbt( 'ultimo' )
      ENDIF
   ELSEIF ntecla == VK_HOME
      procutoque := ''
      olstb:gotop()
      frefreshbt( 'primeiro' )
   ELSEIF ntecla == VK_END
      procutoque := ''
      olstb:gobottom()
      frefreshbt( 'ultimo' )
   ELSEIF ntecla == VK_F2
      procutoque := ''
      msginfo( if( !Empty( planilha->( dbFilter() ) ), cfiltrotela, 'Nemhum filtro ativo!' ), 'Parâmetros do Filtro:' )
      RETURN NIL
   ELSEIF ntecla >= 96 .AND. ntecla <= 105 // se digitar no teclado numerico "keypad"
      // caracter "0" -> ascii = 48
      ntecla = ntecla - 48
   ENDIF

   // pcldsdmi,pcldmdsi,pldsdmit,pldmdsit,pldtanal,plidplai,plidplan,plsituac
   // 1 2 3 4 5 6 7 8
   IF ( IndexOrd() = 7 .OR. IndexOrd() = 6 ) .AND. ! Chr( ntecla ) $ '1234567890' // PLIDPLAN
      alerta( 'Para a atual ordem de apresentação: ' + v_escolha + CRLF + CRLF + ;
         'Voce deve digitar ANO + Nº DA PLANILHA + Nº DA REVISAO' + CRLF + CRLF + ;
         'no formato AANNNRR ' + CRLF + CRLF + ;
         'Ou selecionar a ordem de apresentação relativa ao dados pesquisado !!!' )
      procutoque := ''
      RETURN NIL
   ELSEIF AllTrim( Str( IndexOrd() ) ) $ '12348' .AND. Chr( ntecla ) $ '1234567890'
      alerta( 'Para a atual ordem de apresentação: ' + v_escolha + CRLF + CRLF + ;
         'Voce deve digitar, sómente, CARACTERES ALFABETICOS E PONTUAÇÕES' + CRLF + CRLF + ;
         'Ou selecionar a ordem de apresentação relativa ao dados pesquisado !!!' )
      procutoque := ''
      RETURN NIL

   ELSEIF IndexOrd() = 5
      alerta( 'Para a atual ordem de apresentação: ' + v_escolha + CRLF + CRLF + ;
         'Não é possível fazer pesquisa incremental' + CRLF + CRLF + ;
         'Utilize o botão "PROCURA" ou o botão "FILTRA" !!!' )

      procutoque := ''
      RETURN NIL
   ENDIF

   IF ( Upper( Chr( ntecla ) ) $ ' _ABCÇDEFGHIJKLMNOPQRSTUVWXYZ1234567890/<>*"&¨@(){}[]#$%-+.,:;?' .OR. ;
         Chr( ntecla ) == "'" .AND. ;
         !Empty( IndexKey() ) .AND. FieldType( fieldnum( IndexKey() ) ) $ Upper( 'CN' ) )

      flocadig( Upper( Chr( ntecla ) ), @olstb )
      ntecla := nil

   ENDIF

   RETURN NIL

STATIC FUNCTION flocadig( toquelocal, olbx )

   LOCAL atregs
   // local indextual := planilha->(indexord()) //OrdBagName()

   PRIVA ultimapos := planilha->( RecNo() )

   procutoque := procutoque + toquelocal

   msgwait( procutoque,, .5 )

   IF ! planilha->( dbSeek( procutoque ) )
      alerta( 'O dado digitado nao esta cadastrado!' )
      planilha->( dbGoto( ultimapos ) )
      olbx:refresh()
      procutoque := ''
   ELSE
      atregs := RecNo()
      olbx:gotop()
      planilha->( dbGoto( atregs ) )
      olbx:refresh()
   ENDIF

RETURN( .T. )

// FIM DO PROGRAMA
 



Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: unrecoverable error 9015 hb_vmdo()

Postby Edman » Wed Oct 13, 2021 4:47 pm

Já havia feito isto e logo no primeiro acréscimo já ocorre o erro

Obrigado
Edman
 
Posts: 20
Joined: Wed Oct 06, 2021 8:19 pm

Re: unrecoverable error 9015 hb_vmdo()

Postby karinha » Wed Oct 13, 2021 4:51 pm

Retire o include "vkey.ch"

Code: Select all  Expand view

#include "fivewin.ch"
#include "xbrowse.ch"
// #include "vkey.ch"  PRECISA PARA?
// #include "inkey.ch" PRECISA PARA?
#include "dbinfo.ch"
#include "Dbstruct.ch"
 



Regards, saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7824
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: unrecoverable error 9015 hb_vmdo()

Postby Edman » Wed Oct 13, 2021 4:56 pm

devo ter feito umas 30 ou 40 variações entre compiladores
e em duas maquinas diferentes com Windows 7 e Windows 10 e com Maquina Virtual

a mais estranha ocorrencia quando ia acrescentando BUTTONs era que o erro era jogado para o Button seguinte quando mudava a posição do
PROMPT do BUTTON em uma sequencia diferente: Tipo colando o PROMPT logo depois do ID .

Outra coisa estranha : se não colocava PROMPT dava erro logo no primeiro acréscimo .

Muito Louco ... porque as cláusulas PROMPT não são obrigatorias.

Com BUTTONBMP roda tudo bem
mas eu precisava de algumas alternativas do SBUTTON.
e também por querer entender o motivo destas ocorrências para futuros projetos.
Edman
 
Posts: 20
Joined: Wed Oct 06, 2021 8:19 pm

Re: unrecoverable error 9015 hb_vmdo()

Postby Edman » Wed Oct 13, 2021 4:57 pm

Criei uma rotina neste prg de busca incremental muuito eficiente por isto utilizo estes includes
Edman
 
Posts: 20
Joined: Wed Oct 06, 2021 8:19 pm

PreviousNext

Return to FiveWin for Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 80 guests