Pular para o conteúdo principal

Postagens

Recursividade Minha Linda! Estrutura Produtos Protheus SG1

Fato! Depois que você conhece recursividade em sua vida tudo fica mais leve (rss... ) a recursividade pode ser infinita (pode não ta!) se for infinita vai dar problema, não pode. Mas a recursividade nos ajuda a deixar nosso sistema mais flexível e dinâmico para montar uma série de regras de negócio. Hoje vou falar exatamente da SG1, tabela TOTVS Microsiga Protheus que é utilizada para montar a estrutura de um produto dentro PCP (Planejamento e Controle de Produção). Isso séria algo que a recursividade iria ajudar. Na SG1 temos o campos G1_COD (Pai) e G1_COMP (Filho). G1_COD->G1_COMP->G1_COD->G1_COMP->G1_COD->G1_COMP Seria assim o fluxo da informação. Sem mais delongas, abaixo vou deixar o script para MSSQL para apresentar esses dados. Inté! WITH ESTRUT( CODIGO, COD_PAI, COD_COMP, QTD, PERDA, DT_INI, DT_FIM ,TRT ,RECNO, NIVEL ) AS ( SELECT G1_COD PAI, G1_COD, G1_COMP, G1_QUANT, G1_PERDA, G1_INI, G1_FIM,G1_TRT,SG1.R_E_C_N_O_, 1 AS NIVEL FR...

REST Protheus Converter charset CP1252 para UTF8 com Header Accept UTF-8

O Protheus possui um tag que pode ser utilizada para conversão para UTF8 de forma transparente, basta enviar no header da requisição a TAG ACCEPT com charset=UTF-8, também pode-se adicionar o appllication/json. Accept : application/json; charset=UTF-8 ou Accept : charset=UTF-8 Isso ajuda pois não precisa mais utilizar as funções DecodeUTF8 e EncodeUT8 pois o próprio rest já vai fazer isso.

Appserver Protheus Rest - TLS 1.2

A partir da release 17.3.0.20 vai estar disponível no rest as tags: TLS1=3 que ativa o TLS 1.2 State=1 Bugs=1 O rest do Protheus somente funcionava até o TLS 1.0, ao qual muitos navegadores já estão descontinuando suporte. [HTTPREST] Port=56650 URIs=HTTPURI SECURITY=1 VERBOSE=0 SSL2=1 SSL3=1 TLS1=3 Bugs=1 State=1

[Protheus] - Troca de RPO

Fala povo da internet! :) Estava precisando melhorar a aplicação de patchs e troca de RPO para o sistema TOTVS Microsiga Protheus, utilizava um script de outra pessoa, mas sempre podemos melhorar algo, então comecei um em powershell. Até pensei em fazer com .bat da vida, massss... pensei... vamos aprender algo novo, confesso que imaginei que iria possuir muita dificuldade para criação, mas a quantidade de material e ajuda disponivel na net e incrível. Bem, está pronto e funcionando, caso alguém tiver interresse está no GIT -> https://github.com/charlesreitz/managerRPO Entom! até a próxima... https://github.com/charlesreitz/managerRPO
Esses dias estava precisando montar algo para apresentar o tempo que uma determinada rotina, uma parte eu pesquisei e consegui um função pronta, outra parte foi montada. Compartilhando abaixo a idéia. /*/{Protheus.doc} TempRest Exemplo de chamada da função. ** Fonte não compilado, pode haver erros de sintaxe. /*/ User Function APrefHR() Local nTimeIni := Seconds() Local nI := 1 Local nFim = 50000 For Ni := 1 To nFIm conout(U_TempRest(nI, nFim,nTimeIni)[4]) Next Return Nil /*/{Protheus.doc} TempRest Faz o calculo de tempo restante para um processo @author TSC679 - CHARLES REITZ @since 12/07/2016 @param nTotaisP, numeric, descricao @param nIncrement, numeric, descricao @param nTimeIni, numeric, descricao @return return, return_description /*/ User Function TempRest(nTotaisP,nIncrement,nTimeIni) Local cTempoRest := "" Local nHoraRest := 0 LOcal nSecAtual := seconds() Local aRetFun := {nil,nil,nil,ni...
Outro exemplo de exclusão de registro duplicado, buscando o maior registro. BEGIN TRAN DECLARE @ID VARCHAR(500) DECLARE @CONT int DECLARE CUR_DELETE CURSOR FOR SELECT A1_FILIAL+A1_CGC FROM SA1200 WHERE D_E_L_E_T_ = ' ' GROUP BY A1_FILIAL+A1_CGC HAVING COUNT(*) > 1 OPEN CUR_DELETE FETCH NEXT FROM CUR_DELETE INTO @ID WHILE @@FETCH_STATUS = 0 BEGIN UPDATE SA1200 SET D_E_L_E_T_ = '*' WHERE R_E_C_N_O_ = (Select max(R_E_C_N_O_) From SA1200 t2 Where A1_FILIAL+A1_CGC = @ID ) FETCH NEXT FROM CUR_DELETE INTO @ID END

MSSQL - Remover itens duplicados

Muitas vezes, faz necessário eliminar informações duplicadas, existe algumas formas de realizar essa tarefa. Abaixo segue uma forma de fazer. Explicação rápida, ele conta o total de duplicados, deixando sempre 1 (TOP(@CONT -1)). Esse script foi testando no MSSQL 2008, 2012 e 2014. DECLARE @ID VARCHAR(500) DECLARE @CONT int DECLARE CUR_DELETE CURSOR FOR SELECT N4_FILIAL+N4_CBASE+N4_ITEM+N4_TIPO+N4_OCORR+N4_TIPOCNT+N4_CONTA+N4_DATA+N4_SEQREAV, COUNT(*) FROM SN4010 WHERE D_E_L_E_T_ = ' ' AND N4_FILIAL = '01' --AND N4_ITEM = '07' AND N4_CBASE = 'BR0016 ' AND N4_DATA = '20100831' GROUP BY N4_FILIAL+N4_CBASE+N4_ITEM+N4_TIPO+N4_OCORR+N4_TIPOCNT+N4_CONTA+N4_DATA+N4_SEQREAV HAVING COUNT(*) > 1 OPEN CUR_DELETE FETCH NEXT FROM CUR_DELETE INTO @ID,@CONT WHILE @@FETCH_STATUS = 0 BEGIN UPDATE TOP(@CONT -1) SN4010 SET D_E_L_E_T_ = '*' WHERE N4_FILIAL+N4_CBASE+N4_ITEM+N4_TIPO+N4_OCORR+N4_TIPOCNT+N4_CONTA+N4_DATA+N4_SEQREAV = @ID FETCH NEXT...