terça-feira, 31 de março de 2009

O Limpador

Para quê preocupar-se em limpar todo o lixo que se vai acumulando no computador (ficheiros temporários, ficheiros temporários de internet, etc, etc), se existe um programa que faz tudo isso?

Além disso também corrige os erros do registo, pode desinstalar programas, etc.

Por isso recomendo o CCleaner.

Pode fazer o download dele aki

quarta-feira, 25 de março de 2009

Macros para o BASE-Open Office


REM Macro semelhante ao AutoExec do ACCESS

Sub AutoExec
On Error Goto HandleError
Dim LastFrame As Object
Dim NumFrames As Integer
Static FormDocs As Object
Dim DBDoc As Object
Dim ImpName As String
Dim DataSource As Object
Dim Conn As Object
Dim Args(1) As New com.sun.star.beans.PropertyValue
Dim FormName As String
Dim FormDoc As Object
FormName="SWITCHBOARD" 'Mude aqui para o Forms de Abertura da Aplicação
ImpName="com.sun.star.comp.dba.ODatabaseDocument"
NumFrames=StarDesktop.Frames.Count
LastFrame=StarDesktop.Frames.getByIndex(NumFrames-1)
If LastFrame.Frames.Count>1 Then
Exit Sub
End If
If Not (LastFrame.Controller.Model.ImplementationName=ImpName) Then
Exit Sub REM not a db doc
End If
DataSource=LastFrame.Controller.DataSource
DBDoc=DataSource.DatabaseDocument
FormDocs=DBDoc.FormDocuments
Conn=DataSource.getConnection("","") REM no user/password
Args(0).Name="ActiveConnection" : Args(0).Value=Conn
if FormDocs.hasByName(FormName) Then
FormDoc=FormDocs.loadComponentFromURL(FormName,"_self",2,Args() )
FormDoc.CurrentController.Frame.ContainerWindow.setFocus()
End If
HandleError:
If Err<>0 Then
Exit Sub
End If
End Sub

REM Macro generica para abrir qualquer forms

function OpenForm( formContainer as variant, oConnection as variant, sFormName as string) as variant
Dim aProp(1) As New com.sun.star.beans.PropertyValue
aProp(0).Name = "ActiveConnection"
aProp(0).Value = oConnection
aProp(1).Name = "OpenMode"
aProp(1).Value = "open"
OpenForm = formContainer.loadComponentFromURL(sFormName,"_blank",0,aProp())
end function

function getFormsTC() as variant
getFormsTC = thisComponent.Parent.getFormDocuments
end function

function getConnectionTC() as variant
getConnectionTC = thisComponent.Drawpage.Forms(0).ActiveConnection
end function

REM Macro para abrir um forms específico

sub OpenForm_fTESTE( oev as variant )
sFormName = "fTESTE" ' Mude aqui o nome do seu forms
OpenForm( getFormsTC, getConnectionTC, sFormName )
end sub

REM Macro generica para abrir qualquer report

function getConnectionTC() as variant
getConnectionTC = thisComponent.Drawpage.Forms(0).ActiveConnection
end function

function OpenReport( reportContainer as variant, oConnection as variant, sReportName as string) as variant
Dim aProp(1) As New com.sun.star.beans.PropertyValue
aProp(0).Name = "ActiveConnection"
aProp(0).Value = oConnection
aProp(1).Name = "OpenMode"
aProp(1).Value = "open"
OpenReport=reportContainer.loadComponentFromURL(sReportName,"_blank",0,aProp())
end function

function getReportsTC() as variant
getReportsTC = thisComponent.Parent.getReportDocuments
end function

REM Macro para abrir um report especifico

sub OpenReport_rREPORT1( oEv as variant )
sReportName="rREPORT1" ' Mude aqui o nome do seu Report
OpenReport( getReportsTC, getConnectionTC, sReportName )
end sub

REM Macro para abrir um formulário sem abrir a Base de dados

Sub openOnlyfMOVIMENTOS
oContexto = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oFonte = oContexto.getByName("contabilidade")'Mude aqui o nome da base de dados
oForms = oFonte.DatabaseDocument.FormDocuments
oAConnection = oFonte.getConnection("","")

Dim pProp(1) As New com.sun.star.beans.PropertyValue
pProp(0).Name = "ActiveConnection"
pProp(0).Value = oAConnection
pProp(1).Name = "OpenMode"
pProp(1).Value = "open"
oForm = oForms.loadComponentFromURL("fMOVIMENTOS", "_blank", 0, pProp())'Mude aqui o nome do seu formulário
End Sub


REM Macro para abrir um relatório sem abrir a base de dados

Sub openOnlyrMOVIMENTOS
oContexto = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oFonte = oContexto.getByName("contabilidade")'Mude aqui o nome da base de dados
oReports = oFonte.DatabaseDocument.ReportDocuments
oAConnection = oFonte.getConnection("","")

Dim pProp(1) As New com.sun.star.beans.PropertyValue
pProp(0).Name = "ActiveConnection"
pProp(0).Value = oAConnection
pProp(1).Name = "OpenMode"
pProp(1).Value = "open"

oReport = oReports.loadComponentFromURL("rMOVIMENTOS", "_blank", 0, pProp())' Mude aqui o nome do seu relatório
End Sub


REM Macro para apagar valores de uma tabela

Sub DeleteAllFromTEST_TABLE2

Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim Statement As Object
Dim ResultSet As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("teste")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("DELETE FROM TEST_TABLE2 WHERE ID = 2")
End Sub

REM Macro para inserir valores numa tabela

Sub InsertFromTEST_TABLE2
Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim Statement As Object
Dim ResultSet As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("teste")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("INSERT INTO TEST_TABLE2(ID,F1,F2,F3)VALUES (1,'a','abc','abcd')")
End Sub

REM Macro para inserir valores numa tabela provenientes de outra

Sub SelectInsertfromTEST_TABLE2
Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim Statement As Object
Dim ResultSet As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("teste")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("INSERT INTO TEST_TABLE2(ID,F1,F2,F3)SELECT ID, F1,F2,F3 FROM TEST_TABLE3")
End Sub

REM Macro para Alterar uma Tabela

sub UpdateTEST_TABLE2
Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim Statement As Object
Dim ResultSet As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("teste")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("UPDATE TEST_TABLE2 SET F1=100, F2=200 WHERE ID=1")
End sub

terça-feira, 24 de março de 2009

Open Office 3.0 - Base



Quando se entra no BASE, tem-se a sensação que, de facto, tudo é muito parecido com o ACCESS, o programa de base de dados do MsOffice.

Realmente temos:

- Tabelas
- Consultas
- Formulários
- Relatórios

Módulos que existem no ACCESS, não temos aqui!!!
Veremos mais tarde que os módulos podem ser criados em livrarias e componentes.

Criar tabelas no BASE é bastante fácil (tem até um assistente!).

Consultas de selecção também é extremamente fácil e com uma interface (que depois produz o sql) também bastante parecida com o ACCESS, mas consultas de modificação, inserção ou eliminação, essas, pura e simplesmente, não existem!

Quando entramos nos formulários, também não se nota grande diferença se nos cingirmos ao trivial. Os wizards não são maus, se seguirmos os modelos que temos à disposição.
Notámos no entanto uma grande diferença entre o ACCESS e o BASE.
Alterar um formulário constituído com o assistente é extremamente difícil, pois os controlos parecem ter vontade própria e diminuir-lhes ou aumentar-lhes o tamanho, alinhá-los de uma forma pessoal, é tarefa que parece impossível.
Por outro lado, os wizards parecem restringir-se aos componentes principais porque, por exemplo, no ACCESS, ao arrastarmos um botão para um formulário o ACCESS sabe que há um conjunto de tarefas padrão (abrir outro formulário, imprimir um relatório, etc) que podemos querer executar ao premir esse botão e pergunta-nos logo qual queremos efectuar. Só se não for nenhuma das tarefas padrão precisamos escrever algum código.
Aqui não, teremos sempre que escrever o código das tarefas que queiramos levar a cabo!

Os relatórios parecem-nos a ferramenta mais pobre no que diz respeito ao BASE (mesmo com o Sun Report Builder o seu aspecto não tem nada a ver com os relatórios conseguidos com o ACCESS, embora com tempo e estudo (muito) se possam conseguir grandes melhoras).
Também aqui, quando construídos com o assistente, os controlos parecem ter vontade própria e dispô-los à nossa maneira é uma tarefa quase impossível.

Outra coisa que notámos falta no BASE, foi algo parecido com o Intellisense (que por ser patenteado pela Microsoft deve ser muito difícil de "imitar"!) e antevemos grandes dificuldades para quem queira fazer um programa mais ou menos ambicioso sem ter um curso de programação na linguagem.

Também falta no Base um utilitário para dividir os ficheiros em "Front End" e "Back End" para que o mesmo possa ser utilizado em ambiente de multi-utilizador.

Algo que também ainda nos suscita algumas dúvidas é se um projecto desenvolvido no Base num computador, o mesmo funcionará noutro, tal e qual, principalmente se o mesmo contiver macros.
Será que, tal como no ACCESS, o mesmo transporta consigo todas as funcionalidades?

Enfim, se tínhamos notado algumas dificuldades no CALC, no BASE, uffffffffffff!

Temos gasto horas (dias?) na net em busca de ajuda e...mesmo em inglês!

Mas já algo foi conseguido e será trazido aqui oportunamente.

terça-feira, 10 de março de 2009

Macro para actualizar tabelas dinâmicas no CALC do OpenOffice

Nem de propósito, mal tínhamos completado o artigo anterior, descobrimos a macro necessária para actualizar automaticamente todas as tabelas dinâmicas de uma folha de cálculo do CALC (só em inglês conseguimos encontrar)

Pedindo desculpa por não saber a autoria, ela aí fica:

REM ***** BASIC *****
Sub refresh_DBRanges_And_Pilots
REM disable auto-calculation:
bAutoCalc = thisComponent.IsAutomaticCalculationEnabled
thisComponent.enableAutomaticCalculation(False)
oDBRangesEnum = thisComponent.DatabaseRanges.createEnumeration()
refresh_Enumeration(oDBRangesEnum)
oSheetsEnum = thisComponent.Sheets.createEnumeration()
refresh_All_DataPilots(oSheetsEnum)
REM reset auto-calculation to previous state:
thisComponent.enableAutomaticCalculation(bAutoCalc)
End Sub
Sub refresh_All_DataPilots(oSheetsEnum)
REM Bug: Disregards pilots created from datasource
while oSheetsEnum.hasMoreElements()
oSheet = oSheetsEnum.nextElement()
oDPEnum = oSheet.DataPilotTables.createEnumeration()
refresh_Enumeration(oDPEnum)
wend
End Sub
Sub refresh_Enumeration(oEnum)
while oEnum.hasMoreElements()
oNext = oEnum.nextElement()
oNext.refresh()
wend
End Sub


Para os que não sabem como utilizar macros, prometemos que voltaremos ao assunto.

Open Office 3.0 - Calc

Tal como prometemos iremos experimentar, a fundo, cada componente do Open Office.

Resolvemos começar pelo CALC, a folha de cálculo.

Como já díspunhamos de uma folha de cálculo para o Orçamento familiar elaborada em Excel, resolvemos elaborar, de raiz, a mesma folha de cálculo no Calc.

Assim, ao mesmo tempo que testávamos o Calc, fazíamos logo a comparação do Calc com o Excel.

A folha de cálculo será um esboço de um livro mensal, com várias folhas, onde constarão:


1ª. Folha

- Receitas do mês ( Ordenados, etc)

- Despesas do mês ( Habitação, transportes, etc.etc)

Uma Folha para cada rúbrica mensal, constituida por:

- Data do movimento

- Descrição do movimento

- Saidas

- Entradas

- Total de Entradas

- Total de Saidas

- Saldo

Última Folha

- Saldos de Despesas ( Habitação, transportes, etc)

- Saldos de Receitas (Bancos, caixa, devedores, etc)

A primeira página ficará ligada a cada primeira linha de cada página pelos valores destinados a cada rúbrica.

Cada página de cada rúbrica conterá uma tabela dinâmica que calculará os totais de entradas e saidas e, por diferença, calcularemos o saldo que, por sua vez ligaremos à página dos Saldos, à linha respectiva.

Na folha dos saldos haverá, claro, um total de receitas e um total de despesas, bem como uma diferença entre elas para sabermos, sempre, se tudo está certo (se a diferença for diferente de 0 é porque algo correu mal).

Vejamos entao como construimos o livro:

A primeira folha ficou assim:

Cada folha, referente a cada rúbrica ficou assim:

Ligámos a primeira folha com as seguintes, da seguinte forma:

  • Clickámos com o botão direito do rato no valor da rúbrica a copiar

  • Escolhemos o campo da página da rúbrica para onde queriamos colar o resultado (mais uma vez com o botao direito do rato) e escolhemos colar especial.

  • Quando nos apareceu o menu do "colar especial" assinalamos "colar ligação" e clickamos em "OK"

Calculámos os totais de entradas e saidas através de tabela dinâmica, da seguinte forma:

  • Seleccionámos as colunas de SAIDAS e ENTRADAS (seleccção dados pra tabela)

  • Fomos ao Menu Dados---->Assistente de Dados----> Iniciar:

  • Em Selecionar Origem escolhemos "Selecção actual"

Aqui encontrámos, de facto a grande diferença entre o CALC e o Excel, pois neste ponto, aparecer-nos ia um menu onde poderíamos escolher não só o esquema da tabela dinâmica, que nos aparece no CALC, como a suas opções e, entre elas, a opção de “actualizar ao abrir” que, por mais que procurássemos , não encontrámos no CALC.

  • Apareceu-nos o esquema da Tabela Dinâmica com os dados seleccionados (Saidas e Entradas) do lado direito

  • Arrastamos Saidas e Entradas para dentro de "Campos de Dados"

  • em "Mais" escolhemos o esquema da tabela e o local onde queríamos os resultados, ficando assim


Clickando com o botão direito do rato em cima da tabela dinâmica, e escolhendo “Actualizar” a tabela dinâmica actualiza-se

Depois de calculados os totais de entradas e saídas, pela sua diferença, calculamos os saldos.

Uma vez calculados os saldos em cada folha, procedemos à sua ligação com a folha dos saldos da mesma forma que procederamos á ligação da primeira folha com a folha de cada rúbrica, assim:

Na folha dos saldos procedemos então ao cálculo das receitas e das despesas.


Tudo isto para constactarmos que nos saímos perfeitamente no CALC em tudo o que faríamos no Excel, excepto no fazermos com que as tabelas dinamicas se actualizassem automaticamente, o que parecendo que não, é de uma grande importância, pois, suponhamos o que faria a minha mulher que não percebe nada de folhas de cálculo ( o que por acaso não acontece, mas como se trata de suponhamos) para ver qual era a nossa situação financeira em determinada altura?

Pois abriria a folha de cálculo e iria logo para a folha dos saldos que poderia não estar certa, bastando, para tanto, que eu, ao registar os últimos movimentos, me esquecesse de ter actualizado todas as tabelas dinâmicas.


PS: Se alguem quiser o exemplo construído é so deixar aqui o mail que enviarei directamente.


terça-feira, 3 de março de 2009

Ferramenta de recorte

Se gosta de ilustrar os seus artigos com imagens originais, o Windows Vista tem um utilitário que lhe permite capturar qualquer imagem que tenha no seu ecran.

Ele está em Iniciar-Todos os programas-Acessórios- Ferramenta de recorte.

Uma vez aberto, é seleccionar ( com o rato) a área que deseja copiar e depois guardar.

O pacote de escritório

O OpenOffice é um projecto de software aberto, criado por iniciativa da SUN Microsystems, que pretende constituir uma alternativa ao Microsoft-Office, compatível com este mas de multiplataforma (disponível em vários sistemas operativos) e livre (grátis e com a possibilidade de ser copiado e alterado).

Actualmente, tem :
- um processador de texto (Writer)
- uma folha de cálculo (Calc)
- uma aplicação de apresentações (Impress)
- uma aplicação de desenho (Draw)
- um editor de formulas matemáticas (Math)
- um gestor de base de dados (Base).

Pode fazer o download aqui

P.S. : Numa primeira impressão, este pacote parece uma imitação barata (neste caso grátis) do Micsrosoft Office, mas não se fique por ai, tente ir mais fundo, que é o que estamos a fazer neste momento e prometemos uma análise mais aprofundada (feita por componente) à medida que se for achando oportuno.

O programa de email

Depois do Windows Vista instalado, do computador com um nível de segurança bastante elevado e se é daqueles utilizadores que não gosta de ir aos diversos provedores ver os mails que tem e responder a eles ou criar novos, certamente que gostará de ter um programa de email.

Pois bem, no Windows Vista, não ande à procura do Outlook Express (ele não existe) agora o seu programa é o Windows Mail.

Ele está em Iniciar-Todos os programas- Windows Mail.

Bàsicamente, a sua configuração é igual á do Outlook.