EECVIEW

Exemplo de utilização da função EECVIEW ela sempre espera receber uma string neste caso sempre tratar se necessário.

No exemplo a seguir estou exibindo a descrição da TES de devolução da TES original de entrada 161

#INCLUDE "TOTVS.ch"
/*/{Protheus.doc} xprepAmb
	Preparando ambiente
	@type  Function user
	@author Cleiton Genuino da Silva
	@since 10/09/2021
	@version 12.1.23
	@param xEmpresa , CHARACTER , Empresa
	@param cRpcFil  , CHARACTER , Filial
	@return LOGICAL , Sempre verdadeiro
/*/
user function xprepAmb( aRpc )
	Local aTables  := {}
	Local cRpcEmp  := "04"
	Local cRpcFil  := "04 0039   "
	Default aRpc   := {}

	If len(aRpc) > 0
		cRpcEmp  := aRpc[1]
		cRpcFil  := aRpc[2]
	EndIf

	xautoMsg( "Preparando ambiente" , .T. , cRpcEmp , cRpcFil )

	While !RpcSetEnv(cRpcEmp,cRpcFil,/*cEnvUser*/,/*cEnvPass*/,/*cEnvMod*/,/*cFunName*/,aTables,.T.,.T.,.T.,.T.)
		xautoMsg( "Sem licenca para executar a rotina" , .T. , cRpcEmp , cRpcFil )
	End
	//PREPARE ENVIRONMENT EMPRESA cEmpresa FILIAL cFilial MODULO "FAT" //TABLES "ZIF","ZIG","ZIH"

	xautoMsg( "Ambiente preparado" )

	EECVIEW("TES:" + Posicione("SF4",1,xFilial("SF4")+'161',"F4_TESDV") )

return .T.
/*/{Protheus.doc} xautoMsg
	Funcao que executa conout
	@type  Function
	@author user Cleiton Genuino da Silva
	@since date 18/10/2018
	@version 12.1.17
	@param cMessage  , CHARACTER , Mensagem que sera apresentada no conout
	@param lCompleto , LOGICAL	 , Mensagem que sera apresentada no conout
	@param cRpcEmp  , CHARACTER , Empresa
	@param xFilial   , CHARACTER , Filial
	@return LOGICAL  , Se completo o log retorna verdadeiro senão falso
/*/
static function xautoMsg( cMessage , lCompleto , cRpcEmp , cRpcFil )

	default lCompleto	:= .F.

	if ( getSrvProfString( "SET_DEBUG" , "1" ) == "1" )

		if ( lCompleto )
			conout( "[SET LOG " + DtoC( date() ) + " - " + time() +  " Empresa: " + allTrim(cRpcEmp) + " Filial: " + allTrim(cRpcFil) + " ) ] " + allTrim(cMessage)+CRLF )
		else
			conout( "[SET LOG " + DtoC( date() ) + " - " + time() + " ] " + allTrim(cMessage)+CRLF )
		endif

	endif

return lCompleto

CNAB Cloud Protheus

Linha de Produto:Microsiga Protheus®
Segmento:Financeiro
Módulo:Financeiro
Rotina:RotinaNome TécnicoCFGX049BRotina responsável pelo Wizard de passo a passo para a baixa dos arquivos de configuração CNAB.
Rotina(s) envolvida(s)Nome TécnicoCFGX049B01, CFGX049B02, CFGX049B03, CFGX049B05, CFGX049B06, CFGX049B08, CFGX049B97, CFGX049B98.
Rotinas responsaveis pela gravação de tabelas e criação de arquivo texto.
País(es):Todos
Banco(s) de Dados:Todos
Tabelas Utilizadas:FOPFOQ e FOZ.
Sistema(s) Operacional(is):Windows.

Tutorial: Como usar a classe PDO do PHP

Gabriel Martins

Um amigo meu e eu estávamos escrevendo códigos para um site que utilizava PHP para criar as API’s e o MySQL para fazer a conexão com o Banco de Dados. O meu amigo não utilizava o PDO por que não sabia como usar, e por isso estou criando esse tutorial, para ajudar as pessoas que como ele, não sabem utilizar a tão conhecida classe PDO presente no PHP.

● Habilitando o PDO

Se você está usando algum programa que crie um servidor web local, provalvelmente o PDO já estará habilitado nele, mas é sempre bom ter certeza. Para habilitar o PDO na sua máquina, é necessário que você encontre o caminho do arquivo php.ini e retire os comentários (;) das linhas a seguir.

  • Habilitando PDO no Windows
extension=php_pdo.dll
extension=php_pdo_mysql.dll
  • Habilitando PDO no Linux
extension=pdo.so
extension=pdo_mysql.so

● Instanciando e configurando a classe PDO

Primeiramente vamos criar a nossa estrutura de pastas para ficar um trabalho organizado:

+ php-pdo-tutorial/
• index.php
+ classes/
+ models/
• db.php

Após criar o nosso diretório, tudo relacionado ao banco de dados, iremos escrever no arquivo db.php.https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2Fl2JHQzrwFCOw98rMA%2Ftwitter%2Fiframe&display_name=Giphy&url=https%3A%2F%2Fgiphy.com%2Fgifs%2Fgrease-live-grease-live-tell-me-more-l2JHQzrwFCOw98rMA&image=https%3A%2F%2Fmedia0.giphy.com%2Fmedia%2Fl2JHQzrwFCOw98rMA%2Fgiphy.gif&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=giphy

No arquivo db.php, vamos criar a nossa classe Models e criar uma instância da classe PDO:

Viu como é simples? Primeiro nós criamos uma variável pública chamada $pdo, depois iniciamos o nosso método construtor (Aquele método que é chamado assim que instanciamos uma classe), depois indicamos que a váriavel $pdo irá conter a instância da classe PDO.

Ao instanciarmos o PDO, é obrigatório passarmos 3 parâmetros para que ocorra tudo certo.

  • 1° Parâmetro: Nele você indica qual o seu host, se for um servidor local, o padrão é localhost, mas pode variar. E dbname que é o nome do seu banco de dados.
  • 2° Parâmetro: O segundo parâmetro é basicamente o nome de usuário que você usa para acessar o seu banco de dados. O padrão de nome de usuário para programas que criam um servidor local é root.
  • 3° Parâmetro: Assim como o segundo, o terceiro parâmetro também é bem simples, é a senha que você usa para acessar o seu banco de dados. Diferente do nome de usuário, por padrão o seu banco de dados local não usa nenhuma senha, ou seja a senha é uma string vazia (duas aspas simples ou duplas sem nenhum conteúdo dentro.

Observação: Você pode usar bancos de dados externos, alterando o host para o host que seu banco de dados está hospedado.

● Criando a nossa base de dados

Nesse tutorial irei usar o phpMyAdmin para criar a base de dados, mas você pode usar o que preferir, inclusive um terminal.

Primeiro clicamos em New (se encontra na barra lateral) para criarmos uma nova base de dados. Depois você coloca o nome da sua BD (base de dados) eu coloquei “meu_banco_de_dados” e escolhe o formato que preferir, o mais usado é o utf8-bin. E por último, clicamos em “Create” para criar a nossa BD.

Agora nós iremos criar uma tabela para a nossa BD, eu coloquei o nome “usuarios” observe que não utilizei nenhum acento e nem espaços, é uma boa prática para não ter problemas futuros, ao invés de espaço, utilize o _ (underline) para separar as palavras. Selecionamos o número de colunas, eu optei por escolher 4 colunas, para armazenar 4 dados de cada usuário.

  • 1° Coluna id: Para o id o tipo padrão é INT, pois será sempre um número inteiro de 1 ao infinito e além! id será incrementado automaticamente quando fizermos uma inserção no nosso banco de dados, ele é único para cada usuário, mais para frente você verá o quão útil ele é. Para o id ser incrementado automaticamente, devemos marcar a opção A_I (Auto Increment) na linha em que ele se encontra. Não é preciso colocarmos um tamanho para limitar ele, pois ele é uma row (linha) muito importante na nossa BD.
  • 2° Coluna nome: Para a coluna nome irei colocar o tipo VARCHAR que é basicamente o tipo “string” no MySQL, e o tamanho eu coloquei 255 que também é uma boa prática, e é mais que necessário 255 letras para o nome de alguém.
  • 3° Coluna email: A coluna email segue o mesmo raciocínio que a coluna nome, usei o tipo VARCHAR com um tamanho de 255 Chars (Caracteres).
  • 4° Coluna senha: A coluna senha será a responsável por armazenar a senha do usuário, ela será do tipo VARCHAR e assim como as outras colunas, essa também terá um valor de 255 Chars.

Depois clicamos em “Save” para salvar a nossa tabela.

● Inserindo valores na base de dados usando o PDO

Agora chegou a parte boa, a parte em que colocamos a mão no código.https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2F29rsFlMw8wLlxOCPH1%2Ftwitter%2Fiframe&display_name=Giphy&url=https%3A%2F%2Fgiphy.com%2Fgifs%2Fpbskids-yes-excited-29rsFlMw8wLlxOCPH1&image=https%3A%2F%2Fmedia3.giphy.com%2Fmedia%2F29rsFlMw8wLlxOCPH1%2Fgiphy.gif&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=giphy

No código acima eu criei uma função chamada insert_values (Insere valores), como o próprio nome diz, ela será usada para inserirmos valores na nossa BD.

$sql = "INSERT INTO usuarios (nome, email, senha) VALUES (?, ?, ?)";

Na linha acima, nós criamos uma variável que irá conter um código SQL, o código SQL sempre terá que estar entre aspas simples ou duplas.

  • INSERT: Esse comando indica que estamos querendo inserir algo na nossa base de dados.
  • INTO: Esse comando é um complemento para o comando INSERT, ele indica a tabela e as linhas que receberam os novos valores. INSERT INTO (Insira dentro de).
  • VALUES: Esse comando indica quais valores serão inseridos. Ah, mas por que os pontos de interrogação? O ponto de interrogação é uma prática utilizada para protegermos nossa base de dados de um ataque SqlInjection (Injeção de código Sql), depois nós usamos a função bindParam() para indicarmos o valor de cada ponto de interrogação.
$senha = md5($senha);

Aqui eu usei a função md5(), nativa do PHP, para criptografarmos a senha do usuário, para que ninguém tenha acesso à senha do usuário caso consiga de alguma forma, acesso ao banco de dados ou aos dados do mesmo. E também é necessário para evitar problemas no futuro com leis, por exemplo, a LGPD (Lei Geral de Proteção de Dados).

$bd = $this->pdo->prepare($sql);

Lembra daquela variável chamada $pdo que criamos lá no começo? Então agora nós iremos usar ela para utilizar as funções do PDO, criamos uma variável chamada $bd que recebe $this->pdo->prepare($sql).

  • $this: é uma Pseudo-variável do PHP, que usamos para referenciar uma função ou variável presente na nossa classe. $this->pdo faz referência a variável $pdo que guarda a instância do PDO.
  • $this->pdo->prepare(): O $this faz referência a variável $pdo, que chama a função prepare() do PDO.
$bd->bindParam(1, $nome);$bd->bindParam(2, $email);$bd->bindParam(3, $senha);

Agora que a variável $bd faz referência a função prepare() do PDO, nós podemos usá-la para chamar algumas funções referentes à função prepare(). Por exemplo a função bindParam que por padrão recebe 2 parâmetros.

  • 1° Parâmetro: A posição do valor, cada ponto de interrogação do VALUES (?, ?, ?) ocupa uma posição, cada posição faz referência à um valor do usuarios (nome, email, senha). O primeiro ponto de interrogação é para o nome, o segundo ponto de interrogação para o email, e segue essa regra para todos os valores.
  • 2° Parâmetro: O valor que será substituído pelo ponto de interrogação.
$bd->execute();

Na linha acima nós fazemos a chamada da função que executa todo o código SQL que fizemos.

● Inserindo na Base de Dados

Agora nós iremos voltar lá no arquivo index.php, que criamos anteriormente, e vamos criar uma instância da classe Models que fizemos.

No código acima, nós incluimos o arquivo db.php que contém a nossa classe Models, e depois criamos uma variável chamada $bd e atribuímos a instância da classe Models.

echo $bd->insert_values("Gabriel", "gabrielmrts@yahoo.com", "123123");

Depois disso, nós invocamos a função insert_values() que está presente na nossa classe Models, por padrão ela recebe 3 parâmetros, que são nomeemail e senha.

Ao acessar o arquivo index.php no nosso servidor local, todo o código é executado, e se tudo ocorrer certo, teremos esse retorno:

E quando vamos verificar na nossa Base de Dados:

https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2FxT77XWum9yH7zNkFW0%2Ftwitter%2Fiframe&display_name=Giphy&url=https%3A%2F%2Fgiphy.com%2Fgifs%2F9jumpin-wow-nice-well-done-xT77XWum9yH7zNkFW0&image=https%3A%2F%2Fmedia1.giphy.com%2Fmedia%2FxT77XWum9yH7zNkFW0%2Fgiphy.gif&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=giphy

Viu como é simples e prático utilizar o PDO?

● Fazendo consultas na base de dados

Para podermos consultar dados de usuários na nossa base de dados, usamos a função SELECT (Selecione).

As regras do PDO são basicamente as mesmas, primeiro usa prepare(), depois o execute() e depois é só tratar os dados, mas vamos linha por linha.

$sql = "SELECT * FROM usuarios";
  • SELECT: Indica que estamos querendo selecionar dados na base de dados para consumirmos eles.
  • FROM: Indica a tabela que queremos selecionar.
  • *: SELECT *, Selecione Tudo.

Traduzindo, SELECT * FROM usuarios significa SELECIONE TUDO DE usuarios.

E também podemos pegar apenas os dados que queremos:

SELECT nome, email FROM usuarios

Voltando ao código, agora temos algo de diferente, um laço de repetição.

while ($row = $bd->fetch(PDO::FETCH_OBJ))

Aqui nós atribuímos a variável $row à uma função do PDO, a fetch().
A função fetch recebe um parâmetro obrigatório, que é o método que você vai utilizar para receber os dados. No nosso caso o PDO::FETCH_OBJ que retorna para nós um objeto contendo o resultado da consulta, juntamente com os dados. O laço de repetição no nosso caso é usado para, enquanto houver dados, armazene-os dentro da variável $row.

if ($row){    return $row;}

Se existir $row ou seja, dados, retorne os dados :).

Veja que agora estamos usando o print_r() para mostrar na tela, isso por que o echo é feito apenas para mostrar strings e nós estamos recebendo um array da nossa função get_all() e o print_r() e var_dump() são feitos para mostrar não só strings mas também arrays.https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgiphy.com%2Fembed%2Fl4FAPaGGeB7D1LfIA%2Ftwitter%2Fiframe&display_name=Giphy&url=https%3A%2F%2Fgiphy.com%2Fgifs%2Ffilmeditor-the-end-airplane-movie-l4FAPaGGeB7D1LfIA&image=https%3A%2F%2Fmedia2.giphy.com%2Fmedia%2Fl4FAPaGGeB7D1LfIA%2Fgiphy.gif&key=a19fcc184b9711e1b4764040d3dc5c07&type=text%2Fhtml&schema=giphy

Se você leu até aqui é por que gostou do tutorial, né? Se quiser dar uma olhada no código, clica aqui.

Espero de coração, que esse tutorial tenha te ajudado de alguma forma, pois a intenção é ajudar o próximo.

Mas é isso galera, até a próxima ️❤️.

Renovar certificado no Xampp Server

Certificado está vencido conforme imagem acima

Retire o ; do inicio da chave extension=openssl e salve o arquivo

Criar o arquivo v3.ext na pasta C:\xampp\apache

Edite o arquivo com o notepad++ informando o texto a seguir

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost

Salve o arquivo

Edite o arquivo C:\xampp\apache\makecert.bat colocando a informação a seguir neste ponto 500 -sha256 -extfile v3.ext

Agora execute como administrador

Navegue pelo wizard informando os dados do seu ceritifcado

Renovado

Entre no executar digite certmgr.msc e vamos importar o certificado

Agora vou equalizar os nomes pois eu não sou dono deste dominio vou criar o certificado com CN= localhost

Considerações finais, sempre que utilizar um domínio lembrar de gerar o certificado no seu servidor com o CN= Comum Nome igual ao da url do domínio

Ex: https://www.g1.com o CN=g1 no certificado.

O exemplo acima usa o https://localhost CN=localhost

Como ainda não tenho um domínio não sei dizer se o www. deve ser integrado no CN quem quiser comentar no post fique a vontade.

Como faço para enviar um HTTP/2 POST pedido em PHP

Como habilitar o suporte HTTP / 2 no XAMPP

Como habilitar o suporte HTTP / 2 no XAMPP

HTTP / 2 é muito rápido em comparação com HTTP / 1.1 que é o protocolo que muitas pessoas ainda usam em 2021. Por exemplo, em nosso ambiente de desenvolvimento de XAMPP no Windows, você verá que o protocolo que ele usa é HTTP / 1.1 por exemplo, PHPMyAdmin:

PHPMyAdmin XAMPP HTTP / 1.1

Você pode ver facilmente o protocolo no Chrome Devtools clicando com o botão direito do mouse nos cabeçalhos da tabela e marcando a opção Protocolo. Embora estejamos trabalhando localmente com o XAMPP, se você quiser um desempenho ainda melhor, pode mudar para a versão 2 do protocolo.

Neste artigo, explicarei como habilitar facilmente o suporte HTTP / 2 localmente na instalação do XAMPP.

1. Crie um Virtualhost para o seu projeto com suporte HTTPS

HTTP / 2 não funciona sem HTTPS (protocolo seguro), tenha isso em mente . Portanto, para fornecer suporte para HTTP / 2, você precisa ter um VirtualHost que escuta na porta 443. Por exemplo, usando o certificado HTTPS padrão de XAMPP (que é inválido, você receberá um aviso no navegador, no entanto, você pode pular e funciona), você pode construir um VirtualHost que aponta para uma página HTML simples como esta:

# 1. Support for HTTP on http://127.0.0.40/
<VirtualHost 127.0.0.40:80>
    DocumentRoot "C:/xampp/htdocs/mywebsite"
    DirectoryIndex index.html

    <Directory "C:/xampp/htdocs/mywebsite">
        AllowOverride None
        Order Allow,Deny
        Allow from All
    </Directory>
</VirtualHost>
# 2. Support for HTTPS on https://127.0.0.40/
<VirtualHost 127.0.0.40:443>
    DocumentRoot "C:/xampp/htdocs/mywebsite"
    ServerName mywebsite
    SSLEngine on
    SSLCertificateFile "conf/ssl.crt/server.crt"
    SSLCertificateKeyFile "conf/ssl.key/server.key"
    <Directory "C:/xampp/htdocs/mywebsite">
        Options All
    	AllowOverride All
    	Require all granted
    </Directory>
</VirtualHost>

COPIAR TRECHO

Teoricamente, com um index.htmlarquivo no diretório especificado, o site deve estar acessível em https://127.0.0.40/ (para HTTPS, necessário para usar HTTP / 2) e http://127.0.0.40/ (para HTTP, o que obriga para HTTP / 1.1). Não cobriremos muito o suporte para HTTPS, pois você pode implementar isso com um certificado diferente, talvez um confiável e, portanto, o importante aqui é que o host precisa rodar sobre HTTPS para funcionar com a versão HTTP / 2.

2. Habilite mod_http2.so

Agora, a parte mais importante deste tutorial é habilitar HTTP / 2 no apache. Esta versão do HTTP é um módulo que você pode ativar facilmente, modificando o C:\xampp\apache\conf\httpd.confarquivo e procurando pela mod_http2.solinha e descomente (remova o # no início da linha):

# Uncomment the line that loads the http2 module to apache
LoadModule http2_module modules/mod_http2.so

COPIAR TRECHO

Isso habilitará o suporte para HTTP / 2 no Apache. Agora, por padrão, o apache ainda usará HTTP / 1.1 para VirtualHosts que rodam na porta 80 (HTTP) e para aqueles VirtualHosts que rodam na porta 443 sem a diretiva que indica que ele deve usar HTTP / 2. 

3. Habilite HTTP / 2

Existem 2 opções para habilitar HTTP / 2 para seus projetos, você pode aplicar aquela que melhor se adapta às suas necessidades:

A. Habilite HTTP / 2 globalmente

Se você deseja habilitar este protocolo globalmente, para que funcione com qualquer VirtualHost que você tenha com HTTPS e PHPMyAdmin no XAMPP, você só precisa adicionar a seguinte diretiva no final do  C:\xampp\apache\conf\httpd.confarquivo:

Protocols h2 h2c http/1.1

COPIAR TRECHO

E é isso, no entanto, se você precisar habilitá-lo para um host virtual específico, você também pode fazer isso.

B. Habilite HTTP / 2 apenas para um VirtualHost específico

Se você só precisa usar HTTP / 2 em um VirtualHost específico, também é viável. A única coisa que você precisa fazer é adicionar a diretiva:

Protocols h2 h2c http/1.1

COPIAR TRECHO

No início do VirtualHost que escuta na porta 443:

# Somewhere at your virtualhost
# C:\xampp\apache\conf\extra\httpd-vhosts.conf
<VirtualHost 127.0.0.40:80>
    DocumentRoot "C:/xampp7413/htdocs/mywebsite"
    DirectoryIndex index.html

    <Directory "C:/xampp7413/htdocs/mywebsite">
        AllowOverride None
        Order Allow,Deny
        Allow from All
    </Directory>
</VirtualHost>
<VirtualHost 127.0.0.40:443>
    # Enable HTTP/2 on this Vhost
    Protocols h2 h2c http/1.1
    # Rest of the configuration ...
    DocumentRoot "C:/xampp7413/htdocs/mywebsite"
    ServerName myproject
    SSLEngine on
    SSLCertificateFile "conf/ssl.crt/server.crt"
    SSLCertificateKeyFile "conf/ssl.key/server.key"
    <Directory "C:/xampp7413/htdocs/mywebsite">
        Options All
    	AllowOverride All
    	Require all granted
    </Directory>
</VirtualHost>

COPIAR TRECHO

Vou enfatizar mais uma vez, que este VirtualHost é apenas um exemplo que utiliza o certificado autoassinado do XAMPP. Você pode criar seu próprio certificado que seja confiável para o navegador e o sistema operacional.

4. Reinicie o Apache 

Finalmente, apenas reinicie o apache e o MySQL (apenas no caso) com o painel de controle do XAMPP:

Reinicie o Painel de Controle do Apache XAMPP

E depois tente acessar seu site no navegador e verifique seu protocolo! Por exemplo, se você habilitou o protocolo globalmente, deverá ser capaz de acessá-lo em https: // localhost / phpmyadmin /  (observe o HTTPS):

Chrome Skip SSL Verification Localhost

Em nosso caso, receberemos um aviso porque o certificado SSL do XAMPP é autoassinado, mas você pode pular o aviso e acessar o PHPMyAdmin localmente de qualquer maneira. Nas ferramentas de desenvolvimento do Google Chrome, você poderá verificar o protocolo de qualquer solicitação para que possamos verificar agora se nosso XAMPP está usando HTTP / 2:

PHPMyAdmin HTTP / 2 XAMPP Localhost

Boa codificação ❤️!

PHP – Sessão destrói depois de fechar o navegador

Embora essa questão tenha várias soluções, não consegui encontrar uma solução adequada para mim. Precisa de ajuda.

Eu usei ini_set('session.cookie_lifetime', 0); no meu arquivo de configuração.

Mas isso não está me ajudando a destruir a sessão no fechamento do navegador. 

Fluxo de corrente da aplicação:

1) Na página de autenticação, se o usuário for válido, gere um novo identificador de sessão usando 

session_regenerate_id(true);

2) O controle vai para welcome.php onde inicio uma nova sessão usando session_start();

3) no código da página de logout é 

      $_SESSION = array();
      if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
      );
     }
    // Finally, destroy the session.
    session_destroy();

A melhor maneira de fechar a sessão é: se não houver resposta para essa sessão após determinado intervalo de tempo. então feche. Por favor, veja este post e espero que isso resolva o problema. ” Como alterar o timeout da sessão em PHP? “ AnkitThe most convenient and reliable file storage serviceReceive your personal cloud storage with 2Gb of space for free

Use um keep alive.

No login:

session_start();
$_SESSION['last_action'] = time();

Uma chamada de ajax a cada poucos (ex .: 20) segundos:

windows.setInterval(keepAliveCall, 20000);

Lado do servidor keepalive.php:

session_start();
$_SESSION['last_action'] = time();

Em todas as outras ações:

session_start();
if ($_SESSION['last_action'] < time() - 30 /* be a little tolerant here */) {
  // destroy the session and quit
}

Existem diferentes maneiras de fazer isso, mas o servidor não pode detectar quando o navegador é fechado, então é difícil destruí-lo.

  • sessão de tempo limite.

Crie uma nova sessão com a hora atual ou adicione uma variável de hora à sessão atual. e, em seguida, verifique-o quando você iniciar ou executar uma ação para ver se a sessão deve ser removida.

session_start();
$_SESSION["timeout"] = time();
//if 100 seconds have passed since creating session delete it.
if(time() - $_SESSION["timeout"] > 100){ 
    unset($_SESSION["timeout"];
}

  • ajax

Faça o javascript executar uma chamada de ajax que excluirá a sessão, com onbeforeunload() uma função de javascript que chama uma ação final quando o usuário sai da página. Por alguma razão, isso nem sempre funciona.

  • excluí-lo na inicialização.

Se você quiser sempre que o usuário veja a página de login na inicialização após a página ser fechada, basta excluir a sessão na inicialização.

<? php
session_start();
unset($_SESSION["session"]);

Isso pode te ajudar

session_set_cookie_params(0);
session_start();

Seu cookie de sessão será destruído … então sua sessão será boa até que o navegador esteja aberto. por favor,

Há mais um “hack” usando o HTTP Referer (supomos que a janela do navegador foi fechada e o nome do domínio do referer atual e o nome do domínio da página atual não coincidem):

session_start();
$_SESSION['somevariable'] = 'somevalue';

if(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_Host) != $_SERVER["SERVER_NAME"]){
    session_destroy();
}

Você pode fazer isso usando JavaScript acionando uma solicitação de ajax para o servidor para destruir a sessão no evento onbeforeunload acionado quando fechamos a guia, janela ou navegador.

Use o seguinte código para destruir a sessão: 

 <?php
    session_start();
    unset($_SESSION['sessionvariable']);
    header("Location:index.php");
    ?>

10 maiores clientes de cada mês nos últimos 2 anos

WITH TMP AS
(
    SELECT
        LEFT(D2_EMISSAO, 6) PERIODO,
        SUM(D2_TOTAL) D2_TOTAL,
        D2_CLIENTE,
        D2_LOJA,
        A1_NREDUZ
    FROM SD2990 D2
    JOIN SA1990 A1 
        ON D2_FILIAL = A1_FILIAL
        AND D2_CLIENTE = A1_COD
        AND D2_LOJA = A1_LOJA
        AND D2_TIPO = 'N'
        AND D2.D_E_L_E_T_ = ''
        AND A1.D_E_L_E_T_ = '' 
    JOIN SF4990 F4 
        ON F4_FILIAL = D2_FILIAL
        AND F4_CODIGO = D2_TES
        AND F4_DUPLIC = 'S'
        AND F4.D_E_L_E_T_ = ''
	GROUP BY LEFT(D2_EMISSAO, 6), D2_CLIENTE, D2_LOJA, A1_NREDUZ
),
AUX AS (
SELECT 
    *,
	ROW_NUMBER() OVER (PARTITION BY PERIODO ORDER BY D2_TOTAL DESC) TOPMES
FROM TMP
)
SELECT 
	*
FROM AUX
WHERE TOPMES <= 10
ORDER BY PERIODO, TOPMES

Programação Impressoras Térmicas

Considerações Iniciais

Este documento não tem o objetivo de ensinar ao leitor a programação “ADVPL”, nem a lógica de programação, pois neste caso presumimos que o leitor já tenha este conhecimento.

impressora_termica_zebra_rz400_leitor_codificador_de_rfid_uhf_integrado_6178_1_20140828162550

Neste documento serão apresentadas todas as funções necessárias para a geração e impressão de etiquetas com ou sem código de barras para impressoras térmicas.

Atualmente as funções para impressão térmica englobam as linguagem DPL, EPL, IPL  e ZPL, sendo estas linguagens totalmente transparentes para o programador. Sendo assim o programador em questão não precisa ser um conhecedor das linguagem de programação para impressoras térmicas descritas acima, desenvolvidas por seus fabricantes.

Onde:

  • DPL    é a linguagem de programação datamax;
  • EPL    é a linguagem de programação eltron;
  • IPL    é a linguagem de programação intermec;
  • ZPL    é a linguagem de programação zebra.

Sentido da Impressão

O sentido de impressão não é o mesmo para todas impressoras térmicas. Alguns fabricantes de impressoras diferem  o sentido de impressão um do outro, tendo suas próprias justificativas, podendo elas ser desempenho, qualidade ou até facilidade para o desenvolvedor.

Quando falamos em sentido de impressão, também é importante falarmos do ponto de origem (0,0) no posicionamento do desenho de imagens, linhas e textos, pois isto também é definido pelo fabricante tendo as mesmas regra justificadas por ele.

Abaixo são apresentadas os sentidos de impressão e ponto de origem para os padrões de programação e impressoras homologadas.

Padrão Zebra e Eltron (Programação ZPL e EPL)

ZPL

A figura 01 ilustra o eixo cartesiano de trabalho, o ponto de origem do eixo cartesiano e principalmente o ponto de origem para inicio do texto ou figura, a qual fica no canto superior esquerdo ( de cima para baixo) conforme figura 01.

OBS: Alguns modelos de impressoras ELTRON, possuem o alinhamento da folha de etiqueta centralizado, por isso deve-se considerar o ponto de impressão da posição+a margem.

2.2. Padrão Datamax (Programação DPL )

DPL

Note na figura 02 que o quadrante do eixo cartesiano do padrão datamax é diferente do quadrante do eixo cartesiano da intermec e zebra. Também é importante observar que o ponto de origem para o desenho do texto ou figura inicia no canto inferior esquerdo do texto ou figura (ou seja, de baixo para cima do texto ou figura), diferentemente do padrão zebra e intermec.

Figura 02 – Apresentação do sentido de impressão da imagem na etiqueta padrão datamax.

2.3. Padrão Intermec (Programação IPL)

IPL

Note que o quadrante do eixo cartesiano do padrão intermec é diferente do quadrante do eixo cartesiano da datamax e da zebra. Porém é importante observar que o ponto de origem para o desenho do texto ou figura inicia no canto superior esquerdo do texto ou figura ( ou seja, a impressão do texto ou figura se dá de cima para baixo, a partir de sua origem), igual o padrão zebra e diferente do padrão datamax.

Figura 03 – Apresentação do sentido de impressão da imagem na etiqueta padrão Intermec.

3. Funções

 Nesta sessão serão descritos as funções necessárias para desenvolver imagens de etiqueta para impressoras térmicas.

Os parâmetros que estiverem entre [], significa que não são OBRIGATÓRIOS, os parâmetros que estiverem com (*), significa que é uso exclusivo ZPL.

3.1. MSCBPrinter

Objetivo:

            Permite realizar as configurções da impressora, as quais permitirão ao programador determinar as caracteristicas de impressão, definidas pelos parâmetros abaixo.

Sintaxe:

MSCBPRINTER(cModelPrt, cPorta, nDensidade, nTamanho, lSrv, nPorta, cServer, cEnv, nMemoria, cFila, lDrvWin, cPathSpool)

ParâmetrosDescrição
[cModelPrt]  String com o modelo de impressora:FabricanteImpressorasDatamaxALLEGRO, ALLEGRO 2, PRODIGY, DMX, DESTINY, URANO, DATAMAX, OS 214, OS 314, PRESTIGE, ARGOXEltronELTRON, TLP 2722, TLP 2742, TLP 2844, TLP 3742, C4-8IntermecINTERMEC, 3400-8, 3400-16, 3600-8, 4440-16, 7421C-8ZebraS300, S400, S500-6, S500-8, Z105S-6, Z105S-8, Z160S-6, Z160S-8, Z140XI, S600, Z4M, Z90XI, Z170XI, ZEBRA.
[cPorta]String com a porta
[nDensidade]Número com a densidade referente a quantidade de pixel por  mm. Este parâmetro só deve ser informado quando o parâmetro cModelPrt não for informado, pois cModelPrt o atualizará automaticamente. A utilização deste parâmetro deverá ser usado quando não souber o modelo da impressora, a aplicação entendera que se trata de uma impressora Zebra.  O tamanho da etiqueta será necessário quando a mesma não for continua.
[nTamanho]  Tamanho da etiqueta em Milímetros. Lembrando que este tamanho só deve ser passado se a etiqueta for continua.
[lSrv]           Se .t. imprime no server,.f. no client. O seu valor padrão é .f.
[nPorta]      Número da porta de outro server
[cServer]   endereço IP de outro server
[cEnv]   environment do outro server
[nMemoria]  Número com bloco de memória da impressora térmica. Caso seja enviada muita informação para a impressora, a fim que esta venha imprimir (sobrecarregando a memória), pode ocorrer perda de dados. Por outro lado, se for informado blocos muito pequenos de memória, implicará na diminuição da performance da impressora. Sendo assim o programador deverá fazer uma avaliação para ver o que melhor se adequa a sua situação.
[cFila]Diretório onde será gravada as filas
[lDrvWin]Indica se será utilizando os drivers do windows para impressão
[cPathSpool]Caminho do diretório onde serão geradas as filas de impressão

Exemplo usando o padrão de programação Zebra (família ZPL)

Local nXLocal cPorta/*configuracoes mais utilizadas de portacPorta := “COM2:9600,n,8,1”cPorta := “COM2:9600,n,8,2”cPorta := “COM2:9600,n,7,1”cPorta := “COM2:9600,n,7,2”cPorta := “COM2:9600,e,8,1”cPorta := “COM2:9600,e,8,2”cPorta := “COM2:9600,e,7,1”cPorta := “COM2:9600,e,7,2”cPorta := “LPT1”*/cPorta := “COM1:9600,N,8,1”MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)For nx:=1 to 3MSCBBEGIN(1,6)MSCBSAY(10,06,”CODIGO”,”N”,”A”,”015,008″)MSCBSAY(33,09, Strzero(nX,10), “N”, “0”, “032,035”)MSCBSAY(05,17,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBEND()NextMSCBCLOSEPRINTER()

3.2. MSCBClosePrinter

Objetivo:

Finaliza a conexão com a impressora.

Sintaxe:

MSCBClosePrinter()

Exemplo usando o padrão de programação Zebra (família ZPL):

Local cPorta := “COM1:9600,N,8,1”MSCBPRINTER(“S500-8″,cPorta,          , 40   ,.f.)For nx:=1 to 3MSCBBEGIN(1,6)MSCBSAY(10,06,”CODIGO”,”N”,”A”,”015,008″)MSCBSAY(33,09, Strzero(nX,10), “N”, “0”, “032,035”)MSCBSAY(05,17,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBEND()NextMSCBCLOSEPRINTER() 

3.3. MSCBBegin

Objetivo:

Inicializa a montagem da imagem para cada etiqueta.

Sintaxe:

 MSCBBEGIN(nxQtde,nVeloc,nTamanho,lSalva)

ParâmetrosDescrição                                                                                                           
[nQtde]  Quantidade de cópias
[nVeloc] Velocidade (1,2,3,4,5,6) polegadas por segundo
[nTamanho]Tamanho da etiqueta em Milímetros.
[lSalva]Variável utilizada somente para definição de form´s. O valor default da variável é .f.

Exemplo usando o padrão de programação Zebra (família ZPL):

Local nXLocal cPorta := “COM1:9600,N,8,1”MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)For nx:=1 to 3MSCBBEGIN(1,6)         MSCBSAY(10,06,”CODIGO”,”N”,”A”,”015,008″)MSCBSAY(33,09, Strzero(nX,10), “N”, “0”, “032,035”)MSCBSAY(05,17,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBEND()NextMSCBCLOSEPRINTER() 

3.4. MSCBEnd

Objetivo:

Finaliza a montagem da imagem, que foi inicializada por um “MSCBBegin( )”.

Sintaxe:

MSCBEND()

Exemplo usando o padrão de programação Zebra (família ZPL):

Local nXLocal cPorta := “COM1:9600,N,8,1”MSCBPRINTER(“S500-8″,cPorta,          , 40   ,.f.)For nx:=1 to 3MSCBBEGIN(1,6)MSCBSAY(10,06,”CODIGO”,”N”,”A”,”015,008″)MSCBSAY(33,09, Strzero(nX,10), “N”, “0”, “032,035”)MSCBSAY(05,17,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBEND()              NextMSCBCLOSEPRINTER() 

3.5. MSCBSay

Objetivo:

Imprime uma string.

Sintaxe:

MSCBSAY(nXmm, nYmm, cTexto, cRotacao, cFonte, cTam, lReverso, lSerial, cIncr, lZerosL, lNoAlltrim)

ParâmetroDescrição
nXmmPosição X em Milímetros
nYmmPosição Y em Milímetros
cTextoString a ser impresso ou itens especificando uma variável “@”.(Ex: “@2”).Obs: quando for especificado uma variável, o seu conteúdo deverá ser apenas o caractere “@” seguido de um número, “@1” ou “@2” e assim por diante. Vide item 3.15. 
cRotaçãoString com o tipo de Rotação (N,R,I,B):InstruçãoDescriçãoNNormalRCima para baixoIInvertidoBBaixo para cima
cFonteString com os tipos de Fonte:PadrãoTiposZebra(A,B,C,D,E,F,G,H,0) 0(zero)- fonte escalarDatamax(0,1,2,3,4,5,6,7,8,9) 9 – fonte escalarEltron(0,1,2,3,4,5)Intermec(0,1,7,20,21,22,27)
cTamString com o tamanho da Fonte
*[lReverso]Imprime  em reverso quando tiver sobre um box preto
[lSerial]Serializa o código
[cIncr]  Incrementa quando for serial positivo ou negativo
*[lZerosL]Coloca zeros a esquerda no numero serial
[lNoAlltrim]Permite brancos a esquerda e direita

Exemplo usando o padrão de programação Zebra (família ZPL):

Local nXLocal cPorta := “COM1:9600,N,8,1”MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)For nx:=1 to 3MSCBBEGIN(1,6)MSCBSAY(10,06,”CODIGO”,”N”,”A”,”015,008″)   MSCBSAY(33,09, Strzero(nX,10), “N”, “0”, “032,035”)   MSCBSAY(05,17,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBEND()NextMSCBCLOSEPRINTER() 

3.6. MSCBSayBar

Objetivo:

Imprime código de barras.

Sintaxe:

MSCBSAYBAR(nXmm, nYmm, cConteudo, cRotacao, cTypePrt, nAltura, lDigVer, lLinha, lLinBaixo, cSubSetIni, nLargura, nRelacao, lCompacta, lSerial, cIncr, lZerosL)

ParâmetroDescrição
nXmmPosição X em Milímetros
nYmmPosição Y em Milímetros
cConteudoString a ser impressa especificando uma variável “@” ou array somente quando o parâmetro cTypePrt for igual á MB07.Definição do Array:cConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494”}}A possição 1 do array (ex: “01”) informa o AI utilizadado (que será visto no item 3.6.1. “Utilização do código de barras  128”).Já a possição 2 do array (ex: “07893316010411”) é o conteúdo do AI. 
cRotaçãoString com o tipo de Rotação:InstruçãoDescriçãoNNormalRCima para baixoIInvertidoBBaixo para cima
cTypePrtString com o Modelo de Código de Barras:InstruçãoModelo de Código de BarrasMB01Interleaved 2 of 5MB02Code 39MB03EAN 8MB04EAN 13MB05UPC AMB06UPC EMB07CODE 128Obs: Caso o leitor queira utilizar o modelo do padrão de programação da impressora, o mesmo deverá consultar documentação do fabricante. 
[nAltura]Altura do código de Barras em Milímetros
*[ lDigver]Imprime dígito de verificação
[lLinha]   Imprime a linha de código
*[lLinBaixo]Imprime a linha de código acima das barras
[cSubSetIni]Utilizado no code128
[nLargura] Largura da barra mais fina em pontos default 3
[nRelacao]Relação entre as barras finas e grossas em pontos default 2
[lCompacta]Parâmetro fora de uso.
[lSerial]Serializa o código
[cIncr]  Incrementa quando for serial positivo ou negativo
[lZerosL]Coloca Zeros a esquerda do conteúdo. Este parâmetro só é valido quando lSerial estiver ativado (.t.).

Exemplo usando o padrão de programação Zebra (família ZPL):

Local nXLocal cPorta := “LPT1” MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)MSCBLOADGRF(“SIGA.GRF”)For nx:=1 to 3MSCBINFOETI(“Exemplo 1″,”MODELO 1″)MSCBBEGIN(1,6)MSCBBOX(02,01,76,35)MSCBLineH(30,05,76,3)MSCBLineH(02,13,76,3,”B”)MSCBLineH(02,20,76,3,”B”)MSCBLineV(30,01,13)MSCBGRAFIC(2,3,”SIGA”)MSCBSAY(33,02,’PRODUTO’,”N”,”0″,”025,035″)MSCBSAY(33,06,”CODIGO”,”N”,”A”,”015,008″)MSCBSAY(33,09, Strzero(nX,10), “N”, “0”, “032,035”)MSCBSAY(05,17,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBSAYBAR(23,22,Strzero(nX,10),”MB07″,”C”,8.36,.F.,.T.,.F.,,2,1)MSCBEND()NextMSCBCLOSEPRINTER() 

3.6.1. Utilização do código 128

O código 128, permite a impressão de todos os 128 caracteres ASCII, incluindo caracteres alfanuméricos maiúsculos e minúsculos, bem como os caracteres de controle. Além disso existem alguns caracteres especiais que são de uso instrínseco ao código 128.

O código 128 está dividio em três subconjuntos: A, B e C dos quais apenas um está ativo de cada vez. Cada um dos códigos tem um sentido diferente dependendo do subconjunto ativo.

No protheus os subconjuntos A, B e C, são representados pelas funções MSCB128A( )MSCB128B( ) e MSCB128C( ) respectivamente.

subconjunto A possibilita a impressão de todos os caracteres alfanuméricos maiúsculos, caracteres de controle e caracteres especiais.

subconjunto B possibilita a impressão de todos os caracteres alfanuméricos maiúsculos, caracteres minúsculos, e caracteres especiais. Este subconjunto não possibilita a compactação, porém aceita quase todos os caracteres contidos na tabela ASCII.

subconjunto C é utilizado para duplicar a densidade de códigos com conteúdo apenas NUMÉRICO e número PAR de dígitos. Este aumento de densidade é obtido pela impressão de um conjunto de 100 pares de dígitos de 00 a 99 inclusive. Além disto permite a impressão de caracteres especiais. Ou seja o subconjunto C é utilizado para compactar o código de barras.

Sendo assim as funções MSCB128A( )MSCB128B( ) e MSCB128C( ) permitem efetuar uma mudança no conjunto dentro do símbolo (código de barras). Todos os caracteres que seguem o caractere de código (subconjuto A, B ou C) são codificados de acordo com o conjunto de caracteres correspondente, salvo quando se encontra um outro caracter do código do caracter shift, que é semelhante à tecla “shift lock” no teclado de uma máquina de escrever, porém isso é tratado internamente nas funções de geração de código de barras.

A função MSCB128A( ) modifica a codificação para o conjunto de caracteres A.

A função MSCB128B( ) modifica a codificação para o conjunto de caracteres B.

A função MSCB128C( ) modifica a codificação para o conjunto de caracteres C.

O caractere de mudança (shift) permite uma alterção no conjunto de caracteres para o caracter que o segue imediatamente no símbolo. Os caracteres subsequentes revertem para o conjunto de caracteres ativo anterior ao caracter de mudança. O carctere shift opera somente entre os subconjuntos A e B. Não é possível mudar para o subconjunto C, nem mudar a partir dele. O caractere shift é semelhante à tecla “shift” no teclado de uma máquina de escrever. A função no protheus para utilização do caractere de “shift” é MSCB128Shift( ).

Existe também, o caractere FNC 1, usado como separador quando estão concatenados vários AIs e seus campos de dados quando os AI´s são variáveis, é transmitido como caractere GS. O GS no protheus é representado pela função MsCB128GS( ). Os AI´s serão discutidos no item 3.6.2.

Lembrando ao leitor que o mesmo não deverá se preocupara com a função MSCB128Shift() e MSCB128GS(), pois as mesmas são tratadas internamente na geração do código de barras. O leitor deverá somente se preocupar em seguir alguns critérios apresentados no exemplo 02 do item 3.6.

3.6.2. IDENTIFICAÇÃO DE APLICAÇÃO (Ais)

O símbolo UCC/EAN-128 é uma simbologia extremamente flexível. Permite a representação de dados de comprimento variável e possibilita codificar várias informações em um símbolo do código de barras. Isso se denomina concatenação. Este tipo de código de barras é iniciado por um caractere “START” indicando a tabela – code “A”, “B” ou “C” vistos anteriormente e que permite a identificação de 128 caracteres ASCII, seguido do caractere “FNC1”, ex: “START” (Code C) “FNC1”. Este caractere duplo inicial não é visível para as pessoas, mas deve estar no início das barras para que seja possível o reconhecimento e tratamento da estrutura da simbologia: os Indicadores de Aplicação, caractere separador, Dígito Verificador e Stop.

Os Als são códigos que anunciam com exclusividade os dados que os sucedem, seu significado e seu comprimento. Os dados que aparecem após um AI podem abranger caracteres alfabéticos e/ou numéricos de qualquer comprimento, chegando em alguns formatos até trinta caracteres. Os campos de dados têm comprimento fixo ou variável, dependendo do AI.

Os atributos de dados relacionam-se com um item: um item comercial ou de transporte, e não possuem significado caso sejam isolados. Podem ser representados no UCC/EAN-128 usando-se AIs. Existe uma faixa de AIs para medidas de itens comerciais, nos quais o peso descrito é o peso líquido, e uma faixa de AIs para medidas de unidades de transportes, denominadas unidades logísticas, nas quais o peso descrito é o peso bruto.

A tabela a seguir foi extraída da lista completa como exemplo dos AIs. Observe que um deles representa um significado – “conteúdo” , uma senha – “título de dados” para sua identificação na aplicação; e um formato” para a representação dos dados n (numéricos) ou em an (alfanuméricos), fixos ou variáveis.

A representação de AIs numa mesma linha do código de barras é possível desde que respeitadas as regras de concatenação:

  •  Máximo de 48 caracteres numa mesma seqüência de dados (incluindo os AIs e caracter(es) separador(es) se tiver(em), mas excluindo os caracteres auxiliares e o dígito verificador);
  • Máximo de 165mm do símbolo, incluindo as margens de silêncio (para uma mesma linha de código de barras);
  • Uso do caractere separador “FNC1” depois de um AI de dado variável, quando concatenado com outro AI. A tabela a seguir identifica todos os Ais reconhecidos como tendo formato de dados fixos.

Os Identificadores de Aplicação que não aparecem nesta tabela deverão receber caractere separador (FNC1), quando anteceder qualquer outro AI numa concatenação. O caractere separador de dados FNC1 não aparece na representação humano-legível, mas deverá estar contido nas barras, a menos que o AI variável for o ultimo representado no código, pois neste caso o caractere “STOP” determina o final de representação.

Tabela de AI´s disponibilizada pela EAN:

AITítulo CompletoFormato
00Código de Série de Unidade Logístican2 +n18
01Número Global de item Comercialn2+n14
02GTIN de itens comerciais contidos em uma unidade logístican2+n14
10Número de Batch ou de loten2 + an..20
11¹Data de Produção (AAMMDD)n2+n6
12¹Data de Vencimento/ Pagamento (AAMMDD)n2+n6
13¹Data de Embalagem (AAMMDD)n2+n6
15¹Data de Durabilidade Mínima (AAMMDD)n2+n6
17¹Data de Durabilidade Máxima (AAMMDD)n2+n6
20Variante do Produton2+n2
21Número de Sérien2+an20
22Dados Secundários para Produtos Específicos do Setor de Saúden2+an..29
23²Número de lote (Uso Transitório)n3+n..19
240Identificação Adicional do Produto Atribuída pelo Fabricanten3+an..30
241Número de Clienten3+an..30
2504Número de Série Secundárion3+an..30
AITítulo CompletoFormato
2514Referência da Entidade de Origemn3+an..30
30Contagem Variáveln2+n..8
31-36³Medidas Comerciais e Logícasn4+n6
337³Quilos por metro quadradon4+n6
37Contagem de itens Comerciais Contidos numa Unidade Logístican2+n..8
390³Valor a Pagar – área monetária isoladan4+n..15
391³Valor a Pagar – com o código ISO de moedan4+n3+n..15
392nValor a Pagar por um item de medida variável – área monetária isoladan4+n..15
393nValor a Pagar por um item de medida variável – com o código ISO de moedan4+n3+n..15
400Número de Ordem de Compra do Clienten3+an..30
401Número de Consignaçãon3+an..30
402Número de Identificação do Despachon3+n17
403Código de Rotan3+an..30
410Número de Localização Global EAN/UCC “Despachar para – Entregar para”– destino imediaton3+n13
411Número Global de Localização EAN/UCC “Faturar para” “ Cobrar de”n3+n13
412Número Global de Localização EAN/UCC “ Comprado de”n3+n13
413Número Global de Localização EAN/UCC “Despachar para – Entregar para “– destino finaln3+n13
414Identificação de Local Físico Número Global EAN/UCC de Localizaçãon3+n13
415Número Global de Localização EAN/UCC da Parte que faturan3 + n13
420Código Postal dentro de uma única Autoridade Postal“Despachar para – Entregar para”n3+an20
421Código Postal com Código isso de País com 3 Dígitos“ Despachar” para – Entregar para “n3+n3+an9
422País de Origem de um Item Comercial – Padrão ISO 3166n3+n3
8001Produtos em Rolo – Largura, Comprimento, Diâmetro doCentro, Direção e Junçõesn4+n14
8002Identificador Eletrônico em Série para Telefones Celulares Móveisn4+an..20
8003Identificador Global de Ativo Retornáveln4+n14+an..16
8004Identificador Global de Ativo Individualn4+an..30
8005Preço por Unidade de Medidan4+n6
8006Identificação do Componente de um Item Comercialn4+n14+n2+n2
8007Número de Conta de Banco Internacionaln4+an..30
8018Número de Relação de Serviço Globaln4+n..18
8020Número de Referência de Boleto de Pagamenton4+an..25
8100Código Estendido de Cupom – NSC+ Código de oferta (USA/Canadá)n4+n1+n5
8101Código Estendido de Cupom – NSC+ Código de oferta + final do código de oferta (USA/Canadá)n4+n1+n5+n4
8102Código Estendido de Cupom – NSC (USA/Canadá)n4+n1+ n1
90***Informação Combinada Mutuamente entre Parceiros Comerciais (Incluindo FACT DIs)n2 +na..30
91-99Informação interna de Empresan2+na..30

Tabela 01 – Tabela de AI´s

Onde:

  1. Quando forem necessários apenas ano e mês, DD deve ser preenchido com “00”.
  2. Mais um dígito para a indicação de comprimento.
  3. Estes Als compreendem 4 dígitos. Os três primeiros dígitos identificam o objetivo do AI, e o quarto dígito indica a posição do

ponto decimal.

***. O título do dado “vigente “ deve ser especificado pelo emissor da informação.

Exemplo do código 128 usando o padrão de programação ZPL:

Local cPorta := “COM1:9600,N,8,1” MSCBPRINTER(“S500-8”,cPorta,,35)MSCBBEGIN(1,6)MSCBBOX(02,01,76,34,1)aConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494”}}MSCBSAYBAR(08,10,aConteudo,”N”,”MB07″,10,.F.,.T.,.F.,”C”,2,1,.F.)MSCBEND()MSCBCLOSEPRINTER() 

Note: O conteúdo é do tipo array.

3.7. MSCBBox

Objetivo:

Imprime um box.

Sintaxe:

MSCBBOX(nX1mm, nY1mm, nX2mm, nY2mm, nExpessura, cCor)

ParâmetroDescrição
nX1mmPosição X1 em Milímetros
nY1mmPosição Y1 em Milímetros
nX2mmPosição X2 em Milímetros
nY2mmPosição Y2 em Milímetros
[nEspessura]Numero com a espessura em pixel
*[cCor]    String com a Cor Branca ou Preta  (“W” ou “B”)

Exemplo usando o padrão de programação Zebra (família ZPL):

Local cPorta := “LPT1”MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)MSCBBEGIN(1,6)MSCBBOX(02,01,76,35)MSCBEND()MSCBCLOSEPRINTER() 

3.8. MSCBLineH

Objetivo:

Imprime uma linha horizontal.

Sintaxe:

MSCBLineH(nX1mm, nY1mm, nX2mm, nExpessura, cCor)

ParâmetroDescrição
nX1mmPosição X1 em Milímetros
nY1mmPosição Y1 em Milímetros
nX2mmPosição X2 em Milímetros
[nEspessura]Numero com a espessura em pixel
*[cCor]    String com a Cor Branca ou Preta  (“W” ou “B”)

Exemplo usando o padrão de programação Zebra (família ZPL):

Local cPorta := “LPT1” MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)MSCBBEGIN(1,6)MSCBLineH(30,05,76,3)MSCBLineH(02,13,76,3,”B”)MSCBEND()MSCBCLOSEPRINTER() 

3.9. MSCBLineV

Objetivo:

Imprime uma linha vertical.

Sintaxe:

MSCBLineV(nX1mm, nY1mm, nY2mm, nExpessura, cCor)

ParâmetroDescrição
nX1mmPosição X1 em Milímetros
nY1mmPosição Y1 em Milímetros
nY2mmPosição X2 em Milímetros
[nEspessura]Numero com a espessura em pixel
*[cCor]      String com a Cor Branca ou Preta  (“W” ou “B”)

Exemplo usando o padrão de programação Zebra (família ZPL):

Local cPorta := “LPT1” MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)MSCBBEGIN(1,6)MSCBLineV(30,01,13)MSCBEND()MSCBCLOSEPRINTER() 

3.10. MSCBLoadGraf

Objetivo:

Carrega uma imagem para memória da impressora.

Sintaxe:

MSCBLOADGRF(cImagem)

ParâmetroDescrição
cImagemNome do arquivo que será carregado, inclusive o path + nome completo + extensão

Observações:

Para o padrão Zebra, o arquivo do gráfico (cImagem) tem que ser do tipo GRF, gerado através de um PCX ou TIF no software fornecido pelo fabricante da zebra.

Para o padrão Intermec, o arquivo do gráfico (cImagem) tem que ser do tipo UDC, gerado através de um BMP ou TIF(não compactado) no software fornecido pelo fabricante da intermec.

Para o padrão Datamax, o arquivo do gráfico pode ser do tipo BMP, PCX, não sendo necessário ser convertido.

Para o padrão Eltron, o arquivo do gráfico tem que ser do tipo PCX, não sendo necessário ser convertido.

Exemplo do código 128 usando o padrão de programação ZPL:

Local cPorta := “LPT1” MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)MSCBLOADGRF(“SIGA.GRF”)MSCBBEGIN(1,6)MSCBGRAFIC(2,3,”SIGA”)MSCBEND()MSCBCLOSEPRINTER() 

3.11. MSCBGraphic

Objetivo:

Imprime gráfico que está armazenado na memória da impressora.

Sintaxe:

MSCBGRAFIC(nXmm, nYmm, cArquivo, lReverso)

ParâmetroDescrição
NXmmPosição X em Milímetros
NYmmPosição Y em Milímetros
cArquivoNome do gráfico que foi carregado na memória da impressora (não colocar a extensão do arquivo)
*[lReverso]Imprime  em reverso quando tiver  sobre um box preto

Exemplo usando o padrão de programação ZPL:

Local cPorta := “LPT1”MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)MSCBLOADGRF(“SIGA.GRF”)MSCBBEGIN(1,6)MSCBGRAFIC(2,3,”SIGA”)                  MSCBEND()MSCBCLOSEPRINTER() 

3.12. MSCBChkStatus

Objetivo:

Seta ou visualiza o controle de status do sistema com a impressora.

Sintaxe:

MSCBCHKStatus(lStatus)

ParâmetroDescrição
[lStatus]  Lógica ativa/desativa  o controle. Seu valor default é .t.

Observações:

Com o status ativado, sempre que a aplicação enviar qualquer informação para a impressora, será analisado o status, caso esteja com o buffer cheio, sem papel ou sem ribbon, o sistema aguardara até que os itens anteriores estejam solucionados. Caso haja uma incompatibilidade com o sistema operacional ou uma configuração inadequada, o mesmo poderá travar por não conseguir efetuar uma comunicação correta, caso isto ocorra, desative esta opção.

Exemplo usando o padrão de programação Zebra (família ZPL):

Local cPorta := “LPT1” MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)MSCBCHKSTATUS(.t.)MSCBBEGIN(1,6)MSCBLineV(30,01,13)MSCBEND()MSCBCLOSEPRINTER() 

3.13. MSCBInfoEti

Objetivo:

Grava informações para gerenciamento do MSCBSpool.

Sintaxe:

MSCBInfoEti(cDescr,cFiltro)

ParâmetroDescrição
cDescrDescrição que gerará informação no MSCBSpool para identificar a etiqueta.
cFiltroÉ utilizado para realizar filtros no MSCBSpool. Vide documentação MSCBSpool.

Exemplo usando o padrão de programação Zebra (família ZPL):

Local nXLocal cPorta := “LPT1” MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)For nx:=1 to 3MSCBINFOETI(“Exemplo 1″,”MODELO 1”)MSCBBEGIN(1,6)MSCBSAY(05,05,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBEND()NextMSCBCLOSEPRINTER() 

3.14. MSCBWrite

Objetivo:

Permite enviar para porta uma linha de programação nativa da Impressora.

Sintaxe:

MSCBWrite(cConteudo)

ParâmetroDescrição
cConteudoLinha de programação nativa da impressora.

Exemplo usando o padrão de programação Zebra (família ZPL):

Local nXLocal cPorta := “COM1:9600,N,8,1” MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)MSCBBEGIN(1,6)MSCBWrite(“^FXPARAMETROS GERAIS ^FS”)MSCBWrite(“^LL120”)MSCBWrite(“^LH30,30”)MSCBWrite(“^PRA”)MSCBWrite(“^PQ10,2,,N”)MSCBWrite(“^FXCONTEUDO DA ETIQUETA^FS”)MSCBWrite(“^F01,1^GB250,90,10^FS”)MSCBWrite(“^F035,40^ADN,18,10^FDMicrosiga Software S/A^FS”)MSCBEND()MSCBCLOSEPRINTER() 

3.15. MSCBVar

Objetivo:

Cria variáveis para serem utilizadas nos form´s (imagem) da etiqueta. Sendo assim podemos criar para cada um dos campos (código de barras e textos) uma variável correspondente. Normalmente este recurso é utilizado somente em layout´s variáveis, ou seja, em campos que são alterados constatemente.

O uso de variáveis permite ao programador criar um layout padrão (form) o qual será enviado para a impressora térmica, e depois o mesmo somente enviará as alterações das variáveis, diminuindo a quantidade de dados que serão carregados na impressora. Isto fará com que a impressora use uma quantidade menor de memória, podendo com isto ter uma diminuição de erros provenientes do buffer de impressão e um aumento de performance (velocidade) na impressão.

Sintaxe:

MSCBVar(cVar,cDados)

ParâmetroDescrição
cVarNome da variável. Lembrando que o mesmo deverá ser incremental e sempre inicializar com “@”.( Exemplo: “@1”)
cdadosConteúdo da variável

Exemplo usando o padrão de programação Zebra (família ZPL):

Local nXLocal cPorta := “COM1:9600,N,8,1” MSCBPRINTER(“S500-8”,cPorta,          ,        ,.f. )MSCBLOADGRF(“SIGA.GRF”)MSCBBEGIN(2,6,nil,.T.)MSCBBOX(02,01,76,35)MSCBLineH(30,05,76,3)MSCBLineH(02,13,76,3,”B”)MSCBLineH(02,20,76,3,”B”)MSCBLineV(30,01,13)MSCBGRAFIC(2,3,”SIGA”)MSCBSAY(33,02,’PRODUTO’,”N”,”0″,”025,035″)MSCBSAY(33,06,”CODIGO”,”N”,”A”,”015,008″)MSCBSAY(33,09, “@1”, “N”, “0”, “032,035”)MSCBSAY(05,17,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBSAYBAR(23,20,”@2″     ,”N”     ,”C”     ,8.36   ,.F.    ,.T.  ,.F.      ,          ,2       ,1       ,.F.,.f.,”1″,.T.)MSCBEND() For nx:=1 to 3MSCBINFOETI(“PRODUTO”,”MODELO 1″)MSCBBEGIN(10,,,.F.)MSCBVAR(“@1”,StrZero(nX,10))MSCBVAR(“@2”,StrZero(nX,10))MSCBEND()Next MSCBCLOSEPRINTER() 

Observação: Note no exemplo acima, que o primeiro bloco inicializado com MSCBBEGIN e finalizado com MSCBEND constroi o layout da etiqueta (form). Já o loop “For” imprime 3 etiquetas utilizando as variáveis que atualizam o código do produto e o código de barras, devinido com a variável “@1” e “@2” respectivamente.

4. Exemplos

4.1. Padrão Datamax

4.1.1. Exemplo 01

User Function ExDPL1()Local nXLocal cPorta := “COM1:9600,n,8,2” MSCBPRINTER(“ALLEGRO”,cPorta,          ,        ,.f. )MSCBLOADGRF(“SIGA.BMP”)For nx:=1 to 3MSCBINFOETI(“Exemplo 1″,”MODELO 1″)MSCBBEGIN(1,4)MSCBBOX(02,01,76,34,1)MSCBLineH(30,30,76,1)MSCBLineH(02,23,76,1)MSCBLineH(02,15,76,1)MSCBLineV(30,23,34,1)MSCBGRAFIC(2,26,”SIGA”)MSCBSAY(33,31,’PRODUTO’,”N”,”2″,”01,01″)MSCBSAY(33,27,”CODIGO”,”N”,”2″,”01,01″)MSCBSAY(33,24, Strzero(nX,10), “N”, “2”, “01,01”)MSCBSAY(05,20,”DESCRICAO”,”N”,”2″,”01,01″)MSCBSAY(05,16,”IMPRESSORA ALLEGRO 2 BR”,”N”, “2”, “01,01”)MSCBSAYBAR(22,03,Strzero(nX,10), , ,8.36,.F.,.T.,.F.,,3,2)MSCBEND()NextMSCBCLOSEPRINTER()Return

4.1.2. Exemplo 02

User Function EXDPL2()Local cPortacPorta := “COM1:9600,N,8,2”MSCBPRINTER(“ALLEGRO”,cPorta,          ,35      ,.f.)MSCBBEGIN()MSCBBOX(02,01,100,30)aConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494″}}MSCBSAYBAR(08,10,aConteudo,”N”,”MB07″,10,.F.,.T.,nil,’C’,3,2,.f.)MSCBEND()MSCBCLOSEPRINTER()Return

4.1.3. Exemplo 03

User Function ExDPL3()Local nXLocal cPorta := “COM1:9600,n,8,2”MSCBPRINTER(“ALLEGRO”,cPorta,          ,        ,.f. )MSCBLOADGRF(“SIGA.BMP”)MSCBBEGIN(1,4,,.t.)MSCBBOX(02,01,76,34,1)MSCBLineH(30,30,76,1)MSCBLineH(02,23,76,1)MSCBLineH(02,15,76,1)MSCBLineV(30,23,34,1)MSCBGRAFIC(2,26,”SIGA”)MSCBSAY(33,31,’PRODUTO’,”N”,”2″,”01,01″)MSCBSAY(33,27,”CODIGO”,”N”,”2″,”01,01″)MSCBSAY(33,24, “@1”, “N”, “2”, “01,01”)MSCBSAY(05,20,”DESCRICAO”,”N”,”2″,”01,01″)MSCBSAY(05,16,”IMPRESSORA ALLEGRO 2 BR”,”N”, “2”, “01,01”)MSCBSAYBAR(22,03,”@2″,”N”,”MB07″,8.36,.F.,.T.,.F.,,3,2,.F.)MSCBEND() For nx:=1 to 10MSCBINFOETI(“PRODUTO”,”MODELO 1″)MSCBBEGIN(10,,,.F.)MSCBVAR(“@1”,StrZero(nX,10))MSCBVAR(“@2″,StrZero(nX,10))MSCBEND()Next MSCBBEGIN(1,4,NIL,NIL)MSCBBOX(02,01,76,34,1)MSCBLineH(30,30,76,1)MSCBLineH(02,23,76,1)MSCBLineH(02,15,76,1)MSCBLineV(30,23,34,1)MSCBGRAFIC(2,26,”SIGA”)MSCBSAY(33,31,’TESTE FINAL’,”N”,”2″,”01,01″)MSCBSAY(33,27,”CODIGO”,”N”,”2″,”01,01″)MSCBSAY(33,24, “000001”, “N”, “2”, “01,01”)MSCBSAY(05,20,”DESCRICAO”,”N”,”2″,”01,01″)MSCBSAY(05,16,”IMPRESSORA ALLEGRO 2 BR”,”N”, “2”, “01,01”)MSCBSAYBAR(22,03,”000001″,”N”,”MB07″,8.36,.F.,.T.,.F.,,3,2,.F.)MSCBEND() MSCBCLOSEPRINTER()Return

4.2. Padrão Eltron

4.2.1. Exemplo 01

User Function EXEPL1()Local nXLocal cPorta:=”LPT1″MSCBPRINTER(“ELTRON”,cPorta,,,.F.)MSCBLOADGRF(“SIGA.PCX”)For nx:=1 to 3MSCBINFOETI(“Exemplo 1″,”MODELO 1″)MSCBBEGIN(1,6)MSCBGRAFIC(04,02,”SIGA”)MSCBBOX(05,01,76,30,2)MSCBLineH(30,06,71,2)MSCBLineH(05,12,71,2)MSCBLineH(05,18,71,2)MSCBLineV(30,1,12,2)MSCBSAY(33,02,’PRODUTO’,”N”,”2″,”1,2″)MSCBSAY(33,07,”CODIGO”, “N”, “1”, “1,1”)MSCBSAY(33,09,Strzero(nX,10), “N”,”1″,”1,2″)MSCBSAY(07,13,”DESCRICAO”,”N”,”1″,”1,1″)MSCBSAY(07,15,”IMPRESSORA ELTRON”,”N”,”1″,”1,2″)MSCBSAYBAR(28,19,Strzero(nX,10),’N’,’MB07′,06,.f.,.t.,,,2,2)MSCBEND()NextMSCBCLOSEPRINTER()Return

4.2.2. Exemplo 02

User Function EXEPL2()Local cPorta := “LPT1”MSCBPRINTER(“ELTRON”,cPorta,,,.F.)MSCBBEGIN(1,6)MSCBBOX(05,03,105,30,2)aConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494″}}MSCBSAYBAR(08,08,aConteudo,’N’,’MB07′,08,,.T.,NIL,”C”,2,2,,,,)MSCBEND()MSCBCLOSEPRINTER()Return

4.2.3. Exemplo 03

User Function EXEPL3()Local cPorta := “LPT1”Local nX MSCBPRINTER(“ELTRON”,cPorta,,,.F.)MSCBLOADGRF(“SIGA.PCX”)For nx:=1 to 1MSCBINFOETI(“ETI TESTE”,”PEQ”)MSCBBEGIN(3,6,,.t.)MSCBGRAFIC(04,02,”SIGA”)MSCBBOX(05,01,76,30,2)MSCBLineH(30,06,71,2)MSCBLineH(05,12,71,2)MSCBLineH(05,18,71,2)MSCBLineV(30,1,12,2) //Monta Linha VerticalMSCBSAY(33,02,’PRODUTO’,”N”,”2″,”1,2″)MSCBSAY(33,07,”CODIGO”, “N”, “1”, “1,1”)MSCBSAY(33  ,09  ,”0000001″, “N”   , “1”  , “1,2”,.T.    ,.t.    ,’+4′)MSCBSAY(07,13,”@1″,”N”,”1″,”1,1″)MSCBSAY(07,15,”IMPRESSORA ELTRON TLP2742″,”N”    ,”1″   , “1,2”)MSCBSAYBAR(28,19,”@2″     ,’N’     ,’MB07′  ,06     ,.f.    ,.t.  ,        ,      ,2   ,2)MSCBEND()NextFor nx:=1 to 4MSCBINFOETI(“ETI TESTE”,”PEQ”)MSCBBEGIN(10,,,.F.)MSCBVAR(“@1”,StrZero(nX,10))MSCBVAR(“@2”,StrZero(nX,10))MSCBEND()Next MSCBINFOETI(“ETI TESTE”,”PEQ”)MSCBBEGIN(3,6)MSCBGRAFIC(04,02,”SIGA”)MSCBBOX(05,01,76,30,2)MSCBLineH(30,06,71,2)MSCBLineH(05,12,71,2)MSCBLineH(05,18,71,2)MSCBLineV(30,1,12,2) //Monta Linha VerticalMSCBSAY(33,02,’PRODUTO’,”N”,”2″,”1,2″)MSCBSAY(33,07,”CODIGO”, “N”, “1”, “1,1”)MSCBSAY(33,09,”0000001″, “N”   , “1”  , “1,2”,.T.    ,.F.    ,’+4′)MSCBSAY(07,13,”teste da folha de rosto”,”N”,”1″,”1,1″)MSCBSAY(07,15,”IMPRESSORA ELTRON TLP2742″,”N”    ,”1″   , “1,2”)MSCBSAYBAR(28,19,”0000001″ ,’N’ ,’MB07′,06 ,.f. ,.t.  ,   ,”C”  ,2  ,2  ,.t. )MSCBEND() MSCBCLOSEPRINTER()Return

4.3. Padrão Intermec

4.3.1. Exemplo 01

User Function ExIPL1()Local nXLocal cPorta := “COM1:19200,E,7,1” MSCBPRINTER(“3600-8”,cPorta,,40,.f. )MSCBLOADGRF(“SIGA.UDC”)For nx:=1 to 3MSCBINFOETI(“Exemplo 1″,”MODELO 1″)MSCBBEGIN(1,5,,NIL)MSCBBOX(01,02,34,76,1)MSCBLineV(30,30,76,1)MSCBLineV(23,02,76,1)MSCBLineV(15,02,76,1)MSCBLineH(23,30,34,1)MSCBGRAFIC(34,02,”SIGA”,.T.)MSCBSAY(32,33,’PRODUTO’,”R”,”2″,”01,01″)MSCBSAY(29,33,”CODIGO”,”R”,”2″,”01,01″)MSCBSAY(26 ,33,StrZero(nX,10), “R”, “2”  ,”01,01″)MSCBSAY(22,05,”DESCRICAO”,”R”,”2″,”01,01″)MSCBSAY(19,05,”IMPRESSORA INTERMEC”,”R”, “2”, “01,01”)MSCBSAYBAR(12,22,StrZero(nX,10),”R”,”MB07″,8.36,.F.,.T.,.F.,,2,2)MSCBEND()NextMSCBCLOSEPRINTER()Return

4.3.2. Exemplo 02

User Function EXIPL2()Local cPorta := “COM1:19200,N,8,1”MSCBPRINTER(“3600-8”,cPorta,          ,35      ,.f.)MSCBBEGIN()MSCBBOX(02,01,30,100,3)aConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494″}}MSCBSAYBAR(20,08,aConteudo,”R”,”MB07″,10,.F.,.T.,nil,’C’,2,1,.f.)MSCBEND()MSCBCLOSEPRINTER()Return

4.3.3. Exemplo 03

User Function ExIPL3()Local nXLocal cPorta cPorta := “COM1:19200,E,7,1”MSCBPRINTER(“I3600”,cPorta,NIL       ,40       ,.f. )MSCBLOADGRF(“SIGA.UDC”) MSCBBEGIN(1,5,,.T.)MSCBINFOETI(“PRODUTO”,”MODELO 1″)MSCBBOX(01,02,34,76,1)MSCBLineV(30,30,76,1)MSCBLineV(23,02,76,1)MSCBLineV(15,02,76,1)MSCBLineH(23,30,34,1)MSCBGRAFIC(34,02,”SIGA”)MSCBSAY(32,33,’PRODUTO’,”R”,”2″,”01,01″)MSCBSAY(29,33,”CODIGO”,”R”,”2″,”01,01″)MSCBSAY(26,33,”@1″, “R”, “2”, “01,01”)MSCBSAY(22,05,”DESCRICAO”,”R”,”2″,”01,01″)MSCBSAY(19,05,”PARAFUSO 1/4 POLEGADAS”,”R”, “2”, “01,01”)MSCBSAYBAR(12,22,”@2″,”R”,”MB07″,8.36,.F.,.T.,.F.,,2,2)MSCBEND() For nx:=1 to 10MSCBBEGIN(,,,.F.)MSCBINFOETI(“PRODUTO”,”MODELO 1″)MSCBVAR(“@1”,StrZero(nX,10))MSCBVAR(“@2”,”999″+StrZero(nX,7))MSCBEND()Next MSCBINFOETI(“PRODUTO”,”MODELO 1″)MSCBBEGIN(2,6,,NIL)MSCBBOX(01,02,34,76,1)MSCBLineV(30,30,76,1)MSCBLineV(23,02,76,1)MSCBLineV(15,02,76,1)MSCBLineH(23,30,34,1)MSCBGRAFIC(2,26,”SIGA”,.T.)MSCBSAY(32,33,’PRODUTO’,”R”,”2″,”01,01″)MSCBSAY(29,33,”CODIGO”,”R”,”2″,”01,01″)MSCBSAY(26,33,”000010″, “R”   , “2”  , “01,01”,,.t.,”2″)MSCBSAY(22,05,”DESCRICAO”,”R”,”2″,”01,01″)MSCBSAY(19,05,”PARAFUSO 1/4 POLEGADAS”,”R”, “2”, “01,01”)MSCBSAYBAR(12,22,”000010″,”R”,”MB07″,8.36,.F.,.T.,.F.,,2,2,.F.)MSCBEND()MSCBCLOSEPRINTER()Return

4.4. Padrão Zebra

4.4.1. Exemplo 01

User Function EXZPL1()Local nXLocal cPortacPorta := “COM1:9600,N,8,1”MSCBPRINTER(“S500-8”,cPorta,          , 40   ,.f.)MSCBLOADGRF(“SIGA.GRF”)For nx:=1 to 3MSCBINFOETI(“Exemplo 1″,”MODELO 1″)MSCBBEGIN(1,6)MSCBBOX(02,01,76,35)MSCBLineH(30,05,76,3)MSCBLineH(02,13,76,3,”B”)MSCBLineH(02,20,76,3,”B”)MSCBLineV(30,01,13)MSCBGRAFIC(2,3,”SIGA”)MSCBSAY(33,02,’PRODUTO’,”N”,”0″,”025,035″)MSCBSAY(33,06,”CODIGO”,”N”,”A”,”015,008″)MSCBSAY(33,09, Strzero(nX,10), “N”, “0”, “032,035”)MSCBSAY(05,17,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBSAYBAR(23,22,Strzero(nX,10),”MB07″,”C”,8.36,.F.,.T.,.F.,,2,1)MSCBEND()NextMSCBCLOSEPRINTER()Return

4.4.2. Exemplo 02

User Function EXZPL2()Local cPortacPorta := “COM1:9600,N,8,1”MSCBPRINTER(“S500-8”,cPorta,,35)MSCBBEGIN(1,6)MSCBBOX(02,01,76,34,1)aConteudo :={{“01″,”07893316010411”},;{“10”,”0000970100″+MSCB128B()+”1″+MSCB128C()},;{“37″,”0004”},;{“21″,”000494″}}MSCBSAYBAR(08,10,aConteudo,”N”,”MB07″,10,.F.,.T.,.F.,”C”,2,1,.F.)MSCBEND()MSCBCLOSEPRINTER()Return

4.4.3. Exemplo 03

User Function EXZPL3()Local cPorta := “COM1:9600,N,8,1”MSCBPRINTER(“S500-8”,cPorta,          ,        ,.f. )MSCBLOADGRF(“SIGA.GRF”)MSCBBEGIN(2,6,nil,.T.)MSCBBOX(02,01,76,35)MSCBLineH(30,05,76,3)MSCBLineH(02,13,76,3,”B”)MSCBLineH(02,20,76,3,”B”)MSCBLineV(30,01,13)MSCBGRAFIC(2,3,”SIGA”)MSCBSAY(33,02,’PRODUTO’,”N”,”0″,”025,035″)MSCBSAY(33,06,”CODIGO”,”N”,”A”,”015,008″)MSCBSAY(33,09, “@1”, “N”, “0”, “032,035”)MSCBSAY(05,17,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBSAYBAR(23,20,”@2″     ,”N”     ,”C”     ,8.36   ,.F.    ,.T.  ,.F.      ,          ,2       ,1)MSCBEND() For nx:=1 to 3MSCBINFOETI(“PRODUTO”,”MODELO 1″)MSCBBEGIN(10,,,.F.)MSCBVAR(“@1”,StrZero(nX,10))MSCBVAR(“@2″,StrZero(nX,10))MSCBEND()Next MSCBBEGIN(2,6,nil,nil)MSCBBOX(02,01,76,35)MSCBLineH(30,05,76,3)MSCBLineH(02,13,76,3,”B”)MSCBLineH(02,20,76,3,”B”)MSCBLineV(30,01,13)MSCBGRAFIC(2,3,”SIGA”)MSCBSAY(33,02,’PRODUTO’,”N”,”0″,”025,035″)MSCBSAY(33,06,”CODIGO”,”N”,”A”,”015,008″)MSCBSAY(33,09, “1”, “N”, “0”, “032,035”)MSCBSAY(05,17,”IMPRESSORA ZEBRA S500-8″,”N”, “0”, “020,030”)MSCBSAYBAR(23,20,”00000000002″ ,”N” ,”C” ,8.36 ,.F. ,.T.  ,.F. ,   ,2 ,1 )MSCBEND() MSCBCLOSEPRINTER()Return

[Wii Tutorial] Wii Backup Manager (v0.4.6 Build 79)

[Wii Tutorial] Wii Backup Manager (v0.4.6 Build 79)

Wii Backup Manager 0.4.5 build 78

Aqui esta um dos melhores programas para Windows e que simplifica muito a questão de transferência de jogos para seu HD Externo ou Pendrive, o Wii Backup Manager possui o diferencial de suportar partição em NTFS e FAT32. O Wii Backup Manager quando usado com FAT32 ajuda a quebrar a barreira técnica que limita jogos acima de 4Giga de ser adicionado diretamente no seu HD Externo ou Pendrive, outra função interessante é que o Wii Backup Manager compacta os jogos em WBFS e consequentemente economiza espaço em seu HD Externo ou Pendrive, não deixe de usar este excelente aplicativo e tirar o máximo proveito do seu HD Externo ou Pendrive !

  • Itens necessários: HD externo ou um Pendrive de qualquer tamanho, o tamanho vai influenciar diretamente na quantidade de jogos que caberá, e um computador com Windows 32 ou 64-bits.
  • DICA: Aconselho você a formatar seu HD Externo ou Pendrive em FAT32, pois este formato é compatível também com jogos de Nintendo GameCube (Nintendont).
  • Wii Backup Manager é um programa usado para transferir jogos para um HD Externo/Pendrive e rodá-los via USB no formato FAT32/NTFS. Esse excelente programa converte sua ISO para WBFS e transfere para o HD/Pendrive selecionado. Uma vantagem muito boa de passar os jogos com o Wii Backup Manager é que não precisa dividir o HD Externo/Pendrive em 2 partes porque possibilita assim o uso do HD Externo em formato original e com suporte ao Nintendo Wii.

DICA IMPORTANTE: No caso de você estar usando Sistema Operacional “GNU/Linux”, teste o aplicativo “QWBFS Manager” postado AQUI, ou utilize o “Wii Backup Manager” através do Wine.

1º – Você precisará do programa Wii Backup Manager 0.4.6 build 79 que estarei disponibilizando o link para baixar no final do poste!

2º – Após descompactar, terá dois arquivos:

Clique para ampliar

Selecione o programa em referência à sua versão do Windows, e execute (de preferência como Administrador, mas se não tiver como, sem problemas).

3º – Com o programa aberto, clique nas abas onde diz “Disco 1” e após clique em “Inactive”, depois selecione o seu HD Externo/Pendrive conforme a unidade que esteja.

Clique para ampliar

4º – Após selecionar sua unidade, o programa verificará seu HD Externo e se estiver nos formatos FAT32/NTFS informará que é um disco válido e perguntará se deseja criar uma pasta “wbfs” em seu HD (WBFS é o formato para qual os jogos serão convertidos), clique em Yes.

Clique para ampliar

5º – Feito isso, vamos copiar um jogo para o HD Externo, para tanto, clique na aba “Arquivos“, clique em “Adicionar” e após selecione a maneira que vai inserir, se é apenas um jogo, ou uma pasta inteira. (No meu caso estarei usando apenas um jogo)

Clique para ampliar

6º – Após selecionado o jogo, deverá aparecer na lista dessa forma:

Clique para ampliar

*OBSERVAÇÃO: Caso não aparecer, clique em “Ferramentas/Covers” e selecione “Sync and download all“.

Clique para ampliar

7º – Feito isso, vamos transferir o jogo para o HD Externo já pronto para tal, selecione o jogo, clique em “Copiar” e selecione o Disco anteriormente preparado.

Clique para ampliar

Agora é só aguardar a conclusão da transferência

Clique para ampliar

Terminado, é só verificar se seu jogo está no HD Externo, remover com segurança e partir pra Jogatina usando um USB Launcher (loader), eu uso o USB Loader GX, mas fica à seu critério qual usar.

a

NOVIDADES

*Novidades da versão 0.4.6 Build 79 (segundo o desenvolvedor)*
– Added: A little antialiasing for the software cover renderer. Still not as good as using OpenGL/Direct3D, but it removes some of the jaggies when the image isn’t too large.
Changed: The covers menu moved to “Tools->Covers”.
– Changed: Internal cover folder format to “c:\covers\3d”. I’m not sure why it was using “c:\covers\3d\%s.png”.
– Added: When selecting a folder, there’s a new dialog that allows you to manually enter the path. Use the button in the dialog to browse for the folder just as before.
– Changed: Only one instance of WBM is allowed to run from the same folder at any time. It’s still possible to run multiple instances as long as they’re not in the same folder. The main reason for this is that the database can’t be shared between instances and would lock up the app.

a

Baixar Servidor 1

Baixar Servidor 2

a

Dúvidas ou sugestões, deixe seu comentário.

Se esta postagem foi útil pra você, não deixe de apertar no botão Curtir

How To Create SFTP User without Shell Access on Ubuntu 20.04 LTS

 Este tutorial ajudará a criar um usuário somente SFTP (sem acesso ssh) em sistemas Ubuntu. O usuário pode conectar o servidor apenas com acesso SFTP e tem permissão para acessar o diretório especificado.

SFTP – SSH Secure File Transfer Protocol –
SFTP (SSH File Transfer Protocol) é um protocolo seguro de transferência de arquivos. Ele roda sobre o protocolo SSH. Ele oferece suporte à funcionalidade de autenticação e segurança total do SSH.
————————————————– ————————————————–
Os: Ubuntu 20.04 LTS (focal fossa) endereço ip – 192.168.0.12
————————————————– ————————————————–
sudo apt update ; sudo apt install -y build-essential net-tools curl git software-properties-common ssh
sudo adduser –shell /bin/false sftpuser            [ Username – sftpuser ]

sudo mkdir -p /var/sftp/files

sudo chown sftpuser:sftpuser /var/sftp/files

sudo chown root:root /var/sftp ; sudo chmod 755 /var/sftp

sudo nano /etc/ssh/sshd_config

Match User sftpuser
    ForceCommand internal-sftp
    PasswordAuthentication yes
    ChrootDirectory /var/sftp
    PermitTunnel no
    AllowAgentForwarding no
    AllowTcpForwarding no
    X11Forwarding no


sudo systemctl restart ssh

Test SFTP Connection – sftp://192.168.0.12
user – sftpuser   Password – yourpassword
Teste Conexão SFTP – sftp: //192.168.0.12
usuário – sftpuser Senha – sua senha

————————————————– ————————————————–

Failed to initialize video. Your GPU may not be supported, or your graphics drivers may need to be updated. Ubuntu 20.04

Este erro pode ser corrigido apos a instalação do OBS

Logue com sudo su e execute o seguinte comando:

LIBGL_ALWAYS_SOFTWARE=1 obs

O obs deve abrir sem novidades.

Agora acesse :

sudo nano /usr/share/applications/com.obsproject.Studio.desktop

[Desktop Entry]
Version=1.0
Name=OBS Studio
GenericName=Streaming/Recording Software
GenericName[fr]=Logiciel d’enregistrement/diffusion
Comment=Free and Open Source Streaming/Recording Software
Comment[fr]=Logiciel libre d’enregistrement et de diffusion sur Internet
Comment[ru]=Бесплатная программа с открытым кодом для записи/трансляции видео
Exec=env LIBGL_ALWAYS_SOFTWARE=1 obs
Icon=com.obsproject.Studio
Terminal=false
Type=Application
Categories=AudioVideo;Recorder;
StartupNotify=true
StartupWMClass=obs

Edit a linha em azul salva e reinicie o seu Ubuntu 20.04

KB2716442 Security Update for SQL Server 2012 Fails

Computador\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\110\ConfigurationState\SQL_DReplay_Controller de 2 para 1

Se necessário crie a chave de registro SQL_DReplay_Controller.reg e coloque o conteúdo a seguir.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\110\ConfigurationState]
“SQL_DQ_CLIENT_Full”=dword:00000001
“SQL_SNAC_CORE”=dword:00000001
“SQL_SNAC_SDK”=dword:00000001
“SQL_WRITER”=dword:00000001
“SQL_BOL_Components”=dword:00000001
“CommonFiles”=dword:00000001
“SQL_DTS_Full”=dword:00000001
“SQL_DReplay_Controller”=dword:00000001
“SQL_DReplay_Client”=dword:00000001
“CommonFiles_Loc”=dword:00000001
“MDSCoreFeature”=dword:00000001
“SQL_PowerShell_Engine_CNS”=dword:00000001
“SQL_BIDS_Full”=dword:00000001
“SQL_PowerShell_Tools_ANS”=dword:00000001
“SQL_SSMS_Adv”=dword:00000001
“Connectivity_Full”=dword:00000001
“SQL_SSMS_Full”=dword:00000001
“SDK_Full”=dword:00000001
“Tools_Legacy_Full”=dword:00000001
“RS_SHP_SharedService_Adv”=dword:00000001

Debug PHP 8 no Visual Code 1.53.0

Crie um arquivo phpinfo.php e salve na pasta C:\xampp\htdocs

Conteúdo do arquivo phpinfo.php :

<?php

phpinfo();

?>

Verifique se o serviço está no ar do seu servidor xampp acessando a sua pagina através do endereço local

No meu caso eu alterei a porta do meu servidor para 90 porém é fácil verificar em que porta o seu está olhe no monitor do xampp

Agora baixaremos o Xdebug no meu caso como utilizo o windows usaremos uma DLL o site é este para download https://xdebug.org/docs/install

O link de wizard ajuda a descobrir qual DLL você deve usar

https://xdebug.org/wizard

Como ele funciona você deve copiar o conteúdo todo da pagina do phpinfo e cola na caixa de texto e clicar em analise

Após a analise baixe a DLL indicada pelo wizard e salve na pasta de extensões do xampp

Agora renomei a DLL para php_xdebug.dll não se esqueça de liberar permissoes ao arquivo pois o sistema operacional windows 10 e outros vão bloquear

Clique como botão direito do mouse e desbloquei a DLL

Pronto agora ela esta desbloqueada e renomeada para php_xdebug.dll

Agora abra o seu php.ini

[XDebug]
zend_extension=php_xdebug.dll
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.client_host=127.0.0.1
xdebug.client_port=9000

Acrescente as linha citadas no fim do arquivo e salva as alterações.

Reinicie o serviço do seu servidor Apache Web

Acesse novamente a pagina do phpinfo.php role o arquivo e veja que agora a extensão está ativa

Pronto agora toda a configuração é no Visual Code

Baixe o vscode https://code.visualstudio.com/

Instale e ao termino ele abrirá automaticamente

Você terá que baixar algumas extensões do vscode

Eu utilizo essas para PHP e controle de fonte, no bloco digite o nome da extensão e depois instalar

Abra a pasta htdocs no vscode

Agora selecione o seu arquivo com dois cliques infophp.php, de dois cliques na linha phpinfo e ela ficara marcada com um ponto de parada para debug

Agora só falta o lançador do debug

{
    // Use o IntelliSense para saber mais sobre os atributos possíveis.
    // Focalizar para exibir as descrições dos atributos existentes.
    // Para obter mais informações, acesse: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "runtimeExecutable": "C:/xampp/php/php.exe",
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "port": 9000,
        },
        {   "runtimeExecutable": "C:/xampp/php/php.exe",
	    "name": "Listen for XDebug",
	    "type": "php",
	    "request": "launch",
	    "port": 9000
	}

    ]
}

Após salvar e clicar em debugar o ponto de parada é respeitado no debug

Links uteis: https://github.com/felixfbecker/vscode-php-debug/issues/411

Links uteis: https://code.visualstudio.com/

Links uteis:https://xdebug.org/wizard

Links uteis: https://www.apachefriends.org/pt_br/index.html

office 2016 download português + ativador

https://officecdn.microsoft.com/db/492350F6-3A01-4F97-B9C0-C7C6DDF67D60/media/pt-BR/ProPlusRetail.img

Criar arquivo na area de trabalho com o script a seguir exemplo ativador.cmd:

Quando for rodar utilize permissão de administrador

@echo off
title Activate Microsoft Office 2016 ALL versions for FREE!&cls&echo ============================================================================&echo #Project: Activating Microsoft software products for FREE without software&echo ============================================================================&echo.&echo #Supported products:&echo – Microsoft Office Standard 2016&echo – Microsoft Office Professional Plus 2016&echo.&echo.&(if exist “%ProgramFiles%\Microsoft Office\Office16\ospp.vbs” cd /d “%ProgramFiles%\Microsoft Office\Office16”)&(if exist “%ProgramFiles(x86)%\Microsoft Office\Office16\ospp.vbs” cd /d “%ProgramFiles(x86)%\Microsoft Office\Office16”)&(for /f %%x in (‘dir /b ..\root\Licenses16\proplusvl_kms.xrm-ms’) do cscript ospp.vbs /inslic:”..\root\Licenses16\%%x” >nul)&(for /f %%x in (‘dir /b ..\root\Licenses16\proplusvl_mak.xrm-ms’) do cscript ospp.vbs /inslic:”..\root\Licenses16\%%x” >nul)&echo.&echo ============================================================================&echo Activating your Office…&cscript //nologo ospp.vbs /unpkey:WFG99 >nul&cscript //nologo ospp.vbs /unpkey:DRTFM >nul&cscript //nologo ospp.vbs /unpkey:BTDRB >nul&cscript //nologo ospp.vbs /inpkey:XQNVK-8JYDB-WJ9W3-YJ8YR-WFG99 >nul&set i=1
:server
if %i%==1 set KMS_Sev=kms7.MSGuides.com
if %i%==2 set KMS_Sev=kms8.MSGuides.com
if %i%==3 set KMS_Sev=kms9.MSGuides.com
if %i%==4 goto notsupported
cscript //nologo ospp.vbs /sethst:%KMS_Sev% >nul&echo ============================================================================&echo.&echo.
cscript //nologo ospp.vbs /act | find /i “successful” && (echo.&echo ============================================================================&echo.&echo #My official blog: MSGuides.com&echo.&echo #How it works: bit.ly/kms-server&echo.&echo #Please feel free to contact me at msguides.com@gmail.com if you have any questions or concerns.&echo.&echo #Please consider supporting this project: donate.msguides.com&echo #Your support is helping me keep my servers running everyday!&echo.&echo ============================================================================&choice /n /c YN /m “Would you like to visit my blog [Y,N]?” & if errorlevel 2 exit) || (echo The connection to my KMS server failed! Trying to connect to another one… & echo Please wait… & echo. & echo. & set /a i+=1 & goto server)
explorer “http://MSGuides.com”&goto halt
:notsupported
echo.&echo ============================================================================&echo Sorry! Your version is not supported.&echo Please try installing the latest version here: bit.ly/getmsps
:halt
pause?

Ativar Windows 10

MÉTODO DO VÍDEO, ANTIGO…
NÃO FUNCIONA EM ALGUNS CASOS

SIGA COMO MOSTRA NO VÍDEO

1º – Abra o CMD em Modo Administrador.
2º – Escreva ou cole o comando: slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX
Espere a caixa dizendo que foi instalado com exito.
3º Escreva ou cole o comando: slmgr /skms kms.xspace.in
Espere a caixa outra vez dizendo que o nome da maquina foi mudado.
4º Escreva ou cole o comando: slmgr /ato
Espere a caixa dizendo que o windows esta ativado.
Para quem não está conseguindo: USE UM DESSES SERIAIS

Windows 10 Home Edition: TX9XD-98N7V-6WMQ6-BX7FG-H8Q99
Windows 10 Pro Edition: VK7JG-NPHTM-C97JM-9MPGT-3V66T
Windows 10 Enterprise: NPPR9-FWDCX-D2C8J-H872K-2YT43

Chaves extras: Ambas Versões ((Atualizada)) 10/11/2020
NHKMK-23VQY-9RKY7-QJ4KV-MBH26
M3QQQ-CNM78-QDDGG-KKGWC-76DGT
YRW3B-HNX2G-T469W-V2YPQ-7T9TT
TQJKB-YNHCD-G32CW-PTC8D-QRR9G
NKJFK-GPHP7-G8C3J-P6JXR-HQRJR
VK7JG-NPHTM-C97JM-9MPGT-3V66T
PBHCJ-Q2NYD-2PX34-T2TD6-233PK
W269N-WFGWX-YVC9B-4J6C9-T83GX

Function Keys

Function Keys

ConstanteAtalho no Teclado
VK_F1F1
VK_F2F2
VK_F3F3
VK_F4F4
VK_F5F5
VK_F6F6
VK_F7F7
VK_F8F8
VK_F9F9
VK_F10F10
VK_F11F11
VK_F12F12

Control Keys

ConstanteAtalho no Teclado
K_CTRL_ACtrl-A, Home
K_CTRL_BCtrl-B, Ctrl-Right arrow
K_CTRL_CCtrl-C, PgDn, Ctrl-ScrollLock
K_CTRL_DCtrl-D, Right arrow
K_CTRL_ECtrl-E, Up arrow
K_CTRL_FCtrl-F, End
K_CTRL_GCtrl-G, Del
K_CTRL_HCtrl-H, Backspace
K_CTRL_ICtrl-I, Tab
K_CTRL_JCtrl-J
K_CTRL_KCtrl-K
K_CTRL_LCtrl-L
K_CTRL_MCtrl-M, Return
K_CTRL_NCtrl-N
K_CTRL_OCtrl-O
K_CTRL_PCtrl-P
K_CTRL_QCtrl-Q
K_CTRL_RCtrl-R, PgUp
K_CTRL_SCtrl-S, Left arrow
K_CTRL_TCtrl-T
K_CTRL_UCtrl-U
K_CTRL_VCtrl-V, Ins
K_CTRL_WCtrl-W, Ctrl-End
K_CTRL_XCtrl-X, Down arrow
K_CTRL_YCtrl-Y
K_CTRL_ZCtrl-Z, Ctrl-Left arrow
K_CTRL_1Ctrl-1
K_CTRL_2Ctrl-2
K_CTRL_3Ctrl-3
K_CTRL_4Ctrl-4
K_CTRL_5Ctrl-5
K_CTRL_6Ctrl-6
K_CTRL_7Ctrl-7
K_CTRL_8Ctrl-8
K_CTRL_9Ctrl-9
K_CTRL_0Ctrl-0
K_CTRL_UNDERSCORECtrl-UNDERSCORE
K_CTRL_EQUALCtrl-EQUAL
K_CTRL_KEYPAD_1Ctrl-Keypad_0
K_CTRL_KEYPAD_2Ctrl-Keypad_1
K_CTRL_KEYPAD_3Ctrl-Keypad_2
K_CTRL_KEYPAD_4Ctrl-Keypad_3
K_CTRL_KEYPAD_5Ctrl-Keypad_4
K_CTRL_KEYPAD_6Ctrl-Keypad_5
K_CTRL_KEYPAD_7Ctrl-Keypad_7
K_CTRL_KEYPAD_8Ctrl-Keypad_8
K_CTRL_KEYPAD_9Ctrl-Keypad_9
K_CTRL_KEYPAD_0Ctrl-Keypad_0
K_CTRL_LEFTCtrl-LEFT
K_CTRL_UPCtrl-UP
K_CTRL_RIGHTCtrl-RIGHT
K_CTRL_DOWNCtrl-DOWN
K_CTRL_KEYPAD_LEFTCtrl-Keypad_LEFT
K_CTRL_KEYPAD_UPCtrl-Keypad_UP
K_CTRL_KEYPAD_RIGHTCtrl-Keypad_RIGHT
K_CTRL_KEYPAD_DOWNCtrl-Keypad_DOWN

Alt Keys

ConstanteAtalho no Teclado
K_ALT_AAlt-A
K_ALT_BAlt-B
K_ALT_CAlt-C
K_ALT_DAlt-D
K_ALT_EAlt-E
K_ALT_FAlt-F
K_ALT_GAlt-G
K_ALT_HAlt-H
K_ALT_IAlt-I
K_ALT_JAlt-J
K_ALT_KAlt-K
K_ALT_LAlt-L
K_ALT_MAlt-M
K_ALT_NAlt-N
K_ALT_OAlt-O
K_ALT_PAlt-P
K_ALT_QAlt-Q
K_ALT_RAlt-R
K_ALT_SAlt-S
K_ALT_TAlt-T
K_ALT_UAlt-U
K_ALT_VAlt-V
K_ALT_WAlt-W
K_ALT_XAlt-X
K_ALT_YAlt-Y
K_ALT_ZAlt-Z

Control Function Keys

ConstanteAtalho no Teclado
K_CTRL_F1Ctrl-F1
K_CTRL_F2Ctrl-F2
K_CTRL_F3Ctrl-F3
K_CTRL_F4Ctrl-F4
K_CTRL_F5Ctrl-F5
K_CTRL_F6Ctrl-F6
K_CTRL_F7Ctrl-F7
K_CTRL_F8Ctrl-F8
K_CTRL_F9Ctrl-F9
K_CTRL_F10Ctrl-F10
K_CTRL_F11Ctrl-F11
K_CTRL_F12Ctrl-F12

Alt Function Keys

ConstanteAtalho no Teclado
K_ALT_F1Alt-F1
K_ALT_F2Alt-F2
K_ALT_F3Alt-F3
K_ALT_F4Alt-F4
K_ALT_F5Alt-F5
K_ALT_F6Alt-F6
K_ALT_F7Alt-F7
K_ALT_F8Alt-F8
K_ALT_F9Alt-F9
K_ALT_F10Alt-F10
K_ALT_F11Alt-F11
K_ALT_F12Alt-F12

Shift Function Keys

ConstanteAtalho no Teclado
K_SH_F1Shift-F1
K_SH_F2Shift-F2
K_SH_F3Shift-F3
K_SH_F4Shift-F4
K_SH_F5Shift-F5
K_SH_F6Shift-F6
K_SH_F7Shift-F7
K_SH_F8Shift-F8
K_SH_F9Shift-F9
K_SH_F10Shift-F10
K_SH_F11Shift-F11
K_SH_F12Shift-F12

VTKeyBoard teclas

 Inkey Codes
------------------------------------------------------------------------------

 Cursor Movement Keys                        | Editing Keys
---------------------------------------------+--------------------------------
 Uparrow, Ctrl-E             5  K_UP         | Del, Ctrl-G        7  K_DEL
 Dnarrow, Ctrl-X            24  K_DOWN       | Tab, Ctrl-I        9  K_TAB
 Leftarrow, Ctrl-S          19  K_LEFT       | Shift-Tab        271  K_SH_TAB
 Rightarrow, Ctrl-D          4  K_RIGHT      | Ins, Ctrl-V       22  K_INS
 Home, Ctrl-A                1  K_HOME       | Backspace, Ctrl-H  8  K_BS
 End,  Ctrl-F                6  K_END        | Ctrl-Backspace   127  K_CTRL_BS
 PgUp, Ctrl-R               18  K_PGUP       |-----------------------------------
 PgDn, Ctrl-C                3  K_PGDN       | Function Keys
 Ctrl-Leftarrow, Ctrl-Z     26  K_CTRL_LEFT  |----------------------------------
 Ctrl-Rightarrow, Ctrl-B     2  K_CTRL_RIGHT | F1, Ctrl-\        28  K_F1
 Ctrl-Home, Ctrl-]          29  K_CTRL_HOME  | F2                -1  K_F2
 Ctrl-End, Ctrl-W           23  K_CTRL_END   | F3                -2  K_F3
 Ctrl-PgUp, Ctrl-Hyphen     31  K_CTRL_PGUP  | F4                -3  K_F4
 Ctrl-PgDn, Ctrl-^          30  K_CTRL_PGDN  | F5                -4  K_F5
 Ctrl-Return                10  K_CTRL_RET   | F6                -5  K_F6
 Ctrl-ScrollLock             3  K_CTRL_C     | F7                -6  K_F7
 Esc, Ctrl-[                27  K_ESC        | F8                -7  K_F8
 Return, Ctrl-M             13  K_RETURN     | F9                -8  K_F9
 Enter, Ctrl-M              13  K_ENTER      | F10               -9  K_F10
-------------------------------------------------------------------------------
 Alt and Ctrl Keys
-------------------------------------------------------------------------------
 Alt-A  286 K_ALT_A| Alt-N 305 K_ALT_N| Ctrl-A  1 K_CTRL_A| Ctrl-N 14 K_CTRL_N
 Alt-B  304 K_ALT_B| Alt-O 280 K_ALT_O| Ctrl-B  2 K_CTRL_B| Ctrl-O 15 K_CTRL_O
 Alt-C  302 K_ALT_C| Alt-P 281 K_ALT_P| Ctrl-C  3 K_CTRL_C| Ctrl-P 16 K_CTRL_P
 Alt-D  288 K_ALT_D| Alt-Q 272 K_ALT_Q| Ctrl-D  4 K_CTRL_D| Ctrl-Q 17 K_CTRL_Q
 Alt-E  274 K_ALT_E| Alt-R 275 K_ALT_R| Ctrl-E  5 K_CTRL_E| Ctrl-R 18 K_CTRL_R
 Alt-F  289 K_ALT_F| Alt-S 287 K_ALT_S| Ctrl-F  6 K_CTRL_F| Ctrl-S 19 K_CTRL_S
 Alt-G  290 K_ALT_G| Alt-T 276 K_ALT_T| Ctrl-G  7 K_CTRL_G| Ctrl-T 20 K_CTRL_T
 Alt-H  291 K_ALT_H| Alt-U 278 K_ALT_U| Ctrl-H  8 K_CTRL_H| Ctrl-U 21 K_CTRL_U
 Alt-I  279 K_ALT_I| Alt-V 303 K_ALT_V| Ctrl-I  9 K_CTRL_I| Ctrl-V 22 K_CTRL_V
 Alt-J  292 K_ALT_J| Alt-W 273 K_ALT_W| Ctrl-J 10 K_CTRL_J| Ctrl-W 23 K_CTRL_W
 Alt-K  293 K_ALT_K| Alt-X 301 K_ALT_X| Ctrl-K 11 K_CTRL_K| Ctrl-X 24 K_Ctrl_X
 Alt-L  294 K_ALT_L| Alt-Y 277 K_ALT_Y| Ctrl-L 12 K_CTRL_L| Ctrl-Y 25 K_Ctrl_Y
 Alt-M  306 K_ALT_M| Alt-Z 300 K_ALT_Z| Ctrl-M 13 K_CTRL_M| Ctrl-Z 26 K_CTRL_Z
-------------------------------------------------------------------------------
 Shift, Alt, and Ctrl-Function Keys
-------------------------------------------------------------------------------
 Shift-F1   -10  K_SH_F1  | Ctrl-F1   -20  K_CTRL_F1  | Alt-F1   -30 K_ALT_F1
 Shift-F2   -11  K_SH_F2  | Ctrl-F2   -21  K_CTRL_F2  | Alt-F2   -31 K_ALT_F2
 Shift-F3   -12  K_SH_F3  | Ctrl-F3   -22  K_CTRL_F3  | Alt-F3   -32 K_ALT_F3
 Shift-F4   -13  K_SH_F4  | Ctrl-F4   -23  K_CTRL_F4  | Alt-F4   -33 K_ALT_F4
 Shift-F5   -14  K_SH_F5  | Ctrl-F5   -24  K_CTRL_F5  | Alt-F5   -34 K_ALT_F5
 Shift-F6   -15  K_SH_F6  | Ctrl-F6   -25  K_CTRL_F6  | Alt-F6   -35 K_ALT_F6
 Shift-F7   -16  K_SH_F7  | Ctrl-F7   -26  K_CTRL_F7  | Alt-F7   -36 K_ALT_F7
 Shift-F8   -17  K_SH_F8  | Ctrl-F8   -27  K_CTRL_F8  | Alt-F8   -37 K_ALT_F8
 Shift-F9   -18  K_SH_F9  | Ctrl-F9   -28  K_CTRL_F9  | Alt-F9   -38 K_ALT_F9
 Shift-F10  -19  K_SH_F10 | Ctrl-F10  -29  K_CTRL_F10 | Alt-F10  -39 K_ALT_F10

programArguments [“2″,”1”]

{
	"version": "0.2.0",
	"configurations": [
		{
			"type": "totvs_language_debug",
			"request": "launch",
			"name": "U_xFunDebug",
			"program": "U_xFunDebug",
			"smartclientBin": "C:/TOTVS/smartclient12/smartclient.exe",
			"isMultiSession": true,
			"enableTableSync": true,
			"programArguments": ["2","1"],
			"enableMultiThread": true,
			"enableProfile": false,
			"isAccessibilityMode": false,
			"doNotShowSplash": false,
			"language": "",
			"ignoreFiles": true
		}
	],
	"lastProgramExecuted": "U_xFunDebug"
}

SX3_VIRADA.dtc

Quando se grava alterações de campos no configurador o Protheus salva os dados na pasta “cfglog” dentro da protheus_data.

Copie o arquivo gerado no momento da edição e salve na pasta “system”.

Agora renomei o arquivo para SX3_VIRADA.dtc.

Para criar o campo no dicionario oficial acesse ativo/cadastro/lancamento padrao/ inclusao/entidades e rode o u_rel011()

MARS=1 Multiple Active Result Sets

Adicionar à TAG
[MSSQL]
MARS=1

O suporte ao MARS (Multiple Active Result Sets) está disponível a partir do SQL Native Client.
Esse recurso é necessário para a redução da quantidade de novas conexões abertas a cada nova query submetida pela aplicação.
Diante do exposto não utilize o SQL Server ODBC Driver.
Utilize o SQL Native Client ao criar uma fonte de dados ODBC para acesso ao Microsoft SQL Server.

Lembrando que deve-se comparar a DBapi.DLL do Appserver / DBacess e replicar o mais atualizado e copiá-lo nas duas pastas.

Programa que cria serviço no windows

Executando aplicativos como serviço no Windows

Neste post iremos criar um novo serviço no Windows, assim toda vez que iniciar o Windows esse serviço será inicializado automaticamente.

Para criar o serviço no Windows, utilizaremos uma aplicação simples chamada de NSSM (Non-Sucking Service Manager).

Configuração utilizada:

  • Versão do Windows Utilizada: Windows 8.1 Pro e Windows Server 2012 R2 Standard
  • Versão do NSSM utilizado: nssm 2.24 (2014-08-31)

Baixando o NSSM

Para fazer o download acesse o site: https://nssm.cc/download , será baixado um arquivo “nssm-2.24.zip”, descompacte para uma pasta de sua preferência.

Vá até o diretório descompactado e acesse a pasta win64 ou win32 dependendo da sua versão do Windows, pelo Prompt de comando na pasta execute o seguinte comando “nssm.exe”, a saída deve ser parecida com a figura abaixo:

Criando um novo Serviço

Ainda na pasta win64 ou win32 execute o seguinte comando para criar um novo serviço “nssm install NomeDoServico”.

Após criado o serviço no prompt será apresentado a seguinte tela:

Configurando um Novo Serviço

Vamos dar uma breve explicação das configurações:

  • Path: Local da aplicação que será executada;
  • Startup directory: Local onde a aplicação será inicializada;
  • Arguments: Usado para especificar qualquer argumento de linha de comando para passar para o aplicativo;

Clique em “install service” para finalizarmos a criação do nosso serviço.

Para verificar se o serviço foi criado acesse os serviços do Windows e inicie-o. Veja a figura abaixo:

Pronto! Criamos nosso serviço!

Dica! Para criar logs para o serviço e descobrir possíveis problemas em sua execução, utilize a aba I/O conforme imagem abaixo:

BR6TgJt.png

Meu IP público html

Crie um arquivo com o nome meuip.html abra no notepad++ ou notepad copie e cole o código abaixo e salve.

Agora basta abrir em qualquer navegador

<HTML>
	<HEAD>
		<TITLE>Cleiton Genuino da Silva</TITLE>
		<script language="javascript">
				function Informacao()
				{
				/* Informações do Cliente - Copyleft (2009) - Cleiton Genuino da Silva

				tubas007@gmail.com

				Você pode distribuir, utilizar e alterar livremente estas rotinas desde
				que mantenha este comentário que identifica o autor original.
				*/
				var so;
				var plataforma = navigator.platform;
				var browser=navigator.appName
				var b_version=navigator.appVersion;
				var version=parseFloat(b_version);
				if(navigator.userAgent.indexOf('Linux') != -1)
				so = "Linux";
				else if((navigator.userAgent.indexOf('Win')!= -1)&&(navigator.userAgent.indexOf('95')!= -1))
				so = "Windows 95";
				else if((navigator.userAgent.indexOf('Win')!= -1)&&(navigator.userAgent.indexOf('98')!= -1))
				so = "Windows 98";
				else if((navigator.userAgent.indexOf('Win')!= -1)&&(navigator.userAgent.indexOf('NT')!= -1))
				so = "Windows NT/XP";
				else if((navigator.userAgent.indexOf('Win')!=-1)&&(navigator.userAgent.indexOf('2000')!=-1))
				so = "Windows 2000";
				else if(navigator.userAgent.indexOf('Mac') != -1)
				so = "Macintosh";
				else if(navigator.userAgent.toLowerCase().indexOf('unix') != -1)
				so = "Unix";
				else
				{ so = "Outro";}
				alert('So = '+so+'\nPlataforma = '+plataforma+'\n Browser = '+browser+'\nVersão = '+version)
				}
		</script>
	</HEAD>
	<BODY OnLoad="Informacao()">
	</BODY>
</HTML> 

Como postar código fonte no wordpress

Este é o meu primeiro post neste blog que tem como objetivo auxiliar os desenvolvedores menos experientes a resolver coisas simples, que por muitas vezes de tão simples, tornam-se complicadas… Se você está aqui, é porque sabe bem do que eu estou falando hehehe.

Bom, vamos lá.

O primeiro assunto deste blog será sobre uma pequena dúvida que tive ao criar o blog (sim, é meu primeiro blog ‘-‘ ): como eu posto o meu código fonte no wordpress?! Pode ser uma informação fácil de achar, até mesmo no próprio suporte do wordpress, de onde pesquisei sobre o assunto. Mas estou disponibilizando isso aqui para vocês, pois não encontrei a versão em português deste artigo do suporte.

Ao ver que a toolbar de edição de conteúdo não continha alguma marcação do tipo “code”, eu pensei em postar imagens dos códigos. Seria uma boa opção, pois forçaria os leitores a digitarem o código na mão caso desejassem usá-lo como exemplo. Mas eu também já precisei muito de exemplos, e sei como é chato as vezes ter de re-escrever o código todo ><”

Toolbar wordpress

Toolbar de edição de conteúdo do wordpress

Então fui atrás disso, e aqui está:

wordpress não permite que você faça upload do seu código fonte, pois isso pode apresentar perigo de várias formas (posteriormente posso escrever sobre isso, mas recomendo uma pesquisa sobre script injection), então a maneira que encontraram foi permitir que você escreva o seu código fonte dentro de um marcador sourcecode. Assim, o conteúdo que está entre o marcador é tratado de uma forma que não apresente perigo, pois o user agent (Interface com o usuário, um browser por exemplo.) não irá interpretá-lo como um código fonte.

Veja como é muito fácil, basta colocar seu código entre os seguintes marcadores:

[sourcecode language=”<a linguagem que você quer>“]

O seu código fonte aqui

[/sourcecode]

Um exemplo de código em java:

1public static void main(String[] args){}

Caso você não defina a linguagem a ser utilizada, o conteúdo entre os marcadores será exibido em forma de texto simples sem formatação.

Agora alguns parâmetros opcionais para utilizar dentro do marcador:

autolinks: Pode assumir os valores true e false. Quando true, torna todos os links que estiverem no seu código fonte, clicáveis. (Como default, essa opção já vem como true.)

collapse: Pode assumir os valores true e false. Quando true, faz com que a caixa que contém o seu código fonte seja carregada “compactada”, exibindo somente parte de todo o código. Quando o visitante clica na caixa, ela se expande, e todo o código fonte é exibido. (Como default, essa opção já vem como false.)

firstline: Recebe um valor numérico. Define qual será o número da primeira linha de código. (O valor padrão é 1)

gutter: Pode assumir os valores true e false. Quando true, o número da linha do código fonte é exibido. (Como default, essa opção já vem como true.)

highlight: Recebe uma lista de números separados por vírgulas, ex. “2,10,50,30”. Destaca linhas de código.

htmlscript: Pode assumir os valores true e false e só funciona com certas linguagensQuando true, todo o código html/xml ficarão destacados. É muito útil quando temos HTML misturado com scriptlets de java, php ou qualquer outra linguagem.

light: Pode assumir os valores true e false. Caso true, a toolbar e o número da linha serão ocultadas. Bom para quando o seu código fonte possui poucas linhas de código, deixando a caixa de código fonte mais limpa.

padlinenumbers: Pode assumir os valores truefalse e integer. Permite controlar o número de dígitos do número da linha de código. Caso true, o controle será automático, ex. 01, 02, 03. Caso false, o controle será desabilitado, ex. 1,2,3. Caso um número seja utilizado, serão utilizados os números de dígitos correspondentes. Ex. número 4, resultará em algo como isso: 0001.

toolbar: Pode assumir os valores true e false. Caso true, exibe opções (copiar, imprimir, etc.) quando o visitante posiciona o ponteiro do mouse em cima da caixa onde está o código fonte. (Como default, essa opção já vem como true.)

wraplines: Pode assumir os valores true e false. Caso false, a quebra de linha automática será desabilitada, fazendo com que apareça a barra de rolagem horizontal nas linhas de conteúdo muito extenso.

Essa marcação possui estilos de código para as seguintes linguagens:

  • ActionScript3
  • clojure
  • coldfusion
  • cpp
  • csharp
  • css
  • delphi
  • erlang
  • fsharp
  • diff
  • groovy
  • html
  • javascript
  • java
  • javafx
  • matlab (keywords only)
  • objc
  • perl
  • php
  • text
  • powershell
  • python
  • r
  • ruby
  • scala
  • sql
  • vb
  • xml

Bom, agora que você já sabe como adicionar código fonte formatado ao seu post, faça bom proveito!

PID: 4 usando a porta 80

PID: 4 usando a porta 80

Eu estava tentando instalar o Zend Server CE no meu computador, mas quando cheguei ao ponto em que eu precisava escolher a porta para o meu servidor Web, ele diz: “Web Server Port: 80 Occupied”. Então eu decidi verificar o que está usando a porta 80 com o CMD digitando: “netstat -o -n -a | findstr 0.0: 80”:

TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4

Eu verifico PID: 4 em Processos e Serviços do Gerenciador de Tarefas. Parece PID 4 é “Sistema”.

Então, o que eu quero saber é como posso parar “System” (PID: 4) de usar a porta 80?

INFO: Eu estou usando: Windows 7 64bit; Zend Server CE 5.5.0
windowsportwebserverpid
50
30 de out de 2011apokaliptis

Ok, depois de pesquisar na web por um tempo, encontrei uma solução para o meu problema.

Basta seguir estas etapas para diagnosticar e resolver seu problema:

Obtenha o pid que está escutando a porta 80: netstat -nao | find “:80”

Abra o gerenciador de tarefas, vá para a aba de processos e marque “PID” em Menu/View/Select Columns…, então procure o processo usando o PID encontrado na última etapa.

Se for um aplicativo normal ou IIS, desative-o ou desinstale-o. Alguns programas (como o Skype) têm a opção de desabilitar o uso da porta 80.

Se é um Processo do sistema – PID 4-você precisa desativar o driver HTTP.sys que é iniciado a pedido de outro serviço, como o Windows Remote Management ou spooler de impressão no Windows 7 ou 2008.

Existem duas maneiras de desativá-lo, mas a primeira é mais segura:

1.

Ir para o gerenciador de dispositivos, selecione “Mostrar dispositivos ocultos” no menu/vista, vá para “não-Plug and Play Driver”/HTTP, clique duas vezes para desativá-lo (ou defini-lo como manual, alguns serviços dependesse disso).

Reinicie e use netstat -nao | find “:80” para verificar se 80 ainda está sendo usado.

2.

Inicie o RegEdit.

Vá para HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP

Altere o valor de “start” para 4, o que significa desativado.

Reinicie o computador.

Minha solução foi o passo 4 .

Degubar SIGAACD Protheus – debug coletor de dados

Simulador de Coletor de Dados para módulo SIGAACD – Protheus

AVTMONITOR Totvs disponibiliza programas para que a implementação seja feita sem a necessidade de um Coletor de Dados fisicamente falando.

VTDEBUG – Programa para Simular/Debugar Rotinas para Coletor de Dados(ACD)

*Basta executar o comando VTDEBUG nos parâmetros iniciais do protheus:

Após isso abrirá a tela com o Simulador do Coletor de Dados:

VTMONITOR – Programa para monitorar os Usuários/Rotinas que estão conectados via Coletor de Dados.

Podemos simular um coletor de dados ativando a seção [Telnet] no arquivo appserver.ini.

[Telnet]
Enable=1
Main=u_coletaloja
Port=23
Environment=Environment

Entrar no prompt do S.O. e digitar o comando: Telnet ipdoserver e irá acessar o módulo SIGAACD.

Obs: Isso é possivel pois a comunicação entre o ERP e o Coletor é feita através do protocolo VT100 que por sua vez é o protocolo do Telnet.

Exemplo de um fonte:
#INCLUDE “sigaacd.ch”
#include “protheus.ch”
#include “apvt100.ch”

User Function ColetaLoja()
Local aUser
Local dGetData := MsDate()
Local tRealIni := Time()
Local aEmprx := {}
Local aEmpChoice := Array(2)
Local cTmp
Local nPos
Local cArqMenu
Local nMaxRow := Val(GetPvProfString( “TELNET”, “MAXROW” , “8” , GetADV97()))
Local nMaxCol := Val(GetPvProfString( “TELNET”, “MAXCOL” , “20”, GetADV97()))

MsApp():New(‘ColetaLoja’,.T.)
oApp:cInternet := NIL
oApp:lIsBlind := .T.
oApp:CreateEnv()

//seta tamanho da tela (linha X coluna)
VTSetSize(nMaxRow,nMaxCol)
TerProtocolo(“VT100”)
SetsDefault()
VTAlert(“Coleta de”+chr(13)+chr(10)+; //’Automacao de’
“Produtos”+chr(13)+chr(10)+; //’Coleta de Dados’
chr(13)+chr(10)+;
STR0004,’ColetaLoja’,.T.) //’Pressione <ENTER>’

//verifica se o arquivo de empresas existe
If !File(cArqEmp)
Final(STR0005,STR0006) //”Instale”###”Configurador”
EndIf

//verifica se o arquivo senhas exite
If !File(“SIGAADV.PSS”)
Final(STR0005,STR0006) //”Instale”###”Configurador”
EndIf

PtInternal(1,STR0008) //”Coletor RF”

//login
aUser := VTGetSenha(@dGetData,tRealIni)
aEmprx := Aclone(aUser[2][6])

//lista empresas
aEmpChoice := VTNewEmpr(@aEmprx)

dDataBase := dGetData

//acerta variaveis globais com informacoes do usuario
aEmpresas := Aclone(aUser[2][6])
__RELDIR := Trim(aUser[2][3])
__DRIVER := AllTrim(aUser[2][4])
__IDIOMA := aUser[2][2]
__GRPUSER := “”
__VLDUSER := aUser[1][6]
__ALTPSW := aUser[1][8]
__CUSERID := aUser[1][1]
__NUSERACS := aUser[1][15]
__AIMPRESS := {aUser[2][8],aUser[2][9],aUser[2][10],aUser[2][12]}
__LDIRACS := aUser[2][13]
cAcesso := Subs(cUsuario,22,512)
If __CUSERID #”000000″
nPos := Ascan(aUser[3],{|x| Left(x,2)==”46″})
If Empty(nPos)
Final(STR0009,STR0010) //”Acesso”###”Modulo nao encontrado”
EndIf
If Subs(aUser[3,nPos],3,1) ==”X”
Final(STR0009,STR0011) //”Acesso”###”Modulo nao autorizado”
EndIf
cArqMenu := Alltrim(Subs(aUser[3,nPos],4))
cArqMenu := Left(cArqMenu,len(cArqMenu)-4)
cArqMnu := cArqMenu+RetExtMnu()
VTAlert(cArqMnu,”Peonto”,.T.)
VTAlert(Left(cArqMenu,len(cArqMenu)-4),”Alert”,.T.)

Else
cArqMnu := “SIGAACD”+RetExtMnu()
VTAlert(cArqMnu,”Pronto”,.T.)
Endif
//cNivel := aUsuario[2]

VTCLEAR
PtInternal(1,STR0012+cEmpAnt+”/”+cFIlAnt+STR0013+Subs(cUsuario,7,15)+STR0014) //”Emp :”###” Logged :”###” Equip:Coletor RF”

//gerenciamento do menu
VTDefKey()
VTMontaMenu(cArqMnu)

Final(STR0007) //”Termino Normal”
Return

VTDEBUG

VT100_ATIVAR

VT100_LOGIN

OBS: Cuidado com caráter especial na senha, tente utilizar somente números.

Ponto de entrada – CBRETEAN – SIGAACD Protheus

P.E. CBRETEAN executado após o Enter na tela de conferencia física no coletor (ACDV120).

Entrada tipo: EAN via coletor
Retorno tipo: Array PARAMIXB

aRet “{código do produto,quantidade,lote,data de validade, numero de série}”

Para pegar os dados digitados e efetuar uma busca via Dbseek na SD1 e verificar se o produto tem lote e preencher o array de retorno, ele trás um array PARAMIXB

Consumindo APIs em ADVPL

#include "PROTHEUS.ch"
/*/{Protheus.doc} API0001
(Consome api de testes via ADVPL httpget)
@type user Function
@author Cleiton Genuino da Silva
@since date 13-08-2018
@version version 12-1-17
@param cUrl , Caracter , Url que contém o serviço da ser consumido
@param cGetParms , Caracter , Parametros da aplicação
@param nTimeOut , Numerico , Timeout da requisição http com a API a ser consumida
@param aHeadStr , Array , Array de dados a passado no cabeçalho da requisição
@param cHeaderGet , Caracter , Cabeçalho da requisição
@return cRetorno , Caracter , Retorno em caracter da api consumida
@example
(examples)
@see (http://tdn.totvs.com/display/tec/HTTPGet)
@see (http://tdn.totvs.com/display/tec/ProtheusDOC)
@see (http://tdn.totvs.com/display/PROT/FWJsonDeserialize+-+Deserializa+uma+string+no+formato+JSON)
/*/
User Function API0001()
local cUrl := "http://numbersapi.com/random/trivia"
local cGetParms := ""
local nTimeOut := 200
local aHeadStr := {"Content-Type: application/json"}
local cHeaderGet := ""
local cRetorno := ""
local oObjJson := nil
cRetorno := HttpGet( cUrl , cGetParms, nTimeOut, aHeadStr, @cHeaderGet )
If !FWJsonDeserialize(cRetorno,@oObjJson)
MsgStop("Ocorreu erro no processamento do Json")
Returnnil
endif
Msginfo( "O valor " + oObjJson:type + " para o numero " + Alltrim(Str(oObjJson:number)) + " equivale: " + oObjJson:text )
Return nil

startdebug

#INCLUDE “PROTHEUS.CH”

user function startdebug()

Local cIdEnt := ‘000003’
Local nIDJob := 4 //4 – e-Mail
Local cWFModelo :=’55’ //’ALL’
local cLock := “_debug_job”
local aLock := {}
local aEntSkip := {}

aadd( aLock, { cIdent, cLock, 0 } )
aEntSkip := StrTokArr(GetSrvProfString(“NFESPED_WFENT_SKIPRANGE”,””),”-“)

//GetURLCol(cAmbiente,cTipoWS)
//SPEDWF()
SpedWfNfe(cIdent,nIDJob,cWFModelo,aLock,aEntSkip)

Return()

Base de dados fica Status de Restaurando

Base de dados fica Status de Restaurando
SQL Server > Gerenciamento, Configuração, Instalação, e Segurança

Restore de base de dados;

Criei o arquivo .bak de uma base que usamos como modelo para ser restaurada na base de teste. Selecionei a base de teste, dei um restaurar> Banco de dados e selecionei o arquivo .bak que criei da base modelo. Agora a minha base de dados teste esta como single user e nao abre para eu poder mudar, e a base modelo esta com status (Restaurando…). Isso já vai fazer umas 12 horas.

Se você selecionou a opção NORECOVERY durante o seu restore FULL, basta executar o comando abaixo para mudar o status de restoring para online.

restore database NOME_BASE with RECOVERY

Treinamento DBA ONLINE:

http://www.fabriciolima.net/blog/cursos-online/treinamento-tarefas-do-dia-a-dia-de-um-dba-online/

Faz assim….

restore database [Nomedobanco]

from disk = ‘c:\backup\backup.bak’

with replace, recovery.

Para voce entender a diferença entre recovery e norecovery segue um link.

http://blog.sqlauthority.com/2009/07/15/sql-server-restore-sequence-and-understanding-norecovery-and-recovery/

RPM – RPM Package Manager: O Instalador de Pacotes

RPM – RPM Package Manager: O Instalador de Pacotes

O RPM (RPM Package Manager) é um Gerenciador de Pacotes para Linux capaz de instalar, remover e atualizar os arquivos de pacotes nele instalados. No Linux, os softwares são instalados através de ‘pacotes’. Os pacotes são arquivos em cujo interior há softwares inteiros, prontos para serem instalados e executados.

Os pacotes RPMs têm nomes que obedecem o formato –..rpm. Um exemplo típico seria o pacote que permite conexões ADSL via PPPoE: rp-pppoe-3.5-1.i386.rpm. Aqui, rp-pppoe é o nome do pacote propriamente dito, 3.5 é a versão do software e 1 é o número do release, i386 é a plataforma que, neste caso, indica que o software em questão é compátivel com os chips Intel 386 e posteriores.

A instalação de um pacote como este pode ser feita da seguinte forma:

rpm -ivh rp-pppoe-3.5-1.i386.rpm

O comando acima gerará uma saída semelhante a esta:

Preparing ########################### [100%]
1: rp-pppoe ########################### [100%]

O texto acima indica que o pacote foi instalado, sem erros ou problemas. Os parâmetros -ivh indicam, respectivamente INSTALL (para instalar o pacote), VERBOSE (para mostrar as mensagens informativas sobre o quê está sendo feito) e HASH (responsável pela exibição dos sinais de sustinido – ou escopo, ou cerquilha, se preferir – apresentados durante o progresso da instalação).

Parâmetros da Linha de Comando

Ao comando RPM podemos passar os seguintes parâmetros:
-i Install: instala o pacote
-F Freshen: instala pacote apenas se uma
versão prévia do pacote já
existir
-v Verbose: mostra mensagens explicativas na
tela
-U Upgrade: atualiza um pacote
-h Hash: mostra o progresso da instalação
-q Query: consulta se um pacote já está
instalado
-qa Query -All: mostra todos os pacotes
instalados
-qf Query -File: consulta o pacote do qual o
arquivo faz parte
-qp Query -Package: consulta um pacote não
instalado
-qi Query -Info: apresenta informações
detalhadas sobre o pacote.
-ql Query -List: lista os arquivos pertencentes
ao pacote
-qd Query -Doc: apresenta uma lista dos
arquivos de documentação do pacote,
como READMEs, páginas de manual (MAN),
etc.
-qc Query -Config: apresenta uma lista dos
arquivos de configuração.
-V Verify: compara arquivos instalados com
informações disponíveis na base
de dados RPM. Compara permissões,
proprietário, tamanho e outras
informações de cada arquivo.
–force força a instalação de um pacote,
sobrescrevendo arquivos e pacotes de
mesmo nome já instalados
–nodeps No Dependencies: não verifica se há dependências de arquivos antes de instalar um pacote(leia sobre DEPENDÊNCIAS adiante).
-e Erase: remove um pacote instalado
–nobuild No Building: não instala o pacote em
questão; apenas realiza uma verificação
e reporta eventuais conflitos.

Exemplos e Observações

1 – Para verificar se um pacote chamado RP-PPPOE está instalado:

rpm -q rp-pppoe

A resposta a este comando será o nome do pacote instalado (se ele estiver instalado); algo como: rp-ppoe-3.5-1.

2- Para verificar todos os pacotes instalados no sistema:

rpm -qa

3- Para exibir informações do pacote, tais como release, tamanho, etc:

rpm -qi rp-pppoe

O resultado mostrado será semelhante a:
Name : rp-pppoe Relocations: (not relocateable) Version : 3.5
Vendor: Roaring Penguin Software Inc. Release : 1
Build Date: Mon Jul 8 11:38:57 2002
Install date: Sat Jul 20 00:32:49 2002
Build Host: shishi.roaringpenguin.com
Group : System Environment/Daemons
Source RPM: rp-pppoe-3.5-1.src.rpm
Size : 189958 License: GPL Packager : David F. Skoll
URL : http://www.roaringpenguin.com/pppoe/
Summary : PPP Over Ethernet (xDSL support)
Description : PPPoE (Point-to-Point Protocol over Ethernet) is a protocol used by many ADSL Internet Service Providers. Roaring Penguin has a free client for Linux systems to connect to PPPoE service providers. The client is a user-mode program and does not require any kernel modifications. It is fully compliant with RFC 2516, the official PPPoE specification.

4- Para conhecer os arquivos de configuração de um pacote:

rpm -qc rp-pppoe

O resultado deste comando será algo semelhante a:
/etc/ppp/firewall-masq
/etc/ppp/firewall-standalone
/etc/ppp/pppoe.conf
/etc/ppp/pppoe-server-options

No exemplo acima, pppoe.conf, pppoe-server-options e os demais arquivos mostrados são arquivos de configuração do pacote rp-pppoe.

5- Para atualizar um pacote:

rpm -Uvh

Se o que você estiver atualizando estiver numa versão mais antiga que a já instalada, uma mensagem de alerta irá surgir e a atualização não continuará. Para forçar a atualização mesmo assim, use este mesmo comando com o parâmetro –force: rpm -Uvh –force .

ATENÇÃO: ao invés de –force, também podem ser usados –oldpackage, –replacepkgs ou –replacefiles. O resultado final será o mesmo.

6- Para instalar um determinado pacote:

rpm -ivh

7- Para desinstalar um determinado pacote:

rpm -e

Eventualmente, como certos pacotes dependem uns dos outros, ao tentar desinstalar um pacote PACOTE1 poderá surgir uma mensagem de erro do tipo:

erro: a remoção deste pacote quebraria dependências: PACOTE1 é necessário para PACOTE2

Isso indica que o PACOTE2 precisa do PACOTE1 para funcionar corretamente. Se mesmo assim você quiser desinstalá-lo, use o parâmetro –nodeps. Assim:

rpm -e –nodeps

O comando acima impediria o erro de dependências. Mas é possível que, por depender do PACOTE1, o PACOTE2 não funcione mais corretamente após isto.

Erros Durante a Instalação de Pacotes

O processo de instalação foi desenvolvido para ser o mais simples possível. Porém, como pode-se perceber pelos exemplos acima, eventualmente alguns erros podem ocorrer, como o alerta de que o pacote que está sendo instalado é mais antigo do que o que já encontra-se no sistema, conflitos de arquivos, etc. Veja agora maiores informações sobre tais erros:

Pacotes já instalados: se o pacote já tiver sido instalado anteriormente, será apresentada a seguinte mensagem:

Preparing ############################# [100%]
Pacote já está instalado

Caso se deseje ignorar o erro, pode-se usar o parâmetro –force na linha de comando, fazendo com que o erro não seja mais mostrado e o pacote reinstalado.

Arquivos com conflitos: se o arquivo contém um arquivo já instalado por outro pacote, será apresentada a seguinte mensagem:

/usr/bin/ conflicts with file from
error: não pode ser instalado

Caso se deseje ignorar este erro, pode-se usar o parâmetro –replacefiles na linha de comando.

Dependências não resolvidas: os pacotes RPM podem depender da instalação prévia de outros pacotes, o que significa que eles necessitam daqueles para poderem ser executados adequadamente. Caso se deseje instalar um pacote que dependa de outro não localizado, será apresentada a seguinte mensagem:

Falha nas dependências:
foo é necessário para bar-1.0.1
Para corrigir este erro será necessário instalar o pacote solicitado.

Caso se deseje que a instalação ocorra de qualquer forma, pode-se utilizar o parâmetro –nodeps na linha de comando. Entretanto, provavelmente o pacote não
funcionará ou o fará de forma incorreta.

Atualização de Pacotes: Salvando Configurações Existentes

Para atualizar um pacote, utilize o comando a seguir:

rpm -Uvh

Uma mensagem informativa, semelhante a esta, surgirá:

Preparing… ######################### [100%]
1: : ######################### 1100%]

Ao atualizarmos um pacote já instalado, qualquer versão anterior do pacote será desinstalada e será feita uma nova instalação, guardando as configurações anteriores do programa para um possível uso caso o formato dos arquivos de configuração não tenha sido alterado.

Uma vez que o RPM executa um processo de atualização inteligente, é apresentada uma mensagem do tipo:

saving /etc/.conf as /etc/.conf.rpmsave

Isso significa que os arquivos de configuração existentes estão salvos. Esta é uma característica interessante, já que outros métodos de instalação de softwares (como os compactados com o tar e/ou gz) simplesmente não preservam as configurações originais.

Vale dizer, porém, que, mesmo instalando pacotes via RPM, algumas mudanças no programa a ser instalado / atualizado podem tornar esse arquivo de configuração não mais compatível com o pacote – embora isso não seja comum. Neste caso, as adequações necessárias deverão ser feitas pelo usuário.

Como o processo de atualização é uma combinação de processos de desinstalação e instalação, algumas mensagens de erro podem surgir, como por exemplo, ao se tentar atualizar um pacote com uma versão anterior à versão corrente, será apresentada a seguinte mensagem:

rpm -Uvh

Preparing … [100%]
O pacote -2.0.1 (o qual é mais novo que
-1.0.1) já está instalado.

Neste caso, para forçar a atualização, deve-se usar o parâmetro –oldpackage na
linha de comando (os parâmetros –force, –replacepkgs e –replacefiles também podem ser usados aqui).

Usando o comando TAR

x – Extrai arquivos
v – verbose, exibe o nome dos arquivos extraídos (um por um)
z – O formato do arquivo é “gzip” (tar.gz)
f – Use the following tar archive for the operation

tar -xvzf arquivo.tar.gz

Para extrair os arquivos, alterando seu destino; apenas especifique o parâmetro ‘C’:

tar -xvzf abc.tar.gz -C /home/linux10complica/

Como Criar um Pendrive bootavel pelo CMD

 

1º) Digite na barra de pesquisa do menu iniciar o comando CMD, depois clique com o botão direito sobre o icone em seguida clique em Executar como Administrador.

2º) Então você vai visualizar a tela preta do Prompt de Comando o CMD.

Clique para Criar um pendrive bootavel windows 7 no CMD

3º) Conecte o pen drive bootavel em uma das suas saídas USB e certifique-se que ele é o único pendrive conectado em seu PC, e certifique-se que você sabe qual é a capacidade total dele, ex. 4GB ou 8Gb, você também pode fazer este processo com um cartão de memória se preferir.

4º) Digite o seguintes comandos na sequencia:

  • Digite o Comando  ->diskpart
  • Depois digite –> list disk
    Digite o comando
    Digite o comando diskpart e depois disk list

     

  • Um destes discos é o seu pendrive bootavel, você deve identificar através do tamanho, tome cuidado para não fazer o procedimento em um outro disco.
  • No meu caso o meu pen drive é o Disco 5 (Você deve identificar exatamente qual é o seu)
    • Você pode descobrir exatamente qual é o seu pendrive, removendo o pen drive da USB, digitando o comando Disk list, então você anota todos os discos que não são o seu pendrive, logo depois você conecta o pendrive novamente e então digita novamente o comando disk list para identificar qual é o seu pendrive.
  • Depois de identificar qual é o seu pendrive, você deve seguir os seguintes comandos:
    • >  select disk 5   “Aqui é o disco referente ao seu Pen drive bootavel”
    • >  clean   “Este comando limpa as partições do seu pendrive”
    • >  create partition primary  ” Este comando cria uma partição primaria em seu pen drive”
    • >  select partition 1   ” Este comando seleciona a partição que foi criada no pendrive”
    • >  active   ” Este comando define como ativa a partição criada”
    • >  format fs=fat32  ” Este comando formata o seu pendrive bootavel com o sistema de arquivos fat32″
    • >  assign   ” Este comando monta o Pen drive de boot para você copiar os arquivos de instalação”
  • Prontinho! Seu pendrive já está formatado, agora você deve copiar todos os arquivos do DVD de instalação para o pen drive bootavel.

5º) Copie todos os arquivos de dentro do DVD de Instalação ou da imagem iso do Windows 7 para dentro do pen drive.

  • Para copiar os arquivos do DVD, basta você inserir o DVD no leitor, selecionar todos os arquivos de dentro do DVD pressionando CTRL+A
  • Depois você deve Copiar todos os arquivos selecionados pressionando CRTL+C
  • Depois você deve abrir o pen drive bootavel e pressionar CRTL+V
  • Aguardar o processo de copia de arquivos e utilizar seu pen drive bootavel!
    • Se você tem uma imagem ISO, siga estes passos.
    • Instale o programa WinRAR em seu computador.
    • Clique sobre o arquivo ISO com o Botão Direito e depois clique em Extrair Para…
    • No menu do WinRAR você deve escolher o pen drive bootavel
    • Depois clique em extrair.

6º) Prontinho, pode remover seu pen drive bootavel da saída USB e iniciar uma formatação, se você não sabe como dar boot com o Pen Drive de boot, então assista a continuação desta aula nos links abaixo.

Erro de autenticação no SoapUI na geração de client

  • Quando gerado erro de autenticação na geração do client direto da Receita no eSocial utilize as configurações em destaque no SoapUI

Preferences>SSL Settings

Preencher os seguintes campos:

SoapUI Preferences

  • KeyStore : caminho do arquivo .pfx
  • KeyStore Password: senha do certificado digital.
  • Client Authentication: marque a opção “requires client authentication”

bad interpreter

quinta-feira, 26 de julho de 2007
Resolvendo Problemas Comuns 2 – bad interpreter
Seguindo na nossa sessão de dicas, quem nunca passou por isso?

$ ./script.sh
: bad interpreter: No such file or directory

$ cat script.sh
#!/bin/bash
echo “oi”

– Hein? Mas está tudo certo, eu tenho um /bin/bash, o que está acontecendo?

Bom, vamos ver mais de perto:
$ cat -v script.sh # ‘show nonprinting’
#!/bin/bash^M
echo “oi”^M

Ahá! Tem um ^M no final das linhas atrapalhando.
– Mas o que é isso?
Muito provavelmente a origem desde script é uma maquina windows. A explicação é o caracter newline. O windows precisa de 2 caracteres para simbolizar o fim de uma linha em um arquivo texto puro, a dupla \r\n (veja link para a wikipedia), porém os *nix não precisam do \r — que o cat gentilmente mostrou como um ^M. Este caracter a mais atrapalha o interpretador, que não recebe um /bin/bash e sim /bin/bash\r — e isso realmente não existe.

Como resolver? Existem dois programas para este fim: unix2dos e dos2unix (as vezes aparecem como unixtodos e dostounix) que convertem os finais de linha em casos como este. Se vc abrir um arquivo texto do *nix em um bloco de texto vai ver todas as quebras de linha substituidas por um quadrado preto e todas as linhas em uma só.

Caso vc não tenha um programa conversor, pode usar o SED
$ sed -i ‘s/\r$//’ script.sh
$ ./script.sh
oi

O tr também poderia ser usado, mas não é tão amigável.
$ tr -d ‘\r’ novo_script.sh

Como converte com o dos2unix ???

Exemplo
# dos2unix arquivo.conf
# dos2unix arquivo.sh

converter certificado cer para pfx

  1. Converter certificado cer para .pfx

OpenSSL

  1. Faça o Download do pacote: http://gnuwin32.sourceforge.net/packages/openssl.htm
  2. Acesse o local de instalação C:\Program Files (x86)\GnuWin32\bin e execute openssl.exe

openssl

Execute o comando abaixo:

pkcs12 -export -out c:\berneck.pfx -inkey c:\certs2\nfse000058_key.pem -in c:\certs2\nfse000058_cert.pem -certfile c:\certs2\nfse000058_ca.pem

Será solicitada a senha para utilização do .pfx digite,redigite e confirme

c:\berneck.pfx  – Local onde será salvo o .pfx

2. Comando para criar um certificado auto-assinado (self-signed)

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout chavePrivada.key -out certificado.crt

Habilitar Experiência Desktop no Windows

Habilitar Experiência Desktop no Windows Server 2012 RC

Não consegui encontrar o Recurso de Experiência Desktop para ser instalada no Windows Server 2012 RC, esse recurso permite abrir imagens, videos, sons, etc. no Windows Server.

Para ativar esse recurso, siga o procedimento:

  1. Abra o Prompt de Comandos:
  2. Digite o comando:  dism /online /enable-feature /all /featurename:DesktopExperience
  3. Reinicie o Servidor.

Solução Definitiva Para o Bug de 100% de Uso de Disco Windows 8.1

Solução Definitiva Para o Bug de 100% de Uso de Disco.
==================================================
Códigos:
Dism /Online /Cleanup-Image /ScanHealth
Dism /Online /Cleanup-Image /RestoreHealth

Execute no prompt de comandos os comandos citados

==================================================
Site Para Baixar Drivers:
http://www.ma-config.com

Importante mantenha os drives do  computador atualizados dica utilize o site relacionado
==================================================
Programas Usados:
Bandicam 1.8 (Gravando à 30FPS)
Sony Vegas Pro 13.0

Voltar do windows 10

Microsoft tirou uma dúvida importante dos consumidores na seção de perguntas e respostas do Windows 10, a mais nova versão do sistema operacional da empresa. Afinal, se baterem as saudades, é possível voltar para uma versão anterior?

A resposta é positiva. “Sim. Apesar de nós acharmos que você vai amar todas as novidades do Windows 10, você terá um mês depois do upgrade para voltar atrás à versão anterior do Windows do seu dispositivo”, diz a mensagem da empresa.

Você tem até um mês após a atualização para fazer a “regressão”, caso não tenha curtido as funções novas, tenha sofrido com travadas ou simplesmente prefira um Windows anterior. Vale lembrar que o processo só vale para quem fez a atualização a partir do Windows 7 e do Windows 8.1.

Se arrependeu? É possível voltar do Windows 10 para o Windows 7 ou 8.1

voltar

O procedimento é muito simples. Clique no Menu Iniciar, vá em Configurações > Atualizações e segurança > Recuperação e clique no botão “Introdução” do item “Voltar para o Windows 7/8/8.1. Em seguida, é só selecionar uma opção no questionário explicando por que você deseja voltar para o Windows anterior e iniciar o procedimento. Depois dos 30 dias, a opção vai servir apenas para voltar para uma build anterior do Windows 10.

Além disso, a Microsoft confirmou que computadores com o Windows XP e o Windows Vista não receberão a atualização automática de sistema, mesmo que sejam genuínos. A chave de ativação deve ser comprada separadamente na Microsoft Store ou no varejo e um backup precisa ser realizado, pois o procedimento limpa todos os arquivos da máquina. Ainda assim, a empresa sugere que você tente o Windows 10 só em “dispositivos mais recentes”.

Openfire – Configurar como Serviço Windows

Openfire – Configurar como Serviço Windows

1
‘CONFIGURANDO O OPENFIRE COMO SERVIÇO DO WINDOWS’

Você pode fazer a configuração “Semi-Automatica” ou Manual

Configuração Semi-Automática

Após instalação, finalize o Openfire.

Abra o prompt de comando.

Digite cd %programfiles%\openfire\bin ou acesse a pasta onde o programa está instalado, caso não esteja na pasta padrão.

Digite openfire-service.exe -install

Você verá a mensagem Instaled service ‘Openfire’

Digite openfire-service.exe -start

Você verá a mensagem Starting service ‘Openfire’

Saia do prompt de comando.

Abra o Menu Iniciar e clique em Executar.

Digite services.msc

Encontre o serviço Openfire e verifique se as configurações do serviço estão corretas.

Configuração Manual

Os passos abaixo servem para criação de qualquer comando. Infomações detalhadas digite sc create ou sc para outras informações.

Abra o Prompt de Comando e digite:

sc create Openfire binPath= “C:\Arquivos de Programas\Openfire\bin\openfire-service.exe” start= auto DisplayName= Openfire

Se deu tudo certo irá retornar a mensagem [SC] CreateService ÊXITO

Digite net start Openfire para iniciar o serviço.

Digite services.msc, procure pelo serviço e verifique se as configurações estão corretas.

Obs.: Caso queira deletar algum serviço digite sc delete nome_do_serviço. Cuidado ao executa-lo pois esse comando não exige confirmação.

INSCRIÇÕES ABERTAS IOS TOTVS

IOS

INSCRIÇÕES ABERTAS NO IOS PARA JOVENS E PESSOAS COM DEFICIÊNCIA

Se você conhece jovens de 15 a 24 anos e pessoas com deficiência a partir de 16 anos, que estejam cursando ou concluíram o ensino médio na rede pública e que queiram ingressar no mercado de trabalho, indique o IOS – Instituto da Oportunidade Social – como uma ótima oportunidade de capacitação profissional GRATUITA.

As inscrições para as turmas de 2015 estão abertas. Para participar basta comparecer em uma das unidades do Instituto (clique e confira) com a documentação necessária (clique aqui para saber ).

O IOS – Instituto da Oportunidade Social é uma associação sem fins lucrativos, qualificada como Organização da Sociedade Civil de Interesse Público (OSCIP) e tem a TOTVS como principal mantenedora. Fundado em 1998, atua capacitando jovens da rede pública de ensino e pessoas com deficiência em regras de negócios e Tecnologia da Informação, monitorando e apoiando a empregabilidade e contribuindo para a formação de cidadãos mais produtivos e conscientes.

SQL Server 2008 Keygen

Enterprise : JD8Y6-HQG69-P9H84-XDTPG-34MBB

Developer : PTTFM-X467G-P7RH2-3Q6CG-4DMYB

Standard : FXHQY-JQF42-68VVV-PYVVR-RY3BB

Web : T4CTV-PVXVP-JH7GV-FB8DV-YMH3Y

Workgroup : QGRPG-DPHXX-Q69PJ-BBG4T-CMBYB

Microsoft SQL Server 2008 Enterprise

JD8Y6-HQG69-P9H84-XDTPG-34MBB

Microsoft SQL Server 2008 Developer

PTTFM-X467G-P7RH2-3Q6CG-4DMYB

Microsoft SQL Server 2008 Standard

FXHQY-JQF42-68VVV-PYVVR-RY3BB

Microsoft SQL Server 2008 Web

T4CTV-PVXVP-JH7GV-FB8DV-YMH3Y

Microsoft SQL Server 2008 Workgroup

QGRPG-DPHXX-Q69PJ-BBG4T-CMBYB

Microsoft SQL Server 2012

748RB-X4T6B-MRM7V-RTVFF-CHC8H

Divulgação do site com o build webnode

Pessoal teste o site Builder webnode e resolvi postar a experiencia:

Usabilidade do site foi muito boa ele possui o sistema de wizard para criação do conteúdo e informações das paginas gostei muito do resultado final da composição que podemos usar para a montagem da arte do site.

Abaixo um exemplo que montei da Microsan para testes

http://microsan-wordpress-com.webnode.com/

microsan.wordpress.com

Em microsan.wordpress.com nós lidamos com o desenvolvimento de novos negócios, negociações, administração e muito mais. Nós gostaríamos de convidá-lo a conhecer alguns de nossos projetos expostos neste website. Nossa equipe de profissionais está sempre a sua disposição, visto que acreditamos que a chave para o sucesso é o constante aprimoramento de nossos serviços para melhor servir os nossos clientes. A maior prova de que esta filosofia empresarial é correta, é o crescente número de clientes que microsan.wordpress.com tem ganhado.

Junte-se ao nosso time vencedor e tenha certeza de que o seu novo negócio será um sucesso! Visite-nos em nosso endereço: benedito massaroppi – São Bernardo do Campo.

Contato

microsan.wordpress.com
 cleitongenuino@hotmail.com

Leia mais: http://microsan-wordpress-com.webnode.com/

Instalar MySQL OpenSuse

Existem vários problemas encontrados quando estamos instalando o MySQL no OpenSuse. O primeiro encontrado quando o sistema operacional esteja sendo usado junto ao KDE.

O KDE possui uma ferramenta chamada Akonadi (usada para armazenar dados), essa ferramenta usa um banco de dados chamado MariaDB (que nada mais é que uma derivação do MySQL). O problema é que quando executarmos os pacotes rpm do MySQL comunity edition haverá um conflito entre os pacotes do repositório.

A melhor opção na minha concepção é removermos todos os pacotes MariaDB através do gerenciamento de softwares e depois iniciarmos a instalação. O Akonadi (caso você use!) pode ser configurado para apontar para o seu novo MySQL posteriormente.

Removendo o MariaDB

Vá em Iniciar -> Configurações de Sistema -> Yast e depois clique em Software -> Gerenciamento de Softwares

Pesquise: MariaDB e MySQL, e marque ambos como (!)Tabu, ou seja, nunca instalar.

.block1 block2

Quando ele perguntar sobre Resolução de Conflitos, escolher sempre a opção de QUEBRAR os requisitos. Caso o Yast esteja travando, basta atualizar seu sistema operacional que ele funcionará corretamente.

Antes de começarmos a instalação devemos remover (caso exista) os arquivos de configuração do MariaDB.

Execute

sudo rm /etc/init.d/my.cnf

Instalação do MySQL

 

Primeiro devemos fazer o download do MySQL Comunity Edition 5.6.19 no site oficial:

http://dev.mysql.com/downloads/mysql/

Não esqueça de baixar o MySQL de acordo com a versão do seu OpenSuse:

-32 bits

Linux – Generic (glibc 2.5) (x86, 32-bit), RPM Bundle

-64 bits

Linux – Generic (glibc 2.5) (x86, 64-bit), RPM Bundle

Abra o terminal do linux e vá até o local onde o está o arquivo baixado.

Como no meu caso usei o MySQL x64,então digitei as seguintes linhas:

tar -xvf MySQL-5.6.19-1.linux_glibc2.5.x86_64.rpm-bundle.tar

Serão extraídos, 7 arquivos RPM, não serão necessários instalar todos (apenas 2).

Vamos instalar os três pacotes necessários:

sudo rpm -i MySQL-devel-5.6.19-1.linux_glibc2.5.x86_64.rpm (digite a senha do usuário root)

Depois de executado (esse passo acima é executado bem rápido), vamos instalar o segundo pacote:

sudo rpm -i MySQL-server-5.6.19-1.linux_glibc2.5.x86_64.rpm

Este pacote irá demorar um pouco mais para terminar de instalar.

Reinicie o computador e execute no terminal (como root) as linhas abaixo:

rcmysql status

rcmysql start

rcmysql stop

Para iniciar automaticamente no boot

chkconfig mysql on 

Caso a resposta seja Active(running) , veja figura abaixo, então o seu MySQL com certeza estará funcionando.

MySql-Status

Lembrando que por default, o usuário ROOT (administrador) possui uma senha vazia (” “) , e que deve ser trocada após a instalação. Para fazer as configurações de segurança do MySql existe um script pronto que para executá-lo basta digitar:

sudo mysql_secure_installation

Caso você queira usar uma ferramenta para administração dos seus bancos, a melhor opção é o MySQL Workbench. Escolha sua versão e use o 1-Click Install. Clique aqui para navegar até o site.

Tutorial XBMC – Open Suse 13.1

Introdução

O presente documento tem por objectivo apresentar a metodologia inerente à instalação e criação de um Media Center utilizando o sistema operativo openSUSE 12.3 e o software XBMC (disponível no repositório de Multimédia do Packman).

A operacionalização destes conceitos têm por base a utilização de um portátil dedicado unicamente para utilização como Media Server para streaming por DNLA/uPnP para um dispositivo remoto.

Não é do âmbito deste documento cobrir aspectos básicos sobre manutenção e administração do sistema operativo; assumimos que o utilizar está familiarizado com estas tarefas, assim como gestão de firewalls e segurança. Este documento foi elaborado assumindo que a utilização dos conceitos será operacionalizada dentro de uma DMZ ou de uma rede doméstica protegida.

 

 

 

Instalação de Repositórios Adicionais

Após a instalação do sistema operativo, o utilizador deverá configurar os repositórios necessários a instalação de todo o software. Recomendamos que previamente o seguinte passo seja executado de forma a configurar o gestor de pacotes a ignorar os pacotes Recomendados. Isto é feito no ficheiro /etc/zypp/zypper.conf:
## Do not install soft dependencies (recommended packages)
##
## Valid values: boolean
## Default value: yes
##
installRecommends = no

De seguida deveremos instalar os seguintes repositórios:
Packman Essentials
Packman Multimedia

A instalação destes repositórios é feita através dos comandos seguintes:
$ sudo zypper ar http://pmbs.links2linux.org/download/Essentials/openSUSE_12.3/ packman-essentials
$ sudo zypper ar http://pmbs.links2linux.org/download/Multimedia/openSUSE_12.3/ packman-multimedia

De seguida o utilizador deverá executar os seguintes comandos de forma refrescar a cache local dos repositórios e fazer um update ao sistema operativo:
$ sudo zypper ref
$ sudo zypper update
Instalação do Software

Após a configuração inicial dos repositórios e update ao sistema operativo, é recomendado o utilizador executar o seguinte comando de forma a que seja executado um ‘distribution upgrade’; Esta operação permite substituir componentes instalados pelos mesmos componentes em repositórios diferentes (neste caso, packman).
$ sudo zypper dup

Após esta operação temos o sistema pronto para a instalação do XBMC e outros componentes necessários. Como o openSUSE 12.3 oferece uma experiência completa a nível de systemd, recomendamos a utilização de um Display Manager que suporte todas as features desejadas, por exemplo o GDM (GNOME Display Manager).
$ sudo zypper install xbmc gdm
Configuração

Nesta secção iremos apresentar algumas configurações que poderão ser feitas de forma a poder correr o XBMC em modo Kiosk. Desta forma, o sistema operativo irá fazer auto login para um utilizador xbmc que correrá directamente o XBMC em modo kiosk directamente numa sessão X sem Window Manager.
Configuração Sistema Operativo

Criação de um utilizador de sistema para correr o serviço XBMC em modo kiosk:
$ sudo useradd -c “XBMC system user” -G users -m xbmc
Configuração do Display Manager

Configuração do Display Manager (/etc/sysconfig/displaymanager):
## Type: string(kdm,kdm3,kdm4,xdm,gdm,wdm,entrance,console)
## Default: “”
#
# Here you can set the default Display manager (kdm/xdm/gdm/wdm/entrance/console).
# all changes in this file require a restart of the displaymanager
#
DISPLAYMANAGER=”gdm”
## Type: string
## Default:
#
# Define the user whom should get logged in without request. If string
# is empty, display standard login dialog.
#
DISPLAYMANAGER_AUTOLOGIN=”xbmc”
## Type: yesno
## Default: no
#
# Allow all users to login without password, but ask for the user, if
# DISPLAYMANAGER_AUTOLOGIN is empty.
#
DISPLAYMANAGER_PASSWORD_LESS_LOGIN=”yes”
Configuração do Window Manager

Embora não seja utilizado um Window Manager (Gestor de Janelas), queremos definir o próprio XBMC como um ‘Gestor de Janelas). Isto é feito no ficheiro /etc/sysconfig/windowmanager:
## Path: Desktop/Window manager
## Description:
## Type: string(gnome,kde4,kde,lxde,xfce,twm,icewm)
## Default: kde4
## Config: profiles,kde,susewm
#
# Here you can set the default window manager (kde, fvwm, …)
# changes here require at least a re-login
DEFAULT_WM=”XBMC”

NOTA: O valor XBMC na chave DEFAULT_WM deverá ser o mesmo utilizado no ficheiro que define a Sessão X do XBMC (/usr/share/xsessions/XBMC.desktop).

A partir deste momento, o utilizador deverá reiniciar a máquina. Após reiniciar, a máquina deverá iniciar directamente para o XBMC (utilizador xbmc com home em /home/xbmc).
Extras

Esta secção inclui alguns extras que podem ser atractivos para alguns utilizadores. Embora não sejam mandatórios, oferecem alguma funcionalidade extra que pode ser interessante para muitos utilizadores.
systemd – Desligar controlo da lid

Esta operação permite que quando o portátil seja fechado o mesmo não entre em hibernação ou suspende. Desta forma o utilizador pode ter o portátil fechado sem qualquer prejuízo para as aplicações a correr. Para este comportamento ser operacionalizado o utilizador deverá editar o ficheiro /etc/systemd/logind.conf:
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# See logind.conf(5) for details

[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#Controllers=
#ResetControllers=cpu
#InhibitDelayMaxSec=5
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
#HandleLidSwitch=suspend
HandleLidSwitch=ignore
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
LidSwitchIgnoreInhibited=yes
Activar Protocolo XDMCP

De forma a que utilizadores remotos possam utilizar clientes de XDMCP para obter um display remoto e não utilizarem o display fisico do portátil, as seguintes configurações deverão ser feitas no ficheiro /etc/sysconfig/displaymanager:
## Type: yesno
## Default: no
#
# Allow remote access (XDMCP) to your display manager (xdm/kdm/gdm). Please note
# that a modified kdm or xdm configuration, e.g. by KDE control center
# will not be changed. For gdm, values will be updated after change.
# XDMCP service should run only on trusted networks and you have to disable
# firewall for interfaces, where you want to provide this service.
#
DISPLAYMANAGER_REMOTE_ACCESS=”yes”

## Type: yesno
## Default: no
#
# Allow remote access of the user root to your display manager. Note
# that root can never login if DISPLAYMANAGER_SHUTDOWN is “auto” and
# System/Security/Permissions/PERMISSION_SECURITY is “paranoid”
#
DISPLAYMANAGER_ROOT_LOGIN_REMOTE=”no”

## Type: yesno
## Default: yes
#
# Let the displaymanager start a local Xserver.
# Set to “no” for remote-access only.
# Set to “no” on architectures without any Xserver (e.g. s390/s390x).
#
DISPLAYMANAGER_STARTS_XSERVER=”yes”

## Type: yesno
## Default: no
#
# TCP port 6000 of Xserver. When set to “no” (default) Xserver is
# started with “-nolisten tcp”. Only set this to “yes” if you really
# need to. Remote X service should run only on trusted networks and
# you have to disable firewall for interfaces, where you want to
# provide this service. Use ssh X11 port forwarding whenever possible.
#
DISPLAYMANAGER_XSERVER_TCP_PORT_6000_OPEN=”yes”

NOTA: A firewall deverá ser ajustada para aceitar tráfego na porta 6000.

Introdução

O presente documento tem por objectivo apresentar a metodologia inerente à instalação e criação de um Media Center utilizando o sistema operativo openSUSE 12.3 e o software XBMC (disponível no repositório de Multimédia do Packman).

A operacionalização destes conceitos têm por base a utilização de um portátil dedicado unicamente para utilização como Media Server para streaming por DNLA/uPnP para um dispositivo remoto.

Não é do âmbito deste documento cobrir aspectos básicos sobre manutenção e administração do sistema operativo; assumimos que o utilizar está familiarizado com estas tarefas, assim como gestão de firewalls e segurança. Este documento foi elaborado assumindo que a utilização dos conceitos será operacionalizada dentro de uma DMZ ou de uma rede doméstica protegida.

Instalação

Durante este tópica serão apresentadas orientações genéricas para a criação de uma PEN USB com a imagem de instalação do sistema operativo, instalação do sistema operativo e instalação dos repositórios necessários com vista à instalação do software XBMC.
Requisitos
Sistema operativo Linux já existente para criação da imagem de instalação;
Pen USB igual ou superior a 1GB (imagem de instalação por rede);
Acesso à Internet para download da imagem de instalação e instalação por rede;
Portátil dedicado para correr o XBMC;
Conhecimento sobre manutenção e administração de sistemas operativos Linux (openSUSE);

 

 

 

Ativar a conta de Administrador no Windows 8

Todos os créditos deste post são dados ao link:

http://www.baboo.com.br/tutorial/tutorial-de-windows/tutorial-windows-8-1-tutorial-windows-8/como-ativar-ou-desativar-a-conta-administrador-no-windows-8/

A conta Administrador no Windows 8 oferece acesso irrestrito a tudo no sistema operacional da Microsoft. Por padrão, usuários logados com ela não recebem notificações do UAC (Controle de Conta de Usuário) quando estes realizam alterações no sistema.

Ao usar a conta Administrador no Windows 8 o usuário terá algumas restrições, como por exemplo:

– Não é possível executar aplicativos da Windows Store ou entrar na loja:

– Esta conta é apenas local. Não é possível mudar para uma Conta da Microsoft.

IMPORTANTE: Se você habilitar a conta Administrador no Windows 8, lembre-se de criar uma senha para deixá-la protegida contra acesso não autorizado.

COMO ATIVAR OU DESATIVAR A CONTA ADMINISTRADOR NO WINDOWS 8

– O primeiro passo é abrir o prompt de comando como Administrador. Para fazer isto, clique com o botão direito do mouse no canto inferior esquerdo da área de trabalho e depois em Prompt de Comando (Admin):

Como ativar ou desativar a conta Administrador no Windows 8

– Com o prompt de comando elevado aberto, digite o seguinte comando e pressione Enter:

net user administrator /active:yes  

– Agora você poderá entrar na conta Administrador no Windows 8:

– Para desativar a conta Administrador no Windows 8, digite o seguinte comando no prompt elevado:

net user administrator /active:no

– Se você estiver logado na conta Administrador, volte para sua conta de usuário “normal” depois de desativá-la no prompt de comando:

Saiba como aumentar o tamanho de um disco virtual no VirtualBox

**** Para extensão .VDI

Todos os créditos destes post são dados ao seguinte link: http://www.techtudo.com.br/dicas-e-tutoriais/noticia/2013/02/saiba-como-aumentar-o-tamanho-de-um-disco-virtual-no-virtualbox.html

Se você criou um disco virtual no VirtualBox e depois descobriu que o espaço dele não será suficiente para o que precisa, esse tutorial do TechTudo irá ajudá-lo a resolver o problema.

Antes de iniciar, é importante saber que esse procedimento não funciona com discos fixos. Portanto, quando for criar um disco e queira aumentar ele depois, escolha sempre a opção “Dinamicamente alocado” em vez de “Tamanho Fixo”. Por último, faça uma cópia do disco a ser aumentado.

Na hora de criar um disco escolha a opção "Dinamicamente alocado" (Foto: Reprodução/Edivaldo Brito)Na hora de criar um disco escolha a opção “Dinamicamente alocado” (Foto: Reprodução/Edivaldo Brito)

Aumentando o tamanho do disco Virtual

Passo 1.Clique no menu iniciar e digite “cmd” (sem as aspas) na caixa de pesquisa. Depois clique com o botão direito em “cmd” e escolha a opção “Executar como administrador” no menu que aparece. Se for solicitado, digite a senha do administrador para autorizar a execução;

Executando o terminal do Windows 7 (Foto: Reprodução/Edivaldo Brito)Executando o terminal do Windows 7 (Foto: Reprodução/Edivaldo Brito)

Passo 2. Na janela do terminal, digite “cd \Program Files\Oracle\VirtualBox” (sem as aspas) e depois tecle “Enter”, para ir até a pasta do VirtualBox;

Acessando a pasta do VirtualBox (Foto: Reprodução/Edivaldo Brito)Acessando a pasta do VirtualBox (Foto: Reprodução/Edivaldo Brito)

Passo 3. Ainda no terminal, digite “VBoxManage.exe modifyhd “D:\maquinas\Windows7\
Windows7.vdi” –resize 30720″ (sem as apas do inicio e fim do comando) e tecle “Enter”. Lembrando que o caminho é onde fica o disco virtual no PC e o número depois da opção “–resize” é o novo tamanho dele em MB;

Aumentando o tamanho do disco virtual (Foto: Reprodução/Edivaldo Brito)Aumentando o tamanho do disco virtual (Foto: Reprodução/Edivaldo Brito)

Expandindo a partição para o novo tamanho

Infelizmente o processo acima não irá aumentar o espaço da partição no disco virtual. Assim, ao acessar o sistema operacional da máquina virtual ele ainda estará usando apenas o espaço que tinha antes. Para corrigir isso é preciso expandir a partição dentro do disco, veja como fazer isso:

Passo 1. Acesse o endereço http://gparted.sourceforge.net/download.php e baixe a imagem bootável do programa;

gpaerted01 (Foto: gpaerted01)gpaerted01 (Foto: gpaerted01)

Passo 2. Execute o VirtualBox. Dentro dele, clique com o botão direito na máquina virtual e no menu. Escolha a opção “Configurações”;

Acessando as configurações da máquina virtual (Foto: Reprodução/Edivaldo Brito)Acessando as configurações da máquina virtual (Foto: Reprodução/Edivaldo Brito)

Passo 3. Em configurações, clique na opção “Armazenamento” e dentro do quadro “Árvore de Armazenamento” na opção “Vazio”. Em seguida clique na seta ao lado do ícone do CD. No menu que aparece, escolha a opção ”Selecione um arquivo de CD/DVD virtual…”;

Adicionando uma imagem ISO na máquina virtual (Foto: Reprodução/Edivaldo Brito)Adicionando uma imagem ISO na máquina virtual (Foto: Reprodução/Edivaldo Brito)

Passo 4. Na janela que aparece, vá para a pasta onde salvou a imagem e clique nela, depois clique no botão “Abrir”. Em seguida confirme as alterações, clicando em “OK” na janela de configurações;

Escolhendo a imagem ISO (Foto: Reprodução/Edivaldo Brito)Escolhendo a imagem ISO (Foto: Reprodução/Edivaldo Brito)

Passo 5. Clique com o botão direito do mouse na máquina virtual e no menu que aparece, escolha a opção “Iniciar”. Na tela inicial e nas perguntas que aparecerem depois, basta teclar “Enter”, para que a inicialização continue;

Inicializando o Gparted (Foto:Reprodução/Edivaldo Brito)Inicializando o Gparted (Foto:Reprodução/Edivaldo Brito)

Passo 6. Quando inicializar a interface gráfica do GParted, clique com o botão direito do mouse na partição que deseja expandir e no menu que aparece escolha a opção “Resize/Move”;

Selecionando a partição para expandir (Foto: Reprodução/Edivaldo Brito)Selecionando a partição para expandir (Foto: Reprodução/Edivaldo Brito)

Passo 7. Na janela que aparece, clique na seta para cima do campo “New size (MiB):” até ela ficar indisponível ou simplesmente vá no gráfico que fica no topo da janela e arraste a barra deslizante até o fim para utilizar todo o espaço disponível. No final, clique no botão “Resize/Move” para continuar;

Aumentando o espaço da partição (Foto: Reprodução/Edivaldo Brito)Aumentando o espaço da partição (Foto: Reprodução/Edivaldo Brito)

Passo 8. Agora clique no botão “Apply”. Quando aparecer uma janela pedindo confirmação, clique no botão “Apply”;

Confirmando as alterações (Foto: Reprodução/Edivaldo Brito)Confirmando as alterações (Foto: Reprodução/Edivaldo Brito)

Passo 9. Finalizado o processo, clique no ícone “Exit”. Na janela que aparece, clique na opção “Shutdown” e depois no botão “OK”;

Saindo do GParted (Foto: Reproduação/Edivaldo Brito)Saindo do GParted (Foto: Reproduação/Edivaldo Brito)

Passo 10. No final do desligamento será preciso pressionar a tecla “Enter” para finalizar o processo;

Desligando a máquina virtual (Foto: Reproduação/Edivaldo Brito)Desligando a máquina virtual (Foto: Reproduação/Edivaldo Brito)

Passo 11. Acesse as configurações da máquina virtual novamente e remova o disco do GParted, clicando na opção “Armazenamento” e depois no nome da imagem ISO. Em seguida clique na seta ao lado do ícone do CD. No menu que aparece, escolha a opção “Remover disco do drive virtual”;

Removendo disco do GParted da máquina virtual (Foto: Reprodução/Edivaldo Brito)Removendo disco do GParted da máquina virtual (Foto: Reprodução/Edivaldo Brito)

Pass 12. Inicie a máquina virtual novamente e veja como ficou. Se o sistema operacional dela for o Windows, ele irá fazer uma checagem antes de carregar a interface gráfica. Não interrompa esse processo.

Windows verificando a partição antes de inicializar (Foto: Reprodução/Edivaldo Brito)Windows verificando a partição antes de inicializar (Foto: Reprodução/Edivaldo Brito)

Pronto. Seu disco virtual e a partição utilizada nele já estão com o novo tamanho, do jeito que você queria.

**** Para extensão .VHD

Quando você trabalha com o produto da Microsoft Hyper-V, você certamente se deparar com situação onde você teve para realizar tarefas nos arquivos VHD anexados. Tem que ser dito o construído em ferramentas fornecem algumas operações básicas, mas em muitos casos, essas ferramentas não têm algumas características que podem ser úteis.

Uma dessas características é redimensionar o volume hospedado em um arquivo VHD. Provavelmente não é a tarefa mais comum que você usaria, mas ainda assim há sempre que um caso estranho.

Como eu só precisava para ajustar o volume dentro de um dos VHDs, eu fiz alguma pesquisa para a forma mais eficiente de alcançar este objectivo. A solução foi um pequeno utilitário chamado VHD Resizer. NOTA: Este link parou de funcionar no mesmo período. Para baixar o utilitário, procure o link de download no final do post.
Você pode baixar o instalador a partir do link acima, extraia o arquivo zip e execute o instalador. Uma vez instalado, você pode abrir o utilitário ele irá pedir-lhe para o arquivo que você deseja redimensionar.

VhdResizerSetup.zip (Download Link)

Instalar ultima versão Firefox – Oracle Linux

It is a joy to use Linux for any purpose. Although Oracle Linux is mainly designed for enterprise stack, a stable operating system for a technical user is always a need.

However default configurations and program versions are not suitable for daily use always. One example of this is Firefox 3.0.6 available in Oracle Linux (or Red Hat). Here is how you can upgrade it to 17.0

Download latest Firefox release from Mozilla web page. Then unpack and install it by simply following.

1
2
3
tar -xjvf firefox-17.0.tar.bz2
cp -r firefox /opt/
ln -sf /opt/firefox/firefox /usr/bin/firefox

Instalação do Oracle 11g no Oracle Linux 6

Vamos ver a instalação do Oracle 11g no Oracle Linux 6.0.
Faça o download do Oracle Linux 6, clicando aqui, é necessário preencher alguns dados, o download é gratuito.

A imagem abaixo é a primeira tela da instalação do Oracle Linux 6.0, aguardando 60 segundos, ele irá carregar a opção Install or upgrade an existing system.

screenshot6

Após carregar o boot e perguntar se você deseja testar o cd, aparece a primeira tela do Oracle Linux 6, podemos clicar em next.

screenshot-1

Como já disse anteriormente em um outro post, é super importante instalar qualquer sistema em inglês, caso você tenha algum problema, será mais fácil achar a resolução com a mensagem de erro em inglês.

screenshot-2

Aqui você deve falar quais são os dipositivos que envolvem a instalação, no meu caso não esta ligado a nenhum SAN, NAS, etc… Deixei o Basic Storage Devices.

screenshot-4

A imagem abaixo pergunta se a instalação é uma nova instalação ou se é atualização. No nosso caso é uma nova instalação, marcamos em Flesh Installation e depois em next.

screenshot-5

Escolher qual vai ser o nome da máquina, coloquei oracle11g e também podemos configurar o IP do servidor, no meu caso deixei como DHCP.

screenshot-6

Segue descrição da imagem abaixo:
Use all Space: Remove todas os dados/partições do dispositivo (HD) e cria as partições em modo LVM, tudo bunitinho.
Replace Existing Linux System(s): Remove todas as partições do Linux, mantendo as partições do Windows ou qualquer outro que não seja Linux/Unix.
Shrink Current System: Diminui as partições existentes para criar espaços livres.
Use Free Space: Utiliza as partições que não tem um filesystem definido.
Create Custom layout: Crie manualmente as partições, definindo tudo.
Nesta instalação deixei marcado a primeira opção, Use All Space, claro que se for um ambiente de homologação deve ficar separar algumas partições.

screenshot-7

Nesta imagem, podemos selecionar os pacotes que serão instalados no servidor. Deixei marcado o Desktop para fazer a instalação do gnome, para não dificultar na instalação do Oracle 11g.

screenshot-8

Com isto, finalizamos a instalação do Oracle Linux 6.0.

screenshot-9

A primeira tela após a instalação é esta abaixo, clique em next.

screenshot-10

Licenciamento do produto, leia é importante!

screenshot-11

Nesta tela podemos atualizar os pacotes para a última versão e setar a licença do Oracle.

screenshot-12

Criando o usuário oracle e em seguida, podemos clicar em finalizar.

screenshot-14

Agora é o que mais nos interessa, a instalação do Oracle 11g. Para baixar o Oracle 11g clique aqui,
Os passos descritos foram testados no Oracle Database 11g Release 2 (11.2.0.1.0). Os arquivos de instalação estão dividos em dois arquivos, devemos baixar os dois.

Abaixo segue os pré-requisitos para a instalação do Oracle 11g.
UPDATE: Facilititando a instalação do banco de dados
Setando os parametros do kernel, devemos editar o arquivo /etc/sysctl.conf e adicionar o conteúdo abaixo:

fs.suid_dumpable = 1
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586

Devemos editar o arquivo /etc/security/limits.conf, para configurar os limites utilizado pelo usuário oracle.

oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240

Setando o IP fixo o arquivo, editando o arquivo /etc/hosts

192.168.1.10 oracle oracle.domain

Vamos desativar o SELINUX, no arquivo de configuração: /etc/selinux/config

SELINUX=disabled

Vamos instalar as bibliotecas faltantes, que o Oracle necessita. No próprio DVD do Oracle, já temos os pacotes faltantes, abaixo informo a pasta que tem os pacotes e um pacote que devemos baixar da internet.

cd /media/cdrom/Server/Packages
rpm -Uvh binutils-2*
rpm -Uvh glibc-2*
rpm -Uvh compat-libstdc++-33*
rpm -Uvh glibc-common-2*
rpm -Uvh elfutils-libelf-0*
rpm -Uvh elfutils-libelf-devel-0*
rpm -Uvh ksh-*
rpm -Uvh libaio-devel-0*
rpm -Uvh libaio-0*
rpm -Uvh libaio-devel-0*
rpm -Uvh libgcc-4*
rpm -Uvh libstdc++-4*
rpm -Uvh libstdc++-devel-4*
rpm -Uvh make-3.81*
rpm -Uvh sysstat-9*
rpm -Uvh compat-libstdc++*
rpm -Uvh kernel-headers-2*
rpm -Uvh glibc-headers-2*
rpm -Uvh glibc-devel-2*
rpm -Uvh ppl*
rpm -Uvh cloog-ppl*
rpm -Uvh mpfr-2*
rpm -Uvh cpp-4*
rpm -Uvh gcc-4*
rpm -Uvh gcc-c++-4*
rpm -Uvh numactl-2*
rpm -Uvh numactl-devel-2*
rpm -Uvh unixODBC-*
wget http://ftp.unesp.br/linux/redhat/9/os/i386/RedHat/RPMS/pdksh-5.2.14-21.i386.rpm && rpm -Uvh pdksh-5.2.14-21.i386.rpm

Criando os grupos, adicionando o usuário oracle aos grupos, criando a pasta que ficará os arquivos do oracle e por fim, mudando permissão da pasta para o usuário do oracle e do grupo oinstall.

groupadd -g 501 oinstall
groupadd -g 502 dba
groupadd -g 503 oper
groupadd -g 504 asmadmin
groupadd -g 506 asmdba
groupadd -g 505 asmoper
usermod -g oinstall -G dba,asmdba,oper oracle
mkdir -p /u01/app/oracle/product/11.2.0/db_1
chown -R oracle:oinstall /u01
chmod -R 775 /u01

Configurando as variáveis do Oracle, no arquivo /home/oracle/.bash_profile

# Setando as variaveis do Oracle.
TMP=/tmp; export TMP
TMPDIR=$TMP; export TMPDIR

ORACLE_HOSTNAME=ol6-11gr2.localdomain; export ORACLE_HOSTNAME
ORACLE_UNQNAME=DB11G; export ORACLE_UNQNAME
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1; export ORACLE_HOME
ORACLE_SID=orcl; export ORACLE_SID

PATH=/usr/sbin:$PATH; export PATH
PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH
CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH

Feito todos os passos acima, reinicie a máquina e estaremos pronto para iniciar a instalação do Oracle… calma…. esta chegando!!!!

Devemos agora extrair os arquivo que baixamos e acessar a pasta database:

unzip linux_11gR2_database_1of2.zip
unzip linux_11gR2_database_2of2.zip
cd databases/

Abaixo, a imagem mostra rodando o ./runInstaller

screenshot-17

A primeira tela solicita o endereço do Email e se deseja receber informações sobre atualizações de segurança.

screenshot-18

Estamos instalando o Oracle pela primeira vez, então, vamos selecionar a opção de criar e configurar o oracle.

Escolha em qual ambiente você esta instalando o Oracle

Escolha se a instalação é de uma única instância ou se você vai ser RAC (Real Application Clusters)

Vamos fazer a instalação avançada

Escolha o idioma do Oracle 11g

Escolha o tipo de instalação

Indique onde é o diretório do Oracle Base e o Oracle Home, caso você configurou as variaveis do Oracle, ele já vai esta preenchido.

Defina a pasta que ficará o inventário do Oracle.

Defina para qual será o propósito do banco.

Defina qual vai ser o Global database e o SID

Quantidade de memória usada por cada área do SGA e PGA e se será gerenciada automaticamente.

Na guia Sample Schemas, marque Create database with sample schemas, para ter uma base para treinamento.

Opções para gerenciamento do Oracle, caso voce tenha o Grid Control, especifique o agent e abaixo, ative a opção de notificação por e-mail.

Selecione onde ficará a base dados.

Opção de backup

Defina as senhas das contas do SYS, SYSTEM, SYSMAN e DBSNMP

Defina o grupo do OSDBA e OSOPER.

Momento que faz a checagem dos pré-requisitos, o meu faltou somente ajustar a a swap para maior que 3gb.

Sumário da instalação

Pronto, terminamos a instalação do Oracle e agora devemos rodar os scripts abaixo, com o usuário root.

Taí, a instalação do Oracle 11g, espero que gostem!!!

Liberação do java no Browser

Caso alguém pegue o problema tanto no acesso do portal de Download quanto no momento de fazer o Download segue a dica:

1º Entre em Painel de controle -> Programas -> Java
 Aba “Avançado”
 Definições de Segurança Avançadas
Marque as opções:
• Usar formato ClientHello compatível com SSL 2.0
• Usar TLS 1.1
• Usar TLS 1.2

2ºAltere a permissão de Alta para Médio e Aplique.

3º Reinicie o Navegador e pode usar novamente!

Install Adobe flash plugin on CentOS 6

Install Adobe flash plugin on CentOS 6 and RHEL 6
This little HOW-TO shows you how install the Adobe flash plugin on the 64 bit version of CentOS 6 and Red Hat Enterprise Linux 6 (x86_64)
by using Adobe’s own YUM repository. This way you will get easy updates!

Install Adobe FLASH plugin
Download the rpm from http://get.adobe.com/flashplayer/otherversions/ and select Linux 64bit and flashplayer 11 for other linux (YUM)
Go to download folder (for the user that downloaded the files)

su – root
cd /home/yourusername/Downloads
rpm -ivh adobe-release-x86_64-1.0-1.noarch.rpm
yum install flash-plugin

Restart your browser

Flash player no Oracle Linux

 

Setup Oracle public yum repository according to http://public-yum.oracle.com/

# cd /etc/yum.repos.d
# wget http://public-yum.oracle.com/

Then try the following:

# rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-i386-1.0-1.noarch.rpm
# rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux
# yum install firefox
# yum install flash-plugin nspluginwrapper.x86_64 nspluginwrapper.i686 \
alsa-plugins-pulseaudio.i686 libcurl.i686

It may prompt to install 79 packages (210 MB)

Then open Firefox and type “about:plugins”. It should list Flash:
File: nswrapper_32_64.libflashplayer.so
Version: Shockwave Flash 10.2 r159

The above worked for me on a default install of Oracle Linux 6.

Access Oracle support (metalink) is working. If it hangs i.e. 90 %, click the reload button.

But perhaps you might not want to do this on a server system. It’s better to do this using your regular Desktop system.

Instalação MySQL no CentOS

How to: Instalação do MySQL no CentOS

A instalação básica do MySQL no CentOS acontece de forma bastante simples e rápida, além disso você não irá precisar de nenhum repositório adicional, todos os pacotes necessários se encontram no repositório base.

Vou tomar por base a instalação via yum, a não ser que você precise de algum recurso adicional ou tenha bastante tempo e habilidade para manter atualizado o pacote de forma melhor que os desenvolvedores do SO você pode querer instalar via código fonte. Caso contrário, mãos a obra:

 

#yum install mysql mysql-server

No CentOS o serviço não será iniciado após a instalação e nem subirá automaticamente no boot time do servidor. Precisamos então colocar o mysql no startup do server. Para isto usamos o utilitário chkconfig:

#chkconfig  mysqld on

 Antes de subir o serviço é necessário preparar o terreno para o MySQL. O comando abaixo instala algumas bases necessárias para o funcionamento interno do servidor, pois sendo um banco de dados, o MySQL usa a si próprio para armazenar informações de controle, tais quais como usuários e senhas.

#mysql_install_db

Apartir deste momento o serviço já pode ser ativado sem maiores problemas:

#service mysqld start

O próximo passo é configurar um senha para o root, o usuário master do MySQL. Por padrão nenhuma senha é atribuída para este usuário e você deverá fazer isto na unha. Existem algumas formas de fazer isto, porém a mais fácil e rápida é com o mysqladmin:

#mysqladmin -u root password ‘RoOt@2010′  

Pronto, apartir de agora podemos acessar o servidor e criarmos as bases necessárias.

#mysql -u root -pRoOt@2010
mysql> CREATE DATABASE exemplo;
mysql> GRANT ALL ON exemplo.* TO ‘user’@’%’ IDENTIFIED BY ‘password’;
mysql> GRANT ALL ON exemplo.* TO ‘user’@’localhost’ IDENTIFIED BY ‘password’;

Explicando:
1- Acessamos o MySQL com o usuário root (não existe mesmo um espaço entro o -p e a senha)
2- Já na console do MySQL foi criada uma base de dados chamada exemplo.
3- É saudável usar usuários distintos para cada base de dados, e nunca utilizar a conta de root para isto. Este comando concede todos os privilégios em todas as tabelas do banco exemplo ao usuário user acessando a partir de qualquer host (devido ao uso do corginga %) identifica pela senha password.
4- Por fim as concessões são aplicadas ao usuário com acesso a partir da própria máquina.

A partir de agora, pode-se acessar o banco a partir de um front-end, como o HeidiSQL. Ele pode ser adquirido no link abaixo:

http://www.heidisql.com/

Referências:

http://bigualinux.wordpress.com/2010/06/06/how-to-instalacao-do-mysql-no-centos/

Instalar NetBeans no CentOS

Go to Oracle NetBeans 7.2 download page. Select the suitable version according to your system architecture 32 or 64 bit. The JDK distribution package bundled with NetBeans 7.2 IDE.

Download netBeans IDE

Once you’ve downloaded NetBeans 7.2, make it executable by setting execute permission by using the following command.

# chmod +x jdk-7u10-nb-7_2_1-linux-i586-ml.sh

OR

# chmod +x jdk-7u10-nb-7_2_1-linux-x64-ml.sh

Run the installer and follow the installation steps.

Run NetBeans Installer

Accept the jUnit License Agreement and click on Next button.

Accept the jUnit License Agreement

Choose the installation folder for JDK.

Install JDK

Choose the installation folder NetBeans IDE.

Install NetBeans IDE

Next, click on “Install” button to start installation process. On first NetBeans IDE startup, the installer will download and installs JUnit library.

Installing NetBeans IDE

Preparing and extracing installation data for Base IDE.

Install Base IDE

Installing Base IDE.

Installing Base IDE

Completing NetBeans IDE installation process.

Completing NetBeans IDE installation

Installation completed successfully. Click on “Finish” button.

Completing NetBeans IDE installation Completes

To launch the NetBeans IDE, use the Desktop launcher or use the following command to start it.

# /usr/local/netbeans-7.2.1/bin/netbeans
NetBeans 7.2 IDE running on CentOS 6.3

Start NetBeans IDE

Uninstalling NetBeans IDE 7.2 in RHEL/CentOS 6.3/5.8 and Fedora 18-12

If in case, you would like to uninstall the NetBeans IDE from the system, use the following commands and procedures.

# cd /usr/local/netbeans-7.2.1
# uninstall.sh

If you want to uninstall NetBeans IDE completely with their directories, check-box the “NetBeans install directory” and “NetBeans user directory“. Click Uninstall.

Uninstalling NetBeans IDE

Uninstalling NetBeans IDE.

Uninstalling NetBeans IDE

Click “Finish” to complete the Uninstall process.

NetBean IDE Uninstall Completes

Momento Aurélio

– A dúvida é: Está fazendo zero graus ou grau?

A resposta é: Está fazendo zero grau.
Zero é singular. Da mesma forma que dizemos “zero hora”, devemos falar “zero grau”. Vamos observar as comparações: “uma hora” = “um grau” = “um real”; “duas horas” = “dois graus” = “dois reais”.
Se zero é singular, é bom tomar alguns cuidados. Um programa que vai das 22h às 24h (das vinte e duas horas às vinte e quatro horas) pode ir das 22h à 0h (das vinte e duas horas à zero hora).

– A dúvida é: É proibido ou proibida a entrada de estranhos?

A resposta é: É proibida a entrada de estranhos.
O adjetivo, na função predicativa, deve concordar com o substantivo se estiver determinado: “É proibida a entrada de estranhos”; “A cerveja é boa”; “Não foi permitida a nossa saída”.
Se o substantivo não estiver determinado, o adjetivo não concorda, isto é, fica no masculino singular: “É proibido entrada de estranhos”; “Cerveja é bom”; “Não é permitido saída a qualquer hora”.
Observe a diferença: “Aqui nesta sala muita gente não é bom” e “Aqui nesta sala muita gente não é boa”. No primeiro caso, o sentido genérico: estamos nos referindo ao excesso de pessoas na sala. No segundo exemplo, estamos afirmando que há muitas pessoas na sala que não são boas.

– A dúvida é: Anexo ou anexas seguem as notas fiscais?

A resposta é: Anexas seguem as notas fiscais.
Anexo e anexado são formas adjetivas; devem, por isso, concordar: “O documento segue anexo”; “Os documentos seguem anexos”; “Os documentos foram anexados”; “Anexa vai a nota fiscal”; “Anexas vão as notas fiscais”…
Em vez de anexo, podemos usar a forma “em anexo”. O significado é o mesmo; a diferença é que “em anexo” é uma forma invariável. Assim sendo, não concorda: “Em anexo, seguem as notas fiscais”.

– A dúvida é: Incluso ou inclusas seguem as notas fiscais?

A resposta é: Inclusas seguem as notas fiscais.
Incluso é uma forma adjetiva. Deve obrigatoriamente concordar com o substantivo a que se refere: “A planilha está inclusa”; “Inclusos seguem os comprovantes”.
Não devemos confundir incluso com incluído. Incluso é adjetivo, e incluído é a forma do particípio. Usamos incluído na formação da voz passiva e dos tempos compostos: “O atacante foi incluído na lista dos convocados”; “O diretor tinha incluído a sua sugestão na nossa lista de prioridades”.

– A dúvida é: Elas moravam muito próximas ou próximo de nós?

A resposta é: Elas moravam muito próximo de nós.
A locução próximo de, quando significa “perto de”, é invariável: “Elas moravam muito próximo de nós” (=perto de nós); “Ela se sentou próximo do pai” (=perto do pai); “Próximo da ponte havia duas casas” (=perto da ponte).
Observe que os verbos não são de ligação: morar, sentar-se, haver.
A palavra próximo só concorda quando é adjetivo: “Eram pessoas muito próximas”; “Os primos ficaram mais próximos de nós”; “A casa era próxima da outra”.
Observe que agora os verbos são de ligação: ficar, ser.
“Ele morava próximo da ponte ou próximo à ponte”? Tanto faz. No sentido de “perto de”, podemos usar as locuções “próximo de” ou “próximo a”. As duas formas estão corretas.

– A dúvida é: Os guardas vigiavam alertas ou alerta o portão principal?

A resposta é: Os guardas vigiavam alerta o portão principal.
O correto é “vigiavam alerta”, porque se trata de um advérbio, é o modo como os guardas vigiavam o portão principal. É importante lembrar que os advérbios são palavras invariáveis.
A palavra alerta se flexiona, ou seja, vai para o plural, quando exerce uma função adjetiva (=sinônimo de “atento”): “Eram guardas alertas” (=atentos).
O substantivo alerta, sinônimo de “aviso”, também se flexiona: “Os sentinelas deram vários alertas”.

– A dúvida é: Na sua última coleção de inverno, predominavam os tons pastéis ou pastel?

A resposta é: Na sua última coleção de inverno, predominavam os tons pastel.
Embora a flexão seja aceita por alguns autores, devemos respeitar a tradicional regra que manda todo substantivo, na função de um adjetivo, ficar na forma neutra, ou seja, sem flexão de gênero e de número: “casacos vinho”; “sapatos areia”; “blusas gelo”; “manifestações monstro”…
Assim sendo, o correto é “camisas rosa”. O curioso é que esta regra também vale para os adjetivos compostos em que o segundo elemento é um substantivo: “camisas azul-piscina”; “calças verde-garrafa”; “blusas azul-céu”; “uniformes verde-oliva”…

– A dúvida é: As polícias ou a polícia civil e militar foram chamadas?

A resposta é: As polícias civil e militar foram chamadas.
Quando um substantivo é seguido de dois ou mais adjetivos, temos duas opções: ou pomos o substantivo no plural ou deixamos o substantivo no singular e repetimos o artigo. Assim sendo, é correto dizer “as polícias civil e militar” ou “a polícia civil e a militar”.
Podemos dizer que foram hasteadas “as bandeiras brasileira, argentina e uruguaia” ou “a bandeira brasileira, a argentina e a uruguaia”.
Podemos aplicar regra semelhante com os numerais: “primeiro e segundo graus” ou “no primeiro e no segundo grau”; “quinto e sexto andares” ou “no quinto e no sexto andar”; “sétima e oitava séries” ou “a sétima e a oitava série”.

– A dúvida é: Ele considerou estranho ou estranha a troca?

A resposta é: Ele considerou estranha a troca.
É um caso simples de concordância nominal. O adjetivo (estranho) deve concordar em gênero e número com o substantivo (troca) ao qual se refere. Se troca é um substantivo feminino, o adjetivo deve concordar no feminino: troca estranha. O fato de haver uma inversão (=adjetivo antes do substantivo) não altera a regra: “…estranha a troca”.
Vejamos outro exemplo: “Não havia sido registrado qualquer coisa”. Está errado também. O que não havia sido registrado foi “qualquer coisa”. Se coisa é um substantivo feminino, a concordância é obrigatória: “Não havia sido registrada qualquer coisa”.

– A dúvida é: Era a cicatrização de um problema muscular sofrida ou sofrido?

A resposta é: Era a cicatrização de um problema muscular sofrido.
Temos aqui um caso interessante de concordância nominal. O particípio “sofrido” refere-se ao problema, e não à cicatrização.
É importante lembrar que nem todas as palavras terminadas em “a” são substantivos femininos. Existem várias palavras terminadas em “a” que são masculinas: o problema, o emblema, o teorema, o telefonema, o trema, o tapa…
Na frase “Ficou com parte do corpo paralisado”, temos um erro mais sutil. É outro erro de concordância nominal. O particípio “paralisado” não se refere ao corpo, e sim à parte. Ele não ficou com o corpo paralisado, e sim com parte paralisada. O certo, portanto, é dizer que “ficou com parte do corpo paralisada”.
É o mesmo caso de “parte do lixo está sendo reaproveitada”. O que está sendo reaproveitada é parte, e não o lixo todo.

– A dúvida é: Se aceitasse a proposta, ele receberia R$ 90 mil mensais ou mensal?

A resposta é: Se aceitasse a proposta, ele receberia R$ 90 mil mensais.
Mensal é um adjetivo, por isso deve concordar com o substantivo a que refere. No caso são R$ 90 mil (=plural), por conseguinte a concordância no plural é obrigatória: R$ 90 mil mensais.
Se fosse por dia, receberia R$90 mil diários; por semana, semanais; por ano, anuais. Poderia também ser um advérbio, caso se referisse ao verbo: “Ele vai receber mensalmente R$90 mil”.
E se ele fosse receber mil dólares de dois em dois meses? Seriam mil dólares bimensais ou bimestrais? Cuidado para não confundir bimestral com bimensal. De dois em dois meses é bimestral, e bimensal é duas vezes no mês. O mesmo ocorre com trimestral e trimensal. Quando o rendimento da caderneta de poupança era de três em três meses, o rendimento era trimestral. Trimensal é três vezes dentro do mesmo mês.

– A dúvida é: Recebeu 4,2 milhões de dólares líquido ou líquidos?

A resposta é: Recebeu 4,2 milhões de dólares líquidos.
O problema é o uso do adjetivo líquido, que deverá ficar no plural para concordar com 4,2 milhões de dólares (=plural).
Outro erro frequente ocorre em frases do tipo “Eles transformam as pedras preciosas em dólares e depois em real.” Ora, se as pedras preciosas são transformadas em dólares, é porque não é um dólar só, são dólares no plural. Consequentemente, os dólares vão ser trocados por reais, no plural também. É uma questão de lógica. O certo, portanto, é: “Eles transformam as pedras preciosas em dólares e depois em reais”.

– A dúvida é: Ganhou cerca de 1,5 milhões ou milhão de reais?

A resposta é: Ganhou cerca de 1,5 milhão de reais.
Cerca de 1,5 milhão de reais significa cerca de um milhão e quinhentos mil reais. Quando abreviamos R$1.500.000,00 para 1,5 milhão de reais, a casa do milhão é a que fica antes da vírgula. Observe mais exemplos: 2,1 milhões = dois milhões e cem mil; 1,3 bilhão = um bilhão e trezentos milhões; 4,1 bilhões = quatro bilhões e cem milhões.
A concordância com a palavra milhão, a princípio, deve ser feita no singular: “Um milhão compareceu à solenidade”; “Foi gasto um milhão de reais”. Quando o milhão vem acompanhado de um especificador no plural, a concordância torna-se facultativa: “Um milhão de pessoas compareceu ou compareceram à solenidade”. Existe hoje uma visível preferência pela concordância com o especificador, principalmente na voz passiva e com os verbos de ligação: “Um milhão de reais foram gastos”; “Um milhão de crianças já foram vacinadas”; “Um milhão de mulheres estão grávidas”.

– A dúvida é: Havia muita ou muito pouca comida?

A resposta é: Havia muito pouca comida.
Para entendermos por que a palavra pouco concorda com o substantivo feminino comida (= pouca comida), e a palavra muito não se flexiona (= muito pouca), devemos dividir a explicação em duas partes: 1a) “pouca comida” – A palavra pouco, neste caso, é um pronome adjetivo indefinido porque acompanha um substantivo (= comida). Os pronomes concordam em gênero e número com o substantivo a que se referem: “pouca comida”, “muita saúde”, “poucas pessoas”, “tantos livros”, “provas bastantes”; 2a) “muito pouca comida” – A palavra muito, neste caso, é um advérbio de intensidade porque se refere ao pronome adjetivo (= pouca), e não ao substantivo.
Os advérbios não apresentam flexão de gênero e número: “muito pouca…”, “Elas estão muito satisfeitas”, “As alunas estão pouco nervosas”, “As atletas ficaram bastante emocionadas”.
E você sabe quando é que se fala menas? Nunca. Só quando se fala errado. Não existe essa possibilidade. A palavra menos é totalmente invariável. Não importa se é advérbio ou pronome. Em qualquer situação, devemos usar sempre a forma menos. São inaceitáveis frases do tipo: “Veio menas gente”, “Isso é de menas importância”, “Chutou com menas força”, “Tinha menas pessoas”, “Nosso time teve menas chances”… A palavra menos, portanto, não apresenta flexão de gênero e número. O certo é falar sempre menos: “Vieram menos pessoas”, “Isso tem menos importância”, “Chutou com menos força”, “Tivemos menos oportunidades”…

Por que / Por quê / Porque ou Porquê?

O uso dos porquês é um assunto muito discutido e traz muitas dúvidas. Com a análise a seguir, pretendemos esclarecer o emprego dos porquês para que não haja mais imprecisão a respeito desse assunto.

Por que

O por que tem dois empregos diferenciados:

Quando for a junção da preposição por + pronome interrogativo ou indefinido que, possuirá o significado de “por qual razão” ou “por qual motivo”:

Exemplos: Por que você não vai ao cinema? (por qual razão)
Não sei por que não quero ir. (por qual motivo)

Quando for a junção da preposição por + pronome relativo que, possuirá o significado de “pelo qual” e poderá ter as flexões: pela qual, pelos quais, pelas quais.

Exemplo: Sei bem por que motivo permaneci neste lugar. (pelo qual)

Por quê

Quando vier antes de um ponto, seja final, interrogativo, exclamação, o por quê deverá vir acentuado e continuará com o significado de “por qual motivo”, “por qual razão”.

Exemplos: Vocês não comeram tudo? Por quê?
Andar cinco quilômetros, por quê? Vamos de carro.

Porque

É conjunção causal ou explicativa, com valor aproximado de “pois”, “uma vez que”, “para que”.

Exemplos: Não fui ao cinema porque tenho que estudar para a prova. (pois)
Não vá fazer intrigas porque prejudicará você mesmo. (uma vez que)

Porquê

É substantivo e tem significado de “o motivo”, “a razão”. Vem acompanhado de artigo, pronome, adjetivo ou numeral.

Exemplos: O porquê de não estar conversando é porque quero estar concentrada. (motivo)
Diga-me um porquê para não fazer o que devo. (uma razão)

Corretor ortográfico em Português no Eclipse

Fonte do post :http://www.actjava.com.br/2012/03/corretor-ortografico-em-portugues-no.html

Parabéns pelo post !!! A Microsan da todos os créditos ao criador do post

Eclipse, por padrão, disponibiliza dois dicionários em seu corretor ortográfico do editor de código: o dicionário em inglês padrão e o inglês do Reino Unido. Mas como isso não será de grande ajuda para nós brasileiros, que iremos documentar e comentar o nosso programa, no nosso idioma, vamos adicionar um dicionário personalizado em Português do Brasil no corretor ortográfico do Eclipse.
Abrindo o arquivo PrimeiroPrograma.java, verificamos que as palavras dos comentários estão sublinhadas em vermelho ondulado. Isso ocorre porque o corretor ortográfico do Eclipse está configurado para o idioma em inglês. Vamos configurar o corretor ortográfico com um dicionário personalizado para o nosso idioma.

Primeiro clique aqui para fazer o download do arquivo com o dicionário de palavras no nosso idioma.
Descompacte o arquivo na mesma pasta onde está instalado o Eclipse (no meu caso é: C:\Program Files (x86)\eclipse\indigo).
Entre no Eclipse e clique em Window >> Preferences.

Na janela a seguir selecione as opções:  General >> Editors >> Text Editors >> Spelling.

Em Platform dictionary selecione a opção none e clique em Browse…

Selecione o arquivo eclipse-pt_Br.dic e clique em abrir.

Voltando a janela anterior, verifique se o caminho do dicionário está correto no campo User defined dictionary e clique em OK para finalizar.

Feito o procedimento de forma correta, feche e abra novamente a arquivo PrimeiroPrograma.java, note que agora as palavras em nosso idioma não estão mais marcadas como incorretas.

Pronto, o dicionário personalizado foi configurado com sucesso, no nosso próximo encontro continuaremos com os fundamentos da linguagem Java. Até a próxima.

Como retirar mensagem winrar de registro

  1.  Abra um arquivo txt
  2. Cole o conteúdo abaixo
    RAR registration data
    cafevn
    Single PC usage license
    UID=bff246844b5c5708595a
    6412212250595aa9dfb5db06ca5c5b29cb38d3c346df871e689fcd
    26d40cd6724c7fea7a256035c6ab9048e2c5c62f0238f183d28519
    aa87488bf38f5b634cf28190bdf438ac593b1857cdb55a7fcb0eb0
    c3e4c2736090b3dfa45384e08e9de05c58601faaa5bf2fd204421a
    0af4a66c04f5f95c750b942c262c8defc92d51753d37c41772b696
    179d2401468afd8cdf6b526bd713b62d9d1c8b39f8f5c862600bd1
    6f2be0ead43d89dc20da9c292bbc37165bb690729a430802790431
  3. Salve com o nome rarreg.key
  4. Cole o arquivo na pasta de instalação do winrar.

Pronto !!!!

Boletim Técnico: Importação de Arquivos XML pelo TOTVS Colaboração – p10 – Fonte: TDN

Dicas iniciais:

USE TSS11
SELECT* FROM SPED001 WHERE ID_ENT = 29
— SPED 001 — AS ENTIDADES
SELECT* FROM SPED001A WHERE ID_ENT = 29
— SPED 001A — OS COMPLEMENTOS DAS ENTIDADES
SELECT* FROM SPED050 WHERE ID_ENT = 29
— SPED 050 — REGISTROS DE NOTAS PROCESSADAS/ REJEITADAS / ERRO
SELECT* FROM SPED150 WHERE ID_ENT = 29
— SPED 150 — EVENTOS DA NFE
select* from SPED158 where ORGAO = ‘ES’ and MODELO = 110110
— SPED 158 — Urls

SPED000

MV_TOTVSCO = Informar se utiliza TOTVS Colaboração. S = SIM ou N = Não

MV_CONFALL = Habilita a confirmação de todos os documentos recebidos do TOTVS Colabor ação. S = Sim ou N = Não

MV_NRETNF = Informar a quantidade de registros que deseja retornar a cada solicitação do TSS com a NeoGrid. Valor Maximo 50.

MV_AUTHTTP = armazena os usuário e senha disponibilizado pela NeoGrid, no formato CNPJ#User:PassWord

MV_AMBNFEC = Informar o ambiente de transmissão de notas para o Colaboração

MV_AMBCTEC = Informar o ambiente de transmissão de Cte para o Colaboração

MV_DOCSCOL = Define os tipos de documentos que o TSS deve transmitir para a solução TOTVS Colaboração (0=TODOS;1=NFe;2=CTe;3=NFSe; 4= Nenhum)Exemplo = 2,3.

IMPORTANTE: Todos estes parâmetros são criados na tabela pelo método CFGPARAMSPED.

Ocorrência Melhoria . Resumo Com o objetivo de tornar mais simples e ágil a inclusão dos documentos fiscais de entrada, foi implementada funcionalidade na rotina de Pré-Nota Entrada (MATA140) que permite a importação de arquivos de nota fiscal eletrônica (em formato XML), por meio da utilização da solução TOTVS Colaboração.

Após atualização do sistema e contratação do serviço TOTVS Colaboração, a rotina de importação estará disponível no programa Pré-Nota Entrada (MATA140), através da opção de rotina Entrada NF-e.

A partir de tal funcionalidade e utilização do serviço TOTVS Colaboração, a empresa compradora de bens e/ou serviços passará a receber os arquivos eletrônicos de NF-e referentes às compras e bonificações realizadas com seus fornecedores. Em posse destes arquivos, será possível processar a importação, permitindo assim a geração de documentos, Pré-Nota ou Documento de Entrada (o segundo nos casos de bonificação) a partir dos dados contidos nos arquivos eletrônicos, reduzindo o trabalho de inclusão e digitação de tais documentos.

Os documentos importados e disponíveis para geração de Pré-Nota ou Documento de entrada ficarão dispostos em rotina específica, identificada pela opção “Entrada NF-e”, em que, após configuração de filtro, serão listados os documentos correspondentes para que sejam analisados/processados por uma das seguintes ações:

•Visualizar: exibe os detalhes do arquivo eletrônico. •Vincular Pedido: exibe tela para realização de vínculo entre os itens do documento eletrônico e os itens de pedido pendentes. •Gerar Docto: gera o documento (Pré-Nota ou Documento de Entrada nos casos de bonificação) correspondente ao arquivo eletrônico.

Observação:

A identificação dos arquivos eletrônicos referentes à bonificação depende da configuração do parâmetro MV_XMLCFPC com os CFOPs de venda usados no processo de bonificação. A geração do documento de entrada dos arquivos identificados como bonificação dependerá da configuração do campo “TE p/ Bonif.” (A5_TESBP), com uma TES adequada ao processo.

A rotina dispõe ainda das funcionalidades:

•Legenda: visualiza as legendas da rotina. •Filtrar: filtra os registros exibidos em tela. •Importar: processa a importação de um arquivo XML de NF-e a ser escolhido pelo usuário. •Excluir: exclui o registro posicionado em tela.

A automatização do processo de importação dos arquivos pode ser configurada por meio da ferramenta de Schedule padrão do sistema pelo agendamento de execução da rotina MATA140I.

Observação:

Antes da utilização da funcionalidade implementada nesta FNC, é necessário revisar o cadastro de Produtos X Fornecedores, pois a identificação dos produtos contidos no arquivo eletrônico é realizada graças ao código do fornecedor, identificado no campo “Cod. Prod. For.” (A5_CODPRF). . ID do Chamado SDLCB0 . Produtos •Microsiga 10 . Módulos •SIGACOM . Países •todos . Sistema Operacional •todos . Bancos de Dados •todos . Nome + Fonte MATA140 – Pré-Nota de Entrada; MATA140I – Funções Genéricas de Importação NF-e. . Parâmetros Envolvidos MV_TABSUS; MV_XMLCFPC. . Número da FNC 000000101742011 . Ajustes no Compatibilizador Sim . Integridade Referencial Sim . Aplicação de Patch

. Compatibilizador 1 – U_UPDCOM19 . Procedimentos para Implementação

Importante:

Antes de executar o compatibilizador U_UPDCOM19 é imprescindível:

a)    Realizar o backup da base de dados do produto que será executado o compatibilizador PROTHEUS_DATA\DATA e dos dicionários de dados SXs diretório PROTHEUS_DATA_SYSTEM.

b)    Os diretórios acima mencionados correspondem à instalação padrão do Protheus®, portanto, devem ser alterados conforme o produto instalado na empresa.

c)    Essa rotina deve ser executada em modo exclusivo, ou seja, nenhum usuário deve estar utilizando o sistema.

d)    Se os dicionários de dados possuírem índices personalizados (criados pelo usuário), antes de executar o compatibilizador, certifique-se de que estão identificados pelo nickname. Caso o compatibilizador necessite criar índices, irá adicioná-los a partir da ordem original instalada pelo Protheus®, o que poderá sobrescrever índices personalizados, caso não estejam identificados pelo nickname.

e)    O compatibilizador deve ser executado com a Integridade Referencial desativada*.

ATENÇÃO: O procedimento a seguir deve ser realizado por um profissional qualificado como Administrador de Banco de Dados (DBA) ou equivalente!

*         A ativação indevida da Integridade Referencial pode alterar drasticamente o relacionamento entre tabelas no banco de dados. Portanto, antes de utilizá-la, observe atentamente os procedimentos a seguir:

i.        No Configurador (SIGACFG), veja se a empresa utiliza Integridade Referencial, selecionando a opção Integridade/Verificação (APCFG60A).

ii.        Se não há Integridade Referencial ativa, são relacionadas em uma nova janela todas as empresas e filiais cadastradas para o sistema e nenhuma delas estará selecionada. Neste caso, E SOMENTE NESTE, não é necessário qualquer outro procedimento de ativação ou desativação de integridade, basta finalizar a verificação e aplicar normalmente o compatibilizador, conforme instruções.

iii.        Se há Integridade Referencial ativa em todas as empresas e filiais, é exibida uma mensagem na janela Verificação de relacionamento entre tabelas. Confirme a mensagem para que a verificação seja concluída, ou;

iv.        Se há Integridade Referencial ativa em uma ou mais empresas, que não na sua totalidade, são relacionadas em uma nova janela todas as empresas e filiais cadastradas para o sistema e, somente, a(s) que possui(em) integridade está(arão) selecionada(s). Anote qual(is) empresa(s) e/ou filial(is) possui(em) a integridade ativada e reserve esta anotação para posterior consulta na reativação (ou ainda, contate nosso Help Desk Framework para informações quanto a um arquivo que contém essa informação).

v.        Nestes casos descritos nos itens “iii” ou “iv”, E SOMENTE NESTES CASOS, é necessário desativar tal integridade, selecionando a opção Integridade/ Desativar (APCFG60D).

vi.        Quando desativada a Integridade Referencial, execute o compatibilizador, conforme instruções.

vii.        Aplicado o compatibilizador, a Integridade Referencial deve ser reativada, SE E SOMENTE SE tiver sido desativada, através da opção Integridade/Ativar (APCFG60). Para isso, tenha em mãos as informações da(s) empresa(s) e/ou filial(is) que possuía(m) ativação da integridade, selecione-a(s) novamente e confirme a ativação.

Contate o Help Desk Framework EM CASO DE DÚVIDAS!

Em Microsiga Protheus By you Smart Client, digite U_UPDCOM19 no campo Programa Inicial.

Importante:

Para a correta atualização do dicionário de dados, certifique-se que a data do compatibilizador seja igual ou superior a 28/04/2011.

1.    Clique em OK para continuar.

3.    Após a confirmação é exibida uma tela para a seleção da empresa em que o dicionário de dados será modificado ou é apresentada a janela para seleção do compatibilizador. Selecione o programa UPDCOM19().

4.    Ao confirmar é exibida uma mensagem de advertência sobre o backup e a necessidade de sua execução em modo exclusivo.

5.    Clique em Processar para iniciar o processamento. O primeiro passo da execução é a preparação dos arquivos.

É apresentada uma mensagem explicativa na tela.

6.    Em seguida, é exibida a janela Atualização concluída com o histórico (log) de todas as atualizações processadas. Nesse log de atualização, são apresentados somente os campos atualizados pelo programa. O compatibilizador cria os campos que ainda não existem no dicionário de dados.

7.    Clique em Gravar para salvar o histórico (log) apresentado.

8.    Clique em OK para encerrar o processamento.

O sistema é atualizado logo após a aplicação do pacote de atualizações (Patch) desta FNC. . Descrição de Ajustes

1.   Criação de pergunta no arquivo – SX1 – Cadastro de Perguntes:

Pergunte

Da Nota Fiscal ?

Nome

MV_PAR01

Grupo

MTA140I

Ordem

01

Tipo

C

Tamanho

9

Pergunte

Ate a Nota Fiscal ?

Nome

MV_PAR02

Grupo

MTA140I

Ordem

02

Tipo

C

Tamanho

9

Pergunte

Da Serie ?

Nome

MV_PAR03

Grupo

MTA140I

Ordem

04

Tipo

C

Tamanho

3

Pergunte

Ate Serie ?

Nome

MV_PAR04

Grupo

MTA140I

Ordem

04

Tipo

C

Tamanho

3

Pergunte

Fornecedor De ?

Nome

MV_PAR05

Grupo

MTA140I

Ordem

05

Tipo

C

Tamanho

6

Pergunte

Fornecedor Ate ?

Nome

MV_PAR06

Grupo

MTA140I

Ordem

06

Tipo

C

Tamanho

6

Pergunte

Dt Emissao Inicial ?

Nome

MV_PAR07

Grupo

MTA140I

Ordem

07

Tipo

D

Tamanho

8

Pergunte

Dt Emissao Final ?

Nome

MV_PAR08

Grupo

MTA140I

Ordem

08

Tipo

D

Tamanho

8

Pergunte

Dt Importacao Inicial ?

Nome

MV_PAR09

Grupo

MTA140I

Ordem

09

Tipo

D

Tamanho

8

Pergunte

Dt Importacao Final ?

Nome

MV_PAR10

Grupo

MTA140I

Ordem

10

Tipo

D

Tamanho

8

Pergunte

Mostra Gerados ?

Nome

MV_PAR12

Grupo

MTA140I

Ordem

11

Tipo

C

Tamanho

1

2.   Criação no arquivo SX3 – Campos:

·          Tabela SDS – Cabeçalho importação XML NF-e:

Campo

DS_FILIAL

Tipo

C

Tamanho

2

Decimal

0

Formato

@!

Título

Filial

Descrição

Filial do Sistema

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Filial do Sistema

Campo

DS_FORNEC

Tipo

C

Tamanho

6

Decimal

0

Formato

@!

Título

Fornecedor

Descrição

Código do fornecedor

Nível

1

Usado

Sim

Obrigatório

Sim

Browse

Sim

Help

Código do Fornecedor

Campo

DS_LOJA

Tipo

C

Tamanho

2

Decimal

0

Formato

@!

Título

Loja

Descrição

Loja do Fornecedor

Nível

1

Usado

Sim

Obrigatório

Sim

Browse

Sim

Help

Loja do Fornecedor

Campo

DS_NOMEFOR

Tipo

C

Tamanho

30

Decimal

0

Formato

@!

Título

Filial

Descrição

Nome do Fornecedor

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Sim

When

.F.

Help

Nome do Fornecedor

Campo

DS_CNPJ

Tipo

C

Tamanho

14

Decimal

0

Formato

@!

Título

CNPJ Fornece

Descrição

CNPJ Fornecedor

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Não

Help

CNPJ do Fornecedor

Campo

DS_DOC

Tipo

C

Tamanho

9

Decimal

0

Formato

@!

Título

Numero

Descrição

Numero do documento

Nível

1

Usado

Sim

Obrigatório

Sim

Browse

Sim

Help

Numero do documento

Campo

DS_SERIE

Tipo

C

Tamanho

3

Decimal

0

Formato

@!

Título

Serie

Descrição

Serie do documento

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Sim

Help

Serie do documento

Campo

DS_TIPO

Tipo

C

Tamanho

1

Decimal

0

Formato

@!

Título

Tipo da Nota

Descrição

Nota/Consumidor/Ticket…

Nível

1

Usado

Sim

Obrigatório

Sim

Browse

Não

Help

Tipo da Nota

Campo

DS_ESPECI

Tipo

C

Tamanho

5

Decimal

0

Formato

@!

Título

Espec.Docum.

Descrição

Espécie do Documento

Nível

1

Usado

Sim

Obrigatório

Sim

Browse

Não

Help

Espécie do Documento

Campo

DS_EMISSA

Tipo

D

Tamanho

8

Decimal

0

Formato

Título

DT Emissao

Descrição

Data de Emissão da NF

Nível

1

Usado

Sim

Obrigatório

Sim

Browse

Não

Relação

Ddatabase

Help

Data de Emissão da NF

Campo

DS_FORMUL

Tipo

C

Tamanho

1

Decimal

0

Formato

@!

Título

Form. Prop.

Descrição

Formulário Próprio

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Formulário próprio

Campo

DS_EST

Tipo

C

Tamanho

2

Decimal

0

Formato

@!

Título

Estado

Descrição

Estado de emissao da NF

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Estado de emissão da Nota Fiscal

Campo

DS_COND

Tipo

C

Tamanho

3

Decimal

0

Formato

@!

Título

Cond. Pagto

Descrição

Codigo da condic. de pgto

Nível

1

Usado

Não

Obrigatório

Sim

Browse

Não

Help

Código da condição de pagamento

Campo

DS_DTDIGI

Tipo

D

Tamanho

8

Decimal

0

Formato

@!

Título

Dt.Digitacao

Descrição

Data de Digitacao

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Relação

Ddatabase

Help

Data de digitação da Nota

Campo

DS_STATUS

Tipo

C

Tamanho

1

Decimal

0

Formato

@!

Título

Status

Descrição

Status do Registro

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Status do Registro

Campo

DS_ARQUIVO

Tipo

C

Tamanho

80

Decimal

0

Formato

@!

Título

Arquivo

Descrição

Nome do Arquivo XML

Nível

1

Usado

Não

Obrigatório

Não

Help

Nome do Arquivo XML

Campo

DS_USERIMP

Tipo

C

Tamanho

25

Decimal

0

Formato

@!

Título

Usuario

Descrição

Usuario na importação

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Usuário responsável pela importação da Nota Fiscal Eletrônica

Campo

DS_DATAIMP

Tipo

D

Tamanho

2

Decimal

0

Formato

@!

Título

Data Import.

Descrição

Data importacao do XML

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Data da importação do arquivo XML

Campo

DS_HORAIMP

Tipo

C

Tamanho

5

Decimal

0

Formato

99:99

Título

Hora Import.

Descrição

Hora importacao XML

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Hora da importação do arquivo XML

Campo

DS_USERPRE

Tipo

C

Tamanho

25

Decimal

0

Formato

@!

Título

Usuario

Descrição

Usuário res. Ger. Pre-NF

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Usuário responsável pela geração da pré-nota

Campo

DS_DATAPRE

Tipo

D

Tamanho

8

Decimal

0

Título

Data Pre NF Filial

Descrição

Data de geracao de Pre-NF

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Data de geração da Pré-Nota de Entrada.

Campo

DS_HORAPRE

Tipo

C

Tamanho

5

Decimal

0

Formato

99:99

Título

Hora Pre NF

Descrição

Hora de geração da Pre-NF

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Hora de geração da Pré-Nota de Entrada

Campo

DS_CHAVENF

Tipo

C

Tamanho

44

Decimal

0

Formato

@!

Título

Chave Acess.

Descrição

Chave de Acesso da NF

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Não

Help

Chave de acesso da Nota Fiscal Eletrônica

Campo

DS_VERSAO

Tipo

C

Tamanho

5

Decimal

0

Formato

@!

Título

Versao da Nf

Descrição

Versao Layout da NFe

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Não

Help

Versão Layout da NFe

Campo

DS_CFESP

Tipo

C

Tamanho

25

Decimal

0

Formato

@!

Título

CFOP Espec.

Descrição

CFOP Especial (s/ PC)

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Não

Help

Documento com CFOP especial sem vinculo ao PC.

Campo

DT_FILIAL

Tipo

C

Tamanho

2

Decimal

0

Formato

@!

Título

Filial

Descrição

Filial do Sistema

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Filial do Sistema

Campo

DT_ITEM

Tipo

C

Tamanho

4

Decimal

0

Formato

@!

Título

Item NF

Descrição

Item da Nota Fiscal

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Não

Help

Item da Nota Fiscal

Campo

DT_COD

Tipo

C

Tamanho

2

Decimal

0

Formato

@!

Título

Produto

Descrição

Codigo do Produto

Nível

1

Usado

Sim

Obrigatório

Sim

Browse

Não

Help

Código do produto

Campo

DT_DESC

Tipo

C

Tamanho

30

Decimal

0

Formato

@!

Título

Desc. Prod.

Descrição

Descricao do Produto

Nível

0

Usado

Sim

Obrigatório

Não

Browse

Não

When

.F.

Relação

POSICIONE(“SB1″,1,(XFILIAL(“SDT”)+SDT->DT_COD),”B1_DESC”)

Help

Descrição do Produto

Campo

DT_PRODFOR

Tipo

C

Tamanho

2

Decimal

0

Formato

@!

Título

Prod. Fornec

Descrição

Cod. Prod. do Fornecedor

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Não

Help

Código do produto do fornecedor

Campo

DT_DESCFOR

Tipo

C

Tamanho

30

Decimal

0

Formato

@!

Título

Desc. Fornec

Descrição

Desc. Produto Fornecedor

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Sim

Help

Descrição do Produto do Fornecedor

Campo

DT_FORNEC

Tipo

C

Tamanho

6

Decimal

0

Formato

@!

Título

Forn/Cliente

Descrição

Codigo do Forn/Cliente

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Código do Fornecedor/Cliente

Campo

DT_LOJA

Tipo

C

Tamanho

2

Decimal

0

Formato

@!

Título

Loja

Descrição

Loja do Forn/Cliente

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Loja do Fornecedor Cliente

Campo

DT_DOC

Tipo

C

Tamanho

2

Decimal

0

Formato

@!

Título

Documento

Descrição

Numero do Documento/Nota

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

Numero do Documento/Nota

Campo

DT_SERIE

Tipo

C

Tamanho

3

Decimal

0

Formato

@!

Título

Serie

Descrição

Serie da Nota Fiscal

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Não

Help

Serie da Nota Fiscal

Campo

DT_CNPJ

Tipo

C

Tamanho

14

Decimal

0

Formato

Título

CNPJ Fornece

Descrição

CNPJ do Fornecedor

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Help

CNPJ do Fornecedor

Campo

DT_QUANT

Tipo

N

Tamanho

11

Decimal

2

Formato

@E 99,999,999.99

Título

Quantidade

Descrição

Quantidade do Produto

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Sim

Help

Filial do Sistema

Campo

DT_VUNIT

Tipo

N

Tamanho

14

Decimal

2

Formato

@E 99,999,999,999.99

Título

Vlr.Unitario

Descrição

Valor Unitario

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Sim

Help

Valor unitário do Item

Campo

DT_TOTAL

Tipo

N

Tamanho

14

Decimal

2

Formato

@E 99,999,999,999.99

Título

Vlr.Total

Descrição

Valor Total

Nível

1

Usado

Não

Obrigatório

Não

Browse

Não

Val. Sistema

Positivo()

Help

Filial do Sistema

·         Tabela SA5 – Amarração Produto x Fornecedor

Campo

A5_TESBP

Tipo

C

Tamanho

3

Decimal

0

Formato

@9

Título

TE p/ Bonif.

Descrição

Tp.Entr. para Bonificacao

Nível

1

Usado

Sim

Obrigatório

Não

Browse

Sim

Help

Código do Tp. Entrada para Bonificação.

3.   Criação de tabela no arquivo SX2– Tabelas:

Chave

Nome

Modo

PYME

SDS

Cabeçalho importação XML NF-e

E

S

SDT

Itens importação XML NF-e

E

S

4.   Criação ou Alteração de Índices no arquivo SIX – Índices:

Índice

SDS

Ordem

1

Chave

DS_FILIAL+DS_DOC+DS_SERIE+DS_FORNEC+DS_LOJA

Descrição

Numero+Serie+Fornecedor+Loja

Proprietário

S

Índice

SDS

Ordem

2

Chave

DS_FILIAL+DS_CHAVENF

Descrição

Chave Acess.

Proprietário

S

Índice

SDT

Ordem

1

Chave

DT_FILIAL+DT_CNPJ+DT_FORNEC+DT_LOJA+DT_DOC+DT_SERIE

Descrição

CNPJ Fornece+Forn/Cliente+Loja+Documento+Serie

Proprietário

S

Índice

SDT

Ordem

2

Chave

DT_FILIAL+DT_FORNEC+DT_LOJA+DT_DOC+DT_SERIE+DT_PRODFOR

Descrição

Fornecedor+Loja+Documento+Serie+Prod. Fornec

Proprietário

S

Índice

SDT

Ordem

3

Chave

DT_FILIAL+DT_FORNEC+DT_LOJA+DT_DOC+DT_SERIE+DT_COD

Descrição

Fornecedor+Loja+Documento+Serie+Prod.

Proprietário

S

5.   Criação ou Alteração no arquivo SX6 – Parâmetros:

Nome da Variável

MV_TABSUS (X6_VAR)

Tipo

Caracter (X6_TIPO)

Descrição

Código da Tabela de Preços ‘GDB’ correspondente (X6_DESCRIC + X6_DESC1 + X6_DESC2)

Valor Padrão

“EX: 000099” (X6_CONTEUD)

Nome da Variável

MV_XMLCFPC (X6_VAR)

Tipo

Caracter (X6_TIPO)

Descrição

Identifica os CFOPs de venda que serão tratados como bonificação na importação dos XML de NFe.

Valor Padrão

“EX: 6102*6103*5102*2910” (X6_CONTEUD)

. Procedimentos para Utilização

Exemplo:

1.    No módulo Compras (SIGACOM) acesse Atualizações/ Movimentos/ Pré-nota de entrada (MATA140).

O sistema apresenta a janela de Pré-Notas de Entrada cadastradas.

2.    Clique em Entrada NF-e

3.    Informe os parâmetros para filtro das Notas já importadas

4.    Será exibida a tela com os XML carregados contendo as opções de botões.

1 – Visualizar

2 – Vincular Pedido

3 – Gerar Docto

4 – Legenda

5 – Filtrar

6 – Importar

7 – Excluir

8 – Sair

Importação Manual de XML NF-e:

Criar os seguintes diretórios no Rootpath do Protheus:

XMLNFE\NEW\ -> Caminho onde serão localizados os arquivos para serem importados.

XMLNFE\OLD\ -> Caminho para onde serão enviados os XMLs Lidos pela rotina.

XMLNFE\ERR\ ->Caminho para onde serão enviados os XMLs com erros encontrados pela rotina.

1.    Clique no botão Importar localizado na tela de XML carregados.

2.    Informe o caminho para leitura do arquivo XML e confirme, serão importados para a tela do XML carregados os dados da Nota Fiscal eletrônica.

Observação:

Caso a rotina não encontre os diretórios no momento da importação, eles serão criados automaticamente.

Selecione  Pedido de compra:

Vincular Pedido

1.    Selecione a nota fiscal e clique em Vincular Pedido

O Sistema apresenta a tela com os itens da nota.

2.    Escolha o item que deseja selecionar o(s) pedido(s) e clique em Selecionar Pedido, o programa irá procurar pedidos de compra que se identifiquem com o item da nota fiscal, caso não identifique nenhum pedido de compra correspondente, o programa exibira um aviso Informando que não foi identificado nenhum pedido de compra para o item da nota fiscal.

3.    Caso encontre um ou mais pedidos, será exibida a tela para seleção de quantidade de itens por pedido de compra.

4.    Dê um duplo clique, ou Enter para selecionar a quantidade. Nesta tela usuário também tem opção de visualizar o pedido de compra.

5.     Selecione o pedido desejado e clique em Visualizar Pedido.

É exibida a visualização padrão de pedido de compra.

6.    Para finalizar a seleção de pedidos de compra, preencha os pedidos e quantidades corretas e clique em

OK.

Observação:

O MV_PCNFE define se é obrigatória a amarração de pedidos de compra à Nota fiscal. Caso esteja configurado para SIM, na geração da pré-nota, é verificado se existe algum item sem pedido de compra,

Desfazer amarração do produto

Esta opção possibilita ao usuário a alteração/correção da amarração de Produto x Prod. Fornecedor, caso o relacionamento dos produtos esteja cadastrado incorretamente nas tabelas de relação, ou que, no momento da seleção manual da amarração, o usuário tenha relacionado incorretamente o produto correspondente.

1.    Para desfazer a amarração, selecione o registro e clique em Desfazer amarração do produto.

2.    O sistema informa que, caso confirme desfazer a relação do produto, todas as relações feitas deste produto com pedidos de compra serão desconsideradas.                  3.Clique em Sim para confirmar

4.    É exibida a tela para seleção do produto que será a nova amarração deste produto por fornecedor

5.    Escolha a o produto correspondente e confirme clicando em “Ok”

6.    Veja que o produto correspondente ao produto do fornecedor foi modificado alterando assim a antiga amarração.

Visualizar Nota

1.    Para visualizar a nota, selecione no grid a nota desejada e clique em Visualizar

2.    É exibida a tela com os dados do cabeçalho da Nota, Itens da Nota e Rodapé com informações da Nota Fiscal Eletrônica.

Gerar Pré-Nota

1.    Para gerar a Pré-nota de entrada. Selecione o registro e clique em “Gerar Pré-nota”

2.    Exibira a tela visualizando todos os dados, itens, e informações da nota.

3.    Para confirmar clique em Ok na barra superior.

4.    Aguarde o término do processo da criação de pré-nota de entrada.

Observação:

Na importação do XML a rotina não identifique a qual produto está amarrado o produto do fornecedor, os campos Cód. produto e Descrição estarão vazios.

Selecione o item e clique em “Selecionar Produto”. Na tela de consulta, escolha a qual produto se refere o item da nota fiscal e confirme clicando em “OK”.

Legenda

Exibe tela de legenda com a correspondência das cores dos faróis: Verde corresponde a documento liberado para pré-nota, Azul corresponde documentos de bonificação liberado para geração do documento de entrada e Vermelho corresponde a Nota fiscal processada, já gerou Pré-Nota.

Observação:

Observe que só são permitidas as opções Vincular Pedido e Gerar Docto para os registros que tenham o status Apto. a gerar Pré-Nota ou Documento de entrada, caso contrário, os botões desta rotina estão bloqueados. . Informações Técnicas

Tabelas Utilizadas

SA5 – Produtos X Fornecedores

SDS – Cabeçalho importação XML NF-e

SDT – Itens importação XML NF-e

SF1 – Cabeçalho das NF de entrada

SD1 – Itens das NF de entrada

Número do Plano

000000106212011 – 00

Fonte: TDN

Permissão de pasta em linha de comando – Microsoft

Para executar está alteração você precisa ter privilegios de Admin  na maquina.

Segue um exemplo:

 

 

C:\Windows\system32>net share NomeCompartilhamento=c:\arquivos /GRANT:Alex,FULL

No lugar de NomeCompartilhamento vc digita o nome que vai aparecer na rede
c:\arquivos é o nome da pasta que vc quer compartilhar, troque pelo endereço que vai usar
/Grant:Alex,FULL - Nesse caso Alex é o nome de usuario que poderá usar a pasta compartilhada, e no lugar de FULL
vc pode usar READ ou CHANGE mas não use espaço depois da (,) virgula.
ainda tem uma opção (Frescura...) REMARK:"texto" onde vc pode inserir um comentario no compartilhamento
exemplo: C:\Windows\system32>net share MyFolder=c:\users\bill\MyFolder /GRANT:fred,FULL /REMARK:"Minha pasta compartilhada"
Se a dica resolver seu problema dê um sinal de positio ai pra mim, t+

Ponto de Função

#INCLUDE “rwmake.ch”
////////////////////////////////////////////////////
/* PONTO DE ENTRADA RECLOCK(“SB5”,.T.)
//INCLLUSÃO RECLOCK(“SB5”,.F.)
//EXCLUSÃO/ALTERAÇÃO
*/ ////////////////////////////////////////////////////
User function MT010INC()
LOCAL aArea := GETAREA()
RECLOCK(“SB5”,.T.) //INCLLUSÃO
SB5->B5_FILIAL:= XFilial(“SB5”)
SB5->B5_COD:= SB1->B1_COD
SB5->B5_CEME:= SB1->B1_DESC msginfo(“Voce acabou de incluir um produto”) MSUNLOCK()
RestArea(aArea)
Return

Primeira aula ADVPL – EXEC01

//User Function usado para criar funções similres a sub Programas

User Function Exerc01()

Local aArray := {{“Maria”,10,7,15,31},;
{“Gisele”,26,26,26,26},;
{“Cleiton”,9,9,9,9},;
{“Jose”,15,16,21,33}}

Local nX := 0
Local cString:=””
for nX := 1 To  Len (aArray)

Msginfo(Calcula (aArray[nX]))

Next
Static Function Calcula (aArray)
Local nMedia:=0
Local cStatus:=””
Local cString:=””
nMedia := (aArray[2]+aArray[3]+aArray[4]+aArray[5])/4
Do case
Case nMedia >=25
cStatus :=”Aprovado”
case nMedia <10
cStatus :=”Reprovado”
case nMedia>=10 .And. nMedia <25
cStatus:=”Exame”

EndCase

Return cString:= aArray[1]+” – Media: “+cValToChar(nMedia)+” – “+cStatus

Return

Relatório de entrada e saída por tipo de produtos

#INCLUDE “rwmake.ch”
#INCLUDE “topconn.ch”
/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³NOVO2 º Autor ³ AP6 IDE º Data ³ 03/03/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescricao ³ Codigo gerado pelo AP6 IDE. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ AP6 IDE º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/

User Function RELPROQ

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Declaracao de Variaveis ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Local cDesc1 := “Este programa tem como objetivo imprimir relatorio ”
Local cDesc2 := “de acordo com os parametros informados pelo usuario.”
Local cDesc3 := “RELATORIO DE PRODUTO x QUANTIDADE”
Local cPict := “”
Local titulo := “RELATORIO DE PRODUTO x QUANTIDADE”
Local nLin := 80

Local Cabec1 := “PRODUTO: QTDE. SAIDA: QTDE. ENTRADA:”
Local Cabec2 := “”
Local imprime := .T.
Local aOrd := {}
Private lEnd := .F.
Private lAbortPrint := .F.
Private CbTxt := “”
Private limite := 80
Private tamanho := “P”
Private nomeprog := “NOME” // Coloque aqui o nome do programa para impressao no cabecalho
Private nTipo := 18
Private aReturn := { “Zebrado”, 1, “Administracao”, 2, 2, 1, “”, 1}
Private nLastKey := 0
Private cbtxt := Space(10)
Private cbcont := 00
Private CONTFL := 01
Private m_pag := 01
Private wnrel := “NOME” // Coloque aqui o nome do arquivo usado para impressao em disco

Private cString := “SB1”

dbSelectArea(“SB1″)
dbSetOrder(1)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Monta a interface padrao com o usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

wnrel := SetPrint(cString,NomeProg,””,@titulo,cDesc1,cDesc2,cDesc3,.T.,aOrd,.T.,Tamanho,,.T.)

If nLastKey == 27
Return
Endif

SetDefault(aReturn,cString)

If nLastKey == 27
Return
Endif

nTipo := If(aReturn[4]==1,15,18)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Processamento. RPTSTATUS monta janela com a regua de processamento. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

RptStatus({|| RunReport(Cabec1,Cabec2,Titulo,nLin) },Titulo)
Return

/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºFun‡„o ³RUNREPORT º Autor ³ AP6 IDE º Data ³ 03/03/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescri‡„o ³ Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS º±±
±±º ³ monta a janela com a regua de processamento. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ Programa principal º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/

Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)

Local nOrdem
Local nTotal :=0
Local cEst := “”
Local cQuery := “”
Local nSubTotal :=0

dbSelectArea(cString)
dbSetOrder(1)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ SETREGUA -> Indica quantos registros serao processados para a regua ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

SetRegua(RecCount())

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Posicionamento do primeiro registro e loop principal. Pode-se criar ³
//³ a logica da seguinte maneira: Posiciona-se na filial corrente e pro ³
//³ cessa enquanto a filial do registro for a filial corrente. Por exem ³
//³ plo, substitua o dbGoTop() e o While !EOF() abaixo pela sintaxe: ³
//³ ³
//³ dbSeek(xFilial()) ³
//³ While !EOF() .And. xFilial() == A1_FILIAL ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//Cria um indice temporario para o estado ao cria o indice ele é ordenado automaticamente
//IndRegua (“SA2″, cArqTemp,”A2_FILIAL+A2_EST”)
//FERASE (cArqTemp+OrdBagExt())
//=========================================================================
//==========================================================================
//QUERY
/*
cAlias := GetNextAlias()
cQuery := ‘ SELECT B1_COD,B1_DESC,SUM(D1_QUANT) ENTRADA, SUM(D2_QUANT) SAIDA ‘
cQuery += ” FROM SB1990 SB1, SD1990 SD1, SD2990 SD2 ”
cQuery += ” WHERE B1_COD = D1_COD AND B1_COD = D2_COD AND ”
cQuery += ” SB1.D_E_L_E_T_=” AND SD1.D_E_L_E_T_=” SD2.AND D_E_L_E_T_=” ”
cQuery += ” GROUP BY B1_COD,B1_DESC ”
cQuery += ” ORDER BY B1_COD ”
TCQUERY cQuery NEW ALIAS (cAlias)
*/
//=============================================================================
dbSelectArea(“SB1”)
dbGoTop()
cEst := B1_COD // Inicia a variavel que acumula o com o 1° estado vindo da tabela SA2
cCodProd := B1_COD
While !EOF()

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica o cancelamento pelo usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If lAbortPrint
@nLin,00 PSAY “*** CANCELADO PELO OPERADOR ***”
Exit
Endif

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Impressao do cabecalho do relatorio. . . ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas…
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
nLin := 8
Endif

// Coloque aqui a logica da impressao do seu programa…
// Se o primeiro estado igual ao proximo imprime se não inicia contador de subtotal
/*
IF cEst B1_COD
nLin := nLin + 3
@ nLin, 00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
nLin := nLin + 2
nSubTotal := 0
cEst := B1_COD
ENDIF
*/
// Utilize PSAY para saida na impressora. Por exemplo:
// @nLin,00 PSAY SA1->A1_COD
nLin := nLin + 1 // Avanca a linha de impressao
// nTotal := nTotal + 1 //Totalizador de registros
// nSubTotal := nSubTotal + 1 //Totalizador de subtotais de registros

// @nLin,00 PSAY (cAlias)->B1_COD // @ para imprimir
// @nLin,10 PSAY (cAlias)->D2_QUANT
// @nLin,20 PSAY (cAlias)->D1_QUANT

aSaldo := MySaldo(B1_Cod)

@nLin, 00 PSAY SB1->B1_Cod+” – “+SB1->B1_Desc
@nLin,pcol ()+2 PSAY TRANSFORM (aSaldo [1], “@E 999,999”)
@nLin,pcol ()+2 PSAY TRANSFORM (aSaldo [2], “@E 999,999”)

dbSelectArea(“SB1”)
dbSkip() // Avanca o ponteiro do registro no arquivo
EndDo
@ nLin+3,00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
@ nLin+4,00 PSAY “TOTAL GERAL : “+ cValToChar(nTotal)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Finaliza a execucao do relatorio… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

SET DEVICE TO SCREEN

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Se impressao em disco, chama o gerenciador de impressao… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif

MS_FLUSH()

Return

Static FUNCTION MySaldo(cCodProd)

Local cQuery := “”
Local aRetorno := {0,0}
Local cAliasD1 := GetNextAlias()
Local cAliasD2 := GetNextAlias()

cQuery := ” SELECT SUM(D1_QUANT) ENTRADA ”
cQuery += ” FROM “+RetSqlName(“SD1″) + ” ”
cQuery += ” WHERE D1_COD = ‘”+cCodProd+”‘ AND D_E_L_E_T_ = ” ”
TCQUERY cQuery NEW ALIAS (cAliasD1)

If !(cAliasD1)->(Eof())
aRetorno[1] := (cAliasD1)->Entrada
Endif
(cAliasD1)->(dbCloseArea())

cQuery := ” SELECT SUM(D2_QUANT) SAIDA ”
cQuery += ” FROM “+RetSqlName(“SD2″) + ” ”
cQuery += ” WHERE D2_COD = ‘”+cCodProd+”‘ AND D_E_L_E_T_ = ” ”
TCQUERY cQuery NEW ALIAS (cAliasD2)

If !(cAliasD2)->(Eof())
aRetorno[2] := (cAliasD2)->SAIDA
Endif
(cAliasD2)->(dbCloseArea())

Return ( aRetorno )

Ponto de Função

#INCLUDE “rwmake.ch”

////////////////////////////////////////////////////
/*
PONTO DE ENTRADA
RECLOCK(“SB5”,.T.) //INCLLUSÃO
RECLOCK(“SB5”,.F.) //EXCLUSÃO/ALTERAÇÃO
*/
////////////////////////////////////////////////////
user function MT010INC()
LOCAL aArea := GETAREA()
RECLOCK(“SB5”,.T.) //INCLLUSÃO
SB5->B5_FILIAL:= XFilial(“SB5”)
SB5->B5_COD:= SB1->B1_COD
SB5->B5_CEME:= SB1->B1_DESC
msginfo(“Voce acabou de incluir um produto”)
MSUNLOCK()
RestArea(aArea)
Return

Relatório de NFS com total por cliente

#INCLUDE “rwmake.ch”
#INCLUDE “topconn.ch”
/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³NOVO3 º Autor ³ AP6 IDE º Data ³ 03/03/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescricao ³ Codigo gerado pelo AP6 IDE. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ AP6 IDE º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/

User Function RELFISCAL

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Declaracao de Variaveis ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Local cDesc1 := “Este programa tem como objetivo imprimir relatorio ”
Local cDesc2 := “de acordo com os parametros informados pelo usuario.”
Local cDesc3 := “RELETORIO DE NOTAS FISCAIS”
Local cPict := “”
Local titulo := “RELETORIO DE NOTAS FISCAIS”
Local nLin := 80
Local Cabec1 := “NF/SERIE: DT.EMISSAO: CLIENTE:”
Local Cabec2 := “ITEM PRODUTO QTDE. P.UNIT. P.TOTAL”
Local imprime := .T.
Local imprime := .T.
Local aOrd := {}
Private lEnd := .F.
Private lAbortPrint := .F.
Private CbTxt := “”
Private limite := 80
Private tamanho := “P”
Private nomeprog := “NOME” // Coloque aqui o nome do programa para impressao no cabecalho
Private nTipo := 18
Private aReturn := { “Zebrado”, 1, “Administracao”, 2, 2, 1, “”, 1}
Private nLastKey := 0
Private cbtxt := Space(10)
Private cbcont := 00
Private CONTFL := 01
Private m_pag := 01
Private wnrel := “NOME” // Coloque aqui o nome do arquivo usado para impressao em disco

Private cString := “SD2”

dbSelectArea(“SD2”)
dbSetOrder(1)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Monta a interface padrao com o usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//PERGUNTE (“RELSD2″,.F.) // PERGUNTE
wnrel := SetPrint(cString,NomeProg,””,@titulo,cDesc1,cDesc2,cDesc3,.T.,aOrd,.T.,Tamanho,,.T.)

If nLastKey == 27
Return
Endif

SetDefault(aReturn,cString)

If nLastKey == 27
Return
Endif

nTipo := If(aReturn[4]==1,15,18)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Processamento. RPTSTATUS monta janela com a regua de processamento. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

RptStatus({|| RunReport(Cabec1,Cabec2,Titulo,nLin) },Titulo)
Return

/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºFun‡„o ³RUNREPORT º Autor ³ AP6 IDE º Data ³ 03/03/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescri‡„o ³ Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS º±±
±±º ³ monta a janela com a regua de processamento. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ Programa principal º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/

Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)

Local nOrdem
Local nSubTotal :=0
Local nTotal :=0
Local cEst := “”
Local cQuery := “”

dbSelectArea(cString)
dbSetOrder(1)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ SETREGUA -> Indica quantos registros serao processados para a regua ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

SetRegua(RecCount())

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Posicionamento do primeiro registro e loop principal. Pode-se criar ³
//³ a logica da seguinte maneira: Posiciona-se na filial corrente e pro ³
//³ cessa enquanto a filial do registro for a filial corrente. Por exem ³
//³ plo, substitua o dbGoTop() e o While !EOF() abaixo pela sintaxe: ³
//³ ³
//³ dbSeek(xFilial()) ³
//³ While !EOF() .And. xFilial() == A1_FILIAL ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//Cria um indice temporario para o estado ao cria o indice ele é ordenado automaticamente
cArqTemp := CriaTrab(Nil,.F.)
//IndRegua (“SA2″, cArqTemp,”A2_FILIAL+A2_EST”)
//FERASE (cArqTemp+OrdBagExt())
//==========================================================================
//QUERY

cAlias := GetNextAlias() // Tabela temporaria para fazer o query
cQuery :=’ SELECT D2_ITEM,D2_DOC,D2_SERIE,D2_EMISSAO,D2_CLIENTE,D2_COD,D2_QUANT,D2_PRCVEN,D2_TOTAL,A1_NOME,B1_DESC ‘
cQuery +=” FROM ” + RetSqlName(“SD2″) + ” SD2, “+RetSqlName(“SA1″)+” SA1,”+RetSqlName(“SB1″)+” SB1″
cQuery +=” WHERE D2_CLIENTE = A1_COD AND D2_COD = B1_COD AND SD2.D_E_L_E_T_ = ” ”
TCQUERY cQuery NEW ALIAS (cAlias)

//=============================================================================
dbGoTop()
cEst := D2_CLIENTE // Inicia a variavel que acumula o com o 1° estado vindo da tabela SA2
While !EOF()

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica o cancelamento pelo usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If lAbortPrint
@nLin,00 PSAY “*** CANCELADO PELO OPERADOR ***”
Exit
Endif

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Impressao do cabecalho do relatorio. . . ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas…
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
nLin := 8
Endif

// Coloque aqui a logica da impressao do seu programa…
// Se o primeiro estado igual ao proximo imprime se não inicia contador de subtotal
IF cEst D2_CLIENTE
nLin := nLin + 3
@ nLin, 00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
nLin := nLin + 2
nSubTotal := 0
cEst := D2_CLIENTE
ENDIF
// Utilize PSAY para saida na impressora. Por exemplo:
// @nLin,00 PSAY SA1->A1_COD
nLin := nLin + 1 // Avanca a linha de impressao
nTotal := nTotal + 1 //Totalizador de registros
nSubTotal := nSubTotal + 1 //Totalizador de subtotais de registros

@nLin,00 PSAY (cAlias)->D2_DOC // @ para imprimir
@nLin,05 PSAY (cAlias)->D2_SERIE
@nLin,10 PSAY (cAlias)->D2_EMISSAO
@nLin,20 PSAY (cAlias)->D2_CLIENTE
@nLin,25 PSAY (cAlias)->D2_ITEM // @ para imprimir
@nLin,30 PSAY (cAlias)->B1_DESC
@nLin,40 PSAY (cAlias)->D2_QUANT
@nLin,50 PSAY (cAlias)->D2_PRCVEN
@nLin,60 PSAY (cAlias)->D2_TOTAL

dbSkip() // Avanca o ponteiro do registro no arquivo
EndDo
@ nLin+3,00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
@ nLin+4,00 PSAY “TOTAL GERAL : “+ cValToChar(nTotal)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Finaliza a execucao do relatorio… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

SET DEVICE TO SCREEN

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Se impressao em disco, chama o gerenciador de impressao… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif

MS_FLUSH()

Return

Relatório com totalizador individual por estado

#INCLUDE “protheus.ch”
#INCLUDE “topconn.ch”

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³NOVO2 º Autor ³ AP6 IDE º Data ³ 25/02/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescricao ³ Codigo gerado pelo AP6 IDE. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ AP6 IDE º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/

User Function RELF

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Declaracao de Variaveis ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Local cDesc1 := “Este programa tem como objetivo imprimir relatorio ”
Local cDesc2 := “de acordo com os parametros informados pelo usuario.”
Local cDesc3 := “CADASTRO DE FORNECEDORES”
Local cPict := “”
Local titulo := “CADASTRO DE FORNECEDORES”
Local nLin := 80

Local Cabec1 := “CODIGO NOME UF”
Local Cabec2 := “”
Local imprime := .T.
Local aOrd := {}
Private lEnd := .F.
Private lAbortPrint := .F.
Private CbTxt := “”
Private limite := 80
Private tamanho := “P”
Private nomeprog := “NOME” // Coloque aqui o nome do programa para impressao no cabecalho
Private nTipo := 18
Private aReturn := { “Zebrado”, 1, “Administracao”, 2, 2, 1, “”, 1}
Private nLastKey := 0
Private cbtxt := Space(10)
Private cbcont := 00
Private CONTFL := 01
Private m_pag := 01
Private wnrel := “NOME” // Coloque aqui o nome do arquivo usado para impressao em disco

Private cString := “SA2”

dbSelectArea(“SA2”)
dbSetOrder(1)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Monta a interface padrao com o usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

PERGUNTE (“RELSA2″,.F.)
wnrel := SetPrint(cString,NomeProg,”RELSA2”,@titulo,cDesc1,cDesc2,cDesc3,.T.,aOrd,.T.,Tamanho,,.T.)

If nLastKey == 27
Return
Endif

SetDefault(aReturn,cString)

If nLastKey == 27
Return
Endif

nTipo := If(aReturn[4]==1,15,18)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Processamento. RPTSTATUS monta janela com a regua de processamento. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

RptStatus({|| RunReport(Cabec1,Cabec2,Titulo,nLin) },Titulo)
Return

/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºFun‡„o ³RUNREPORT º Autor ³ AP6 IDE º Data ³ 25/02/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescri‡„o ³ Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS º±±
±±º ³ monta a janela com a regua de processamento. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ Programa principal º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
*/

Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)

Local nOrdem
Local nSubTotal :=0
Local nTotal :=0
Local cEst := “”
Local cQuery := “”

dbSelectArea(cString)
dbSetOrder(1)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ SETREGUA -> Indica quantos registros serao processados para a regua ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

SetRegua(RecCount())

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Posicionamento do primeiro registro e loop principal. Pode-se criar ³
//³ a logica da seguinte maneira: Posiciona-se na filial corrente e pro ³
//³ cessa enquanto a filial do registro for a filial corrente. Por exem ³
//³ plo, substitua o dbGoTop() e o While !EOF() abaixo pela sintaxe: ³
//³ ³
//³ dbSeek(xFilial()) ³
//³ While !EOF() .And. xFilial() == A1_FILIAL ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//=========================================================================
//Cria um indice temporario para o estado ao cria o indice ele é ordenado automaticamente
cArqTemp := CriaTrab(Nil,.F.)
//IndRegua (“SA2″, cArqTemp,”A2_FILIAL+A2_EST”)

//FERASE (cArqTemp+OrdBagExt())
//==========================================================================
/*
cAlias := GetNextAlias() // Tabela temporaria para fazer o query

cQuery := ” SELECT * FROM “+RetSqlName(“SA2″) // Seleciona qual empresa da query da tabela
cQuery += ” WHERE D_E_L_E_T_ = ” ”
cQuery += ” ORDER BY A2_FILIAL, A2_EST”
*/
cAlias := GetNextAlias() // Tabela temporaria para fazer o query

cQuery := ” SELECT * FROM “+RetSqlName(“SA2″) // Seleciona qual empresa da query da tabela
cQuery += ” WHERE A2_COD between ‘”+MV_PAR01+”‘ AND ‘”+MV_PAR02+”‘”
cQuery += ” ORDER BY A2_FILIAL, A2_COD”

TCQUERY cQuery NEW ALIAS (cAlias)

dbGoTop()
cEst := A2_EST // Inicia a variavel que acumula o estado com o 1° estado vindo da tabela SA2
While !EOF()

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica o cancelamento pelo usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If lAbortPrint
@nLin,00 PSAY “*** CANCELADO PELO OPERADOR ***”
Exit
Endif

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Impressao do cabecalho do relatorio. . . ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas…
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
nLin := 8
Endif

// Coloque aqui a logica da impressao do seu programa…
// Se o primeiro estado igual ao proximo imprime se não inicia contador de subtotal
IF cEst A2_EST
nLin := nLin + 3
@ nLin, 00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
nLin := nLin + 2
nSubTotal := 0
cEst := A2_EST
ENDIF

// Utilize PSAY para saida na impressora. Por exemplo:
// @nLin,00 PSAY SA1->A1_COD
nLin := nLin + 1 // Avanca a linha de impressao
nTotal := nTotal + 1 //Totalizador de registros
nSubTotal := nSubTotal + 1 //Totalizador de subtotais de registros

@nLin,00 PSAY (cAlias)->A2_COD // @ para imprimir
@nLin,10 PSAY (cAlias)->A2_NOME
@nLin,50 PSAY (cAlias)->A2_EST

dbSkip() // Avanca o ponteiro do registro no arquivo
EndDo
@ nLin+3,00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
@ nLin+4,00 PSAY “TOTAL GERAL : “+ cValToChar(nTotal)

//dbclosearea

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Finaliza a execucao do relatorio… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

SET DEVICE TO SCREEN

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Se impressao em disco, chama o gerenciador de impressao… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif

MS_FLUSH()

Return

Relatório com totalizador individual por tipo de produto

#INCLUDE “rwmake.ch”
#INCLUDE “topconn.ch”

/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºPrograma ³NOVO3 º Autor ³ AP6 IDE º Data ³ 25/02/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescricao ³ Codigo gerado pelo AP6 IDE. º±±
±±º ³ º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ AP6 IDE º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/

User Function RELP

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Declaracao de Variaveis ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Local cDesc1 := “Este programa tem como objetivo imprimir relatorio ”
Local cDesc2 := “de acordo com os parametros informados pelo usuario.”
Local cDesc3 := “CADASTRO DE PRODUTOS”
Local cPict := “”
Local titulo := “CADASTRO DE PRODUTOS”
Local nLin := 80

Local Cabec1 := “CODIGO NOME TIPO”
Local Cabec2 := “”
Local imprime := .T.
Local aOrd := {}
Private lEnd := .F.
Private lAbortPrint := .F.
Private CbTxt := “”
Private limite := 80
Private tamanho := “P”
Private nomeprog := “NOME” // Coloque aqui o nome do programa para impressao no cabecalho
Private nTipo := 18
Private aReturn := { “Zebrado”, 1, “Administracao”, 2, 2, 1, “”, 1}
Private nLastKey := 0
Private cbtxt := Space(10)
Private cbcont := 00
Private CONTFL := 01
Private m_pag := 01
Private wnrel := “NOME” // Coloque aqui o nome do arquivo usado para impressao em disco

Private cString := “SB1”

dbSelectArea(“SB1”)
dbSetOrder(1)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Monta a interface padrao com o usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

PERGUNTE (“RELSB1″,.F.)
wnrel := SetPrint(cString,NomeProg,”RELSB1”,@titulo,cDesc1,cDesc2,cDesc3,.T.,aOrd,.T.,Tamanho,,.T.)

If nLastKey == 27
Return
Endif

SetDefault(aReturn,cString)

If nLastKey == 27
Return
Endif

nTipo := If(aReturn[4]==1,15,18)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Processamento. RPTSTATUS monta janela com a regua de processamento. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

RptStatus({|| RunReport(Cabec1,Cabec2,Titulo,nLin) },Titulo)
Return

/*/
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±±
±±ºFun‡„o ³RUNREPORT º Autor ³ AP6 IDE º Data ³ 25/02/12 º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºDescri‡„o ³ Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS º±±
±±º ³ monta a janela com a regua de processamento. º±±
±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±±
±±ºUso ³ Programa principal º±±
±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
/*/

Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)

Local nOrdem
Local nSubTotal :=0
Local nTotal :=0
Local cEst := “”
Local cQuery := “”

dbSelectArea(cString)
dbSetOrder(1)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ SETREGUA -> Indica quantos registros serao processados para a regua ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

SetRegua(RecCount())

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Posicionamento do primeiro registro e loop principal. Pode-se criar ³
//³ a logica da seguinte maneira: Posiciona-se na filial corrente e pro ³
//³ cessa enquanto a filial do registro for a filial corrente. Por exem ³
//³ plo, substitua o dbGoTop() e o While !EOF() abaixo pela sintaxe: ³
//³ ³
//³ dbSeek(xFilial()) ³
//³ While !EOF() .And. xFilial() == A1_FILIAL ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
//=========================================================================
//Cria um indice temporario para o estado ao cria o indice ele é ordenado automaticamente
cArqTemp := CriaTrab(Nil,.F.)
//IndRegua (“SA2″, cArqTemp,”A2_FILIAL+A2_EST”)

//FERASE (cArqTemp+OrdBagExt())
//==========================================================================
/*
cAlias := GetNextAlias() // Tabela temporaria para fazer o query

cQuery := ” SELECT * FROM “+RetSqlName(“SA2″) // Seleciona qual empresa da query da tabela
cQuery += ” WHERE D_E_L_E_T_ = ” ”
cQuery += ” ORDER BY A2_FILIAL, A2_EST”
*/
cAlias := GetNextAlias() // Tabela temporaria para fazer o query

cQuery := ” SELECT * FROM “+RetSqlName(“SB1″) // Seleciona qual empresa da query da tabela
cQuery += ” WHERE B1_COD between ‘”+MV_PAR01+”‘ AND ‘”+MV_PAR02+”‘”
cQuery += ” ORDER BY B1_FILIAL, B1_COD”

TCQUERY cQuery NEW ALIAS (cAlias)

dbGoTop()
cEst := B1_TIPO // Inicia a variavel que acumula o estado com o 1° estado vindo da tabela SA2
While !EOF()

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Verifica o cancelamento pelo usuario… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If lAbortPrint
@nLin,00 PSAY “*** CANCELADO PELO OPERADOR ***”
Exit
Endif

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Impressao do cabecalho do relatorio. . . ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas…
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
nLin := 8
Endif

// Coloque aqui a logica da impressao do seu programa…
// Se o primeiro estado igual ao proximo imprime se não inicia contador de subtotal
IF cEst B1_TIPO
nLin := nLin + 3
@ nLin, 00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
nLin := nLin + 2
nSubTotal := 0
cEst := B1_TIPO
ENDIF
// Utilize PSAY para saida na impressora. Por exemplo:
// @nLin,00 PSAY SA1->A1_COD
nLin := nLin + 1 // Avanca a linha de impressao
nTotal := nTotal + 1 //Totalizador de registros
nSubTotal := nSubTotal + 1 //Totalizador de subtotais de registros

@nLin,00 PSAY (cAlias)->B1_COD // @ para imprimir
@nLin,10 PSAY (cAlias)->B1_DESC
@nLin,50 PSAY (cAlias)->B1_TIPO

dbSkip() // Avanca o ponteiro do registro no arquivo
EndDo
@ nLin+3,00 PSAY “TOTAL : “+ cValToChar(nSubTotal)
@ nLin+4,00 PSAY “TOTAL GERAL : “+ cValToChar(nTotal)

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Finaliza a execucao do relatorio… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

SET DEVICE TO SCREEN

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Se impressao em disco, chama o gerenciador de impressao… ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif

MS_FLUSH()

Return

Primeiro relatório com Acumulador – Total

#INCLUDE “protheus.ch” /*/ ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±± ±±ºPrograma ³NOVO3 º Autor ³ AP6 IDE º Data ³ 11/02/12 º±± ±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±± ±±ºDescricao ³ Codigo gerado pelo AP6 IDE. º±± ±±º ³ º±± ±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±± ±±ºUso ³ AP6 IDE º±± ±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±± ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß /*/ User Function RELCLIENTES //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Declaracao de Variaveis ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Local cDesc1 := “Este programa tem como objetivo imprimir relatorio ” Local cDesc2 := “de acordo com os parametros informados pelo usuario.” Local cDesc3 := “CADASTRO DE CLIENTES” Local cPict := “” Local titulo := “CADASTRO DE CLIENTES” Local nLin := 80 Local Cabec1 := “CODIGO NOME UF” Local Cabec2 := “” Local imprime := .T. Local aOrd := {} Private lEnd := .F. Private lAbortPrint := .F. Private CbTxt := “” Private limite := 80 Private tamanho := “P” Private nomeprog := “NOME” // Coloque aqui o nome do programa para impressao no cabecalho Private nTipo := 18 Private aReturn := { “Zebrado”, 1, “Administracao”, 2, 2, 1, “”, 1} Private nLastKey := 0 Private cbtxt := Space(10) Private cbcont := 00 Private CONTFL := 01 Private m_pag := 01 Private wnrel := “NOME” // Coloque aqui o nome do arquivo usado para impressao em disco Private cString := “SA1” dbSelectArea(“SA1″) dbSetOrder(1) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Monta a interface padrao com o usuario… ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ wnrel := SetPrint(cString,NomeProg,””,@titulo,cDesc1,cDesc2,cDesc3,.T.,aOrd,.T.,Tamanho,,.T.) If nLastKey == 27 Return Endif SetDefault(aReturn,cString) If nLastKey == 27 Return Endif nTipo := If(aReturn[4]==1,15,18) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Processamento. RPTSTATUS monta janela com a regua de processamento. ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ RptStatus({|| RunReport(Cabec1,Cabec2,Titulo,nLin) },Titulo) Return /*/ ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ±±ÉÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍ»±± ±±ºFun‡„o ³RUNREPORT º Autor ³ AP6 IDE º Data ³ 11/02/12 º±± ±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍ͹±± ±±ºDescri‡„o ³ Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS º±± ±±º ³ monta a janela com a regua de processamento. º±± ±±ÌÍÍÍÍÍÍÍÍÍÍØÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹±± ±±ºUso ³ Programa principal º±± ±±ÈÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ±± ±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±± ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß /*/ Static Function RunReport(Cabec1,Cabec2,Titulo,nLin) Local nOrdem Local nTReg :=0 dbSelectArea(cString) dbSetOrder(1) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ SETREGUA -> Indica quantos registros serao processados para a regua ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SetRegua(RecCount()) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Posicionamento do primeiro registro e loop principal. Pode-se criar ³ //³ a logica da seguinte maneira: Posiciona-se na filial corrente e pro ³ //³ cessa enquanto a filial do registro for a filial corrente. Por exem ³ //³ plo, substitua o dbGoTop() e o While !EOF() abaixo pela sintaxe: ³ //³ ³ //³ dbSeek(xFilial()) ³ //³ While !EOF() .And. xFilial() == A1_FILIAL ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ dbGoTop() While !EOF() //end of file //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Verifica o cancelamento pelo usuario… ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ If lAbortPrint @nLin,00 PSAY “*** CANCELADO PELO OPERADOR ***” Exit Endif //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Impressao do cabecalho do relatorio. . . ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ If nLin > 55 // Salto de Página. Neste caso o formulario tem 55 linhas… Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo) nLin := 8 Endif // Coloque aqui a logica da impressao do seu programa… // Utilize PSAY para saida na impressora. Por exemplo: @nLin,00 PSAY SA1->A1_COD // @ para imprimir @nLin,10 PSAY SA1->A1_NOME nLin := nLin + 1 // Avanca a linha de impressao nTReg := nTreg + 1 dbSkip() // Avanca o ponteiro do registro no arquivo EndDo @ nLin+3,00 PSAY “TOTAL “+ cValToChar(nTReg) //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Finaliza a execucao do relatorio… ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ SET DEVICE TO SCREEN //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ //³ Se impressao em disco, chama o gerenciador de impressao… ³ //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ If aReturn[5]==1 dbCommitAll() SET PRINTER TO OurSpool(wnrel) Endif MS_FLUSH() Return

User function para calculo de percentual de Faturamento

User Function Exerc03()
Local nX := 0
Local aArray := {{“Joao”    ,1000.00,  1},;
{“Maria”   , 620.00,  7},;
{“Jose”    ,1100.00,  2},;
{“Pedro”   ,3500.00, 15},;
{“Marcia”  , 720.00,  9},;
{“Patricia”, 400.00,  1},;
{“Antonio” , 900.00,  3}}

aArray := Asort (aArray ,,, { |x,y| x[1] < y[1]})// Colocar em ordema alfabetica

For nX := 1 To  Len (aArray)
Msginfo(CalculaReajusteSalarial (aArray[nX]))    //Passando a linha do Array para a função calcula data (aArray[nX]))
Next
Return
//====================================================================================================================================================================
Static Function CalculaReajusteSalarial (aArray)
Local cStatus   :=”
Local cString   :=”
Local nReajuste :=0
Local nSalario  :=aArray[2]
Local nTempoCasa:=aArray[3]

Do Case
//——————————ate 660
Case nSalario < 660
nReajuste:= nSalario * 1.15
If nTempoCasa > 2
nReajuste:= nReajuste * 1.08
cStatus:=”C/ Bonus”
else
cStatus:=”S/ Bonus”
Endif
//——————————-ate 1.000
Case nSalario < 1000
nReajuste:= nSalario * 1.10
If nTempoCasa > 2
nReajuste:= nReajuste * 1.08
cStatus:=”C/ Bonus”
else
cStatus:=”S/ Bonus”
Endif
//——————————-mais de 1.000
Otherwise
nReajuste:= nSalario * 1.06
If nTempoCasa > 2
nReajuste:= nReajuste * 1.08
cStatus:=”C/ Bonus”
else
cStatus:=”S/ Bonus”
Endif
endcase

Return cString:= cValToChar(aArray[1])+” – Salario – “+cValToChar(aArray[2])+” – Reajuste – “+cValToChar(nReajuste)+cStatus

Exerc Data verificar se a pessoa é maior de 18 e ordena por nome

User Function Exerc02()
Local nX := 0
Local aArray := {{“Maria” ,”21/04/74″},;
{ “Joao”  ,”18/01/91″},;
{ “Pedro” ,”03/01/69″},;
{ “Joana” ,”06/09/93″},;
{ “Karina”,”27/12/90″},;
{ “Manoel”,”21/06/77″},;
{ “Silvio”,”07/07/95″}}
SET DATE BRITISH

aArray := Asort (aArray ,,, { |x,y| x[1] < y[1]})// Colocar em ordema alfabetica

For nX := 1 To  Len (aArray)
Msginfo(CalculaData (aArray[nX]))    //Passando a linha do Array para a função calcula data (aArray[nX]))
Next
Return
//====================================================================================================================================================================
Static Function CalculaData (aArray)

Local dData := ctod(“11/02/94″)
Local cStatus:=””

If dData >= ctod (aArray[2])
cStatus:=”Maior”
else
cstatus:=”Menor”
Endif
Return cString:= cValToChar(aArray[1])+” – “+cValToChar(aArray[2])+” – “+cStatus

Verificar se a multiplicação de dois números resultam em PAR ou IMPAR

// Como verificar se o Array possui uma multiplicação de numeros igual a Par ou Impar
User Function Exerc01()

Local aArray := {{2,5},{1,7},{3,3},{9,2}}

Local nX := 0
for nX := 1 To  Len (aArray)
Msginfo(CalculaPar (aArray[nX]))    // (aArray[nX]))
Next
Return
//====================================================================================================================================================================
Static Function CalculaPar (aArray)
Local nSoma:=0
Local nX:=0
Local cStatus:=””
Local cString:=””
nSoma := (aArray[1]*aArray[2])
If mod(nSoma,2)==0
cStatus:=”Par”
else
cstatus:=”Impar”
Endif

Return cString:= cValToChar(aArray[1])+”X”+cValToChar(aArray[2])+”=”+cValToChar(nSoma)+” – “+cStatus

Primeira aula ADVPL – EXEC01

//User Function usado para criar funções similres a sub Programas
User Function Exerc01()

Local aArray := {{“Maria”,10,7,15,31},;
{“Gisele”,26,26,26,26},;
{“Cleiton”,9,9,9,9},;
{“Jose”,15,16,21,33}}

Local nX := 0
for nX := 1 To  Len (aArray)
Msginfo(Calcula (aArray[nX]))
Next
Return
//====================================================================================================================================================================
Static Function Calcula (aArray)
Local nMedia:=0
Local cStatus:=””
Local cString:=””
nMedia := (aArray[2]+aArray[3]+aArray[4]+aArray[5])/4
Do case
Case nMedia >=25
cStatus :=”Aprovado”
case nMedia <10
cStatus :=”Reprovado”
case nMedia>=10 .And. nMedia <25
cStatus:=”Exame”

EndCase

Return cString:= aArray[1]+” – Media: “+cValToChar(nMedia)+” – “+cStatus

Cloud computing facilita serviços

Cloud computing, ou ‘web nas nuvem’ é uma expressão cada vez mais difundida entre os usuários de computador, uma vez que empresas de peso como Amazon e IBM já chegaram a anunciar planos e investimentos nesta área.
Para o jornalista, a ferramenta pode ser muito útil, pois o usuário não precisa se preocupar com o sistema operacional e hardware que está usando em seu computador pessoal, podendo acessar seus dados na web nas nuvem. Além de que, o trabalho corporativo e o compartilhamento de arquivos se tornam mais fáceis, uma vez que todas as informações se encontram no mesmo lugar.
A empresa IBM Smart Professional, que capacita estudantes e profissionais de tecnologia de informação (TI), trouxe no ano passado para o Brasil, o especialista em Cloud Computing, Raul Chong para uma série de apresentações. Segundo o especialista, grandes corporações já perceberam a praticidade de usar a ferramenta. “Muitas empresas estão apostando neste
conceito para criarem suas próprias nuvens na web, pagando um aluguel pela mesma, como é o caso da IBM, Amazon, Intel, Dell, HP, Google, Yahoo, Microsoft, entre outras. Com esta ferramenta não é mais preciso se prender a algum software, nem ao seu computador pessoal, basta ter acesso a internet”, explica Chong.
Porém, segundo o diretor da consultoria Thinkstrategies, Jeff Kaplan, por conta da cloud computing, as empresas exigirão novas habilidades e treinamentos dos técnicos em TI. “Os profissionais terão de se preocupar com gestão de fornecedores para avaliar os serviços corretamente, selecionar, monitorar, gerenciar e contratar as empresas de cloud computing”, pontuou o analista.
No entanto, não há treinamento em cloud computing que resolva se houver falta de conexão a internet no local e esta é uma das desvantagens da ferramenta. No caso do usuário precisar de algum dado num determinado momento em que não haja conexão, o cloud computing não poderá ser acessado.
Apesar de alguns problemas, a ferramenta é uma tendência que vem se disseminando aos poucos no mundo web, atingindo tanto os usuários domésticos quanto as empresas que necessitam de uma boa infra-estrutura para manter seus serviços disponíveis sem gastar muito.
Alguns estudiosos já chegaram a dizer que no futuro, ninguém precisará instalar nenhum tipo de software em seu computador, seja para editar textos, assistir vídeos, ou até mesmo editar imagens, pois tudo estará disponível na cloud computing.