sábado, dezembro 29, 2007
Mobilidade
Depois de uma longa ausência, eis-me aqui novamente; o que não é grande coisa. Não sei se isso interessa a alguém, mas agora entrei na era da mobilidade, adquiri meu primeiro notebook!
Ele não é "aquele" notebook, mas é uma maquininha de respeito: Dell Vostro 1000, processador AMD Turion 64 x2, 1 GB de RAM, HD de 120 GB, Wireless, gravador de DVD; dá pra brincar sem passar raiva.
Aqui vai uma fotinha dele tirada com o celular, ainda com os plásticos de fábrica, que por sinal, me conhecendo como conheço, sei que vão ficar alí por um bom tempo!
Até mais!
domingo, novembro 25, 2007
Update usando Case
Ficamos naquela, dá, não dá? Procuramos na net, fizemos um teste e vimos que era mesmo possível fazer isso. Confesso que nunca tinha usado isso, mas a instrução funciona que é uma beleza.
Pra mostrar como ficou a solução, vamos fazer um exemplo. Imagine que temos uma tabela de preços e precisamos ajustá-la da conforme abaixo
- Produtos com preço até R$ 100 sofrem reajuste de 5%;
- Produtos com preço de R$ 101 a R$ 500 sofrem reajuste de 3%;
- Produtos com preço acima de R$ 500 sofrem reajusto de 1,5%;
update tab_preco
set preco =
case
when preco <= 100 preco * 1.05
when preco > 100 and preco <= 500 then preco * 1.03 when preco > 500 then preco * 1.015
end
Como se vê, é muito simples e extremamente funcional. Poderia ter sido usado o valor de outro campo para a condição. Exemplo:
update tab_preco
set preco =
case grupo
when 'LIMPEZA' then preco * 1.05
when 'ALIMENTACAO' then preco * 1.1
when 'VESTUARIO' then preco * 1.05
else preco * 1.02
end
Até +
quinta-feira, novembro 22, 2007
Máscara em Campos Agregados - Alternativa
Não me lembro de ter feito isso antes, e hoje precisei colocar máscara (DisplayFormat) em um campo Agregado (TAggregate) de um ClientDataSet, e não sei por que cargas d'água não consegui. O negócio simplesmente não funciona de jeito nenhum! Tentei várias máscaras, mudei propriedades, mas nada.
Como estava com pressa, não "googlei" muito, e acabei resolvendo o problema de forma caseira. A solução foi implementar o evento OnGetText do campo agregado e depois compartilhar o evento entre os agregados. Ficou assim:
procedure TfrmMeuFormulario.cdsExemplototal_pesoGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
//Outras mascaras podem ser usadas
Text := FormatFloat('#,##0', Sender.Value);
end;
Aliás, quem tiver a solução definitiva para esse problema podem apresentar à vontade, pois eu também gostaria de saber.
quarta-feira, setembro 26, 2007
Versões mais usadas de Delphi
Há alguns dias estava no ar no meu blog uma enquete sobre a versão mais utilizada do Delphi, que foi submetida à votação de desenvolvedores de todo o país, que participam de comunidades e foruns relacionados ao Delphi. O resultado está a seguir, e confesso que não fiquei surpreso.
Abraços.
Versão Utilização
Delphi 7 57,35%
Delphi 2006 16,18%
Delphi 5/6 8,82%
Delphi 2007 7,35%
Outra versão 5,88%
Delphi 2005 4,41%
sábado, setembro 08, 2007
Criptografia sem frescura
function Criptografar(wStri: String): String;
var Simbolos: array [0..4] of String;
x : Integer;
begin
Simbolos[1]:= 'ABCDEFGHIJLMNOPQRSTUVXZYWK ~!@#$%^&*()\';
Simbolos[2]:= 'ÂÀ©Øû׃çêùÿ5Üø£úñѪº¿®¬¼ëèïÙýÄÅÉæÆôöò»Á';
Simbolos[3]:='abcdefghijlmnopqrstuvxzywk1234567890';
Simbolos[4]:='áâäàåíóÇü龶§÷ÎÏ-+ÌÓ߸°¨·¹³²Õµþîì¡«½';
for x := 1 to Length(Trim(wStri)) do
begin
if pos(Copy(wStri,x,1),Simbolos[1]) > 0 then
Result := Result + Copy(Simbolos[2],Pos(copy(wStri,x,1),Simbolos[1]),1)
else if Pos(Copy(wStri,x,1),Simbolos[2]) > 0 then
Result := Result + Copy(Simbolos[1],Pos(copy(wStri,x,1),Simbolos[2]),1)
else if Pos(Copy(wStri,x,1),Simbolos[3]) > 0 then
Result := Result + Copy(Simbolos[4],Pos(copy(wStri,x,1),Simbolos[3]),1)
else if Pos(Copy(wStri,x,1),Simbolos[4]) > 0 then
Result := Result + Copy(Simbolos[3],Pos(copy(wStri,x,1),Simbolos[4]),1);
end;
end;
Abraços
quinta-feira, setembro 06, 2007
Tim WEB
Já fazia um tempo que buscava um opção viável, principalmente no aspecto econômico, de poder acessar a WEB da minha propriedade rural, que fica a no interior paulista, mais precisamente em Barretos, a 30 Km da cidade, onde não há telefonia cabeada e que fica fora de alcance de Internet via rádio.
A Tim oferece 3 pacotes no plano WEB: um de 40MB de tráfego, com mensalidade de R$ 9,90 e modem por R$ 399, um de 250MB, com mensalidade de R$ 19,90 e modem por R$ 199 (o que optei), e o último, que permite até 1GB de tráfego, com mensalidade nos 6 primeiros meses de R$ 49,90 e modem grátis.
Portanto, pra encerrar vamos a uma resumo:
- Plano/Valor: 250MB / R$19,90 mensais;
- Modem: Huawei e220;
- Velocidade: 4-6 KB/s;
- Intensidade do sinal: fraca;
- Local: difícil acesso;
- Grau de satisfação (nessas condições): muito satisfeito!
Até a próxima!
sexta-feira, agosto 31, 2007
Enquete
quinta-feira, agosto 30, 2007
Internet Móvel
Pra minha sorte a TIM lançou um novo serviço chamado TIM WEB, que permite se conectar à internet em qualquer local onde haja cobertura dessa operadora. A conexão se dá através de um modem USB, e pode ser conectado em desktops e notebooks de maneira muito simples.
No meu próximo post comentarei sobre o serviço, os preços, a velocidade e como estou usando essa tecnologia. Até lá!
sexta-feira, julho 27, 2007
Brasil só ganha da Colômbia em uso da internet na América Latina
Alguns números de junho de 2007:
- 15,8 milhões de brasileiros visitaram pelo menos uma página da Internet neste período;
- Isso representam 11% da população do Brasil. Enquanto no Chile esse número foi de 45%, na Argentina, 24%, no México, 14%, e, na Colômbia (a pior colocada), 9%;
- 32 horas por mês, esse é o tempo médio que o brasileiro navega, acima da média mundial que é de 25 horas/mês;
- O brasileiros visitam em média 3371 páginas/mês, 44% a mais que a média da América Latina e 33 acima da média mundial;
- O Brasil aprensentou 18 mi de usuários ativos de Internet, ou seja, que acessaram regularmente nos últimos 30 dias;
Os dados foram levantados pela empresa comScore, uma das mais respeitadas no setor de pesquisas do mundo digital, sendo que essa é a primeira vez em que ela faz um levantamento sobre o uso de internet na América Latina.
terça-feira, julho 17, 2007
Velório Virtual
Num primeiro momento pode até parecer mórbido, mas de fato não é. Pode acontecer de perdermos subitamente pessoas queridas e não termos condições de ir pessoalmente até o velório, por causa de uma viagem, por exemplo. Neste caso, o "Velório Virtual" pode ser uma alternativa para uma último adeus.
sexta-feira, junho 29, 2007
No mínimo, triste....
É uma pena, uma pena mesmo, não só porque o conteúdo do site era ótimo, com excelentes colunistas, que usavam de criatividade e bom humor para tratar dos mais diversos assuntos, mas também, por ver que em nosso belo país, conteúdo não desperta interesse, enquanto banalidades e assuntos sem valor arrastam centenas de anunciantes para sites que nada acrescentam.
Fica aqui nosso agradecimento a equipe do site No Minimo e o desejo de que tenham sucesso em suas novas empreitadas.
sexta-feira, junho 22, 2007
De mãozinhas dadas
Acharam que eu tinha abandonado esse blog né? Estavam enganados! Pra alegria geral (acho que só minha) estou de volta.
Quero retomar meus posts comentando, para quem ainda não sabe, a parceria firmada no dia 1 de maio entre o projeto Ubuntu Linux, mantido pelo Canonical, e a Dell computadores. Como devem saber, a Dell é uma gigante mundial em venda direta de computadores, e o projeto Ubuntu é uma ousada iniciativa de distribuição gratuíta, em nível mundial, do sistema operacional do pinguim, que envia CD's diretamente a quem solicitar.
Em minha humilde opinião, a Microsoft deveria olhar atentamente para essa parceria, pois o Ubuntu Linux é uma distribuição fantástica. Leve, bonita, intuitiva, que pode até mesmo ser executada sem instalação, e que agora, com essa parceria, certamente vai ganhar visibilidade e muitos usuários. Você pode estar perguntando: quem ganha com isso? A Dell? Que poderá vender seus computadores com preço mais acessível ainda? O Ubuntu Linux? Que agora pode ganhar mercado e deixar de ser um projeto "filantrópico"?
Certamente que as duas ganharão com a parceria, no entanto, mais alguém pode sair ganhando: o usuário de computador, que poderá agora experimentar um SO alternativo veloz, eficiente, seguro e que, o melhor de tudo, não custa nada
sábado, abril 21, 2007
Férias
Vai ser um período de descanso e reciclagem. Espero voltar com novidades.
Té+
Semana de Informática da ETE Cel Raphael Brandão
sexta-feira, abril 13, 2007
IV Barretos Motorcycles
Para quem, como eu, passa grande parte do tempo sobre duas rodas, seja a trabalho, seja a lazer, acontece em Barretos de 27 a 29 de abril o IV Barretos Motorcyles. Atualmente já é considerado o segundo maior encontro de motociclistas do país. Sintam-se convidados.
terça-feira, abril 10, 2007
Será que já não vi esse filme?
No fundo compreendo que a CodeGear tenha um interesse maior em seu "top de linha", pois, pra se ter uma idéia, o BDS 2006 Professional (D2006, C++Builder 2006 + C# Builder 2006) para novos usuários (a versão mais barata) custa hoje, em promoção, R$ 2.452,50, enquanto que qualquer um dos Turbos sai por R$ 1.200,00, ou seja, metade do preço. Será que já não vimos esse filme com o Kylix (alguém se lembra dele)?
Honestamente, acho que a CodeGear deveria focar mais nessa linha, afinal, quantos de nós desenvolvemos comercialmente em mais de uma linguagem? Eu pessoalmente, uso o Delphi e comecei agora a "brincar" com o C#, então pra quê eu quero Delphi, C++ e C# no mesmo pacote?
Tudo bem, se o preço fosse acessível como o do Visual Studio, que custa entre R$ 1.200,00 e R$ 1.700,00 e vem com IDE para C# e VB.NET. E com todo respeito a CodeGear, o VS dá um banho em termos de produtividade.
segunda-feira, abril 02, 2007
Cursos OnLine Gratuítos
O Next Generation é um site de atualização on-line, que oferece cursos gratuitos pela Internet. Os cursos são modulares e com certificado de conclusão, muito bom para você se manter atualizado .
Vale a pena conferirsexta-feira, março 30, 2007
Operador Ternário em C#
O primeiro recurso diferente que encontrei foi o operador ternário. Para quem já usou o MS Excel, o operador ternário pode ser comparado à função "SE", onde em uma única instrução podemos escolher entre dois valores. A sintaxe do operador ternário é:
condicao ? valor_se_verdadeiro : valor_se_falso
Abaixo eu mostro um exemplo; nele declaro 3 variáveis A, B e C. A e B recebem valores quaisquer, enquanto C vai receber o maior valor entre A e B.
Para os valores sugeridos no exemplo o resultado será:
Neste exemplo usei o Turbo C# da Code Gear, uma excelente ferramenta.
Abraços.
quinta-feira, março 29, 2007
Yahoo lançará e-mail ilimitado
A novidade foi divulgada por John Kremer, vice-presidente do Yahoo Mail, em post no blog Yodel Anecdotal.
Resta saber agora como será a reação dos concorrentes, mas uma coisa é certa: com essa "briga", quem certamente sairá ganhando serão os usuários.
Até +
quinta-feira, março 22, 2007
Quanto cobrar pelo seu sistema?
O preço depende, é claro, da complexidade do sistema, mas discrepância é que não faltou, sendo que uns cobram R$100,00 por sistema e R$ 0,00 de manutenção (acreditam nisso?), outros cobram R$1.000,00 de implantação mais R$ 150,00 por licença mensalmente, o que é um valor no mínimo razoável. Há aqueles que cobram exageros, que acho melhor nem comentar.
Um texto muito bom, publicado pelo colega José Carlos Macoratti, pode ser lido aqui. Neste texto ele faz uma explanação séria e muito coerente sobre tema, vale a pena ler.
quarta-feira, março 21, 2007
TADOQuery trabalhando com dados em cache
Isso é muito bom quando trabalhamos com tabelas do tipo mestre-detalhe, onde na maioria das vezes é necessário setar os campos relacionados antes do envio dos dados ao banco. O processo fica ainda mais tranquilo se for usado TADOConnection para controlar a transação, pois, você pode "commitar" os dados da tabela mestre e em seguida os da tabela detalhe e, caso ocorra algum erro, pode abortar, tratar o erro e tentar a gravação novamente sem que o usuário perca seu trabalho.
Bem, vamos ao que interessa! Para isso tudo funcionar primeiro altere a propriedade LockType do TADOQuery para ltBatchOptimistic, isso já fará com que os dados fiquem no cache local. Agora, para postar efetivamente os dados no banco, chame o método UpdateBatch(), que é semelhante ao método ApplyUpdates do TQuery. Fácil, não? :)
Como eu já disse, esse é um recurso muito útil, mas pouco conhecido. Espero que gostem da dica.
Até a próxima.
terça-feira, março 20, 2007
Salvando o seu formulário como imagem
Imaginemos o exemplo clássico, um formulário "Form1" e um botão "Button1", o evento OnClick do botão ficaria como abaixo:
procedure TForm1.Button1Click(Sender: TObject);
var JPEG: TJPEGImage;
begin
JPEG := TJPEGImage.Create;
JPEG.Assign(form1.GetFormImage);
JPEG.SaveToFile('caminho\meuform.jpg');
end;
Fácil né? :) Vocês podem dar um rebuscada na solução usando um TSaveDialog para que o usuário possa escolher o local e o nome do arquivo a ser salvo.
Até a próxima.
Ah! Não esqueçam de declarar o unit JPEG na cláusula Uses.
terça-feira, março 13, 2007
Code Gear - Delphi Tour
Declaração de Imposto de Renda 2007
Neste ano, mais uma vez, sentirei a mordida do leão da Receita Federal. Juntamente com o IPVA, esse é um dos impostos que mais protesto na hora do pagamento, mas, infelizmente, não há como fugir dele. Aliás, ter até tem, mas não quero que diminuam meu salário :), e tentar evitar seu pagamento através de certas "técnicas" não faz o meu tipo, mais cedo ou mais tarde acabamos tendo problema.
Hoje dando uma vasculhada na Internet sobre as formas de declaração, encontrei um artigo bem interessante e resolvi transcrevê-lo aqui. Acredito que pode ser valia para muitos que estejam fazendo a declaração pela primeira vez.
Diferença entre Declaração simplificada ou completa
Quem ainda não fez a declaração do IR, tem duas opções para prestar contas à Receita Federal: a declaração simplificada ou a completa.
A declaração simplificada é indicada para que tem deduções abaixo de R$ 11.177,20. Serve para quem não têm muitas deduções a fazer ou que não têm como comprovar os gastos. Além disso, o contribuinte terá um desconto de 20% nos rendimentos tributáveis. Contribuintes com ganhos
acima de R$ 55.886,00 também poderão fazer a declaração simplificada, mas terão apenas o desconto limite.
Já a declaração completa é para os contribuintes que têm deduções comprovadas acima de R$11.177,20 ou que superem os 20% de rendimentos tributáveis. Neste caso, o desconto será maior que os 20% da declaração simplificada.
Podem ser deduzidos do IR gastos com dependentes, médicos, dentistas, hospitais, clínicas, escola, faculdade, pensão alimentícia, previdência privada, pagamento de advogados, engenheiros, arquitetos, aluguéis, arrendamento rural e outros.
A entrega da declaração pode ser feita pela Internet até o dia 30 de abril. Para enviar as informações à Receita Federal pela Web é necessário utilizar outro programa, o Receitanet.
Não há previsão para prorrogação do prazo por isso é importante não deixar para a última hora. Além de enviar pela Web, o contribuinte também pode mandar por disquete ou formulário. O pagamento da restituição - aos contribuintes que têm esse direito - acontece por ordem de entrega, priorizando idosos com 60 anos ou mais e declarações entregues por meio magnético
Fonte: Yahoo Notíciasquarta-feira, fevereiro 28, 2007
Incursões em C#
Como profissionais em desenvolvimento de software, precisamos sempre
ficar atentos as novas tecnologias e linguagens que surgem de tempos
em tempos. Confesso que sou um pouco cético (ou conservador, como
queiram) com relação a novas tecnologias, não costumando ir na onda de
modismos ou de entusiastas que elegem uma tecnologia como
revolucionária e bradam aos quatro cantos que ela é melhor, sem que
uma análise profunda seja feita.
Claro que muitas tecnologias boas emergem nesse meio fecundo que é a
área da tecnologia da informação, mas prefiro me nortear pelo
movimento do mercado, ou seja, me orientar pelas tecnologias que as
empresas estão usando ou naquelas que elas estão investindo, pois
sejamos francos: a coisa só vai pra frente quando há grana na parada,
num é mesmo?
Vejam por exemplo o caso do Java. Tenho certeza que ela só chegou onde
está, se tornando uma das tecnologias mais difundidas e usadas no
mundo, graças ao investimento e apoio de grandes como IBM e Oracle.
Partindo desse cenário, estou iniciando uma reciclagem, pois como não
deve ser novidade para ninguém, programo "fluentemente" em Delphi, e
vejo que já está na hora de respirar novas sintaxes. :)
Ao longo deste ano quero estudar seriamente C# e Java, e se até o ano
que vem os ventos continuarem soprando a favor do Ruby on Rails, que em 2006
foi eleita a linguagem do ano pelo TPC Index, certamente ela será uma
das eleitas para 2008.
Um abraço e até a próxima.
--
Nappe
quarta-feira, fevereiro 07, 2007
Dica de Delphi - Exportar dataset para arquivo texto de largura fixa
Vez ou outra sempre há a necessidade de se gerar um arquivo texto de
largura fixa, seja para enviar para algum, lugar seja para exportação
para outro sistema. A rotina a seguir faz isso, usando como referencia
para a largura das colunas o próprio tamanho do campo. Detalhe: no
caso de campos Float, eles serão formatados com 3 casas após a
virgula, mas basta uma "mexidinha" no código para adequar à sua
necessidade.
Divirtam-se!
GeraTextoLarguraFixa(Dataset: TDataset; Separador: Char);
var
intI, intII, intIII: Integer;
strLista: TStringList;
strLinha: string;
dlgSalvar: TSaveDialog;
vetLarguraColuna: array of Byte;
begin
if Dataset.Active = False then
begin
MessageDlg('O arquivo texto não poderá ser gerado porque o
Dataset está fechado!',
mtWarning, [mbOk], 0);
Exit;
end;
dlgSalvar := TSaveDialog.Create(Self);
dlgSalvar.Title := 'Salvar Arquivo Texto';
dlgSalvar.Filter := 'Arquivos Texto|*.txt|Todos os arquivos|*.*';
strLista := TStringList.Create;
strLinha := EmptyStr;
SetLength(vetLarguraColuna, Dataset.FieldCount);
for intI := 0 to Dataset.FieldCount - 1 do
if Dataset.Fields[intI].DisplayWidth >
Length(Dataset.Fields[intI].DisplayLabel) then
vetLarguraColuna[intI] := Dataset.Fields[intI].DisplayWidth
else
vetLarguraColuna[intI] := Length(Dataset.Fields[intI].DisplayLabel);
//Cria a primeira linha com os nomes das colunas
for intI := 0 to Dataset.Fields.Count - 1 do
begin
strLinha := strLinha + Dataset.Fields[intI].DisplayLabel;
if vetLarguraColuna[intI] >
Length(Dataset.Fields[intI].DisplayLabel) then
for intII := Length(Dataset.Fields[intI].DisplayLabel) to
vetLarguraColuna[intI] do
strLinha := strLinha + ' '
else
strLinha := strLinha + ' ';
end;
strLista.Add(strLinha);
strLinha := EmptyStr;
for intI := 1 to Dataset.RecordCount do
begin
for intII := 0 to Dataset.Fields.Count - 1 do
begin
if Dataset.Fields[intII].DataType in [ftFloat, ftCurrency,
ftBCD, ftFMTBcd] then
begin
for intIII := Length(FormatFloat('##0.000',
Dataset.Fields[intII].AsFloat)) to vetLarguraColuna[intII] - 1 do
strLinha := strLinha + '0';
strLinha := strLinha + FormatFloat('##0.000',
Dataset.Fields[intII].AsFloat) + ' ';
end
else
begin
strLinha := strLinha + Dataset.Fields[intII].AsString;
for intIII := Length(Dataset.Fields[intII].AsString) to
vetLarguraColuna[intII] do
strLinha := strLinha + ' ';
end;
end;
strLista.Add(strLinha);
strLinha := EmptyStr;
Dataset.Next;
end;
if dlgSalvar.Execute then
try
strLista.SaveToFile(dlgSalvar.FileName);
MessageDlg('O arquivo "' + dlgSalvar.FileName + '" foi gerado
com sucesso!',
mtInformation, [mbOK], 0);
except
on Erro: Exception do
MessageDlg('Não foi possível gerar o arquivo ' +
dlgSalvar.FileName + '.' +
#13#13 + 'Erro:' + #13 + Erro.Message, mtError, [mbOk], 0);
end;
dlgSalvar.Destroy;
strLista.Free;
end;
--
Fernando D. Nappe
Analista de Sistemas
terça-feira, janeiro 23, 2007
Ranking das Linguagens mais usadas
Para aqueles que são desenvolvedores é sempre importante saber a quantas andam as linguagens de programação, assim é possível decidir em quais delas vale a pena investir estudos.
Baseado em pesquisas nos mecanismos de busca e atualizado mensalmente, o TPC Index é uma espécie de índice de popularidade das linguagens de programação.
Anotem o link aí e fiquem de olho: http://www.tiobe.com/tpci.htm
Abraços
quinta-feira, janeiro 18, 2007
Dica de Delphi - Ativando e desativando objetos em formulários
É muito comum precisarmos habilitar e desabilitar objetos em um formulário em função de outro objeto. Veja o exemplo abaixo:
edtConjuge.Enabled := True
É uma forma que funciona, mas poderia ser bem mais simples:
Neste caso, estamos condicionando o a propriedade Enabled à igualdade ItemIndex = 1. Desta forma, além de ser mais elegante exige menos código.