Exemplo com inclusäo/alteraçäo e exclusäo

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
Luciano Bonfim
Usuário Nível 3
Usuário Nível 3
Mensagens: 414
Registrado em: 23 Ago 2007 09:34
Localização: Rio de Janeiro / São Paulo
Contato:

Exemplo com inclusäo/alteraçäo e exclusäo

Mensagem por Luciano Bonfim »

Resolvi migrar todas minhas telas de cadastro para a HWGUI, portanto para näo ter ue começar do zero gostaria de saber se algume poderia me arrumar um exemplo de um cadastro simples com inclusäo, alteraçäo e exclusäo de uma DBF (pode ser simples apenas com os campos: código e descriçäo)

Muito Obrigado
Muito Obrigado,

Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Mensagem por sygecom »

Abaixo um pequeno Exemplo:

Para fazer a chama, faço assim:

Código: Selecionar todos

PESQ_CAT("S")  
Ou seja ele inica para somente pesquisa não podendo fazer nd alem de pesquisar e selecionar por outra função o registro que estiver marcado no browse.

Código: Selecionar todos

PESQ_CAT("N")  
Ou seja ele aceita cadastro de novo registro, alteração e exclusão, e claro usando o browse tmb.
Inicio das Funções....

Código: Selecionar todos

*****************
Function PESQ_CAT  // tudo inicia aqui
*****************
Local oFrm, oFont
PRIVATE oDlgHabla:=NIL
Private gPes,vPes:="",keyAnt:=0
PRIVATE oIcon := HIcon():AddResource("ICON_1")  // caminho do icone no arquivo resourse

PARA PESQUISA

SetToolTipBalloon(.t.)  // tooltip em formato de balão

IF PESQUISA="N"  // caso não for somente pesquisa
   dbcloseall()
   if !file("CATEGOR")
      CRIA_CATEGOR()
   ENDIF
   USE CATEGOR  ALIAS CATEGOR shared
   SET INDEX TO CATEGOR
endif
SELE CATEGOR

*** FERRAMENTAS DE MULTI-PESQUISA AUTOMATICA
aCHAVES := {}
nORD    := INDEXORD()
nCNT    := 1
nMAXLEN := 0
IF nORD # 0
   DO WHILE .T.
      IF !EMPTY( INDEXKEY(nCNT) )
         aADD(aCHAVES, " "+INDEXKEY(nCNT)+" ")
         nCNT++
      ELSE
         EXIT
      ENDIF
   ENDDO
   aEVAL(aCHAVES, {|cV,nV| IF( LEN( aCHAVES[nV] ) > nMAXLEN,;
                   nMAXLEN := LEN( aCHAVES[nV] ), NIL ) })
ENDIF
DBSETORDER(nORD)
DBGOTOP()

PREPARE FONT oFontBtn NAME "Arial" WIDTH 0 HEIGHT -14 charset 255
        INIT DIALOG oFrm TITLE "Pesquisa de Categoria de Fornecedor" CLIPPER FONT oFontBtn;
        AT 0,0;
        SIZE 700,520;
        ICON oIcon ;
        STYLE WS_DLGFRAME + WS_SYSMENU + DS_CENTER

   IF PESQUISA="N"
      @ 10,450 BUTTON "Cadastrar" ON CLICK {||TELA_CAD_CAT("C"),oBrw:Refresh()};
      SIZE 100,28 STYLE WS_TABSTOP ;
      TOOLTIP "Clique Aqui Para Cadastrar"

      @ 140,450 BUTTON "Alterar" ON CLICK {||TELA_CAD_CAT("A"),oBrw:Refresh()};
      SIZE 100,28 STYLE WS_TABSTOP ;
      TOOLTIP "Clique Aqui Para Alterar"

      @ 270,450 BUTTON "Excluir" ON CLICK {||TELA_CAD_CAT("D"),oBrw:Refresh()};
      SIZE 100,28 STYLE WS_TABSTOP ;
      TOOLTIP "Clique Aqui Para Excluir"
   ENDIF
   @ 460,450 BUTTON "Fechar" ON CLICK {||EndDialog()};
   SIZE 100,28 STYLE WS_TABSTOP ;
   TOOLTIP "Clique Aqui Para Fechar"

@ 10,40 BROWSE oBrw DATABASE OF oFrm SIZE 680,400;
        STYLE  WS_VSCROLL + WS_HSCROLL;
        ON CLICK {|o,key| BrowseKey_CAT(o, key ) }

oBrw:alias := aLIAS()

oBrw:bKeyDown := {|o,key| BrowseKey_CAT(o, key ) }

@ 5,10 say "F2 - Busca  / F4 - Muda Ordem" size GETDESKTOPWIDTH()-20,20;
STYLE SS_CENTER COLOR x_BLUE

PREPARE FONT oFont NAME "Arial" WIDTH 0 HEIGHT -16

oBrw:AddColumn( HColumn():New( "Tipo de Categoria", FieldBlock(Fieldname(2)),"C",  35,0) )

FOR nI := 1 TO 1
    oBrw:aColumns[nI]:nJusHead := DT_CENTER //CENTRALIZA NO NOME DO CAMPO
    oBrw:aColumns[nI]:nJusLin  := DT_LEFT  //COLOCA PARA DIREITA A LINHA
NEXT
oBrw:aColumns[1]:length := 40            // TAMANHO DA COLUNA

oBrw:Freeze:=1  // congela a coluna

oBrw:Refresh()
oBrw:SetFocus()
setfocus(obrw)

//oFrm:bActivate := {||oBrw:SetFocus()}

oFrm:Activate()
return nil

*************************************
FUNCTION BrowseKey_CAT( oBrowse, key)
*************************************
DO CASE
   CASE KEY= VK_ESCAPE
        EndDialog()
   CASE KEY = 1  // CLIK DO MOUSE NAO ACHEI A DEFINE..
        IF PESQUISA="N"
           TELA_CAD_CAT("A")
        else
           EndDialog()
        Endif
   CASE KEY = VK_F1
        // Sobre()  // informações sobre a empresa
   CASE KEY = VK_F2
        BUSCA_NOME()
   CASE KEY = VK_F4
        Lista_ordem()
   CASE KEY = VK_F9
        //ShellExecute("calc")  //calculadora
   OTHERWISE
   if key=13 .OR. key=65  // tecla "ENTER" e tecla "A"
      IF PESQUISA="N"
         TELA_CAD_CAT("A")
      else
         EndDialog()
      endif
   elseif key=46           // tecla "DEL"
      IF PESQUISA="N"
         TELA_CAD_CAT("D")
      endif
   elseif key=67           // tecla "C"
      IF PESQUISA="N"
         TELA_CAD_CAT("C")
      endif
   ENDIF
ENDCASE
RETURN .T.

***********************
FUNCTION TELA_CAD_CAT()  // Tela para cadastro
***********************
PRIVATE oJanela

PRIVATE LBLCAT, LBLCLS
PRIVATE LBLCLS

PRIVATE wCAT  := Space(35)
PRIVATE wCLS  := 0

PRIVATE oCAT
PRIVATE oCLS

SetToolTipBalloon(.t.)
SetColorinFocus( .t. )

vTitulo="Cadastro de Categoria"
PARA TIPO_CAD

IF TIPO_CAD="A" .or. TIPO_CAD="D"
   vTitulo="Alteração de Categoria"
   wCAT  := CATEGOR->CATEGORIA
   wCAT2 := CATEGOR->CATEGORIA
   wCLS  := CATEGOR->CLS
ELSE
   SELE CATEGOR
   DbGoBottom()
   wCLS  := CATEGOR->CLS+1
ENDIF
IF TIPO_CAD="D"
   vTitulo="Excluir Categoria"
Endif

PREPARE FONT oFont NAME "Arial" WIDTH 0 HEIGHT -12 WEIGHT 400
INIT DIALOG oJanela CLIPPER NOEXIT TITLE vTitulo;
AT 0,0 SIZE 600,130;
ICON  oIcon ;
FONT oFont ;
STYLE DS_CENTER + WS_VISIBLE + WS_CAPTION + WS_SYSMENU

@ 10 ,20  SAY LBLCLS                    CAPTION "Codigo....:"           SIZE 100,22
@ 10 ,50  SAY LBLCAT                    CAPTION "Categoria.:"           SIZE 100,22

IF TIPO_CAD="D"
   @ 90 ,20  GET OCLS  VAR WCLS     PICTURE "999"                       SIZE 100,22 STYLE WS_DISABLED
   @ 90 ,50  GET OCAT  VAR WCAT     PICTURE Replicate("X",30)           SIZE 300,22 STYLE WS_DISABLED
else
   @ 90 ,20  GET OCLS  VAR WCLS     PICTURE "999"                       SIZE  80,22;
   TOOLTIP "Informe o Codigo da Categoria"  STYLE WS_DISABLED

   @ 90 ,50  GET OCAT  VAR WCAT     PICTURE "@!" VALID {||Focaliza()}   SIZE 300,22;
   TOOLTIP "Informe o Nome da Categoria"
Endif

IF TIPO_CAD="A" .or. TIPO_CAD="C"
   @ 100,80 BUTTON btnOk CAPTION "&Salvar"   ;
   TOOLTIP "Salvar Registro";
   SIZE 100,32 ON CLICK {||oJanela:close(),Grava_Cat() } STYLE WS_TABSTOP
ELSE
   @ 100,80 BUTTON btnOk CAPTION "&Excluir"   ;
   TOOLTIP "Excluir Categoria";
   SIZE 100,32 ON CLICK {|| del_cat(),oJanela:close() } STYLE WS_TABSTOP
ENDIF

@ 400,80 BUTTON OBTN2 CAPTION "&Voltar"   ;
TOOLTIP "Voltar Sem Salvar";
SIZE 100,32 ON CLICK {|| oJanela:close()} STYLE WS_TABSTOP

oJanela:Activate()
Return nil

********************
FUNCTION Grava_Cat()
********************
SELE CATEGOR
IF EMPTY(wCAT)
   OBRIGA() // mensagem que avisa que é obrigatorio esse campo
   oCAT:setfocus()
 	 RETURN
ENDIF

IF TIPO_CAD="C"
   Apprede()  // apend blank
ELSEIF TIPO_CAD="A"
   DBGOTOP()
   DBSETORDER(1)
   DBSEEK(wCAT2)
ENDIF
TRAVAREG("S")  // travaregistro
CATEGOR->CLS := wCLS
CATEGOR->CATEGORIA := HB_AnsiToOem(wCAT)
DBCOMMIT()
LIBERAREG()  // libera registro
DBGOTOP()
oBrw:Refresh()
RETURN

Function DEL_CAT()
SELE CATEGOR
DBSETORDER(1)
DBSEEK(wCAT)
TRAVAREG("S")
DELE
DBCOMMIT()
LIBERAREG()
DBGOTOP()
oBrw:Refresh()
Return

********************
Function CRIA_CATEGOR
********************
   private aField[2]
   aField[1] := {"CLS"  , "N",  2,  0}
   aField[2] := {CATEGORIA"   , "C", 35,  0}
   DBcreate("CATEGOR", aField,"DBFCDX")

   USE CATEGOR  ALIAS CATEGOR excl
   ferase("CATEGOR")
   index on CATEGORIA TAG 1 to CATEGOR
   index on CLS       TAG 2 to CATEGOR
   Sele CATEGOR
   USE
Return

*************************
FUNCTION BUSCA_NOME(oPos)
*************************
nCHAVES := LEN(aCHAVES)
IF nCHAVES <= 1
   MSGINFO("Nao há outras ordes ou chaves De Indice Ativa para fazer Busca nesse Arquivo","Aviso do Sistema")
else
   PRIVATE oIcon := HIcon():AddResource("ICON_1")

   Private oFrm2,chave
   Private vchave:=""
   vchave:=Space(20)

   INIT DIALOG oFrm2 CLIPPER NOEXIT TITLE "Busca Pelo Campo Indexado";
   AT 0,0 SIZE 600,130;
   ICON oIcon ;
   STYLE DS_CENTER + WS_VISIBLE + WS_CAPTION + WS_SYSMENU

   SetColorinFocus(.t.)
   SetToolTipBalloon(.t.)

   @  5,10 SAY "Busca.:" size 580,25
   @  5,30 GET Chave VAR vchave PICTURE "@!" VALID {||Focaliza()} SIZE 580,25;
   TOOLTIP "Informe o Nome que Deseja Buscar"

   @   5,70 BUTTON btnOk CAPTION "Pesquisar";
   ON CLICK { || DBSEEK( UPPER(Chave:setGet()), .t. ) , oBrw:Refresh(), oFrm2:Close() };
   SIZE 100,25 STYLE WS_TABSTOP;
   TOOLTIP "Confirma a Busca"

   @ 150,70 BUTTON "Fechar";
   ON CLICK {||oFrm2:Close()};
   SIZE 100,25;
   TOOLTIP "Fechar Janela"

   ACTIVATE DIALOG oFrm2
Endif
Return .T.

**********************
Function Lista_ordem()
**********************
Local oFrm3
nCHAVES := LEN(aCHAVES)
IF nCHAVES <= 1
   MSGINFO("Nao há outras ordes ou chaves De Indice Ativa de pesquisa para este Arquivo","Aviso do Sistema")
ELSE
   nOLD := INDEXORD()
   nORDEM := WChoice( aCHAVES, "Seleciona Ordem", 05+nCHAVES, 100+nMAXLEN, ,,,, )
   IF nORDEM > 0 .AND. nOLD # nORDEM
      DBSETORDER(nORDEM)
   ENDIF
ENDIF
dbGoTop()
oBrw:Refresh()
Return
Bom se eu esqueci de algo me desculpa e me avisa. O exemplo é simples, se prescisar de mais podes providenciar...

Obs: Vc pode usar Redefine tmb. para desenhar as telas em WorkShop ou outra ferramenta dessas, porem se quiser amanha depois usar o mesmo codigo sem muita alteração em windows e linux, ai não podera ter redefine, pq o mesmo só funciona em Windows.

Abraços
Leonardo Machado
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Responder