UserLGI e DataLGI. Recuperando pelo MSSQLServer

UserLGI e DataLGI. Recuperando pelo MSSQLServer

 

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


[codesyntax lang="sql" title="Código Fonte" bookmarkname="Universo ADVPL"]

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

[/codesyntax]

 

Segunda Function.

 

Function userlgi_normal


 

[codesyntax lang="sql" title="Código Fonte" bookmarkname="Universo ADVPL"]

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

[/codesyntax]

 

 

 

 

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

 

[codesyntax lang="sql" title="Código Fonte" bookmarkname="Universo ADVPL"]

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

[/codesyntax]

 

 

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

 

 

Deixe seu comentário abaixo, assine nossa lista de e-mail e inscreva-se no nosso canal.

Um abraço, e até a próxima

12 respostas
  1. Vitor Emanuel Batista
    Vitor Emanuel Batista says:

    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

    Responder
  2. Thiago Rasmussen
    Thiago Rasmussen says:

    Testando as funções acima, encontrei a seguinte inconsistência:

    C7_USERLGI = " 0# 6@ 70q 00: "

    SELECT dbo.datalgi_normal(C7_USERLGI) – Retorna: 19970930

    E como nessa data "30/09/1997" ainda não tínhamos implantado o sistema, resolvi certificar essa data pela opção "Consulta LOG de Registros" do Protheus, que me retorna outra data, por sinal mais coerente. 09/04/2013

    Responder
    • Universo ADVPL
      Universo ADVPL says:

      Fala aeeee..
      São todos registros ou a partir de alguma data?
      Pode ser que antigamente usavam um tipo de embaralhamento no campo e mudaram depois. Compara também conteúdo sem desembaralhar dos campos, ver se nota diferença entre eles.

      Responder
      • Thiago Rasmussen
        Thiago Rasmussen says:

        Opa, beleza?

        Não são todos registros não e também não é a partir de uma determinada data. E como a opção "Consulta LOG de Registros", do Protheus está lendo a informação desses registros, acredito que seja um detalhe nessa função. Estou utilizando o Protheus 11 e SQL Server 2008 R2.

        Caso você queira analisar, me comunique que eu te mando essa tabela.

        Responder

Deixe uma resposta

Want to join the discussion?
Feel free to contribute!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *