Exemplo do Ponto de Entrada OS010BTN.
Exemplo do Ponto de Entrada:
//Bibliotecas #Include "Protheus.ch" /*--------------------------------------------------------------------------* | P.E.: OS010BTN | | Descr.: Função que adiciona Ações Relacionadas dentro da Tabela de Preço | *--------------------------------------------------------------------------*/ User Function OS010BTN() Local aArea := GetArea() Local aButtons := {} //Adicionando o botão no Ações Relacionadas aAdd(aButtons,{ "* Atualiza Produtos", {|| u_zAtuGrid()}, "* Atualiza Produtos" }) RestArea(aArea) Return aButtons User Function zAtuGrid() Local aArea := GetArea() Local nJanAltu := 100 Local nJanLarg := 700 Local oFontPad := TFont():New("Arial", , -14) Private lNovo := .F. Private oDlgAtu Private cMaskDA1 := PesqPict('DA1', 'DA1_PRCVEN') //Carregando os modelos de dados do cabeçalho e grid Private oModelPad := FWModelActive() Private oModelGrid := oModelPad:GetModel('DA1DETAIL') Private nOperacao := oModelPad:nOperation //Pegando posições do aHeader Private nPosProd := aScan(oModelGrid:aHeader, {|x| AllTrim(x[2]) == AllTrim("DA1_CODPRO")}) Private nPosDesc := aScan(oModelGrid:aHeader, {|x| AllTrim(x[2]) == AllTrim("DA1_DESCRI")}) Private nPosPrcV := aScan(oModelGrid:aHeader, {|x| AllTrim(x[2]) == AllTrim("DA1_PRCVEN")}) //Linha Atual Private nLinAtu := oModelGrid:nLine //Linha encontrada Private nLinEnc := 0 //Gets Private oGetCod, cGetCod := Space(TamSX3('B1_COD')[01]) Private oGetDes, cGetDes := Space(TamSX3('B1_DESC')[01]) Private oGetPrc, nGetPrc := 0 Private oGetMsg, cGetMsg := "" //Montando a janela DEFINE MSDIALOG oDlgAtu TITLE "Atualização Preço" FROM 000, 000 TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL //Produto nColAux := 3 @ 007, nColAux SAY oSayCod PROMPT "Produto: " SIZE 050, 007 OF oDlgAtu COLORS 0, 16777215 PIXEL @ 004, nColAux+40 MSGET oGetCod VAR cGetCod SIZE 060, 010 OF oDlgAtu COLORS 0, 16777215 F3 'SB1' VALID (fPesqSB1()) PIXEL //Descrição nColAux += 103 @ 007, nColAux SAY oSayDes PROMPT "Descrição: " SIZE 050, 007 OF oDlgAtu COLORS 0, 16777215 PIXEL @ 004, nColAux+40 MSGET oGetDes VAR cGetDes SIZE 100, 010 OF oDlgAtu COLORS 0, 16777215 PIXEL oGetDes:lActive := .F. //Preço Venda nColAux += 143 @ 007, nColAux SAY oSayPrc PROMPT "Preço Venda: " SIZE 050, 007 OF oDlgAtu COLORS 0, 16777215 PIXEL @ 004, nColAux+40 MSGET oGetPrc VAR nGetPrc SIZE 060, 010 OF oDlgAtu COLORS 0, 16777215 PICTURE cMaskDA1 PIXEL //Get de Log @ 023, 003 MSGET oGetMsg VAR cGetMsg SIZE (nJanLarg/2)-12, 012 OF oDlgAtu COLORS 0, 16777215 NO BORDER FONT oFontPad PIXEL oGetMsg:lActive := .F. oGetMsg:setCSS("QLineEdit{color:#FF0000; background-color:#FEFEFE;}") //Botão confirmar If nOperacao == 3 .Or. nOperacao == 4 @ (nJanAltu/2)-24, (nJanLarg/2)-53 BUTTON oBtnCon PROMPT "Confirmar" SIZE 048, 018 OF oDlgAtu ACTION(fConfirmar() ) PIXEL EndIf ACTIVATE MSDIALOG oDlgAtu CENTERED //Volta pra primeira linha oModelGrid:nLine := 1 RestArea(aArea) Return /*---------------------------------------------------------------------* | Func: fPesqSB1 | | Desc: Função que valida o código do produto digitado | *---------------------------------------------------------------------*/ Static Function fPesqSB1() Local lRet := .T. DbSelectArea('SB1') SB1->(DbSetOrder(1)) //B1_FILIAL + B1_COD //Se conseguir posicionar no produto If SB1->(DbSeek(FWxFilial('SB1') + cGetCod)) cGetDes := SB1->B1_DESC lRet := .T. //Busca a linha nLinEnc := aScan(oModelGrid:aCols, {|x| AllTrim(x[nPosProd]) == AllTrim(cGetCod)}) //Caso não encontre If nLinEnc == 0 cGetMsg := "Item Novo" nGetPrc := 0 lNovo := .T. Else cGetMsg := "Item Existente" nGetPrc := oModelGrid:aCols[nLinEnc][nPosPrcV] lNovo := .F. EndIf Else lRet := .F. MsgAlert("Produto não encontrado!", "Atenção") EndIf Return lRet /*---------------------------------------------------------------------* | Func: fConfirmar | | Desc: Função chamada pelo botão confirmar | *---------------------------------------------------------------------*/ Static Function fConfirmar() Local nLin //Se for novo, adiciona uma nova linha If lNovo oModelGrid:AddLine() nLin := Len(oModelGrid:aCols) //Senão pega a linha encontrada Else nLin := nLinEnc EndIf //Define a linha que será utilizada oModelGrid:nLine := nLin oModelPad:SetValue('DA1DETAIL', 'DA1_CODPRO', cGetCod) oModelPad:SetValue('DA1DETAIL', 'DA1_DESCRI', cGetDes) oModelPad:SetValue('DA1DETAIL', 'DA1_PRCVEN', nGetPrc) //Atualiza os textos cGetCod := Space(TamSX3('B1_COD')[01]) cGetDes := Space(TamSX3('B1_DESC')[01]) nGetPrc := 0 cGetMsg := "" oGetCod:Refresh() oGetDes:Refresh() oGetPrc:Refresh() oGetMsg:Refresh() Return
Observações:
– Caso tenha dúvidas ou problemas com os exemplos, entre em contato;
– Se tiver sugestões de rotinas, pode entrar em contato;