Ajude o site desativando o bloqueador de anúncio
Cabeçalho

USERLGI E DATALGI. RECUPERANDO PELO MSSQLSERVER

Autor: Eurai Criado: 01/01/2016 Atualizado: 22/11/2025 SQLServer
Postagem

🔐 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! 👋

ASSINE A NEWSLETTER

Cadastrando...

PIX uDesenv

PIX QR Code para depósito

Clique para doar

Parceiros

Tudo em ADVPL - Blog parceiro

Blog ADVPL