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?
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.
Se 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).
Boa sugestão, mas meu dicionário ainda está nos arquivos. Vlw mesmo assim.
No SQL não é possível.
Há algumas funções do advpl que podem resolver o problema.
Aconselho usar o FWSFALLUSERS().
Com 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