USERLGI E DATALGI. RECUPERANDO PELO MSSQLSERVER
Autor: Eurai Criado: 01/01/2016 Atualizado: 27/07/2021Olá, 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