tag:blogger.com,1999:blog-9801857643586952212024-03-15T22:10:39.880-03:00BlackTDNReverberando "TUDO EM ADVPL" & etc.иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.comBlogger738125tag:blogger.com,1999:blog-980185764358695221.post-24928624590248886182023-12-14T14:06:00.004-03:002023-12-21T11:28:25.948-03:00BlackTDN :: Implementando a Função u_getSM0EmpFilByCNPJ para uso no TOTVS Microsiga Protheus<pre class="markdown">
#Implementando a Função u_getSM0EmpFilByCNPJ em TOTVS Protheus
Hoje vamos explorar uma função bastante útil desenvolvida em TLPP Protheus, chamada-se u_getSM0EmpFilByCNPJ.
Essa função é responsável por buscar o código da Empresa/Filial utilizando o CNPJ da empresa como parâmetro.
Vamos entender como ela funciona.
```tlpp
#include "totvs.ch"
function u_getSM0EmpFilByCNPJ(cCNPJ as character) as json
static oHashMapSM0EmpFilByCNPJ:=tHashMap():New() as object
local aFiliais as array
local aEmpresas as array
local aFWArrFilAtu as array
local cCodEmp as character
local cCodFil as character
local cEmpFil as character
local jEmpFil as json
local jGetEmpFil as json
local nFilAtu as numeric
local nFilial as numeric
local nFiliais as numeric
local nEmpresa as numeric
local nEmpresas as numeric
jEmpFil:=JSONObject():New()
jEmpFil["cEmpAnt"]:=cEmpAnt
jEmpFil["cFilAnt"]:=cFilAnt
begin sequence
cCNPJ:=allTrim(cCNPJ)
cCNPJ:=strTran(cCNPJ,"/","")
cCNPJ:=strTran(cCNPJ,".","")
cCNPJ:=strTran(cCNPJ,"-","")
if (empty(cCNPJ))
break
endif
if (oHashMapSM0EmpFilByCNPJ:Get(cCNPJ,@jGetEmpFil))
if (;
(valType(jGetEmpFil)=="J");
.and.;
(jEmpFil:HasProperty("cEmpAnt"));
.and.;
(jEmpFil:HasProperty("cFilAnt"));
)
jEmpFil["cEmpAnt"]:=jGetEmpFil["cEmpAnt"]
jEmpFil["cFilAnt"]:=jGetEmpFil["cFilAnt"]
break
endif
endif
aEmpresas:=aClone(FWAllCompany())
nEmpresas:=Len(aEmpresas)
for nEmpresa:=1 to nEmpresas
cCodEmp:=aEmpresas[nEmpresa]
aFiliais:=aClone(FWAllFilial(cCodEmp))
nFiliais:=Len(aFiliais)
for nFilial:=1 To nFiliais
cCodFil:=aFiliais[nFilial]
for nFilAtu:=1 to nFiliais
cEmpFil:=(cCodEmp+aFiliais[nFilAtu])
aFWArrFilAtu:=aClone(FWArrFilAtu(cCodFil,cEmpFil))
if (Empty(aFWArrFilAtu).or.Len(aFWArrFilAtu)<18)
//Não encontrou Empresa/Filial?
FWFreeArray(@aFWArrFilAtu)
loop
endif
if (cCNPJ==aFWArrFilAtu[18])
//Armazena em Cache
jGetEmpFil:=JSONObject():New()
jGetEmpFil["cEmpAnt"]:=aFWArrFilAtu[1]
jGetEmpFil["cFilAnt"]:=aFWArrFilAtu[2]
oHashMapSM0EmpFilByCNPJ:Set(cCNPJ,jGetEmpFil)
//Define o Retorno
jEmpFil["cEmpAnt"]:=jGetEmpFil["cEmpAnt"]
jEmpFil["cFilAnt"]:=jGetEmpFil["cFilAnt"]
break
endif
FWFreeArray(@aFWArrFilAtu)
next nFilAtu
next nFilial
FWFreeArray(@aFiliais)
next nEmpresa
end sequence
FWFreeArray(@aFiliais)
FWFreeArray(@aEmpresas)
FWFreeArray(@aFWArrFilAtu)
return(jEmpFil)
```
*Entendendo a Função
Entrada de Parâmetro:
A função recebe como parâmetro o CNPJ da empresa que você deseja obter o código da Empresa/Filial.
Tratamento do CNPJ:
O CNPJ passa por um processo de limpeza, removendo caracteres como "/", ".", e "-".
Cache de Resultados:
Utiliza um objeto tHashMap (oHashMapSM0EmpFilByCNPJ) para armazenar resultados previamente obtidos, evitando consultas repetidas.
Consulta e Armazenamento em Cache:
A função faz consultas utilizando a biblioteca FW (Framework) do TOTVS Protheus para obter informações sobre empresas e filiais.
Caso encontre o CNPJ desejado, os resultados são armazenados em cache para consultas futuras.
Retorno:
Retorna um objeto JSON contendo os códigos da Empresa e Filial correspondentes ao CNPJ informado.
*Utilização:
```tlpp
// Exemplo de Uso
local jResult as json
jResult := u_getSM0EmpFilByCNPJ("12345678901234")
```
*(sys.partitions)*
----
*O ChatGPT colaborou com esta publicação*
</pre>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-55204660333225946302023-11-12T15:05:00.002-03:002024-01-20T12:45:31.905-03:00BlackTDN:: Hacker do Bem :: Protheus Injection <a href="https://www.linkedin.com/posts/marinaldo-de-jesus-66392346_newpost-sql-cybersecurity-activity-7129512128847183872-MDrr?utm_source=share&utm_medium=member_android">Protheus Injection </a>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-74324050500001180402023-10-13T13:48:00.010-03:002023-10-14T12:50:03.049-03:00BlackTDN :: MSSQL :: Identificando e Removendo Tabelas Vazias no Ambiente de Teste do Sistema ERP TOTVS Microsiga Protheus<pre class="markdown"># Identificando e Removendo Tabelas Vazias no Ambiente de Teste do Sistema ERP TOTVS Microsiga Protheus
No universo da tecnologia e dos sistemas empresariais, a organização e manutenção de bancos de dados desempenham um papel crucial. O sistema ERP (Enterprise Resource Planning) da TOTVS Microsiga Protheus é uma das principais soluções utilizadas por empresas para gerenciar recursos e informações. Nesse contexto, é fundamental garantir que o banco de dados do Protheus esteja otimizado e livre de informações desnecessárias.
Neste artigo, apresentamos um script SQL, para MSSQL, que seleciona todas as tabelas vazias em uma base de teste do sistema ERP da TOTVS Microsiga Protheus e gera instruções para eliminá-las.
```sql
-- Este script SQL foi desenvolvido para ambiente de teste. Execute com responsabilidade.
WITH t AS (
SELECT t.TABLE_SCHEMA
,t.TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES t
WHERE SUBSTRING(t.TABLE_NAME, 4, 3) = '990'
AND LEFT(t.TABLE_NAME, 3) NOT IN ('SXP', 'SXK', 'SXT', 'SXV')
)
SELECT 'DROP TABLE [' + t.TABLE_SCHEMA + '].[' + t.TABLE_NAME + ']' AS QDROP
FROM sys.partitions p
RIGHT JOIN t ON OBJECT_NAME(OBJECT_ID)=t.TABLE_NAME
WHERE OBJECT_NAME(OBJECT_ID)=t.TABLE_NAME
AND OBJECTPROPERTY(OBJECT_ID, 'ISUSERTABLE') = 1
AND SUBSTRING(OBJECT_NAME(OBJECT_ID), 4, 3) = '990'
AND LEFT(OBJECT_NAME(OBJECT_ID), 3) NOT IN ('SXP', 'SXK', 'SXT', 'SXV')
AND SUBSTRING(t.TABLE_NAME, 4, 3) = '990'
AND LEFT(t.TABLE_NAME, 3) NOT IN ('SXP', 'SXK', 'SXT', 'SXV')
AND p.ROWS = 0
GROUP BY t.TABLE_SCHEMA
,t.TABLE_NAME
ORDER BY t.TABLE_NAME
```
*(sys.partitions)*
Este script SQL executa uma série de verificações para identificar as tabelas que estão vazias e atendem a critérios específicos. Primeiramente, ele procura por tabelas cujos nomes têm '990' na quarta, quinta e sexta posições, o que pode ser uma convenção no sistema Protheus. Além disso, ele não exclui tabelas que começam com 'SXP', 'SXK', 'SXT', ou 'SXV': presumivelmente tabelas do sistema que não devem ser removidas.
Em seguida, a consulta verifica se essas tabelas vazias são realmente tabelas de usuário (não tabelas do sistema) e se possuem zero registros. Se todas essas condições forem atendidas, a consulta gera uma instrução SQL para remover a tabela.
Isso facilita o trabalho de administradores de banco de dados e desenvolvedores do sistema Protheus, permitindo-lhes identificar e remover tabelas vazias que não contribuem para o funcionamento eficiente do sistema, liberando recursos e espaço em disco.
Lembre-se de que, antes de executar uma instrução `DROP TABLE`, é crucial fazer backup dos dados, realizar testes em um ambiente de teste e garantir que a exclusão da tabela vazia seja realmente segura e desejada. A manutenção adequada do banco de dados é essencial para um desempenho consistente e eficiente do sistema ERP Protheus.
----
*O ChatGPT colaborou com esta publicação*
</pre>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-84891226460926643382023-10-13T12:26:00.002-03:002023-10-13T12:31:58.837-03:00BlackTDN :: PWSH :: Importação Eficiente de Dados do Excel para o MSSQL com PowerShell<pre class="markdown"># Importação Eficiente de Dados do Excel para o MSSQL com PowerShell
![Importação de Dados](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiF0QZFtxlHkjyMinV7xux5AH_pkKT1FllOWSp2nd7_Mmf26uI9CwDZVnDeFbae6Mozjcmp1WLB7s-qPnachWb6EhOK-OHW5B7YBkiWR_GntbFWtq0sW93PjSeWXJgNxHjrXStiqW0E6CZJqlI5l9lXbFf5cQxjVvj5vMNtf2wGSygXt0yyHs9Er1Hm4L8/s4096/excel-logo-0.png)<br />
Em ambientes empresariais e de análise de dados, a importação de informações a partir de planilhas Excel é uma tarefa comum, mas nem sempre é fácil. Felizmente, temos uma solução eficiente para tornar esse processo mais suave e automatizado: um script PowerShell personalizado.
## O Desafio da Importação de Dados do Excel
Planilhas do Excel são uma forma popular de armazenar dados, mas quando se trata de migrar esses dados para um banco de dados como o Microsoft SQL Server (MSSQL), o processo pode se tornar demorado e propenso a erros.
## A Solução PowerShell
Apresentamos o script PowerShell `DiffMegaInsertInToSQL`, que resolve esse desafio de forma eficaz. Vamos dar uma olhada nas principais funcionalidades e no processo de importação de dados.
### Funcionalidades do Script
- **Automatização Total**: O script automatiza o processo de importação, permitindo que você importe dados de várias planilhas em um único comando.
- **Geração de Consultas SQL Dinâmicas**: O script gera consultas SQL de forma dinâmica com base nos dados da planilha, tornando a importação de dados altamente personalizável.
- **Gerenciamento de Erros**: O script lida com erros de importação de dados de maneira eficaz e inclui informações de log detalhadas.
### Como Usar o Script
O uso do script é bastante simples:
1. Abra o Windows PowerShell.
2. Certifique-se de que os módulos ImportExcel e SqlServer estão instalados no seu sistema. Caso contrário, o script irá instalá-los automaticamente.
3. Execute o script `DiffMegaInsertInToSQL`.
### Processo de Importação
O script segue as seguintes etapas durante o processo de importação:
1. Lê os dados de uma planilha Excel usando o módulo ImportExcel.
2. Gera consultas SQL dinâmicas com base nos dados da planilha, para que cada linha de dados seja inserida no MSSQL de acordo com as regras específicas de cada registro.
3. Lida com erros de importação e cria um arquivo de log detalhado com informações sobre o processo.
4. Após a importação bem-sucedida, você terá seus dados armazenados no MSSQL de maneira organizada e pronta para análise.
## Conclusão
A importação de dados do Excel para o MSSQL pode ser uma tarefa complexa, mas o script PowerShell `DiffMegaInsertInToSQL` simplifica todo o processo. Ele oferece automação, personalização e gerenciamento de erros, tornando a importação de dados mais rápida e eficiente.
Se você trabalha com dados de planilhas Excel e deseja otimizar o processo de importação, experimente este script. Ele pode economizar tempo e garantir que seus dados sejam importados de forma confiável e precisa.
Lembre-se de que o PowerShell é uma ferramenta poderosa para automação de tarefas, e este script é apenas um exemplo de como ele pode ser usado para simplificar processos de importação de dados. Continue explorando e aproveitando as vantagens dessa incrível ferramenta!
---
Para incorporar código Markdown em uma página HTML do Blogger, você pode seguir o exemplo do [cs905s/md-in-blogger](https://github.com/cs905s/md-in-blogger).
Para automatizar a importação de dados do Excel para o Microsoft SQL Server (MSSQL) com PowerShell, você pode aproveitar o código fornecido por Marinaldo de Jesus no repositório [naldodj/naldodj-pwsh-excelToMSSQL](https://github.com/naldodj/naldodj-pwsh-excelToMSSQL).
Esta postagem foi criada com a contribuição do modelo de linguagem AI da OpenAI.
---
Este post foi criado com a ajuda do [cs905s/md-in-blogger](https://github.com/cs905s/md-in-blogger) para incorporar Markdown no Blogger. O código PowerShell para a importação de dados do Excel para o MSSQL foi escrito por Marinaldo de Jesus e pode ser encontrado em [naldodj/naldodj-pwsh-excelToMSSQL](https://github.com/naldodj/naldodj-pwsh-excelToMSSQL). A contribuição do modelo de linguagem AI da OpenAI foi fundamental para a criação deste conteúdo.
</pre>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-64769482212040314872023-08-12T08:04:00.000-03:002023-08-12T08:04:02.205-03:00BlackTDN :: A Importância do Contexto: Por que Programadores Se Incomodam com o "Está Errado"<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHjj0CUCoy1MviynMJhSEbRcXyrYVk-h2zNpSTtzJ6h0crkvBlKhYUcbC8gee2853FEPVlqwQWpIO5LKX4MQ2_6GQd--vkrLGrEQ1KEyHj-WILwMcwlD6gB6Oi5985lFeIgo0sKrfI59ebgnCh-V2znbuIhPwCD-2gpwNp5WjZu6f1OpQW0vSBv17ARrQ/s420/error-ops.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Ops!" border="0" data-original-height="240" data-original-width="420" height="229" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHjj0CUCoy1MviynMJhSEbRcXyrYVk-h2zNpSTtzJ6h0crkvBlKhYUcbC8gee2853FEPVlqwQWpIO5LKX4MQ2_6GQd--vkrLGrEQ1KEyHj-WILwMcwlD6gB6Oi5985lFeIgo0sKrfI59ebgnCh-V2znbuIhPwCD-2gpwNp5WjZu6f1OpQW0vSBv17ARrQ/w400-h229/error-ops.jpg" title="Ops!" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="http://secretariasublime.blogspot.com/2018/03/a-banalizacao-do-erro.html" rel="nofollow" target="_blank"><span style="font-size: xx-small;">créditos da imagem</span></a></div><br /><p></p><p style="text-align: justify;">Se você já teve a oportunidade de interagir com programadores ou trabalhar em projetos de desenvolvimento de software, provavelmente já ouviu alguém dizer: "<b>Está errado</b>". No entanto, essa simples afirmação muitas vezes não é tão simples quanto parece. Neste artigo, vamos explorar a razão pela qual os programadores têm uma reação tão forte a essa expressão aparentemente inofensiva e como o contexto e as informações detalhadas são cruciais no mundo da programação.</p><p style="text-align: justify;"><br /></p><p style="text-align: justify;"><b>Erros e Inconsistências: Entendendo a Diferença</b></p><p style="text-align: justify;"><br /></p><p style="text-align: justify;">Para começar, é importante entender a diferença entre "<b>erro</b>" e "<b>inconsistência</b>" no contexto dos sistemas e programas de computador. Um erro é uma falha ou problema que ocorre durante a execução de um programa, muitas vezes causado por falhas no código, entradas incorretas ou interações inesperadas com outros componentes do sistema. Já uma inconsistência refere-se a uma falta de harmonia ou concordância entre diferentes partes do sistema, podendo resultar em informações ou estados conflitantes.</p><p style="text-align: justify;"><br /></p><p style="text-align: justify;"><b>O Problema com a Afirmação "Está Errado"</b></p><p style="text-align: justify;"><br /></p><p style="text-align: justify;">Aqui está o cerne da questão: quando alguém diz simplesmente "Está errado" a um programador, sem fornecer contexto ou informações detalhadas sobre o que está errado e como chegou a essa conclusão, isso pode ser incrivelmente frustrante e pouco útil. Imagine estar em uma sala de controle de tráfego aéreo e alguém dizer "Algo está errado". Sem informações específicas sobre qual avião ou qual sistema está apresentando problemas, essa afirmação não ajuda em nada na resolução do problema.</p><p style="text-align: justify;"><br /></p><p style="text-align: justify;"><b>A Importância do Contexto e das Informações Detalhadas</b></p><p style="text-align: justify;"><br /></p><p style="text-align: justify;">Programadores apreciam contextos e informações detalhadas por algumas razões cruciais:</p><p style="text-align: justify;"><br /></p><p style="text-align: justify;"><b>Identificação Precisa do Problema</b>: Para corrigir um problema, os programadores precisam entender exatamente onde ocorre o erro ou a inconsistência. O contexto permite que eles localizem a parte específica do código ou do sistema que precisa de atenção.</p><p style="text-align: justify;"><br /></p><p style="text-align: justify;"><b>Eficiência na Solução</b>: Informações detalhadas podem economizar um tempo valioso. Quando um programador recebe detalhes sobre como o problema ocorre, ele pode direcionar seus esforços diretamente para a solução, em vez de gastar tempo investigando a raiz do problema.</p><p style="text-align: justify;"><br /></p><p style="text-align: justify;"><b>Colaboração Mais Eficaz</b>: Em projetos de desenvolvimento de software em equipe, a comunicação é fundamental. Fornecer contexto ajuda a equipe a entender rapidamente a natureza do problema, permitindo uma colaboração mais eficaz na busca por soluções.</p><p style="text-align: justify;"><br /></p><p style="text-align: justify;"><b>Conclusão</b></p><p style="text-align: justify;"><br /></p><p style="text-align: justify;">Da próxima vez que você se encontrar diante de um problema em um sistema ou software e quiser relatar um erro a um programador, lembre-se da importância do contexto e das informações detalhadas. Evite simplesmente dizer "Está errado". Em vez disso, forneça detalhes sobre como o erro ocorre, as ações que você tomou para chegar a essa conclusão e, se possível, compartilhe mensagens de erro ou outros indícios que possam auxiliar na identificação e solução do problema. Ao fazer isso, você não apenas ajudará a resolver problemas de forma mais eficaz, mas também cultivará uma comunicação mais positiva e produtiva com os programadores.</p><p style="text-align: justify;"><br /></p><p style="text-align: justify;">[]s</p><p style="text-align: justify;">NaldoDJ</p>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-24251013114619880692023-08-10T19:10:00.002-03:002023-08-10T19:10:33.797-03:00🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️<p><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;">🚀 Oferecendo Serviços Remotos de Desenvolvedor AdvPL e Mais 🖥️</span><br style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit;" /><br style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit;" /><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;">Olá pessoal,</span><br style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit;" /><br style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit;" /></p><div style="text-align: justify;"><span style="background-color: white; font-size: 14px;">Espero que este post encontre todos vocês bem! É com grande entusiasmo que compartilho que estou expandindo meus serviços como Desenvolvedor AdvPL para novos desafios e colaborações.</span></div><div style="text-align: justify;"><span style="color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px;"><br /></span></div><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;"><div style="text-align: justify;">Com mais de duas décadas de experiência sólida, minha jornada profissional tem sido enriquecedora, com a oportunidade de participar de projetos empolgantes ao longo dos anos. Agora, estou ansioso para trazer minha experiência e habilidades para novas equipes e projetos, trabalhando de forma remota.</div></span><div style="text-align: justify;"><span style="color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px;"><br /></span></div><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;"><div style="text-align: justify;">Minha expertise abrange não apenas AdvPL, mas também outras tecnologias-chave, incluindo JS, SQL, Infraestrutura e Otimização de Processos. Acredito que essa combinação de conhecimentos me permite oferecer soluções abrangentes e eficazes para uma variedade de necessidades de desenvolvimento.</div></span><div style="text-align: justify;"><span style="color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px;"><br /></span></div><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;"><div style="text-align: justify;">Acredito que a tecnologia tem o poder de transformar negócios e impulsionar o sucesso, e estou comprometido em ajudar meus clientes a alcançar seus objetivos por meio de soluções de desenvolvimento inovadoras.</div></span><div style="text-align: justify;"><span style="color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px;"><br /></span></div><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;"><div style="text-align: justify;">Se você está buscando um Desenvolvedor Sênior experiente e apaixonado, pronto para enfrentar desafios e entregar resultados excepcionais, estou à disposição para colaborar de maneira remota. Minha abordagem flexível e adaptável permite que trabalhemos juntos de maneira eficaz, independentemente da localização geográfica.</div></span><div style="text-align: justify;"><span style="color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px;"><br /></span></div><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;"><div style="text-align: justify;">Se você está pronto para explorar novas possibilidades e levar seus projetos para o próximo nível, ficarei feliz em conversar e entender como posso contribuir para o seu sucesso.</div></span><div style="text-align: justify;"><span style="color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px;"><br /></span></div><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;"><div style="text-align: justify;">Não hesite em me contatar através de uma mensagem aqui. Vamos iniciar uma conversa e descobrir como podemos trabalhar juntos, mesmo à distância, para alcançar resultados incríveis.</div></span><div style="text-align: justify;"><span style="color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px;"><br /></span></div><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;">Um abraço,</span><br style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit;" /><br style="background-color: white; box-sizing: inherit; color: rgba(0, 0, 0, 0.9); font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif; font-size: 14px; line-height: inherit;" /><span color="rgba(0, 0, 0, 0.9)" face="-apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Fira Sans", Ubuntu, Oxygen, "Oxygen Sans", Cantarell, "Droid Sans", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Lucida Grande", Helvetica, Arial, sans-serif" style="background-color: white; font-size: 14px;">Marinaldo de Jesus</span><p></p>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com6tag:blogger.com,1999:blog-980185764358695221.post-13401000785232880762023-07-29T18:48:00.011-03:002024-01-28T20:00:13.158-03:00BlackTDN :: OpenSSL :: Usando HTTPS em localhost ( Gerando o Certificado Assinado no Ubuntu via WSL2)<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEi2pbFiv8OgVkbCTJ4Y5qExhhbgT7H8VLBy_DvHff6sZLC1B5ugdvNePtSGHVJdynZbv2WRv9LCEvKPPxDmgyO40kwEZyQUpnvQtqHaibLeLCnUJUEjQMcuiTJ_SHaZMTARCCVnmYRr3umrYu0cQm00M5u3DHnHf-8k0u1u0aTNlXrlrWNjgkcWdictpRY" style="margin-left: 1em; margin-right: 1em;">
<img alt="OpenSSL" data-original-height="139" data-original-width="423" height="131" src="https://blogger.googleusercontent.com/img/a/AVvXsEi2pbFiv8OgVkbCTJ4Y5qExhhbgT7H8VLBy_DvHff6sZLC1B5ugdvNePtSGHVJdynZbv2WRv9LCEvKPPxDmgyO40kwEZyQUpnvQtqHaibLeLCnUJUEjQMcuiTJ_SHaZMTARCCVnmYRr3umrYu0cQm00M5u3DHnHf-8k0u1u0aTNlXrlrWNjgkcWdictpRY=w400-h131" title="OpenSSL" width="400" />
</a>
</div>
<div style="text-align: center;">referência da imagem:
<a href="https://www.openssl.org/source/" rel="nofollow" target="_blank">OpenSSL</a>
</div>
<p></p>
<p>Pressupondo que já tenha o WSL2 instalado, funcionando e com uma distribuição linux Ubuntu instalada (caso contrário siga os
<a href="https://learn.microsoft.com/pt-br/windows/wsl/install" rel="nofollow" target="_blank">procedimentos: Instalar o Linux no Windows com o WSL</a> para habilitar a WSL e instalar a sua versão do Ubuntu, ou outra de sua preferência)</p>
<p></p>
<p>1)<b>Atualizando o Ubuntu: Abra o terminal do windows, em modo administrador</b>
</p>
<p></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhPrFusGGkfmpxhv6XK4UN8ZdaaxCRfTUGfoST2Brg-cuBH8YRGP5IxtdB8AnPGcPIfAxLmb55kRk6jyWzLs5CzL39D52cBXFLQBktdvHhh2_Edx8RoI28x54PmBWiT8v4nIkL77LAbp_VQoQ86tVFPlYhaBMbRu6-a0d9qIngNh1tY8w0-5Ub1Yoy-_is" style="margin-left: 1em; margin-right: 1em;">
<img alt="Terminal Windows" data-original-height="47" data-original-width="241" height="78" src="https://blogger.googleusercontent.com/img/a/AVvXsEhPrFusGGkfmpxhv6XK4UN8ZdaaxCRfTUGfoST2Brg-cuBH8YRGP5IxtdB8AnPGcPIfAxLmb55kRk6jyWzLs5CzL39D52cBXFLQBktdvHhh2_Edx8RoI28x54PmBWiT8v4nIkL77LAbp_VQoQ86tVFPlYhaBMbRu6-a0d9qIngNh1tY8w0-5Ub1Yoy-_is=w400-h78" title="Terminal Windows" width="400" />
</a>
</div>
<br />1.1) Execute o seguinte comando:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
wsl --user root
</code>
</pre>
<p></p>
<p></p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhSBukM529yg2Ud1wlfPkas0Mq7VBKqWe3cjQYW7-JT6yWJa_TXeYUNfbkLAOWy-IuNcvRcGTNIAtjyLQSzLvIRcE4AdAceySXRWRuav9nNwlJNnyopUx6qF5vttoeCaM1e751ZzfRorJeeFWNQxo2HYQVusE4QuoxpkAMBu5OnA818LVn6L8y4Ew9jgE0" style="margin-left: 1em; margin-right: 1em;">
<img alt="WSL Root" data-original-height="93" data-original-width="355" height="168" src="https://blogger.googleusercontent.com/img/a/AVvXsEhSBukM529yg2Ud1wlfPkas0Mq7VBKqWe3cjQYW7-JT6yWJa_TXeYUNfbkLAOWy-IuNcvRcGTNIAtjyLQSzLvIRcE4AdAceySXRWRuav9nNwlJNnyopUx6qF5vttoeCaM1e751ZzfRorJeeFWNQxo2HYQVusE4QuoxpkAMBu5OnA818LVn6L8y4Ew9jgE0=w640-h168" title="WSL Root" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">1.2) No terminal WSL aberto digite:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
apt-get update && sudo apt-get upgrade
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEiILcNMiGZfEtx3of5zOyVSjopUl3sxplykTKWkERFclbFW3oIEjSX8sdrGg7fTw7Y6hIfMrinfpKSDWiPWSMeznzjiGUVnppO1ZPhKziglXH5RxXxY2xIWzPxSHovGX8AxH6D_N_l0gU4CCWSttTA01THIE7aHdD2UWRw9f-Km201iAH9kIHLJeB7j850" style="margin-left: 1em; margin-right: 1em;">
<img alt="Update Ubuntu System" data-original-height="86" data-original-width="653" height="84" src="https://blogger.googleusercontent.com/img/a/AVvXsEiILcNMiGZfEtx3of5zOyVSjopUl3sxplykTKWkERFclbFW3oIEjSX8sdrGg7fTw7Y6hIfMrinfpKSDWiPWSMeznzjiGUVnppO1ZPhKziglXH5RxXxY2xIWzPxSHovGX8AxH6D_N_l0gU4CCWSttTA01THIE7aHdD2UWRw9f-Km201iAH9kIHLJeB7j850=w640-h84" title="Update Ubuntu System" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">isso irá atualizar a distribuição Ubuntu</div>
<div class="separator" style="clear: both; text-align: left;">1.3) Instalando os Pré-Requisitos:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
apt install build-essential checkinstall zlib1g-dev -y
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEixwyXItirWtX4AWKUAF1BqhrwaS4ehHa576li_lZ41v8MO8xD6MZPECHppXFpuv1PvSlVoDozxi6IvHKiH1N3LxVbduAAP2UJ5ZitAhZ_YyH2-ZsMXQqvRdTfD9TI5jXXbjdw1iIzPTxKl1D-knjZgB5l-jL_aHviAB5Vd28_gSMv49K0qycFeImXejCE" style="margin-left: 1em; margin-right: 1em;">
<img alt="Instalando Pré-Requisitos" data-original-height="90" data-original-width="793" height="72" src="https://blogger.googleusercontent.com/img/a/AVvXsEixwyXItirWtX4AWKUAF1BqhrwaS4ehHa576li_lZ41v8MO8xD6MZPECHppXFpuv1PvSlVoDozxi6IvHKiH1N3LxVbduAAP2UJ5ZitAhZ_YyH2-ZsMXQqvRdTfD9TI5jXXbjdw1iIzPTxKl1D-knjZgB5l-jL_aHviAB5Vd28_gSMv49K0qycFeImXejCE=w640-h72" title="Instalando Pré-Requisitos" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<br />
</div>1.4) Baixando e instalando o OpenSSL:</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">1.4.1) Execute:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
cd /usr/local/src/
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEiqSsTnzB8GoFQdl47S2X-9mdADKqfeD-MoHJ8toDcGCJZy9EjnTTY6vqgUhw_nQ9WRnD-cJ0lWL29IS6uGgddQcuY9Ov5rz7-JJ3mA9JNz7tz6rEH6zV6J2vwnE291v7L-C3qZQVQZW6okSQk8YAl3csKlVsC_2HXq5sKHxeWUWPcU4L81PC6cNaY-Svo" style="margin-left: 1em; margin-right: 1em;">
<img alt="usr/local/src" data-original-height="96" data-original-width="420" height="146" src="https://blogger.googleusercontent.com/img/a/AVvXsEiqSsTnzB8GoFQdl47S2X-9mdADKqfeD-MoHJ8toDcGCJZy9EjnTTY6vqgUhw_nQ9WRnD-cJ0lWL29IS6uGgddQcuY9Ov5rz7-JJ3mA9JNz7tz6rEH6zV6J2vwnE291v7L-C3qZQVQZW6okSQk8YAl3csKlVsC_2HXq5sKHxeWUWPcU4L81PC6cNaY-Svo=w640-h146" title="usr/local/src" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">Isso movera o poteiro de diretórios para /usr/local/src/</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhbTZYRX-XOvY9bL8axMrwt1PDUZVV-glOFHBUWndlqlNa4ju7uEgXatuKLkc51u-yL1P8j2eavctbWKDoHivKnUe0QstCsoeNd-hw4x3qjMH4Cl-nWryLViF4EWMOu-FloR6J351hfbYYo1Cm9ks5REWr52HEbDWlm0XROkonGQn00tk3GdwKpTdxvZn8" style="margin-left: 1em; margin-right: 1em;">
<img alt="usr/local/src" data-original-height="104" data-original-width="428" height="156" src="https://blogger.googleusercontent.com/img/a/AVvXsEhbTZYRX-XOvY9bL8axMrwt1PDUZVV-glOFHBUWndlqlNa4ju7uEgXatuKLkc51u-yL1P8j2eavctbWKDoHivKnUe0QstCsoeNd-hw4x3qjMH4Cl-nWryLViF4EWMOu-FloR6J351hfbYYo1Cm9ks5REWr52HEbDWlm0XROkonGQn00tk3GdwKpTdxvZn8=w640-h156" title="usr/local/src" width="640" />
</a>
</div>
<br />
</div>
</div>
<div class="separator" style="clear: both; text-align: left;">1.4.2) Acesse<a href="https://www.openssl.org/source/" rel="nofollow" target="_blank">openssl downloads</a>. Escolha a versão do OpenSSL que deseja baixar e copie o link:</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgglASqANcoIgmZP2Aq3PCOZnI2QDg8SBcHWkeMazB-DrM2uHEbITLJ5WXYuiGmXUGbjF1AKJVBRiY4ugwDMIlmAJTL_VmZ0dTAoY1gSTpuR7AMORO7yAZW-1e0cBLw08PG2MmHabiGKgSBTfq6-9ECG-0OMYCI0C7MExGbiO1_DpxG3ZPLZgGMn043YZg" style="margin-left: 1em; margin-right: 1em;">
<img alt="OpenSSL Download" data-original-height="768" data-original-width="1366" height="360" src="https://blogger.googleusercontent.com/img/a/AVvXsEgglASqANcoIgmZP2Aq3PCOZnI2QDg8SBcHWkeMazB-DrM2uHEbITLJ5WXYuiGmXUGbjF1AKJVBRiY4ugwDMIlmAJTL_VmZ0dTAoY1gSTpuR7AMORO7yAZW-1e0cBLw08PG2MmHabiGKgSBTfq6-9ECG-0OMYCI0C7MExGbiO1_DpxG3ZPLZgGMn043YZg=w640-h360" title="OpenSSL Download" width="640" />
</a>
</div>
<div style="text-align: center;">neste exemplo:<a href="https://www.openssl.org/source/openssl-1.1.1u.tar.gz" rel="nofollow" target="_blank">https://www.openssl.org/source/openssl-1.1.1u.tar.gz</a>
</div>
<div style="text-align: left;">1.4.3) Baixe a versão escolhida digitando:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
wget https://www.openssl.org/source/openssl-1.1.1u.tar.gz --no-check-certificate
</code>
</pre>
</div>
<div style="text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjw0iidkZ2ql_-RXNSc7G-8Lwsn9omcjz-4IQbO94rFJJLHfBayETjPKyzWOB6WTdQoMQD0xAsXYKNtw7-Dlb50s-3-9MlFN2ijzQiwPStWjQvkOpcN65N-rX7wDwkzEpBXmEWvspg6gPeWDfRB-W2d5v4ZdLqEUEIt7639uW_9uH5l660QdfWxEoEz1aY" style="margin-left: 1em; margin-right: 1em;">
<img alt="OpenSSL wGET" data-original-height="98" data-original-width="1039" height="60" src="https://blogger.googleusercontent.com/img/a/AVvXsEjw0iidkZ2ql_-RXNSc7G-8Lwsn9omcjz-4IQbO94rFJJLHfBayETjPKyzWOB6WTdQoMQD0xAsXYKNtw7-Dlb50s-3-9MlFN2ijzQiwPStWjQvkOpcN65N-rX7wDwkzEpBXmEWvspg6gPeWDfRB-W2d5v4ZdLqEUEIt7639uW_9uH5l660QdfWxEoEz1aY=w640-h60" title="OpenSSL wGET" width="640" />
</a>
</div>
</div>
<div style="text-align: left;">1.4.3.1) Obs.: Substitua
<b>https://www.openssl.org/source/openssl-1.1.1u.tar.gz</b>
pela versão de sua escolha.</div>
<div style="text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgICK1GoPQ0DmfQTcPr3YZ2XLz37StHaUHaiC3gKN57JZdY1PMLFJDQ30mqdCQVUl5N7IXtkwk3n2oGjspF4mdDeaKtsmO2IJI48PzIFfPje5TmpnJ7wUxGeY2hTH7reKqz2ItkifW12sBVaAMX-s9zcvdphnkzsEsEhatTSobkyIhIL6DuoQqlV5e7crA" style="margin-left: 1em; margin-right: 1em;">
<img alt="OpenSSL wGet" data-original-height="355" data-original-width="1059" height="214" src="https://blogger.googleusercontent.com/img/a/AVvXsEgICK1GoPQ0DmfQTcPr3YZ2XLz37StHaUHaiC3gKN57JZdY1PMLFJDQ30mqdCQVUl5N7IXtkwk3n2oGjspF4mdDeaKtsmO2IJI48PzIFfPje5TmpnJ7wUxGeY2hTH7reKqz2ItkifW12sBVaAMX-s9zcvdphnkzsEsEhatTSobkyIhIL6DuoQqlV5e7crA=w640-h214" title="OpenSSL wGet" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEh0aIDr750sMHXZJX6kCUDqinLCo3mQoORuqRqX25QKEqhhPbMpz56c0LkbSzw1HbnWe0UT6FtEIsyzWvRIQFG86cSti4p-EfnfJ9gki3_jWljhB3oGdC6l43Nt_0NlvlgGRRG8WBCnY-o1zavSWEpZKG6GlDqopXiW1ESaKPdXuVYd1z9ZKtqRS-GxkCM" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="374" data-original-width="1075" height="222" src="https://blogger.googleusercontent.com/img/a/AVvXsEh0aIDr750sMHXZJX6kCUDqinLCo3mQoORuqRqX25QKEqhhPbMpz56c0LkbSzw1HbnWe0UT6FtEIsyzWvRIQFG86cSti4p-EfnfJ9gki3_jWljhB3oGdC6l43Nt_0NlvlgGRRG8WBCnY-o1zavSWEpZKG6GlDqopXiW1ESaKPdXuVYd1z9ZKtqRS-GxkCM=w640-h222" width="640" />
</a>
</div>
<br />
<div style="text-align: left;">1.4.3.2) Extraia o arquivo baixado com o seguinte comando:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
tar -xf openssl-1.1.1u.tar.gz
</code>
</pre>
</div>
<div style="text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgQRkPDnIrTWsy-Rv_OCdMiybz5Xj1SrrF7bBZ-Q1pBGkrxwNZNkzoFMxwLC45QYf3igPkFKbMFSuSHwv_-_lYAfiL9rehNabKE21t4f-YopnrcuG80-fmCZW9CSYW2mNqRD-UzEXBOuRGS0ehR6SfvKL9JmTqwoq0IRmpGmKn1EECjL9oSxyoaktjxdug" style="margin-left: 1em; margin-right: 1em;">
<img alt="Extraindo o OpenSSL" data-original-height="89" data-original-width="614" height="92" src="https://blogger.googleusercontent.com/img/a/AVvXsEgQRkPDnIrTWsy-Rv_OCdMiybz5Xj1SrrF7bBZ-Q1pBGkrxwNZNkzoFMxwLC45QYf3igPkFKbMFSuSHwv_-_lYAfiL9rehNabKE21t4f-YopnrcuG80-fmCZW9CSYW2mNqRD-UzEXBOuRGS0ehR6SfvKL9JmTqwoq0IRmpGmKn1EECjL9oSxyoaktjxdug=w640-h92" title="Extraindo o OpenSSL" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: left;">1.4.3.3) Navegue até a pasta extraida. Neste caso:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
cd openssl-1.1.1u
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhNELkjYiBHr6jiYHEP5ljZKVccPNM6RuPK6C9vk-F9bvXyn86ykZKdHSozkUI6nkuV-WEEurz_4umD7gr8WMlinAONCg8mINk7viORN6uvqm9mM5ixw_BsLRswYeGSjMgVaPrp1OzWJUbluz5sh8rUmMigl7aTiVMO-yu2puvonuGscJ-J-3LEmW16UCQ" style="margin-left: 1em; margin-right: 1em;">
<img alt="OpenSSL" data-original-height="126" data-original-width="934" height="86" src="https://blogger.googleusercontent.com/img/a/AVvXsEhNELkjYiBHr6jiYHEP5ljZKVccPNM6RuPK6C9vk-F9bvXyn86ykZKdHSozkUI6nkuV-WEEurz_4umD7gr8WMlinAONCg8mINk7viORN6uvqm9mM5ixw_BsLRswYeGSjMgVaPrp1OzWJUbluz5sh8rUmMigl7aTiVMO-yu2puvonuGscJ-J-3LEmW16UCQ=w640-h86" title="OpenSSL" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEi6tTez6KT97VwyHpEOVa0vXi7q7n8agv2clSXCRNpqUCM5RpmLD5ZB-hQOn_lXqjKgF3sgsqckoNsKCbVaD1Q3goI3VqPcpbhqKk4RdEOXRSfsAx2A4ECzinEzUgomPMeHCRri-CEqkhwEN-PiijMEN_V-rcXOeBmXrYoCWMLJFoje4kHOzNm3bD93xeM" style="margin-left: 1em; margin-right: 1em;">
<img alt="OpenSSL" data-original-height="128" data-original-width="930" height="88" src="https://blogger.googleusercontent.com/img/a/AVvXsEi6tTez6KT97VwyHpEOVa0vXi7q7n8agv2clSXCRNpqUCM5RpmLD5ZB-hQOn_lXqjKgF3sgsqckoNsKCbVaD1Q3goI3VqPcpbhqKk4RdEOXRSfsAx2A4ECzinEzUgomPMeHCRri-CEqkhwEN-PiijMEN_V-rcXOeBmXrYoCWMLJFoje4kHOzNm3bD93xeM=w640-h88" title="OpenSSL" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: left;">1.4.3.4) Instalando o OpenSSL. Execute os seguintes comando para instalar o OpenSSL.</div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><div style="text-align: left;"><code style="font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl shared zlib</code></div><code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;"><div style="text-align: left;">make</div><div style="text-align: left;">make test</div><div style="text-align: left;">make install</div> </code>
</pre>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjgDRHJ6iIWaCmBvpm58P4UNhG_VmRjj_SA9s66w7fyGu_e94KLzuoYM55qWPhvELBRUChsvdnZU_6t8sWmQM-Z2uaBzht_q65_pV_cPIVOq9LysQfdhuavmtosEGOcnYc5JDSlXv_oky8KRy8w4FjpcbdPeiy28Cwq2bEeaC-VkMnUxveNgTs2ySQMXhI" style="margin-left: 1em; margin-right: 1em;">
<img alt="Instalando o OpenSSL" data-original-height="499" data-original-width="839" height="380" src="https://blogger.googleusercontent.com/img/a/AVvXsEjgDRHJ6iIWaCmBvpm58P4UNhG_VmRjj_SA9s66w7fyGu_e94KLzuoYM55qWPhvELBRUChsvdnZU_6t8sWmQM-Z2uaBzht_q65_pV_cPIVOq9LysQfdhuavmtosEGOcnYc5JDSlXv_oky8KRy8w4FjpcbdPeiy28Cwq2bEeaC-VkMnUxveNgTs2ySQMXhI=w640-h380" title="Instalando o OpenSSL" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhTAjMO3NhllVl1EZ3nz1Ps-6Ep_izH09dpVXqkhsWEGmVdSClBUuhdnTK8IPxlFpZLtimwG5YdOPCmojd65mrSun7SPOcBZh4Bl23SbjRhJKlV0TZh9QAdyy4rMMCQ7y1MHs13-Wlu01eTYWP0z01Nkqlf01PpB1f8NAoWxG3iTHgPYmJtJ5bzY3a2QLA" style="margin-left: 1em; margin-right: 1em;">
<img alt="Instalando o OpenSSL" data-original-height="167" data-original-width="1096" height="98" src="https://blogger.googleusercontent.com/img/a/AVvXsEhTAjMO3NhllVl1EZ3nz1Ps-6Ep_izH09dpVXqkhsWEGmVdSClBUuhdnTK8IPxlFpZLtimwG5YdOPCmojd65mrSun7SPOcBZh4Bl23SbjRhJKlV0TZh9QAdyy4rMMCQ7y1MHs13-Wlu01eTYWP0z01Nkqlf01PpB1f8NAoWxG3iTHgPYmJtJ5bzY3a2QLA=w640-h98" title="Instalando o OpenSSL" width="640" />
</a>
</div>Aguarde finalizar a instalação...</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgCUweO5vAnvK2Rh1qXupCmwtBs8onPA8vwMFbL50fLcgTNalSM-_3VyNDUz0V9SHct12SdBJzY2ERRVT9Nb4H-jNGDZezRG_5BHgMguGtklcWxboY0TUgW7JaoOA-1L53jlmJL7uE77rxxbjcyngGcGx9u8kl_qLsfCnV54VoLIPfqBCnCS8tRqmFqP5A" style="margin-left: 1em; margin-right: 1em;">
<img alt="Instalando o OpenSSL" data-original-height="626" data-original-width="985" height="406" src="https://blogger.googleusercontent.com/img/a/AVvXsEgCUweO5vAnvK2Rh1qXupCmwtBs8onPA8vwMFbL50fLcgTNalSM-_3VyNDUz0V9SHct12SdBJzY2ERRVT9Nb4H-jNGDZezRG_5BHgMguGtklcWxboY0TUgW7JaoOA-1L53jlmJL7uE77rxxbjcyngGcGx9u8kl_qLsfCnV54VoLIPfqBCnCS8tRqmFqP5A=w640-h406" title="Instalando o OpenSSL" width="640" />
</a>
</div>Pressione ENTER<br />
<div style="text-align: justify;">1.4.3.5) Configurando as Bibliotecas Compartilhadas do OpenSSL. Crie um novo arquivo de configuração
<b>openssl-1.1.1u.conf</b>
para o OpenSSL em /etc/ld.so.conf.d/ :
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
nano /etc/ld.so.conf.d/openssl-1.1.1u.conf
</code>
</pre>
e Adicione a seguinte linha ao arquivo.
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
/usr/local/ssl/lib
</code>
</pre>
<span style="text-align: center;">Salve e saia do arquivo (CTRL X Y ENTER).</span>
<span style="text-align: center;">Atualize as configurações com o seguinte comando:</span>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
ldconfig -v
</code>
</pre>
</div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhy9FyRf247xR1xSzC2FX8NN_pinf_X4LFcshaANilzfg-51VFnDokZnb2nDTNMermu6hlisOAo9rc-LdkFuXHHmxKaELZc0GJjmyFpouEVPijxELvFV0WEFls5ttamjRwm1NLz5WKHPABtG5AVHQagNEW-lA25HQBKFdZ7jvRbxt5XKHA-b0uHOaYqOz4" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="99" data-original-width="877" height="72" src="https://blogger.googleusercontent.com/img/a/AVvXsEhy9FyRf247xR1xSzC2FX8NN_pinf_X4LFcshaANilzfg-51VFnDokZnb2nDTNMermu6hlisOAo9rc-LdkFuXHHmxKaELZc0GJjmyFpouEVPijxELvFV0WEFls5ttamjRwm1NLz5WKHPABtG5AVHQagNEW-lA25HQBKFdZ7jvRbxt5XKHA-b0uHOaYqOz4=w640-h72" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgn68lZCpgsCvOC8ueQg9r_n-JeRfomq5T1-I2EBNNgGCUVmnl_kfYFcSZ4KA2vrF4fiJWUeBGdpS0GVcC0aeQwExhPeFAtuPP3WH9EnEK5qJVmMe89UUvpoIXB094niAaFwbkryVV4hBKroG4QaevlUPSJgLvaiNAKhbXHdjgiMS9rfLYdfh8sz6FiBYA" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="130" data-original-width="840" height="100" src="https://blogger.googleusercontent.com/img/a/AVvXsEgn68lZCpgsCvOC8ueQg9r_n-JeRfomq5T1-I2EBNNgGCUVmnl_kfYFcSZ4KA2vrF4fiJWUeBGdpS0GVcC0aeQwExhPeFAtuPP3WH9EnEK5qJVmMe89UUvpoIXB094niAaFwbkryVV4hBKroG4QaevlUPSJgLvaiNAKhbXHdjgiMS9rfLYdfh8sz6FiBYA=w640-h100" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjeDBvlTurdxzMK-ptN2AeeMURzBV94rg4yepDQjF5HfD_xA5cpLM3pBymomXDCkwfuEu2IVhCVTsGPRc2oPKyxyg6TfEq2mvNYIfPrR0TUUHTkGMvYSv91Siqe3FlVeIROtuLqR405UFxBn0v1w-atmim6dlrrCrBElYot51BGSXlzunCuthwxbthpFks" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="624" data-original-width="1103" height="362" src="https://blogger.googleusercontent.com/img/a/AVvXsEjeDBvlTurdxzMK-ptN2AeeMURzBV94rg4yepDQjF5HfD_xA5cpLM3pBymomXDCkwfuEu2IVhCVTsGPRc2oPKyxyg6TfEq2mvNYIfPrR0TUUHTkGMvYSv91Siqe3FlVeIROtuLqR405UFxBn0v1w-atmim6dlrrCrBElYot51BGSXlzunCuthwxbthpFks=w640-h362" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjXdCOdBxO6ZF-takdNZfJYaigLFSuDG9ak4tgQkmM5gLj-KSudNLribLNWrkwwVdhRVCWI-3SJh8QUV_x30oTlt5TobcPcSEsaVGw-zaq8M3zPup2678-T354mMVpHzPzO3WkpvCJ2PYQxpvrQsIHW-zAieft_dUjtXkCTNvg9uRYS8W8xr9BUPpNPfgo" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="83" data-original-width="605" height="88" src="https://blogger.googleusercontent.com/img/a/AVvXsEjXdCOdBxO6ZF-takdNZfJYaigLFSuDG9ak4tgQkmM5gLj-KSudNLribLNWrkwwVdhRVCWI-3SJh8QUV_x30oTlt5TobcPcSEsaVGw-zaq8M3zPup2678-T354mMVpHzPzO3WkpvCJ2PYQxpvrQsIHW-zAieft_dUjtXkCTNvg9uRYS8W8xr9BUPpNPfgo=w640-h88" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: left;">1.4.3.6) Configurando o Binário do OpenSSL.</div>
<div class="separator" style="clear: both; text-align: left;">1.4.3.6.1) Abra a variável de ambiente PATH:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
nano /etc/environment
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhgHZWnHcuhbE81LFkeloCkz7wM1GJOvSBg0M7qMhUMz9d014XuEh-cIwfyGSerK5ixLSt7fk2q8xC8vqvfNnv5oukol2amOZ7v-nU6BgAVvjLbLFsn0snd2RWztsIffxAWaH0d83mXC3WUYBZUr20whah9xtNBcksO0vVVBEumKkLq_o0kilN-4lSnhfc" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="174" data-original-width="1094" height="102" src="https://blogger.googleusercontent.com/img/a/AVvXsEhgHZWnHcuhbE81LFkeloCkz7wM1GJOvSBg0M7qMhUMz9d014XuEh-cIwfyGSerK5ixLSt7fk2q8xC8vqvfNnv5oukol2amOZ7v-nU6BgAVvjLbLFsn0snd2RWztsIffxAWaH0d83mXC3WUYBZUr20whah9xtNBcksO0vVVBEumKkLq_o0kilN-4lSnhfc=w640-h102" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: justify;">1.4.3.6.1) Adicione a pasta
<b>:/usr/local/bin/openssl</b>
à variável PATH. Observe o dois-pontos no início do caminho da pasta. E observe, também, se não existe outra referencia ao OpenSSL (existindo, substitua). PATH vai ficar com algo parecido com isso: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games<b>:/usr/local/ssl/bin</b>"</div>1.4.3.6.2) Salve e feche o arquivo. Agora atualize o ambiente PATH com o seguinte comando:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
source /etc/environment
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: left;">1.4.3.6.3) Verifique a versão do OpenSSL:<b>openssl version -a</b>
</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjHdshsOGvCoBtO-f0TfRjgqMWLAvZRnl1quEy1M7L5MsaXHERE2FhHPVM5SeOVNrzP1X52n7XHuBhtlCOWrd3NMvYrBpVZhmrwFxXMbHXpPyoWk_VIOQRTs47-xpzse3-lTSGl2t8Iza4-OAthjaC2lXNweT-jYlL0j3eDkBNewqnfEQj1u5H5SxfsXuQ" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="307" data-original-width="1102" height="178" src="https://blogger.googleusercontent.com/img/a/AVvXsEjHdshsOGvCoBtO-f0TfRjgqMWLAvZRnl1quEy1M7L5MsaXHERE2FhHPVM5SeOVNrzP1X52n7XHuBhtlCOWrd3NMvYrBpVZhmrwFxXMbHXpPyoWk_VIOQRTs47-xpzse3-lTSGl2t8Iza4-OAthjaC2lXNweT-jYlL0j3eDkBNewqnfEQj1u5H5SxfsXuQ=w640-h178" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">OpenSSL 1.1.1u 30 May 2023</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">Pronto, finalizamos a instalação/atualização/configuração do OpenSSL.</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">Referência:<a href="https://fedingo.com/how-to-install-openssl-in-ubuntu/" rel="nofollow" target="_blank">Como instalar o OpenSSL no Ubuntu</a>
</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">2)
<b>Agora vamos à geração do Certificado.</b>
</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">2.1) Execute o seguinte comando:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
cd /usr/local
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjvz8QdwfFmpDNTYzw9bc3c9w7ZSsVdwH43616OOJmRcZxUL-EL7BLkbwOqW2kkNG7VOIeTPHEl3gGom3TKWa5bfQRUfGPdPCQWKeGGScgFvezHdaGMF8fk5cCCl8XXyoPYftBsi5JbtcCaf5Mv_EuKCctbuSHgcQxSW0f74hnoQd8bfoX5jsIPAyjqPXE" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="102" data-original-width="531" height="122" src="https://blogger.googleusercontent.com/img/a/AVvXsEjvz8QdwfFmpDNTYzw9bc3c9w7ZSsVdwH43616OOJmRcZxUL-EL7BLkbwOqW2kkNG7VOIeTPHEl3gGom3TKWa5bfQRUfGPdPCQWKeGGScgFvezHdaGMF8fk5cCCl8XXyoPYftBsi5JbtcCaf5Mv_EuKCctbuSHgcQxSW0f74hnoQd8bfoX5jsIPAyjqPXE=w640-h122" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjKflfyb4VBzuixA_EAoQ8AX8gmfYWtpz99uIARUl1Oi4_SE-MZkoGm_nF4f6oiL2aP-EpBxs4gRMclhPHBW7D7BESMdYNPw_NpgOjnj2wwJ0ixdMCxcR6tYqpounk2x8XkRV2o30SJnrZmH0WIAWGqcrtnvuL_iNHunUzLi4dZuzir4MNGnjf6LPbTo98" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="122" data-original-width="514" height="152" src="https://blogger.googleusercontent.com/img/a/AVvXsEjKflfyb4VBzuixA_EAoQ8AX8gmfYWtpz99uIARUl1Oi4_SE-MZkoGm_nF4f6oiL2aP-EpBxs4gRMclhPHBW7D7BESMdYNPw_NpgOjnj2wwJ0ixdMCxcR6tYqpounk2x8XkRV2o30SJnrZmH0WIAWGqcrtnvuL_iNHunUzLi4dZuzir4MNGnjf6LPbTo98=w640-h152" width="640" />
</a>
</div>
<br />
<br />
</div>
</div>
<div class="separator" style="clear: both; text-align: left;">2.1.1) Crie a pasta tmp executando o seguinte comando
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
mkdir tmp
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; font-weight: bold; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEiQdGa5xseCcL4tYrIhilD1LugPQILBTUErL-SlWudu8nFb3CPEOSpVvuCmOoKGI5DMDKFRSFqSgoOV1szWzxGMANoL5P-wE7TbGMy2qBS03qDJvf__nQZZ889GCvuLV9qcccSpCdM33W9OhpQMs4rmUBcgHvM2TEB83qDlN74mLMhk3PyO1wmm7L6SmOc" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="84" data-original-width="432" height="124" src="https://blogger.googleusercontent.com/img/a/AVvXsEiQdGa5xseCcL4tYrIhilD1LugPQILBTUErL-SlWudu8nFb3CPEOSpVvuCmOoKGI5DMDKFRSFqSgoOV1szWzxGMANoL5P-wE7TbGMy2qBS03qDJvf__nQZZ889GCvuLV9qcccSpCdM33W9OhpQMs4rmUBcgHvM2TEB83qDlN74mLMhk3PyO1wmm7L6SmOc=w640-h124" width="640" />
</a>
</div>
<div class="separator" style="clear: both; font-weight: bold; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEil0NtPBghbZs_OjGsFuKn1FKZzFCuSDDwvevLG7KBxmqcqJIMSH7ErGyUyew7ceP-VjRRWRG3LkP82K7bMP33Be7xo_1R-bZ4LITOrTo5ydAFHRKCxuxlA-80_b2OKQrYH-qSj3mkiylrDevOen6t2H8wGZL7EgIIBljAvA7Jdi_fc-Gb36Vzolpeujkk" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="121" data-original-width="640" height="122" src="https://blogger.googleusercontent.com/img/a/AVvXsEil0NtPBghbZs_OjGsFuKn1FKZzFCuSDDwvevLG7KBxmqcqJIMSH7ErGyUyew7ceP-VjRRWRG3LkP82K7bMP33Be7xo_1R-bZ4LITOrTo5ydAFHRKCxuxlA-80_b2OKQrYH-qSj3mkiylrDevOen6t2H8wGZL7EgIIBljAvA7Jdi_fc-Gb36Vzolpeujkk=w640-h122" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: left;">
<span>2.1.2) Acesse a pasta tmp com:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); font-weight: 400; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
cd tmp
</code>
</pre>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; font-weight: bold; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgGCgn4UGn4bY2jq5oh_KhfoJ-5j1YLoEIt3eKph8d2qa63VsTpUiSDOP2CuL4ZeuCkneL_vH4pyNdd8w6pOU1vis2rZq6LJCUvreh3cGeO7Gvt_yM2W6WUu4aG2W-w9Z0NmoEUoSwDB349WmAOk8qI3Ms9p3BtXYMQi1lhuvLiZFj0937JAuGKQefzfII" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="128" data-original-width="660" height="124" src="https://blogger.googleusercontent.com/img/a/AVvXsEgGCgn4UGn4bY2jq5oh_KhfoJ-5j1YLoEIt3eKph8d2qa63VsTpUiSDOP2CuL4ZeuCkneL_vH4pyNdd8w6pOU1vis2rZq6LJCUvreh3cGeO7Gvt_yM2W6WUu4aG2W-w9Z0NmoEUoSwDB349WmAOk8qI3Ms9p3BtXYMQi1lhuvLiZFj0937JAuGKQefzfII=w640-h124" width="640" />
</a>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: left;">2.1.3) Para gerar um certificado com chave RSA-2048 digite o seguinte comando:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
openssl genrsa -des3 -out rootCA.key 2048
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; font-weight: bold; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgabSAniAmj9qs5GX0IbIJwOTEhIT-xTIZgz-03GGDDwi8o8BY-SXB_by4665AVSZ74KP8NRr9AJOsejJ2yBn8TMho1g_cfaWeXOYb_SWsARFCqA10qJbB_RkXbPWDj6bk2GuW-8RknBRIiU2xBODsz8rNuYKcH5eJ3-9u4SW3WQ0U7WpFpu9fgeWgrkEM" style="margin-left: 1em; margin-right: 1em;">
<img alt="RSA-2048" data-original-height="97" data-original-width="729" height="86" src="https://blogger.googleusercontent.com/img/a/AVvXsEgabSAniAmj9qs5GX0IbIJwOTEhIT-xTIZgz-03GGDDwi8o8BY-SXB_by4665AVSZ74KP8NRr9AJOsejJ2yBn8TMho1g_cfaWeXOYb_SWsARFCqA10qJbB_RkXbPWDj6bk2GuW-8RknBRIiU2xBODsz8rNuYKcH5eJ3-9u4SW3WQ0U7WpFpu9fgeWgrkEM=w640-h86" title="RSA-2048" width="640" />
</a>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: left;">2.1.3.1) Informe uma senha para a sua chave RSA-2048</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgqQSKzY-8iaZr4fJw0PjtXm5joA7uFMNp-uR71uDHkSEArrzsX1B1MSRkUL3GYR9ZMNqAuUh6Kp64v2jLUllYbV8RkpbfziyZvdHqGqpc7xOSk88p0Vt3E_qHomLZi0umr1Al8BeHuJA69IAdn9LgGHVuG5XxHQkFMjpjtHCwLJbmohnYur3D8dPu96Ps" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="161" data-original-width="713" height="144" src="https://blogger.googleusercontent.com/img/a/AVvXsEgqQSKzY-8iaZr4fJw0PjtXm5joA7uFMNp-uR71uDHkSEArrzsX1B1MSRkUL3GYR9ZMNqAuUh6Kp64v2jLUllYbV8RkpbfziyZvdHqGqpc7xOSk88p0Vt3E_qHomLZi0umr1Al8BeHuJA69IAdn9LgGHVuG5XxHQkFMjpjtHCwLJbmohnYur3D8dPu96Ps=w640-h144" width="640" />
</a>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: left;">2.1.3.1.1) Confirme a senha:</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhk3TFiweUUpXgmBQvfJ5ScFqOW23tNfLQlYAu7SwbMWTb987Jum3rED2dI--nnXlWbzX1xUe8NKG_CivX3u68El49Xj7rZvumMwiVcARtgP_gUwgjSX7uT9YxVG0wzLbFQEz0zrmjV-QXXrYR8vTFCuXkAzatiqa2L1NENfO5qbD4XFXMal8a5ezppGUI" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="262" data-original-width="706" height="238" src="https://blogger.googleusercontent.com/img/a/AVvXsEhk3TFiweUUpXgmBQvfJ5ScFqOW23tNfLQlYAu7SwbMWTb987Jum3rED2dI--nnXlWbzX1xUe8NKG_CivX3u68El49Xj7rZvumMwiVcARtgP_gUwgjSX7uT9YxVG0wzLbFQEz0zrmjV-QXXrYR8vTFCuXkAzatiqa2L1NENfO5qbD4XFXMal8a5ezppGUI=w640-h238" width="640" />
</a>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">Com isso, o arquivo rootCA.key será gerado.</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: justify;">2.1.3.2.1) Agora vamos usar a chave gerada para criar um certificado root com validade de aproximadamente 10 anos (3652 dias, você pode trocar o número de dias conforme sua necessidade). Digite:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 3652 -out rootCA.pem
</code>
</pre>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjY6y_ntdsbTze-qw7iPNysoYR6kT4By25V4hhJXgbs4Q4Q8nZNWsoWIW5YCSTptKsxjicDTEJ05t5cGsoUwQqTY36a4Ltguma4DVXsD5QSUwuy0aAh81pQggaJlrN5rIGCDS_82gH6YtAecnltE022LF3M-kX-S4tdlMZWvqLcCJ_F0jY1gSU1puf1CVc" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="122" data-original-width="1103" height="70" src="https://blogger.googleusercontent.com/img/a/AVvXsEjY6y_ntdsbTze-qw7iPNysoYR6kT4By25V4hhJXgbs4Q4Q8nZNWsoWIW5YCSTptKsxjicDTEJ05t5cGsoUwQqTY36a4Ltguma4DVXsD5QSUwuy0aAh81pQggaJlrN5rIGCDS_82gH6YtAecnltE022LF3M-kX-S4tdlMZWvqLcCJ_F0jY1gSU1puf1CVc=w640-h70" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEibejHCCwtJoAUXaUf-G-ZOxjaA6UE7eQaGUASkz3SA3MwvOtjp1hGDLFY5Nowh5emb-VO-AwjBk_LRGT5-ywUY5IurZcYKVYrBRJAfsOw2wGo8ibW6dAnIAAjXKgT4j7dJeAubwAKPdBIpAQeLfQSuccypLo_h1JxHSH67uBhokx2_opQ3KKUw6Ytrzpc" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="150" data-original-width="1110" height="86" src="https://blogger.googleusercontent.com/img/a/AVvXsEibejHCCwtJoAUXaUf-G-ZOxjaA6UE7eQaGUASkz3SA3MwvOtjp1hGDLFY5Nowh5emb-VO-AwjBk_LRGT5-ywUY5IurZcYKVYrBRJAfsOw2wGo8ibW6dAnIAAjXKgT4j7dJeAubwAKPdBIpAQeLfQSuccypLo_h1JxHSH67uBhokx2_opQ3KKUw6Ytrzpc=w640-h86" width="640" />
</a>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">informe a senha usada para criar a chave RSA-2048</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<br />
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: left;">2.1.3.2.2) Informe os dados necessários para a geração do certificado root:</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<img data-original-height="277" data-original-width="1113" height="160" src="https://blogger.googleusercontent.com/img/a/AVvXsEiZzBjD5yzzaqcoxC6c7YBtmsDjM5oc_hutS82545Y8V4EWAsdT5yJBVTbXFpYgcmJJg2nB-5_EnNQAACsY2CThKrgsdpFtPxiIZyMs3uZRxFJMcCXfU-80dOLNd_CjwMLkniRYfYWo-AHXBbzLIsha7-PmWfF3VZ0wkOlIzUiZqpg08HgxxXRaVQOwH3A=w640-h160" width="640" />
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<div class="separator" style="clear: both; display: inline;">
<span style="color: black; text-align: left;">Country Name (2 letter code) [AU]:BR</span>
</div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEiZzBjD5yzzaqcoxC6c7YBtmsDjM5oc_hutS82545Y8V4EWAsdT5yJBVTbXFpYgcmJJg2nB-5_EnNQAACsY2CThKrgsdpFtPxiIZyMs3uZRxFJMcCXfU-80dOLNd_CjwMLkniRYfYWo-AHXBbzLIsha7-PmWfF3VZ0wkOlIzUiZqpg08HgxxXRaVQOwH3A" style="font-weight: 400; margin-left: 1em; margin-right: 1em;">
<span style="text-align: left;"></span>
</a>
<div class="separator" style="clear: both; color: black; font-weight: 400; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEiZzBjD5yzzaqcoxC6c7YBtmsDjM5oc_hutS82545Y8V4EWAsdT5yJBVTbXFpYgcmJJg2nB-5_EnNQAACsY2CThKrgsdpFtPxiIZyMs3uZRxFJMcCXfU-80dOLNd_CjwMLkniRYfYWo-AHXBbzLIsha7-PmWfF3VZ0wkOlIzUiZqpg08HgxxXRaVQOwH3A" style="margin-left: 1em; margin-right: 1em;"></a>
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjue_ztjfu_cn7Eke4jPLWKWDUcCsgL86MPALM6NgJfRIX-r7b4UPwFzF0FSjOOQB8Cow3e6COp_BBlH8CAFP4r_g-T5EVNTvDmzqbgyWZ0Y6-dsbCpOWW3giJQugdRHB2XF8qcRZn48Qj2FN8gsDa6HzVFCjmWQNQqdnKXjuDLeV9QYT8EzvWfpLIW90A" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="269" data-original-width="1113" height="154" src="https://blogger.googleusercontent.com/img/a/AVvXsEjue_ztjfu_cn7Eke4jPLWKWDUcCsgL86MPALM6NgJfRIX-r7b4UPwFzF0FSjOOQB8Cow3e6COp_BBlH8CAFP4r_g-T5EVNTvDmzqbgyWZ0Y6-dsbCpOWW3giJQugdRHB2XF8qcRZn48Qj2FN8gsDa6HzVFCjmWQNQqdnKXjuDLeV9QYT8EzvWfpLIW90A=w640-h154" width="640" />
</a>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<span style="color: black;">State or Province Name (full name) [Some-State]:ES</span>
</div>
<div class="separator" style="clear: both; text-align: center;">
<span style="color: black;">
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjd79-lxRaybaoipgA46YU2RadRElEZUUw2C6RPa6T_pahJkdKEJQPHPRyBKsRznxbqyfn74KqUd3830C67SPInwjeWcGe_pfd0wmM4EYgPwPQLZs2jojEuTgPnaaYVCfPHpMbrzSCRFdxo41r3-0srNnn-FmdddpBvtG1YRL1IczOYmjzSfPRX-RCkb4w" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="294" data-original-width="1113" height="170" src="https://blogger.googleusercontent.com/img/a/AVvXsEjd79-lxRaybaoipgA46YU2RadRElEZUUw2C6RPa6T_pahJkdKEJQPHPRyBKsRznxbqyfn74KqUd3830C67SPInwjeWcGe_pfd0wmM4EYgPwPQLZs2jojEuTgPnaaYVCfPHpMbrzSCRFdxo41r3-0srNnn-FmdddpBvtG1YRL1IczOYmjzSfPRX-RCkb4w=w640-h170" width="640" />
</a>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">Locality Name (eg, city) []:Serra</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<br />
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgW2GH5Aa3lByxFdvIX-upb9DE3VW8HVZ-N12o66e4aLNt-6ltjgyeUyTNthi0WsdqmbT8YUgiBhi-n6sbEN9nXrJYAnOk2RqJ7eD-_5E9t1AP1eHYaf4vrLMQY3iZLyBbmSlfYr2PxJ0-3UMEqavD2etl1aH12iSk8EmTwYv0Vc6G1Z5rFaQF1289hEgg" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="316" data-original-width="1112" height="182" src="https://blogger.googleusercontent.com/img/a/AVvXsEgW2GH5Aa3lByxFdvIX-upb9DE3VW8HVZ-N12o66e4aLNt-6ltjgyeUyTNthi0WsdqmbT8YUgiBhi-n6sbEN9nXrJYAnOk2RqJ7eD-_5E9t1AP1eHYaf4vrLMQY3iZLyBbmSlfYr2PxJ0-3UMEqavD2etl1aH12iSk8EmTwYv0Vc6G1Z5rFaQF1289hEgg=w640-h182" width="640" />
</a>
</div>Organization Name (eg, company) [Internet Widgits Pty Ltd]:Nome da Sua Empresa</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgEJBYymxrhNd6zQjgiMb_NzDEmKN_0D2ECwvCUN2uYRAcEPXKXYAOaw4LdTChzQP7YxUCzQAwQFHnek_LFgaJ52OsprTugbRpIMTrgdquQ19jqq4SBoNLDV84XneW830n8saNDMq9fgY3zuOd3kE16Lb6tlGJ7f56LeLkNzYjpN3PKfOcy6Z-FPHUJc2c" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="48" data-original-width="531" height="58" src="https://blogger.googleusercontent.com/img/a/AVvXsEgEJBYymxrhNd6zQjgiMb_NzDEmKN_0D2ECwvCUN2uYRAcEPXKXYAOaw4LdTChzQP7YxUCzQAwQFHnek_LFgaJ52OsprTugbRpIMTrgdquQ19jqq4SBoNLDV84XneW830n8saNDMq9fgY3zuOd3kE16Lb6tlGJ7f56LeLkNzYjpN3PKfOcy6Z-FPHUJc2c=w640-h58" width="640" />
</a>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">Organizational Unit Name (eg, section) []:Tecnologia</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjCkwPPVOnvedNmA6FaUAdRcxMFF2JysWt7Mo9zJ2DteAjTk1wqHBnI2NB7ZAVfbUuqZBn--TsYmS69WaEQtEZ8h3DsrlQv_3oo1n0qYs3TaFMqbk4Uz7bdCY1ihWDqtdL_xDD_Ilv81WXD8z1pD8xo7EqQh3fFDb1FPmraOSLZNgtrUSi7hLrvQbpUWGc" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="24" data-original-width="616" height="24" src="https://blogger.googleusercontent.com/img/a/AVvXsEjCkwPPVOnvedNmA6FaUAdRcxMFF2JysWt7Mo9zJ2DteAjTk1wqHBnI2NB7ZAVfbUuqZBn--TsYmS69WaEQtEZ8h3DsrlQv_3oo1n0qYs3TaFMqbk4Uz7bdCY1ihWDqtdL_xDD_Ilv81WXD8z1pD8xo7EqQh3fFDb1FPmraOSLZNgtrUSi7hLrvQbpUWGc=w640-h24" width="640" />
</a>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">Common Name (e.g. server FQDN or YOUR name) []:Nome do Responsavel</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEis0aVP-DrUypNtIYzgqoRq9hywhqlPVtBmNSxZHt-NDCAx_0bcxwwNnwBKlYbI7VjA3U3ySBpcNed5NPRIMl5296H1g5b8UrDbSe-z8p33yeb9epJq5xppojBQFcFoS0Y0I6wQJW6SG2kfcSavXA8TLfTeRUjKE6-jnDnFs1ZzooPwVkqj4krTJa2qn1I" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="42" data-original-width="597" height="46" src="https://blogger.googleusercontent.com/img/a/AVvXsEis0aVP-DrUypNtIYzgqoRq9hywhqlPVtBmNSxZHt-NDCAx_0bcxwwNnwBKlYbI7VjA3U3ySBpcNed5NPRIMl5296H1g5b8UrDbSe-z8p33yeb9epJq5xppojBQFcFoS0Y0I6wQJW6SG2kfcSavXA8TLfTeRUjKE6-jnDnFs1ZzooPwVkqj4krTJa2qn1I=w640-h46" width="640" />
</a>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">Email Address []:email_da_minha_empresa_@minhaempresa.com.br</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEiZzBjD5yzzaqcoxC6c7YBtmsDjM5oc_hutS82545Y8V4EWAsdT5yJBVTbXFpYgcmJJg2nB-5_EnNQAACsY2CThKrgsdpFtPxiIZyMs3uZRxFJMcCXfU-80dOLNd_CjwMLkniRYfYWo-AHXBbzLIsha7-PmWfF3VZ0wkOlIzUiZqpg08HgxxXRaVQOwH3A" style="margin-left: 1em; margin-right: 1em;">
<div class="separator" style="clear: both; display: inline;">
<span style="text-align: left;">
<div class="separator" style="clear: both; display: inline; text-align: center;">
<span style="color: black;">
<div class="separator" style="clear: both; display: inline;">
<div class="separator" style="clear: both; display: inline;">
<div class="separator" style="clear: both; display: inline;">
<div class="separator" style="clear: both; display: inline;">
<span style="text-align: left;"> Com isso, o arquivo rootCA.pem será gerado.</span>
</div>
</div>
</div>
</div>
</span>
</div>
</span>
</div>
</a>
</div>
<div style="font-weight: 400; text-align: left;">
<br />
</div>
<div style="font-weight: 400; text-align: left;">2.1.3.3) Gerando o Certificado de Domínio: localhost. server.csr.cnf com o seguinte comando:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
nano server.csr.cnf
</code>
</pre>
</div>
<div style="text-align: left;">
<div class="separator" style="clear: both; font-weight: bold; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEifownIZW2iWNnKfqaxfcz0-uBeSNeH1ci6s-LqS1iTGEmu4f30o8ZxNJ9VIDTSKZ51FdTNQc1ysP9RNIqSkgEk6bn2PwXwlhNgcHxso5N7R9DAbrqXb81evgXiJd7fGsLsn42kd3qCizgETmwx-uB2yUGUhtAXGMjeKSuWM2viSbpLkLbydoBRVYsthmY" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="102" data-original-width="626" height="104" src="https://blogger.googleusercontent.com/img/a/AVvXsEifownIZW2iWNnKfqaxfcz0-uBeSNeH1ci6s-LqS1iTGEmu4f30o8ZxNJ9VIDTSKZ51FdTNQc1ysP9RNIqSkgEk6bn2PwXwlhNgcHxso5N7R9DAbrqXb81evgXiJd7fGsLsn42kd3qCizgETmwx-uB2yUGUhtAXGMjeKSuWM2viSbpLkLbydoBRVYsthmY=w640-h104" width="640" />
</a>
</div><div class="separator" style="clear: both; text-align: left;">2.1.3.3.1) Carregue o conteúdo abaixo no arquivo server.csr.cnf (Modificando os valores em negrito conforme sua necessidade)</div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[dn]
C=<b>US</b>
ST=<b>RandomState</b>
L=<b>RandomCity</b>
O=<b>RandomOrganization</b>
OU=<b>RandomOrganizationUnit</b>
emailAddress=<b>hello@example.com</b>
CN = localhost
</code>
</pre>
<div class="separator" style="clear: both; font-weight: 400; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEi2-WN1HAJsS0PmwbkE5taeSOVazB49dvw4rQn3wAzMIekhPvyEWuZamK_DSCum5ylyD98lqYIaIuBtf2IfCVw5euNhBAE1ZNABV8gz6gXDjPAFutNkf0zrQPJ5Qvi7qXYVPbtHhD2oSCy6nED_RJeplNe8Tlarcue2pi5FtKL02beIJ__ln9AYEbVdPRI" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="357" data-original-width="737" height="310" src="https://blogger.googleusercontent.com/img/a/AVvXsEi2-WN1HAJsS0PmwbkE5taeSOVazB49dvw4rQn3wAzMIekhPvyEWuZamK_DSCum5ylyD98lqYIaIuBtf2IfCVw5euNhBAE1ZNABV8gz6gXDjPAFutNkf0zrQPJ5Qvi7qXYVPbtHhD2oSCy6nED_RJeplNe8Tlarcue2pi5FtKL02beIJ__ln9AYEbVdPRI=w640-h310" width="640" />
</a>
</div>
<span style="font-weight: 400; text-align: center;">
<div style="text-align: center;">(CTRL X Y ENTER, para salvar)</div>
<div style="text-align: left;">2.1.3.3.2) Para criar um certificado X509 v3, crie, usando
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
nano v3.ext
</code>
</pre>
Um arquivo v3.ext (Atente-se que estamos definindo subjectAltName aqui) e cole o conteúdo abaixo:</div>
<div style="text-align: left;">
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = localhost
</code>
</pre>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjCrvijJJ2zdPK-S_CuFkffXDkAxfi6EQh6CSpnqI_zhc9rz8nI0XtMgps4JZ-OxFH_kGlzqFHhOBeq0dcbPr4c6TVng4SwpPTncvZyYGJjqV90e8Z8rqoCO6tpmdI_PJ0XBhi5molbKWPloIiHZ29k9E6wnuEg6MkFXkt5u7EKRy-Xb2mHz8Iijt3BICQ" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="245" data-original-width="803" height="196" src="https://blogger.googleusercontent.com/img/a/AVvXsEjCrvijJJ2zdPK-S_CuFkffXDkAxfi6EQh6CSpnqI_zhc9rz8nI0XtMgps4JZ-OxFH_kGlzqFHhOBeq0dcbPr4c6TVng4SwpPTncvZyYGJjqV90e8Z8rqoCO6tpmdI_PJ0XBhi5molbKWPloIiHZ29k9E6wnuEg6MkFXkt5u7EKRy-Xb2mHz8Iijt3BICQ=w640-h196" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">(CTRL X Y ENTER, para salvar)</div>
<div class="separator" style="clear: both; text-align: justify;">2.1.3.3.3) Agora, vamos criar uma chave de certificado para localhost usando as definições de configuração armazenadas em server.csr.cnf. Essa chave é armazenada em server.key. Para isso digite:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server.csr.cnf )
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: justify;">
<div class="separator" style="clear: both; font-weight: bold; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEiWXpvW0xeFCC7uY5ecWTGJySvc2PqE6TjUIaMqX70inQZ5JZwQFtjfoY1pm-lmDdtab6sxwhM4sS4vHRBNjAMGzwSGXjegGnCaBw9ovMbMV-KGcDxOvp8BrHmr76Qnx8moVkcUuRzgrKOejhwFYnuVlzERYymBM9Zn3_YxltWxINkQ8R7IntU3IvUh-NE" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="129" data-original-width="1108" height="74" src="https://blogger.googleusercontent.com/img/a/AVvXsEiWXpvW0xeFCC7uY5ecWTGJySvc2PqE6TjUIaMqX70inQZ5JZwQFtjfoY1pm-lmDdtab6sxwhM4sS4vHRBNjAMGzwSGXjegGnCaBw9ovMbMV-KGcDxOvp8BrHmr76Qnx8moVkcUuRzgrKOejhwFYnuVlzERYymBM9Zn3_YxltWxINkQ8R7IntU3IvUh-NE=w640-h74" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">Gerando<span style="text-align: justify;">server.csr</span>
</div>
<div class="separator" style="clear: both; text-align: left;">
<span style="text-align: justify;">2.1.3.3.4) Para finalizar, vamos gerar o arquivo server.key. Para isso digite:</span>
<span style="text-align: justify;">
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 3652 -sha256 -extfile v3.ext
</code>
</pre>
</span>
</div>
<div class="separator" style="clear: both; text-align: left;">
<span style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEihsZOTqePLHGBM72m8-RMzrC0rphpZVADHNLxcLhs1bSPSeNsIAwpGd0CIKuTAO5GQ-uIryU8Y-q5oX8F2dcBxXH4fzQki0SmaKlx24ADnnnlEWhzvH2cum8x0KEM7bV5S0t-JbQ1o13cpTsO0DkBbe5oqi3UOz_DSDAU8CM2PVcvudPOe_hpb-k3_uYs" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="158" data-original-width="1109" height="92" src="https://blogger.googleusercontent.com/img/a/AVvXsEihsZOTqePLHGBM72m8-RMzrC0rphpZVADHNLxcLhs1bSPSeNsIAwpGd0CIKuTAO5GQ-uIryU8Y-q5oX8F2dcBxXH4fzQki0SmaKlx24ADnnnlEWhzvH2cum8x0KEM7bV5S0t-JbQ1o13cpTsO0DkBbe5oqi3UOz_DSDAU8CM2PVcvudPOe_hpb-k3_uYs=w640-h92" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">Gerando<span style="text-align: justify;">server.key</span>
</div>
<div class="separator" style="clear: both; text-align: left;">
<span style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhrTMymr5KB8A0LALAqdQLLG44GJ8MPQixo5r4i7eW6v-FvU0rwNiwZKeqNrHUt8C7HKGcqhUaPOoc_CewWBz74x4DVmwoKBaJeOwVTzI1DqKROfZ_ps-RgKBss-gHWBKouxHkZ_jhL6QHsGb5n-trEW0dPTeJZZQ9X1Zg9Giy2-bjTmgXDYJeVo7us-8w" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="237" data-original-width="1110" height="136" src="https://blogger.googleusercontent.com/img/a/AVvXsEhrTMymr5KB8A0LALAqdQLLG44GJ8MPQixo5r4i7eW6v-FvU0rwNiwZKeqNrHUt8C7HKGcqhUaPOoc_CewWBz74x4DVmwoKBaJeOwVTzI1DqKROfZ_ps-RgKBss-gHWBKouxHkZ_jhL6QHsGb5n-trEW0dPTeJZZQ9X1Zg9Giy2-bjTmgXDYJeVo7us-8w=w640-h136" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">informe a senha usada para criar a chave RSA-2048</div>
<div class="separator" style="clear: both; text-align: left;">2.1.3.4.5) Com isso finalizamos a geração dos Certificados.</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">3)<b>Confiar no certificado SSL root</b>
</div>
<div class="separator" style="clear: both; text-align: left;">3.1) Copie os arquivos: rootCA.pem, server.crt e server.key para o destino de utilização, no meu caso o Apache. Neste caso executei:
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
cp rootCA.pem server.crt server.key /mnt/c/Apache24/conf/ssl/
</code>
</pre>
</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEidzoDPCJfgPak6r_KdGkFMZwYKY70DsFGiXYNQKNn2iWpk6pBfVU09NR5ZugOeL8xOPWY5oXrsSGIlBnoFn6qcwjJBKycEqoWvOSrfRhiNkT4ITiX8e_i4eXEeaRlffyoUiLiyBJSKeorifhd-Kba75Jrtj7zulC9mOSlO-0lvt_Fx8zMbyk3P7gvMSP8" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="147" data-original-width="929" height="102" src="https://blogger.googleusercontent.com/img/a/AVvXsEidzoDPCJfgPak6r_KdGkFMZwYKY70DsFGiXYNQKNn2iWpk6pBfVU09NR5ZugOeL8xOPWY5oXrsSGIlBnoFn6qcwjJBKycEqoWvOSrfRhiNkT4ITiX8e_i4eXEeaRlffyoUiLiyBJSKeorifhd-Kba75Jrtj7zulC9mOSlO-0lvt_Fx8zMbyk3P7gvMSP8=w640-h102" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjXG8s8ehNFuEHctqL3Kw5WF-TN3-pq3bdVdJc-0KCcFhGLqBnDKqy46oAUmjI2_yTHr4rxaKz1b57zxDAYUiLIMyn3Sb5nBZWYtCgbgLcj72MDqe8qqhkkhgRu9PNDGBlz-MYpaL0_pcJXw9p_BXG8-BI9o8aiqrth8VZIddXQ-_NTW0xyJpUrG8coFU0" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="299" data-original-width="971" height="198" src="https://blogger.googleusercontent.com/img/a/AVvXsEjXG8s8ehNFuEHctqL3Kw5WF-TN3-pq3bdVdJc-0KCcFhGLqBnDKqy46oAUmjI2_yTHr4rxaKz1b57zxDAYUiLIMyn3Sb5nBZWYtCgbgLcj72MDqe8qqhkkhgRu9PNDGBlz-MYpaL0_pcJXw9p_BXG8-BI9o8aiqrth8VZIddXQ-_NTW0xyJpUrG8coFU0=w640-h198" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: left;">3.2) "Confiando" com o Microsoft Edge: Abra o Microsoft Edge e vá em configurações:</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjs8RtyoIUqeFwJILWWev5WnTsjwW73Al-4G_FXdvfxa-jqQfyx4yN1wBYN1S4-pW841kthfftdMFwjd8f8xp3ISxwj_n86STSAh6sq-5rcW_OcGRqSr-Y0zkgZiYHyP_7k5JOxPZLVCtiUSwCEnd9CwX_oeRlPHAz479VTAWdBN2uG_27Jr64KlYNyKy4" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="694" data-original-width="1320" height="336" src="https://blogger.googleusercontent.com/img/a/AVvXsEjs8RtyoIUqeFwJILWWev5WnTsjwW73Al-4G_FXdvfxa-jqQfyx4yN1wBYN1S4-pW841kthfftdMFwjd8f8xp3ISxwj_n86STSAh6sq-5rcW_OcGRqSr-Y0zkgZiYHyP_7k5JOxPZLVCtiUSwCEnd9CwX_oeRlPHAz479VTAWdBN2uG_27Jr64KlYNyKy4=w640-h336" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: left;">3.3) Pesquise por "cert"</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEiQvtuJdeWCw18H06y5RGRiHOG0WGqPVY4xeXiliTMgQd9-bCelQvf8BB1QWuTLxOStg0J1CX0WuAoaQCzsXVMnWAVruGEGUpsDARaKaYIQeBseg5CB6lyAdDMIZ76FWR_cj2H6NvPmsKL2Q8cMr2miToDpNtqmgmwO5o7iZUbCoIuyig63p-rYLVQFWQo" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="696" data-original-width="1309" height="340" src="https://blogger.googleusercontent.com/img/a/AVvXsEiQvtuJdeWCw18H06y5RGRiHOG0WGqPVY4xeXiliTMgQd9-bCelQvf8BB1QWuTLxOStg0J1CX0WuAoaQCzsXVMnWAVruGEGUpsDARaKaYIQeBseg5CB6lyAdDMIZ76FWR_cj2H6NvPmsKL2Q8cMr2miToDpNtqmgmwO5o7iZUbCoIuyig63p-rYLVQFWQo=w640-h340" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: left;">3.4) Clique em "Gerenciar Certificados" e Depois em "Autoridades de Certificação Raiz Confiáveis"<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhiXWJRjKi9W-QtjQ6xFt8qA5dp21GKhmtjK1Ns-ts1RF4CH7jIB5JFDY5jdu7bvHKqMNlbqrPrhL6CYNL28dDoeSmPPsJZ0-zfnWIlMw4ABy68fZ1iiiTkeUccxa0fgA95T8XonZ99Zxqt-DSrrePGzdGu6CSKOyJaDFeHe6DKPGMT9rv9zGePP1o_9J8" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="468" data-original-width="503" height="595" src="https://blogger.googleusercontent.com/img/a/AVvXsEhiXWJRjKi9W-QtjQ6xFt8qA5dp21GKhmtjK1Ns-ts1RF4CH7jIB5JFDY5jdu7bvHKqMNlbqrPrhL6CYNL28dDoeSmPPsJZ0-zfnWIlMw4ABy68fZ1iiiTkeUccxa0fgA95T8XonZ99Zxqt-DSrrePGzdGu6CSKOyJaDFeHe6DKPGMT9rv9zGePP1o_9J8=w640-h595" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: left;">3.5) Clique em "Importar"</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEizQ4RuuxKCH90doVOT3foa0mYPRrVq-vpkqyiy-uPm_ZOmwnJqEbSn2102ZgVIq83hLEPgF8I9Uk3gNMMnLimw4XsrUqj9_-Omp4qB7X8rRLETAOuZig-iK9GqR3iwIVVgJ7g9gB2BMfJi8stXMWW6edrVpyiHBP3DbPVcmzPg1jlGST6TPlsA70axZ4o" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="515" data-original-width="529" height="622" src="https://blogger.googleusercontent.com/img/a/AVvXsEizQ4RuuxKCH90doVOT3foa0mYPRrVq-vpkqyiy-uPm_ZOmwnJqEbSn2102ZgVIq83hLEPgF8I9Uk3gNMMnLimw4XsrUqj9_-Omp4qB7X8rRLETAOuZig-iK9GqR3iwIVVgJ7g9gB2BMfJi8stXMWW6edrVpyiHBP3DbPVcmzPg1jlGST6TPlsA70axZ4o=w640-h622" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">Clique em Avançar</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhT2lhvo0VlZMnGruG8d2A8lt3majQaGRmVH-Vebjy7Et1MkgwW8tVZrRHU2jSKPgT-3emZi4ojGw-h-a2ku4Guecy9AR1Iy--sRSLV8ij2XB_EswoRkLymGqitHhDfib-G42Ln6I5W6aUw0JyOe5nQ-q2-Sd3oGN-ChB3tzvTEsTquMojGc1qrCWa49dg" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="466" data-original-width="967" height="308" src="https://blogger.googleusercontent.com/img/a/AVvXsEhT2lhvo0VlZMnGruG8d2A8lt3majQaGRmVH-Vebjy7Et1MkgwW8tVZrRHU2jSKPgT-3emZi4ojGw-h-a2ku4Guecy9AR1Iy--sRSLV8ij2XB_EswoRkLymGqitHhDfib-G42Ln6I5W6aUw0JyOe5nQ-q2-Sd3oGN-ChB3tzvTEsTquMojGc1qrCWa49dg=w640-h308" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">Selecione o arquivo rootCA.pem (Observe: Todos os arquivos)</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhfiMcMMsjv_9GuaYHiLKEtZNQl9zLtdqzne16wJCoHCJNUvMxI-kMpG-UCLdoX8Jt3YkIGunlFDnoTsL5enQwxAAc4_E13_MeRQ12W7Mz06WIpI6Zc4x0YW76prK73mZ4t6aoqUBc2QWhrLQzHgwP4n5R7vLTDANTBYjSurqaeu0iD1U5MFz1Tq9monfE" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="519" data-original-width="537" height="619" src="https://blogger.googleusercontent.com/img/a/AVvXsEhfiMcMMsjv_9GuaYHiLKEtZNQl9zLtdqzne16wJCoHCJNUvMxI-kMpG-UCLdoX8Jt3YkIGunlFDnoTsL5enQwxAAc4_E13_MeRQ12W7Mz06WIpI6Zc4x0YW76prK73mZ4t6aoqUBc2QWhrLQzHgwP4n5R7vLTDANTBYjSurqaeu0iD1U5MFz1Tq9monfE=w640-h619" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">arquivo rootCA.pem selecionado. Clique em Avançar.</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhdQc-lwvXzVGuE0OLMj04fUE4sskD032nn-_0Y-7r1Kmy0vU0oehZaMjUS4lxd7i0MyDVlaLMN_UWBMbe5iTO_PP4Jtg7RD0OoQPympoCVA3Ep9NDi5rkS7KbmSVmkUyrf0nI0iZj97CAmxw0vHlDFlwuXD1TZW90KJwbq8GIuZbXjyKXRM9xd2lG2JzM" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="519" data-original-width="534" height="622" src="https://blogger.googleusercontent.com/img/a/AVvXsEhdQc-lwvXzVGuE0OLMj04fUE4sskD032nn-_0Y-7r1Kmy0vU0oehZaMjUS4lxd7i0MyDVlaLMN_UWBMbe5iTO_PP4Jtg7RD0OoQPympoCVA3Ep9NDi5rkS7KbmSVmkUyrf0nI0iZj97CAmxw0vHlDFlwuXD1TZW90KJwbq8GIuZbXjyKXRM9xd2lG2JzM=w640-h622" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">Informe um local para o armazenamento do Certificado:<span style="text-align: left;">"<b>Autoridades de Certificação Raiz Confiáveis</b>"</span>
</div>
<div class="separator" style="clear: both; text-align: center;">
<span style="text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgTvIRFEix8cUrUxRgqP45trt_9kUnoGkQSublGI9w1xK-skINXzvEOULQyhUWMXeeW7qTrpZ-TBR_pRF18q8TCuLYLlLw6hREAPlrqF7Z3sksFtzGNnQHLQjoT0hpt2VlatHDiyMABiyRzXG1pj6lrCyO71ApraK4UyQCXQr_6FDa1E9N8_OvrDJLwHCk" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="518" data-original-width="531" height="624" src="https://blogger.googleusercontent.com/img/a/AVvXsEgTvIRFEix8cUrUxRgqP45trt_9kUnoGkQSublGI9w1xK-skINXzvEOULQyhUWMXeeW7qTrpZ-TBR_pRF18q8TCuLYLlLw6hREAPlrqF7Z3sksFtzGNnQHLQjoT0hpt2VlatHDiyMABiyRzXG1pj6lrCyO71ApraK4UyQCXQr_6FDa1E9N8_OvrDJLwHCk=w640-h624" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">Clique em "Concluir" para finalizar a importação.</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEji9eYbbyzoAu353ch8y1umGg7gAdx_O-7EZBKEJ8wsqg5mE3up-BGH981DW4QxlGk0AV8IHl5r_KqxoeZugvU03AlFYpOk7tp48X1zMybqTxHU2ocaQ4L8pf3vBWSMqa6fkcaUuecLGLhELYSN493bVQbHtMjRyzc5m3Mt0KofXGfMy6WlYZ34gfsJ8ic" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="371" data-original-width="409" height="580" src="https://blogger.googleusercontent.com/img/a/AVvXsEji9eYbbyzoAu353ch8y1umGg7gAdx_O-7EZBKEJ8wsqg5mE3up-BGH981DW4QxlGk0AV8IHl5r_KqxoeZugvU03AlFYpOk7tp48X1zMybqTxHU2ocaQ4L8pf3vBWSMqa6fkcaUuecLGLhELYSN493bVQbHtMjRyzc5m3Mt0KofXGfMy6WlYZ34gfsJ8ic=w640-h580" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">confirme a instalação</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjuzVdcJcXHRiYNjGaRB1WiK00inFQYoG85X91yB2gzB6YXrt_Ug3IogVounIq68QLXnAXCi7i1g88e1Hx6MGrCDBonxo11FsFADil5jRAnZ8HqnPNugpfe_h-U-f8YmpViQvcGuo78qvWdnL7SeY73g0V-LWku5_oc-j5q-nJog9kDC2IAvJW9vmhDt6c" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="143" data-original-width="266" height="215" src="https://blogger.googleusercontent.com/img/a/AVvXsEjuzVdcJcXHRiYNjGaRB1WiK00inFQYoG85X91yB2gzB6YXrt_Ug3IogVounIq68QLXnAXCi7i1g88e1Hx6MGrCDBonxo11FsFADil5jRAnZ8HqnPNugpfe_h-U-f8YmpViQvcGuo78qvWdnL7SeY73g0V-LWku5_oc-j5q-nJog9kDC2IAvJW9vmhDt6c=w400-h215" width="400" />
</a>
</div>
<br />
<div style="text-align: left;">4)
<b>Usando o novo certificado</b>. Exemplo: Apache. Arquivo: httpd-ahssl.conf</div>
<div style="text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEho0w3YaWciOXYVzqoM0dQBUPGqe5cOU3XNmDIIu237e1sMdaD2WFhEUOnSpKV9tGcIt37z4x1EM36esTU5w_rZSq_CtmZot6J6LegSKxRgv4hdV3y0M4BA_lgE7DME2T939g5nW2M_R7GE_wK8lS_qlyat6NamWQnziS8uiO1mAnNgSFG9dMLIpwf2LVg" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="482" data-original-width="1197" height="258" src="https://blogger.googleusercontent.com/img/a/AVvXsEho0w3YaWciOXYVzqoM0dQBUPGqe5cOU3XNmDIIu237e1sMdaD2WFhEUOnSpKV9tGcIt37z4x1EM36esTU5w_rZSq_CtmZot6J6LegSKxRgv4hdV3y0M4BA_lgE7DME2T939g5nW2M_R7GE_wK8lS_qlyat6NamWQnziS8uiO1mAnNgSFG9dMLIpwf2LVg=w640-h258" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: left;">5)
<b>Testando o novo Certificado no Microsoft Edge: localhost</b>
</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEh45E5BFH3uJtfhaWC4DV7kjf_w7W9YbPPM5iD0i_ywCQ3adOtZp799uYoJjF4oAFapMAzPawti0Wob9mSaCgAw6v6pf5Z5qyQl7oMVMPOdxyEW21jKnHx4c0OzqdmhJumJiWaKvgJBlci-Oa48uEbi6aUGzuEKNoeglvvgi_Foj7UkKIBy-lRA_b36_dE" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="699" data-original-width="1308" height="342" src="https://blogger.googleusercontent.com/img/a/AVvXsEh45E5BFH3uJtfhaWC4DV7kjf_w7W9YbPPM5iD0i_ywCQ3adOtZp799uYoJjF4oAFapMAzPawti0Wob9mSaCgAw6v6pf5Z5qyQl7oMVMPOdxyEW21jKnHx4c0OzqdmhJumJiWaKvgJBlci-Oa48uEbi6aUGzuEKNoeglvvgi_Foj7UkKIBy-lRA_b36_dE=w640-h342" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEiUIJATAt0twmeztOgJxhqOeWwIa8xl5d8alI6hEe2wy-Z4iKus4x1TtD6Hycd6hglw2hFFx6uLe4Tkfnut_VIN1wKJerQAR-z2oBxW1FDKaavY-91tsncCn8VtP5zaUNd_NxHDbrF87JLNniHuufdiQSZlShx3dgOosbZNeSUrDDT6UweNmavCuaM1lUM" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="694" data-original-width="1315" height="338" src="https://blogger.googleusercontent.com/img/a/AVvXsEiUIJATAt0twmeztOgJxhqOeWwIa8xl5d8alI6hEe2wy-Z4iKus4x1TtD6Hycd6hglw2hFFx6uLe4Tkfnut_VIN1wKJerQAR-z2oBxW1FDKaavY-91tsncCn8VtP5zaUNd_NxHDbrF87JLNniHuufdiQSZlShx3dgOosbZNeSUrDDT6UweNmavCuaM1lUM=w640-h338" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjB3MDe6tT4YyUVsItFpGg7HXY473x5Bk90XT-HVA-FTPohw2k0koKOveuzYlppiDMBBS3lYR0QJG-I5wfvqZwPRBD1pHdLw_TnSNGtJQXVqa80nw1ASqNDqJzJWLrcams0nPRwnKtdyPoHGNFTymJW9m9EENrjXNJLmYIPgClOGsh0kORnTCWq0vzLZeE" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="693" data-original-width="1306" height="340" src="https://blogger.googleusercontent.com/img/a/AVvXsEjB3MDe6tT4YyUVsItFpGg7HXY473x5Bk90XT-HVA-FTPohw2k0koKOveuzYlppiDMBBS3lYR0QJG-I5wfvqZwPRBD1pHdLw_TnSNGtJQXVqa80nw1ASqNDqJzJWLrcams0nPRwnKtdyPoHGNFTymJW9m9EENrjXNJLmYIPgClOGsh0kORnTCWq0vzLZeE=w640-h340" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: left;">6)<b>Testando o novo Certificado no Mozilla Firefox : localhost</b>
</div>
<div class="separator" style="clear: both; text-align: left;">
<div class="separator" style="clear: both; font-weight: bold; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgcAqck2ysxvzURMO8kw-42wxmujsJ_nPkNb8ESioP9qrgfm_NYwtbm2-RErP4rPaO62B7sAoYSWIK9xZFNfhdTmWiBWDMunqsQBE-2nKAcJy4zXvsgEHo19YSnCvjbq7-5qsPtY8PnMNq_B-nOT-4RvVZ2uZI1L-uM8EHkF3AZYOVdmCvYYDEOzJ4wtHg" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="724" data-original-width="1366" height="340" src="https://blogger.googleusercontent.com/img/a/AVvXsEgcAqck2ysxvzURMO8kw-42wxmujsJ_nPkNb8ESioP9qrgfm_NYwtbm2-RErP4rPaO62B7sAoYSWIK9xZFNfhdTmWiBWDMunqsQBE-2nKAcJy4zXvsgEHo19YSnCvjbq7-5qsPtY8PnMNq_B-nOT-4RvVZ2uZI1L-uM8EHkF3AZYOVdmCvYYDEOzJ4wtHg=w640-h340" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">Vá em configurações</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEgg2Joqw3RdElB7Xcif4Vqb5Rwj-RI0eE-ri02dbRD-ItR71gOAOIDG7xDHMTxF2cUIioQeAFwbDXEc_Jd-4gySdEm1zZScQQe-cmaXqTYbsHbUHvSTUhDzFUlA6DG3W9-LQToFxniqrHHAjCdmQKaB9WV-p-jccmm5fWRSEQlmiWm4JouSf0EFTxdsYR4" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="718" data-original-width="1366" height="336" src="https://blogger.googleusercontent.com/img/a/AVvXsEgg2Joqw3RdElB7Xcif4Vqb5Rwj-RI0eE-ri02dbRD-ItR71gOAOIDG7xDHMTxF2cUIioQeAFwbDXEc_Jd-4gySdEm1zZScQQe-cmaXqTYbsHbUHvSTUhDzFUlA6DG3W9-LQToFxniqrHHAjCdmQKaB9WV-p-jccmm5fWRSEQlmiWm4JouSf0EFTxdsYR4=w640-h336" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">pesquise por cert e clique em "Ver Certificados"</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjzVDmMtw1pEekgUiOp0qiqGXZwFimapTRV4QRWsv906ITCBzjWjMHtRRQLTIlEwJLRfx6m-2BKfSbCj_pWGZmTgn6DUW_MQwLDNSjb4hnYiUeh2P-YOyPCRMjodpgSXiVKHIckctMUx5BRl7TOYlWUTCQbrK4R3gv95UMgtmJ7Jzd2Rco3t9sRkvzeyBg" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="715" data-original-width="1366" height="334" src="https://blogger.googleusercontent.com/img/a/AVvXsEjzVDmMtw1pEekgUiOp0qiqGXZwFimapTRV4QRWsv906ITCBzjWjMHtRRQLTIlEwJLRfx6m-2BKfSbCj_pWGZmTgn6DUW_MQwLDNSjb4hnYiUeh2P-YOyPCRMjodpgSXiVKHIckctMUx5BRl7TOYlWUTCQbrK4R3gv95UMgtmJ7Jzd2Rco3t9sRkvzeyBg=w640-h334" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">clique em "Importar"</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEidy44rJzRVw11gxYPjn8N9BeRT6qahCh_oHR9LjhBc425VJxSdQgBy211C2QS0SM_yPFj06qtsWc_ZD90bah_v7stNsmBcjFPvU5170HG1MzF4AbQoQIKPHHbt9Mo0421lmsdZGd4aa9av1zoDstmdhZB3BUEK9dRdYyJ2O_8g1IabVFXDHFOm7cmH4JQ" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="720" data-original-width="1366" height="338" src="https://blogger.googleusercontent.com/img/a/AVvXsEidy44rJzRVw11gxYPjn8N9BeRT6qahCh_oHR9LjhBc425VJxSdQgBy211C2QS0SM_yPFj06qtsWc_ZD90bah_v7stNsmBcjFPvU5170HG1MzF4AbQoQIKPHHbt9Mo0421lmsdZGd4aa9av1zoDstmdhZB3BUEK9dRdYyJ2O_8g1IabVFXDHFOm7cmH4JQ=w640-h338" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">Selecione o arquivo: rootCA.pem</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEi_aZ1ACVmiKEk3yWBlzVsSOggkXYigcNhbbTUIPXK691FhZD47-dcJTamw1RE9ZAYJ_-qByka7NtWvf0YkxOGkc466eP99BLbKH6JlIm2to5Xx0NqR3doKNHNue3qoKScmJ_OX8BwcIaNI15wWZhbuOoV1X09m9YuSdK8uk9s_Rk8iKtkjxoknXli4AF4" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="718" data-original-width="1362" height="338" src="https://blogger.googleusercontent.com/img/a/AVvXsEi_aZ1ACVmiKEk3yWBlzVsSOggkXYigcNhbbTUIPXK691FhZD47-dcJTamw1RE9ZAYJ_-qByka7NtWvf0YkxOGkc466eP99BLbKH6JlIm2to5Xx0NqR3doKNHNue3qoKScmJ_OX8BwcIaNI15wWZhbuOoV1X09m9YuSdK8uk9s_Rk8iKtkjxoknXli4AF4=w640-h338" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">Marque as duas opções acima e clique em "OK"</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEjJPSDHjk0_NK3ontkdr_GsQ2OHUZf2FTJnmevodLrSTAaKwLlDOGVMtuVXs_lEi7__2yKQkf6LbUIU7tMwWSebcOkjWEX5NSXtXWfifWsVboVY7tYtAXZoc9oIMjqP5lHqulws08pTMNMb9AZ1-4SAeQUa5DfaUDuRngeNLhQ8TJNiaiA862dpONJNIVY" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="720" data-original-width="1366" height="338" src="https://blogger.googleusercontent.com/img/a/AVvXsEjJPSDHjk0_NK3ontkdr_GsQ2OHUZf2FTJnmevodLrSTAaKwLlDOGVMtuVXs_lEi7__2yKQkf6LbUIU7tMwWSebcOkjWEX5NSXtXWfifWsVboVY7tYtAXZoc9oIMjqP5lHqulws08pTMNMb9AZ1-4SAeQUa5DfaUDuRngeNLhQ8TJNiaiA862dpONJNIVY=w640-h338" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEhavl5LDFmdoUlnZHR74zbrZsh5dRsjjFe8oeShkXCRcxPhQ4EslbfIth4m78e9IZ-wjKFOPw6ARjONEtWhnsXJ_ykkmyiLDI9jTjtowprMgDSBwCmICLY7jtGGWFpMlTKzGFM22yvCTG6dS76NkfH4bTtBYzjHXgKWpn1l27Jp0kbczyoK1-2vZMOznOg" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="720" data-original-width="1366" height="338" src="https://blogger.googleusercontent.com/img/a/AVvXsEhavl5LDFmdoUlnZHR74zbrZsh5dRsjjFe8oeShkXCRcxPhQ4EslbfIth4m78e9IZ-wjKFOPw6ARjONEtWhnsXJ_ykkmyiLDI9jTjtowprMgDSBwCmICLY7jtGGWFpMlTKzGFM22yvCTG6dS76NkfH4bTtBYzjHXgKWpn1l27Jp0kbczyoK1-2vZMOznOg=w640-h338" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/a/AVvXsEg0BaX-mzhgLqy7oo_wgOlDz8ct7yjAM-9cyg83BBJquUBEGwF6VAJfukqmWa7WEjQfGt0j11CZsMCSbdjWaBP7YiiIFzBzfWrzrbAxfgppLuLdO3kN4XnzMo_1GS9xBySoEyPQXyakYZnkFEKm7eUv4-uXTPgi986VbDAfYU8NWtnm3nirwfjPDz4DAAw" style="margin-left: 1em; margin-right: 1em;">
<img data-original-height="720" data-original-width="1366" height="338" src="https://blogger.googleusercontent.com/img/a/AVvXsEg0BaX-mzhgLqy7oo_wgOlDz8ct7yjAM-9cyg83BBJquUBEGwF6VAJfukqmWa7WEjQfGt0j11CZsMCSbdjWaBP7YiiIFzBzfWrzrbAxfgppLuLdO3kN4XnzMo_1GS9xBySoEyPQXyakYZnkFEKm7eUv4-uXTPgi986VbDAfYU8NWtnm3nirwfjPDz4DAAw=w640-h338" width="640" />
</a>
</div>
<div class="separator" style="clear: both; text-align: center;">
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">Referência:<a href="https://www.freecodecamp.org/portuguese/news/como-fazer-o-https-funcionar-em-seu-ambiente-local-de-desenvolvimento-em-5-minutos/" rel="nofollow" target="_blank">Como fazer o HTTPS funcionar em seu ambiente local de desenvolvimento em 5 minutos</a>
</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">[]s</div>
<div class="separator" style="clear: both; text-align: left;">Naldo DJ</div>
<br />
<br />
</div>
<br />
<br />
</div>
<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<br />
</div>
<br />
<br />
</div>
<br />
<br />
</div>
<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<br />
</div>
<br />
<br />
</div>
<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<br />
</div>
<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<br />
</div>
<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<br />
</div>
<br />
<br />
</div>
<br />
<br />
</div>
</div>
<br />
<br />
</div>
<br />
<br />
</span>
</div>
<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<br />
</div>
<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<br />
</div>
<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: center;">
<br />
</div>
<br />
<br />
</div>
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<br />
<br />
</div>
<br />
<br />
</div>
<br />
<br />
</div>
<br />
<br />
</div>
<div class="separator" style="clear: both; text-align: left;">
<br />
</div>
<br />
<br />
</span>
</div>
<br />
<br />
</span>
</div>
<br />
</div>
<br />
<br />
</div>
</div>
</span>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: left;">
<br />
</div>
</div>
<div class="separator" style="clear: both; font-weight: 400; text-align: left;">
<br />
</div>
</div>
</div>
</span></div>
</div>
</div></div></div></div></div></div></div></span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-45184224425589168382023-07-19T11:37:00.015-03:002023-07-29T21:50:09.895-03:00BlackTDN :: Descompactando arquivos includes .ch e .th<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgAShsuqSKGdWnxLmKMKGBAv4tbY4rsvz_XY2seCHrE_iiIk3jEwdilvTBucrqlJEHRWn2qxghBGsIefuYqF7k6zBZkS0KW9upH4qsQNXL8idAuCv5wgw9KMy3FIgm4Hnq3kzfNi0P-wPwUZyndwG57joU2NUW8quwQcnmQbM4aVnif7DsL993ynNQpyZM" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="350" data-original-width="500" height="224" src="https://blogger.googleusercontent.com/img/a/AVvXsEgAShsuqSKGdWnxLmKMKGBAv4tbY4rsvz_XY2seCHrE_iiIk3jEwdilvTBucrqlJEHRWn2qxghBGsIefuYqF7k6zBZkS0KW9upH4qsQNXL8idAuCv5wgw9KMy3FIgm4Hnq3kzfNi0P-wPwUZyndwG57joU2NUW8quwQcnmQbM4aVnif7DsL993ynNQpyZM" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /> O pessoal da <a href="https://github.com/imsys/Protheus-Include" rel="nofollow" target="_blank">Imsys</a> já tinha criado uma versão para descompactar arquivos include. Mas, por algum motivo a versão deles não estã funcionando. Sendo assim. Disponibilizo, <a href="https://github.com/naldodj/naldodj-totvs-include-decompress" rel="nofollow" target="_blank">aqui</a>, duas novas versões.<p></p><p>*decompress.py</p><pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">import zlib
import sys
with open(sys.argv[1], 'rb') as f:
content = f.read()
decompress = zlib.decompressobj(-zlib.MAX_WBITS)
inflated = decompress.decompress(content[14:])
inflated += decompress.flush()
print(inflated[:-1].decode('utf-8', errors='ignore'))</code>
</pre>
<p>Exemplo (python):</p>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">./decompress.py .\includes\sigawin.ch > sigawin.ch</code></pre>
<p>*decompress.ps1</p><pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">param (
[string]$filePath
)
Add-Type -AssemblyName System.IO.Compression
$bytes = [System.IO.File]::ReadAllBytes($filePath)
$compressedContent = $bytes[14..($bytes.Length - 1)]
$stream = New-Object System.IO.MemoryStream
$stream.Write($compressedContent, 0, $compressedContent.Length)
$stream.Position = 0
$decompressor = New-Object System.IO.Compression.DeflateStream($stream, [System.IO.Compression.CompressionMode]::Decompress)
$reader = New-Object System.IO.StreamReader($decompressor, [System.Text.Encoding]::UTF8)
$inflated = $reader.ReadToEnd()
$reader.Close()
Write-Output ($inflated.Trim())</code></pre>
<p>Exemplo (pwsh):</p>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">pwsh .\decompress.ps1 -filePath ".\includes\sigawin.ch" > .\sigawin.ch</code></pre><pre><code>
<p>[]s.</p></code></pre>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-20983421889914599202023-07-11T05:22:00.004-03:002023-07-11T06:05:35.792-03:00BlackTDN :: SIGATRM :: Interface de Lançamento de Treinamentos usando tela MVC "só com GRID"<p> <b>Introdução</b>:</p><p>Neste artigo, apresentaremos a implementação de uma interface de lançamento de treinamentos usando a tela MVC com foco exclusivo em um componente do tipo GRID. Essa interface foi desenvolvida com o objetivo de simplificar o lançamento de treinamentos e permitir a duplicação de linhas de forma fácil e intuitiva.</p><p><br /></p><p><b>Descrição da necessidade</b>:</p><p>A necessidade era criar uma interface de lançamento de treinamentos que fosse simples e permitisse a duplicação de linhas. A ideia era desenvolver uma solução eficiente, que proporcionasse uma experiência agradável ao usuário, sem a necessidade de telas complexas ou muitos campos para preencher.</p><p><br /></p><p><b>Implementação</b>:</p><p>Para atender a essa necessidade, foi implementada a Interface de Lançamento de Treinamentos usando tela MVC "só com GRID". A estrutura MVC (Model-View-Controller) foi utilizada para separar as responsabilidades da interface, facilitando o desenvolvimento e a manutenção do código.</p><p><br /></p><p>O código fonte abaixo representa a implementação dessa interface:</p>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"> <code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
#include "totvs.ch"
#include "fwmvcdef.ch"
#define MVC_TITLE " :: Inserção de Treinamento"
/*
X3_VALID
RA6_ENTIDA => NaoVazio() .And. ExistCpo("RA0") .And. IF(FWISINCALLSTACK("U_INSTRM"),.t.,Tr010Desc(.F.))
RA6_CURSO => NaoVazio() .And. ExistCpo("RA1") .And. IF(FWISINCALLSTACK("U_INSTRM"),.t.,Tr010Desc(.F.))
X3_RELACAO
RA6_DESC => IF(FWISINCALLSTACK("U_INSTRM"),SPACE(GETSX3CACHE("RA6_DESC","X3_TAMANHO")),Tr010Desc(.T.))
*/
function U_INSTRM() as variant
local cSvFilAnt:=&("cFilAnt")
local xRet as variant
private cCadastro:=MVC_TITLE as character
private INCLUI:=.T. as logical
xRet:=FWExecView(MVC_TITLE,"VIEWDEF.INSERTTRAINING",MODEL_OPERATION_INSERT)
SetFilAnt(cSvFilAnt)
return(xRet)
static function ModelDef() as object
local aFieldsDet as array
local bLOkVld as codeblock
local bTOkVld as codeblock
local cFieldsDet as character
local oModel as object
local oHeader as object
local oDetail as object
aFieldsDet:=getFieldsDet()
oModel:=MPFormModel():New("INSERTTRAINING",{||.T.}/*bPre*/,{||.T.}/*bPos*/,/*bCommit*/,{||.T.}/*bCancel*/)
oModel:SetDescription(MVC_TITLE)
oModel:bCommit:={|oModel|ZZ4TTSCommit(oModel)}
oHeader:=FWFormModelStruct():New()
oHeader:addTable("",{"C_FAKE"},"::"/*MVC_TITLE*/,{||""})
oHeader:addField("FAKE","FAKE","C_FAKE","C",1)
oModel:addFields("INSERTTRAINING_MASTER",/*cOwner*/,oHeader,/*bPre*/,/*bPost*/,{|oMdl|{""}})
bDetail:={|cField|(cFieldsDet:=Upper(allTrim(cField)),(aScan(aFieldsDet,{|cField|(Upper(allTrim(cField))==cFieldsDet)})>0))}
oDetail:=FWFormStruct(1,"RA4",bDetail)
bLOkVld:={|oGrid|GridVldLOK(oGrid,oModel,aFieldsDet)}
bTOkVld:={|oGrid|GridVldTOK(oGrid,oModel,aFieldsDet)}
oModel:AddGrid("INSERTTRAINING_DETAIL","INSERTTRAINING_MASTER",oDetail,{||.T.},bLOkVld,{||.T.},bTOkVld,{||.T.})
oModel:GetModel("INSERTTRAINING_DETAIL"):SetUniqueLine({"RA4_FILIAL","RA4_MAT","RA4_CURSO","RA4_DATAIN"})
oModel:GetModel("INSERTTRAINING_DETAIL"):SetDescription(MVC_TITLE)
oModel:GetModel("INSERTTRAINING_DETAIL"):SetUseOldGrid(.T.)
oModel:setActivate({|oModel|onActivate(oModel)})
return(oModel)
static function ViewDef() as object
local aFieldsDet as array
local aFieldsSXB as array
local bDetail as codeblock
local bGDSeek as codeblock
local bReplicateLine as codeblock
local cField as character
local cFieldsDet as character
local nATSXB as numeric
local oView as object
local oModel as object
local oDetail as object
local oHeader as object
aFieldsDet:=getFieldsDet()
aFieldsSXB:=Array(0)
aAdd(aFieldsSXB,{"RA4_CURSO","U__RA1"})
aAdd(aFieldsSXB,{"RA4_ENTIDA","U__RA6"})
oHeader:=FWFormViewStruct():New()
oHeader:addField("C_FAKE","01","FAKE","FAKE",/*aHelp*/,"C")
bDetail:={|cField|(cFieldsDet:=Upper(allTrim(cField)),(aScan(aFieldsDet,{|cField|(Upper(allTrim(cField))==cFieldsDet)})>0))}
oDetail:=FWFormStruct(2,"RA4",bDetail)
oDetail:addField("RA4_FILIAL","00","Filial","Filial do sistema",/*aHelp*/,"C")
//Redefinir as consultas F3
aEval(;
oDetail:GetFields(),{|x|;
cField:=x[MVC_VIEW_IDFIELD],;
nATSXB:=aScan(aFieldsSXB,{|x|x[1]==cField}),;
x[MVC_VIEW_LOOKUP]:=if(nATSXB>0,aFieldsSXB[nATSXB][2],getSX3Cache(x[MVC_VIEW_IDFIELD],"X3_F3"));
})
oModel:=FWLoadModel("INSERTTRAINING")
oView:=FWFormView():New()
oView:SetModel(oModel)
oView:AddField("INSERTTRAINING_MASTER",oHeader,"INSERTTRAINING_MASTER")
oView:AddGrid("INSERTTRAINING_DETAIL",oDetail,"INSERTTRAINING_DETAIL")
oView:CreateHorizontalBox("INSERTTRAINING_BOX_MASTER",0)
oView:CreateHorizontalBox("INSERTTRAINING_BOX_DETAIL",100)
oView:SetOwnerView("INSERTTRAINING_MASTER","INSERTTRAINING_BOX_MASTER")
oView:SetOwnerView("INSERTTRAINING_DETAIL","INSERTTRAINING_BOX_DETAIL")
oView:EnableControlBar(.F.)
oView:lForceSetOwner:=.T.
bReplicateLine:={||GDReplicateLine(oModel),SetKey(VK_F5,bReplicateLine)}
SetKey(VK_F5,bReplicateLine)
oView:AddUserButton("Duplicar Linha <f5>","",bReplicateLine)
bGDSeek:={||GDSeek(nil,OemtoAnsi("Pesquisar nos Detalhes"),nil,nil,.T.,oModel:GetModel("INSERTTRAINING_DETAIL"))}
oView:AddUserButton("Pesquisar Detalhes","",bGDSeek)
return(oView)
static function GDReplicateLine(oModel) as numeric
local aFieldsDet as array
local aNoReplicate as array
local cField as character
local nField as numeric
local nFields as numeric
local nLines as numeric
local nLineAT as numeric
local nGDReplicateLine:=(-1) as numeric
local oModelGrid as object
local oFWViewActive as object
local xValue as variant
begin sequence
if (!FWISInCallStack("U_INSTRM"))
break
endif
oModelGrid:=oModel:GetModel("INSERTTRAINING_DETAIL")
nLines:=oModelGrid:Length()
nLineAT:=oModelGrid:GetLine()
nGDReplicateLine:=oModelGrid:AddLIne()
if (nGDReplicateLine>nLines)
aNoReplicate:=array(0)
aAdd(aNoReplicate,"RA4_MAT")
aAdd(aNoReplicate,"RA4_NOME")
aAdd(aNoReplicate,"RA4_UNOMEL")
aAdd(aNoReplicate,"RA4_DESCCU")
aAdd(aNoReplicate,"RA4_DESCEN")
aFieldsDet:=getFieldsDet()
nFields:=Len(aFieldsDet)
for nField:=1 to nFields
cField:=aFieldsDet[nField]
if (aScan(aNoReplicate,{|fld|(fld==cField)})>0)
loop
endif
xValue:=oModelGrid:GetValue(cField,nLineAT)
oModelGrid:GoLine(nGDReplicateLine)
oModelGrid:SetValue(cField,xValue,.T.)
next nField
FWFreeArray(@aFieldsDet)
FWFreeArray(@aNoReplicate)
oFWViewActive:=FWViewActive()
oFWViewActive:Refresh()
endif
end sequence
return(nGDReplicateLine)
static function MenuDef() as array
local aRotina:=array(0) as array
ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.INSERTTRAINING" OPERATION MODEL_OPERATION_INSERT ACCESS 0 //OPERATION 3
return(aRotina)
static function GridVldLOK(oGrid as object,oModel as object,aFieldsDet as array) as logical
local cField as character
local cKeySeek as character
local lLinhaOK:=.T. as logical
local nATRow as numeric
local nField as numeric
local nFields as numeric
local nRA4Order as numeric
local nRA6Order as numeric
nFields:=Len(aFieldsDet)
nATRow:=oGrid:GetLine()
begin sequence
if (oGrid:IsDeleted())
break
endif
for nField:=1 to nFields
cField:=aFieldsDet[nField]
lLinhaOK:=(!empty(oGrid:GetValue(cField)))
if (!lLinhaOK)
Help(nil,nil,"OBRIGAT",nil,PadR("Verifique o preenchimento do(s) campo(s) ("+cField+") Linha ("+cValToChar(nATRow)+")",255),1,0)
break
endif
next nField
cKeySeek:=FWFldGet("RA4_FILIAL",nATRow,oModel,.F.)
cKeySeek+=FWFldGet("RA4_MAT",nATRow,oModel,.F.)
SRA->(dbSetOrder(1))
lLinhaOK:=SRA->(MsSeek(cKeySeek,.F.))
if (!lLinhaOK)
cField:="RA4_FILIAL,RA4_MAT"
Help(nil,nil,"OBRIGAT",nil,PadR("Verifique o preenchimento do(s) campo(s) ("+cField+") Linha ("+cValToChar(nATRow)+")",255),1,0)
break
endif
nRA4Order:=RetOrder("RA4","RA4_FILIAL+RA4_MAT+RA4_CALEND+RA4_CURSO+RA4_TURMA+RA4_SINONI+DTOS(RA4_DATAIN)",.T.)
if (nRA4Order==0)
nRA4Order:=RetOrder("RA4","RA4_FILIAL+RA4_MAT+RA4_CURSO")
cKeySeek+=FWFldGet("RA4_CURSO",nATRow,oModel,.F.)
else
//RA4_FILIAL+RA4_MAT+RA4_CALEND+RA4_CURSO+RA4_TURMA+RA4_SINONI+DTOS(RA4_DATAIN)
cKeySeek+=Space(GetSX3Cache("RA4_CALEND","X3_TAMANHO"))
cKeySeek+=FWFldGet("RA4_CURSO",nATRow,oModel,.F.)
cKeySeek+=Space(GetSX3Cache("RA4_TURMA","X3_TAMANHO"))
cKeySeek+=Space(GetSX3Cache("RA4_SINONI","X3_TAMANHO"))
cKeySeek+=DToS(FWFldGet("RA4_DATAIN",nATRow,oModel,.F.))
endif
RA4->(dbSetOrder(nRA4Order))
lLinhaOK:=RA4->(!MsSeek(cKeySeek,.F.))
if (!lLinhaOK)
Help(nil,nil,"JAEXISTE",nil,PadR("Já Existe Informação deste curso para o Funcionário Linha ("+cValToChar(nATRow)+")",255),1,0)
break
endif
lLinhaOK:=(FWFldGet("RA4_DATAIN",nATRow,oModel,.F.)<=FWFldGet("RA4_DATAFI",nATRow,oModel,.F.))
if (!lLinhaOK)
Help(nil,nil,"RA4_DATAFI",nil,PadR("Data Final maior que Data Inicial ("+cValToChar(nATRow)+")",255),1,0)
break
endif
nRA6Order:=retOrder("RA6","RA6_FILIAL+RA6_ENTIDA+RA6_CURSO")
RA6->(dbSetOrder(nRA6Order))
cKeySeek:=xFilial("RA6",FWFldGet("RA4_FILIAL",nATRow,oModel,.F.))
cKeySeek+=FWFldGet("RA4_ENTIDA",nATRow,oModel,.F.)
cKeySeek+=FWFldGet("RA4_CURSO",nATRow,oModel,.F.)
lLinhaOK:=RA6->(MsSeek(cKeySeek,.F.))
if (!lLinhaOK)
Help(nil/*cRotina*/,nil/*nLinha*/,"RA4_ENTIDA"/*cCampo*/,nil/*cNome*/,PadR("O Código da Entidade informada não é válido. "+GetSX3Cache("RA4_CURSO","X3_TITULO")+" não vinculado: ("+FWFldGet("RA4_CURSO",nATRow,oModel,.F.)+") ("+cValToChar(nATRow)+").",255)/*cMensagem*/,1/*nLinha1*/,0/*nColuna*/,/*lPop*/,/*hWnd*/,/*nHeight*/,/*nWidth*/,/*lGravaLog*/,{"Informe um Código de Entidade Válido."}/*aSoluc*/)
break
endif
end sequence
return(lLinhaOK)
static function GridVldTOK(oGrid as object,oModel as object,aFieldsDet as array) as logical
local lTudoOK as logical
local nRow as numeric
local nRows as numeric
local nATRow as numeric
nATRow:=oGrid:GetLine()
nRows:=oGrid:Length()
for nRow:=1 to nRows
oGrid:GoLine(nRow)
if (oGrid:IsDeleted())
loop
endif
lTudoOK:=GridVldLOK(@oGrid,oModel,@aFieldsDet)
if (!lTudoOK)
exit
endif
next nRow
if (!lTudoOK)
oGrid:GoLine(nRow)
else
oGrid:GoLine(nATRow)
endif
return(lTudoOK)
static function onActivate(oModel) as variant
if (oModel:GetOperation()==MODEL_OPERATION_INSERT)
FwFldPut("C_FAKE","0",/*nLinha*/,oModel)
endif
return
static function getFieldsDet() as aray
local aFieldsDet as array
aFieldsDet:=array(0)
aAdd(aFieldsDet,"RA4_FILIAL")
aAdd(aFieldsDet,"RA4_MAT")
aAdd(aFieldsDet,"RA4_NOME")
aAdd(aFieldsDet,"RA4_ULIDER")
aAdd(aFieldsDet,"RA4_UNOMEL")
aAdd(aFieldsDet,"RA4_CURSO")
aAdd(aFieldsDet,"RA4_DESCCU")
aAdd(aFieldsDet,"RA4_ENTIDA")
aAdd(aFieldsDet,"RA4_DESCEN")
aAdd(aFieldsDet,"RA4_DURACA")
aAdd(aFieldsDet,"RA4_UNDURA")
aAdd(aFieldsDet,"RA4_HORAS")
aAdd(aFieldsDet,"RA4_DATAIN")
aAdd(aFieldsDet,"RA4_DATAFI")
aAdd(aFieldsDet,"RA4_UMODAL")
aAdd(aFieldsDet,"RA4_UAVREC")
aAdd(aFieldsDet,"RA4_EFICSN")
return(aFieldsDet)
function u_INSERTTRAINING() as variant
local aParameter as array
local xRet:=.F. as variant
begin sequence
if (!type("ParamIXB")=="A")
break
endif
aParameter:=&("ParamIXB")
xRet:=INSERTTRAINING(@aParameter)
end sequence
return(xRet)
static function INSERTTRAINING(aParameter as array) as variant
local cIDPonto as character
local cIDModel as character
local cObjMVCClassName as character
local nParameters as numeric
local oObjMVC as object
local xRet:=.T. as variant
begin sequence
nParameters:=len(aParameter)
oObjMVC:=aParameter[1]
cObjMVCClassName:=oObjMVC:ClassName()
cIDPonto:=aParameter[2]
cIDModel:=aParameter[3]
if (cIDPonto=="MODELPOS")
xRet:=.T.
break
endif
if (cIDPonto=="FORMPOS")
xRet:=.T.
break
endif
if (cIDPonto=="FORMLINEPRE")
if ((nParameters>=5).and.(aParameter[5]=="DELETE"))
xRet:=.T.
endif
break
endif
if (cIDPonto=="FORMLINEPOS")
xRet:=.T.
break
endif
if (cIDPonto=="MODELCOMMITTTS")
if ((cIDModel=="INSERTTRAINING_DETAIL").and.(cObjMVCClassName=="FWFORMGRID"))
xRet:=.T.
else
xRet:=.T.
endif
break
endif
if (cIDPonto=="MODELCOMMITNTTS")
xRet:=.T.
break
endif
if (cIDPonto=="FORMCOMMITTTSPRE")
xRet:=.T.
break
endif
if (cIDPonto=="FORMCOMMITTTSPOS")
xRet:=.T.
break
endif
if (cIDPonto=="MODELCANCEL")
xRet:=.T.
break
endif
if (cIDPonto=="BUTTONBAR")
xRet:=array(0)
break
endif
end sequence
return(xRet)
static function SetFilAnt(cFil) as character
local cSvFilAnt:=&("cFilAnt") as character
if (valType("cFilAnt")=="C")
cSvFilAnt:=&("cFilAnt")
if (cFil!=cSvFilAnt)
&("cFilAnt"):=cFil
FWSM0Util():setSM0PositionBycFilAnt()
endif
endif
return(cSvFilAnt)
static function ZZ4TTSCommit(oModel) as logical
local aSaveRows as array
local cSvcArqTab:=&("cArqTab") as character
local lZZ4TTSCommit as logical
local nAT as numeric
local oSaveModel as object
aSaveRows:=FWSaveRows()
oSaveModel:=FWModelActive(oModel)
//Altera o Modo de Acesso da Tabela RA4 para garantir a Gravação das Filiais informadas pelo usuário
//Desta Forma FWFormCommit não irá substituir a Filial Gravara
nAT:=AT("RA4",&("cArqTab"))
if (nAT>0)
&("cArqTab"):=SubStr(&("cArqTab"),1,nAT+2)+"C"+SubStr(&("cArqTab"),nAT+4)
else
&("cArqTab")+="RA4"+"C"+"/"
endif
lZZ4TTSCommit:=FWFormCommit(oModel)
&("cArqTab"):=cSvcArqTab
FWModelActive(oSaveModel)
FWRestRows(aSaveRows)
return(lZZ4TTSCommit)
function u_RA1SXBFilter()
return(SXBINSERTTRAINING():RA1Filter())
function u_RA6SXBFilter()
return(SXBINSERTTRAINING():RA6Filter())
static procedure __Dummy()
if (.F.)
__Dummy()
MODELDEF()
VIEWDEF()
MENUDEF()
endif
return
</f5></code><span style="font-family: Times New Roman;"><span style="white-space: normal;">
</span></span></pre><div style="text-align: center;">O Exemplo completo poderá ser obtido aqui (<a href="https://github.com/naldodj/naldodj-AdvPL-TLPP/tree/master/curso/mvc/OnlyGrid/RA4/src" rel="nofollow" target="_blank">GitHub</a>)</div><div style="text-align: center;"><br /></div><div style="text-align: left;"><div><b>Conclusão</b>:</div><div>A Interface de Lançamento de Treinamentos usando tela MVC "só com GRID" oferece uma solução simplificada e eficiente para o lançamento de treinamentos. A utilização do componente GRID proporciona uma experiência intuitiva ao usuário, permitindo a duplicação de linhas com facilidade. A estrutura MVC garante a separação das responsabilidades e facilita a manutenção do código.</div><div><br /></div><div>Com essa interface, é possível agilizar o processo de lançamento de treinamentos, proporcionando uma melhor experiência para os usuários e aumentando a produtividade da equipe responsável.</div><div><br /></div></div>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-12136569626185335952023-07-10T22:16:00.004-03:002023-07-10T22:20:51.052-03:00BlackTDN :: chatGPT :: Documentando um código AdvPL usando o chatGPT<p> <b>NaldoDj</b> : Consegue documentar o seguinte código?</p>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
#include "totvs.ch"
#include "fwmvcdef.ch"
#define MVC_TITLE " :: Inserção de Treinamento"
/*
X3_VALID
RA6_ENTIDA => NaoVazio() .And. ExistCpo("RA0") .And. IF(FWISINCALLSTACK("U_INSTRM"),.t.,Tr010Desc(.F.))
RA6_CURSO => NaoVazio() .And. ExistCpo("RA1") .And. IF(FWISINCALLSTACK("U_INSTRM"),.t.,Tr010Desc(.F.))
X3_RELACAO
RA6_DESC => IF(FWISINCALLSTACK("U_INSTRM"),SPACE(GETSX3CACHE("RA6_DESC","X3_TAMANHO")),Tr010Desc(.T.))
*/
function U_INSTRM() as variant
local cSvFilAnt:=&("cFilAnt")
local xRet as variant
private cCadastro:=MVC_TITLE as character
private INCLUI:=.T. as logical
xRet:=FWExecView(MVC_TITLE,"VIEWDEF.INSERTTRAINING",MODEL_OPERATION_INSERT)
SetFilAnt(cSvFilAnt)
return(xRet)
static function ModelDef() as object
local aFieldsDet as array
local bLOkVld as codeblock
local bTOkVld as codeblock
local cFieldsDet as character
local oModel as object
local oHeader as object
local oDetail as object
aFieldsDet:=getFieldsDet()
oModel:=MPFormModel():New("INSERTTRAINING",{||.T.}/*bPre*/,{||.T.}/*bPos*/,/*bCommit*/,{||.T.}/*bCancel*/)
oModel:SetDescription(MVC_TITLE)
oModel:bCommit:={|oModel|ZZ4TTSCommit(oModel)}
oHeader:=FWFormModelStruct():New()
oHeader:addTable("",{"C_FAKE"},"::"/*MVC_TITLE*/,{||""})
oHeader:addField("FAKE","FAKE","C_FAKE","C",1)
oModel:addFields("INSERTTRAINING_MASTER",/*cOwner*/,oHeader,/*bPre*/,/*bPost*/,{|oMdl|{""}})
bDetail:={|cField|(cFieldsDet:=Upper(allTrim(cField)),(aScan(aFieldsDet,{|cField|(Upper(allTrim(cField))==cFieldsDet)})>0))}
oDetail:=FWFormStruct(1,"RA4",bDetail)
bLOkVld:={|oGrid|GridVldLOK(oGrid,oModel,aFieldsDet)}
bTOkVld:={|oGrid|GridVldTOK(oGrid,oModel,aFieldsDet)}
oModel:AddGrid("INSERTTRAINING_DETAIL","INSERTTRAINING_MASTER",oDetail,{||.T.},bLOkVld,{||.T.},bTOkVld,{||.T.})
oModel:GetModel("INSERTTRAINING_DETAIL"):SetUniqueLine({"RA4_FILIAL","RA4_MAT","RA4_CURSO","RA4_DATAIN"})
oModel:GetModel("INSERTTRAINING_DETAIL"):SetDescription(MVC_TITLE)
oModel:GetModel("INSERTTRAINING_DETAIL"):SetUseOldGrid(.T.)
oModel:setActivate({|oModel|onActivate(oModel)})
return(oModel)
static function ViewDef() as object
local aFieldsDet as array
local aFieldsSXB as array
local bDetail as codeblock
local bGDSeek as codeblock
local bReplicateLine as codeblock
local cField as character
local cFieldsDet as character
local nATSXB as numeric
local oView as object
local oModel as object
local oDetail as object
local oHeader as object
aFieldsDet:=getFieldsDet()
aFieldsSXB:=Array(0)
aAdd(aFieldsSXB,{"RA4_CURSO","U__RA1"})
aAdd(aFieldsSXB,{"RA4_ENTIDA","U__RA6"})
oHeader:=FWFormViewStruct():New()
oHeader:addField("C_FAKE","01","FAKE","FAKE",/*aHelp*/,"C")
bDetail:={|cField|(cFieldsDet:=Upper(allTrim(cField)),(aScan(aFieldsDet,{|cField|(Upper(allTrim(cField))==cFieldsDet)})>0))}
oDetail:=FWFormStruct(2,"RA4",bDetail)
oDetail:addField("RA4_FILIAL","00","Filial","Filial do sistema",/*aHelp*/,"C")
//Redefinir as consultas F3
aEval(;
oDetail:GetFields(),{|x|;
cField:=x[MVC_VIEW_IDFIELD],;
nATSXB:=aScan(aFieldsSXB,{|x|x[1]==cField}),;
x[MVC_VIEW_LOOKUP]:=if(nATSXB>0,aFieldsSXB[nATSXB][2],getSX3Cache(x[MVC_VIEW_IDFIELD],"X3_F3"));
})
oModel:=FWLoadModel("INSERTTRAINING")
oView:=FWFormView():New()
oView:SetModel(oModel)
oView:AddField("INSERTTRAINING_MASTER",oHeader,"INSERTTRAINING_MASTER")
oView:AddGrid("INSERTTRAINING_DETAIL",oDetail,"INSERTTRAINING_DETAIL")
oView:CreateHorizontalBox("INSERTTRAINING_BOX_MASTER",0)
oView:CreateHorizontalBox("INSERTTRAINING_BOX_DETAIL",100)
oView:SetOwnerView("INSERTTRAINING_MASTER","INSERTTRAINING_BOX_MASTER")
oView:SetOwnerView("INSERTTRAINING_DETAIL","INSERTTRAINING_BOX_DETAIL")
oView:EnableControlBar(.F.)
oView:lForceSetOwner:=.T.
bReplicateLine:={||GDReplicateLine(oModel),SetKey(VK_F5,bReplicateLine)}
SetKey(VK_F5,bReplicateLine)
oView:AddUserButton("Duplicar Linha <f5>","",bReplicateLine)
bGDSeek:={||GDSeek(nil,OemtoAnsi("Pesquisar nos Detalhes"),nil,nil,.T.,oModel:GetModel("INSERTTRAINING_DETAIL"))}
oView:AddUserButton("Pesquisar Detalhes","",bGDSeek)
return(oView)
static function GDReplicateLine(oModel) as numeric
local aFieldsDet as array
local aNoReplicate as array
local cField as character
local nField as numeric
local nFields as numeric
local nLines as numeric
local nLineAT as numeric
local nGDReplicateLine:=(-1) as numeric
local oModelGrid as object
local oFWViewActive as object
local xValue as variant
begin sequence
if (!FWISInCallStack("U_INSTRM"))
break
endif
oModelGrid:=oModel:GetModel("INSERTTRAINING_DETAIL")
nLines:=oModelGrid:Length()
nLineAT:=oModelGrid:GetLine()
nGDReplicateLine:=oModelGrid:AddLIne()
if (nGDReplicateLine>nLines)
aNoReplicate:=array(0)
aAdd(aNoReplicate,"RA4_MAT")
aAdd(aNoReplicate,"RA4_NOME")
aAdd(aNoReplicate,"RA4_UNOMEL")
aAdd(aNoReplicate,"RA4_DESCCU")
aAdd(aNoReplicate,"RA4_DESCEN")
aFieldsDet:=getFieldsDet()
nFields:=Len(aFieldsDet)
for nField:=1 to nFields
cField:=aFieldsDet[nField]
if (aScan(aNoReplicate,{|fld|(fld==cField)})>0)
loop
endif
xValue:=oModelGrid:GetValue(cField,nLineAT)
oModelGrid:GoLine(nGDReplicateLine)
oModelGrid:SetValue(cField,xValue,.T.)
next nField
FWFreeArray(@aFieldsDet)
FWFreeArray(@aNoReplicate)
oFWViewActive:=FWViewActive()
oFWViewActive:Refresh()
endif
end sequence
return(nGDReplicateLine)
static function MenuDef() as array
local aRotina:=array(0) as array
ADD OPTION aRotina TITLE "Incluir" ACTION "VIEWDEF.INSERTTRAINING" OPERATION MODEL_OPERATION_INSERT ACCESS 0 //OPERATION 3
return(aRotina)
static function GridVldLOK(oGrid as object,oModel as object,aFieldsDet as array) as logical
local cField as character
local cKeySeek as character
local lLinhaOK:=.T. as logical
local nATRow as numeric
local nField as numeric
local nFields as numeric
local nRA4Order as numeric
local nRA6Order as numeric
nFields:=Len(aFieldsDet)
nATRow:=oGrid:GetLine()
begin sequence
if (oGrid:IsDeleted())
break
endif
for nField:=1 to nFields
cField:=aFieldsDet[nField]
lLinhaOK:=(!empty(oGrid:GetValue(cField)))
if (!lLinhaOK)
Help(nil,nil,"OBRIGAT",nil,PadR("Verifique o preenchimento do(s) campo(s) ("+cField+") Linha ("+cValToChar(nATRow)+")",255),1,0)
break
endif
next nField
cKeySeek:=FWFldGet("RA4_FILIAL",nATRow,oModel,.F.)
cKeySeek+=FWFldGet("RA4_MAT",nATRow,oModel,.F.)
SRA->(dbSetOrder(1))
lLinhaOK:=SRA->(MsSeek(cKeySeek,.F.))
if (!lLinhaOK)
cField:="RA4_FILIAL,RA4_MAT"
Help(nil,nil,"OBRIGAT",nil,PadR("Verifique o preenchimento do(s) campo(s) ("+cField+") Linha ("+cValToChar(nATRow)+")",255),1,0)
break
endif
nRA4Order:=RetOrder("RA4","RA4_FILIAL+RA4_MAT+RA4_CALEND+RA4_CURSO+RA4_TURMA+RA4_SINONI+DTOS(RA4_DATAIN)",.T.)
if (nRA4Order==0)
nRA4Order:=RetOrder("RA4","RA4_FILIAL+RA4_MAT+RA4_CURSO")
cKeySeek+=FWFldGet("RA4_CURSO",nATRow,oModel,.F.)
else
//RA4_FILIAL+RA4_MAT+RA4_CALEND+RA4_CURSO+RA4_TURMA+RA4_SINONI+DTOS(RA4_DATAIN)
cKeySeek+=Space(GetSX3Cache("RA4_CALEND","X3_TAMANHO"))
cKeySeek+=FWFldGet("RA4_CURSO",nATRow,oModel,.F.)
cKeySeek+=Space(GetSX3Cache("RA4_TURMA","X3_TAMANHO"))
cKeySeek+=Space(GetSX3Cache("RA4_SINONI","X3_TAMANHO"))
cKeySeek+=DToS(FWFldGet("RA4_DATAIN",nATRow,oModel,.F.))
endif
RA4->(dbSetOrder(nRA4Order))
lLinhaOK:=RA4->(!MsSeek(cKeySeek,.F.))
if (!lLinhaOK)
Help(nil,nil,"JAEXISTE",nil,PadR("Já Existe Informação deste curso para o Funcionário Linha ("+cValToChar(nATRow)+")",255),1,0)
break
endif
lLinhaOK:=(FWFldGet("RA4_DATAIN",nATRow,oModel,.F.)<=FWFldGet("RA4_DATAFI",nATRow,oModel,.F.))
if (!lLinhaOK)
Help(nil,nil,"RA4_DATAFI",nil,PadR("Data Final maior que Data Inicial ("+cValToChar(nATRow)+")",255),1,0)
break
endif
nRA6Order:=retOrder("RA6","RA6_FILIAL+RA6_ENTIDA+RA6_CURSO")
RA6->(dbSetOrder(nRA6Order))
cKeySeek:=xFilial("RA6",FWFldGet("RA4_FILIAL",nATRow,oModel,.F.))
cKeySeek+=FWFldGet("RA4_ENTIDA",nATRow,oModel,.F.)
cKeySeek+=FWFldGet("RA4_CURSO",nATRow,oModel,.F.)
lLinhaOK:=RA6->(MsSeek(cKeySeek,.F.))
if (!lLinhaOK)
Help(nil/*cRotina*/,nil/*nLinha*/,"RA4_ENTIDA"/*cCampo*/,nil/*cNome*/,PadR("O Código da Entidade informada não é válido. "+GetSX3Cache("RA4_CURSO","X3_TITULO")+" não vinculado: ("+FWFldGet("RA4_CURSO",nATRow,oModel,.F.)+") ("+cValToChar(nATRow)+").",255)/*cMensagem*/,1/*nLinha1*/,0/*nColuna*/,/*lPop*/,/*hWnd*/,/*nHeight*/,/*nWidth*/,/*lGravaLog*/,{"Informe um Código de Entidade Válido."}/*aSoluc*/)
break
endif
end sequence
return(lLinhaOK)
static function GridVldTOK(oGrid as object,oModel as object,aFieldsDet as array) as logical
local lTudoOK as logical
local nRow as numeric
local nRows as numeric
local nATRow as numeric
nATRow:=oGrid:GetLine()
nRows:=oGrid:Length()
for nRow:=1 to nRows
oGrid:GoLine(nRow)
if (oGrid:IsDeleted())
loop
endif
lTudoOK:=GridVldLOK(@oGrid,oModel,@aFieldsDet)
if (!lTudoOK)
exit
endif
next nRow
if (!lTudoOK)
oGrid:GoLine(nRow)
else
oGrid:GoLine(nATRow)
endif
return(lTudoOK)
static function onActivate(oModel) as variant
if (oModel:GetOperation()==MODEL_OPERATION_INSERT)
FwFldPut("C_FAKE","0",/*nLinha*/,oModel)
endif
return
static function getFieldsDet() as aray
local aFieldsDet as array
aFieldsDet:=array(0)
aAdd(aFieldsDet,"RA4_FILIAL")
aAdd(aFieldsDet,"RA4_MAT")
aAdd(aFieldsDet,"RA4_NOME")
aAdd(aFieldsDet,"RA4_ULIDER")
aAdd(aFieldsDet,"RA4_UNOMEL")
aAdd(aFieldsDet,"RA4_CURSO")
aAdd(aFieldsDet,"RA4_DESCCU")
aAdd(aFieldsDet,"RA4_ENTIDA")
aAdd(aFieldsDet,"RA4_DESCEN")
aAdd(aFieldsDet,"RA4_DURACA")
aAdd(aFieldsDet,"RA4_UNDURA")
aAdd(aFieldsDet,"RA4_HORAS")
aAdd(aFieldsDet,"RA4_DATAIN")
aAdd(aFieldsDet,"RA4_DATAFI")
aAdd(aFieldsDet,"RA4_UMODAL")
aAdd(aFieldsDet,"RA4_UAVREC")
aAdd(aFieldsDet,"RA4_EFICSN")
return(aFieldsDet)
function u_INSERTTRAINING() as variant
local aParameter as array
local xRet:=.F. as variant
begin sequence
if (!type("ParamIXB")=="A")
break
endif
aParameter:=&("ParamIXB")
xRet:=INSERTTRAINING(@aParameter)
end sequence
return(xRet)
static function INSERTTRAINING(aParameter as array) as variant
local cIDPonto as character
local cIDModel as character
local cObjMVCClassName as character
local nParameters as numeric
local oObjMVC as object
local xRet:=.T. as variant
begin sequence
nParameters:=len(aParameter)
oObjMVC:=aParameter[1]
cObjMVCClassName:=oObjMVC:ClassName()
cIDPonto:=aParameter[2]
cIDModel:=aParameter[3]
if (cIDPonto=="MODELPOS")
xRet:=.T.
break
endif
if (cIDPonto=="FORMPOS")
xRet:=.T.
break
endif
if (cIDPonto=="FORMLINEPRE")
if ((nParameters>=5).and.(aParameter[5]=="DELETE"))
xRet:=.T.
endif
break
endif
if (cIDPonto=="FORMLINEPOS")
xRet:=.T.
break
endif
if (cIDPonto=="MODELCOMMITTTS")
if ((cIDModel=="INSERTTRAINING_DETAIL").and.(cObjMVCClassName=="FWFORMGRID"))
xRet:=.T.
else
xRet:=.T.
endif
break
endif
if (cIDPonto=="MODELCOMMITNTTS")
xRet:=.T.
break
endif
if (cIDPonto=="FORMCOMMITTTSPRE")
xRet:=.T.
break
endif
if (cIDPonto=="FORMCOMMITTTSPOS")
xRet:=.T.
break
endif
if (cIDPonto=="MODELCANCEL")
xRet:=.T.
break
endif
if (cIDPonto=="BUTTONBAR")
xRet:=array(0)
break
endif
end sequence
return(xRet)
static function SetFilAnt(cFil) as character
local cSvFilAnt:=&("cFilAnt") as character
if (valType("cFilAnt")=="C")
cSvFilAnt:=&("cFilAnt")
if (cFil!=cSvFilAnt)
&("cFilAnt"):=cFil
FWSM0Util():setSM0PositionBycFilAnt()
endif
endif
return(cSvFilAnt)
static function ZZ4TTSCommit(oModel) as logical
local aSaveRows as array
local cSvcArqTab:=&("cArqTab") as character
local lZZ4TTSCommit as logical
local nAT as numeric
local oSaveModel as object
aSaveRows:=FWSaveRows()
oSaveModel:=FWModelActive(oModel)
//Altera o Modo de Acesso da Tabela RA4 para garantir a Gravação das Filiais informadas pelo usuário
//Desta Forma FWFormCommit não irá substituir a Filial Gravara
nAT:=AT("RA4",&("cArqTab"))
if (nAT>0)
&("cArqTab"):=SubStr(&("cArqTab"),1,nAT+2)+"C"+SubStr(&("cArqTab"),nAT+4)
else
&("cArqTab")+="RA4"+"C"+"/"
endif
lZZ4TTSCommit:=FWFormCommit(oModel)
&("cArqTab"):=cSvcArqTab
FWModelActive(oSaveModel)
FWRestRows(aSaveRows)
return(lZZ4TTSCommit)
function u_RA1SXBFilter()
return(SXBINSERTTRAINING():RA1Filter())
function u_RA6SXBFilter()
return(SXBINSERTTRAINING():RA6Filter())
static procedure __Dummy()
if (.F.)
__Dummy()
MODELDEF()
VIEWDEF()
MENUDEF()
endif
return
</f5></code>
</pre>
<p> <b>ChatGPT</b> : </p>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
O código fornecido parece ser um trecho de um programa escrito em AdvPL (Advanced Protheus Language), uma linguagem de programação utilizada para desenvolvimento de sistemas no ERP Protheus da TOTVS.
Aqui está uma documentação do código fornecido:
```plaintext
#include "totvs.ch"
#include "fwmvcdef.ch"
#define MVC_TITLE " :: Inserção de Treinamento"
/*
X3_VALID
RA6_ENTIDA => NaoVazio() .And. ExistCpo("RA0") .And. IF(FWISINCALLSTACK("U_INSTRM"),.t.,Tr010Desc(.F.))
RA6_CURSO => NaoVazio() .And. ExistCpo("RA1") .And. IF(FWISINCALLSTACK("U_INSTRM"),.t.,Tr010Desc(.F.))
X3_RELACAO
RA6_DESC => IF(FWISINCALLSTACK("U_INSTRM"),SPACE(GETSX3CACHE("RA6_DESC","X3_TAMANHO")),Tr010Desc(.T.))
*/
function U_INSTRM() as variant
local cSvFilAnt:=&("cFilAnt")
local xRet as variant
private cCadastro:=MVC_TITLE as character
private INCLUI:=.T. as logical
xRet:=FWExecView(MVC_TITLE,"VIEWDEF.INSERTTRAINING",MODEL_OPERATION_INSERT)
SetFilAnt(cSvFilAnt)
return(xRet)
static function ModelDef() as object
...
static function ViewDef() as object
...
static function GDReplicateLine(oModel) as numeric
...
static function MenuDef() as array
...
static function GridVldLOK(oGrid as object,oModel as object,aFieldsDet as array) as logical
...
static function GridVldTOK(oGrid as object,oModel as object,aFieldsDet as array) as logical
...
static function onActivate(oModel) as variant
...
static function getFieldsDet() as aray
...
function u_INSERTTRAINING() as variant
...
static function INSERTTRAINING(aParameter as array) as variant
...
static function SetFilAnt(cFil) as character
...
static function ZZ4TTSCommit(oModel) as logical
...
function u_RA1SXBFilter()
...
function u_RA6SXBFilter()
...
static procedure __Dummy()
...
```
Aqui está uma descrição dos principais elementos do código:
- `MVC_TITLE`: Constante definindo o título da página de inserção de treinamento.
- `U_INSTRM()`: Função responsável por executar a visualização de inserção de treinamento.
- `ModelDef()`: Função que define a estrutura do modelo utilizado na inserção de treinamento.
- `ViewDef()`: Função que define a estrutura da visualização utilizada na inserção de treinamento.
- `GDReplicateLine(oModel)`: Função que realiza a replicação de uma linha na grade de detalhes da inserção de treinamento.
- `MenuDef()`: Função que define o menu da aplicação, incluindo a opção de inclusão de treinamento.
- `GridVldLOK(oGrid as object, oModel as object, aFieldsDet as array)`: Função que valida os campos da grade de detalhes no momento da inclusão de treinamento.
- `GridVldTOK(oGrid as object, oModel as object, aFieldsDet as array)`: Função que valida todos os registros da grade de detalhes no momento da inclusão de treinamento.
- `onActivate(oModel)`: Função executada no momento da ativação do modelo de inserção de treinamento.
- `getFieldsDet()`: Função que retorna um array com os campos da grade de detalhes.
- `u_INSERTTRAINING()`: Função que executa a inserção de treinamento com base nos parâmetros fornecidos.
- `INSERTTRAINING(aParameter as array)`: Função principal responsável por tratar os eventos relacionados à inserção de treinamento.
- `SetFilAnt(cFil)`: Função que define o valor da variável de controle `cFilAnt`.
- `ZZ4TTSCommit(oModel)`: Função que realiza o commit do modelo de inserção de treinamento.
- `u_RA1SXBFilter()`: Função que retorna o filtro utilizado na tela de seleção de cursos.
- `u_RA6SXBFilter()`: Função que retorna o filtro utilizado na tela de seleção de entidades.
- `__Dummy()`: Procedimento vazio usado para garantir a correta compilação do código.
Essa é uma documentação básica do código fornecido, destacando suas principais funções e estruturas. Se você precisar de mais informações ou tiver alguma dúvida específica sobre alguma parte do código, fique à vontade para perguntar.
</code>
</pre>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-50836832082853937192023-07-10T16:09:00.003-03:002023-07-10T22:11:41.314-03:00BlackTDN :: TOTVS TWebEngine :: Connecti :: PainelRH<p> </p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="412" src="https://www.youtube.com/embed/SVc-t-TzUtQ" width="483" youtube-src-id="SVc-t-TzUtQ"></iframe></div><div class="separator" style="clear: both; text-align: center;"><br /></div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; overflow-wrap: normal; word-wrap: normal;">
#include "totvs.ch"
function u_TWebEngineConnectiPainelRH() as variant
local aButtons as array
local cTitle:="CONNECTI :: PainelRH" as character
local nTop as numeric
local nLeft as numeric
local nBottom as numeric
local nRight as numeric
local jButtons:=JSONObject():New() as json
local oDlg as object
local oGrp as object
local oTWebEngine as object
local oFWDefSize as object
private cCadastro:=cTitle as character
oFWDefSize:=FWDefSize():New(.F.)
oFWDefSize:lLateral:=.F.
oFWDefSize:AddObject("TWebEngine",100,95,.T.,.T.)
oFWDefSize:AddObject("ButtonActions",100,05,.F.,.F.)
oFWDefSize:Process()
nTop:=oFWDefSize:aWindSize[1]
nLeft:=oFWDefSize:aWindSize[2]
nBottom:=oFWDefSize:aWindSize[3]
nRight:=oFWDefSize:aWindSize[4]
aButtons:=array(0)
aAdd(aButtons,{"Go Home",{||oTWebEngine:goHome()},OemToAnsi("Go Home"),OemtoAnsi("Go Home")})
aAdd(aButtons,{"Go Back",{||oTWebEngine:goForward()},OemToAnsi("Go Back"),OemtoAnsi("Go Back")})
aAdd(aButtons,{"Go Forward",{||oTWebEngine:goHome()},OemToAnsi("Go Forward"),OemtoAnsi("Go Forward")})
aAdd(aButtons,{"Reload",{||oTWebEngine:Reload()},OemToAnsi("Reload"),OemtoAnsi("Reload")})
aAdd(aButtons,{"Print",{||oTWebEngine:Print()},OemToAnsi("Print"),OemtoAnsi("Print Home")})
aAdd(aButtons,{"Print PDF",{||oTWebEngine:PrintPDF()},OemToAnsi("Print PDF"),OemtoAnsi("Print PDF")})
aAdd(aButtons,{"Sair",{||oDlg:End()},OemToAnsi("Sair"),OemtoAnsi("Sair")})
DEFINE MSDIALOG oDlg TITLE cTitle FROM nTop,nLeft TO nBottom,nRight OF GetWndDefault() STYLE DS_MODALFRAME STATUS PIXEL
nTop:=oFWDefSize:GetDimension("TWebEngine","LININI")
nLeft:=oFWDefSize:GetDimension("TWebEngine","COLINI")
nBottom:=oFWDefSize:GetDimension("TWebEngine","LINEND")
nRight:=oFWDefSize:GetDimension("TWebEngine","COLEND")
nTop-=5
nBottom+=1
nRight-=5
oTWebEngine:=TWebEngine():New(oDlg,nTop,nLeft,nRight,nBottom,"http://localhost/ConnectiPainelRH")
oTWebEngine:SetAsMain()
nTop:=oFWDefSize:GetDimension("ButtonActions","LININI")
nBottom:=oFWDefSize:GetDimension("ButtonActions","LINEND")
nTop-=3
nRight+=3
@ nTop,03 GROUP oGrp TO nBottom+2,nRight PROMPT "" OF oDlg COLOR 0,16777215 PIXEL
nTop+=1
nRight+=5
//Botoes (da direita pra a esquerda)
@ nTop,(nRight)-((50*1)+06) BUTTON jButtons["1"] PROMPT aButtons[1][1] SIZE 50,08 OF oGrp ACTION Eval(aButtons[1][2]) PIXEL
@ nTop,(nRight)-((50*2)+09) BUTTON jButtons["2"] PROMPT aButtons[2][1] SIZE 50,08 OF oGrp ACTION Eval(aButtons[2][2]) PIXEL
@ nTop,(nRight)-((50*3)+12) BUTTON jButtons["3"] PROMPT aButtons[3][1] SIZE 50,08 OF oGrp ACTION Eval(aButtons[3][2]) PIXEL
@ nTop,(nRight)-((50*4)+15) BUTTON jButtons["4"] PROMPT aButtons[4][1] SIZE 50,08 OF oGrp ACTION Eval(aButtons[4][2]) PIXEL
@ nTop,(nRight)-((50*5)+18) BUTTON jButtons["5"] PROMPT aButtons[5][1] SIZE 50,08 OF oGrp ACTION Eval(aButtons[5][2]) PIXEL
@ nTop,(nRight)-((50*6)+21) BUTTON jButtons["6"] PROMPT aButtons[6][1] SIZE 50,08 OF oGrp ACTION Eval(aButtons[6][2]) PIXEL
@ nTop,(nRight)-((50*7)+24) BUTTON jButtons["7"] PROMPT aButtons[7][1] SIZE 50,08 OF oGrp ACTION Eval(aButtons[7][2]) PIXEL
oDlg:lEscClose:=.F.
ACTIVATE MSDIALOG oDlg CENTERED ON INIT (oTWebEngine:Navigate())
FWFreeArray(@aButtons)
FWFreeObj(oGrp)
FWFreeObj(oDlg)
FWFreeObj(jButtons)
FWFreeObj(oTWebEngine)
FWFreeObj(oFWDefSize)
DelClassIntF()
return(nil)
</code></pre>
<div class="separator" style="clear: both; text-align: center;">O Exemplo completo poderá ser obtido aqui (<a href="https://github.com/naldodj/naldodj-AdvPL-TLPP/tree/master/curso/TWebEngine" rel="nofollow" target="_blank">GitHub</a>)</div><br /><p></p>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-32989374731755493702023-06-23T16:56:00.006-03:002023-06-23T16:56:56.072-03:00BlackTDN :: Connecti Consultoria :: Soluções em RH :: Painel RH :: Consulta de Dados Por Empresa Grupo e SubGrupo de Verbas<p></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="337" src="https://www.youtube.com/embed/Xs0VEtuPmFo" width="405" youtube-src-id="Xs0VEtuPmFo"></iframe></div><div class="separator" style="clear: both; text-align: center;">Consulte: <a href="https://connecticonsultoria.com.br/" rel="nofollow" target="_blank">Connecti Consultoria</a></div><br /> <p></p>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-6646519103425212292023-06-22T21:25:00.007-03:002023-06-23T19:18:32.821-03:00BlackTDN :: Connecti Consultoria :: Soluções em RH :: Painel RH :: CONNECTI PAINELRH TURNOVER GERAL EMPRESA<p></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="402" src="https://www.youtube.com/embed/A2f6dxuFVzU" width="485" youtube-src-id="A2f6dxuFVzU"></iframe></div><div class="separator" style="clear: both; text-align: center;">Consulte: <a href="https://connecticonsultoria.com.br/" rel="nofollow" target="_blank">Connecti Consultoria</a></div><br /> <p></p>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-22886987120704394682023-06-22T16:38:00.005-03:002023-06-23T19:19:17.569-03:00BlackTDN :: Connecti :: Soluções em RH :: PainelRH :: Funcionários Previstos x Realizado<p> </p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="377" src="https://www.youtube.com/embed/8du7hhuTm20" width="455" youtube-src-id="8du7hhuTm20"></iframe></div><div class="separator" style="clear: both; text-align: center;">Contato: <a href="https://connecticonsultoria.com.br/" rel="nofollow" target="_blank">ConnecTI Consultoria</a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><p></p>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-85002452481438411972023-06-17T19:52:00.005-03:002023-06-17T19:53:16.123-03:00BlackTDN :: Blaze<p style="text-align: center;"> Acesse a <a href="http://blaze.com/r/Qb10ad" rel="nofollow" target="_blank">Blaze</a> e Ganhe Muito Dinheiro.</p>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-64159114221119717852023-06-16T22:23:00.001-03:002023-06-16T22:23:16.437-03:00BlackTDN :: Aprenda IA :: Conheça o curso gratuito Imersão Inteligência Artificial e domine a arte da IA :: Alura<p style="text-align: center;"> Aprenda IA</p><p style="text-align: center;">Conheça o curso gratuito Imersão Inteligência Artificial e domine a arte da IA. Transforme seu futuro agora!</p><p style="text-align: center;">clique <a href="https://imersao-ia-alura.framer.ai/" rel="nofollow" target="_blank">aqui </a></p>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-88779151018682061112023-03-17T16:10:00.004-03:002023-03-18T07:55:09.974-03:00BlackTDN :: Gerando Imagens com o OpenAI <pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"><code>
{
"ClassName" : "OpenAI.OpenAICoreFunction",
"FunctionName" : "OpenAI.Completions",
"FunctionParameters" : {
"Parameters" : {
"cUrl":"https://api.openai.com",
"cPath":"/v1/images/generations",
"OpenAIParameters" : {
"prompt":"Crie uma imagem dos personagem, Saitama e Fubuki, de One-Punch Man,
vestidos como o Superman e Mulher-Maravilha, respectivamente." ,
"n": 5,
"size": "1024x1024",
"response_format": "url"
}
}
}
}
</code>
</code></pre>
<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjSCTh3EWg3uIyrdA24ecEKndBaU-k23H-iurRxjYSnyngLzXrr5Pk9R-POyzwWEKnFe7vdNC_IVVhuE4xPZtOz-nezcNMutxTLegqYSwAlRoediw_UWdnL7g4iXl-xtWsHqFGWHdh6vqFi284IlmDR322_WvoJdikTW7HxrSlRCWy9hMDkkGMqqhqV" style="margin-left: 1em; margin-right: 1em;"><img alt="OpenAIImages" data-original-height="573" data-original-width="983" height="374" src="https://blogger.googleusercontent.com/img/a/AVvXsEjSCTh3EWg3uIyrdA24ecEKndBaU-k23H-iurRxjYSnyngLzXrr5Pk9R-POyzwWEKnFe7vdNC_IVVhuE4xPZtOz-nezcNMutxTLegqYSwAlRoediw_UWdnL7g4iXl-xtWsHqFGWHdh6vqFi284IlmDR322_WvoJdikTW7HxrSlRCWy9hMDkkGMqqhqV=w640-h374" title="OpenAIImages" width="640" /></a></div><br /><br /><p></p><p>Gerou isso. Que Bizarro!!!<br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj2tFg3au6PBzGyXPPOoD3qvByLzHreQeNEXORxWTLFMbEJfmV8aWej3jvO74D8YiWIqRsm4zOiVJVIwEaTwR0KyAkTX2uRbrflSIJJQxzoieF_YlqoOb7YZdcFM2klQwcBO3OIiKu6YOuMrqJlF5NO9QXSaAl7Wp-cneZtqpHmkvZqKqMzFQDLpd7f" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="768" data-original-width="1366" height="360" src="https://blogger.googleusercontent.com/img/a/AVvXsEj2tFg3au6PBzGyXPPOoD3qvByLzHreQeNEXORxWTLFMbEJfmV8aWej3jvO74D8YiWIqRsm4zOiVJVIwEaTwR0KyAkTX2uRbrflSIJJQxzoieF_YlqoOb7YZdcFM2klQwcBO3OIiKu6YOuMrqJlF5NO9QXSaAl7Wp-cneZtqpHmkvZqKqMzFQDLpd7f=w640-h360" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><p></p>
иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-90231516546684098892023-03-17T15:12:00.003-03:002023-03-18T07:57:04.719-03:00BlackTDN :: Comparando dados de uma Folha de Pagamento (Fictícia) usando OpenAI<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6Vwj4a0KPa50ileJbY6pnBlTh-YpwQq3pTjtO3cJ105KTXZc1P4uyf5wgWsEe24ZFJAPE4iL-JEsjSs-D-T12By9WJavU1y4I_CqSK2LiI7xw3BJznFOk0gKdrBRpEvCSfO-I0lYMv61ddD3EmB0P2i0mAkR4QtH99DdesaJVz-SdYjrHlmyMo5x0/s939/OpenAIComparandoFolhaDePagamento.png" style="margin-left: 1em; margin-right: 1em;"><img alt="OpenAIComparandoFolhaDePagamento" border="0" data-original-height="579" data-original-width="939" height="394" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6Vwj4a0KPa50ileJbY6pnBlTh-YpwQq3pTjtO3cJ105KTXZc1P4uyf5wgWsEe24ZFJAPE4iL-JEsjSs-D-T12By9WJavU1y4I_CqSK2LiI7xw3BJznFOk0gKdrBRpEvCSfO-I0lYMv61ddD3EmB0P2i0mAkR4QtH99DdesaJVz-SdYjrHlmyMo5x0/w640-h394/OpenAIComparandoFolhaDePagamento.png" title="OpenAIComparandoFolhaDePagamento" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /> <p></p>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"><code>
{
"ClassName": "OpenAI.OpenAICoreFunction",
"FunctionName": "OpenAI.Completions",
"FunctionParameters": {
"Parameters": {
"cUrl": "https://api.openai.com",
"cPath": "/v1/completions",
"OpenAIParameters": {
"model":"text-davinci-003",
"prompt": "Comparar os dados da folha de pagamento entre Janeiro e Fevereiro mostrando apenas as diferenças encontradas. { \"payroll_data\": { \"month\": \"Janeiro\", \"data\": { \"total_salaries\": 110000, \"total_taxes\": 33000, \"total_deductions\": 5500, \"net_payment\": 71450 }, { \"month\": \"Fevereiro\", \"total_salaries\": 110000, \"total_taxes\": 35000, \"total_deductions\": 5500, \"net_payment\": 71450 } } }",
"max_tokens": 100,
"n": 1,
"stop": "None",
"temperature": 0.5
}
}
}
}
</code>
</code></pre>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;"><code>
{
"id": "cmpl-6vCHj4UVbnm8rsTiQLOhTncnNyrRL",
"object": "text_completion",
"created": 1679089939,
"model": "text-davinci-003",
"choices": [
{
"text": "\n\nDiferenças: \nTotal de impostos: Janeiro - 33000 / Fevereiro - 35000 \nLíquido a pagar: Janeiro - 71450 / Fevereiro - 71450",
"index": 0,
"logprobs": null,
"finish_reason": null
}
],
"usage": {
"prompt_tokens": 138,
"completion_tokens": 50,
"total_tokens": 188
}
}
</code>
</code></pre>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-70213303201706809852023-03-09T16:25:00.006-03:002023-03-10T11:05:11.510-03:00BlackTDN :: Importando Dados do QRH (Quarta RH) para o SIGAGPE (TOTVS Microsiga Protheus) via Harbour & MiniGui<p> Precisando importar os dados do <a href="http://www.quarta.com.br/" rel="nofollow" target="_blank">QRH </a>para o<a href="https://www.totvs.com/" rel="nofollow" target="_blank"> TOTVS Microsiga Protheus</a>. </p><p>Que tal usar uma solução pronta e funcional.</p><p></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj0KBUmgPbi2rOsScapCI9Vg1qdd-nNysSQwzHcEFhsfqNAcV_yfr4z4jWjKNYlUTzyHvLDgIF_qLWX4j6LmtrflG35OPhJM3HH0rFuVOmsb4BfDgLi2SI60Sg8anheX10xF_ftSiyVfDdRmuLR--EVhg7l7Vhs3Vmtv_W17wyrRc_csw37vCKlLC1S" style="margin-left: 1em; margin-right: 1em;"><img alt="QRH2TotvsProtheus" data-original-height="730" data-original-width="1366" height="342" src="https://blogger.googleusercontent.com/img/a/AVvXsEj0KBUmgPbi2rOsScapCI9Vg1qdd-nNysSQwzHcEFhsfqNAcV_yfr4z4jWjKNYlUTzyHvLDgIF_qLWX4j6LmtrflG35OPhJM3HH0rFuVOmsb4BfDgLi2SI60Sg8anheX10xF_ftSiyVfDdRmuLR--EVhg7l7Vhs3Vmtv_W17wyrRc_csw37vCKlLC1S=w640-h342" title="QRH2TotvsProtheus" width="640" /></a></div><br /><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgsKCbOOFkFHdvFKRpOwKDvr1HxvT3AGNxMuyNd78rmarouiTzJYBycQHkWfJoY0Q1th0suhBPb337Ubvp8vhBfxO1CD4fJ2yO8mmfZ0ekWWPpslYdAtjDG111wnpX5jR1h3zTu6GrqiJR5cW1PorY8YjRgTsW8x-RQm1MzdVIFflxhE469N8F79Rce" style="margin-left: 1em; margin-right: 1em;"><img alt="QRH2TotvsProtheus" data-original-height="730" data-original-width="1366" height="342" src="https://blogger.googleusercontent.com/img/a/AVvXsEgsKCbOOFkFHdvFKRpOwKDvr1HxvT3AGNxMuyNd78rmarouiTzJYBycQHkWfJoY0Q1th0suhBPb337Ubvp8vhBfxO1CD4fJ2yO8mmfZ0ekWWPpslYdAtjDG111wnpX5jR1h3zTu6GrqiJR5cW1PorY8YjRgTsW8x-RQm1MzdVIFflxhE469N8F79Rce=w640-h342" title="QRH2TotvsProtheus" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhoNm2uDNOH9nxaG2YZkzq0Dvnb3bLbc23PU1X5ahSk4zw8i5FZ2t0DRKjHi2QNPhL0BXuvl3k7FlPrdMpBqr_pFFVIuyMsK9accqRn61lnQMSuBXAMt1GlUGElAEjZa0jJqnHCyYhaQVv0pe2aRkPmewZH1Ov4gC5iqP2Cma2YuGzEin1dc3Ls7D10" style="margin-left: 1em; margin-right: 1em;"><img alt="QRH2TotvsProtheus" data-original-height="768" data-original-width="1366" height="360" src="https://blogger.googleusercontent.com/img/a/AVvXsEhoNm2uDNOH9nxaG2YZkzq0Dvnb3bLbc23PU1X5ahSk4zw8i5FZ2t0DRKjHi2QNPhL0BXuvl3k7FlPrdMpBqr_pFFVIuyMsK9accqRn61lnQMSuBXAMt1GlUGElAEjZa0jJqnHCyYhaQVv0pe2aRkPmewZH1Ov4gC5iqP2Cma2YuGzEin1dc3Ls7D10=w640-h360" title="QRH2TotvsProtheus" width="640" /></a></div></div><p></p><p><br /></p><p>O código Fonte poderá ser obtido <a href="https://github.com/naldodj/naldodj-QRH2TotvsProtheus" rel="nofollow" target="_blank">aqui (GitHub)</a></p><p><br /></p><p>Obs.: A importação usa arquivos de configuração .ini para definir o De/Para entre um sistema e outro e faz a conexão direta ao Banco de Dados do QRH e do TOTVS Microsiga Protheus.</p><p><br /></p><p>Precisando de uma integração entre sistemas. Que tal entrar em contato. mail@blacktdn.com.br temos soluções testadas, aprovadas e muito rápidas.</p><p><br /></p><p><br /></p><p><br /></p>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-64243175485363966832023-03-09T16:04:00.007-03:002023-03-10T11:04:40.146-03:00BlackTDN :: Importando Dados do TOTVS Datasul para o TOTVS Microsiga Protheus usando arquivo .ini como configuração<p> Precisando importar dados das tabelas TOTVS Datasul para o TOTVS Microsiga Protheus... Temos a Solução.</p><p>Enviando arquivos Locais para o servidor</p><p></p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuwP-VsDVGkfwHB-LaoPKU_BoJ9_ywwN8UnbSfDLeBNhFstGe0WmdomyQ8Bka2Ot1ob9rofr66QXRkfcuoU6yjhjND8ox0euMc-B2YT1lTgwipUb-Twuo5AfNKVxxAZKws1Tf5-i1psaH_gwj7Cjn9RDvNcx2-lxrG9vD3Lj6vtcxV-RzFyEU7kTPp/s1366/datasul2totvsprotheus_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1366" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuwP-VsDVGkfwHB-LaoPKU_BoJ9_ywwN8UnbSfDLeBNhFstGe0WmdomyQ8Bka2Ot1ob9rofr66QXRkfcuoU6yjhjND8ox0euMc-B2YT1lTgwipUb-Twuo5AfNKVxxAZKws1Tf5-i1psaH_gwj7Cjn9RDvNcx2-lxrG9vD3Lj6vtcxV-RzFyEU7kTPp/w640-h360/datasul2totvsprotheus_01.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><div style="text-align: left;">Selecionando o Diretório para compactação dos arquivos a servem enviados para o servidor.</div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFkxSWCgnnQnG-z2zfvKjThkE8W9AGuw39S3y8svHWsRloTYwnA_yR1hS0DdtUF1Nk_-bthpDhovyq4-JhBW5q76sBKubf45zRgDhgSHxqhBfu4Tl3U1Ntw3lxTbpk1tuXvjOBKZIVMk8sz4j7ZFqO0h8PEcEjb6dtbrI97c0TbZl7GTQgCBBrhNFr/s1366/datasul2totvsprotheus_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Datasul2TotvsProtheus" border="0" data-original-height="768" data-original-width="1366" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFkxSWCgnnQnG-z2zfvKjThkE8W9AGuw39S3y8svHWsRloTYwnA_yR1hS0DdtUF1Nk_-bthpDhovyq4-JhBW5q76sBKubf45zRgDhgSHxqhBfu4Tl3U1Ntw3lxTbpk1tuXvjOBKZIVMk8sz4j7ZFqO0h8PEcEjb6dtbrI97c0TbZl7GTQgCBBrhNFr/w640-h360/datasul2totvsprotheus_02.png" title="Datasul2TotvsProtheus" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQmF7-qLEc6z7ccRapI3cqLUcvdZ4eXNFTGV20-LnlcRekmB3Yt3AeOcnTNucYKcHDByMb2jTPbRlEyTuG7n3Dj_ylk836b0ODdvvtRDMisgpLNPYnxlV1qwZHml0iCBqzCYIVlOjVXqE8Jbn9nQWX5bkkxdxphtowoeETHqPwt7MchrZT-qr2SUZn/s1366/datasul2totvsprotheus_03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Datasul2TotvsProtheus" border="0" data-original-height="768" data-original-width="1366" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQmF7-qLEc6z7ccRapI3cqLUcvdZ4eXNFTGV20-LnlcRekmB3Yt3AeOcnTNucYKcHDByMb2jTPbRlEyTuG7n3Dj_ylk836b0ODdvvtRDMisgpLNPYnxlV1qwZHml0iCBqzCYIVlOjVXqE8Jbn9nQWX5bkkxdxphtowoeETHqPwt7MchrZT-qr2SUZn/w640-h360/datasul2totvsprotheus_03.png" title="Datasul2TotvsProtheus" width="640" /></a></div><blockquote style="border: none; margin: 0 0 0 40px; padding: 0px;"><div class="separator" style="clear: both; text-align: left;">Arquivos Enviados ao Servidor</div></blockquote><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIPIe31695lZW4Rz7wAX_odxEEDOjw4WmLsUS9dqkzkUbkbNPdqI76dk3sVhkEmy64gtRM69BBj5BcS_T0Fi4g2W8QnioP_GkwaqZjGHQcHwaewh8a74H6Rp0PsiH2PnXMZL903Pq4hSFZzxyTczar117oWoTcEuRB0C_gaYWSMtrSvXTgVnK8PMwn/s1366/datasul2totvsprotheus_04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1366" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIPIe31695lZW4Rz7wAX_odxEEDOjw4WmLsUS9dqkzkUbkbNPdqI76dk3sVhkEmy64gtRM69BBj5BcS_T0Fi4g2W8QnioP_GkwaqZjGHQcHwaewh8a74H6Rp0PsiH2PnXMZL903Pq4hSFZzxyTczar117oWoTcEuRB0C_gaYWSMtrSvXTgVnK8PMwn/w640-h360/datasul2totvsprotheus_04.png" width="640" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div>Selecionando arquivo de Configuração da Importação<div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJZt8nNytui5S_TTO7X9ofySvtl1s4W085RA_itZcSuTH-22eYXiO_UN5P5tm4l6qBUvTkrRlfY80cem98OqTD_SQ97cdHykjuGoD5Z8nRDKBp0djUr2x3UFYSb6A9mgaEPN6IlI5tuB1kBK3WanAfugw8dhRiCViTcgz3HWwsIolvE7EUCTWCVTBG/s1366/datasul2totvsprotheus_05.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Datasul2TotvsProtheus" border="0" data-original-height="768" data-original-width="1366" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJZt8nNytui5S_TTO7X9ofySvtl1s4W085RA_itZcSuTH-22eYXiO_UN5P5tm4l6qBUvTkrRlfY80cem98OqTD_SQ97cdHykjuGoD5Z8nRDKBp0djUr2x3UFYSb6A9mgaEPN6IlI5tuB1kBK3WanAfugw8dhRiCViTcgz3HWwsIolvE7EUCTWCVTBG/w640-h360/datasul2totvsprotheus_05.png" title="Datasul2TotvsProtheus" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;">Menu com as opções de Importação e Configuração.</div><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdEaNvzPwi1bQBIlPh3_v52I-PLbFNFJb_wkiHwpgMu6JRUs3ejtLXqjElP1EfLloV0t4JMZPaU649R1Upze1rzYqak9lfK5uTSYLUeJwTn7p5h_mNf40eLwqUa4QDY2tLC7A-463H7oTLODt-3rSefhix9gV6r5qc8ZRcXilnwVyNtQIexGinTeEJ/s1366/datasul2totvsprotheus_06.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="717" data-original-width="1366" height="336" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdEaNvzPwi1bQBIlPh3_v52I-PLbFNFJb_wkiHwpgMu6JRUs3ejtLXqjElP1EfLloV0t4JMZPaU649R1Upze1rzYqak9lfK5uTSYLUeJwTn7p5h_mNf40eLwqUa4QDY2tLC7A-463H7oTLODt-3rSefhix9gV6r5qc8ZRcXilnwVyNtQIexGinTeEJ/w640-h336/datasul2totvsprotheus_06.png" width="640" /></a><br /><br /><p>Poderá ver o Core <a href="https://github.com/naldodj/naldodj-DataSul2TotvsProtheus" rel="nofollow" target="_blank">aqui (GitHub)</a>. Não tente executá-lo. Pois ele depende de Bibliotecas não Publicadas. Mas serve como referência de aprendizado.</p><p><br /></p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><br /></div><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br />иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-52930298692137076292023-03-09T15:25:00.006-03:002023-03-10T11:04:24.066-03:00BlackTDN :: FWMsExcelEx com Freeze e Formatação Condicional (Da série, Pedidos Inusitados)<p> FWMsExcelEx é uma mão na roda para gerar Planilha Excel mas um parto no que diz respeito a formatação de Células. </p><p>Este que vos escreve recebeu um pedido inusitado para "Colorir" determinadas colunas da Planilha Gerada pelo Protheus via FWMsExcelEx e Congelar Linhas e Colunas. </p><p>O Trabalho pesado a FWMsExcelEx fez: Gerou a Planilha com os dados. Agora vamos à perfumaria:</p>
<p>Definindo Freeze:</p>
<pre><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhLR8eU3o0MvK57LTR3gcMfaD4rXPuNIj_08nX-9S26Rj79Amj-xAGEf17ovx6OKC-367WRsAW5X8Hk9CxSgujijaEQHZwnWLuhS63BHY9JyiSgAF30kyS4hcbPIL9oYd7f-Tq1-oKnCXF5rlT1g85_kdnt2xrCp9kYa2QNISQ7tJS9b1CidypOAbV7" style="margin-left: 1em; margin-right: 1em;"><img alt="Fragmento de Código" data-original-height="171" data-original-width="653" height="168" src="https://blogger.googleusercontent.com/img/a/AVvXsEhLR8eU3o0MvK57LTR3gcMfaD4rXPuNIj_08nX-9S26Rj79Amj-xAGEf17ovx6OKC-367WRsAW5X8Hk9CxSgujijaEQHZwnWLuhS63BHY9JyiSgAF30kyS4hcbPIL9oYd7f-Tq1-oKnCXF5rlT1g85_kdnt2xrCp9kYa2QNISQ7tJS9b1CidypOAbV7=w640-h168" title="Fragmento de Código" width="640" /></a></div><br />
</pre>
<p>Definindo Formatação Condicional:</p>
<pre><code><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjppd6fUQzjYBRQY8mewoqEROtN3sdPpcwo8gO7LicqcLArMZijq2dGaFuNoYEszBoqdzeVyRrF_a_ip08rUKlcuz0SjLY0_wAaL-B8rutrp0QUFFSO1TD3wtKfN-LCY2kABQ-peT1XlzDTm-F9855dxHWzxE3ETX-7yO2kS7vrjcf3kTxQwg7Xpx0a" style="margin-left: 1em; margin-right: 1em;"><img alt="Fragmento de Código" data-original-height="151" data-original-width="1213" height="80" src="https://blogger.googleusercontent.com/img/a/AVvXsEjppd6fUQzjYBRQY8mewoqEROtN3sdPpcwo8gO7LicqcLArMZijq2dGaFuNoYEszBoqdzeVyRrF_a_ip08rUKlcuz0SjLY0_wAaL-B8rutrp0QUFFSO1TD3wtKfN-LCY2kABQ-peT1XlzDTm-F9855dxHWzxE3ETX-7yO2kS7vrjcf3kTxQwg7Xpx0a=w640-h80" title="Fragmento de Código" width="640" /></a></div><br /> </code>
</pre>
<p>Inserindo Freeze e Formatação Condicional:</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg1yRi7OLrkXVtbVuYf03mfm7F4bSEdN41VJjEqxv1WVIIbqMTY7X2ccC2Ge-fmhZZnb9qHrvkW8DEFdXc1towbaO8TLYjwNor29fCK2JqfKsG6Fp-hDr9_h1WXpAqbclNT2m0F1ADy3ro38Xy-uYT5K_RZiV_u-NYLP0D7FPORYDrJ2rCE8U2asIY0" style="margin-left: 1em; margin-right: 1em;"><img alt="Fragmento de Código" data-original-height="88" data-original-width="861" height="65" src="https://blogger.googleusercontent.com/img/a/AVvXsEg1yRi7OLrkXVtbVuYf03mfm7F4bSEdN41VJjEqxv1WVIIbqMTY7X2ccC2Ge-fmhZZnb9qHrvkW8DEFdXc1towbaO8TLYjwNor29fCK2JqfKsG6Fp-hDr9_h1WXpAqbclNT2m0F1ADy3ro38Xy-uYT5K_RZiV_u-NYLP0D7FPORYDrJ2rCE8U2asIY0=w640-h65" title="Fragmento de Código" width="640" /></a></div><br /><br /><p></p>
<pre><code><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhK4RDkro65aYDkBa09Tg6CdxbgSh6Lr94aqmfvA464-YgzIRkMB4zIoAm1eevctED1O4WD1hyzzpFQlER4cX3pv1Dwkn6S63E31UBn--9NDLh6JD1t1mfMhKdGR9r17L5IZghU2auakwEaCJHfK97xD7Q4CLsq1ec4GSNY7JFaHSR50bZKJpz8Kbtx" style="margin-left: 1em; margin-right: 1em;"><img alt="Fragmento de Código" data-original-height="255" data-original-width="703" height="232" src="https://blogger.googleusercontent.com/img/a/AVvXsEhK4RDkro65aYDkBa09Tg6CdxbgSh6Lr94aqmfvA464-YgzIRkMB4zIoAm1eevctED1O4WD1hyzzpFQlER4cX3pv1Dwkn6S63E31UBn--9NDLh6JD1t1mfMhKdGR9r17L5IZghU2auakwEaCJHfK97xD7Q4CLsq1ec4GSNY7JFaHSR50bZKJpz8Kbtx=w640-h232" title="Fragmento de Código" width="640" /></a></div><br />Vamos ter algo como:</code></pre><pre><code><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiMSPYKiLkTua7MOV4uZ98ZV2C5wWVupebY_eCdMjhwIhJ15Ur4vysao30VMZDWYxZHiIWGvoTv5gdOJzuedZISgzvmpzV9ibPEPrVvmHuZF5QwxavHHrDsJt3noR4YdxAO1Ox9Tfd3YMGTXIVwV9unvpPWHipjPV-qiYj1Ci_hBd5aeFVPh2IB7UHD" style="margin-left: 1em; margin-right: 1em;"><img alt="Planilha Excel" data-original-height="467" data-original-width="1082" height="277" src="https://blogger.googleusercontent.com/img/a/AVvXsEiMSPYKiLkTua7MOV4uZ98ZV2C5wWVupebY_eCdMjhwIhJ15Ur4vysao30VMZDWYxZHiIWGvoTv5gdOJzuedZISgzvmpzV9ibPEPrVvmHuZF5QwxavHHrDsJt3noR4YdxAO1Ox9Tfd3YMGTXIVwV9unvpPWHipjPV-qiYj1Ci_hBd5aeFVPh2IB7UHD=w640-h277" title="Planilha Excel" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjgJd4ZF_QJEWom2bzr1yXNBytAh_xbIapXci726a5-JGimHr_K83NRNOtYNlAKhLa4Gve8J5PsYVSc_0NCq_v2IAIVnOWInpBhqCgX8N6JZvHCmlV0zMIA9RTCpGxDBfMFW7LBDdm3JrzU2jOpDvAia2HFL_L5BOpTYuGIuQmN1k4w1-3oGa31NW_L" style="margin-left: 1em; margin-right: 1em;"><img alt="Planilha Excel" data-original-height="460" data-original-width="1083" height="272" src="https://blogger.googleusercontent.com/img/a/AVvXsEjgJd4ZF_QJEWom2bzr1yXNBytAh_xbIapXci726a5-JGimHr_K83NRNOtYNlAKhLa4Gve8J5PsYVSc_0NCq_v2IAIVnOWInpBhqCgX8N6JZvHCmlV0zMIA9RTCpGxDBfMFW7LBDdm3JrzU2jOpDvAia2HFL_L5BOpTYuGIuQmN1k4w1-3oGa31NW_L=w640-h272" title="Planilha Excel" width="640" /></a></div><br /><br /></code></pre><pre><code>O Exemplo completo poderá ser obtido <a href="https://github.com/naldodj/naldodj-AdvPL-TLPP/tree/master/curso/FWMsExcelEx" rel="nofollow" target="_blank">aqui (GitHub)</a></code></pre><pre>P.S.: A query do exemplo, apesar de funcional, foi elaborada para o MSSQL. Caso use outro SGBD adapte-a à sua necessidade.</pre>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-11624358306100958862023-01-25T02:29:00.008-03:002023-01-25T10:16:41.553-03:00BlackTDN :: TOTVS :: MSSQL :: Pivot Tables<div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="406" src="https://www.youtube.com/embed/1eE8w9zh1I4" width="489" youtube-src-id="1eE8w9zh1I4"></iframe></div><br /><div style="text-align: center;">Source: <a href="https://github.com/naldodj/naldodj-totvsGetDataModel/tree/main/scripts/sql/mssql" rel="nofollow" target="_blank">Github</a> Pivot*</div><div><br /></div><div>As tabelas pivot são ferramentas poderosas para analisar dados agregados em uma tabela dinâmica. </div><div><br /></div><div>Alguns benefícios de usar tabelas pivot em consultas no SQL Server incluem:</div><div><br /></div><div>1) Agrupamento de dados: As tabelas pivot permitem agrupar dados de várias linhas em uma única linha, tornando mais fácil de visualizar e comparar informações.</div><div><br /></div><div>2) Análise de dados: As tabelas pivot podem ser usadas para gerar estatísticas, somas e médias de dados, o que é útil para análise de dados e tomada de decisão.</div><div><br /></div><div>3) Filtro de dados: As tabelas pivot permitem filtrar dados de acordo com critérios específicos, facilitando a identificação de tendências e padrões.</div><div><br /></div><div>4) Interatividade: As tabelas pivot podem ser usadas com ferramentas de visualização de dados, permitindo que os usuários explorem e interajam com os dados de maneira intuitiva.</div><div><br /></div><div>5) Melhora na performance: As tabelas pivot são otimizadas para trabalhar com grandes conjuntos de dados, o que pode melhorar significativamente a performance de consultas.</div><div><br /></div><div>Considerando o seguinte cenário: Tabela de Grupos/Sub-Grupos de Verbas (utilizada para classificar as verbas, do cadastro de verbas, conforme Grupo/Sub-Grupo) onde queremos:</div><div><br /></div><div>1) Extrair dados da Ficha Financeira do funcionário, por determinado período do ano, e que classifique por:</div><div>1.1) Grupo de Verba e Meses do Ano;</div><div>1.2) Meses do Ano e Grupos de Verbas.</div><div><br /></div><div>Teríamos:</div><div><br /></div><div>a) Grupos/Sub-Grupos de Verbas;</div><div>b) Classificação das Verbas conforme Grupo/Sub-Grupo;</div><div>c) Consulta Pivot Grupo de Verba e Meses do Ano;</div><div>d) Consulta Pivot Meses do Ano e Grupos de Verbas.</div></div><div><br /></div><div><b>Tabela de Grupo de Verbas:</b></div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">
SELECT
ZY_.ZY__FILIAL
,ZY_.ZY__CODIGO
,ZY_.ZY__DESC
,ZY_.ZY__MASTER
,RTRIM(LTRIM(CONVERT(VARCHAR(MAX),ZY_.ZY__HTML))) ZY__HTML
,ZY_.ZY__SQLFLD
,ZY_.ZY__FPRFER
,ZY_.ZY__PROVFE
,ZY_.ZY__FPR13S
,ZY_.ZY__PROV13
,ZY_.ZY__FPRRES
,ZY_.ZY__PROVRE
FROM ZY_990 ZY_ WHERE 1=1
ORDER BY ZY_.ZY__FILIAL
,ZY_.ZY__MASTER
,ZY_.ZY__CODIGO
</code></pre>
Dados:<div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1IQZZuSG169mZkS--pRvgsLys3Eb2E9qlWCi0IOR-rnsGnvVXw0vei7yZUQSpaWObSl3bEKpw5exh6H_5prxoh1U9YlcjQGiC5QuaqlmSj217WsL86AotYwTG-9NT_wKMROIyImpGz_vSi1wJMk5gvRpeuJ6T0fYMXnQEKOMJib4XRnT5bhZ9bFqY/s816/GrupoDeVerbas.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Tabela de Grupo/SubGrupo" border="0" data-original-height="572" data-original-width="816" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1IQZZuSG169mZkS--pRvgsLys3Eb2E9qlWCi0IOR-rnsGnvVXw0vei7yZUQSpaWObSl3bEKpw5exh6H_5prxoh1U9YlcjQGiC5QuaqlmSj217WsL86AotYwTG-9NT_wKMROIyImpGz_vSi1wJMk5gvRpeuJ6T0fYMXnQEKOMJib4XRnT5bhZ9bFqY/s16000/GrupoDeVerbas.png" title="Tabela de Grupo/SubGrupo" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><b>Tabela de Verbas (Classificada conforme Grupo/Sub-Grupo):</b></div></div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">
SELECT SRV.RV_FILIAL
,SRV.RV_COD
,(CASE SRV.RV_DESCDET WHEN '' THEN SRV.RV_DESC ELSE SRV.RV_DESCDET END) RV_DESC
,SRV.RV_ZY__COD
,ZY_.ZY__CODIGO
,ZY_.ZY__DESC
FROM SRV990 SRV
LEFT
JOIN ZY_990 ZY_ ON (
ZY_.ZY__CODIGO=SRV.RV_ZY__COD
AND ((CASE ZY_.ZY__FILIAL WHEN '' THEN 1 WHEN SRV.RV_FILIAL THEN 1 ELSE 0 END)=1)
)
WHERE 1=1
AND ZY_.D_E_L_E_T_=''
AND SRV.D_E_L_E_T_=''
AND SRV.RV_FILIAL>=''
AND ZY_.ZY__FILIAL>=''
</code></pre>
Dados:<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikzbQ5a5NElsiSJ44TkVMzldD5--5CqQQO2QIQ5PVjUxDN9naKktjcDo00NvchVhcmmSGIIkKdpgaSbBTRF58YpfBgcaJcZeiwWswjMOZiC7H9SklxN38tLKEXtohnANGAE_YQ7A5dRlvMvaD9eFvk-0ipCqC2EN_bfGelUtSlPipTIwx0nXkzUWdB/s762/TabelaDeVerbasPorGrupoSubGrupo.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Tabela de Verbas Grupo/SubGrupo" border="0" data-original-height="556" data-original-width="762" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikzbQ5a5NElsiSJ44TkVMzldD5--5CqQQO2QIQ5PVjUxDN9naKktjcDo00NvchVhcmmSGIIkKdpgaSbBTRF58YpfBgcaJcZeiwWswjMOZiC7H9SklxN38tLKEXtohnANGAE_YQ7A5dRlvMvaD9eFvk-0ipCqC2EN_bfGelUtSlPipTIwx0nXkzUWdB/s16000/TabelaDeVerbasPorGrupoSubGrupo.png" title="Tabela de Verbas Grupo/SubGrupo" /></a></div><br /><div><b>Consulta Pivot por Grupo/Meses do Ano:</b></div>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">
IF OBJECT_ID('tempdb..##tmp_table_pivot_painel_acumulados_periodo_empresa_20230124_001', 'U') IS NOT NULL
DROP TABLE ##tmp_table_pivot_painel_acumulados_periodo_empresa_20230124_001
BEGIN
DECLARE @COMANDO_SQL AS VARCHAR(MAX)
DECLARE @COLUNAS_PIVOT AS VARCHAR(MAX)
DECLARE @COLUNAS_PIVOT_SUM AS VARCHAR(MAX)
DECLARE @COLUNAS_PIVOT_TOTAL AS VARCHAR(MAX)
DECLARE @COLUNAS_PIVOT_NONULLS AS VARCHAR(MAX)
DECLARE @DATARQDE AS VARCHAR(6)
SET @DATARQDE='202101'
DECLARE @DATARQATE AS VARCHAR(6)
SET @DATARQATE='202112'
DECLARE @CCDE AS VARCHAR(MAX)
SET @CCDE=''
DECLARE @CCATE AS VARCHAR(MAX)
SET @CCATE='z'
DECLARE @FILIALDE AS VARCHAR(MAX)
SET @FILIALDE=''
DECLARE @FILIALATE AS VARCHAR(MAX)
SET @FILIALATE='z'
DECLARE @GRUPODE AS VARCHAR(MAX)
SET @GRUPODE=''
DECLARE @GRUPOATE AS VARCHAR(MAX)
SET @GRUPOATE='z'
DECLARE @TTSNAME AS VARCHAR(MAX)
SET @TTSNAME='tmp_table_pivot_painel_acumulados_periodo_empresa_20230124_001'
DECLARE @TABLENAME AS VARCHAR(MAX)
SET @TABLENAME='##tmp_table_pivot_painel_acumulados_periodo_empresa_20230124_001'
SET LANGUAGE Portuguese
BEGIN TRY
SET @COLUNAS_PIVOT = STUFF((SELECT ',' + QUOTENAME(RTRIM(LTRIM(cols_pivot.RD_DATARQ)))
FROM (
SELECT SRD.RD_DATARQ
,SRD.RD_DATARQ YEARMONT
,(ROW_NUMBER() OVER (PARTITION BY SRD.RD_DATARQ ORDER BY SRD.RD_DATARQ )) ID
FROM SRD990 SRD
JOIN SRV990 SRV ON (SRV.RV_COD=SRD.RD_PD AND ((CASE SRV.RV_FILIAL WHEN '' THEN 1 WHEN SRD.RD_FILIAL THEN 1 ELSE 0 END)=1) )
JOIN ZY_990 ZY_ ON (ZY_.ZY__CODIGO=SRV.RV_ZY__COD AND ((CASE ZY_.ZY__FILIAL WHEN '' THEN 1 WHEN SRV.RV_FILIAL THEN 1 ELSE 0 END)=1) )
JOIN SRA990 SRA ON (SRA.RA_FILIAL=SRD.RD_FILIAL AND SRA.RA_MAT=SRD.RD_MAT)
WHERE SRD.D_E_L_E_T_=''
AND SRA.D_E_L_E_T_=''
AND SRV.D_E_L_E_T_=''
AND ZY_.D_E_L_E_T_=''
AND ZY_.ZY__MASTER<>''
AND SRD.RD_DATARQ BETWEEN @DATARQDE AND @DATARQATE
AND SRD.RD_CC BETWEEN @CCDE AND @CCATE
AND SRD.RD_FILIAL BETWEEN @FILIALDE AND @FILIALATE
AND ZY_.ZY__MASTER BETWEEN @GRUPODE AND @GRUPOATE
AND ZY_.ZY__SQLFLD<>''
GROUP BY SRD.RD_DATARQ
) cols_pivot ORDER BY YEARMONT,ID FOR XML PATH('') ), 1, 1, '')
SET @COLUNAS_PIVOT_NONULLS='SELECT '+REPLACE(REPLACE(REPLACE(@COLUNAS_PIVOT,',',' UNION SELECT'),'[',''''),']',''' RD_DATARQ')
EXECUTE('SELECT * INTO ##tmp_table_pivot_painel_acumulados_periodo_empresa_20230124_002 FROM ('+@COLUNAS_PIVOT_NONULLS+') t')
SET @COLUNAS_PIVOT_NONULLS = STUFF((SELECT DISTINCT ',ISNULL(' + QUOTENAME(RTRIM(LTRIM(cols_pivot_notnull.RD_DATARQ)))+',0)' + QUOTENAME(RTRIM(LTRIM(cols_pivot_notnull.RD_DATARQ)))
FROM ( select * from ##tmp_table_pivot_painel_acumulados_periodo_empresa_20230124_002 ) cols_pivot_notnull FOR XML PATH('')), 1, 1, '')
SET @COLUNAS_PIVOT_SUM = STUFF((SELECT DISTINCT ',ISNULL(SUM(' + QUOTENAME(RTRIM(LTRIM(cols_pivot_sum.RD_DATARQ)))+'),0)' + QUOTENAME(RTRIM(LTRIM(CONCAT(UPPER(LEFT(DATENAME(MONTH,CAST(CONCAT(cols_pivot_sum.RD_DATARQ,'01') AS DATETIME)),3)),LEFT(cols_pivot_sum.RD_DATARQ,4)))))
FROM ( select * from ##tmp_table_pivot_painel_acumulados_periodo_empresa_20230124_002 ) cols_pivot_sum FOR XML PATH('')), 1, 1, '')
SET @COLUNAS_PIVOT_TOTAL = STUFF((SELECT DISTINCT ',ISNULL(' + QUOTENAME(RTRIM(LTRIM(cols_pivot_total.RD_DATARQ)))+',0)'
FROM ( select * from ##tmp_table_pivot_painel_acumulados_periodo_empresa_20230124_002 ) cols_pivot_total FOR XML PATH('')), 1, 1, '')
SET @COLUNAS_PIVOT_TOTAL=REPLACE(REPLACE(@COLUNAS_PIVOT_TOTAL,',','+'),'+0',',0')
DROP TABLE ##tmp_table_pivot_painel_acumulados_periodo_empresa_20230124_002
SET @COMANDO_SQL = '
SELECT t.ZY__MASTER
,ZY_.ZY__DESC
,'+@COLUNAS_PIVOT_SUM+'
,TOTAL=SUM(t.TOTAL)
FROM (
SELECT t.ZY__MASTER
,'+@COLUNAS_PIVOT_NONULLS+'
,TOTAL=SUM('+@COLUNAS_PIVOT_TOTAL+')
FROM
(SELECT * FROM
(
SELECT SRD.RD_DATARQ
,ZY_.ZY__MASTER
,SUM(SRD.RD_VALOR) RD_VALOR
FROM SRA990 SRA
JOIN SRD990 SRD ON (SRA.RA_FILIAL=SRD.RD_FILIAL AND SRA.RA_MAT=SRD.RD_MAT)
JOIN SRV990 SRV ON (SRV.RV_COD=SRD.RD_PD AND ((CASE SRV.RV_FILIAL WHEN '''' THEN 1 WHEN SRD.RD_FILIAL THEN 1 ELSE 0 END)=1) )
JOIN ZY_990 ZY_ ON (ZY_.ZY__CODIGO=SRV.RV_ZY__COD AND ((CASE ZY_.ZY__FILIAL WHEN '''' THEN 1 WHEN SRV.RV_FILIAL THEN 1 ELSE 0 END)=1) )
JOIN CTT990 CTT ON (CTT.CTT_CUSTO=SRD.RD_CC AND ((CASE CTT.CTT_FILIAL WHEN '''' THEN 1 WHEN SRD.RD_FILIAL THEN 1 ELSE 0 END)=1) )
WHERE SRD.D_E_L_E_T_=''''
AND SRA.D_E_L_E_T_=''''
AND SRV.D_E_L_E_T_=''''
AND ZY_.D_E_L_E_T_=''''
AND CTT.D_E_L_E_T_=''''
AND SRD.RD_DATARQ BETWEEN '''+@DATARQDE+''' AND '''+@DATARQATE+'''
AND SRD.RD_CC BETWEEN '''+@CCDE+''' AND '''+@CCATE+'''
AND SRD.RD_FILIAL BETWEEN '''+@FILIALDE+''' AND '''+@FILIALATE+'''
AND ZY_.ZY__MASTER BETWEEN '''+@GRUPODE+''' AND '''+@GRUPOATE+'''
AND ZY_.ZY__SQLFLD<>''''
GROUP BY SRD.RD_DATARQ,ZY_.ZY__MASTER
) ROW
PIVOT (SUM(ROW.RD_VALOR) FOR ROW.RD_DATARQ IN (' + @COLUNAS_PIVOT + ')) COL ) t
GROUP BY t.ZY__MASTER,t.'+@COLUNAS_PIVOT+') t
JOIN ZY_990 ZY_ ON (ZY_.ZY__CODIGO=t.ZY__MASTER )
GROUP BY t.ZY__MASTER,ZY_.ZY__DESC'
BEGIN TRANSACTION @TTSNAME
EXECUTE('SELECT * INTO '+@TABLENAME+' FROM ('+@COMANDO_SQL+') t')
COMMIT TRANSACTION @TTSNAME
END TRY
BEGIN CATCH
EXECUTE('SELECT * INTO '+@TABLENAME+' FROM (SELECT '''' ZY__MASTER,'''' ZY__DESC,0 TOTAL ) t')
END CATCH;
END
select * from ##tmp_table_pivot_painel_acumulados_periodo_empresa_20230124_001
</code></pre>
Dados:<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSgVeO7CSdy5WjjWfXCOm5yZDCvdswuyriLO1fFR6uNzWlcLcCuMnqoU2rcJ11cQDkk6SrGg3hL7Ln9ww8mAZ53ksgyijKUb9c3q6zf4egTjot7OJ5uChn8nEAZZ1GJA3Pdt4MtBBzj12-iBvYr0teOsMHipylXjgSiNi-pyyCmZKiLnqn00Aqu7pq/s789/ConsultaGrupoMesesDoAno.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Consulta Grupo/Meses do Ano" border="0" data-original-height="439" data-original-width="789" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSgVeO7CSdy5WjjWfXCOm5yZDCvdswuyriLO1fFR6uNzWlcLcCuMnqoU2rcJ11cQDkk6SrGg3hL7Ln9ww8mAZ53ksgyijKUb9c3q6zf4egTjot7OJ5uChn8nEAZZ1GJA3Pdt4MtBBzj12-iBvYr0teOsMHipylXjgSiNi-pyyCmZKiLnqn00Aqu7pq/s16000/ConsultaGrupoMesesDoAno.png" title="Consulta Grupo/Meses do Ano" /></a></div><div><br /></div><b>Consulta Pivot por Meses do Ano/</b><b>Grupo</b><b>:</b><pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">
IF OBJECT_ID('tempdb..##tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_001', 'U') IS NOT NULL
DROP TABLE ##tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_001
BEGIN
DECLARE @COMANDO_SQL AS VARCHAR(MAX)
DECLARE @COLUNAS_PIVOT AS VARCHAR(MAX)
DECLARE @COLUNAS_PIVOT_SUM AS VARCHAR(MAX)
DECLARE @COLUNAS_PIVOT_TOTAL AS VARCHAR(MAX)
DECLARE @COLUNAS_PIVOT_NONULLS AS VARCHAR(MAX)
DECLARE @DATARQDE AS VARCHAR(6)
SET @DATARQDE='202101'
DECLARE @DATARQATE AS VARCHAR(6)
SET @DATARQATE='202112'
DECLARE @CCDE AS VARCHAR(MAX)
SET @CCDE=''
DECLARE @CCATE AS VARCHAR(MAX)
SET @CCATE='z'
DECLARE @FILIALDE AS VARCHAR(MAX)
SET @FILIALDE=''
DECLARE @FILIALATE AS VARCHAR(MAX)
SET @FILIALATE='z'
DECLARE @GRUPODE AS VARCHAR(MAX)
SET @GRUPODE=''
DECLARE @GRUPOATE AS VARCHAR(MAX)
SET @GRUPOATE='z'
DECLARE @TTSNAME AS VARCHAR(MAX)
SET @TTSNAME='tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_001'
DECLARE @TABLENAME AS VARCHAR(MAX)
SET @TABLENAME='##tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_001'
BEGIN TRY
SET @COLUNAS_PIVOT = STUFF((SELECT DISTINCT ',' + QUOTENAME(RTRIM(LTRIM(cols_pivot.ZY__SQLFLDM))) + ','+ QUOTENAME(RTRIM(LTRIM(cols_pivot.ZY__SQLFLDM))+'_'+RTRIM(LTRIM(cols_pivot.ZY__SQLFLD)))
FROM (
SELECT DISTINCT ZY_M.ZY__SQLFLD ZY__SQLFLDM, ZY_.ZY__SQLFLD
FROM SRD990 SRD
JOIN SRV990 SRV ON (SRV.RV_COD=SRD.RD_PD AND ((CASE SRV.RV_FILIAL WHEN '' THEN 1 WHEN SRD.RD_FILIAL THEN 1 ELSE 0 END)=1) )
JOIN ZY_990 ZY_ ON (ZY_.ZY__CODIGO=SRV.RV_ZY__COD AND ((CASE ZY_.ZY__FILIAL WHEN '' THEN 1 WHEN SRV.RV_FILIAL THEN 1 ELSE 0 END)=1) )
JOIN ZY_990 ZY_M ON (ZY_M.ZY__CODIGO=ZY_.ZY__MASTER AND ZY_.ZY__FILIAL=ZY_M.ZY__FILIAL )
JOIN SRA990 SRA ON (SRA.RA_FILIAL=SRD.RD_FILIAL AND SRA.RA_MAT=SRD.RD_MAT)
WHERE SRD.D_E_L_E_T_=''
AND SRA.D_E_L_E_T_=''
AND SRV.D_E_L_E_T_=''
AND ZY_.D_E_L_E_T_=''
AND ZY_.ZY__MASTER<>''
AND SRD.RD_DATARQ BETWEEN @DATARQDE AND @DATARQATE
AND SRD.RD_CC BETWEEN @CCDE AND @CCATE
AND SRD.RD_FILIAL BETWEEN @FILIALDE AND @FILIALATE
AND ZY_.ZY__MASTER BETWEEN @GRUPODE AND @GRUPOATE
AND ZY_.ZY__SQLFLD<>''
GROUP BY ZY_M.ZY__SQLFLD,ZY_.ZY__SQLFLD
) cols_pivot FOR XML PATH('')),1,1,'')
SET @COLUNAS_PIVOT='SELECT '+REPLACE(REPLACE(REPLACE(@COLUNAS_PIVOT,',',' UNION SELECT'),'[',''''),']',''' ZY__SQLFLD')
EXECUTE('SELECT * INTO tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_002 FROM ('+@COLUNAS_PIVOT+') t')
SET @COLUNAS_PIVOT = STUFF((SELECT DISTINCT ',' + QUOTENAME(RTRIM(LTRIM(cols_pivot.ZY__SQLFLD)))
FROM ( select * from tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_002 ) cols_pivot FOR XML PATH('')),1,1,'')
SET @COLUNAS_PIVOT_NONULLS = STUFF((SELECT DISTINCT ',ISNULL(' + QUOTENAME(RTRIM(LTRIM(cols_pivot_notnull.ZY__SQLFLD)))+',0)' + QUOTENAME(RTRIM(LTRIM(cols_pivot_notnull.ZY__SQLFLD)))
FROM ( select * from tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_002 ) cols_pivot_notnull FOR XML PATH('')),1,1,'')
SET @COLUNAS_PIVOT_SUM = STUFF((SELECT DISTINCT ',ISNULL(SUM(' + QUOTENAME(RTRIM(LTRIM(cols_pivot_sum.ZY__SQLFLD)))+'),0)' + QUOTENAME(RTRIM(LTRIM(cols_pivot_sum.ZY__SQLFLD)))
FROM ( select * from tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_002 ) cols_pivot_sum FOR XML PATH('')),1,1,'')
SET @COLUNAS_PIVOT_TOTAL = STUFF((SELECT DISTINCT ',ISNULL(' + QUOTENAME(RTRIM(LTRIM(cols_pivot_total.ZY__SQLFLD)))+',0)'
FROM ( select * from tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_002 where CHARINDEX('_',ZY__SQLFLD)>0 ) cols_pivot_total FOR XML PATH('')),1,1,'')
SET @COLUNAS_PIVOT_TOTAL=REPLACE(REPLACE(@COLUNAS_PIVOT_TOTAL,',','+'),'+0',',0')
BEGIN
WITH ZY__SQLFLD AS
(
SELECT DISTINCT SUBSTRING(ZY__SQLFLD,1,CHARINDEX('_',ZY__SQLFLD)) ZY__SQLFLD
FROM tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_002
)
SELECT @COLUNAS_PIVOT=REPLACE(@COLUNAS_PIVOT,LTRIM(RTRIM(ZY__SQLFLD)),'') FROM ZY__SQLFLD
END
BEGIN
WITH ZY__SQLFLD AS
(
SELECT DISTINCT SUBSTRING(ZY__SQLFLD,1,CHARINDEX('_',ZY__SQLFLD)) ZY__SQLFLD
FROM tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_002
)
SELECT @COLUNAS_PIVOT_NONULLS=REPLACE(@COLUNAS_PIVOT_NONULLS,LTRIM(RTRIM(ZY__SQLFLD)),'') FROM ZY__SQLFLD
END
BEGIN
WITH ZY__SQLFLD AS
(
SELECT DISTINCT SUBSTRING(ZY__SQLFLD,1,CHARINDEX('_',ZY__SQLFLD)) ZY__SQLFLD
FROM tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_002
)
SELECT @COLUNAS_PIVOT_SUM=REPLACE(@COLUNAS_PIVOT_SUM,LTRIM(RTRIM(ZY__SQLFLD)),'') FROM ZY__SQLFLD
END
BEGIN
WITH ZY__SQLFLD AS
(
SELECT DISTINCT SUBSTRING(ZY__SQLFLD,1,CHARINDEX('_',ZY__SQLFLD)) ZY__SQLFLD
FROM tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_002
)
SELECT @COLUNAS_PIVOT_TOTAL=REPLACE(@COLUNAS_PIVOT_TOTAL,LTRIM(RTRIM(ZY__SQLFLD)),'') FROM ZY__SQLFLD
END
DROP TABLE tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_002
SET @COMANDO_SQL = '
SELECT t.RD_DATARQ
,'+@COLUNAS_PIVOT_SUM+'
,TOTAL=SUM(t.TOTAL)
FROM
(
SELECT t.RD_DATARQ
,'+@COLUNAS_PIVOT_NONULLS+'
,TOTAL=SUM('+@COLUNAS_PIVOT_TOTAL+')
FROM
(
SELECT * FROM
(
SELECT SRD.RD_DATARQ
,ZY_.ZY__SQLFLD
,ZY_M.ZY__SQLFLD ZY__SQLFLDM
,SUM(SRD.RD_VALOR) RD_VALOR
FROM SRA990 SRA
JOIN SRD990 SRD ON (SRA.RA_FILIAL=SRD.RD_FILIAL AND SRA.RA_MAT=SRD.RD_MAT)
JOIN SRV990 SRV ON (SRV.RV_COD=SRD.RD_PD AND ((CASE SRV.RV_FILIAL WHEN '''' THEN 1 WHEN SRD.RD_FILIAL THEN 1 ELSE 0 END)=1) )
JOIN ZY_990 ZY_ ON (ZY_.ZY__CODIGO=SRV.RV_ZY__COD AND ((CASE ZY_.ZY__FILIAL WHEN '''' THEN 1 WHEN SRV.RV_FILIAL THEN 1 ELSE 0 END)=1) )
JOIN ZY_990 ZY_M ON (ZY_M.ZY__CODIGO=ZY_.ZY__MASTER AND ZY_.ZY__FILIAL=ZY_M.ZY__FILIAL )
JOIN CTT990 CTT ON (CTT.CTT_CUSTO=SRD.RD_CC AND ((CASE CTT.CTT_FILIAL WHEN '''' THEN 1 WHEN SRD.RD_FILIAL THEN 1 ELSE 0 END)=1) )
WHERE SRD.D_E_L_E_T_=''''
AND SRA.D_E_L_E_T_=''''
AND SRV.D_E_L_E_T_=''''
AND ZY_.D_E_L_E_T_=''''
AND CTT.D_E_L_E_T_=''''
AND SRD.RD_DATARQ BETWEEN '''+@DATARQDE+''' AND '''+@DATARQATE+'''
AND SRD.RD_CC BETWEEN '''+@CCDE+''' AND '''+@CCATE+'''
AND SRD.RD_FILIAL BETWEEN '''+@FILIALDE+''' AND '''+@FILIALATE+'''
AND ZY_.ZY__MASTER BETWEEN '''+@GRUPODE+''' AND '''+@GRUPOATE+'''
AND ZY_.ZY__SQLFLD<>''''
GROUP BY SRD.RD_DATARQ,ZY_M.ZY__CODIGO,ZY_M.ZY__SQLFLD,ZY_.ZY__SQLFLD
) ROW
PIVOT (SUM(ROW.RD_VALOR) FOR ZY__SQLFLD IN (' + @COLUNAS_PIVOT + ')) COL
UNION
SELECT * FROM
(
SELECT SRD.RD_DATARQ
,ZY_.ZY__SQLFLD
,ZY_M.ZY__SQLFLD ZY__SQLFLDM
,SUM(SRD.RD_VALOR) RD_VALOR
FROM SRA990 SRA
JOIN SRD990 SRD ON (SRA.RA_FILIAL=SRD.RD_FILIAL AND SRA.RA_MAT=SRD.RD_MAT)
JOIN SRV990 SRV ON (SRV.RV_COD=SRD.RD_PD AND ((CASE SRV.RV_FILIAL WHEN '''' THEN 1 WHEN SRD.RD_FILIAL THEN 1 ELSE 0 END)=1) )
JOIN ZY_990 ZY_ ON (ZY_.ZY__CODIGO=SRV.RV_ZY__COD AND ((CASE ZY_.ZY__FILIAL WHEN '''' THEN 1 WHEN SRV.RV_FILIAL THEN 1 ELSE 0 END)=1) )
JOIN ZY_990 ZY_M ON (ZY_M.ZY__CODIGO=ZY_.ZY__MASTER AND ZY_.ZY__FILIAL=ZY_M.ZY__FILIAL )
JOIN CTT990 CTT ON (CTT.CTT_CUSTO=SRD.RD_CC AND ((CASE CTT.CTT_FILIAL WHEN '''' THEN 1 WHEN SRD.RD_FILIAL THEN 1 ELSE 0 END)=1) )
WHERE SRD.D_E_L_E_T_=''''
AND SRA.D_E_L_E_T_=''''
AND SRV.D_E_L_E_T_=''''
AND ZY_.D_E_L_E_T_=''''
AND CTT.D_E_L_E_T_=''''
AND SRD.RD_DATARQ BETWEEN '''+@DATARQDE+''' AND '''+@DATARQATE+'''
AND SRD.RD_CC BETWEEN '''+@CCDE+''' AND '''+@CCATE+'''
AND SRD.RD_FILIAL BETWEEN '''+@FILIALDE+''' AND '''+@FILIALATE+'''
AND ZY_.ZY__MASTER BETWEEN '''+@GRUPODE+''' AND '''+@GRUPOATE+'''
AND ZY_.ZY__SQLFLD<>''''
GROUP BY SRD.RD_DATARQ,ZY_M.ZY__CODIGO,ZY_M.ZY__SQLFLD,ZY_.ZY__SQLFLD
) ROW
PIVOT (SUM(ROW.RD_VALOR) FOR ZY__SQLFLDM IN (' + @COLUNAS_PIVOT + ')) COL
) t
GROUP BY t.RD_DATARQ,t.'+@COLUNAS_PIVOT+'
) t
GROUP BY t.RD_DATARQ'
BEGIN TRANSACTION @TTSNAME
EXECUTE('SELECT * INTO '+@TABLENAME+' FROM ('+@COMANDO_SQL+') t')
COMMIT TRANSACTION @TTSNAME
END TRY
BEGIN CATCH
EXECUTE('SELECT * INTO '+@TABLENAME+' FROM (SELECT '''' RD_DATARQ,0 TOTAL ) t')
END CATCH;
END
SELECT * FROM ##tmp_table_pivot_painel_por_periodo_empresa_grupo_e_subgrupo_20230124_001
</code></pre>
Dados:<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ_sm_GIYb397b-EDT4kJOztEbtWB3R9BiPa-EFi9cHzzeaq5wjcunQPWotn0ogDGVP4bdGDu77piu1KuiUB6GvdDxuep3TvgYa66NUvHmw4DZCWQklqnsa_VuhJqwyjTD6JcP_9YJnF75Kzitlh80HmtWXxEB4AnWlat3hkrdmojaibnxzQxEJ9qY/s1211/ConsultaMesesDoAnoGrupo.png" style="margin-left: 1em; margin-right: 1em;"><img alt="Consulta Meses do Ano/Grupo" border="0" data-original-height="474" data-original-width="1211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJ_sm_GIYb397b-EDT4kJOztEbtWB3R9BiPa-EFi9cHzzeaq5wjcunQPWotn0ogDGVP4bdGDu77piu1KuiUB6GvdDxuep3TvgYa66NUvHmw4DZCWQklqnsa_VuhJqwyjTD6JcP_9YJnF75Kzitlh80HmtWXxEB4AnWlat3hkrdmojaibnxzQxEJ9qY/s16000/ConsultaMesesDoAnoGrupo.png" title="Consulta Meses do Ano/Grupo" /></a></div><br /><div><br /></div>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com2tag:blogger.com,1999:blog-980185764358695221.post-20684947315059813702023-01-24T12:10:00.001-03:002023-01-25T00:22:57.404-03:00BlackTDN :: TOTVS :: Protheus :: MSSQL :: Turnover<p> </p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="414" src="https://www.youtube.com/embed/_RY4IyItRsk" width="499" youtube-src-id="_RY4IyItRsk"></iframe></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;">Source: <a href="https://github.com/naldodj/naldodj-totvsGetDataModel/tree/main/scripts/sql/mssql" rel="nofollow" target="_blank">Github</a></div>Turnover Empresa:<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">
IF OBJECT_ID('tempdb..##tmp_table_turnover_empresa_20230124_001', 'U') IS NOT NULL
DROP TABLE ##tmp_table_turnover_empresa_20230124_001
BEGIN
WITH PERIODO AS
(
SELECT
DISTINCT SRD.RD_DATARQ PERIODO
FROM SRD990 SRD
WHERE SRD.D_E_L_E_T_=''
AND SRD.RD_FILIAL<>''
GROUP BY SRD.RD_DATARQ
UNION
SELECT
DISTINCT LEFT(SRA.RA_ADMISSA,6) PERIODO
FROM SRA990 SRA
WHERE SRA.D_E_L_E_T_=''
AND SRA.RA_FILIAL<>''
GROUP BY LEFT(SRA.RA_ADMISSA,6)
)
,TURNOVER AS (
SELECT
PERIODO.PERIODO
, ISNULL((
SELECT
SUM(TTRFSAI)
FROM
(
SELECT
COUNT(1) AS TTRFSAI
FROM
SRE990 SRE_T
WHERE
SRE_T.D_E_L_E_T_= ''
AND SRE_T.RE_EMPD='99'
AND LEFT(SRE_T.RE_DATA,6)=PERIODO.PERIODO
GROUP BY
LEFT(SRE_T.RE_DATA,6)
, SRE_T.RE_EMPD
)
T
),0)
TTRFSAI
, ISNULL((
SELECT
SUM(TTRFENT)
FROM
(
SELECT
COUNT(1) AS TTRFENT
FROM
SRE990 SRE_T
WHERE
SRE_T.D_E_L_E_T_= ''
AND SRE_T.RE_EMPP='99'
AND LEFT(SRE_T.RE_DATA,6)=PERIODO.PERIODO
GROUP BY
LEFT(SRE_T.RE_DATA,6)
, SRE_T.RE_EMPP
)
T
),0)
TTRFENT
, ISNULL((
SELECT
SUM(TFUNMES)
FROM
(
SELECT
COUNT(1) AS TFUNMES
FROM
SRA990 SRA_T
WHERE
SRA_T.D_E_L_E_T_= ''
AND LEFT(SRA_T.RA_ADMISSA,6)<=PERIODO.PERIODO
AND (
SRA_T.RA_DEMISSA=''
OR
(
LEFT(SRA_T.RA_ADMISSA,6)<=PERIODO.PERIODO
AND (
LEFT(SRA_T.RA_ADMISSA,6)<=LEFT(SRA_T.RA_DEMISSA,6)
AND LEFT(SRA_T.RA_DEMISSA,6)>=PERIODO.PERIODO
)
)
)
)
T
),0)
TFUNMES
, ISNULL((
SELECT
SUM(ADMISSAO)
FROM
(
SELECT
COUNT(SRA_A.RA_ADMISSA) AS ADMISSAO
FROM SRA990 SRA_A
WHERE LEFT(SRA_A.RA_ADMISSA,6)=PERIODO.PERIODO
GROUP BY LEFT(SRA_A.RA_ADMISSA,6)
)
T
),0)
TFUNADMMES
, ISNULL((
SELECT
SUM(DEMISSAO)
FROM
(
SELECT COUNT(RA_DEMISSA) AS DEMISSAO
FROM SRA990 SRA_D
WHERE SRA_D.RA_DEMISSA<>''
AND LEFT(SRA_D.RA_DEMISSA,6)=PERIODO.PERIODO
GROUP BY LEFT(SRA_D.RA_DEMISSA,6)
)
T
),0)
TFUNDEMMES
FROM PERIODO
WHERE PERIODO.PERIODO BETWEEN '202101' AND '202112'
)
, TURNOVERT AS (
SELECT TURNOVER.PERIODO
,TURNOVER.TTRFSAI
,TURNOVER.TTRFENT
,TFUNIMES=CAST((TURNOVER.TFUNMES-TURNOVER.TFUNADMMES) AS FLOAT)
,TFUNADMMES=CAST(TURNOVER.TFUNADMMES AS FLOAT)
,TFUNMES=CAST(TURNOVER.TFUNMES AS FLOAT)
,TFUNDEMMES=CAST(TURNOVER.TFUNDEMMES AS FLOAT)
,TFUNFMES=CAST((TURNOVER.TFUNMES-TURNOVER.TFUNDEMMES) AS FLOAT)
FROM TURNOVER
)
SELECT TURNOVERT.PERIODO
,TURNOVERT.TTRFSAI
,TURNOVERT.TTRFENT
,TURNOVERT.TFUNIMES
,TURNOVERT.TFUNADMMES
,TURNOVERT.TFUNMES
,TURNOVERT.TFUNDEMMES
,TURNOVERT.TFUNFMES
,TURNOVER=ROUND(((CASE TFUNIMES WHEN 0 THEN 0 ELSE ((TURNOVERT.TFUNADMMES+TURNOVERT.TFUNDEMMES)/2/TURNOVERT.TFUNIMES) END)*100),2)
,TURNMOVF=ROUND(((CASE TFUNIMES WHEN 0 THEN 0 ELSE (TURNOVERT.TFUNDEMMES)/2/TURNOVERT.TFUNIMES END)*100),2)
INTO ##tmp_table_turnover_empresa_20230124_001
FROM TURNOVERT
END
select * from ##tmp_table_turnover_empresa_20230124_001
</code></pre>
Turnover Filial:<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">
IF OBJECT_ID('tempdb..##tmp_table_turnover_filial_20230124_001', 'U') IS NOT NULL
DROP TABLE ##tmp_table_turnover_filial_20230124_001
BEGIN
WITH PERIODO AS
(
SELECT
DISTINCT SRD.RD_DATARQ PERIODO
, SRA.RA_FILIAL
FROM SRD990 SRD
JOIN SRA990 SRA ON (SRD.RD_FILIAL=SRA.RA_FILIAL AND SRD.RD_MAT=SRA.RA_MAT)
WHERE SRD.D_E_L_E_T_=''
AND SRA.D_E_L_E_T_=''
AND SRD.RD_FILIAL<>''
AND SRA.RA_FILIAL<>''
AND SRD.RD_FILIAL=SRA.RA_FILIAL
AND SRD.RD_MAT=SRA.RA_MAT
GROUP BY SRD.RD_DATARQ
, SRA.RA_FILIAL
UNION
SELECT
DISTINCT LEFT(SRA.RA_ADMISSA,6) PERIODO
, SRA.RA_FILIAL
FROM SRA990 SRA
WHERE SRA.D_E_L_E_T_=''
AND SRA.RA_FILIAL<>''
GROUP BY LEFT(SRA.RA_ADMISSA,6)
, SRA.RA_FILIAL
)
,TURNOVER AS (
SELECT
PERIODO.PERIODO
, PERIODO.RA_FILIAL
, ISNULL((
SELECT
SUM(TTRFSAI)
FROM
(
SELECT
COUNT(1) AS TTRFSAI
FROM
SRE990 SRE_T
WHERE
SRE_T.D_E_L_E_T_= ''
AND SRE_T.RE_EMPD='99'
AND LEFT(SRE_T.RE_DATA,6)=PERIODO.PERIODO
AND SRE_T.RE_FILIALD=PERIODO.RA_FILIAL
GROUP BY
LEFT(SRE_T.RE_DATA,6)
, SRE_T.RE_EMPD
, SRE_T.RE_FILIALD
)
T
),0)
TTRFSAI
, ISNULL((
SELECT
SUM(TTRFENT)
FROM
(
SELECT
COUNT(1) AS TTRFENT
FROM
SRE990 SRE_T
WHERE
SRE_T.D_E_L_E_T_= ''
AND SRE_T.RE_EMPP='99'
AND LEFT(SRE_T.RE_DATA,6)=PERIODO.PERIODO
AND SRE_T.RE_FILIALP=PERIODO.RA_FILIAL
GROUP BY
LEFT(SRE_T.RE_DATA,6)
, SRE_T.RE_EMPP
, SRE_T.RE_FILIALP
)
T
),0)
TTRFENT
, ISNULL((
SELECT
SUM(TFUNMES)
FROM
(
SELECT
COUNT(1) AS TFUNMES
FROM
SRA990 SRA_T
WHERE
SRA_T.D_E_L_E_T_= ''
AND LEFT(SRA_T.RA_ADMISSA,6)<=PERIODO.PERIODO
AND (
SRA_T.RA_DEMISSA=''
OR
(
LEFT(SRA_T.RA_ADMISSA,6)<=PERIODO.PERIODO
AND (
LEFT(SRA_T.RA_ADMISSA,6)<=LEFT(SRA_T.RA_DEMISSA,6)
AND LEFT(SRA_T.RA_DEMISSA,6)>=PERIODO.PERIODO
)
)
)
AND SRA_T.RA_FILIAL=PERIODO.RA_FILIAL
)
T
),0)
TFUNMES
, ISNULL((
SELECT
SUM(ADMISSAO)
FROM
(
SELECT
COUNT(SRA_A.RA_ADMISSA) AS ADMISSAO
FROM SRA990 SRA_A
WHERE LEFT(SRA_A.RA_ADMISSA,6)=PERIODO.PERIODO
AND SRA_A.RA_FILIAL=PERIODO.RA_FILIAL
GROUP BY LEFT(SRA_A.RA_ADMISSA,6)
, SRA_A.RA_FILIAL
)
T
),0)
TFUNADMMES
, ISNULL((
SELECT
SUM(DEMISSAO)
FROM
(
SELECT COUNT(RA_DEMISSA) AS DEMISSAO
FROM SRA990 SRA_D
WHERE SRA_D.RA_DEMISSA<>''
AND LEFT(SRA_D.RA_DEMISSA,6)=PERIODO.PERIODO
AND SRA_D.RA_FILIAL=PERIODO.RA_FILIAL
AND SRA_D.RA_DEMISSA<>''
GROUP BY LEFT(SRA_D.RA_DEMISSA,6)
, SRA_D.RA_FILIAL
)
T
),0)
TFUNDEMMES
FROM PERIODO
WHERE PERIODO.PERIODO BETWEEN '202101' AND '202112'
AND PERIODO.RA_FILIAL BETWEEN ' ' AND 'z '
)
, TURNOVERT AS (
SELECT TURNOVER.PERIODO
,TURNOVER.RA_FILIAL
,TURNOVER.TTRFSAI
,TURNOVER.TTRFENT
,TFUNIMES=CAST((TURNOVER.TFUNMES-TURNOVER.TFUNADMMES) AS FLOAT)
,TFUNADMMES=CAST(TURNOVER.TFUNADMMES AS FLOAT)
,TFUNMES=CAST(TURNOVER.TFUNMES AS FLOAT)
,TFUNDEMMES=CAST(TURNOVER.TFUNDEMMES AS FLOAT)
,TFUNFMES=CAST((TURNOVER.TFUNMES-TURNOVER.TFUNDEMMES) AS FLOAT)
FROM TURNOVER
)
SELECT TURNOVERT.PERIODO
,TURNOVERT.RA_FILIAL
,TURNOVERT.TTRFSAI
,TURNOVERT.TTRFENT
,TURNOVERT.TFUNIMES
,TURNOVERT.TFUNADMMES
,TURNOVERT.TFUNMES
,TURNOVERT.TFUNDEMMES
,TURNOVERT.TFUNFMES
,TURNOVER=ROUND(((CASE TFUNIMES WHEN 0 THEN 0 ELSE ((TURNOVERT.TFUNADMMES+TURNOVERT.TFUNDEMMES)/2/TURNOVERT.TFUNIMES) END)*100),2)
,TURNMOVF=ROUND(((CASE TFUNIMES WHEN 0 THEN 0 ELSE (TURNOVERT.TFUNDEMMES)/2/TURNOVERT.TFUNIMES END)*100),2)
INTO ##tmp_table_turnover_filial_20230124_001
FROM TURNOVERT
END
select * from ##tmp_table_turnover_filial_20230124_001
</code></pre>
Turnover Centro de Custo:<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">
IF OBJECT_ID('tempdb..##tmp_table_turnover_centro_de_custo_20230124_001', 'U') IS NOT NULL
DROP TABLE ##tmp_table_turnover_centro_de_custo_20230124_001
BEGIN
WITH PERIODO AS
(
SELECT
DISTINCT SRD.RD_DATARQ PERIODO
, SRA.RA_FILIAL
, SRA.RA_CC
FROM SRD990 SRD
JOIN SRA990 SRA ON (SRD.RD_FILIAL=SRA.RA_FILIAL AND SRD.RD_MAT=SRA.RA_MAT)
WHERE SRD.D_E_L_E_T_=''
AND SRA.D_E_L_E_T_=''
AND SRD.RD_FILIAL<>''
AND SRA.RA_FILIAL<>''
AND SRD.RD_FILIAL=SRA.RA_FILIAL
AND SRD.RD_MAT=SRA.RA_MAT
GROUP BY SRD.RD_DATARQ
, SRA.RA_FILIAL
, SRA.RA_CC
UNION
SELECT
DISTINCT LEFT(SRA.RA_ADMISSA,6) PERIODO
, SRA.RA_FILIAL
, SRA.RA_CC
FROM SRA990 SRA
WHERE SRA.D_E_L_E_T_=''
AND SRA.RA_FILIAL<>''
GROUP BY LEFT(SRA.RA_ADMISSA,6)
, SRA.RA_FILIAL
, SRA.RA_CC
)
,TURNOVER AS (
SELECT
PERIODO.PERIODO
, PERIODO.RA_FILIAL
, PERIODO.RA_CC
, CTT.CTT_DESC01
, ISNULL((
SELECT
SUM(TTRFSAI)
FROM
(
SELECT
COUNT(1) AS TTRFSAI
FROM
SRE990 SRE_T
WHERE
SRE_T.D_E_L_E_T_= ''
AND SRE_T.RE_EMPD='99'
AND LEFT(SRE_T.RE_DATA,6)=PERIODO.PERIODO
AND SRE_T.RE_FILIALD=PERIODO.RA_FILIAL
AND SRE_T.RE_CCD=PERIODO.RA_CC
GROUP BY
LEFT(SRE_T.RE_DATA,6)
, SRE_T.RE_EMPD
, SRE_T.RE_FILIALD
, SRE_T.RE_CCD
)
T
),0)
TTRFSAI
, ISNULL((
SELECT
SUM(TTRFENT)
FROM
(
SELECT
COUNT(1) AS TTRFENT
FROM
SRE990 SRE_T
WHERE
SRE_T.D_E_L_E_T_= ''
AND SRE_T.RE_EMPP='99'
AND LEFT(SRE_T.RE_DATA,6)=PERIODO.PERIODO
AND SRE_T.RE_FILIALP=PERIODO.RA_FILIAL
AND SRE_T.RE_CCP=PERIODO.RA_CC
GROUP BY
LEFT(SRE_T.RE_DATA,6)
, SRE_T.RE_EMPP
, SRE_T.RE_FILIALP
, SRE_T.RE_CCP
)
T
),0)
TTRFENT
, ISNULL((
SELECT
SUM(TFUNMES)
FROM
(
SELECT
COUNT(1) AS TFUNMES
FROM
SRA990 SRA_T
WHERE
SRA_T.D_E_L_E_T_= ''
AND LEFT(SRA_T.RA_ADMISSA,6)<=PERIODO.PERIODO
AND (
SRA_T.RA_DEMISSA=''
OR
(
LEFT(SRA_T.RA_ADMISSA,6)<=PERIODO.PERIODO
AND (
LEFT(SRA_T.RA_ADMISSA,6)<=LEFT(SRA_T.RA_DEMISSA,6)
AND LEFT(SRA_T.RA_DEMISSA,6)>=PERIODO.PERIODO
)
)
)
AND SRA_T.RA_FILIAL=PERIODO.RA_FILIAL
AND SRA_T.RA_CC=PERIODO.RA_CC
)
T
),0)
TFUNMES
, ISNULL((
SELECT
SUM(ADMISSAO)
FROM
(
SELECT
COUNT(SRA_A.RA_ADMISSA) AS ADMISSAO
FROM SRA990 SRA_A
WHERE LEFT(SRA_A.RA_ADMISSA,6)=PERIODO.PERIODO
AND SRA_A.RA_FILIAL=PERIODO.RA_FILIAL
AND SRA_A.RA_CC=PERIODO.RA_CC
GROUP BY LEFT(SRA_A.RA_ADMISSA,6)
, SRA_A.RA_FILIAL
, SRA_A.RA_CC
)
T
),0)
TFUNADMMES
, ISNULL((
SELECT
SUM(DEMISSAO)
FROM
(
SELECT COUNT(RA_DEMISSA) AS DEMISSAO
FROM SRA990 SRA_D
WHERE SRA_D.RA_DEMISSA<>''
AND LEFT(SRA_D.RA_DEMISSA,6)=PERIODO.PERIODO
AND SRA_D.RA_CC=PERIODO.RA_CC
AND SRA_D.RA_DEMISSA<>''
GROUP BY LEFT(SRA_D.RA_DEMISSA,6)
, SRA_D.RA_FILIAL
, SRA_D.RA_CC
)
T
),0)
TFUNDEMMES
FROM PERIODO
JOIN CTT990 CTT ON (PERIODO.RA_CC=CTT.CTT_CUSTO AND CTT.CTT_FILIAL=(CASE CTT.CTT_FILIAL WHEN '' THEN '' ELSE PERIODO.RA_FILIAL END))
WHERE PERIODO.PERIODO BETWEEN '202101' AND '202112'
AND PERIODO.RA_FILIAL BETWEEN ' ' AND 'z '
AND PERIODO.RA_CC BETWEEN '' AND 'z'
)
, TURNOVERT AS (
SELECT TURNOVER.PERIODO
,TURNOVER.RA_FILIAL
,TURNOVER.RA_CC
,TURNOVER.CTT_DESC01
,TURNOVER.TTRFSAI
,TURNOVER.TTRFENT
,TFUNIMES=CAST((TURNOVER.TFUNMES-TURNOVER.TFUNADMMES) AS FLOAT)
,TFUNADMMES=CAST(TURNOVER.TFUNADMMES AS FLOAT)
,TFUNMES=CAST(TURNOVER.TFUNMES AS FLOAT)
,TFUNDEMMES=CAST(TURNOVER.TFUNDEMMES AS FLOAT)
,TFUNFMES=CAST((TURNOVER.TFUNMES-TURNOVER.TFUNDEMMES) AS FLOAT)
FROM TURNOVER
)
SELECT TURNOVERT.PERIODO
,TURNOVERT.RA_FILIAL
,TURNOVERT.RA_CC
,TURNOVERT.CTT_DESC01
,TURNOVERT.TTRFSAI
,TURNOVERT.TTRFENT
,TURNOVERT.TFUNIMES
,TURNOVERT.TFUNADMMES
,TURNOVERT.TFUNMES
,TURNOVERT.TFUNDEMMES
,TURNOVERT.TFUNFMES
,TURNOVER=ROUND(((CASE TFUNIMES WHEN 0 THEN 0 ELSE ((TURNOVERT.TFUNADMMES+TURNOVERT.TFUNDEMMES)/2/TURNOVERT.TFUNIMES) END)*100),2)
,TURNMOVF=ROUND(((CASE TFUNIMES WHEN 0 THEN 0 ELSE (TURNOVERT.TFUNDEMMES)/2/TURNOVERT.TFUNIMES END)*100),2)
INTO ##tmp_table_turnover_centro_de_custo_20230124_001
FROM TURNOVERT
END
select * from ##tmp_table_turnover_centro_de_custo_20230124_001
</code></pre>
Turnover Funções:<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">
IF OBJECT_ID('tempdb..##tmp_table_turnover_funcoes_20230124_001', 'U') IS NOT NULL
DROP TABLE ##tmp_table_turnover_funcoes_20230124_001
BEGIN
WITH PERIODO AS
(
SELECT
DISTINCT SRD.RD_DATARQ PERIODO
, SRA.RA_FILIAL
, SRA.RA_CC
, SRA.RA_CODFUNC
FROM SRD990 SRD
JOIN SRA990 SRA ON (SRD.RD_FILIAL=SRA.RA_FILIAL AND SRD.RD_MAT=SRA.RA_MAT)
WHERE SRD.D_E_L_E_T_=''
AND SRA.D_E_L_E_T_=''
AND SRD.RD_FILIAL<>''
AND SRA.RA_FILIAL<>''
AND SRD.RD_FILIAL=SRA.RA_FILIAL
AND SRD.RD_MAT=SRA.RA_MAT
GROUP BY SRD.RD_DATARQ
, SRA.RA_FILIAL
, SRA.RA_CC
, SRA.RA_CODFUNC
UNION
SELECT
DISTINCT LEFT(SRA.RA_ADMISSA,6) PERIODO
, SRA.RA_FILIAL
, SRA.RA_CC
, SRA.RA_CODFUNC
FROM SRA990 SRA
WHERE SRA.D_E_L_E_T_=''
AND SRA.RA_FILIAL<>''
GROUP BY LEFT(SRA.RA_ADMISSA,6)
, SRA.RA_FILIAL
, SRA.RA_CC
, SRA.RA_CODFUNC
)
,TURNOVER AS (
SELECT
PERIODO.PERIODO
, PERIODO.RA_FILIAL
, PERIODO.RA_CC
, CTT.CTT_DESC01
, PERIODO.RA_CODFUNC
, SRJ.RJ_DESC
, ISNULL((
SELECT
SUM(TTRFSAI)
FROM
(
SELECT
COUNT(1) AS TTRFSAI
FROM
SRE990 SRE_T
WHERE
SRE_T.D_E_L_E_T_= ''
AND SRE_T.RE_EMPD='99'
AND LEFT(SRE_T.RE_DATA,6)=PERIODO.PERIODO
AND SRE_T.RE_FILIALD=PERIODO.RA_FILIAL
AND SRE_T.RE_CCD=PERIODO.RA_CC
GROUP BY
LEFT(SRE_T.RE_DATA,6)
, SRE_T.RE_EMPD
, SRE_T.RE_FILIALD
, SRE_T.RE_CCD
)
T
),0)
TTRFSAI
, ISNULL((
SELECT
SUM(TTRFENT)
FROM
(
SELECT
COUNT(1) AS TTRFENT
FROM
SRE990 SRE_T
WHERE
SRE_T.D_E_L_E_T_= ''
AND SRE_T.RE_EMPP='99'
AND LEFT(SRE_T.RE_DATA,6)=PERIODO.PERIODO
AND SRE_T.RE_FILIALP=PERIODO.RA_FILIAL
AND SRE_T.RE_CCP=PERIODO.RA_CC
GROUP BY
LEFT(SRE_T.RE_DATA,6)
, SRE_T.RE_EMPP
, SRE_T.RE_FILIALP
, SRE_T.RE_CCP
)
T
),0)
TTRFENT
, ISNULL((
SELECT
SUM(TFUNMES)
FROM
(
SELECT
COUNT(1) AS TFUNMES
FROM
SRA990 SRA_T
WHERE
SRA_T.D_E_L_E_T_= ''
AND LEFT(SRA_T.RA_ADMISSA,6)<=PERIODO.PERIODO
AND (
SRA_T.RA_DEMISSA=''
OR
(
LEFT(SRA_T.RA_ADMISSA,6)<=PERIODO.PERIODO
AND (
LEFT(SRA_T.RA_ADMISSA,6)<=LEFT(SRA_T.RA_DEMISSA,6)
AND LEFT(SRA_T.RA_DEMISSA,6)>=PERIODO.PERIODO
)
)
)
AND SRA_T.RA_FILIAL=PERIODO.RA_FILIAL
AND SRA_T.RA_CC=PERIODO.RA_CC
AND SRA_T.RA_CODFUNC=PERIODO.RA_CODFUNC
)
T
),0)
TFUNMES
, ISNULL((
SELECT
SUM(ADMISSAO)
FROM
(
SELECT
COUNT(SRA_A.RA_ADMISSA) AS ADMISSAO
FROM SRA990 SRA_A
WHERE LEFT(SRA_A.RA_ADMISSA,6)=PERIODO.PERIODO
AND SRA_A.RA_FILIAL=PERIODO.RA_FILIAL
AND SRA_A.RA_CC=PERIODO.RA_CC
AND SRA_A.RA_CODFUNC=PERIODO.RA_CODFUNC
GROUP BY LEFT(SRA_A.RA_ADMISSA,6)
, SRA_A.RA_FILIAL
, SRA_A.RA_CC
, SRA_A.RA_CODFUNC
)
T
),0)
TFUNADMMES
, ISNULL((
SELECT
SUM(DEMISSAO)
FROM
(
SELECT COUNT(RA_DEMISSA) AS DEMISSAO
FROM SRA990 SRA_D
WHERE SRA_D.RA_DEMISSA<>''
AND LEFT(SRA_D.RA_DEMISSA,6)=PERIODO.PERIODO
AND SRA_D.RA_CC=PERIODO.RA_CC
AND SRA_D.RA_CODFUNC=PERIODO.RA_CODFUNC
AND SRA_D.RA_DEMISSA<>''
GROUP BY LEFT(SRA_D.RA_DEMISSA,6)
, SRA_D.RA_FILIAL
, SRA_D.RA_CC
, SRA_D.RA_CODFUNC
)
T
),0)
TFUNDEMMES
FROM PERIODO
JOIN CTT990 CTT ON (PERIODO.RA_CC=CTT.CTT_CUSTO AND CTT.CTT_FILIAL=(CASE CTT.CTT_FILIAL WHEN '' THEN '' ELSE PERIODO.RA_FILIAL END))
JOIN SRJ990 SRJ ON (PERIODO.RA_CODFUNC=SRJ.RJ_FUNCAO AND SRJ.RJ_FILIAL=(CASE SRJ.RJ_FILIAL WHEN '' THEN '' ELSE PERIODO.RA_FILIAL END))
WHERE PERIODO.PERIODO BETWEEN '202101' AND '202112'
AND PERIODO.RA_FILIAL BETWEEN '' AND 'z'
AND PERIODO.RA_CC BETWEEN '' AND 'z '
AND PERIODO.RA_CODFUNC BETWEEN '' AND 'z'
)
, TURNOVERT AS (
SELECT TURNOVER.PERIODO
,TURNOVER.RA_FILIAL
,TURNOVER.RA_CC
,TURNOVER.CTT_DESC01
,TURNOVER.RA_CODFUNC
,TURNOVER.RJ_DESC
,TURNOVER.TTRFSAI
,TURNOVER.TTRFENT
,TFUNIMES=CAST((TURNOVER.TFUNMES-TURNOVER.TFUNADMMES) AS FLOAT)
,TFUNADMMES=CAST(TURNOVER.TFUNADMMES AS FLOAT)
,TFUNMES=CAST(TURNOVER.TFUNMES AS FLOAT)
,TFUNDEMMES=CAST(TURNOVER.TFUNDEMMES AS FLOAT)
,TFUNFMES=CAST((TURNOVER.TFUNMES-TURNOVER.TFUNDEMMES) AS FLOAT)
FROM TURNOVER
)
SELECT TURNOVERT.PERIODO
,TURNOVERT.RA_FILIAL
,TURNOVERT.RA_CC
,TURNOVERT.CTT_DESC01
,TURNOVERT.RA_CODFUNC
,TURNOVERT.RJ_DESC
,TURNOVERT.TTRFSAI
,TURNOVERT.TTRFENT
,TURNOVERT.TFUNIMES
,TURNOVERT.TFUNADMMES
,TURNOVERT.TFUNMES
,TURNOVERT.TFUNDEMMES
,TURNOVERT.TFUNFMES
,TURNOVER=ROUND(((CASE TFUNIMES WHEN 0 THEN 0 ELSE ((TURNOVERT.TFUNADMMES+TURNOVERT.TFUNDEMMES)/2/TURNOVERT.TFUNIMES) END)*100),2)
,TURNMOVF=ROUND(((CASE TFUNIMES WHEN 0 THEN 0 ELSE (TURNOVERT.TFUNDEMMES)/2/TURNOVERT.TFUNIMES END)*100),2)
INTO ##tmp_table_turnover_funcoes_20230124_001
FROM TURNOVERT
END
select * from ##tmp_table_turnover_funcoes_20230124_001
</code></pre>
Turnover Funcionários:<br />
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">
IF OBJECT_ID('tempdb..##tmp_table_turnover_funcionarios_20230124_001', 'U') IS NOT NULL
DROP TABLE ##tmp_table_turnover_funcionarios_20230124_001
BEGIN
WITH PERIODO AS
(
SELECT
DISTINCT SRD.RD_DATARQ PERIODO
, SRA.RA_FILIAL
, SRA.RA_CC
, SRA.RA_CODFUNC
, SRA.RA_MAT
, SRA.R_E_C_N_O_ SRARECNO
FROM SRD990 SRD
JOIN SRA990 SRA ON (SRD.RD_FILIAL=SRA.RA_FILIAL AND SRD.RD_MAT=SRA.RA_MAT)
WHERE SRD.D_E_L_E_T_=''
AND SRA.D_E_L_E_T_=''
AND SRD.RD_FILIAL<>''
AND SRA.RA_FILIAL<>''
AND SRD.RD_FILIAL=SRA.RA_FILIAL
AND SRD.RD_MAT=SRA.RA_MAT
GROUP BY SRD.RD_DATARQ
, SRA.RA_FILIAL
, SRA.RA_CC
, SRA.RA_CODFUNC
, SRA.RA_MAT
, SRA.R_E_C_N_O_
UNION
SELECT
DISTINCT LEFT(SRA.RA_ADMISSA,6) PERIODO
, SRA.RA_FILIAL
, SRA.RA_CC
, SRA.RA_CODFUNC
, SRA.RA_MAT
, SRA.R_E_C_N_O_ SRARECNO
FROM SRA990 SRA
WHERE SRA.D_E_L_E_T_=''
AND SRA.RA_FILIAL<>''
GROUP BY LEFT(SRA.RA_ADMISSA,6)
, SRA.RA_FILIAL
, SRA.RA_CC
, SRA.RA_CODFUNC
, SRA.RA_MAT
, SRA.R_E_C_N_O_
)
,TURNOVER AS (
SELECT
PERIODO.PERIODO
, PERIODO.RA_FILIAL
, PERIODO.RA_CC
, CTT.CTT_DESC01
, PERIODO.RA_CODFUNC
, SRJ.RJ_DESC
, PERIODO.RA_MAT
, PERIODO.SRARECNO
, ISNULL((
SELECT
SUM(TTRFSAI)
FROM
(
SELECT
COUNT(1) AS TTRFSAI
FROM
SRE990 SRE_T
WHERE
SRE_T.D_E_L_E_T_= ''
AND SRE_T.RE_EMPD='99'
AND LEFT(SRE_T.RE_DATA,6)=PERIODO.PERIODO
AND SRE_T.RE_FILIALD=PERIODO.RA_FILIAL
AND SRE_T.RE_CCD=PERIODO.RA_CC
AND SRE_T.RE_MATD=PERIODO.RA_MAT
GROUP BY
LEFT(SRE_T.RE_DATA,6)
, SRE_T.RE_EMPD
, SRE_T.RE_FILIALD
, SRE_T.RE_CCD
, SRE_T.RE_MATD
)
T
),0)
TTRFSAI
, ISNULL((
SELECT
SUM(TTRFENT)
FROM
(
SELECT
COUNT(1) AS TTRFENT
FROM
SRE990 SRE_T
WHERE
SRE_T.D_E_L_E_T_= ''
AND SRE_T.RE_EMPP='99'
AND LEFT(SRE_T.RE_DATA,6)=PERIODO.PERIODO
AND SRE_T.RE_FILIALP=PERIODO.RA_FILIAL
AND SRE_T.RE_CCP=PERIODO.RA_CC
AND SRE_T.RE_MATP=PERIODO.RA_MAT
GROUP BY
LEFT(SRE_T.RE_DATA,6)
, SRE_T.RE_EMPP
, SRE_T.RE_FILIALP
, SRE_T.RE_CCP
, SRE_T.RE_MATP
)
T
),0)
TTRFENT
, ISNULL((
SELECT
SUM(TFUNMES)
FROM
(
SELECT
COUNT(1) AS TFUNMES
FROM
SRA990 SRA_T
WHERE
SRA_T.D_E_L_E_T_= ''
AND LEFT(SRA_T.RA_ADMISSA,6)<=PERIODO.PERIODO
AND (
SRA_T.RA_DEMISSA=''
OR
(
LEFT(SRA_T.RA_ADMISSA,6)<=PERIODO.PERIODO
AND (
LEFT(SRA_T.RA_ADMISSA,6)<=LEFT(SRA_T.RA_DEMISSA,6)
AND LEFT(SRA_T.RA_DEMISSA,6)>=PERIODO.PERIODO
)
)
)
AND SRA_T.RA_FILIAL=PERIODO.RA_FILIAL
AND SRA_T.RA_CC=PERIODO.RA_CC
AND SRA_T.RA_CODFUNC=PERIODO.RA_CODFUNC
AND SRA_T.RA_MAT=PERIODO.RA_MAT
AND SRA_T.R_E_C_N_O_=PERIODO.SRARECNO
)
T
),0)
TFUNMES
, ISNULL((
SELECT
SUM(ADMISSAO)
FROM
(
SELECT
COUNT(SRA_A.RA_ADMISSA) AS ADMISSAO
FROM SRA990 SRA_A
WHERE LEFT(SRA_A.RA_ADMISSA,6)=PERIODO.PERIODO
AND SRA_A.RA_FILIAL=PERIODO.RA_FILIAL
AND SRA_A.RA_CC=PERIODO.RA_CC
AND SRA_A.RA_CODFUNC=PERIODO.RA_CODFUNC
AND SRA_A.RA_MAT=PERIODO.RA_MAT
GROUP BY LEFT(SRA_A.RA_ADMISSA,6)
, SRA_A.RA_FILIAL
, SRA_A.RA_CC
, SRA_A.RA_CODFUNC
, SRA_A.RA_MAT
)
T
),0)
TFUNADMMES
, ISNULL((
SELECT
SUM(DEMISSAO)
FROM
(
SELECT COUNT(RA_DEMISSA) AS DEMISSAO
FROM SRA990 SRA_D
WHERE SRA_D.RA_DEMISSA<>''
AND LEFT(SRA_D.RA_DEMISSA,6)=PERIODO.PERIODO
AND SRA_D.RA_CC=PERIODO.RA_CC
AND SRA_D.RA_CODFUNC=PERIODO.RA_CODFUNC
AND SRA_D.RA_MAT=PERIODO.RA_MAT
AND SRA_D.RA_DEMISSA<>''
AND SRA_D.R_E_C_N_O_=PERIODO.SRARECNO
GROUP BY LEFT(SRA_D.RA_DEMISSA,6)
, SRA_D.RA_FILIAL
, SRA_D.RA_CC
, SRA_D.RA_CODFUNC
, SRA_D.RA_MAT
)
T
),0)
TFUNDEMMES
FROM PERIODO
JOIN CTT990 CTT ON (PERIODO.RA_CC=CTT.CTT_CUSTO AND CTT.CTT_FILIAL=(CASE CTT.CTT_FILIAL WHEN '' THEN '' ELSE PERIODO.RA_FILIAL END))
JOIN SRJ990 SRJ ON (PERIODO.RA_CODFUNC=SRJ.RJ_FUNCAO AND SRJ.RJ_FILIAL=(CASE SRJ.RJ_FILIAL WHEN '' THEN '' ELSE PERIODO.RA_FILIAL END))
WHERE PERIODO.PERIODO BETWEEN '202101 ' AND '202112 '
AND PERIODO.RA_FILIAL BETWEEN ' ' AND 'z '
AND PERIODO.RA_CC BETWEEN ' ' AND 'z '
AND PERIODO.RA_CODFUNC BETWEEN '' AND 'z'
)
, TURNOVERT AS (
SELECT TURNOVER.PERIODO
,TURNOVER.RA_FILIAL
,TURNOVER.RA_CC
,TURNOVER.CTT_DESC01
,TURNOVER.RA_CODFUNC
,TURNOVER.RJ_DESC
,TURNOVER.RA_MAT
,TURNOVER.SRARECNO
,TURNOVER.TTRFSAI
,TURNOVER.TTRFENT
,TFUNIMES=CAST((TURNOVER.TFUNMES-TURNOVER.TFUNADMMES) AS FLOAT)
,TFUNADMMES=CAST(TURNOVER.TFUNADMMES AS FLOAT)
,TFUNMES=CAST(TURNOVER.TFUNMES AS FLOAT)
,TFUNDEMMES=CAST(TURNOVER.TFUNDEMMES AS FLOAT)
,TFUNFMES=CAST((TURNOVER.TFUNMES-TURNOVER.TFUNDEMMES) AS FLOAT)
FROM TURNOVER
)
SELECT TURNOVERT.PERIODO
,TURNOVERT.RA_FILIAL
,TURNOVERT.RA_CC
,TURNOVERT.CTT_DESC01
,TURNOVERT.RA_CODFUNC
,TURNOVERT.RJ_DESC
,TURNOVERT.RA_MAT
,TURNOVERT.SRARECNO
,TURNOVERT.TTRFSAI
,TURNOVERT.TTRFENT
,TURNOVERT.TFUNIMES
,TURNOVERT.TFUNADMMES
,TURNOVERT.TFUNMES
,TURNOVERT.TFUNDEMMES
,TURNOVERT.TFUNFMES
,TURNOVER=ROUND(((CASE TFUNIMES WHEN 0 THEN 0 ELSE ((TURNOVERT.TFUNADMMES+TURNOVERT.TFUNDEMMES)/2/TURNOVERT.TFUNIMES) END)*100),2)
,TURNMOVF=ROUND(((CASE TFUNIMES WHEN 0 THEN 0 ELSE (TURNOVERT.TFUNDEMMES)/2/TURNOVERT.TFUNIMES END)*100),2)
INTO ##tmp_table_turnover_funcionarios_20230124_001
FROM TURNOVERT
END
select * from ##tmp_table_turnover_funcionarios_20230124_001
</code></pre>
иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0tag:blogger.com,1999:blog-980185764358695221.post-56363413492309496302023-01-18T19:24:00.004-03:002023-01-18T19:36:52.351-03:00BlackTDN :: CTBR040 por Filial, é Possível? (Da série, Pedidos Inusitados)<p> Vez ou outra recebo uns pedidos um tanto quanto inusitados. Este queria imprimir o CTBR040 (Balancete) por filial, NÃO considerando o parâmetro "Seleciona Filiais" (que não atendia às expectativas do cliente). Mas selecionando todas as filiais e totalizando-as no mesmo relatório. Eu disse.... Deixe-me pensar...... E, a resposta, acredito que já sabem qual foi: Sim. É possível. Mas terei que usar algumas funções de minha biblioteca. Quer experimentar? Lá vai o código:</p>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">#include "totvs.ch"
procedure u_CTBR040BlackTDN(wnRel)
local aFiliais:=AdmGetFil() as array
local cSVFilAnt:=cFilAnt as character
local cSpaceQuadro as character
local oReport as object
//Todas as Privates definidas em CTBR040 devem ser inicializada aqui.
private aSelFil:=Array(0) as array
private aQuadro:=array(8) as array
cSpaceQuadro:=Space(Len(CriaVar("CT1_CONTA")))
aFill(aQuadro,cSpaceQuadro)
dfv():Default(@wnRel,ProcName())
//Obtem a Definição do Relatorio a partir da CTBR040
oReport:=ExecIn():CallProc("ULTRA_SECRET","CTBR040","REPORTDEF",@wNRel)
//Obtem o Action do Realatorio
bAction:=oReport:GetAction()
//Redefine o Action do Relatorio
oReport:SetAction({|oReport|PrintReport(@oReport,@wNRel,@aFiliais,@bAction)})
//Chama PrintDialog
oReport:PrintDialog()
//Restaura a Filial de Entrada
SetFilAnt(cSVFilAnt)
return
static function SetFilAnt(cFil)
cFilAnt:=cFil
return(FWSM0Util():setSM0PositionBycFilAnt())
static function PrintReport(oReport,wNRel,aFiliais,bAction)
local nFilial as numeric
local nFiliais as numeric
local oCell as object
local oSection:=oReport:Section(1) as object
nFiliais:=Len(aFiliais)
for nFilial:=1 to nFiliais
cFil:=aFiliais[nFilial]
//Seta a Filial Corrente
SetFilAnt(cFil)
//CTBR040 Inicia TRFunction no Corpo do Programa (Q M... Isso complica tudo.)
//Os Breaks e as Functions Precisam ser "Zerados(as)" para não dar erro e Totalizar corretamente
//Remove Os Breaks de TReport
aEval(oReport:aBreak,{|e|aSize(e:aFunction,0)})
aSize(oReport:aBreak,0)
//Remove As Functions de TReport
aSize(oReport:aFunction,0)
//Remove Os Breaks de TRSection
aEval(oSection:aBreak,{|e|aSize(e:aFunction,0)})
aSize(oSection:aBreak,0)
//Remove As Functions de TRSection
aSize(oSection:aFunction,0)
//Remove As Functions de TRCell
oCell:=oSection:Cell("SALDODEB")
aSize(oCell:aFunction,0)
//Remove As Functions de TRCell
oCell:=oSection:Cell("SALDOCRD")
aSize(oCell:aFunction,0)
//Remove As Functions de TRCell
oCell:=oSection:Cell("MOVIMENTO")
aSize(oCell:aFunction,0)
//Seta Pagina Inicial
oReport:oPage:lFirstPage:=.T.
//Imprime o Relatório Padrao
Eval(bAction,oReport)
//Armazena a Ultima Pagina que será utilizada no PE MVCHANGE
CacheData():Set("u_CTBR040BlackTDN","MV_PAR09",(oReport:oPage:nPage+1))
//Quebra de Pagina a Cada nova Filial
oReport:EndPage()
next nfilial
return</code></pre>
<p> Vai precisar do Ponto de Entrada U_MVCHANGE para Controlar a Paginação.</p>
<pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: "Andale Mono", "Lucida Console", Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"><code style="color: black; overflow-wrap: normal; word-wrap: normal;">#include "totvs.ch"
procedure U_MVCHANGE()
local cPergunta:=ParamIXB[1]
if (("CTR040"$cPergunta).and.IsInCallStack("u_CTBR040BlackTDN"))
MV_PAR09:=CacheData():Get("u_CTBR040BlackTDN","MV_PAR09",MV_PAR09)
endif
return </code>
</pre>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com1tag:blogger.com,1999:blog-980185764358695221.post-67761353227366053482023-01-09T14:42:00.007-03:002023-01-09T14:48:15.964-03:00BlackTDN :: JSON Core Function :: All 2 JSON :: Parte 4 :: "Simplificando" a forma de codar o REST TLPP<p></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="378" src="https://www.youtube.com/embed/2tcbT0szwr4" width="486" youtube-src-id="2tcbT0szwr4"></iframe></div><br /> <p></p>иαldσ djhttp://www.blogger.com/profile/02363588786835561737noreply@blogger.com0