quarta-feira, 2 de julho de 2014

Descriptografar campos USERLGI - USERLGA via SQL

Bom dia Galera, 
Para verificar quem foi o usuário que incluiu/alterou algum registro sem a necessidade de acessar o log do Protheus, utilizem a seguinte query:

SELECT substr(E2_userlgi, 3, 1) || substr(E2_userlgi, 7, 1) ||
        substr(E2_userlgi, 11, 1) || substr(E2_userlgi, 15, 1) ||
        substr(E2_userlgi, 2, 1) || substr(E2_userlgi, 6, 1) ||
        substr(E2_userlgi, 10, 1) || substr(E2_userlgi, 14, 1) ||
        substr(E2_userlgi, 1, 1) || substr(E2_userlgi, 5, 1) ||
        substr(E2_userlgi, 9, 1) || substr(E2_userlgi, 13, 1) ||
        substr(E2_userlgi, 17, 1) || substr(E2_userlgi, 4, 1) ||
        substr(E2_userlgi, 8, 1) Usuario
FROM TABELA 
WHERE
  CONDIÇÃO


Na imagem abaixo utilizamos a query para identificar o usuário que incluiu e o ultimo que alterou os títulos no contas a pagar da filial '01' com emissão a partir de 01/06/2014.




*Obs.:   USERLGI --> Usuário que incluiu o registro.
            USERLGA --> Ultimo usuário que alterou o registro.

Espero ter ajudado!

17 comentários:

  1. Fantástico.

    Segue versão que pode ser usado em MSSQL 2008:

    SELECT TOP 10
    SUBSTRING(F2_USERLGI, 3, 1)+SUBSTRING(F2_USERLGI, 7, 1)+
    SUBSTRING(F2_USERLGI, 11,1)+SUBSTRING(F2_USERLGI, 15,1)+
    SUBSTRING(F2_USERLGI, 2, 1)+SUBSTRING(F2_USERLGI, 6, 1)+
    SUBSTRING(F2_USERLGI, 10,1)+SUBSTRING(F2_USERLGI, 14,1)+
    SUBSTRING(F2_USERLGI, 1, 1)+SUBSTRING(F2_USERLGI, 5, 1)+
    SUBSTRING(F2_USERLGI, 9, 1)+SUBSTRING(F2_USERLGI, 13,1)+
    SUBSTRING(F2_USERLGI, 17,1)+SUBSTRING(F2_USERLGI, 4, 1)+
    SUBSTRING(F2_USERLGI, 8, 1) Usuario_CRIAÇÃO
    FROM SF2010
    ORDER BY R_E_C_N_O_ DESC

    SELECT TOP 10 F2_DOC,
    SUBSTRING(F2_USERLGA, 3, 1)+SUBSTRING(F2_USERLGA, 7, 1)+
    SUBSTRING(F2_USERLGA, 11,1)+SUBSTRING(F2_USERLGA, 15,1)+
    SUBSTRING(F2_USERLGA, 2, 1)+SUBSTRING(F2_USERLGA, 6, 1)+
    SUBSTRING(F2_USERLGA, 10,1)+SUBSTRING(F2_USERLGA, 14,1)+
    SUBSTRING(F2_USERLGA, 1, 1)+SUBSTRING(F2_USERLGA, 5, 1)+
    SUBSTRING(F2_USERLGA, 9, 1)+SUBSTRING(F2_USERLGA, 13,1)+
    SUBSTRING(F2_USERLGA, 17,1)+SUBSTRING(F2_USERLGA, 4, 1)+
    SUBSTRING(F2_USERLGA, 8, 1) Usuario_ALTERAÇÃO
    FROM SF2010
    ORDER BY R_E_C_N_O_ DESC

    ResponderExcluir
  2. Cara, absurdamente útil!!! vlw d+

    ResponderExcluir
  3. Este comentário foi removido pelo autor.

    ResponderExcluir
  4. Segue script que pega a data de alteração:

    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

    Fabricio Xavier - Sigaweb

    ResponderExcluir
    Respostas
    1. Precisei hoje das 2 versões: SQL e Oracle. Graças ao Fabricio, segue versão Oracle (onde xxx=tabela):

      TO_DATE('19960101', 'YYYYMMDD')+((ASCII(SUBSTR(xxx_USERLGA,12,1))-50)*100+(ASCII(SUBSTR(xxx_USERLGA,16,1))-50)) as USERLGA

      Obs.: em ambas as versões SQL e Oracle, caso o campo LGI/LGA esteja vazio (controle de LGI/LGA criado após o registro) o resultado será '19910109'.

      Excluir
  5. Tem para ORACLE a geracao da data de alteracao?

    ResponderExcluir
  6. Bom dia,
    Para finalidade documentação, o sistema possui uma função nativa que retorna o a data e o nome do usuário presentes nos campos em questão.

    Função
    FWLeUserlg

    Link:
    https://tdn.totvs.com/pages/releaseview.action?pageId=6814934

    ResponderExcluir
    Respostas
    1. Bem lembrado, porem a minha necessidade na época era retornar o código via SQL mesmo...

      Excluir
    2. SELECT F2_DOC, F2_SERIE, F2_HORNFE, F2_HORA, F2_CHVNFE, F2_USERLGI, F2_USERLGA,

      SUBSTRING(F2_USERLGI, 11, 1) + SUBSTRING(F2_USERLGI, 15, 1) +
      SUBSTRING(F2_USERLGI, 2, 1) + SUBSTRING(F2_USERLGI, 6, 1) +
      SUBSTRING(F2_USERLGI, 10, 1) + SUBSTRING(F2_USERLGI, 14, 1) CODIGO_USUARIO
      , INC.USR_CODIGO NOME_USUARIO_INCLUSAO , ALT.USR_CODIGO NOME_USUARIO_ALTERACAO



      FROM SF2010 SF2

      LEFT JOIN SYS_USR INC ON INC.USR_ID = SUBSTRING(F2_USERLGI, 11, 1) + SUBSTRING(F2_USERLGI, 15, 1) + SUBSTRING(F2_USERLGI, 2, 1) + SUBSTRING(F2_USERLGI, 6, 1) + SUBSTRING(F2_USERLGI, 10, 1) + SUBSTRING(F2_USERLGI, 14, 1)
      LEFT JOIN SYS_USR ALT ON ALT.USR_ID = SUBSTRING(F2_USERLGA, 11, 1) + SUBSTRING(F2_USERLGA, 15, 1) + SUBSTRING(F2_USERLGA, 2, 1) + SUBSTRING(F2_USERLGA, 6, 1) + SUBSTRING(F2_USERLGA, 10, 1) + SUBSTRING(F2_USERLGA, 14, 1)

      WHERE F2_EMISSAO = '20230901'
      ORDER BY SF2.R_E_C_N_O_

      Excluir
  7. Esse comando informa o Id. Tem alguma forma de trazer o usuario?

    ResponderExcluir
  8. Por si les sirve, yo lo que hice fue conseguir algún dato del usuario que registró o alteró un campo,
    /*/{Protheus.doc} cGetMailAnt
    Consigue el email del usuario que incluyó un registro en el campo que se envió, es
    necesario que primero se posicionen en la tabla y registro a buscar antes de ejecutar esta
    función
    @type function
    @version 1.0
    @author christian.navarro
    @since 9/19/2023
    @param cCampo, character, F1_USRLGI,F2_USRLGI,1_USRLGI,ETC
    @return variant, return_email del sigapss.spf
    /*/
    User Function cGetMailAnt(cCampo)
    Local cMail := ""
    Local aUser := {}

    PswOrder(2)
    PSWSEEK(FWLeUserLg(cCampo))//Busca por el login del usuario
    aUser := PSWRET()
    If Len(aUser) > 0
    cMail:= aUser[1,14]
    EndIf

    Return cMail

    ResponderExcluir