🔐 USERLGI e DATALGI – Recuperando valores pelo MS SQL Server
Olá, seja muito bem-vindo! 😄
Hoje vou demonstrar como recuperar corretamente os valores dos campos UserLGI e UserLGA, tanto para usuário quanto para data, diretamente pelo MS SQL Server.
Esses campos são embaralhados pelo Protheus e, apesar de no ADVPL existirem funções nativas para tratá-los, no SQL precisamos criar funções específicas. Não conheço o autor original dessas duas functions, mas elas funcionam perfeitamente. 👍
Para começar, você deve criar as duas functions no seu banco de dados. Se o banco é PRODUÇÃO, crie diretamente nele.
📅 Função datalgi_normal
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION
[dbo].[datalgi_normal] (@userlgi varchar(20))
RETURNS varchar(20)
AS
BEGIN
DECLARE @Retorno datetime
DECLARE @_1stChar varchar(1)
DECLARE @_2ndChar varchar(1)
DECLARE @_1stFimChar varchar(2)
DECLARE @_2ndFimChar varchar(2)
DECLARE @nBase int = 50
DECLARE @_1stNum int
DECLARE @_2ndNum int
DECLARE @fullNum int
--Defino os caracteres que compoe a data
SET @_1stChar = SUBSTRING(@userlgi,12,1)
SET @_2ndChar = SUBSTRING(@userlgi,16,1)
--Pego o ASCII deles menos a base que eh 50
SET @_1stNum = ascii(@_1stChar)-@nBase
SET @_2ndNum = ascii(@_2ndChar)-@nBase
if @_1stNum < 0 or @_1stNum > 99
begin
SET @_1stNum = 0
end
if @_2ndNum < 0 or @_2ndNum > 99
begin
SET @_2ndNum = 0
end
SET @_1stFimChar = case @_1stNum when 0 then '' else CAST(@_1stNum as varchar(2)) end
SET @_2ndFimChar = case @_2ndNum when 0 then '' else CAST(@_2ndNum as varchar(2)) end
--A concatenacao dos dois numeros forma o milhar que eh somado a data
SET @fullNum = CAST(@_1stFimChar+@_2ndFimChar as int)
SET @Retorno = DATEADD(Day,@fullNum,convert(datetime, '01/01/1996', 101))
RETURN (convert(varchar(20),@Retorno,112))
END
GO
👤 Função userlgi_normal
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION
[dbo].[userlgi_normal] (@userlgi varchar(20))
RETURNS varchar(20)
AS
BEGIN
DECLARE @Retorno varchar(20)
SET @Retorno = SUBSTRING(@userlgi,3,1)+SUBSTRING(@userlgi,7,1)+SUBSTRING(@userlgi,11,1)+SUBSTRING(@userlgi,15,1)
SET @Retorno = @Retorno + SUBSTRING(@userlgi,19,1)+SUBSTRING(@userlgi,2,1)+SUBSTRING(@userlgi,6,1)+SUBSTRING(@userlgi,10,1)
SET @Retorno = @Retorno + SUBSTRING(@userlgi,14,1)+SUBSTRING(@userlgi,18,1)+SUBSTRING(@userlgi,1,1)+SUBSTRING(@userlgi,5,1)
SET @Retorno = @Retorno + SUBSTRING(@userlgi,9,1)+SUBSTRING(@userlgi,13,1)+SUBSTRING(@userlgi,17,1)+SUBSTRING(@userlgi,4,1)
SET @Retorno = @Retorno + SUBSTRING(@userlgi,8,1)
RETURN(@Retorno)
END
📊 Exemplo de SELECT usando as funções
SELECT
B1_COD, B1_DESC, USUARIO, MAX(DATA)
FROM
(
SELECT
B1_COD, B1_DESC,
dbo.userlgi_normal(B1_USERLGA) USUARIO,
dbo.datalgi_normal(B1_USERLGA) DATA
FROM SB1010 SB1
WHERE
D_E_L_E_T_ != '*'
AND B1_USERLGA != ''
) AS dados
WHERE
DATA > '20110101'
GROUP BY
B1_COD, B1_DESC, USUARIO
ORDER BY
USUARIO
A função retorna o ID do usuário, e não o nome. Se quiser o nome, você pode montar uma tabela customizada com ID + Nome, preenchê-la com base no SIGAPSS e depois fazer um INNER JOIN. 😉
📝 Alternativa enviada por Vitor Emanuel Batista (05/01/2016)
Outra forma de calcular a data:
SELECT TOP 10
CONVERT(VARCHAR,
DATEADD(DAY,
((ASCII(SUBSTRING(F2_USERLGA,12,1)) - 50) * 100 +
(ASCII(SUBSTRING(F2_USERLGA,16,1)) - 50)),
'19960101'),
112)
FROM SF2010
ORDER BY R_E_C_N_O_ DESC
Gostou? Compartilhe com seus amigos e deixe um comentário! 😎
Um abraço e até a próxima! 👋