Office System

The Office Developer Blog (by Luiz Cláudio C. V. Rocha - São Paulo, Brazil)

Um recurso prático no BrOffice - Writer

Tenho de vez em quando mexido um pouco no BrOffice para conhecê-lo mais a fundo, na prática.

Hoje eu vi no Writer um recurso muito prático e simples, que não tem no MS-Word e faz muita falta: chama-se "Inserir entrada sem numeração".

Imagine que você tenha uma lista numerada (com um nível ou mais) e, em algum item da lista, por exemplo, no item "2.b", você queira incluir um segundo parágrafo de texto. No MS-Word, o novo parágrafo vai automaticamente ser numerado com "2.c", e se você mandar remover o número, ele vai "entender" que você saiu da lista e bagunçar tanto o recuo como o espaçamento entre parágrafos.

No BrOffice, existe o botão "Inserir entrada sem numeração" na barra de "Marcadores e numeração", que insere um parágrafo não numerado no mesmo item em que você se encontra.

Para quem costuma escrever tutoriais "passo a passo" numerados, como eu, é uma ajuda e tanto.

Access - Numeração com ano

Uma dúvida que aparece com certa frequência nos fóruns é sobre a criação de numeradores compostos com ano:

1/2008, 2/2008, 3/2008, 4/2008 ... 100/2008, 101/2008
1/2009, 2/2009, 3/2009, 4/2009 ... 100/2009, 101/2009
etc.

A melhor solução, a meu ver, é ter dois campos na tabela: um só com o numerador (1, 2, 3, etc.) e outro só com o ano. A concatenação do numerador com o ano deve ser feita só em consultas e relatórios.

Tenho um exemplo que escrevi muito tempo atrás, em 2001, que não usa exatamente a prática que considero a mais adequada, porém também funciona. No exemplo, há um único campo texto que armazena o número já concatenado na tabela.

O exemplo está anexo a este artigo, para quem quiser baixar. Basta usar a função NextNumAno(), alterando o nome da tabela e do campo na instrução SELECT para coincidir com o seu banco de dados.

O mesmo módulo tem a função NextNumSimples(), que também pode ser usada caso você queira partir para a melhor solução que descrevi acima (onde o numerador fica num campo separado).

Em uma outra oportunidade eu re-escreverei este exemplo da forma que considero mais adequada hoje, oito anos depois. 

Erro no acesso a base Access pelo VB2008

Ao testar um simples código de acesso a um arquivo MDB pelo VB2008, recebi a seguinte mensagem de erro:

---------------------------

---------------------------
The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
---------------------------
OK  
---------------------------

Como tenho o MS-Access instalado e funcionando normalmente na máquina, tenho certeza de que o Jet está registrado.

O problema está ligado à versão 64bit do Windows, e a solução é exatamente a mesma que eu descrevi semanas atrás para o componente Shockwave Flash: abrir as Propriedades > Compile > Advanced Compile Options > Target CPU e escolher x86.

Controles ActiveX param de funcionar após atualização do Windows KB960715

A atualização do Windows disponível no KB960715, chamada "Update Rollup for ActiveX Kill Bits", a qual visa resolver questões de segurança no Internet Explorer, tem como consequência a quebra de controles ActiveX usados há anos pelo VB6, como Flexgrid, Hierarchical Flexgrid, Datagrid, Chart control, Masked Edit, Winsock e Animation.

Para resolver, é preciso distribuir a nova versão dos controles, que pode ser obtida com a instalação do "VB6 SP6 Cumulative Update": http://www.microsoft.com/downloads/details.aspx?FamilyId=CB824E35-0403-45C4-9E41-459F0EB89E36&displaylang=en&displaylang=en

Esta instalação requer o Visual Basic 6 com o Service Pack 6 (http://www.microsoft.com/downloads/details.aspx?FamilyID=9ef9bf70-dfe1-42a1-a4c8-39718c7e381d&displaylang=en).

Quem não tiver o Visual Basic 6 não conseguirá baixar os controles. A princípio, parece um requisito normal, já que a distribuição destes ActiveX requer uma licença do Visual Basic. Porém, existe um outro produto da Microsoft (e dos caros!) que licencia a distribuição dos ActiveX: o Office Developer Edition. Quem tem apenas o Office Developer Edition (e não o VB6) ficou na mão, pois não tem como baixar as atualizações. 

 

Mais informações aqui:

http://blogs.msdn.com/askie/archive/2009/02/20/certain-vb-controls-no-longer-display-on-web-pages-after-installing-kb960715.aspx

 

SQL Server - Erro ao atachar database - 5120 - Windows Vista

Ao fazer uma simples operação de atachar um database no SQL Server, é possível que você receba uma mensagem de erro como esta:

 

TITLE: Microsoft SQL Server Management Studio
------------------------------

An error occurred when attaching the database(s).  Click the hyperlink in the Message column for details.

------------------------------
BUTTONS:

OK
------------------------------

E a explicação no hyperlink é esta:

TITLE: Microsoft SQL Server Management Studio
------------------------------

Attach database failed for Server 'TOSHIBA-LUIZ\SQLEXPRESS2005'.  (Microsoft.SqlServer.Smo)

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.0.2531.0+((Katmai_PCU_Main).090329-1045+)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=Attach+database+Server&LinkId=20476

------------------------------
ADDITIONAL INFORMATION:

An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)

------------------------------

Não é possível abrir o arquivo físico "C:\Projetos\Data\GMedico.mdf". Erro do sistema operacional 5: "5(error not found)". (Microsoft SQL Server, Error: 5120)

For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=09.00.4035&EvtSrc=MSSQLServer&EvtID=5120&LinkId=20476

------------------------------
BUTTONS:

OK
------------------------------

Nas primeiras vezes que tive este erro, a única solução que encontrei foi atachar o database em outro servidor, fazer Backup e depois restaurar no meu servidor. Depois descobri que se tratava de um simples problema de permissão: bastou abrir o Management Studio com permissões de administrador que eu consegui atachar normalmente. 

Posted: Jul 24 2009, 01:22 AM by Luiz | with no comments
Filed under: , , , ,
Divulgar a quantidade de horas em projetos fechados

No que se refere à forma de contratação, podemos classificar projetos de desenvolvimento de software em dois tipos principais:

a) Projetos abertos: o fornecedor cobra x reais por hora de serviço prestado de um determinado perfil técnico.

b) Projetos fechados: o cliente determina um escopo e o fornecedor cobra x reais pelo "produto", dentro de um prazo combinado.

A diferença entre os dois tipos de contratação vai muito além do cálculo do preço. Existem diferenças nas expectativas, nos riscos, na forma de trabalho e na garantia.

Não se pode dizer que um tipo é melhor que o outro, pois depende de cada situação. Se o cliente tiver o escopo bem definido, pode valer mais a pena fazer um projeto fechado. Se o escopo não for claro, um projeto aberto é a melhor (para não dizer a única) solução.

Para o fornecedor de serviços, vender projetos abertos diminui bastante o risco, pois sua responsabilidade maior será garantir a qualidade do serviço prestado nas horas que vendeu. O risco de estouro de custo é do cliente.

Por outro lado, são os projetos fechados que possibilitam ao fornecedor ter ganhos maiores (e também perdas, obviamente). Se ele tiver boa produtividade interna, conseguirá vender projetos a preços competitivos e ter um ganho superior ao que teria se vendesse apenas as horas. E para o cliente existe a vantagem de não assumir riscos de custo, já que o preço é fixo.

A rigor, o objeto da venda é diferente em cada tipo: num projeto fechado, vende-se uma entrega, um "produto"; num projeto aberto, vendem-se horas, mão-de-obra (e não o "produto" que vai ser criado com o uso destas horas).

O que tenho visto no mercado, em algumas grandes empresas, é a confusão dos conceitos. Tem sido comum clientes pedirem propostas com preços fechados e, na fase de negociação (ou mesmo antes disto), exigirem que o fornecedor informe quantas horas vai consumir no projeto.

Ora, esta informação tem natureza de segredo industrial e não deveria ser solicitada, até por questões éticas. Por isto, não há problema algum o fornecedor recusar abrir estes números.  

Imaginem, por exemplo, que eu vá comprar 20 monitores para a minha empresa. Eu vou contratar um fornecedor que tenha preço, qualidade e prazo que me satisfaçam, e só. Não faz sentido eu exigir que ele me informe quantas horas vai gastar na fabricação, já que isto é segredo dele. Se ele tiver investido em equipamentos, tecnologia e pessoal que lhe permitam fabricar meu pedido em pouco tempo, melhor para ele, terá seu investimento recompensado.

A mesma regra vale para fabricantes de software: se a empresa investiu em equipe, treinamento, componentes, automatização e tecnologia que lhe permitam desenvolver um software em pouco tempo, não faz sentido ela ter que divulgar para quem quer que seja a sua real produtividade e seus custos internos de produção. Isto é um segredo industrial seu.

Assim, se você é um desenvolvedor ou uma empresa que vende projetos fechados, não há nada de errado em não divulgar a quantidade de horas. É um segredo do seu ofício, da sua forma de trabalhar. E pior: certamente esta informação só será usada contra você, nunca a seu favor. Limite-se a discutir prazo, qualidade e preço.

 

 

 

 

Visual Studio .NET 2005/2008: erro "Class not registered" em objetos COM

Ao executar um projeto C# ou VB, recebi a seguinte mensagem de erro:

System.Runtime.InteropServices.COMException was unhandled
  Message="Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))"
  Source="System.Windows.Forms"
  ErrorCode=-2147221164

 

O projeto usa o componente COM ShockwaveFlash ocx, e foi justamente a linha de código que inicializa o controle que disparou o erro.

Tentei baixar nova versão do Flash Player, registrar novamente o ocx, remover a referência e assinalar novamente, apagar o controle do form e recolocá-lo, etc... Nada funcionou.

Suspeitei então que o problema deveria estar relacionado ao fato do meu Windows ser 64 bit. No projeto, abri a janela de propriedades (Project > Properties), guia Build, e mudei o Platform Target de "Any CPU" para x86. Isto resolveu o problema.

Portanto, projetos .NET com referência a objetos COM 32 rodando em Windows 64 provavelmente não funcionarão. Quando acontecer, mude a plataforma-alvo para x86.  

Excluindo objetos do Access com controle de versão

Dando sequência ao artigo de desenvolvimento Access com controle de versão, segue a dica de uma situação comum: exclusão de objetos do Access com controle de versão.

Se você quiser excluir, por exemplo, um formulário do seu banco de dados Access, é normal que tenha a seguinte dúvida: "devo excluir a partir do Access (da mesma forma que faria em uma aplicação sem controle de versão) ou a partir do Team Explorer (ou SourceSafe)?"

Se fosse um arquivo comum, minha sugestão seria excluir a partir do Team Explorer, pois ele providenciaria automaticamente a exclusão do arquivo local. No caso do Access, porém, em que o formulário é representado por um arquivo no TFS mas na máquina local ele é apenas um objeto dentro do MDB, o Team Explorer não consegue excluí-lo localmente. Assim, o mais prático é excluir o formulário a partir do Access, pois ele identificará que o objeto está com controle de versão e perguntará se você deseja excluir o arquivo correspondente no TFS.

 

Esta pergunta só é feita se nas configurações de Source Control do Access você mantiver o padrão "Ask" para o parâmetro "Remover objetos do controle de versão ao deletá-los do Access", conforme mostra a figura abaixo.

 

Um cuidado importante que você deve ter é fazer o Check-In do objeto antes de excluí-lo, já que o Access (infelizmente) não dá nenhum alerta a este respeito. Se acontecer de você excluir o formulário quando ele estiver com status Check-Out, ele será excluído do Access mas permanecerá no TFS. E pior, ele não permitirá excluir nem fazer Check-In pelo Team Explorer, conforme mostram as figuras abaixo:

 

 

Para conseguir excluir do TFS, é necessário primeiro desfazer as alterações pendentes e só depois disto excluir.

 

Concluindo: faça a exclusão do objeto a partir do Access, mas antes disto assegure-se de ter feito Check-In do objeto.

Access 2007 com controle de versão no TFS

No Access 2003 criei projetos usando controle de versão de objetos usando o Team Foundation Server 2005 (TFS). Isto é possível usando-se o Access 2003 Source Code Control Add-In, disponível aqui: http://www.microsoft.com/downloads/details.aspx?familyid=2ea45ff4-a916-48c5-8f84-44b91fa774bc&displaylang=en

Agora, com Access 2007 e TFS 2008, demorei um pouco a achar a solução. Vi na Internet alguns sites dizendo que a integração Access 2007 x TFS não é possível, apenas Access 2007 e SourceSafe. Isto felizmente não é verdade!

Para desenvolver no Access usando os recursos de controle de versão do TFS (tanto 2005 como 2008), após instalar o Access, o TFS e o Team Explorer (que é o client do TFS), é necessário instalar:

a) O Access Developer Extensions 2007 (ADE): http://www.microsoft.com/downloads/details.aspx?FamilyId=D96A8358-ECE4-4BEE-A844-F81856DCEB67&displaylang=en O add-in de controle de versão agora faz parte deste pacote ADE, não é mais separado. Após instalar o ADE, você notará que há um novo item disponível a partir do botão Office: "Developer". Este novo item tem as opções "Package Wizard", "Save as Template" e "Create from SourceSafe". Foi justamente esta última opção que levou aos mais desavisados a acreditar que Access 2007 não fala com TFS.

b) O Visual Studio Team System 2008 (ou 2005) Team Foundation Server MSSCCI Provider: aqui está o segredo. Como o suporte MSSCCI no TFS não é nativo, é preciso instalar este add-in. Endereços:

- Para TFS 2005: http://www.microsoft.com/downloads/details.aspx?FamilyId=87E1FFBD-A484-4C3A-8776-D560AB1E6198&displaylang=en

- Para TFS 2008: http://www.microsoft.com/downloads/details.aspx?familyid=faeb7636-644e-451a-90d4-7947217da0e7&displaylang=en

Após instalar este add-in, o item "Create from SourceSafe" do Access passa a se chamar "Create from Team Foundation".

 

Agora podemos começar o desenvolvimento.

 

Em outro tópico abordarei os pontos de atenção no uso de ferramentas de controle de versão com o Access. 

Concatenar valores de registros diferentes no Access

Esta dúvida não é muito frequente, mas como eu mesmo já precisei algumas vezes desta solução, vou postá-la aqui.

Trata-se da concatenação de valores localizados em linhas diferentes de uma tabela. Em um banco de dados relacional, é simples concatenar campos (Campo1 & "," & Campo2 & "," & Campo3), mas não é simples concatenar linhas diferentes (Linha1 & "," & Linha2 & "," & Linha3).

Estou anexando um exemplo que usa código VBA (tanto DAO como ADO) para percorrer linhas e criar um string com os produtos de cada categoria, separados por vírgula. O exemplo foi criado por mim anos atrás, mas será útil para quem precisar deste tipo de solução.

 

Instalando o dispositivo de segurança do Unibanco no Vista

Ao acessar o site do Unibanco em uma máquina nova, ele pede a instalação do dispositivo de segurança.

No Windows Vista, porém, por mais que tentemos instalar e que não recebamos nenhuma mensagem de erro, o site continua pedindo a instalação. Na prática, ela não é concluída.

Para que a instalação seja bem sucedida, abra o Internet Explorer com privilégios de administrador. Desta forma o dispositivo será instalado corretamente. 

 

Linq to SQL - Debug Visualizer

Ao iniciar meus trabalhos com a sintaxe do Linq, uma dificuldade que tive foi saber qual efetivamente era o comando que estava sendo enviado ao SQL Server.

Pesquisando no Google, descobri um add-in que estava disponível nas versões beta do Visual Studio 2008 mas que foi excluído da versão final, o linq to SQL Debug Visualizer.

Anexei a este post um arquivo zip com este add-in. Para usá-lo, faça o seguinte:

1) Feche o Visual Studio.

2) Abra o arquivo zip.

3) Arraste o arquivo SqlServerQueryVisualizer.dll (que está dentro do zip) para a pasta C:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\Visualizers na sua máquina.

Para usar o visualizador, basta colocar um breakpoint na linha seguinte à definição da query que a opção Database Query aparecerá.

 

Ao clicar no Linq to SQL Debugger Visualizer, o Visual Studio abre uma janela com a instrução SQL. Esta janela ainda nos possibilita executar a query e ver os dados durante o debug.

 

 

Free Download Manager

Quem está procurando por uma boa ferramenta de gerenciamento de download, eu recomendo o Free Download Manager (FDM), que pode ser baixado a partir do site www.freedownloadmanager.org

Tela principal do FDM

 

 

Trata-se de uma ferramenta Open Source com bons recursos. Particularmente, eu sub-utilizo a ferramenta, já que para mim basta saber a velocidade e o tempo previsto para conclusão do download.

Durante o download é possível exibir no canto inferior esquerdo da tela uma janela semi-transparente mostrando a porcentagem e o status do download.

 

Campo texto com tamanho fixo no Access

O campo texto das tabelas do Access tem tamanho variável. Isto significa que se você configurar a propriedade Tamanho = 50, estará definindo apenas o tamanho máximo do campo. Se digitar apenas 10 caracteres, o registro terá tamanho 10, não 50.

Se por um algum motivo você precisar que um campo tenha tamanho fixo, completando com espaços as posições não preenchidas, pode fazê-lo por meio de uma query:

ALTER TABLE TuaTabela
ALTER COLUMN TuaColuna CHAR(30)

Quando isto pode ser útil? Raramente. O único cenário que vejo é quando precisamos gerar um TXT de tamanho fixo. Ter a tabela com os tamanhos corretos diminui o trabalho na hora de programar. 

Access - estoque com consulta união

Uma das dúvidas mais postadas em grupos de discusão de Access é sobre a modelagem da base de dados para controle de estoque.

Existe uma abordagem pouco usada mas que considero interessante: calcular o estoque por meio de consulta união. Você pode ter uma tabela de entrada e outra de saída de mercadorias, ou uma única tabela de movimentação. A idéia consiste em criar uma consulta com o código do produto, qtde entrada, qtde saida (em colunas diferentes).

SELECT CodProduto, QtdeEntrada, 0 AS QtdeSaida

FROM qryEntradas

UNION ALL SELECT CodProduto, 0, QtdeSaida

FROM qrySaidas

 

O segredo é criar uma coluna com valor 0 na QtdeSaida dos registros de entrada e uma coluna com valor 0 na QtdeEntrada dos registros de saída.

Por fim, basta pegar esta consulta união e criar uma query agrupando os dados.

Anexo um MDB de exemplo (que criei há muitos anos...).

Ribbon - galeria de ícones (ImageMso)

Demorei um pouco para achar isto, e está sendo de enorme utilidade: uma galeria com os ícones e o nome da ImageMso para usar nos ribbons customizados: http://www.microsoft.com/downloads/details.aspx?familyid=12b99325-93e8-4ed4-8385-74d0f7661318&displaylang=en

Add-in com imagens e nome dos imageMSO

 

Antes de ter isto, eu estava pegando o nome dos ImageMso dentro do Office > Opções > Customizar. Ao parar o mouse sobre os ícones do Quick Access Toolbar, o nome aparece no tooltip, entre parênteses.

Nome dos ícones no QuickAccessToolbar 

 

Notebook HP Pavilion - Módulo wireless parou de funcionar (fica só na luz laranja)

Tenho um notebook HP Pavilion 2000 (AMD Turion 64X2 - 4GB-RAM - Vista Home Premium, atualizado para Vista Ultimate) comprado pessoalmente no grande templo de Seattle, a Fry's, há exatamente um ano e meio.

Este computador (como praticamente todos os computadores fabricados nos últimos dois anos) tem módulo wireless integrado. Se o botão está na posição "Desligado", a luz fica laranja; na posição "Ligado" fica azul, mesmo que não haja redes wireless disponíveis no local.

Hoje, ao ligar o computador de manhã, vi que a luz estava laranja, mesmo com o botão na posição ligada, e a conexão com a Internet não estava funcionando. Conectei o cabo e a rede funcionou normalmente, mostrando que as configurções do roteador e do Vírtua estavam OK. Desliguei e liguei o botão do wireless várias vezes, continuou sem funcionar. Desliguei a máquina, atualizei o Vista, nada. Entrei na página da HP, rodei a instalação dos drivers do wireless, nada adiantou, a luz continuava laranja.

Procurei por ajuda na Internet, descobri muitas pessoas com o mesmo problema, sem solução. A maioria sem resposta ou recomendando acionar a garantia. 

Logo concluí: estou com problema de hardware. Lá se vai dinheiro e tempo perdido nessas assistências técnicas...

Por fim, resolvi acessar o painel de controle para ver se ele acusava algum driver desatualizado. Mais que isto, descobri que o dispositivo sequer aparecia listado.

Voltei à página da HP (http://h10025.www1.hp.com/ewfrf/wc/product?product=1817074&lc=en&dlc=en&cc=us&softwareitem=ob-51514-1&os=2093&lang=en) e procurei por outros downloads. Encontrei lá o download da BIOS. Depois de executar, o computador foi desligado automaticamente. Ao religar, o módulo wireless estava novamente funcionando, com a luz azul. Ufa! Aposto que se tivesse levado a uma assistência, teria custado caro.

 

Tamanho da fonte na combo do Excel

A maneira mais prática e versátil para se criar uma combo na grade do Excel é usar um intervalo de dados (lista de itens) como regra de validação de uma célula (a que receberá a combo).

 

Um dos pontos fracos deste tipo de combo é que ela não permite configurar o tamanho da fonte. Algumas vezes esta fonte aparece tão pequena que fica difícil ler.

 

Uma forma de contornar o problema (talvez a única que seja prática) é aumentar o zoom da tela. O tamanho da fonte da combo é ajustada de acordo com o zoom da tela. Assim, se você usa fontes grandes e colunas largas para exibir o conteúdo da planilha, experimente reduzir os tamanhos e aumentar o zoom. O conteúdo da combo ficará mais proporcional.  

Access 97 - Não há memória suficiente (Out of memory)

O Access 97 era muito usado 10 anos atrás, em hardware com configurações muito mais modestas que as de hoje, e rodava sem problemas.

Hoje em dia, um erro que se tornou razoavelmente comum com quem instala o Office 97 é a mensagem "Out of memory", que ocorre ao abrir o Access. O motivo real não é falta de memória, mas sim excesso dela...

Este bug sempre existiu, porém só começou a aparecer mais recentemente, quando máquinas com 1GB ou mais passaram a ser o padrão de mercado.

Se você está com este problema, faça a atualização do Jet 3.5. O Jet 3.5 é o motor do banco de dados do Access 97. O download pode ser feito no site da Microsoft:   http://support.microsoft.com/kb/172733/EN-US/

Treeview no Access

Anos atrás escrevi um exemplo de Treeview no Microsoft Access para listar os diferentes tipos de objeto e abri-los com um duplo-click.

Este exemplo foi bastante distribuído (ficava no antigo Sharepedia do MSDN), depois ficou sumido por não estar publicado em lugar algum.

Como recentemente muita gente tem perguntado a respeito de Treeview no Access, resolvi disponibilizar este velho exemplo aqui no meu blog.

Treeview no MS-Access

 

A codificação não é complexa, o que mais dificulta é o IntelliSense não funcionar de forma 100% correta para os controles não nativos do Access.

É importante notar que os eventos específicos do Treeview não são encontrados na guia Eventos da janela de propriedades. É necesário abrir o módulo VBA do formulário e selecionar o objeto Treeview na combo de objetos para que então seus eventos (como NodeCheck, NodeClick e Collapse) apareça na combo da direita.

Ao programar, o objetivo é saber qual nó da árvore foi clicado pelo usuário. O pulo do gato é usar o evento NodeClick, que tem um parâmetro Node. O próprio VBA grava neste parâmetro o nó que disparou o evento. Basta atribui-lo a uma variável de módulo e usar em outros eventos (como o DblClick):

Private Sub tvwObj_NodeClick(ByVal Node As Object)
'Retorna o nome do nó
On Error GoTo Tratamento
strNode = Node 'nó clicado
strNodeParent = Node.Parent 'nó hierarquicamente acima do clicado
Exit Sub

Tratamento:
strNodeParent = ""
End Sub

Quem quiser o arquivo de exemplo está anexado a este post.

More Posts Next page »