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!
Fantástico.
ResponderExcluirSegue 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
Cara, absurdamente útil!!! vlw d+
ResponderExcluirEste comentário foi removido pelo autor.
ResponderExcluirSegue script que pega a data de alteração:
ResponderExcluirSELECT 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
Ninja
ExcluirTeria para Oracle?
ExcluirPrecisei hoje das 2 versões: SQL e Oracle. Graças ao Fabricio, segue versão Oracle (onde xxx=tabela):
ExcluirTO_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'.
Bem prático e funcional!
ResponderExcluirMuito boa a dica! Salvou aqui!
ResponderExcluirMuito Util! Parabens e obrigado!
ResponderExcluirTem para ORACLE a geracao da data de alteracao?
ResponderExcluirBom dia,
ResponderExcluirPara 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
Bem lembrado, porem a minha necessidade na época era retornar o código via SQL mesmo...
ExcluirChame a função CFGX025.prw
ExcluirSELECT F2_DOC, F2_SERIE, F2_HORNFE, F2_HORA, F2_CHVNFE, F2_USERLGI, F2_USERLGA,
ExcluirSUBSTRING(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_
Esse comando informa o Id. Tem alguma forma de trazer o usuario?
ResponderExcluirPor si les sirve, yo lo que hice fue conseguir algún dato del usuario que registró o alteró un campo,
ResponderExcluir/*/{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