Olá pessoal…
Por acaso, você já precisou editar um parâmetro com separação, como com barras ( / ) ou ponto e vírgula ( ; )? Veja essa função que facilita a edição de parâmetros com quebra em AdvPL (como o MV_ALIQICM).
Algumas das vezes precisamos editar algum parâmetro, ou até mesmo, ceder para algum usuário editar, agora imagine um parâmetro com várias separações, como é o caso do MV_ALIQICM, em que você tem várias alíquotas e você precisa de vez em quando adicionar uma nova.
Pensando nisso, foi criado uma rotina, em que você passa qual é o parâmetro e qual é o caracter de separação, e através disso, é montado uma tela para manutenção dos dados, conforme print abaixo.
Abaixo o fonte completo:
//Bibliotecas #Include "Protheus.ch" /*/{Protheus.doc} zParComma Função para edição de um parâmetro (SX6) que tenha separadores como ponto e vírgula @author Atilio @since 25/05/2018 @version 1.0 @param cParametro, characters, Nome do Parâmetro @param cSeparador, characters, Qual separador é utilizado @type function @example u_zParComma("MV_ALIQICM", "/") /*/ User Function zParComma(cParametro, cSeparador) Local aArea := GetArea() Local aDados := "" Local nAtual := 0 Local nTamBtn := 40 Local oSayCont Local oGrpDados Local oGrpAcoes Local oBtnConf Local oBtnCanc Private lOk := .F. Private cContNov := "" Private oDlgPvt Private oGetCont Private cGetCont := "" Private oMsGetPar Private aHeadPar := {} Private aColsPar := {} Private nJanLarg := 0500 Private nJanAltu := 0400 //Parâmetros que vem pela função Default cParametro := "" Default cSeparador := "" //Se tiver parametro e separador If ! Empty(cParametro) .And. ! Empty(cSeparador) //Pega o conteúdo do parâmetro cGetCont := GetMV(cParametro) //Busca todos os dados quebrando pelo separador aDados := StrTokArr(cGetCont, cSeparador) //Monta o aHeader //Cabeçalho ... Titulo Campo Mask Tamanho Dec Valid Usado Tip F3 CBOX aAdd(aHeadPar, { "Conteúdo", "XX_CONTEUD", "", 10, 0, ".T.", ".T.", "C", "", ""}) //Percorre as linhas, e adiciona no aCols For nAtual := 1 To Len(aDados) aAdd(aColsPar, {; aDados[nAtual],; .F.; }) Next //Monta a tela DEFINE MSDIALOG oDlgPvt TITLE "Alteração do Parâmetro " + cParametro FROM 000, 000 TO nJanAltu, nJanLarg COLORS 0, 16777215 PIXEL @ 008, 003 SAY oSayCont PROMPT "Origem:" SIZE 030, 007 OF oDlgPvt PIXEL @ 005, 038 MSGET oGetCont VAR cGetCont SIZE 160, 010 OF oDlgPvt PIXEL oGetCont:lReadOnly := .T. //Dados @ 020, 003 GROUP oGrpDados TO (nJanAltu/2)-28, (nJanLarg/2)-3 PROMPT "Dados: " OF oDlgPvt COLOR 0, 16777215 PIXEL oMsGetPar := MsNewGetDados():New(; 026,; //nTop 006,; //nLeft (nJanAltu/2) - 31,; //nBottom (nJanLarg/2) - 6,; //nRight GD_INSERT + GD_DELETE + GD_UPDATE,; //nStyle "AllwaysTrue()",; //cLinhaOk ,; //cTudoOk "",; //cIniCpos {"XX_CONTEUD"},; //aAlter ,; //nFreeze 999,; //nMax ,; //cFieldOK ,; //cSuperDel ,; //cDelOk oDlgPvt,; //oWnd aHeadPar,; //aHeader aColsPar) //aCols //Ações @ (nJanAltu/2)-25, 003 GROUP oGrpAcoes TO (nJanAltu/2)-3, (nJanLarg/2)-3 PROMPT "Ações: " OF oDlgPvt COLOR 0, 16777215 PIXEL @ (nJanAltu/2)-19, (nJanLarg/2)-((nTamBtn*1)+06) BUTTON oBtnConf PROMPT "Confirmar" SIZE nTamBtn, 013 OF oDlgPvt ACTION(fValidConf(cSeparador)) PIXEL @ (nJanAltu/2)-19, (nJanLarg/2)-((nTamBtn*2)+09) BUTTON oBtnCanc PROMPT "Cancelar" SIZE nTamBtn, 013 OF oDlgPvt ACTION(oDlgPvt:End()) PIXEL oMsGetPar:oBrowse:SetFocus() //Ativando a janela ACTIVATE MSDIALOG oDlgPvt CENTERED //Se a rotina foi confirmada, atualiza o parâmetro If lOk PutMV(cParametro, cContNov) EndIf EndIf RestArea(aArea) Return /*---------------------------------------------------------* | Função: fValidConf | | Descr.: Função que valida os conteúdos digitados | *---------------------------------------------------------*/ Static Function fValidConf(cSeparador) Local lRet := .T. Local nPosCont := 1 Local nPosDel := 2 Local aDadAux := oMsGetPar:aCols Local nAtual := 0 Local cMsg := "" //Percorrendo todos os dados, e preenchendo o conteúdo novo cContNov := "" For nAtual := 1 To Len(aDadAux) //Se não estiver deletada a linha If ! aDadAux[nAtual][nPosDel] cContNov += Alltrim(aDadAux[nAtual][nPosCont]) + cSeparador EndIf Next //Se o conteúdo passar de 250 caracteres, mostra aviso ao usuário If Len(cContNov) > 250 cMsg := "Conteúdo do parâmetro <b>excedeu 250</b> caracteres!<br><br>" cMsg += "<b>Conteúdo Novo:</b> '" + cContNov + "' <br><br>" cMsg += "<b>Conteúdo Máximo:</b> '" + SubStr(cContNov, 1, 250) + "'" MsgStop(cMsg, "Atenção") lRet := .F. EndIf //Se o retorno estiver ok, finaliza a rotina If lRet lOk := .T. oDlgPvt:End() EndIf Return lRet
Bom pessoal, por hoje é só.
Abraços e até a próxima.