Olá pessoal…
Hoje vou mostrar uma função que criei para copiar um grupo de perguntas em AdvPL.
O objetivo é copiar o grupo de perguntas, e através desse grupo copiado, fazer os específicos ou novos fontes de relatórios.
A função, recebe 3 parâmetros, o nome do grupo de perguntas originais, o grupo de perguntas que será criado e se irá excluir o novo grupo, caso ele já exista antes da cópia.
Abaixo um print de exemplo (copiei o grupo ABSENT, para X_ABSENT).
Abaixo a função desenvolvida:
//Bibliotecas #Include "Protheus.ch" /*/{Protheus.doc} zCpySX1 Copia um grupo de perguntas para um novo grupo, clonando seus conteúdos @author Atilio @since 10/08/2015 @version 1.0 @param cPergAnt, Caracter, Código da Pergunta antiga @param cPergNov, Caracter, Código da Pergunta nova @param lExcNov, Lógico, Define se será excluído o grupo de perguntas novo antes da cópia @example u_zCpySX1("RELLAS", "X_RELLAS", .T.) u_zCpySX1("PERG01", "X_PERG01", .T.) u_zCpySX1("X_PRINTER", "X_PRINTER2", .T.) /*/ User Function zCpySX1(cPergAnt, cPergNov, lExcNov) Local aArea := GetArea() Local aAreaX1 := SX1->(GetArea()) Local aX1Estr := SX1->(DbStruct()) Local aAreaAux Local nColuna := 0 Local aConteu := {} Default cPergAnt := "" Default cPergNov := "" Default lExcNov := .T. DbSelectArea("SX1") SX1->(DbSetOrder(1)) //X1_GRUPO + X1_ORDEM SX1->(DbGoTop()) //Se a pergunta antiga ou a nova estiverem em branco, mostra mensagem de erro If Empty(cPergAnt) .Or. Empty(cPergNov) MsgStop("Pergunta antiga e/ou nova estão em branco!", "Atenção") //Senão, se as perguntas forem iguais, mostra erro ElseIf Alltrim(cPergAnt) == Alltrim(cPergNov) MsgStop("Pergunta antiga é igual à nova!", "Atenção") //Senão, define que as perguntas terão um tamanho de 10 de caracteres, pega a estrutura da SX1 e efetua a cópia Else cPergAnt := PadR(cPergAnt, Len(SX1->X1_GRUPO)) cPergNov := PadR(cPergNov, Len(SX1->X1_GRUPO)) //Se o grupo de perguntas não existir, mostra mensagem de erro If !SX1->(DbSeek(cPergAnt)) MsgStop("Pergunta antiga não existe! Logo, não pode ser copiada!", "Atenção") //Senão prossegue com a cópia Else aAreaAux := SX1->(GetArea()) //Se for para excluir o grupo novo If lExcNov //Posiciona no grupo novo If SX1->(DbSeek(cPergNov)) //Enquanto não for fim da tabela e tiver registros da pergunta nova While !SX1->(EoF()) .And. SX1->X1_GRUPO == cPergNov RecLock("SX1", .F.) DbDelete() SX1->(MsUnlock()) SX1->(DbSkip()) EndDo EndIf EndIf RestArea(aAreaAux) //Enquanto não for o fim da tabela e tiver registros na pergunta antiga While !SX1->(EoF()) .And. SX1->X1_GRUPO == cPergAnt aAreaAux := SX1->(GetArea()) aConteu := {} //Primeiro é armazenado tudo em um array, para não divergir os ponteiros de registros For nColuna := 1 To Len(aX1Estr) //Se a coluna for a X1_GRUPO, define o nome da pergunta nova If Alltrim(aX1Estr[nColuna][1]) == "X1_GRUPO" aAdd(aConteu, cPergNov) //Senão, efetua a cópia da coluna Else aAdd(aConteu, &("SX1->"+aX1Estr[nColuna][1])) EndIf Next //Gravando os dados na tabela nova, conforme estrutura da SX1 RecLock("SX1", .T.) For nColuna := 1 To Len(aX1Estr) &(aX1Estr[nColuna][1]) := aConteu[nColuna] Next SX1->(MsUnlock()) //Restaurando a área da pergunta antiga RestArea(aAreaAux) SX1->(DbSkip()) EndDo EndIf EndIf RestArea(aAreaX1) RestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.