Sei que é possível extrair o código do usuário dos campos lgi e lga em uma consulta sql, no entanto, gostaria de saber se é possível obter o nome do usuário?
Sei que é possível extrair o código do usuário dos campos lgi e lga em uma consulta sql, no entanto, gostaria de saber se é possível obter o nome do usuário?
No SQL não é possível.
Há algumas funções do advpl que podem resolver o problema.
Aconselho usar o FWSFALLUSERS().
Segue um exemplo de como criar as tabelas acessórias no banco
#include "protheus.ch"
#include "topconn.ch"
#include "tbiconn.ch"
#include "rwmake.ch"
#include "xmlxfun.ch"
User Function GENF0001
Local aArea := {}
Local aAreaSM0 := {}
Local cQuery := ""
Local cSqlAlias := ""
Local nX, nZ := 0
Local aGrupos := {}
Local aSysGrpDef := {}
Local aSysUsuDef := {}
Local lRun := .T.
Local lAuto := .F.
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Schedule ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If Select("SX2") == 0
RPCSetType( 3 )
RpcSetEnv("01","01",,,,GetEnvServer(),{})
Sleep(5000)
ConOut("GENF0001 - [ INICIO ] Coletando informacoes de usuarios e grupos de acesso " + Dtoc(Date()) + " - " + Time())
lAuto := .T.
EndIf
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Inicializa variaveis ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
aArea := GetArea()
aAreaSM0 := SM0->( GetArea() )
cQuery := ""
cSqlAlias := GetNextAlias()
nX := 0
nZ := 0
aGrupos := {}
aSysGrpDef := AllGroups()
aSysUsuDef := AllUsers()
lRun := .T.
lAuto := .F.
/*
* ULTIMA EXECUCAO - P_GRUPOS
*************************************************************************************/
cQuery := "SELECT DTRUN FROM P_GRUPOS (NOLOCK)"
If Select( cSqlAlias ) > 0
(cSqlAlias)->( dbCloseArea() )
EndIf
TCQUERY cQuery NEW ALIAS &cSqlAlias
lRun := .T.
If (cSqlAlias)->( !EoF() ) .And. DtoS(CtoD( (cSqlAlias)->DTRUN )) >= DtoS( Date() )
lRun := .F.
EndIf
(cSqlAlias)->( dbCloseArea() )
If lRun
/*
* GRUPOS
*************************************************************************************/
//TCDelFile("P_GRUPOS")
/*
cQuery := "CREATE TABLE P_GRUPOS " + CRLF
cQuery += "( " + CRLF
cQuery += " CODIGO VARCHAR(06), " + CRLF
cQuery += " GRUPO VARCHAR(50), " + CRLF
cQuery += " DESCRICAO VARCHAR(50), " + CRLF
cQuery += " DTRUN VARCHAR(50), " + CRLF
cQuery += " PRIMARY KEY (CODIGO) " + CRLF
cQuery += ") " + CRLF
*/
cQuery := "DELETE FROM P_GRUPOS " + CRLF
TCSQLEXEC(cQuery)
For nX := 1 To Len(aSysGrpDef)
cQuery := "INSERT INTO P_GRUPOS " + CRLF
cQuery += "( " + CRLF
cQuery += " CODIGO, " + CRLF
cQuery += " GRUPO, " + CRLF
cQuery += " DESCRICAO, " + CRLF
cQuery += " DTRUN " + CRLF
cQuery += ") VALUES " + CRLF
cQuery += "( " + CRLF
cQuery += "'" + AllTrim(aSysGrpDef[nX][1][1]) + "'," + CRLF
cQuery += "'" + Upper(AllTrim(aSysGrpDef[nX][1][2])) + "', " + CRLF
cQuery += "'" + Upper(AllTrim(aSysGrpDef[nX][1][3])) + "', " + CRLF
cQuery += "'" + DtoC( Date() ) + "' " + CRLF
cQuery += ")"
TCSQLEXEC(cQuery)
Next nX
EndIf
/*
* ULTIMA EXECUCAO - P_USUARIOS
*************************************************************************************/
cQuery := "SELECT DTRUN FROM P_USUARIOS (NOLOCK)"
If Select( cSqlAlias ) > 0
(cSqlAlias)->( dbCloseArea() )
EndIf
TCQUERY cQuery NEW ALIAS &cSqlAlias
lRun := .T.
If (cSqlAlias)->( !EoF() ) .And. DtoS(CtoD( (cSqlAlias)->DTRUN )) >= DtoS( Date() )
lRun := .F.
EndIf
(cSqlAlias)->( dbCloseArea() )
If lRun
/*
* USUARIOS
*************************************************************************************/
//TCDelFile("P_USUARIOS")
/*
cQuery := "CREATE TABLE P_USUARIOS " + CRLF
cQuery += "( " + CRLF
cQuery += " CODIGO VARCHAR(06), " + CRLF
cQuery += " USUARIO VARCHAR(50), " + CRLF
cQuery += " NOME VARCHAR(50), " + CRLF
cQuery += " EMAIL VARCHAR(50), " + CRLF
cQuery += " GRUPO VARCHAR(50), " + CRLF
cQuery += " SENHA VARCHAR(100)," + CRLF
cQuery += " DEPTO VARCHAR(100)," + CRLF
cQuery += " ULTLOG VARCHAR(100)," + CRLF
cQuery += " BLOQUEADO VARCHAR(03), " + CRLF
cQuery += " DTRUN VARCHAR(50), " + CRLF
cQuery += " PRIMARY KEY (CODIGO) " + CRLF
cQuery += ") " + CRLF
*/
cQuery := "DELETE FROM P_USUARIOS " + CRLF
TCSQLEXEC(cQuery)
For nX := 1 To Len(aSysUsuDef)
// Popula elemento
xUsrCodigo := aSysUsuDef[nX][01][01] //CODIGO
xUsrConta := Upper(FWSFUser(xUsrCodigo,"DATAUSER","USR_CODIGO",.F.)) //USUARIO
xUsrSenha := RTrim(FWSFUser(xUsrCodigo,"DATAUSER","USR_PSWMD5",.F.)) //SENHA
xUsrNome := Upper(FWSFUser(xUsrCodigo,"DATAUSER","USR_NOME",.F.)) //NOME
xUsrEmail := Upper(FWSFUser(xUsrCodigo,"DATAUSER","USR_EMAIL",.F.)) //EMAIL
xUsrGrupo := ""
xUsrDepto := Upper(FWSFUser(xUsrCodigo,"DATAUSER","USR_DEPTO",.F.)) //DEPARTAMENTO
xUsrBloq := RTrim(FWSFUser(xUsrCodigo,"DATAUSER","USR_MSBLQL",.F.)) //BLOQUEADO
xUsrUltLog := FWUsrUltLog(xUsrCodigo) //INFORMACOES DE LOGIN
// Obtem grupos de acesso do usuario
aGrupos := aSysUsuDef[nX][01][10]
For nZ := 1 To Len(aGrupos)
nPosGrp := aScan(aSysGrpDef, {|elem|AllTrim(elem[1][1]) == AllTrim(aGrupos[nZ])})
xUsrGrupo += Upper(AllTrim(aSysGrpDef[nPosGrp][1][2])) + "#"
Next nZ
cQuery := "INSERT INTO P_USUARIOS " + CRLF
cQuery += "(" + CRLF
cQuery += "CODIGO," + CRLF
cQuery += "USUARIO," + CRLF
cQuery += "NOME," + CRLF
cQuery += "EMAIL," + CRLF
cQuery += "GRUPO," + CRLF
cQuery += "SENHA," + CRLF
cQuery += "DEPTO," + CRLF
cQuery += "ULTLOG," + CRLF
cQuery += "BLOQUEADO," + CRLF
cQuery += "DTRUN" + CRLF
cQuery += ")" + CRLF
cQuery += "VALUES" + CRLF
cQuery += "(" + CRLF
cQuery += "'" + xUsrCodigo + "'," + CRLF
cQuery += "'" + xUsrConta + "'," + CRLF
cQuery += "'" + xUsrNome + "'," + CRLF
cQuery += "'" + xUsrEmail + "'," + CRLF
cQuery += "'" + xUsrGrupo + "'," + CRLF
cQuery += "'" + xUsrSenha + "'," + CRLF
cQuery += "'" + xUsrDepto + "'," + CRLF
cQuery += "'" + "DATA: " + DtoC(xUsrUltLog[1]) + " HORA: " + xUsrUltLog[2] + " WORKSTATION: " + xUsrUltLog[4] + "'," + CRLF
cQuery += "'" + IIf( xUsrBloq == "1", "SIM", "NAO" ) + "'," + CRLF
cQuery += "'" + DtoC(Date()) + "' " + CRLF
cQuery += ")"
TCSQLEXEC(cQuery)
Next nX
EndIf
/*
* ULTIMA EXECUCAO - P_EMPRESAS
*************************************************************************************/
cQuery := "SELECT DTRUN FROM P_EMPRESAS (NOLOCK)"
If Select( cSqlAlias ) > 0
(cSqlAlias)->( dbCloseArea() )
EndIf
TCQUERY cQuery NEW ALIAS &cSqlAlias
lRun := .T.
If (cSqlAlias)->( !EoF() ) .And. DtoS(CtoD( (cSqlAlias)->DTRUN )) >= DtoS( Date() )
lRun := .F.
EndIf
(cSqlAlias)->( dbCloseArea() )
lRun := .T.
If lRun
/*
* EMPRESAS
*************************************************************************************/
//TCDelFile("P_EMPRESAS")
/*
cQuery := "CREATE TABLE P_EMPRESAS " + CRLF
cQuery += "( " + CRLF
cQuery += " CODIGO VARCHAR(02), " + CRLF
cQuery += " FILIAL VARCHAR(02), " + CRLF
cQuery += " NFANTASIA VARCHAR(60), " + CRLF
cQuery += " RZSOCIAL VARCHAR(60), " + CRLF
cQuery += " CNPJ VARCHAR(20), " + CRLF
cQuery += " IE VARCHAR(20)," + CRLF
cQuery += " ENDERECO VARCHAR(60)," + CRLF
cQuery += " BAIRRO VARCHAR(60)," + CRLF
cQuery += " CIDADE VARCHAR(60)," + CRLF
cQuery += " ESTADO VARCHAR(02), " + CRLF
cQuery += " CEP VARCHAR(10), " + CRLF
cQuery += " TEL VARCHAR(20), " + CRLF
cQuery += " FAX VARCHAR(20), " + CRLF
cQuery += " DTRUN VARCHAR(50), " + CRLF
cQuery += " PRIMARY KEY (CODIGO,FILIAL) " + CRLF
cQuery += ") " + CRLF
*/
cQuery := "DELETE FROM P_EMPRESAS "
TCSQLEXEC(cQuery)
SM0->(DbGoTop())
Do While SM0->(!EoF())
cQuery := "INSERT INTO P_EMPRESAS " + CRLF
cQuery += "(" + CRLF
cQuery += "CODIGO," + CRLF
cQuery += "FILIAL," + CRLF
cQuery += "NFANTASIA," + CRLF
cQuery += "RZSOCIAL," + CRLF
cQuery += "CNPJ," + CRLF
cQuery += "IE," + CRLF
cQuery += "ENDERECO," + CRLF
cQuery += "BAIRRO," + CRLF
cQuery += "CIDADE," + CRLF
cQuery += "ESTADO," + CRLF
cQuery += "CEP," + CRLF
cQuery += "TEL," + CRLF
cQuery += "FAX," + CRLF
cQuery += "DTRUN" + CRLF
cQuery += ")" + CRLF
cQuery += "VALUES" + CRLF
cQuery += "(" + CRLF
cQuery += "'" + SM0->M0_CODIGO + "'," + CRLF
cQuery += "'" + SM0->M0_CODFIL + "'," + CRLF
cQuery += "'" + SM0->M0_FILIAL + "'," + CRLF
cQuery += "'" + SM0->M0_NOMECOM + "'," + CRLF
cQuery += "'" + SM0->M0_CGC + "'," + CRLF
cQuery += "'" + SM0->M0_INSC + "'," + CRLF
cQuery += "'" + SM0->M0_ENDCOB + "'," + CRLF
cQuery += "'" + SM0->M0_BAIRCOB + "'," + CRLF
cQuery += "'" + SM0->M0_CIDCOB + "'," + CRLF
cQuery += "'" + SM0->M0_ESTCOB + "'," + CRLF
cQuery += "'" + SM0->M0_CEPCOB + "'," + CRLF
cQuery += "'" + SM0->M0_TEL + "'," + CRLF
cQuery += "'" + SM0->M0_FAX + "'," + CRLF
cQuery += "'" + DtoC(Date()) + "' " + CRLF
cQuery += ")"
TCSQLEXEC(cQuery)
SM0->(dbSkip())
EndDo
EndIf
If lAuto
RpcClearEnv() // Libera o Environment
ConOut("GENF0001 - [ FIM ] Coletando informacoes de usuarios e grupos de acesso " + DtoC(Date()) + " - " + Time())
EndIf
RestArea( aAreaSM0 )
RestArea( aArea )
Return( Nil )
Fone.....: +55 11 99493-5465
Email....: tiago.beraldi@gtin.inf.br
LinkedIn.: linkedin/in/tiagoberaldi
Website..: https://gtin.inf.br/
Segue um exemplo que eu utilizo:
SELECT TOP 10 SUBSTRING(F2USERLGI, 3, 1)+SUBSTRING(F2_USERLGI, 7, 1)+ SUBSTRING(F2_USERLGI, 11,1)+SUBSTRING(F2_USERLGI, 15,1)+ SUBSTRING(F2_USERLGI, 2, 1)+SUBSTRING(F2_USERLGI, 6, 1)+ SUBSTRING(F2_USERLGI, 10,1)+SUBSTRING(F2_USERLGI, 14,1)+ SUBSTRING(F2_USERLGI, 1, 1)+SUBSTRING(F2_USERLGI, 5, 1)+ SUBSTRING(F2_USERLGI, 9, 1)+SUBSTRING(F2_USERLGI, 13,1)+ SUBSTRING(F2_USERLGI, 17,1)+SUBSTRING(F2_USERLGI, 4, 1)+ SUBSTRING(F2_USERLGI, 8, 1) Usuario_CRIAÇÃO FROM SF2010 ORDER BY R_E_C_N_O DESC
Para a data, podemos usar: SELECT TOP 10 CONVERT(VARCHAR, DATEADD(DAY, ((ASCII(SUBSTRING(F2USERLGA,12,1)) - 50) * 100 + (ASCII(SUBSTRING(F2_USERLGA,16,1)) - 50)), '19960101'), 112) FROM SF2010 ORDER BY R_E_C_N_O DESC
Obrigado Leandro. A sua query realmente retorna o código do usuário, mas eu precisava do nome. É um relatório em excel que estou usando, a query está no arquivo mesmo, eu gostaria de exibir o nome do usuário. Mas valeu pela ajuda mesmo assim.
— Thyago 28 de Jan de 2020Se você estiver já com o dicionário no banco acredito que seja possível fazer uma join SYS_USR. Caso contrário, somente utilizando a função em AdvPL. Paliativamente eu criaria uma tabela customizada no banco e criaria uma função para exportar os dados dos usuários nela (aliás, é o que eu faço hoje).
— Leandro Michelsen 29 de Jan de 2020Boa sugestão, mas meu dicionário ainda está nos arquivos. Vlw mesmo assim.
— Thyago 29 de Jan de 2020Com base na resposta do Leandro Michelsen eu construí o script abaixo que trás os dados do usuário vinculando o XX_USERLGI
e XX_USERLGA ao cadastro de usuários (USR).
Usei como exemplo a tabela SB1 no Microsoft SQL Server e adicionei um CASE que verifica se houve alteração no registro, trazendo assim o B1_USERLGA
e não o B1_USERLGI
:
SELECT
-- Campos do cadastro de usuário
USR.USR_ID,
USR.USR_CODIGO,
USR.USR_NOME
FROM
SB1990 SB1 -- Tabela de produtos
INNER JOIN
SYS_USR USR -- Tabela de usuários (dicionário no banco)
ON
CASE
-- Verifica se houve alteração (B1_USERLGA com a 11ª posição preenchida)
-- Caso sim, use B1_USERLGA, caso não, usa B1_USERLGI
WHEN (SUBSTRING(SB1.B1_USERLGA, 11, 1) != ' ') THEN
SUBSTRING(SB1.B1_USERLGA, 11, 01) + SUBSTRING(SB1.B1_USERLGA, 15, 01) + SUBSTRING(SB1.B1_USERLGA, 02, 01) +
SUBSTRING(SB1.B1_USERLGA, 06, 01) + SUBSTRING(SB1.B1_USERLGA, 10, 01) + SUBSTRING(SB1.B1_USERLGA, 14, 01)
ELSE
SUBSTRING(SB1.B1_USERLGI, 11, 01) + SUBSTRING(SB1.B1_USERLGI, 15, 01) + SUBSTRING(SB1.B1_USERLGI, 02, 01) +
SUBSTRING(SB1.B1_USERLGI, 06, 01) + SUBSTRING(SB1.B1_USERLGI, 10, 01) + SUBSTRING(SB1.B1_USERLGI, 14, 01)
END = USR.USR_ID
WHERE
SB1.D_E_L_E_T_ = ' '
Obs: Caso precisem converter a query acima para outro SGBD, recomendo este site aqui: https://www.sqlines.com/online