× Linguagem de Programação ADVPL

Perguntas Criação tela ADVPL

Mais
10 anos 9 meses atrás #20805 por michelp
Criação tela ADVPL foi criado por michelp
Bom dia,

Estava precisando criar uma tela como o exemplo da figura que estou anexando, de preferencia com legenda.

Alguém tem algum exemplo para me enviar

Att. Michel
Anexos:

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 9 meses atrás #20806 por kanaamlrr
Respondido por kanaamlrr no tópico Criação tela ADVPL
Segue um exemplo de rotina.
Abraço!
#include 'Protheus.ch'
#include 'Topconn.ch'

#define ENTER chr(13)+chr(10)

/*
Funcao      : ManuCCBalc
Objetivos   : Manutenção/Histórico da conta corrente de pontos das balconistas
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 28/05/2012
*/
*-------------------------------------------------*
User Function ManuCCBalc()
*-------------------------------------------------*
Local   cOldArea := SELECT()
Private cTitulo  := "Conta Corrente Balconistas"
Private aRotina  := { { "Pesquisar"   ,"AxPesqui"                            ,0,1},; 
                      { "Visualizar"  ,"U_ManutSZ9"                          ,0,2},; 
                      { "Incluir"     ,"U_ManutSZ9"                          ,0,3},;
                      { "Alterar"     ,"U_ManutSZ9"                          ,0,4},;
                      { "Relatório"   ,"U_RelCCBalc"                         ,0,6}}                      


//abre a tela de manutenção
MBrowse(,,,,"SZ3",,,,,,)   

//volta pra area inicial
dbSelectArea(cOldArea)     
//
Return


/*
Funcao      : ManutSZ9
Objetivos   : Manutenção/Histórico da conta corrente de pontos das balconistas
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 28/05/2012
*/
*-------------------------------------------------*
User Function ManutSZ9(cAlias,nReg,nOpc)
*-------------------------------------------------*
Local   oDlg
Local   bOk        := {|| lOk:=.T., oDlg:End()}
Local   bCancel    := {|| lOk:=.F., oDlg:End()}
Local   aCpos      := {"NOUSER" ,"Z3_CODIGO" ,"Z3_CPF",;
                       "Z3_NOME","Z3_SALDO"}
Local   aPos       := {}
Local   aButtons   := {}
Local   i          := 1
Private oEnc    
Private oGetDB
Private nTotRegs   := 0
Private lOk        := .F. 
Private lRefresh   := .T.
Private lDeletou   := .F.
Private cFile      := ""
Private aTela      := {}
Private aGets      := {} 
Private aHeader    := {}
Private aCols      := {}

If (SZ3->(RecCount())==0)
   MsgStop("Cadastre um balconista para realizar as movimentações.")
   Return
EndIF

SZ9->(dbSetOrder(1))
If nOpc == 3 .AND. SZ9->(dbSeek(xFilial("SZ9")+SZ3->Z3_CODIGO))
   MsgStop("Balconista já possui movimentações"+ENTER+;
           "Selecione a opção ALTERAR.")
   Return
ElseIf nOpc == 4 .AND. !SZ9->(dbSeek(xFilial("SZ9")+SZ3->Z3_CODIGO))
   MsgStop("Balconista não possui movimentações"+ENTER+;
           "Selecione a opção INCLUIR.")
   Return
EndIf

//Tenta criar work, caso não consiga retorna mensagem
If !CriaWork()
   MsgStop("Impossível criar work."+ENTER+;
           "Entre em contato com o setor de TI.")
   Return
Else
   preencheWk()
   aAdd(aButtons,{"HISTORIC" ,{|| U_Recalc()}   ,"Recalcula"   ,"Recalcula"   })
EndIf                                      


//Cria variáveis de memória
For i := 1 To SZ3->(FCount())
   M->&(SZ3->(FieldName(i))) := FieldGet(i)
Next i   

//Tela de manutenção 
oMainWnd:ReadClientCoors()  
Define MsDialog oDlg Title cTitulo FROM 0, 0 To oMainWnd:nBottom, oMainWnd:nRight Of oMainWnd Pixel
   *
   //Capa com dados da balconista
   aPos := PosDlgUp(oDlg)
   aPos[3] -= 90 //BOTTOM
   oEnc := MsMget():New(cAlias,nil,2,,,,aCpos,aPos,,,,,,,,,,,,,,,,,)  
   oDlg:lMaximized:=.T.  
   *
   //Detalhe com o histórico de movimentações
   aPos := PosDlgDown(oDlg) 
   aPos[1] -= 90 //TOP
   aPos[3] -= 20 //BOTTOM
   aPos[4] -= 10 //RIGHT
   oGetDB := MsGetDb():New(aPos[1],aPos[2],aPos[3],aPos[4],nOpc,"U_ValCpo('LIN')",;
                           ,,.T.,,,,,"WKMOVS","U_ValCpo('CPO')",,.T.,oDlg,.T.,,"U_ValCpo('DEL')",)
   *       
Activate MsDialog oDlg On Init (EnchoiceBar(oDlg,bOk,bCancel,,aButtons),oEnc:oBox:Align := CONTROL_ALIGN_TOP,)

//Somente executa função pra salvar se clicar no OK
If lOk
   If MsgYesNo("Deseja gravar as alterações?")
      Processa({|| gravaMovs()}, "Gravando registros","Gravando registros")
   EndIf
EndIf

//Fecha a work
If Select("WKMOVS") > 0
   WKMOVS->(dbCloseArea())
EndIf

//
Return                    

/*
Funcao      : CriaWork
Objetivos   : Cria Work 
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 28/05/2012
*/
*-------------------------------------------------*
Static Function CriaWork()
*-------------------------------------------------*   
Local aSemSx3 := {}

SX3->(dbSetOrder(1))
SX3->(dbSeek("SZ9"))

While !SX3->(Eof()) .AND. SX3->X3_ARQUIVO == "SZ9"
   If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
      aAdd(aHeader, {Trim(X3Titulo()),;
                     SX3->X3_CAMPO,;
                     SX3->X3_PICTURE,;
                     SX3->X3_TAMANHO,;
                     SX3->X3_DECIMAL,;
                     SX3->X3_VALID,;
                     "",;
                     SX3->X3_TIPO,;
                     "",;
                     ""})
      aAdd(aSemSx3, {SX3->X3_CAMPO,;
                     SX3->X3_TIPO,;
                     SX3->X3_TAMANHO,;
                     SX3->X3_DECIMAL})               
   EndIf
   SX3->(dbSkip())
EndDo
aAdd(aSemSx3,{"FLAG"      ,"L",1 ,0})
aAdd(aSemSx3,{"R_E_C_N_O_","N",15,0})
cFile := CriaTrab(aSemSx3,.T.)   
If !Used()
   Return .F.
EndIf 
USE &cFile ALIAS "WKMOVS" NEW
IndRegua("WKMOVS",cFile+OrdBagExt(),"Z9_DTOPER")
//
Return .T.  
  
/*
Funcao      : preencheWk
Objetivos   : Preenche a Work com as movimentações relativas a balconista selecionada
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 28/05/2012
*/
*-------------------------------------------------*
Static Function preencheWk()
*-------------------------------------------------*
Local cQuery := ""

cQuery += "SELECT * FROM "
cQuery += RetSqlName("SZ9")+" SZ9 "
cQuery += "WHERE " + RetSqlCond("SZ9")
cQuery += " AND Z9_CODBALC='"+SZ3->Z3_CODIGO+"' "
cQuery += "ORDER BY Z9_DTOPER"

GerTCQuery(cQuery,"Q_QRY",.T.)

//verifica se teve algum retorno
If Q_QRY->(EOF()) .AND. Q_QRY->(BOF())
   Return .F.
EndIf    

//Copia dados resultantes da query para a work do msselect
While Q_QRY->(!EOF())

   WKMOVS->(dbAppend())
   WKMOVS->Z9_DTOPER  := STOD(Q_QRY->Z9_DTOPER)
   WKMOVS->Z9_TIPOPER := Q_QRY->Z9_TIPOPER
   WKMOVS->Z9_QTDEPRE := Q_QRY->Z9_QTDEPRE
   WKMOVS->Z9_PONTOS  := Q_QRY->Z9_PONTOS
   WKMOVS->Z9_LOJA    := Q_QRY->Z9_LOJA
   WKMOVS->Z9_CODPREM := Q_QRY->Z9_CODPREM
   WKMOVS->Z9_SALDO   := Q_QRY->Z9_SALDO   
   WKMOVS->Z9_OBS     := Q_QRY->Z9_OBS
   WKMOVS->Z9_USERLOG := Q_QRY->Z9_USERLOG
   WKMOVS->R_E_C_N_O_ := Q_QRY->R_E_C_N_O_
   Q_QRY->(dbSkip())
   
EndDo
WKMOVS->(dbGoTop())
nTotRegs := WKMOVS->(RecCount())
Q_QRY->(dbCloseArea())
//
Return .T.

/*
Funcao      : ValCpo
Objetivos   : Realiza a validação dos campos do msgetdb
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 28/05/2012
*/
*--------------------------*
User Function ValCpo(cOp)
*--------------------------*
Local nSaldo := 0
If cOp == "DEL" .OR. cOp == "CPO"
   If WKMOVS->(RecNo()) <= nTotRegs .AND. ReadVar() != "M->Z9_OBS"
      MsgAlert("O registro não pode ser alterado."+ENTER+;
               "Inclua um novo registro para o caso de acerto de saldo.")
      Return .F.
   EndIf 

   If cOp == "DEL"
      lDeletou := .T.
   EndIf
EndIf
If cOP == "LIN" .AND. lDeletou
   U_Recalc(cOp)
   lDeletou := .F.
EndIf
If ReadVar() == "M->Z9_PONTOS" 
   If Empty(WKMOVS->Z9_TIPOPER)
      MsgAlert("Preencha o campo Tip. Operac. primeiro!")
      Return .F.
   EndIf
   If WKMOVS->Z9_TIPOPER == "S"
      WKMOVS->(dbSkip(-1))
      nSaldo := WKMOVS->Z9_SALDO
      WKMOVS->(dbSkip())
      If(M->Z9_PONTOS>nSaldo)
         MsgAlert("Saldo insuficiente para essa operação.")
         Return .F.
      EndIf
   EndIf
   U_Recalc(cOp)
ElseIf ReadVar() == "M->Z9_TIPOPER"
   If !M->Z9_TIPOPER $ "ES"
       MsgAlert("Opção inválida."+ENTER+;
                "Selecione Entrada ou Saída!")
       Return .F.
   EndIf
ElseIf ReadVar() == "M->Z9_CODPREM"
   SZD->(dbSetOrder(1))
   SZD->(dbSeek(xFilial("SZD")+M->Z9_CODPREM))
   WKMOVS->(dbSkip(-1))
   nSaldo := WKMOVS->Z9_SALDO
   WKMOVS->(dbSkip())
   If(SZD->ZD_PONTOS>nSaldo)
      MsgAlert("Saldo insuficiente para essa operação.")
      Return .F.
   EndIf
   RecLock("WKMOVS",.F.)
   WKMOVS->Z9_PONTOS := SZD->ZD_PONTOS
   WKMOVS->Z9_QTDEPRE := 1
   WKMOVS->(MsUnlock())
   U_Recalc("LIN")   
ElseIf ReadVar() == "M->Z9_QTDEPRE"
   If Empty(WKMOVS->Z9_TIPOPER) .OR. Empty(WKMOVS->Z9_CODPREM)
      MsgAlert("Preencha o campo Tip. Operac. e Cod. Prêmio")
      Return .F.
   EndIf
   If WKMOVS->Z9_TIPOPER == "E"
      M->Z9_QTDEPRE := 0
   Else
      If M->Z9_QTDEPRE < 1
         M->Z9_QTDEPRE := 1
      EndIf
      SZD->(dbSetOrder(1))
      SZD->(dbSeek(xFilial("SZD")+WKMOVS->Z9_CODPREM))
      WKMOVS->(dbSkip(-1))
      nSaldo := WKMOVS->Z9_SALDO
      WKMOVS->(dbSkip())
      RecLock("WKMOVS",.F.)
      WKMOVS->Z9_QTDEPRE := M->Z9_QTDEPRE
      WKMOVS->(MsUnlock())
      If(SZD->ZD_PONTOS*M->Z9_QTDEPRE>nSaldo)
         MsgAlert("Saldo insuficiente para essa operação.")
         Return .F.
      EndIf
      U_Recalc("LIN")         
   EndIf
EndIf
//
Return .T.

/*
Funcao      : Recalc
Objetivos   : Recalcula o saldo da balconista selecionada
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 28/05/2012
*/
*--------------------------*
User Function Recalc(cOp)
*--------------------------*
Local nRegAtu := WKMOVS->(RecNo())
Local nTotal  := 0

WKMOVS->(dbGoTo(1))
nTotal := If(!WKMOVS->Z9_TIPOPER $ "ES",WKMOVS->Z9_PONTOS,0)
While WKMOVS->(!Eof())
   If WKMOVS->FLAG
      WKMOVS->(dbSkip())         
      Loop
   EndIf
   If cOp == "LIN"
      If WKMOVS->Z9_TIPOPER $ "E"
         nTotal += WKMOVS->Z9_PONTOS
      ElseIf WKMOVS->Z9_TIPOPER $ "S"
         nTotal -= WKMOVS->Z9_PONTOS*WKMOVS->Z9_QTDEPRE
      EndIf
   ElseIf cOp == "CPO"
      If WKMOVS->Z9_TIPOPER $ "E"
         nTotal += If(WKMOVS->(RecNo())==nRegAtu,M->Z9_PONTOS,WKMOVS->Z9_PONTOS)
      ElseIf WKMOVS->Z9_TIPOPER $ "S"
         nTotal -= If(WKMOVS->(RecNo())==nRegAtu,M->Z9_PONTOS*WKMOVS->Z9_QTDEPRE,WKMOVS->Z9_PONTOS*WKMOVS->Z9_QTDEPRE)
      EndIf
   EndIf
   RecLock("WKMOVS",.F.)
   WKMOVS->Z9_SALDO := nTotal
   WKMOVS->(MsUnlock())
   WKMOVS->(dbSkip())
EndDo    
M->Z3_SALDO := nTotal
oGetDB:ForceRefresh()
//
Return .T.

/*
Funcao      : gravaMovs
Objetivos   : Grava movimentações na tabela SZ9
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 28/05/2012
*/
*-------------------------------------------------*
Static Function gravaMovs()
*-------------------------------------------------*

WKMOVS->(dbGoTop())
While WKMOVS->(!Eof())
   If !WKMOVS->FLAG
      If WKMOVS->(RecNo())<=nTotRegs
         SZ9->(dbGoTo(WKMOVS->R_E_C_N_O_))
         RecLock("SZ9",.F.)
      Else
         RecLock("SZ9",.T.)
      EndIf
      SZ9->Z9_DTOPER  := WKMOVS->Z9_DTOPER
      SZ9->Z9_TIPOPER := WKMOVS->Z9_TIPOPER
      SZ9->Z9_CODBALC := SZ3->Z3_CODIGO
      SZ9->Z9_LOJA    := WKMOVS->Z9_LOJA
      SZ9->Z9_PONTOS  := WKMOVS->Z9_PONTOS
      SZ9->Z9_CODPREM := WKMOVS->Z9_CODPREM
      SZ9->Z9_QTDEPRE := WKMOVS->Z9_QTDEPRE
      SZ9->Z9_SALDO   := WKMOVS->Z9_SALDO
      SZ9->Z9_OBS     := WKMOVS->Z9_OBS
      SZ9->Z9_USERLOG := WKMOVS->Z9_USERLOG
      SZ9->(MsUnlock())
   EndIf
   WKMOVS->(dbSkip())
EndDo
WKMOVS->(dbSkip(-1))
RecLock("SZ3",.F.)
SZ3->Z3_SALDO := WKMOVS->Z9_SALDO
SZ3->(MsUnlock())
Return
/*
Funcao      : GerTCQuery
Objetivos   : Executa a query passada
Autor       : Kanaãm L. R. Rodrigues 
Data/Hora   : 28/05/2012
*/
*-------------------------------------------------*
Static Function GerTCQuery(cQuery,cAlias,lEraseLog)
*-------------------------------------------------*
Local nCod

Default lEraseLog := .T.

If lEraseLog
   nCod := FCreate("cQuery.TXT")
Else
   nCod := FOpen("cQuery.TXT",2)
EndIf

If nCod # -1
   FWRITE(nCod,cQuery)
   Fclose(nCod)
EndIf

cQuery := ChangeQuery(cQuery)

If Select(cAlias) # 0
   (cAlias)->(dbCloseArea())
EndIf

TcQuery cQuery ALIAS (cAlias) NEW

If !USED()
   Return .F.
EndIf


Return .T.

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.100 segundos
Joomla templates by a4joomla