- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- recuperar conteudo de pergunta do usuario
×
Linguagem de Programação ADVPL
Perguntas recuperar conteudo de pergunta do usuario
- pinheiro
- Autor do Tópico
- Desconectado
- Membro Especialista
Menos
Mais
- Postagens: 91
- Obrigados Recebidos: 0
9 anos 9 meses atrás #27341
por pinheiro
recuperar conteudo de pergunta do usuario foi criado por pinheiro
O controle de gravação de perguntas do sistema esta configurado para gravar as respostas por usuario.
Alguem sabe dizer se existe uma tabela semelhante a SX1 que grave as perguntas por usuario, ou se existe alguma função para recuperar este conteudo?
Necessito para tratar uma rotina automatica, agradeço se alguem puder ajudar.
att
Alexandre
Alguem sabe dizer se existe uma tabela semelhante a SX1 que grave as perguntas por usuario, ou se existe alguma função para recuperar este conteudo?
Necessito para tratar uma rotina automatica, agradeço se alguem puder ajudar.
att
Alexandre
Por favor Acessar ou Registrar para participar da conversa.
- renan.santos
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 15
- Obrigados Recebidos: 0
9 anos 9 meses atrás #27391
por renan.santos
Respondido por renan.santos no tópico recuperar conteudo de pergunta do usuario
Boa tarde Alexandre....
Tive um problema a um tempo atras em um rotina automática também, precisar alterar as perguntas do usuário.
Em algum forum encontrei uma solução que alterava a SX1, porém precisava além da SX1 alterar também o profile.
O arquivo é o Profile.usr que fica em \profile, para modificar este arquivo temos as funções FindProfDef e WriteNewProf.
Este arquivo pode ser aberto via APSDU marcando Todos os arquivos.
Em anexo segue o fonte Robert Koch com algumas alterações minha.
Segue um exemplo de chamada da função U_GravaSX1 ("FIN050 ", "05", 2) //Gravo pergunta Gera Chq.p/Adiant? como NÃO
Neste caso precisa alterar a pergunta FIN050 de ordem 05 e colocar o conteúdo 2.
Obs: Teste bastante as funções FindProfDef e WriteNewProf, pois não são documentadas.
Tive um problema a um tempo atras em um rotina automática também, precisar alterar as perguntas do usuário.
Em algum forum encontrei uma solução que alterava a SX1, porém precisava além da SX1 alterar também o profile.
O arquivo é o Profile.usr que fica em \profile, para modificar este arquivo temos as funções FindProfDef e WriteNewProf.
Este arquivo pode ser aberto via APSDU marcando Todos os arquivos.
Em anexo segue o fonte Robert Koch com algumas alterações minha.
Segue um exemplo de chamada da função U_GravaSX1 ("FIN050 ", "05", 2) //Gravo pergunta Gera Chq.p/Adiant? como NÃO
Neste caso precisa alterar a pergunta FIN050 de ordem 05 e colocar o conteúdo 2.
Obs: Teste bastante as funções FindProfDef e WriteNewProf, pois não são documentadas.
Por favor Acessar ou Registrar para participar da conversa.
- pinheiro
- Autor do Tópico
- Desconectado
- Membro Especialista
Menos
Mais
- Postagens: 91
- Obrigados Recebidos: 0
9 anos 9 meses atrás #27392
por pinheiro
Respondido por pinheiro no tópico recuperar conteudo de pergunta do usuario
Obrigado Renan.
Deixei gravado esta dica e baixei o fonte para estudá-lo, mas ja consegui resolver da seguinte forma:
Usando a função pergunte("FINA050",.f.), são carregadas automaticamente as perguntas do usuario logado, sem apresentação ao usuario da janela de parametros.
Apos carregar as perguntas, alterei no fonte o conteudo da variavel MV_PAR05 conforme a minha necessidade.
Fica valendo apenas para o processamento corrente, pois o conteudo da pergunta em si não é alterado na SX1;
Funcionou bem!
Fica a dica, é uma solução simples que as vezes não enxergamos diretamente e ficamos doidos.
Abraços.
Deixei gravado esta dica e baixei o fonte para estudá-lo, mas ja consegui resolver da seguinte forma:
Usando a função pergunte("FINA050",.f.), são carregadas automaticamente as perguntas do usuario logado, sem apresentação ao usuario da janela de parametros.
Apos carregar as perguntas, alterei no fonte o conteudo da variavel MV_PAR05 conforme a minha necessidade.
Fica valendo apenas para o processamento corrente, pois o conteudo da pergunta em si não é alterado na SX1;
Funcionou bem!
Fica a dica, é uma solução simples que as vezes não enxergamos diretamente e ficamos doidos.
Abraços.
Por favor Acessar ou Registrar para participar da conversa.
- renan.santos
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 15
- Obrigados Recebidos: 0
9 anos 9 meses atrás #27393
por renan.santos
Respondido por renan.santos no tópico recuperar conteudo de pergunta do usuario
Tentei esta solução também e uso em outras rotinas automáticas.
Porém no meu caso precisei alterar o profile do usuário com aquelas funções pois não era só a minha função que o parâmetro ia ser utilizado e sim em outra do sistema que chamava este parâmetro umas 2 vezes.
E para não fazer o usuário dar um F12 toda vez que entrar na rotina, precisei alterar o profile sem ação dele, apenas observando a combinação de alguns campos.
Abraços,
Porém no meu caso precisei alterar o profile do usuário com aquelas funções pois não era só a minha função que o parâmetro ia ser utilizado e sim em outra do sistema que chamava este parâmetro umas 2 vezes.
E para não fazer o usuário dar um F12 toda vez que entrar na rotina, precisei alterar o profile sem ação dele, apenas observando a combinação de alguns campos.
Abraços,
Por favor Acessar ou Registrar para participar da conversa.
- mbrigagao
- Desconectado
- Membro Platina
Menos
Mais
- Postagens: 350
- Obrigados Recebidos: 1
8 anos 9 meses atrás #30302
por mbrigagao
Respondido por mbrigagao no tópico recuperar conteudo de pergunta do usuario
Bom dia,
Sei que o tópico é um pouco antigo, mas tenho a mesma situação e precisava do fonte para me auxiliar.
Não consigo baixa-lo pois dá erro.
Se alguém puder me enviar o fonte em questão eu agradeceria muito.
Grato.
Sei que o tópico é um pouco antigo, mas tenho a mesma situação e precisava do fonte para me auxiliar.
Não consigo baixa-lo pois dá erro.
Se alguém puder me enviar o fonte em questão eu agradeceria muito.
Grato.
Por favor Acessar ou Registrar para participar da conversa.
- angeloprotti1
- Desconectado
- Membro Júnior
Menos
Mais
- Postagens: 28
- Obrigados Recebidos: 0
8 anos 5 meses atrás #30858
por angeloprotti1
Respondido por angeloprotti1 no tópico recuperar conteudo de pergunta do usuario
Boa tarde Marcelo, da uma olhada aqui
// Programa...: GravaSX1
// Autor......: Robert Koch
// Data.......: 13/02/2002
// Cliente....: Generico
// Descricao..: Atualiza respostas das perguntas no SX1
//
// Historico de alteracoes:
// 01/09/2005 - Robert - Ajustes para trabalhar com profile de usuario (versao 8.11)
// 16/02/2006 - Robert - Melhorias gerais
// 12/12/2006 - Robert - Sempre grava numerico no X1_PRESEL
// 11/09/2007 - Robert - Parametros tipo 'combo' podem receber informacao numerica ou caracter.
// - Testa existencia da variavel __cUserId
// 02/04/2008 - Robert - Mostra mensagem quando tipo de dados for incompativel.
// - Melhoria geral nas mensagens.
// 03/06/2009 - Robert - Tratamento para aumento de tamanho do X1_GRUPO no Protheus10
// 26/01/2010 - Robert - Chamadas da msgalert trocadas por msgalert.
// 29/07/2010 - Robert - Soh trabalhava com profile de usuario na versao 8.
//
//
// Parametros:
// 1 - Grupo de perguntas a atualizar
// 2 - Codigo (ordem) da pergunta
// 3 - Dado a ser gravado
user function GravaSX1 (_sGrupo, _sPerg, _xValor)
local _aAreaAnt := getarea ()
local _sUserName := ""
local _sMemoProf := ""
local _nTamanho := 0
local _nLinha := 0
local _aLinhas := {}
local _lContinua := .T.
// Na versao Protheus10 o tamanho das perguntas aumentou.
_sGrupo = padr (_sGrupo, len (sx1 -> x1_grupo), " ")
if _lContinua
if ! sx1 -> (dbseek (_sGrupo + _sPerg, .F.))
msgalert ("Programa " + procname () + ": grupo/pergunta '" + _sGrupo + "/" + _sPerg + "' nao encontrado no arquivo SX1." + _PCham ())
_lContinua = .F.
endif
endif
if _lContinua
// Atualizarei sempre no SX1. Depois vou ver se tem profile de usuario.
do case
case sx1 -> x1_gsc == "C"
reclock ("SX1", .F.)
sx1 -> x1_presel = val (cvaltochar (_xValor))
sx1 -> x1_cnt01 = ""
sx1 -> (msunlock ())
case sx1 -> x1_gsc == "G"
if valtype (_xValor) != sx1 -> x1_tipo
msgalert ("Programa " + procname () + ": incompatibilidade de tipos: o parametro '" + _sPerg + "' do grupo de perguntas '" + _sGrupo + "' eh do tipo '" + sx1 -> x1_tipo + "', mas o valor recebido eh do tipo '" + valtype (_xValor) + "'." + _PCham ())
_lContinua = .F.
else
reclock ("SX1", .F.)
sx1 -> x1_presel = 0
if sx1 -> x1_tipo == "D"
sx1 -> x1_cnt01 = "'" + dtoc (_xValor) + "'"
elseif sx1 -> x1_tipo == "N"
sx1 -> x1_cnt01 = str (_xValor, sx1 -> x1_tamanho, sx1 -> x1_decimal)
elseif sx1 -> x1_tipo == "C"
sx1 -> x1_cnt01 = _xValor
endif
sx1 -> (msunlock ())
endif
otherwise
msgalert ("Programa " + procname () + ": tratamento para X1_GSC = '" + sx1 -> x1_gsc + "' ainda nao implementado." + _PCham ())
_lContinua = .F.
endcase
endif
if _lContinua
// Antes da versao 8.11 nao havia profile de usuario (para o P10 ainda nao testei).
//if "MP8.11" $ cVersao .and. type ("__cUserId") == "C" .and. ! empty (__cUserId)
if type ("__cUserId") == "C" .and. ! empty (__cUserId)
psworder (1) // Ordena arquivo de senhas por ID do usuario
PswSeek(__cUserID) // Pesquisa usuario corrente
_sUserName := PswRet(1) [1, 2]
// Encontra e atualiza profile deste usuario para a rotina / pergunta atual.
// Enquanto o usuario nao alterar nenhuma pergunta, ficarah usando do SX1 e
// seu profile nao serah criado.
If FindProfDef (_sUserName, _sGrupo, "PERGUNTE", "MV_PAR")
// Carrega memo com o profile do usuario (o profile fica gravado
// em um campo memo)
_sMemoProf := RetProfDef (_sUserName, _sGrupo, "PERGUNTE", "MV_PAR")
// Monta array com as linhas do memo (tem uma pergunta por linha)
_aLinhas = {}
for _nLinha = 1 to MLCount (_sMemoProf)
aadd (_aLinhas, alltrim (MemoLine (_sMemoProf,, _nLinha)) + chr (13) + chr (10))
next
// Monta uma linha com o novo conteudo do parametro atual.
// Pos 1 = tipo (numerico/data/caracter...)
// Pos 2 = '#'
// Pos 3 = GSC
// Pos 4 = '#'
// Pos 5 em diante = conteudo.
_sLinha = sx1 -> x1_tipo + "#" + sx1 -> x1_gsc + "#" + iif (sx1 -> x1_gsc == "C", cValToChar (sx1 -> x1_presel), sx1 -> x1_cnt01) + chr (13) + chr (10)
// Se foi passada uma pergunta que nao consta no profile, deve tratar-se
// de uma pergunta nova, pois jah encontrei-a no SX1. Entao vou criar uma
// linha para ela na array. Senao, basta regravar na array.
if val(_sPerg) > len (_aLinhas)
aadd (_aLinhas, _sLinha)
else
// Grava a linha de volta na array de linhas
_aLinhas [val (_sPerg)] = _sLinha
endif
// Remonta memo para gravar no profile
_sMemoProf = ""
for _nLinha = 1 to len (_aLinhas)
_sMemoProf += _aLinhas [_nLinha]
next
// Grava o memo no profile
WriteProfDef(_sUserName, _sGrupo, "PERGUNTE", "MV_PAR", ; // Chave antiga
_sUserName, _sGrupo, "PERGUNTE", "MV_PAR", ; // Chave nova
_sMemoProf) // Novo conteudo do memo.
endif
endif
endif
restarea (_aAreaAnt)
return .T.
//
static Function _PCham ()
local _i := 0
local _sPilha := chr (13) + chr (10) + chr (13) + chr (10) + "Pilha de chamadas:"
do while procname (_i) != ""
_sPilha += chr (13) + chr (10) + procname (_i)
_i++
enddo
return _sPilha
Abraço
// Programa...: GravaSX1
// Autor......: Robert Koch
// Data.......: 13/02/2002
// Cliente....: Generico
// Descricao..: Atualiza respostas das perguntas no SX1
//
// Historico de alteracoes:
// 01/09/2005 - Robert - Ajustes para trabalhar com profile de usuario (versao 8.11)
// 16/02/2006 - Robert - Melhorias gerais
// 12/12/2006 - Robert - Sempre grava numerico no X1_PRESEL
// 11/09/2007 - Robert - Parametros tipo 'combo' podem receber informacao numerica ou caracter.
// - Testa existencia da variavel __cUserId
// 02/04/2008 - Robert - Mostra mensagem quando tipo de dados for incompativel.
// - Melhoria geral nas mensagens.
// 03/06/2009 - Robert - Tratamento para aumento de tamanho do X1_GRUPO no Protheus10
// 26/01/2010 - Robert - Chamadas da msgalert trocadas por msgalert.
// 29/07/2010 - Robert - Soh trabalhava com profile de usuario na versao 8.
//
//
// Parametros:
// 1 - Grupo de perguntas a atualizar
// 2 - Codigo (ordem) da pergunta
// 3 - Dado a ser gravado
user function GravaSX1 (_sGrupo, _sPerg, _xValor)
local _aAreaAnt := getarea ()
local _sUserName := ""
local _sMemoProf := ""
local _nTamanho := 0
local _nLinha := 0
local _aLinhas := {}
local _lContinua := .T.
// Na versao Protheus10 o tamanho das perguntas aumentou.
_sGrupo = padr (_sGrupo, len (sx1 -> x1_grupo), " ")
if _lContinua
if ! sx1 -> (dbseek (_sGrupo + _sPerg, .F.))
msgalert ("Programa " + procname () + ": grupo/pergunta '" + _sGrupo + "/" + _sPerg + "' nao encontrado no arquivo SX1." + _PCham ())
_lContinua = .F.
endif
endif
if _lContinua
// Atualizarei sempre no SX1. Depois vou ver se tem profile de usuario.
do case
case sx1 -> x1_gsc == "C"
reclock ("SX1", .F.)
sx1 -> x1_presel = val (cvaltochar (_xValor))
sx1 -> x1_cnt01 = ""
sx1 -> (msunlock ())
case sx1 -> x1_gsc == "G"
if valtype (_xValor) != sx1 -> x1_tipo
msgalert ("Programa " + procname () + ": incompatibilidade de tipos: o parametro '" + _sPerg + "' do grupo de perguntas '" + _sGrupo + "' eh do tipo '" + sx1 -> x1_tipo + "', mas o valor recebido eh do tipo '" + valtype (_xValor) + "'." + _PCham ())
_lContinua = .F.
else
reclock ("SX1", .F.)
sx1 -> x1_presel = 0
if sx1 -> x1_tipo == "D"
sx1 -> x1_cnt01 = "'" + dtoc (_xValor) + "'"
elseif sx1 -> x1_tipo == "N"
sx1 -> x1_cnt01 = str (_xValor, sx1 -> x1_tamanho, sx1 -> x1_decimal)
elseif sx1 -> x1_tipo == "C"
sx1 -> x1_cnt01 = _xValor
endif
sx1 -> (msunlock ())
endif
otherwise
msgalert ("Programa " + procname () + ": tratamento para X1_GSC = '" + sx1 -> x1_gsc + "' ainda nao implementado." + _PCham ())
_lContinua = .F.
endcase
endif
if _lContinua
// Antes da versao 8.11 nao havia profile de usuario (para o P10 ainda nao testei).
//if "MP8.11" $ cVersao .and. type ("__cUserId") == "C" .and. ! empty (__cUserId)
if type ("__cUserId") == "C" .and. ! empty (__cUserId)
psworder (1) // Ordena arquivo de senhas por ID do usuario
PswSeek(__cUserID) // Pesquisa usuario corrente
_sUserName := PswRet(1) [1, 2]
// Encontra e atualiza profile deste usuario para a rotina / pergunta atual.
// Enquanto o usuario nao alterar nenhuma pergunta, ficarah usando do SX1 e
// seu profile nao serah criado.
If FindProfDef (_sUserName, _sGrupo, "PERGUNTE", "MV_PAR")
// Carrega memo com o profile do usuario (o profile fica gravado
// em um campo memo)
_sMemoProf := RetProfDef (_sUserName, _sGrupo, "PERGUNTE", "MV_PAR")
// Monta array com as linhas do memo (tem uma pergunta por linha)
_aLinhas = {}
for _nLinha = 1 to MLCount (_sMemoProf)
aadd (_aLinhas, alltrim (MemoLine (_sMemoProf,, _nLinha)) + chr (13) + chr (10))
next
// Monta uma linha com o novo conteudo do parametro atual.
// Pos 1 = tipo (numerico/data/caracter...)
// Pos 2 = '#'
// Pos 3 = GSC
// Pos 4 = '#'
// Pos 5 em diante = conteudo.
_sLinha = sx1 -> x1_tipo + "#" + sx1 -> x1_gsc + "#" + iif (sx1 -> x1_gsc == "C", cValToChar (sx1 -> x1_presel), sx1 -> x1_cnt01) + chr (13) + chr (10)
// Se foi passada uma pergunta que nao consta no profile, deve tratar-se
// de uma pergunta nova, pois jah encontrei-a no SX1. Entao vou criar uma
// linha para ela na array. Senao, basta regravar na array.
if val(_sPerg) > len (_aLinhas)
aadd (_aLinhas, _sLinha)
else
// Grava a linha de volta na array de linhas
_aLinhas [val (_sPerg)] = _sLinha
endif
// Remonta memo para gravar no profile
_sMemoProf = ""
for _nLinha = 1 to len (_aLinhas)
_sMemoProf += _aLinhas [_nLinha]
next
// Grava o memo no profile
WriteProfDef(_sUserName, _sGrupo, "PERGUNTE", "MV_PAR", ; // Chave antiga
_sUserName, _sGrupo, "PERGUNTE", "MV_PAR", ; // Chave nova
_sMemoProf) // Novo conteudo do memo.
endif
endif
endif
restarea (_aAreaAnt)
return .T.
//
static Function _PCham ()
local _i := 0
local _sPilha := chr (13) + chr (10) + chr (13) + chr (10) + "Pilha de chamadas:"
do while procname (_i) != ""
_sPilha += chr (13) + chr (10) + procname (_i)
_i++
enddo
return _sPilha
Abraço
Por favor Acessar ou Registrar para participar da conversa.
- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- recuperar conteudo de pergunta do usuario
Tempo para a criação da página:0.133 segundos