USERLGI E DATALGI. RECUPERANDO PELO MSSQLSERVER

USERLGI E DATALGI. RECUPERANDO PELO MSSQLSERVER
Author: Eurai
Inclusão: 01/01/2016
Alteração: 27/07/2021

Olá, Seja Bem-vindo!!!

 

 

 

Hoje vou postar como recuperar os valores dos campos UserLGI / UserLGA, tanto para usuário quanto data.

 

Ambos são embaralhados pelo protheus.

 

Pelo ADVPL existem funções especificas para recuperar os valores, não conheço o autor dessas duas functions do MSSQLServer.

 

 

 

 

 

Para começar, é preciso criar essas duas functions no seu banco de dados, ou seja, se o seu banco de dados é PRODUCAO, é necessário criar as 2 functions nesse banco.

 

Function 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
	--para definir a data da alteracao
	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

 

 Segunda Function.

 

 

Function 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) --+SUBSTRING(@userlgi,12,1)+SUBSTRING(@userlgi,16,1)

	RETURN(@Retorno)

END

 

Agora para completar, basta criar seu SELECT executando essas functions no campo desejado. Exemplo

 

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 function retorna o ID do usuário e não seu nome.

Caso precise do nome, você pode criar função para ler o SIGAPSS e gravar o ID e Nome em uma tabela customizada, após criado e inserido os registros, basta criar INNER JOIN

 

 

 

 


Vitor Emanuel Batistasays - 05/01/2016 às 16:44

Segue abaixo uma outra maneira de recuperar 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

 

 

 

 

 

 

Esse conteúdo te ajudou? Ajude o canal com doação
Compartilhar
Comentários