sábado, 30 de abril de 2016

Reclame Aqui - O jantar da vingança




"Em comemoração ao aniversário do Reclame AQUI, nós nos vingamos de algumas empresas que desrespeitam o consumidor. 


Assista a nossa nova campanha, chamada "O Jantar da Vingança", onde chamamos os diretores de algumas empresas com péssimas reputações no nosso site e fizemos eles provarem do seu próprio veneno! O resultado ficou fantástico!"

Não pude deixar de compartilhar esse video. Em algum momento já passamos por momentos como esse e não é nada agradavel.

E o pessoal parece que o pessoal não gostou do serviço prestado rs

GO GO! - 1ª Semana Chinês Mandarim


Pessoal, logo teremos um evento bastante interessante sobre mandarim, é a "1ª Semana do Chinês Mandarim", com o Cleber Souza.

Cleber Souza é Brasileiro, professor de Kung fu e amante da cultura Chinesa, há quase 16 anos, aprendeu a falar chinês sozinho e reuniu esse seu jeito de estudar chinês em um método de ensino chamado Dong Chinês.

GO GO! - 1ª Semana Chinês Mandarim


O evento será realizado em  7 dias totalmente online e gratuito, onde será apresentado formas de aprender a falar chinês em 90 dias.
O evento acontecerá a partir do dia 03/05.

Durante a semana do evento Cleber Souza, enviará 3 videos nos intervalos dos cursos com os temas:
  • Cultura Chinesa;
  • Como ser aprovadado no HSK nível 1;
  • Ideogramas Chineses.

E ao se cadastrar no evento, você receberá um e-book com o livro "Aprenda a falar Chinês", escrito por Cleber Souza.

"São mais de 300 páginas de puro conteúdo e técnicas que mudará completamente sua forma de estudar e aprender Chinês"

Então acesse o link e garanta sua vaga e seu livro.

Até a próxima.

quinta-feira, 28 de abril de 2016

English NOW #5




Fala galera!

Hoje vou apresentar à vocês outro site incrível para auxiliar em seu - nosso - aprendizado da língua inglesa.



Diferente dos posts anteriores, o site de hoje é brasileiro e possui um conteúdo muito rico. O site Inglês na ponta da língua traz muita coisa interessante como livros, e-books, podcast e outras dicas de expressões, gramática, collocations e vocabulários.

Além disso, suas postagens sempre apresentam um conteúdo interessante e muito rico. Como este aqui, onde listam alguns livros com e sem áudio para acompanhar e aumentar seu vocabulário.

Bom galera, esse post foi o mais curto que já redigi (tempo curto rsrs) . Espero que vocês acessem o site e vejam as opções disponíveis para que possa lapidar e melhorar sua experiência com o idioma.

Até mais!

;)

quinta-feira, 21 de abril de 2016

Debug #5 - Problema Starting Tomcat





Fala galera!

Estava trabalhando em um pequeno projeto e me deparei com um problema no Apache Tomcat v8. Aconteceu que, ao tentar executar uma aplicação - utilizo Eclipse Mars - o apache apresentava a seguinte mensagem:



Depois de algumas pesquisas, descobri que era preciso alterar o tempo limite de start do servidor. Existem alguns casos em que o computador demora um tempo maior para iniciar o Apache Tomcat e, caso o tempo definido na configuração do Tomcat seja baixa, a mensagem será apresentada.

Então para resolver este problema, acesse a aba de servidores do Eclipse e clique duas vezes em Apache Tomcat.


Fazendo isso, será aberta uma página com as configurações do Apache Tomcat.

Acesse a aba Timeouts e altere o tempo definido no tempo de Start. No meu caso, defini o tempo de 60 segundos e foi o suficiente para corrigir o problema.


É isso aí! Talvez seu computador precise de mais tempo, então, basta modificar o tempo de acordo com o necessário. Caso não solucione, tente verificar outras configurações do Apache Tomcat e/ou  reinstalar o servidor.

Até mais!

quarta-feira, 20 de abril de 2016

Mapa com API ArcGis JavaScript


Fala galera!

Em meu TCC (Trabalho de Conclusão de Curso) minha equipe e eu fizemos uma aplicação que necessitava de interação com um mapa. E depois de muitas pesquisas cheguei a uma API (Application programming Interface) que foi ideal para o que precisávamos.

Mapa com API ArcGis JavaScript

O ArcGis JavaScript da empresa Esri, além de ter uma documentação super completa e com vários códigos de exemplo, é muito simples de trabalhar.

Neste post pretendo passar à vocês um pouco do conhecimento que possuo desta maravilhosa API e assim codificarmos um mapa de exemplo (pretendo futuramente fazer um mapa que utilizará mais recursos disponíveis). A princípio, vamos fazer um mapa "base" nada além do que somente abrir um mapa na tela.

Para iniciarmos nossa codificação, precisamos montar uma estrutura básica de fonte html, conforme abaixo:



Agora adicione o script e a tag dentro do <head>. O script carrega a API ArcGis JavaScript e quando houver uma atualização da API, será necessário alterar o número correspondente a versão. A folha de estilo (stylesheet) contém estilos específicos para componentes e widgets Esri.



Será preciso adicionar um segundo script, desta forma, não será necessário utilizar uma URL se referenciando ao módulo correspondente do ArcGis. O código JavaScript será adicionado dentro dele.



A função require especifica qual módulo utilizaremos no mapa, neste caso, será o módulo ["esri/map"], por conta disso, será definido no parâmetro da função (function) a classe Map que cria um local e uma estrutura DOM para adicionar as camadas, gráficos, informações de janela e outros controles.
Esta classe é responsável por adicionar o mapa à página. Além dessa classe, a API disponibiliza várias outros módulos com classes e objetos que possuem diferentes objetivos. Consulte aqui a lista completa.

O parâmetro do require "dojo/domReady!" é um plugin que vai esperar até que o carregamento do DOM tenha encerrado, ou seja, somente após o carregamento de todos os módulos - em nosso caso "esri/map" - o domReady será executado e a página carregada por completo. É indicado que o domReady seja sempre o último do vetor no qual se encontra. Mais detalhes aqui.

Após definirmos quais módulos utilizaremos, vamos a parte mais interessante, o mapa. Dentro do script você deixar seu código igual a este:

  

Vamos precisar de um objeto (map) que será responsável por todas configurações do mapa que utilizaremos. A string no primeiro parâmetro da classe Map (mapDiv) é o nome dado à div, onde o mapa será apresentado na página.

O segundo parâmetro é um vetor (semelhante a um arquivo JSON) que possui o atributo e seu valor correspondente, todos separados por vírgula.

O atributo center é um vetor com duas posições, onde definimos a longitude e a latitude do mapa. Estas coordenadas serão utilizadas como ponto inicial no carregamento do mapa.

O atributo zoom é a aproximação do mapa, ou seja, a distância de visualização. Quanto menor, menor o zoom. O atributo basemap é o tipo do mapa a ser mostrado na página. Além do street, temos outras opções como: satellite, hybrid, topo, gray, oceans, osm e national-geographic.

Após ter definido os atributos corretos e adicionado o código javascript completo, é hora de adicionar o mapa à página. Não poderia ser mais simples, basta adicionar a tag <div> ao corpo dá página e definir sua id com o mesmo nome do parâmetro da classe Map (mapDiv). Se for preciso, você pode utilizar o id para fazer a sua formatação em CSS para deixar o mapa em tela cheia ou em um local específico da página. Bom galera, por enquanto vou terminar esse tutorial por aqui e deixarei como uma pequena introdução a um próximo mapa com mais funções e características específicas.

O código completo está em nosso repositório no GitHub.

Até mais! ;)

English NOW #4



Fala galera!

Diferente dos posts anteriores, onde nós fazíamos uma breve apresentação ou resumo de sites que disponibilizam áudios e/ou histórias para as pessoas que estão aprendendo inglês estudarem, o post de hoje traz um site - já muito conhecido - que oferece alta qualidade de leitura e estudo.

O site medium.com é um dos meus sites favoritos. Além de obter grandes variedades de textos de diferentes temas e áreas, possui um vocabulário rico para reforçar o conhecimento do idioma.




A interface é simples e muito agradável que possibilita ao leitor uma leitura tranquila. Ao se cadastrar no site a pessoa tem a possibilidade de adicionar textos diversos, não há restrição. Pode-se dizer que é um blog para quem tem vontade de publicar/escrever seus textos, pensamentos e histórias.

Com essa dica, fica ainda mais interessante em aprender inglês, pois neste site você poderá ler históricas verídicas de qualquer pessoa ao redor do mundo e também poderá ler pequenos textos que nos fazem pensar em muitos pontos da vida que as vezes deixamos passar. Além, claro, de dar um up em sua experiência de leitura com o idioma.

Caso você tenha alguma sugestão de site, nos encaminhe que faremos questão de falar sobre ele.

Obs.: o texto da imagem acima é excelente (rsrs).

Até a próxima!

;)

terça-feira, 19 de abril de 2016

GO GO! Hangout PDJ - Como mudar de carreira e começar a trabalhar com jogos


Pessoal a equipe PDJ (Produção de Jogos) está com um novo hangout programado pra amanhã, dia 19/04, ás 20h.

Graças ao sucesso do primeiro hangout "Como viver de jogos no Brasil", eles resolveram criar um novo hangout dessa vez o tema é "Como mudar de carreira e começar a trabalhar com jogos", totalmente gratuito e online.

GO GO! Hangout PDJ - Como mudar de carreira e começar a trabalhar com jogos


Dessa vez foram convidados:
  • Daniel Nascimento (Ex-Publicitário, hoje desenvolvedor de games no Canadá)
  • Daniel Monastero (Ex-Advogado, hoje Co-Fundador da Garage 227 Studios)
  • Thiago Adamo (Ex-Analista de TI e hoje um dos maiores especialistas do Brasil sobre áudio pra games);
Os profissionais contarão suas histórias, a transação de como foi sair da zona de conforto e buscar novas oportunidades. Tenho certeza que será tão bom quanto o primeiro hangout.

Bom, mas para participar você precisa clicar nesse link aqui, informar nome e email.
Corre que ainda da tempo!

Até a próxima!

segunda-feira, 18 de abril de 2016

Capacitação Java - Brasil mais TI


O Ministério da Ciência , Tecnologia e Inovação juntamente com o Ministério da Educação, o Brasil Mais TI que atua em três pontos essenciais da formação profissional:conhecimento, capacitação e oportunidades, está oferecendo totalmente grátis uma capacitação JAVA de 380h divididos em & cursos, todos com certificado.

Capacitação Java - Brasil mais TI


Esse empenho se deve a gargalos na industria de software e serviços de TI crescentes de profissionais qualificados, que poderá atingir aproximadamente a marca de 408 mil em 2020.

Esses são os cursos oferecidos:


Bora lá, faça seu cadastro agora e aproveite a oportunidade!
Abraço

Relatório iReports usando JRBeanCollectionDataSource #2



Fala galera!

Vamos continuar nosso post onde fazemos um Relatório iReports usando JRBeanCollectionDataSource.

Pois bem, no último post criamos o projeto e desenvolvemos as classes Cliente e ClienteFactory (caso não tenha o arquivo anterior, acesse o repositório Github para obter o código).

Hoje vamos desenvolver a classe principal que será responsável por executar o método que irá gerar o relatório, assim como será nossa classe para teste. Em seu projeto você poderá adicionar o método de impressão de relatório em outra classe de sua preferência e de acordo com o contexto de sua aplicação.

Aqui chamamos a classe principal de ReportDevIsComing. Veja o código a seguir:

Classe ReportDevIsComing

package br.com.deviscoming;

import java.net.URL;
import java.util.List;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;/**
 *
 * @author renan.ramos
 */
public class ReportDevIsComing {

    /**
     * @param args the command line arguments
     */        
    public static void main(String[] args) {
        new ReportDevIsComing();
    }

    public ReportDevIsComing() {
        execute();
    }

    private void execute() {
        ClienteFactory clienteFactory = new ClienteFactory();
        List<cliente> lista = (List) clienteFactory.getCliente();
        geraRelatorio(lista);
    }            
        
    private void geraRelatorio(List<cliente> lista) {
        try{            
            URL arquivo = getClass().getResource("/br/com/deviscoming/relatorio/relDevComing.jasper");                                  
            JasperReport report = (JasperReport) JRLoader.loadObject(arquivo);
            JasperPrint print = JasperFillManager.fillReport(report, null,new JRBeanCollectionDataSource(lista));
            JasperViewer jasperViewer = new JasperViewer(print, false );
            jasperViewer.setVisible(true);                        
        }catch(Exception ex){
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }        
    }
    
}

Essa classe possui dois métodos o execute() e o geraRelatório(). O método execute tem a função de instanciar um objeto da classe ClienteFactory, obter a lista de clientes e enviá-la ao método geraRelatório. Como o método execute tem uma funcionalidade simples, não abordaremos seus detalhes neste post.

geraRelatório()

private void geraRelatorio(List<cliente> lista) {
        try{            
URL arquivo = getClass().getResource("/br/com/deviscoming/relatorio/relDevComing.jasper");                                  
            JasperReport report = (JasperReport) JRLoader.loadObject(arquivo);
JasperPrint print = JasperFillManager.fillReport(report, null, new JRBeanCollectionDataSource(lista));
            JasperViewer jasperViewer = new JasperViewer(print, false );
            jasperViewer.setVisible(true);                        
        }catch(Exception ex){
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }        
    }

A classe instanciamos um objeto da classe URL e definimos a ele onde está localizado nosso relatório. Este objeto será utilizado como parâmetro para o método da classe JRLoader. O método loadObject vai receber o objeto arquivo e ficará responsável por carregar o relatório e o retorno irá para o objeto report da classe JasperReport.

No método fillReport receberá o objeto report, parâmetros (se houver) e um objeto de JRBeanCollectionDataSource e enviamos a lista de clientes por parâmetro.

Após estes pontos bem definidos, basta somente apresentá-los ao usuário com a classe JasperViewer.

No próximo post vamos passar para o ponto onde faremos o relatório e o configuraremos corretamente para receber os dados JavaBean.

Até mais!

;)

domingo, 17 de abril de 2016

Json com Jackson


Atualmente são inúmeras a quantidade de bibliotecas para se trabalhar com Json, isso se deve a notação leve de troca de dados, a facilidade de interpretação, tanto humana quanto a nível de máquina.
Nesse post eu vou estar explicando como trabalhar com esse carinha aqui, Jackson.

Json com Jackson



Bom, mas antes de falarmos sobre a biblioteca vamos entender um pouco sobre o que é Json. O site oficial descreve Json sendo:

"JSON (JavaScript Object Notation - Notação de Objetos JavaScript) é uma formatação leve de troca de dados.
Para seres humanos, é fácil de ler e escrever. Para máquinas, é fácil de interpretar e gerar.

Está baseado em um subconjunto da linguagem de programação JavaScript.
JSON é em formato texto e completamente independente de linguagem, pois usa convenções que são familiares às linguagens C e familiares, incluindo C++, C#, Java, JavaScript, Perl, Python e muitas outras.

Estas propriedades fazem com que JSON seja um formato ideal de troca de dados.
JSON está constituído em duas estruturas:
  • Uma coleção de pares nome/valor. Em várias linguagens, isto é caracterizado como um object, record, struct, dicionário, hash table, keyed list, ou arrays associativas.
  • Uma lista ordenada de valores. Na maioria das linguagens, isto é caracterizado como uma array, vetor, lista ou sequência.
Estas são estruturas de dados universais. Virtualmente todas as linguagens de programação modernas as suportam, de uma forma ou de outra. É aceitavel que um formato de troca de dados que seja independente de linguagem de programação se baseie nestas estruturas." Para mais informações acesse o site Json-BR.

Já sabemos o motivo da quantidade de bibliotecas existentes, o motivo de tanta informação relacionado a "formatação" JSON que tende a ser usado cada vez mais em várias aplicações.

Agora, sobre a nossa biblioteca, vamos aprender como converter Java para Json e Json para Java.

Vamos considerar o pojo abaixo:

public class Pessoa {

    private String nome;
    private int idade;
    private String profissao;
    private BigDecimal salario;
    private List habilidade;

    //getters and setters
}

Seria necessário configurar e criar a estrutura em um banco de dados, mas para nível de entendimento vamos criar um arquivo texto, dando o nome para o arquivo de "Pessoa.json" e salvar em algum lugar da sua máquina, aqui estarei salvando em "D://Pessoa.json".
Nesse arquivo teremos o seguinte registro:

{"nome":"Fagner Zordan","idade":26,"profissao":"Analista de Sistemas","salario":10000,"habilidade":["java","php","unity3d"]}

Lembre-se Json trabalha com "chave":"valor", um exemplo seria: "nome":"Fagner Zordan".
Note que os atributos da nossa classe "Pessoa" possui os mesmas chaves no nosso arquivo Json.

Já temos nosso pojo criado com os get e set implementados, temos nosso registro no formato Json salvo na nossa máquina, vamos agora converter o objeto Java em JSON:

ObjectMapper mapper = new ObjectMapper();
Pessoa obj = new Pessoa();

//Objeto para JSON salvo no arquivo
mapper.writeValue(new File("D:\\Pessoa.json"), obj);

//Objeto para JSON armazenado em String

String jsonEmString = mapper.writeValueAsString(obj);


E no trecho a seguir convertemos JSON para objeto Java:

ObjectMapper mapper = new ObjectMapper();
String jsonEmString = "{'nome' : 'Fagner Zordan'}";

//JSON do arquivo para Objeto
Pessoa obj = mapper.readValue(new File("D:\\Pessoa.json"), Pessoa.class);

//JSON de uma URL para Objeto
Pessoa obj = mapper.readValue(new URL("http://www.deviscoming.blogspot.com.br/Pessoa.json"), Pessoa.class);

//JSON de uma String para Objeto
Pessoa obj = mapper.readValue(jsonEmString, Pessoa.class);

Viu como é fácil?
Logo estarei disponibilizando um "projeto" (aplicação funcionando usando JSON) no github, e volto a postar aqui.

Por enquanto é isso, abraço e até a próxima.

Primeiros passos com Spring MVC


A empresa Algaworks, localizada em Uberlândia, Minas Gerais, que trabalha desde 2004 com cursos de desenvolvimento de software, está disponibilizando um livreto digital gratuito que ensina primeiros passos sobre Spring MVC.

Primeiros passos com Spring MVC


O que você vai aprender nesse livreto:

1. Introdução

2. O Spring
2.1. Introdução
2.2. Spring vs Java EE
2.3. O Spring Boot
2.4. O Spring MVC
2.5. O Thymeleaf
2.6. O Maven
2.7. O Spring Tool Suite - STS

3. O projeto de gestão de convidados
3.1. Funcionamento
3.2. Criando o projeto no STS
3.3. Criando o controller
3.4. Criando a página
3.5. Rodando o projeto pela primeira vez
3.6. Repositório de convidados
3.7. Enviando um objeto do Controller à View
3.8. Listando objetos com o Thymeleaf
3.9. Adicionando um convidado

4. Conclusão
4.1. Próximos passos

Gostou? Então acesse o site, preencha seu e-mail e abrace essa oportunidade.

Bons estudos e até a próxima!

sexta-feira, 15 de abril de 2016

Kite - Seu copiloto de programação



GO GO! - Congresso de Mobile (Palestras)


Olá!

Anteriormente eu havia postado sobre o evento de "Congresso de Mobile", deixo o link pra quem não acompanhou e gostaria de saber mais sobre.

GO GO! Congresso de Mobile - Videos


Sinto informar mas o evento já acabou, no entanto os organizadores disponibilizaram as 2 palestras mais votadas, e estou deixando o link aqui pra que vocês possam assistir.
Vale lembrar que os videos estarão disponíveis apenas até o dia 18/04/2016.


Nessa palestra Weliton Carlos Flor, fala sobre "Como Criar Aplicativos de Qualidade Para iOS e Android Com Html e JavaScript" usando IONIC, e explica também sobre a diferença entre aplicativos nativos e hibrido.

E nessa outra palestra Robert Souza, fala sobre "Segurança da Informação: Vulnerabilidade em Dispositivos móveis", explica como funciona alguns trojans e vírus,  e explica formas de evita-los.

Pessoal é isso, aproveitem os videos, não foi a toa que esses videos foram selecionados, são palestras muito boas.
Até a próxima.

Debug #4 - Git revert


Com certeza em algum momento da sua vida você já fez um commit na branch master e consequentemente sentiu aquela angustia de "ohhh shitt", e perdeu algum tempo pra conseguir reverter isso sem ter que avisar ninguém sobre a "arte".

xD


Bom estou deixando aqui dois comandos que podem te ajudar.

IMPORTANTE: SÓ REVERTE O ULTIMO COMMIT.

  • Reverte a última alteração do repositório git e mantem suas alterações do commit.
git reset --soft HEAD~1

  • Reverte a última alteração do repositório git e apaga suas alterações.
git reset --hard HEAD~1

Use com moderação rs

Até a próxima!

quinta-feira, 14 de abril de 2016

Integração Advpl x Excel #2


Integração Advpl x Excel #2

Fala galera!

No post anterior nós falamos sobre o início do programa que faz integração Advpl x Excel. Hoje continuaremos com o post a partir da função reportDef().

Vejamos o código antes de prosseguir:

static function reportDef

local oReport
local oSection
local oBreak

//configura o relatório
oReport := TReport():new("RELCLI","Lista de Clientes",,{|oReport| printReport(oReport)},"Lista de Clientes")
oReport:SetLandscape()  //orientação da página como paisagem
oReport:nFontBody := 10 //tamanho da fonte padrão
oReport:showHeader() //define que será exibido o cabeçalho do relatório
//cria uma seção   
oSection := TRSection():new(oReport,"Lista de clientes",{"SA1"})//importante descrever as tabelas utilizadas
oReport:setTotalInLine(.F.)

TRCell():new(oSection, "CLIENTE",,"")
oSection:cell("CLIENTE"):disable()

//define as colunas com o campo da tabela, tabela e cabeçalho que estará na planilha
TRCell():new(oSection, "A1_COD" , "SA1", "Cód. cliente")
TRCell():new(oSection, "A1_NOME", "SA1", "Nome cliente")
TRCell():new(oSection, "A1_END" , "SA1", "Endereço")
TRCell():new(oSection, "A1_MUN" , "SA1", "Cidade")
TRCell():new(oSection, "A1_EST" , "SA1", "Estado")
TRCell():new(oSection, "A1_PAIS", "SA1", "Pais")
      
return oReport

Bom, o que essa função faz basicamente? É responsável por toda a configuração inicial do seu relatório, ou seja, caso o usuário não deseje modificar alguma coisa, como impressão paisagem ou foto, o relatório assumirá a configuração definida nesta função.

Primeiro precisamos instanciar um objeto de TReport e, para isso, definimos o objeto oReport, onde este receberá as configurações iniciais do relatório.

TReport():new("RELCLI","Lista de Clientes",,{|oReport| printReport(oReport)},"Lista de Clientes")

Este método construtor, tem os seguinte parâmetros:

cReport: Nome do relatório. Exemplo: "RELCLI";
cTitle: Título do relatório;
uParam: Parâmetros do relatório cadastrado no Dicionário de Perguntas (SX1). Também pode ser utilizado bloco de código para parâmetros customizados;
bAction: Bloco de código que será executado quando o usuário confirmar a impressão do relatório;
cDescription: Descrição do relatório;
lLandscape: Aponta a orientação de página do relatório como paisagem;
uTotalText: Texto do totalizador do relatório, podendo ser caracter ou bloco de código;
lTotalInLine: Imprime as células em linha;
cPageTText: Texto do totalizador da página;
lPageTInLine: Imprime totalizador da página em linha;
lTPageBreak: Quebra página após a impressão do totalizador;
nColSpace: Espaçamento entre as colunas;


O construtor TRCell() é célula de impressão de uma seção (TRSection) de um relatório que utiliza a classe TReport. 

Para cada célula adicionada ao relatório é necessário chamar este método com a configurações necessárias com o objeto da seção, nome do campo, nome da tabela e título que será apresentado no arquivo excel.

Agora vamos implementar a função que irá efetuar a consulta no banco de dados, salvar em uma tabela temporária e adicionar ao objeto oSection do relatório.
Esta função definimos com o nome de printReport, que executará a impressão do relatório.

static function printReport()
    
local oSection := oReport:section(1)
local cSql := ""

oSection:init()    

//efetua a pesquisa no banco de dados. Neste caso, seleciona todos os clientes existentes
cSql := " SELECT A1_COD, A1_NOME, A1_END, A1_MUN, A1_EST, A1_PAIS "
cSql += " FROM "+RetSqlName("SA1")+"  SA1 "
cSql += " WHERE SA1.D_E_L_E_T_ = '' "   
cSql += " ORDER BY A1_COD "
    
//salva o código sql na pasta TEMP para consultas no seu SGBD
memoWrite("\TEMP\RELSA1.sql",cSql)                           
//Executa a query e cria uma tabela temporária (TRB)
dbUseArea(.T.,"TOPCONN",TCGenQry(,,cSql),"TRB",.F.,.T.)

oReport:setMeter(TRB->(recCount()))

TRB->(dbGoTop())

//percorre a tabela temporária e 'seta' os valores nas respectivas colunas
while !TRB->(eof())
 oSection:cell("A1_COD"):setValue(TRB->A1_COD)
 oSection:cell("A1_NOME"):setValue(TRB->A1_NOME)
 oSection:cell("A1_END"):setValue(TRB->A1_END) 
 oSection:cell("A1_MUN"):setValue(TRB->A1_MUN)
 oSection:cell("A1_EST"):setValue(TRB->A1_EST)
 oSection:cell("A1_PAIS"):setValue(TRB->A1_PAIS)
 oSection:printLine()
 oReport:incMeter()
 TRB->(dbSkip())
endDo
                  
oSection:finish()
TRB->(dbCloseArea())

return


O objeto oSection é iniciado através de seu método init(), onde é responsável por inicializar as configurações e define a primeira página de impressão.
Utilizamos a variável cSql para definirmos a query de consulta ao banco de dados que será posteriormente utilizada.

O método memowrite() é responsável por salvar o código sql que geramos em um diretório, no nosso caso será na pasta Temp do sistema. Este método é muito simples, basta informar a string contendo o diretório onde será salvo o arquivo, com nome e extensão; e a variável que possui o conteúdo a ser salvo.

Já o método dbUseArea() define um arquivo de dados como uma área de trabalho disponível na aplicação. Aqui nós definimos que trabalharemos com uma tabela temporária nomeada TRB, esta tabela terá todos os campos configurados no método reportDef(). Então para acessá-los basta usar a mesma sintaxe que usaríamos com uma tabela real do banco de dados.

Para mostrar ao usuário o andamento da impressão, utilizamos o método oReport:setMeter(TRB->(recCount())) que mostra uma régua de progressão.


//percorre a tabela temporária e 'seta' os valores nas respectivas colunas
while !TRB->(eof())
 oSection:cell("A1_COD"):setValue(TRB->A1_COD)
 oSection:cell("A1_NOME"):setValue(TRB->A1_NOME)
 oSection:cell("A1_END"):setValue(TRB->A1_END) 
 oSection:cell("A1_MUN"):setValue(TRB->A1_MUN)
 oSection:cell("A1_EST"):setValue(TRB->A1_EST)
 oSection:cell("A1_PAIS"):setValue(TRB->A1_PAIS)
 oSection:printLine()
 oReport:incMeter()
 TRB->(dbSkip())
endDo

O laço de repetição while percorre toda a tabela e adiciona o conteúdo dos campos da tabela TRB nas células respectivas. Após o final desse laço de repetição, a seção é encerrada, a tabela temporária é encerrada e a tela de impressão é exibida ao usuário.

Como vocês puderam acompanhar, não é um monstro de sete cabeças realizar essa integração. A linguagem Advpl é muito fácil de trabalhar, pois tem muitos recursos que permitem a alta abstração que nos permite evitar de se preocupar com configurações básicas ou mais complexas.

Então é isso aí! Até mais galera! Qualquer dúvida é só deixar um comentário que responderei assim que puder.

Código fonte completo em GitHub.

quarta-feira, 13 de abril de 2016

Debug #3 - iReport não abre



Fala galera!

Dica rápida para quem está com problemas ao executar o iReports.
Quando cliquei no ícone naturalmente abriu a tela splash e começou a carregar os módulos, mas sem mais nem menos o iReports é encerrado e nem a tela principal do programa é apresentado.

Então, após muitas pesquisas em vários sites, encontrei a solução. 
Acesse a pasta onde está instalado o iReports em seu computador e navegue até a pasta etc e dentro dela haverá o arquivo ireport.conf.

Abra este arquivo e altere a linha:

#jdkhome="/path/to/jdk"

Retire o # e adicione o diretório que possui o seu jdk instalado. 
O arquivo ficará dessa forma:

jdkhome="C:\Program Files\Java\pasta_jdk_aqui"

Pronto! Agora é só executar o iReports novamente e já estará disponível para uso.

Até mais!

Hangout PDJ - Como viver de Jogos no Brasil


Pessoal, olha que maravilha!

Pra quem perdeu eu perdi rs o Hangout de ontem (12), sobre "Como viver de Jogos no Brasil" que a equipe da Produção de Jogos organizou, segue o vídeo que disponibilizaram no youtube.
Vale muito a pena conferir...


E de quebra eu estou deixando um link pra quem se empolgar no vídeo, e resolver começar a "trabalhar" com jogos.
No link você encontra starter kits para começarem a produzir jogos, também da equipe "Produção de Jogos".

Link aqui: http://producaodejogos.com/11-starter-kits-incriveis-para-voce-comecar-produzir-seus-jogos/

E vamos nessa!

English NOW #3


Fala galera!

Continuando nossa série de posts com dicas de como aprender inglês sozinho, hoje estamos
com um dica muito legal do site CIG - O seu curso de inglês grátis.



Veja outras dicas com os posts anteriores:

English NOW #1

English NOW #2

Este site possui vários tópicos, onde são disponibilizados vídeos com dicas interessantes que
auxiliam os estudantes a aprender técnicas e métodos que possam dar resultado a seus estudos.

Existem vários cursos, cada um destinado à uma área específica de aprendizado do idioma, como
listening, phrasal verbs, leitura, gramática (básica e intermediária), entre outros.

Esse site possui um conteúdo riquíssimo para quer aprender e gosta do idioma. Manter-se nessa imersão durante os estudos ajuda, e muito, no aprendizado e na compreensão da língua.

Até a próxima!

Relatório iReports com JRBeanCollectionDataSource #1





Fala galera!

Bom esses dias precisei elaborar um relatório, mas como não havia necessidade de conexão com o banco de dados, então resolvi pesquisar sobre a classe JRBeanCollectionDataSource.

Como é informado no site da JasperReport, é comum acessar dados de aplicativos através de camadas de persistência de objetos como EJB, Hibernate, etc. Esses aplicações podem precisar gerar relatórios utilizando dados que já possuem disponível em matrizes ou em coleções de objetos JavaBean na memória.

Aqui trataremos de um tutorial com uma aplicação básica e a configuração do iReports.

Obs.: informo que estou utilizando o NetBeans IDE 7.3, iReports 5.5.1.


Criando novo projeto

Vamos criar um novo projeto no NetBeans, portanto vamos seguir o mesmo passo a passo de sempre:

File -> New project.



Aqui vamos utilizar uma aplicação Java (Java Application) e definiremos o nome do projeto como ReportDevIsComing.



Veja a seguir a estrutura final do projeto:


A primeira classe que será implementada é a classe Cliente. Esta classe possuirá os atributos referente aos clientes e esses atributos que serão utilizados/mostrados no relatório.

Classe Cliente

 // To change this template, choose Tools | Templates
 // and open the template in the editor.
package br.com.deviscoming;

/**
 *
 * @author renan.ramos
 */
public class Cliente {
    
     private int id;
    
    private String nome;
    
    private String endereco;
    
    private String estado;
    
    private String cidade;
        
   //metodos getters e setters 
   
}

Agora, precisamos implementar a classe que será responsável por fornecer os dados para o relatório, essa classe será definida como ClienteFactory. Para que o relatório funcione precisamos de um método estático (static) que irá "pegar" aos dados e retorná-los como um objeto da interface Collection.

Classe ClienteFactory

/**
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.deviscoming;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 *
 * @author renan.ramos
 */
public class ClienteFactory {
   public static Collection getCliente(){      
      return setCliente();
  }      
    
   private static Collection setCliente() {
       List clientes = new ArrayList();
       
       Cliente c1 = new Cliente();
       c1.setId(1);
       c1.setNome("Fulano da Silva");
       c1.setEndereco("Rua das Acácias");
       c1.setCidade("São Paulo");
       c1.setEstado("São Paulo");
       
       clientes.add(c1);
       
       Cliente c2 = new Cliente();
       c2.setId(2);
       c2.setNome("Beltrano da Silva");
       c2.setEndereco("Avenida Ipanema");
       c2.setCidade("Rio de Janeiro");
       c2.setEstado("Rio de Janeiro");
       
       clientes.add(c2);       
       
       return clientes;
    }   
}

Na segunda parte do post iremos tratar a configuração do relatório para que possamos exibí-lo
para o usuário.

Até mais!