segunda-feira, dezembro 19, 2005

Diversos - Dica sobre gravadora de CD / DVD

Galera,
tive um problema recente e talvez possa ajudar a alguns. Toda gravadora de CD / DVD, possui um software que roda dentro do drive. Este software recebe o nome de FirmWare.
Estava com problema com a minha gravadora de CD, onde a cada cd que eu gravava, eu perdia dois outros. Fui procurar a solução na Internet e descobri que quase todas as gravadoras de Cd / DVD (LG, Sony, TEAC, etc...) necessitam de atualização no FirmWare.
No meu caso a minha gravadora é LG e vi um artigo dizendo que todas as gravadoras da LG necessitam de atualização do FirmWare. Caso você não atualize, pode ter problemas com interrupção de gravação (perda do CD), baixa velocidade (no meu caso, só gravava CD em 16X. Após a atualização, comecei a gravar em 52X), não reconhecimento de alguns CDs, travamento da gravadora e etc...

Só uma observação, não sei se é verdade, mas vi um alerta dizendo que se ocorrer um problema no meio da atualização do FirmWare a sua gravadora pode parar de funcionar, necessitando ser enviada para uma autorizada. A atualização demora em média 10 segundos.

Abaixo via o Link da Lg para você pesquisar informações sobre o firmware da sua gravadora http://www.lge.com/support/software_gcsc.jsp

sexta-feira, dezembro 09, 2005

quarta-feira, dezembro 07, 2005

PowerBuilder – Problemas com Redimensionamento de janelas

No Build 9.0.3 8004 do PowerBuilder, não existia nenhum problema quando ao redimensionamento de janelas.
Nos builds superiores ao 8004, se a janela estiver marcada com a opção de CENTER (Posicionar centralmente) o redimensionamento não funciona.

segunda-feira, novembro 28, 2005

sexta-feira, novembro 25, 2005

Diversos - Foco na Solução

DIFERENÇA ENTRE "FOCO NO PROBLEMA" E "FOCO NA SOLUÇÃO"
Quando a NASA iniciou o lançamento de astronautas, descobriu-se que as canetas não funcionariam com gravidade zero. Para resolver este enorme problema, contrataram a Andersen Consulting, hoje Accenture. Empregaram uma década e 12 milhões de dólares. Conseguiram desenvolver uma caneta que escrevesse com gravidade zero, de ponta-cabeça, debaixo d'água, em praticamente qualquer superfície incluindo cristal e em variações de temperatura desde abaixo de zero até mais de 300 graus Celsius.

Os russos usaram um lápis...

Pensem nisso.

terça-feira, novembro 15, 2005

Windows XP - Dicas de Segurança

There are a few critical things you should do to insure the safety of your machine and, most importantly, your data.

  • Back up your data. If something happens to your machine, you will still have your data.
  • Keep your operating system and software up to date. Frequent security patches come out for Windows XP. These patches help protect your computer and data.
  • Install and use anti-virus software.
  • Do not create unnecessary accounts on your machine.
  • Disable accounts you are not using, including the built-in system accounts.
  • Password all accounts that you use. Choose passwords that are tricky to figure out. When you give an account a password you must remember it. If you forget the password for your account with administrator privileges you will NO longer be able to log into the machine, use it, or even access your files!!
  • Do not share files or folders across the network, unless you absolutely must. If you must share files, do so cautiously and turn on the least amount of access possible. Use simple file sharing and make sure network users are NOT allowed to change your files.
  • If you are not sharing files or folders make sure you explicitly turn off file and print sharing for each network connection

quinta-feira, novembro 03, 2005

Desenvolvimento - Comparação entre ferramentas de Controle de Versão

Abaixo está um artigo que recebi comparando várias ferramentas de controle de versão de arquivos.

To view the full article, please visithttp://www.BetterVssRemoting.com
Better VSS Remote Access Tool
This article makes a detailed comparison among SourceAnyWhere,SourceOffSite, VSS Remoting and possible others.
Keywords: VSS Remote Access, VSS Web Access, VSS Internet Access,SourceSafe Remote Access, SourceSafe Web Access, SourceSafe
Internet Access, SourceOffSite, SourceAnyWhere, VSS Remoting


1. Overview

What does the article do?
It makes a comparison among:· SourceAnyWhere 4.0· SourceOffSite 4.1· VSS Connect 1.5· SourceXT 2.1· VSS Remoting 2.5· VSS.NET 1.67

Our initiative is to make an unbiased, objective, repeatable andverifiable comparison:
a. Real project is used. The project I use is eMule, which is athttp://sourceforge.net/projects/emule/
b. Detailed steps are presented. You can follow the detailed stepseasily.
c. If you want to make a comment, I can be reached at[Email]bettervssremoting@yahoo.com.[/Email]

If you need more info, please visit their official websites:
· SourceAnyWhere (SAW) from DynamSoft http://www.dynamsoft.com
· SourceOffSite (SOS) from SourceGear http://www.sourcegear.com
· VSS Connect from VoxCode http://www.vssconnect.com
· SourceXT from ACORDEN http://www.acorden.com
· VSS Remoting from Source Remoting http://www.sourceremoting.com
· VSS.NET from DMB Consulting http://www.dmbcllc.com
· Want to add a product? Write to me: bettervssremoting@yahoo.com

The real result may vary if you do the test in different environment or
different files are used. However, the basic concept of thiscomparison,such as which one is the fastest, which one has more VSS features,should be applicable everywhere.

To view the full article, please go tohttp://www.bettervssremoting.com


2. Comparison Summary (5 star ***** is the best)

Speed Comparison
SAW *****
SOS **
VSS Connect **
SourceXT **
VSS Remoting **
VSS.NET *

Stability Comparison
SAW *****
SOS **
VSS Connect ***
SourceXT **
VSS Remoting **
VSS.NET *

Security
SAW ****
SOS ***
VSS Connect ***
SourceXT **
VSS Remoting ***
VSS.NET **

VSS Feature Support
SAW ****
SOS ****
VSS Connect **
SourceXT **
VSS Remoting **
VSS.NET *

Usability
SAW ****
SOS **
VSS Connect **
SourceXT **
VSS Remoting **
VSS.NET *

Diff/Merge
SAW ****
SOS ****
VSS Connect
SourceXT
VSS Remoting **
VSS.NET

IDE Integration
SAW *****
SOS ***
VSS Connect **
SourceXT **
VSS Remoting **
VSS.NET

Cross Platform
SAW *****
SOS *****
VSS Connect *
SourceXT *
VSS Remoting ***
VSS.NET *

Speed:
I am totally surprised and excited by the speed of SourceAnyWhere. Forsome operations, SourceAnyWhere can be up to 40+ times faster thanother five products.

Stability:
SourceAnyWhere never has any problem in the whole test.
SourceOffSite has several problems when it comes to stability. The bigproblem of SourceOffSite is cancel. There is no cancel support in IDEintegration. After a cancel operation in Add, Checkin, Checkout or Getin SourceOffSite Explorer, the CPU usage of SourceOffSite server goesup to almost 100% and can not come down, unless the server isrestarted.VSS Connect and SourceXT also have problems in stability. On big fileoperations, they are very possible to crash. But both two have a goodhandling of Cancel. And, VSS crashes every time when I try adding aspecial directory such as "c:\" and "My Computer".

VSS Remoting has difficulty to add file and it fails to operate on bigfiles.

VSS.NET has problems in big file operation during the whole test. Andit cannot handle the Cancel operations.

Security:
What makes SourceAnyWhere unique is the password policy.
SourceAnyWhere, SourceOffSite and VSS Connect use 128-bit cryptography.
SourceOffSite and SourceAnyWhere use BlowFish..VSS Remoting uses HTTPS.

VSS Feature Support:
Most of the six products support ordinary VSS features such as Add,Get, Checkin, Checkout and so on. However, only SourceAnyWhere has adetailed and full support for almost all of VSS features.Except SourceAnyWhere, all the products does not have supports for EOL(end-of-line). Different OS use different end-of-line characters intext files. Without EOL support, text files got to local may not beread correctly. For example, in Rational the EOL character is "/n"but in Windows it is "/r/n". When getting a text file from Rational toWindows without a support for EOL, the text will not be displayednormally.
SourceXT, VSS Remoting and VSS.Net have no support for Pin. Assuming afile is pinned in VSS Server, then what if Pin is not supported? First,the pinned file can still be checked out by Client, which is a greatdanger to the pinned file. Second, when performing a get, the mostrecent version will be got, not the pinned version. This can probablycause version confusion.
SourceAnyWhere has a "Server-base time zone offset" option, othersdon't. In my opinion, it is very important to synchronize Server timeand Client time. Imagine this, the Server time is 10 hours ahead ofClient time. When you edit a file and check it in at 2/23 9:00PM(Client time), but on the Server side, time of this version reads 2/247:00AM. So in the future when you need to get version of 2/23 9:00PMactually, you may mistakenly get another version.

Usability:
SAW is the best. All the Windows of SAW is in Win32 style. It candetect if a file is changed automatically.

Diff/MergeIn File Diff (2-way)/File Merge (3-way), SourceAnyWhere andSourceOffSite run neck and neck; VSS Remoting has a lowperformance
IDE Integration:SourceAnyWhere, SourceOffSite and VSS Remoting all support MSSCCIIntegration.VSS Remoting supports DreamWeaver integration
I have not tested the IDE integration intensively. I give this ratejust according to manual of the three products.

Cross Platform:
Besides its Windows client, SAW has a Java client built on JDK 1.4.2,so that it can cross any platform where JDK can run such as Linux, Mac,Solaris, AIX, HP-UX, SCO Unix and FreeBSD.SourceOffSite can cross Linux and Mac OS X.
VSS Remoting has a web interface which can login server through web.


3. Test Environment

Test Data
Real project is used for testAll eMule0.44c and eMule0.44d files are downloaded from SourceforgeDownload eMule0.44c (3.1M) and eMule0.44d (3.1M) used in the testBig Files are simulated files created by us

Server Configuration
· P4, 2.8G, 256M RAM, Windows XP Professional
· SourceAnyWhere profession 4.0 DEMO Server
· SourceOffSite4.1 with Cryptography DEMO Server
· VSS Connect Server 1.5· SourceXT Server 2.1
· VSS Remoting Server 2.5
· VSS.NET Server 1.67
· Visual SourceSafe6.0 + Sp6

Client Configuration
· P4 Celeron 2.0G, 256M RAM, Windows 2003
· ADSL connection
· SourceAnyWhere profession 4.0
· SourceOffSite 4.1 with Cryptography
· VSS Connect Client 1.5
· SourceXT Client 2.1
· VSS Remoting Client 2.5
· VSS.NET Client 1.67

4. Test Methodology
All the three products are tested on the same computers and internetconnection
All the three products are tested on the same data set
All the three products are tested with the same process
For speed test, every action is carried out 5 times
The initial state of the VSS database is empty (newly created)

PowerBuilder - Execução de Scripts dinamicamente

Recentemente, foi colocada uma dúvida no grupo de PowerBuilder do Yahoo, a possibilidade executar scripts dinamicamente.

No site http://www.mycgiserver.com/~unoksoftgroup/powerbuilder_pborca/powerbuilder_pborca.html#dynamicscript existe um demo de aplicação que permite este tipo de tarefa.

Obs: A resposta acima foi fornecida por Carlos Klein

sexta-feira, outubro 28, 2005

PowerBuilder - Recuperando a Data de Compilação do Executável

Existem várias formas de recuperar a data de geração do executável, como utilizar a API do Windows. Recentemente eu li um artigo de um dos desenvolvedores do PowerBuilder que possui uma solução simples e que funciona muito bem.

Faça o seguinte, declare duas constantes globais e atribua today() e now() para elas, assim:
constant date gd_compiled = Today()
constant time gt_compiled = now()

No momento que você compila o executável, o PowerBuilder preenche e armazena a data e hora de geração. Isso ocorre porque a constante é fixa e preenchida no momento de geração do executável.

Só mais uma informação, não é possível fazer o procedimento acima utilizando uma variável datetime, pois é considerado um tipo de dado complexo e o PowerBuilder não permite declarar uma constante deste tipo de dados.

quinta-feira, outubro 27, 2005

segunda-feira, outubro 17, 2005

Visual SourceSafe – Movendo projetos entre base de dados

Recentemente vi em no NewsGroup da Microsoft (USA) um artigo de como mover projetos do VSS entre 2 bases de dados diferente. A solução definida pela equipe da Microsoft é gerar um arquivo de Archive e Importar o Arquivo na nova base de dados, presenvando todas as informações, inclusive o histórico.

Abaixo está o trecho em inglês:

You can use the archive/restore functionality in VSS to move projects between databases and preservethe history. You can either use command line utilities like ssarc.exe/ssrestor.exe, or you can use the Archive menu items in VSS Administrator program.”

By Alin Constantin

PowerBuilder – Converter PBD para PBL

Participo de alguns grupos de notícias e listas de e-mail. Um assunto frequentemente questionado é a possibilidade de se fazer uma conversão de PBD para PBL, conhecido também como engenharia reversa de aplicativo.

Conversando com a equipe de desenvolvimento do PowerBuilder da Sybase (USA), me informaram que este procedimento não é possível e nem será. A justificativa é porque se perderia a confiabilidade da ferramenta, ou seja, qualquer um poderia fazer a engenharia reversa do seu aplicativo e consequentemente descobrir as regras de negócio, o que é considerado roubo de propriedade intelectual.

A única coisa que pode ser feito é chamar as funções existentes na PBD, ou seja, você pode colocar uma PBD na sua Library List e utilizar os objetos existentes dentro da mesma, não sendo permitido ver e depurar o código dentro da PBD.

Se mesmo assim, você não quiser que outra pessoa utilize os objetos da sua PBD, você tem a opção de não gerar PBD.

SQL SERVER SP4 - Problemas de Performance

Recentemente fui notificado por alguns amigos meus sobre problemas de performance do SP 4 do SQL Server 2000.

O problema parece que surgiu com uma mudança de interpretação de valores numéricos do otimizador do SQL Server.

Tecnicamente explicando, no SP 3 se você tivesse um índice em uma coluna numérica (5,0), ou seja, sem casa decimal e passasse 1.0 para ela, a pesquisa seria feita por índice utilizando a técnica INDEX SEEQ, que é a melhor forma de pesquisa utilizada.

Já a partir do SP 4, a mesma situação acima iria gerar um INDEX SCAN ou até mesmo parar de usar aquele índice, pois o custo do SQL poderia aumentar muito e o SQL Server definir outro algoritmo para buscar os dados.

Oracle - Migração da Versão 8 e 9 para a Versão 10

Abaixo está alguns problemas que podem surgir com a migração da Versão do Oracle 8 e 9 para a Versão 10.x

Perda de performance
1 – Pode ser causada por incompatibilidade entre a versão do Oracle e a sua aplicação. Já se sabe que a versão do Oracle 10.2 tem problemas de performance com aplicações PowerBuilder.

Erro em comandos SQL
1 – A partir da versão 10 do Oracle, não é mais suportado o uso de conversão implícita. Ou seja, se por um erro de desenvolvimento o usuário definiu uma clausura WHERE com um campo numérico, mas passou o valor string, o Oracle irá gerar um erro. Nas versões anteriores o Oracle faria a conversão implícita dos dados, não retornando erro.
2 – Na versão 8.0.5, o Oracle convertia um VARCHAR com o formado ‘yyyymm’ para data. Este mesmo procedimento gera erro no Oracle 10.

Erro na Compilação de PACKAGES
1 – Anteriormente não era necessário declarar o parâmetro DEFAULT na SPECIFICATION, apenas sendo obrigatório defini-lo no BODY. Mas a partir da versão 10, ocorrerá um erro se você não declarar.

Oracle 10 - Problema de Performance

Só para documentar, a Versão Oracle 10.2 está gerando problemas de Performance. Recentemente acompanhei algumas empresas que trabalham com aplicações PowerBuilder e fizeram a migração de Oracle 10.1 para Oracle 10.2 e a performance dos aplicativos piorou, na média, 5 vezes.
Ainda não conseguimos descobrir a origem do problema, mas assim que tiver mais notícias, irei publicar no Blog.

segunda-feira, outubro 10, 2005

PowerBuilder - Exibindo ToolTip / PowerTip

No site abaixo encontra-se uma exemplo de como implementar ToolTip ( ou PowerTip, como é chamado no PowerBuilder) em colunas do PowerBuilder.

segunda-feira, outubro 03, 2005

Diversos - Extensão de arquivos

Este post possui um link para um site com várias extensões de arquivos documentadas.

Diversos - Manual do Profissional deTI

MANUAL BÁSICO DE COMO "UTILIZAR" UM PROFISSIONAL DE TI...COISAS QUE O CLIENTE PRECISA SABER: (e o chefe também...!!!)

1) PROFISSIONAL DE TI dorme.Pode parecer mentira, mas PROFISSIONAL DE TI precisa dormir como qualqueroutra pessoa. Esqueça que ele tem celular e telefone em casa, ligue só parao escritório.

2) PROFISSIONAL DE TI come.Parece inacreditável, mas é verdade.PROFISSIONAL DE TI, também, precisa se alimentar e tem hora para isso.

3) PROFISSIONAL DE TI pode ter família.Essa é a mais incrível de todas: mesmo sendo um PROFISSIONAL DE TI, a pessoaprecisa descansar no final de semana para poder dar atenção à família, aosamigos e a si próprio, sem pensar ou falar de redes, sistemas,computadores...

4) PROFISSIONAL DE TI, como qualquer cidadão, precisa de dinheiro.Por essa você não esperava, né? É surpreendente, mas PROFISSIONAL DE TItambém paga impostos, compra comida, precisa de combustível, roupas esapatos, e ainda consome Lexotan para conseguir relaxar...

5) Ler, estudar também é trabalho.E trabalho sério. Pode parar de rir. Não é piada.

6) De uma vez por todas, vale reforçar: PROFISSIONAL DE TI não évidente, não joga tarô e nem tem bola de cristal.Ele precisa planejar, consultar fornecedores, fazer visita técnica...para poder maturar as propostas e superar as expectativas.Se você quer um milagre, tente uma macumba e deixe o pobre do PROFISSIONALDE TI em paz.

7) Em reuniões de amigos ou festas de família, o PROFISSIONAL DE TIdeixa de ser PROFISSIONAL DE TI e reassume seu posto de amigo ouparente, exatamente como era antes dele ingressar nesta profissão.Não peça conselhos, dicas ... ele tem direito de se divertir.

8) Não existe, apenas, um upgradezinho - qualquer upgrade é umprojeto, requer atenção, dedicação, precisa ser pensado, estudado,analisado e, é claro, cobrado. Esses tópicos podem parecer inconcebíveis auma boa parte da população mas servem para tornar a vida do PROFISSIONAL DETI mais suportável.

9) Quanto ao uso do celular: celular é ferramenta de trabalho. Por favor,ligue, apenas, quando necessário. Fora do horário de expediente, mesmoque você, ainda, duvide, o PROFISSIONAL DE TI pode estar fazendoalgumas coisas que você nem pensou que ele fazia, como dormir ou namorar,por exemplo

10) Pedir o mesmo orçamento 15 vezes não vai mudar a resposta. Por favor,peça no máximo três.

11) Quando o horário de trabalho do período da manhã vai até 12h, nãosignifica que você pode ligar às 11h55. Se vc pretendia cometer essagafe, vá e ligue após o horário do almoço. O mesmo vale para a parte datarde: ligue no dia seguinte.

12) Quando PROFISSIONAL DE TI estiver apresentando um projeto, porfavor, não fique bombardeando com milhares de perguntas durante oatendimento. Isso tira a concentração, além de torrar a paciência.ATENÇÃO: Evite perguntas que não tenham relação com o projeto.

13) O PROFISSIONAL DE TI não inventa os preços e nem ganha comissãosobre os equipamentos comprados . Por isso, não pechinche!Lembrete: cara feia na hora de assinar cheque não diminui o que você tem quepagar. Se queria pagar menos, deveria ter feito você mesmo.

14) Os PROFISSIONAL DE TI não são os criadores do ditado "O barato saicaro"!!!

15) E, finalmente, PROFISSIONAL DE TI , também, é filho de DEUS e nãofilho disso que você pensou...

Artigo enviado por João Carlos de Souza Ribeiro

quarta-feira, setembro 21, 2005

PowerBuilder - Visão da Versão 11

No período de 21 a 25 de agosto de 2005, a Sybase apresentou em um congresso nos EUA a previsão de lançamento de produtos para os próximos anos.O que me chamou mais a atenção foi o PowerBuilder 11 e as características que ele terá. Baixo está uma cópia do slide que fala sobre o assunto :

* Early Alpha will start in September.
* Based entirely on .NET 2.0.
* Support Winforms and WebForms.
* Compiles PB code to C#
* Use refactored code from 10.5.
* Import PocketBuilder code line.
* proved Tablet PC support.
* ta Q1 – GA Q3 2006

É interessante chamar a atenção que o PowerBuilder 11 será totalmente DotNet. Quem quiser ver a PPT completa, acesse o site http://files.blog-city.com/files/M05/128508/b/techwave.pps

PowerBuilder - Recuperando a Data e versão de um arquivo

No site do Celso Côrtes tem dois artigos interessantes sobre como recuperar a data e versão de um arquivo.
Entre no site e faça uma pesquisa pela palavra data ou versão.

http://www.celso.cortes.nom.br/
Por : Celso Côrtes

sexta-feira, setembro 16, 2005

DotNet - DataWindow

Recentemente fiz uma avaliação da DataWindow .Net e fiquei muito satisfeito com a ferramenta.

Ela se compõe de dois módulos:

1) Designer
Este modulo é basicamente o PowerBuilder contendo apenas o Painter de DataWindow. Nele, você pode criar qualquer tipo de DataWindow e gravar em uma PBL ou utilizar qualquer datawindow que você possua nos seus sistemas (O impressionante, que funciona com qualquer DataWindow)
2) Viewer
Este modulo é utilizado pelo VisualStudio para exibir a DataWindow. Quando você instala o Software, ele cria uma pasta na barra de ferramentas do VisualStudio. Então, você deve arrastar o objeto para um formulário e utilizá-lo. Muito Fácil.

Bom, deixa-me contar o que achei de mais interessante:
· Utilização de DataWindow na Web : Você pode utilizar qualquer tipo de DataWindow em formulários Windows e Web, para cadastro e consulta. O interessante é que da DataWindow DotNet gera o código em JavaScript, não necessitando utilizar Plugin.
· Programação no DotNet: A Sybase fez um trabalho espetacular, utilizando os nomes das funções já existente no PowerBuilder para se trabalhar em DotNet. Por exemplo, para configurar o objeto transação de uma datawindow, você utiliza a função SetTrans, para buscar valor você utiliza GetItem, para enviar valor você utiliza SetItem. Dessa forma, eles conseguiram que o programador PowerBuilder utilize o VisualStudio sem precisar aprender como programar. Muito Bom.
· Um único fonte: Você pode continuar desenvolvendo a suas DataWindow junto a sua aplicação PowerBuilder e apenas atualizá-las no servidor Web, necessitando de apenas um fonte e manutenção em um ponto único.

O que achei mais interessante, que essa foi a melhor ferramenta que vi para gerar relatórios em Web, mesmo para quem nunca viu PowerBuilder, além de não ter problemas de licenciamento, como ocorre no CrystalReports.

Parabéns a Sybase por essa ferramenta.

PowerBuilder – Soluções que rodam 24 X 7

Em algumas situações, temos que criar aplicações que ficam executando o tempo todo, como monitores de rede, Call Center, Agendas de aplicativos e etc...
Recentemente, eu passei por duas situações (Transferência de arquivos entre sites e Call Center).
Vou pegar como exemplo a primeira aplicação. Deveríamos criar uma aplicação responsável por atualizar os aplicativos que são executados em todas as agências de uma empresa de Energia Elétrica, utilizando a arquitetura cliente/servidor (mais de 70 locais de transferência).
A partir da necessidade e de outras variáveis envolvidas (disponibilidade de Link, distância geográfica entre agencias, disponibilidade de servidores, horário de picos, atualizações urgentes de sistemas, etc...) resolvemos desenvolver um servidor de aplicação que ficariam rodando 24 horas e processando as requisições de cópias feitas pelo usuário.
O sistema foi desenvolvido em PowerBuilder e ficou da forma que desejávamos. Mas, após 24 horas em produção, começamos a deparar com um problema que colocou todo o trabalho de desenvolvimento em questionamento. A aplicação PowerBuilder alocava memória e não liberava a mesma.
Fazendo o monitoramento, percebi que quando instanciávamos os objetos e utilizava DataWindows, os mesmos não liberavam toda a memória alocada. Após 24 horas de processamento, a aplicação travava o servidor por falta de memória.
Após pensarmos em várias soluções e já pensando em outros projetos que teriam o mesmo problema, resolvemos criar um “Gerenciador de Serviços”.
Essa aplicação fica responsável por colocar a aplicação no ar. Após a aplicação no ar, ela faz o processamento necessário e fecha o sistema. Após X tempo que a aplicação fechou (no nosso caso, foi 1 minuto) o gerenciador coloca a aplicação no ar novamente.
Como o gerenciador não utiliza objetos e possui um código muito simples, ele não aloca memória desnecessária e não causa o problema que a aplicação teria.

Essa é uma solução simples, que foi essencial para o sucesso do nosso projeto.

sexta-feira, setembro 09, 2005

Observação sobre o método FIND da DataWindow

Recentemente passei por uma situação que pode afetar outras pessoas, por isso resolvi publicar essa informação.

O método FIND da DataWindow serve para localizarmos uma linha especifica a partir dos valores informados. A sintaxe do comando é

long dwcontrol.Find ( string expression, long start, long end )

Gostaria de chamar a atenção para a posição inicial da pesquisa. Se a posição inicial for maior que a posição final, o PowerBuilder ignora a posição inicial e faz a pesquisa a partir do inicio da datawindow (row = 1). Esta situação pode causar um loop infinito, se o você estiver procurando todas as ocorrências de um valor e existir uma ocorrência no último registro da datawindow.

Por exemplo:

Tenho a seguinte situação que procura a ocorrência de um string em todas as linhas da datawindow:

Do While VLLROW > 0
VLLROW = DW_1.FIND(VLSFIND,VLLROW + 1,DW_1.ROWCOUNT()
LOOP


Se a última linha da datawindow tiver o valor procurado, na próxima volta do LOOP, VLLROW +1 será maior que ROWCOUNT(). Nesta situação, o PowerBuilder irá ignorar VLLROW +1 e começar a pesquisa a partir da Linha 1, entrando em um LOOP infinito.

Para evitarmos essa situação, devemos alterar o código acima para que fique da seguinte forma:
Do While VLLROW > 0
VLLROW = DW_1.FIND(VLSFIND,VLLROW + 1,DW_1.ROWCOUNT()
IF VLLROW = DW_1.ROWCOUNT() THEN EXIT
LOOP



Estas características estão documentadas no HELP do PowerBuilder. Abaixo se encontra um trecho do Help com a informação sobre o procedimento acima

…When the start value becomes greater than end, the search reverses direction and Find would always succeed, resulting in an endless loop….

quinta-feira, setembro 08, 2005

PowerBuilder – Layout Corrompido

A partir da versão 7, o PowerBuilder permite ao desenvolvedor customizar o ambiente de desenvolvimento, podendo alterar o Layout. Com essa evolução, surgiu um novo problema que ocorre quando você não consegue abrir painter (janela de desenvolvimento) especifico (Window, DataWindow, Database, Menu, etc...).

Para resolver este problema, o usuário tem que voltar ao layout original do objeto. Como essa configuração é armazenada no registro, o usuário deve apagar a chave do registro que armazena essa configuração, voltando a configuração original.

A chave do registro que armazena a configuração encontra-se em HKEY_CURRENT_USER\Software\Sybase\PowerBuilder\\Layout

PowerBuilder - Dicas de intergração com o PowerDesigner

Abaixo está um artigo publicado por Ricardo Couto de Souza

Fiz algumas experiências com o objetivo de ganhar produtividade no design de datawindows para sistemas modelados no PowerDesigner e encaminho minhas conclusões para os que se interessarem:

Ao projetar as colunas no PowerDesigner procurem seguir as seguintes orientações:
preencher o campo "Name" com o título que se deseja que apareça na datawindow;
preencher o campo "Code" com o nome da coluna no banco de dados (óbvio);
preencher o campo "Label" com o conteúdo que se deseja que seja a Tag na datawindow;
Após a execução do Script de criação das tabelas no banco de dados executem no menu do PowerDesigner: Client > Generate PowerBuilder Attributes...

Com isso serão populadas as tabelas do PowerBuilder PBCATCOL,PBCATEDT, PBCATFMT, PBCATTBL e PBCATVLD, que assessoram a criação de datawindows com os dados de colunas, edições, formatos de exibição, tabelas e validações, respectivamente.

A coluna PBC_CMNT da PBCATCOL recebe o conteúdo do campo LABEL' do PD e será usada para "Tag" da coluna para qualquer DW´
A coluna PBC_LABL da PBCATCOL recebe o conteúdo do campo 'NAME' do PD acrescido de ":" e será usada para "Título" da coluna para DW´s FreeForma;
A coluna PBC_HDR da PBCATCOL recebe o conteúdo campo 'NAME' e é usada para "Título" da coluna para DW´s Tabulares
Para que os itens 2 e 3 funcionem é preciso garantir que nos Extenderd Attributes da tela de configuração de colunas do PowerDesigner o campo "Label " seja igual a "%ColumnName%:" e Header seja "%ColumnName%".

O objetivo do meu estudo se restringiu a ganhar produtividade na obtenção automática dos Títulos e Tag´s das colunas nas DW, que utilizam colunas da tabela PBCATCOL. Explorando-se um pouco mais podemos ganhar também nas máscaras, edições e validações.

Por Ricardo Couto de Souza

PowerBuilder - Versão 10.5

No site do Celso Cortes tem este artigo com informações sobre o PowerBuilder 10.5

Informática - O que é UNICODE?

Achei este artigo muito interessante no site do Celso Cortes. Vale a pena dar uma lida.

sexta-feira, julho 15, 2005

quinta-feira, julho 14, 2005

PowerBuilder - Empresas que utilizam PowerBuilder no Brasil

1 - Ambev
2 - AMIL planos de saúde.
3 - ArtInfo - Sistema de Gestão de Recursos Humanos
4 - Attps informática
5 - Banco ABN-AMRO
6 - Banco BBA
7 - Banco BBM
8 - Banco do Nordeste
9 - Banco Finaustria
10 - Banco SAFRA.
11 - Banco Mercantil
12 - Banco Santander
13 - Banco Tokio-Mitsubishi S.A.
14 - Banco Votorantim
15 - Bank Boston
16 - Basf S.A
17 - BCP
18 - BNP - Banque Nationale de Paris
19 - Bovespa - Bolsa de Valores do Estado de São Paulo
20 - Bozano
21 - Caixa Econômica Federal
22 - Carioca Engenharia ( Christiane Nielsen )
23 - Carrefour
24 - Caterpillar do Brasil
25 - CFLCL - Cia de Força e Luz de Cataguases Leopoldina( Primeira empresa a utilizar o PowerBuilder no Brasil)
26 - Cia de Processamento de dados do RS RGE
27 - CITROSUCO PAULISTA S/A ( Maior exportadora de Suco de Laranja do País )
28 - CODIUB - Companhia de Processamento de dados de Uberaba
29 - Companhia Vale do Rio Doce
30 - Confederação Nacional da Indústria
31 - Consorcio RodoBens
32 - Construtora Norberto Odebrecht
33 - Coperguaçu ( Maior Cooperativa de criação de frangos do país )
34 - Credicard S/A
35 - CST - Companhia Ciderurgica de Tubarão
36 - DBMS COMPSIS
37 - DBMS Tecnologia da Informação
38 - Deten Química
39 - DLC CISS - Automação Comercial
40 - ECAD MasterSaf
41 - EDS - Electronic Data Systems do Brasil ( Banco GM )
42 - EDS - Electronic Data Systems do Brasil ( Cartão de Crédito )
43 - EDS - Electronic Data Systems do Brasil ( GM )
44 - EDS - Electronic Data Systems do Brasil ( Visanet )
45 - Energ Power Ltda - Belo horizonte - MG
46 - Ericsson
47 - Firestone
48 - Fornecedora de internet dedicada Unisinos
49 - Fundação Baiana de Cardiologia
50 - Fundação José Silveira
51 - Golden Cross
52 - GoodLife Belo Horizonte
53 - Grupo Luizeni(Corretora) - Patrocinio/MG
54 - Grupo Martins Atacadista - Uberlandia/MG
55 - HSBC
56 - IBGE - Instituto Brasileiro de Geografia e Estatística - RJ
57 - IBM do Brasil
58 - Laboratório Clínico Delboni Auriemo
59 - Line system - Uberlandia
60 - LOGOCENTER
61 - Nutris Tecnologia E Sistemas De Nutrição Ltda
62 - OAB Minas Gerais
63 - Peixoto Atacadista - Uberlandia
64 - Pirelli Cabos S.A.
65 - Pirelli Pneus S.A.
66 - Porto Seguro – Seguros
67 - PowerLogic
68 - Prefeitura Municipal de Uberaba
69 - Procenge - Companhia de Informática de Pernambuco
70 - Prodaub - Processament de dados de Uberlandia
71 - Prodemge - Cia de Processamento de Dado de Minas Gerais
72 - Racional Engenharia
73 - RBS - Afiliada à rede globo - região sul
74 - Redecard S/A
75 - RK Hotéis e Turismo S/A
76 - Seguros de Saúde
77 - Shell do Brasil
78 - Shop Tour
79 - SICS – HELP Informática
80 - softwarehouse Cumerlato & Schuster
81 - softwarehouse InfoSaude
82 - softwarehouse Van Communications
83 - TecBan
84 - Tecnovia Informática
85 - Telefonica ( GuiaMais )
86 - Telematic - Engenharia e Teleinformática Ltda ( Salvador/BA )
87 - Telepar - Telecomunicações Do Paraná S.A. ( Brasil Telecom )
88 - TotalBanco
89 - TQI - Uberlandia
90 - Trans Cearense - Uberlandia / MG
91 - Transportadora Itapemirim S.A
92 - Trends Advance
93 - Tribanco de Uberlandia
94 - UFMG - Universidade Federal de Minas Gerais
95 - UFRGS - Universidade Federal do Rio Grande do Sul
96 - Uma Das Cias Elétricas Do RS Cigna Seguradora
97 - UNESC - Universidade do Extremo Sul Catarinense
98 - União Atacado ( Uberlandia)
99 - Unibanco
100 - Unitech Tecnologia de Informação
101 - Uniub - Universidade de Uberaba
102 - Universidade do Rio dos Sinos Procergs
103 - Unnisa S/A
104 - Visanet Companhia de Meios de Pagamento S/A
105 - Volkswagen do Brasil S/A
106 - Votorantim Mineração e Metais
107 - Xerox do Brasil
108 - Staff Informática
109 - Banco do Estado do Espírito Santo - BANESTES
110 - Compania Docas do ES - CODESA (Porto de Vitória)
111 - MasterSaf
112 - Viação Águia Branca - Transporte de Passageiros
113 - Pif Paf Alimentos
114 - Petrobras
115 - Matera System
116 - Banco BMG
117 - Ápia Consultoria e Sistemas Ltda

PowerBuilder - Problemas no envio de e-mail com o BLAT

Recentemente, me deparei com um problema no envio de e-mail utilizando o blat. Em algumas máquina o e-mail não era enviado

O problema ocorre porque o blat utiliza o serviço SMTP (porta 25) para enviar e-mail e a versão do VirusScam 8.0 bloqueia essa porta.

Quem estiver utilizando essa versão do antivírus, vai ter que seguir os seguintes passos para resolver o problema:
1 - Vá ao Console do VirusScam
2 - Clique com o botão direito em Proteção de Acesso e selecione Propriedades
3 - Desmarque a opção Impedir que worms de envio em massa de e-mail.....
4 - Clique em Ok e feche todas as janelas

Em algumas empresas, essa configuração pode ser feita centralmente, no servidor do antivírus.

sexta-feira, julho 01, 2005

Cursor X DataStore

Apesar de muitas pessoas utilizarem DataStore ao invés de cursor, a maioria não sabe quais são as vantagens e em qual situação o Cursor é melhor que a DataStore.



Para explicar as vantagens, primeiro temos que entender como os dois objetos funcionam.



A maioria dos cursores são composto de 4 comandos:

* Declare : Declara a variável e atribui o comando SQL que será executado, não fazendo acesso ao banco de dados.

* Open : Abre o cursor. Neste momento, é enviando um comando ao SGBD que executa a Query e carrega o resultado na memória do SGBD. Existem vários tipos de cursor e cada um funciona de uma forma, mas geralmente, é criada uma imagem do resultado na memória do SGBD.

* Fetch : Recupera o registro. Neste momento, é feito um acesso ao banco de dados, buscando o próximo registro na tabela temporária.

* Close : Fecha o cursor. Neste momento é feito um acesso ao SGBD para fechar e libera a memória que estava sendo utilizada pela tabela temporária.



Como vocês podem perceber, apenas o comando Declare não faz um acesso ao banco de dados. Como cada acesso ao banco de dados gera 2 tráfegos na rede (O envio do pacote com a solicitação e o recebimento do resultado), além de aumentar muita a utilização do processador do cliente, pois todos os pacotes de rede devem ser tratados (empacotados e desempacotados) pelo processador. A quantidade de acesso ao banco de dados degrada a performance do aplicativo, além de aumentar o trafego da rede, prejudicando a performance de outros aplicativos.



Outro ponto negativo do Cursor é que existem comando que fecham o cursor, por exemplo, na maioria dos SGBDs, se os comandos COMMIT e ROLLBACK forem executados com o cursor aberto, eles automaticamente fecham o curso, podendo gerar erro no aplicativo.



Já a DataStore funciona da seguinte forma:

* Quando você executa RETRIEVE na DataStore, o comando SQL é enviado ao banco de dados, processado e todos os dados são recuperados para a DataStore.



Essa solução possui uma perda de performance no primeiro momento, porque todos os dados são transferidos de uma única vez para o cliente, mas possui uma melhor performance se observarmos o processamento total, pois é feito apenas um acesso a base de dados (dois tráfegos de rede).



Outro problema da DataStore é que todos os dados são retornados para a memória da aplicação cliente, por isso, se a quantidade de dados recuperados for muito grande ou a memória do cliente for pouca, pode forçar a máquina a utilizar memória virtual (Paginação), gerando uma perda de performance no aplicativo e até mesmo cancelamento do processando por falta de memória.



Resumindo, os seguintes fatores influenciam a utilização de Cursor ou DataStore:

- Quantidade de usuários conectados ao SGBD (Quanto maior a quantidade de usuários conectados ao SGBD, maior a tendência de utilizar DataStore)

- Memória disponível no cliente (Quanto maior a quantidade memória, maior a tendência de utilizar datastore)

- Quantidade de Dados Recuperados (Quanto menor o número de colunas recuperado por registro, maior a tendência a utilizar a datastore)

- Qualidade da Rede (Quanto mais rápida a rede, maior a tendência a utilizar Cursor)

- Recursos disponíveis no servidor (Memória e processador) (Quanto maior os recurso disponíveis no servidor, maior a tendência a utilizar Cursor)

Sendo, que os recursos que mais degradam a performance são os seguintes, na ordem listados:

- Quantidade de usuários.

- Utilização de espaço alem do disponível na memória física + memória virtual

- Quantidade de dados trafegados pela rede

- Velocidade do Processador no servidor

- Velocidade do Processador no cliente

- Utilização de memória virtual



Na regra geral, devemos adotar que se o cliente tem memória disponível para executar a datastore, devemos utilizar datastore, ao contrário, utilizamos o Cursor. Mas, podemos analisar outros fatores antes de determinar qual objeto utilizar, podendo adotar até uma solução mista, por exemplo, recuperar blocos de registros utilizando datastore.

quarta-feira, junho 15, 2005

Oracle – Criando usuário com acesso Limitado

Em alguns casos, você precisa criar um usuário no Oracle que terá acesso limitado as tabelas de um TableSpace (Apenas consulta ou atualização).
Como as tabelas foram criadas por outro usuário, você se vê obrigado a utilizar o owner do usuário nos comandos SQL, por Exemplo:

USER_DBO : Usuário com permissão de criar tabela e owner dos seus objetso
USER : Usuário com acesso de consulta e alteração de dados

CREATE TABLE USER_DBO.TB_TESTE
…….

Quando o usuário USER vai tentar fazer o select ele tem utilizar o commando
SELECT * FROM USER_DBO.TB_TESTE
Necessitando incluir o Owner da tabela antes do nome da tabela.

Para resolver o problema na necessidade do owner, existe duas opção:
1) Criar um sinônimo
Você criar um sinônimo com o usuário USER apontando para a tabela USER_DBO.TB_TESTE.
2) Comando Alter Session
Após conectar com o banco de dados, você executa o comando ALTER SESSION SET CURRENT_SCHEMA = USER_DBO;

BOA SORTE

DotNet Error : Visual Studio .NET cannot create or open the application

Eu reinstalei o meu ISS, lembrando de fazer todos os passos necessários para registrar o Framework, mas quando tento criar ou abrir um projeto AspNet, o VisualStudio me exibe a seguinte mensagem:

Visual Studio .NET cannot create or open the application. The likeliestproblem is that required components are not installed on the local webserver. run visual studio.net setup and add the web development componet.

Este problema ocorre pois o compartilhamento do wwwroot foi perdido. Abaixo está a solução para este problema :
From: Harvey MeekerTry to check the sharing of the folder that you are hosting the application in. If it is in the WWWROOT folder then that folder needs to be shared as wwwroot$, at least this is what I've experienced on my own machine. This is basically a problem of the share not being properly configured

sexta-feira, junho 10, 2005

Dotnet error : 'HTTP/1.1 500 Internal Server Error.'

Estou utilizando o VisualStudio 2003 e Windows XP. Estava tudo funcionando e de uma hora para outra começou a aparecer o erro:

"the Web server reported the following error when attempting to create or open the Web project located at the following URL: 'http://localhost/WebApplicaton1'.'HTTP/1.1 500 Internal Server Error.'"

Este erro já me aconteceu N vezes dentro no meu ambiente de trabalho e depois de muito tempo tentando descobrir o que aconteceu, encontrei que na maioria das vezes ocorre devido a uma atualização do windows (Windows Update) que causou a mudança no Framework/IIS ou mudança da senha do usuário ASPNET e o bloqueio do usuário.


Na maioria das vezes, a solução que se encontra no site http://codebetter.com/blogs/peter.van.ooijen/archive/2004/09/08/24756.aspx resolve o problema. Mas se o problema persiste, outra solução possível encontra-se no link http://weblogs.asp.net/jambrose/archive/2004/09/01/224226.aspx

Boa Sorte.

sexta-feira, maio 27, 2005

Oracle - Exemplos de Scripts

No link do título deste artigo, você poderá ter acesso a quase todos os scripts necessários a um DBA Oracle, desenvovidos pela própria Oracle, além de programas desenvolvidos em várias linguagens para facilitar a vida do DBA Oracle.
Caso você não encontre o script desejado, existem ainda links para outros sites com mais opções de scripts.
Vale a pena navegar.

Oracle – Replicação Avançada

Apesar de causar temores a algumas pessoas, inclusive a mim em um primeiro momento, a replicação avançada do Oracle é fácil de ser configurada e funciona perfeitamente.
Primeiro vamos analisar quais são as vantagens dessa replicação:
1) Permite alteração nos dois sites;
2) Se o link ou um dos servidores estiver fora do ar, o trabalho continua, e os servidores serão sincronizados no momento que a conexão for restabelecida.
3) Permite configurar a resolução de conflito, ou seja, se um mesmo dado for alterado nos dois sites ao mesmo tempo, você pode definir uma regra para tratar este caso. Por exemplo, vale o registro que foi alterando por último.
4) A replicação é rápida e leve (não causa grande trafego na rede), pois são replicadas apenas as alterações na base de dados e não a tabela inteira, como outras soluções.
5) O processo não é on-line, evitando travamentos devido a lock. Os dados são alterados em um site e só depois da operação concluída, são replicados para o outro site.
6) O tempo de replicação pode ser configurado com o intervalo desejado, ou seja, a replicação pode ocorrer a cada 1 segundo ou de 4 em 4 horas.
7) Você pode definir quais objetos serão replicados e o intervalo de replicação para cada um.

No link que se encontra no título deste artigo, você pode obter todos os scripts necessários para você trabalhar com a replicação avançada.

Para você que vai trabalhar com a replicação avançada pela primeira vez, sugiro que siga os seguintes passos para os primeiros testes:
1) Instale dois servidores Oracle do zero, lembrando de marcar a opção de Replicação Avançada no momento da criação do banco de dados;
2) A configuração GLOBAL_NAMES deve estar marcada ( Arquivo init.ora ou configuração da instancia do Oracle).
3) Os DBLinks devem ter o mesmo nome da configuração da instancia do Oracle (DBlink tem de ser igual ao Global Names da instancia de destino - execute select global_name from global_name no banco de dados de destino do DBLink )
4) Siga o script corretamente (Já montei duas replicações utilizando o Oracle 8.1.7 e funcionam perfeitamente).

Caso você já possua um servidor e deseje habilitar a replicação avançada, você deve seguir os passos do seguinte link http://www-rohan.sdsu.edu/doc/oracle/server803/A53722_01/ch6.htm#1021276 .

Boa Sorte.

Oracle – Problemas com o DBLink

Criar um DBLink é um processo simples e muito utilizado hoje em dia. No link que se encontra no título deste artigo, você pode obter todas as informações necessárias sobre DBLink.
O meu problema foi que o meu DBLink nunca funcionava. Eu possuía a seguinte configuração
Servidor Origem : DB01
Servidor Destino : DB02
Nome do DBLink : TESTE
O Oracle possui uma configuração GLOBAL_NAMES (Arquivo de INIT.ORA ou gerenciamento da instancia) e se essa configuração estiver como TRUE, que era o meu caso, o nome do DBLink deve ser igual ao nome da instancia do Oracle, ou seja, se estou tentando conectar a instancia DB02, o nome do meu DBLink deve ser DB02.
A configuração GLOBAL_NAMES = TRUE é necessária em casos que você precisa utilizar alguns recursos avançados do Oracle, entre eles a Replicação, que é o meu caso.
Caso você não utilize estes recursos, pode configurar o GLOBAL_NAMES = FALSE e utilizar o nome que quiser para o DBLink.

quarta-feira, maio 25, 2005

PowerBuilder - Conectando ao Oracle 10

Conversando com a equipe da Sybase, fui informado que o PowerBuilder ( a Sybase fornece suporte a versão 8,9 e 10) não possui um mecanismo para conexão ao Oracle 10. A previsão de liberar em breve o suporte ao Oracle 10 (PBO10xx.DLL ). Enquanto isso, é recomendado que se utilize a API para Oracle 9 (O90 driver) ou utilizar a conexão OLE DB.
Veja o Link no Título deste Post para mais informações.

terça-feira, maio 24, 2005

SQL Server - Performance 2005 X 2000

No link acima, vocês podem verificar um teste básico que demonstra a melhora de performance do SQL Server 2005 com relação ao SQL Server 2000. Neste teste, o SQL Server 2005 obteve um ganho de performance de 18,5 % com relação ao SQL Server 2000.

Oracle 8 – Perder a Senha do usuário internal ou sys

Se ocorrer a perda do usuári0o internal ( utilizado para criar, apagar ou editar uma instancia do Oracle), você pode utilizar os seguintes passos para resetar o senha

1 – Vá ao command, na pasta $ORACLE_HOME/bin
2 – Digite o comando orapwd80 file= senha=
Neste ponto será gerado um arquivo que você utilizará para substituir o arquivo do Oracle que armazena este senha criptografado,
3 – vá ao diretório $ORACLE_HOME/database e mud o nome do arquivo PWD.ORA para PWD.OLD ( este arquivo pode estar oculto e o windows configurado para não exibi-lo)
4 – Mude o nome do arquivo que você gerou no passo 2 para PWD.ORA
5 – Utilize o novo senha

Boa Sorte.

sexta-feira, maio 20, 2005

Microsoft Visual Source Safe - Melhorando a Performance

Está melhoria de perfomance se aplica principalmente para quem trabalhou com as versões anteriores do VSS.
Ao instalar o VSS 6, não é feito upgrade da base de dados, o que pode gerar uma perda de performance na utilização do VSS. Para obter uma melhor performance, siga os passos abaixo:
1) Verifique se a sua base já está atualizada. Para isso, verifique se existe a pasta ...\VSS\data\labels . Caso exista, não é necessário seguir este procedimento, pois a sua base já se encontra atualizada
2) Certifique-se que nenhum usuário está utilizando o VSS
3) Faça um backup do VSS
4) Execute o comando “DDUPD \\server\share\vss\data
Boa sorte.

quinta-feira, maio 19, 2005

Oracle - Respostas para as dúvidas sobre Replicação

Neste Link, você poderá obter todas as respostas sobre as questões relativas a replicação de dados do Oracle.

PowerBuilder – Implementando Single-Threaded Apartments

É possível implementar uma aplicação Single-threaded Apartments utilizando o PowerBuilder, o mesmo recurso utilizado para MultiThread no VisualBasic 6.
Primeiro deixa-me explicar o que é isso? Single-threaded Apartments é o processo de simular MultiThread, ou seja, N processos executarem ao mesmo tempo dentro da mesma aplicação, por exemplo, hoje quando você executa um comando SQL ou uma Procedure a aplicação fica travada até o momento em que a aplicação retorna o resultado do comando SQL. Com MultiThread, a aplicação não fica travada, permitindo você executar N consultas\procedures ao mesmo tempo, trabalhando em paralelo.
A diferença o MultiThread verdadeiro para o Single-threaded apartments é que o primeiro permite utilizar N processadores (Varias threads), pois utiliza área de memória diferente e o segundo utiliza apenas um processador (Uma thread), pois compartilha área de memória.
O processo de implementação do Single-threaded apartments é simples é funciona bem. Na verdade você tem que ter um objeto que é Thread, um para gerenciar o processo e outro para fazer a comunicação entre os dois.Para os interessados no código para essa implementação, me envie um comentário com o e-mail que eu repasso um pequeno exemplo dessa implementação.

SQL Server - Problemas na replicação com troca de nome do servidor.

Quando você está tentando configurar a replicação no SQL Server 2000 e recebe a mensagem:
SQL Server Enterprise Manager could not configure '\' as the Distributor for '\' . Error 18483: Could not connect to server '\' because 'distributor_admin' is not defined as a remote login at the server.
Geralmente, este erro ocorre porque o servidor SQL Server foi Renomeado ou foi montado a partir da imagem de outro servidor.Para resolver o problema, clique no Link deste artigo que irá direcioná-lo para a página da Microsoft com a solução para o mesmo.

quarta-feira, maio 18, 2005

terça-feira, maio 10, 2005

PowerBuilder – Trace de Banco de Dados

O PowerBuilder possui um Trace que pode nos ajudar muito. Este trace grava em um arquivo todos os comandos que foram executados pelo aplicativo, incluindo o tempo gasto e as mensagens de erros que ocorreram.

Com o resultado do trace gerado, você pode descobrir um erro que está ocorrendo na base de dados ou melhorar a performance de uma rotina, através dos tempos retornados pelo Trace.

Para habilitar o Trace, você deve incluir a palavra TRACE antes do DBMS na conexão com o banco de dados, por exemplo:

// Profile DBTeste
SQLCA.DBMS = "TRACE O84 Oracle8/8i (8.x.4+)"
SQLCA.LogPass = <*********>
SQLCA.ServerName = "DB_DES"
SQLCA.LogId = "teste"
SQLCA.AutoCommit = False
SQLCA.DBParm = "CommitOnDisconnect='No',DelimitIdentifier='No',PBCatalogOwner='teste'"

Uma dica é adaptar a aplicação de forma que o trace possa ser habilitado através de uma chave do registry, assim você pode habilitar o Trace em qualquer momento, diretamente no executável.
Para analise de performance, desenvolvi um aplicativo que lê o trace e retorna os comandos que gastaram mais tempo. Quem tiver interesse neste aplicativo, envie um e-mail para tpereira@rtconsult.com.br, para que eu possa enviar o aplicativo.

sexta-feira, abril 29, 2005

PowerBuilder - Criação de DataWindow/DataStore Dynamica

O Exemplo abaixo, mostra como criar uma DataWindow/DataStore dinamicamente, a partir de um SQL.

string VLSerror_syntaxfromSQL, VLSerror_create, VLSnew_syntax, VLSMsgErr, VLSDescricao, VLSLinha Long VLLRow, VLLCodigo, VLLRet, vltotitens
// botão p/ seleção de ocorrências if dwo.name = 'b_ocorr' then lb_ocorr.Visible = True // sql p exibição das ocorrências no listbox VISnew_sql = 'select distinct mi.num_seq_ocorr_prioritaria codigo, oc.dsc_res_ocorr descricao ' + & 'from movto_inspecao mi, ocorrencia oc ' + & 'where mi.num_seq_ocorr_prioritaria = oc.num_seq_ocorr ' + & 'and mi.num_seq_ocorr_prioritaria is not null ' + & 'and mi.cod_proj = ' + String(VILProjOrig) end if
// botão p/ seleção de impedimentosif dwo.name = 'b_imped' then lb_imped.Visible = True // sql p exibição das impedimentos no listbox VISnew_sql = 'select distinct mi.cod_imp_insp codigo, im.dsc_imp_insp descricao ' + & 'from movto_inspecao mi, impedimento_inspecao im ' + & 'where mi.cod_imp_insp = im.cod_imp_insp ' + & 'and mi.cod_imp_insp is not null ' + & 'and mi.cod_proj = ' + String(VILProjOrig)
end if
// Monta dinamicamente o objeto datastore contendo as ocorrências ou impedimentos p/ seleçãoVLSnew_syntax = wtr_trans.SyntaxFromSQL(VISnew_sql, "", VLSerror_syntaxfromSQL)if Len(VLSerror_syntaxfromSQL) > 0 then VLSMsgErr = 'Erro: '+ VLSerror_syntaxfromSQL f_msg(VLSMsgErr, stopsign!) return 1else VLLRet = VIDSSelecao.Create(VLSnew_syntax, VLSerror_create) if Len(VLSerror_create) > 0 or VLLRet <> 1 THEN VLSMsgErr = 'Erro: '+ VLSerror_create f_msg(VLSMsgErr, stopsign!) return 1 end ifend if
VIDSSelecao.SetTransObject(wtr_trans)VIDSSelecao.Retrieve()

Site do Celso Cortes

Excelente site de tecnologia contendo informações diversas sobre tecnologia. Vale a pena fazer uma visita!

quarta-feira, abril 27, 2005

PowerBuilder - Mudança de automática da Resolução do Monitor

Na CFLCL, houve a necessidade de se mudar a resolução de todos os monitores, automáticamente, para a configuração 1024X 768.
Para isso, usamos o sequinte código abaixo.

$PBExportHeader$w_res.srw$PBExportComments$change resolutionforwardglobal type w_res from windowend typetype cb_2 from commandbutton within w_resend typetype cb_1 from commandbutton within w_resend typetype devmode from structure within w_resend typeend forward
type devmode from structure character dmdevicename[32] integer dmspecversion integer dmdriverversion integer dmsize integer dmdriverextra long dmfields integer dmorientation integer dmpapersize integer dmpaperlength integer dmpaperwidth integer dmscale integer dmcopies integer dmdefaultsource integer dmprintquality integer dmcolor integer dmduplex integer dmyresolution integer dmttoption integer dmcollate character dmformname[32] integer dmlogpixels long dmbitsperpel long dmpelswidth long dmpelsheight long dmdisplayflags long dmdisplayfrequency long dmicmmethod long dmicmintent long dmmediatype long dmdithertype long dmreserved1 long dmreserved2 long dmPanningWidth long dmPanningHeightend type
global type w_res from windowinteger x = 837integer y = 388integer width = 795integer height = 496boolean titlebar = truestring title = "Untitled"boolean controlmenu = trueboolean minbox = trueboolean maxbox = trueboolean resizable = truecb_2 cb_2cb_1 cb_1end typeglobal w_res w_res
type prototypesFUNCTION long ChangeDisplaySettingsA (ref devmode lpst, ulong Flags) & LIBRARY "USER32.DLL"FUNCTION long EnumDisplaySettingsA (string lpszDeviceName,long iModeNum,ref devmode lpst) & LIBRARY "USER32.DLL" end prototypes
type variables
end variableson w_res.createthis.cb_2=create cb_2this.cb_1=create cb_1this.Control[]={this.cb_2,&this.cb_1}end on
on w_res.destroydestroy(this.cb_2)destroy(this.cb_1)end on
type cb_2 from commandbutton within w_resinteger x = 224integer y = 220integer width = 297integer height = 88integer taborder = 2integer textsize = -10integer weight = 400fontpitch fontpitch = variable!fontfamily fontfamily = swiss!string facename = "Arial"string text = "1024x768"end type
event clicked;devmode dmlong astring ls_nulosetnull(ls_nulo)
//get current configurationa = EnumDisplaySettingsA(ls_nulo,-1,dm)
if a = 0 then messagebox('EnumDisplaySettingsA',"error") returnend if
//set configurationdm.dmPelsWidth = 1024dm.dmPelsHeight = 768
//Change current configurationa = ChangeDisplaySettingsA(dm, 0)if a < 0 then messagebox('ChangeDisplaySettingsA',"error") returnend if end event
type cb_1 from commandbutton within w_resinteger x = 224integer y = 124integer width = 297integer height = 88integer taborder = 1integer textsize = -10integer weight = 400fontpitch fontpitch = variable!fontfamily fontfamily = swiss!string facename = "Arial"string text = "800x600"end type
event clicked;devmode dmlong astring ls_nulosetnull(ls_nulo)
//get current configurationa = EnumDisplaySettingsA(ls_nulo,-1,dm)
if a = 0 then messagebox('EnumDisplaySettingsA',"error") returnend if
//set configurationdm.dmPelsWidth = 800dm.dmPelsHeight = 600
//Change current configurationa = ChangeDisplaySettingsA(dm, 0)if a < 0 then messagebox('ChangeDisplaySettingsA',"error") returnend if
end event

quarta-feira, março 30, 2005

Windows XP – Habilitando Remote Desktop Connection

A partir do Windows XP, já podemos utilizar o Remote Desktop Connection (uma versão light do Terminal Server), para simularmos uma sessão em uma máquina remota.
Para mim, a desvantagem do Remote Desktop em comparação com outros softwares ( VNC, Netmetting, PcAnyWhere e etc...) é que no momento que você conecta na máquina remota, a mesma é bloqueada, não permitindo que ninguém veja o que está ocorrendo. Por um lado e ruim, mas por outro é bom se levarmos em consideração a segurança.
Para habilitar essa funcionalidade em uma máquina em uma Rede Local, siga os seguintes passos (Em português):
1) Na maquina que será o Host ( Máquina na qual você irá conectar), siga os seguintes passos
a. Clique com o botão direito em Meu Computador e selecione propriedades
b. Vá a pasta Remoto e Habilite os dois CheckBoxes que existem. ( Se exibir uma mensagem, confirme)
c. Se o usuário que vai utilizar o Remote Desktop não for administrador da máquina local, clique no botão Selecionar usuários remotos e insira o usuário desejado.
2) Na máquina Guest ( Máquina que você irá utilizar para conectar a outra máquina ou Terminal Burro), siga os seguintes passos
a. Vá a Todos os Programas à Acessórios à Comunicação à Conexão a área de trabalho Remota ( No Windows Xp, está opção já existe por default. Em outros sistemas operacionais, o software deve ser baixado da Web e instalado http://www.microsoft.com/windowsxp/downloads/tools/rdclientdl.mspx )
Boa Sorte!!

PowerBuilder – Erro no Layout

Em algumas situações, notamos que o PowerBuilder começa a cancelar (Fechar, GPF e etc…) quando abrimos alguns objetos. Muitas vezes, apenas de abrir o PowerBuilder já ocorre erro, isso porque ele tenta abrir o objeto que está causando erro e o mais inacreditável é que o erro só ocorre em uma máquina especifica e muitas vezes, apenas com um usuário específico.
Este problema ocorre porque o Layout do PowerBuilder corrompeu. O Layout é responsável por posicionar os frames de uma janela e armazena a última configuração que foi salva. Além disso, o Layout é especifico de máquina e usuário, por isso, muitas vezes ocorre apenas para um usuário especifico.
Para resolver este problema, você deve resetar o Layout do PowerBuilder. Existem duas formas de fazer isso:
1) Menu View à Layouts à Default
2) Apagar a chave do registry responsável pelo layout (HKEY_CURRENT_USER\Software\Sybase\PowerBuilder\9.0\Layout )

Mas, se mesmo assim o problema continuar ocorrendo, recomendo executar um Full Build e um Optimize nas PBls.

quarta-feira, março 23, 2005

PowerBuilder – Recuperando informações de um Arquivo

A partir do PowerBuilder 8, temos a opção de informar no projeto qual a versão do nosso executável, mas não conseguimos recuperar essa informação de forma fácil.
Abaixo está o código necessário para recuperar as informações ou matadados de um arquivo.



//*****************Declare as seguintes external functions
FUNCTION ulong GetFileVersionInfoSizeA( REF string lpFilename, REF ulong lpdwHandle ) LIBRARY "version.dll"
FUNCTION integer GetFileVersionInfoA( REF string lpFilename, REF ulong lpdwHandle, ulong dwLen, REF string lpData ) LIBRARY "version.dll"
FUNCTION boolean VerQueryValueA( REF string lpBlock, string lpSubBlock, REF long lpBuffer, REF uint puLen ) LIBRARY "version.dll"
SUBROUTINE CopyMemory ( REF string d, long s, long l ) LIBRARY "kernel32.dll" ALIAS FOR RtlMoveMemory

//*******Código utilizado para recuperar o número de versão do produto no executável
string vls_filename, vls_Buff, vls_key
ulong vlul_Handle, vlul_Length
integer vli_rc
long vll_pointer
uint vlui_length

//Busca o tamanho do buffer do aplicativo
vlul_Length = GetFileVersionInfoSizeA( p_nom_executavel, vlul_Handle )
IF vlul_Length <= 0 THEN
return error.of_popula( populateerror(1010, 'Não foi possivel localizar o arquivo para o controle de versão.~n~r' + &
'Nome do executável : ' + p_nom_executavel))
END IF

vls_Buff = Space( vlul_Length )

//Busca o ponteiro para as informações do executavel
vli_rc = GetFileVersionInfoA( p_nom_executavel, vlul_Handle, vlul_Length, vls_Buff )

IF vli_rc = 0 THEN
return error.of_popula( populateerror(1010, 'Ocorreu um erro ao recuperar informação de versão.~n~r' + &
'Nome do executável : ' + p_nom_executavel))
END IF

//Define qual informação sera recurperada
//Onde \StringFileInfo\\
//vls_key = "\StringFileInfo\040904e4\FileVersion"
vls_key = "\StringFileInfo\040904e4\ProductVersion"


IF NOT VerQueryValueA( vls_buff, vls_key, vll_pointer, vlui_length ) OR &
vlul_Length <= 0 THEN
p_versao = ""
return error.of_popula( populateerror(1010, 'Ocorreu um erro ao recuperar o número da vesão.~n~r' + &
'Nome do executável : ' + p_nom_executavel))
ELSE
p_versao = Space( vlui_length )
CopyMemory( p_versao, vll_pointer, vlui_length )
END IF

return 1

segunda-feira, março 21, 2005

PowerBuilder 9 - About libraries

Whenever you save an object, such as a window or menu, in a painter, PowerBuilder stores the object in a library (a PBL file). Similarly, whenever you open an object in a painter, PowerBuilder retrieves the object from the library.
Assigning libraries
PowerScript targets can use as many libraries as you want. Libraries can be on your own PC or workstation or on a server. When you create a target, you specify which libraries it uses. You can also change the library search path for a target at any time during development.
For information about specifying the library search path, see "Specifying the target's library search path".
How the information is saved
Every object is saved in two parts in a library:
Source form This is a syntactic representation of the object, including the script code.
Object form This is a binary representation of the object, similar to an object file in the C and C++ languages. PowerBuilder compiles an object automatically every time you save it.
Using libraries
It is hard to predict the needs of a particular application, so the organization of a target's libraries generally evolves over the development cycle. PowerBuilder lets you reorganize your libraries easily at any time.
About library size
For small applications, you might use only one library, but for larger applications, you should split the application into different libraries.
There are no limits to how large libraries can be, but for performance and convenience, you should follow these guidelines:
Number of objects It is a good idea not to have more than 50 or 60 objects saved in a library. This is strictly for your convenience; the number of objects does not affect performance. If you have many objects in a library, list boxes that list library objects become unmanageable and the System Tree and Library painter become more difficult to use.
Balance Managing a large number of libraries with only a few objects makes the library search path too long and can slow performance by forcing PowerBuilder to look through many libraries to find an object. Try to maintain a balance between the size and number of libraries.
Organizing libraries
You can organize your libraries any way you want. For example, you might put all objects of one type in their own library, or divide your target into subsystems and place each subsystem in its own library.
Sharing objects with others
PowerBuilder provides basic source control using the PBNative check in/check out utility. PBNative allows you to lock the current version of PowerBuilder objects and prevents others from checking out these objects and modifying them while you are working on them.
The project administrator must design a directory hierarchy for the project's workspace. The administrator might create a separate subdirectory for each target in the workspace, or for each PBL in the workspace. After the administrator sets up the project and registers every object in the workspace, individual developers copy a template workspace to their own computers, open the workspace, and connect to source control.
PowerBuilder also provides a direct connection to external SCC-compliant source control systems.
For more about using PBNative and other source control systems, see "Using a source control system with PowerBuilder".

sexta-feira, março 18, 2005

PowerBuilder – Pegando Valores em um ComputedField

Normalmente, pegamos valores em uma coluna na DataWindow e para isso utilizamos o GetItem.
Em algumas situações, precisamos de um valor de um ComputedField, o que também é um processo simples, mas pode se tornar chato se você precisar fazer este processo para vários campos.
A solução que encontrei para este problema é criar uma função que recupera o valor de um computedField.
Abaixo está o código necessário para a criação desta função:

// DESCRIÇÃO:
// * Pega o valor de um campo ComputeField
// * Similar ao GetItem, mas funciona para ComputeFiled
//
// ARGUMENTOS DE ENTRADA:
// adw_controle : DataWidow onde se encontra o Compute
// as_compute : Nome do ComputedField
// al_row : Numero da linha que deseja busca o valor. Se for um compute
// que se encontra no Header ou no
//
// RETORNO:
// * "" : Não conseguiu encontra o valor
// * <> de "" : Valor processado
//
// OBSERVAÇÃO:
//
// CRIADO POR :
// 17/03/2005 - Thiago Campos Pereira
// ALTERADO POR :
//
//========================================================================

string vls_retorno
string vls_expressao
vls_expressao = as_compute + ".Expression"
//Pega a expressão do compute
vls_expressao = adw_controle.Describe(vls_expressao)


//busca o valor
vls_retorno = "evaluate('"+vls_expressao+"', "+string(al_row)+")"
vls_retorno = adw_controle.describe(vls_retorno)
return vls_retorno

terça-feira, março 15, 2005

Oracle – Trabalhando com campos auto-incremental

O campo auto-incremental é o campo um campo numérico onde o valor é gerado automaticamente a partir de algumas informações.
No Oracle, este campo é conhecido como SEQUENCE.
Para trabalhar com este campo no Oracle, devemos seguir os seguintes passos:

1) Criar a tabela com um campo numérico, que será utilizado como auto incremental
create table ATUALIZACAO_LOG
(
SEQ_LOG NUMBER not null,
COD_EMPRESA NUMBER(5) not null,
COD_TELA NUMBER(38) not null,
CHAVE VARCHAR2(300) not null,
INICIO DATE not null,
FIM DATE null ,
TIP_LOG CHAR(1) not null
constraint CKC_TIP_LOG_LOG check (TIP_LOG in ('I','A','E','P')),
SIGLA_USUARIO VARCHAR2(20) not null,
HISTORICO VARCHAR2(300) not null,
constraint PK_ATUALIZACAO_LOG primary key (SEQ_LOG)
)
/
2) Definir um objeto do tipo SEQUENCE, com as suas configurações
CREATE SEQUENCE SEQ_ATUALIZACAO_LOG
START WITH 1
INCREMENT BY 1
NOMINVALUE
NOMAXVALUE
NOCYCLE
CACHE 20
NOORDER
/
Onde:
START WITH : Posição inicial
INCREMENT BY : Valor a ser incrementado.
3) Gerar o próximo valor

select SEQ_ATUALIZACAO_TELA.nextval
into Proximo_valor
from dual

4) Incluir na tabela

insert into ATUALIZACAO_LOG values(Proximo_valor, cod_empresa, cod_tela, upper(:as_chave), dt_now, dt_now, tip_log, upper(sigla_usuario), upper(historico) )

quinta-feira, fevereiro 03, 2005

PowerBuilder - Problemas na Migração da Versão 7 para a 9

1) Mudança no retorno do comando Retrieve
No PB 7, quando você executava Retrieve em uma DataWindow e o DataObject está inválido ( a DataWindow foi apagada ou alterada o nome), o PowerBuilder retornava 0 ( não encontrou linhas). Já no PowerBuilder 9, o comando retorna -1, que é o correto já que a DataWindow não existe.
A recomendação é que caso ocorra um caso desse, verifique se a DataWindow realmente não existe. Caso não exista, comente o código colocando usuário, data e motivo pelo qual comentou o código. Após isso, teste bem o sistema

2) Mudança no tratamento do comando ScrollToRow
No PB7, quando você executava o ScrollToRow, ele não disparava eventos como RowFocusChanged e ItemFocusChanged. No PB9, estes eventos são disparados quando você executa o comando, podendo mudar o funcionamento da sua janela, caso você tenha código nestes eventos.

3) Problemas com o comando SetTrans
O comando SetTrans não é mais aceito no PowerBuilder 9, causando cancelamento do programa.
Para resolver este problema, substitua o comando SetTrans para SetTransObject.

PowerBuilder - Roteiro de Migração da Versão 7 para a 9

* Copie a aplicação localmente na sua máquina ( isto melhorará a performance da Migração, diminuindo o tempo necessário para executar o processo)
* Crie o Workspace
* Vá na janela de New / Existing Application
* Selecione a aplicação que você deseja migrar
* Monte a Library List necessária
* Confirme o nome do Target que será criado e clique em Finish
* Aparecerá uma mensagem informando que vocÊ deverá migrar os fontes. Nesta tela, desmarque a opção de exibir mensagem de informação e obsoleto e clique em OK para iniciar a migração
* Aguarde a finalização e verifique se ocorreu algum erro na migração ( é comum aparecer várias mensagens, mas a única que não deve ser ignorada é a de erro. Quando ocorrer uma mensagem de erro, devemos analisar e corrigir o problema)
* Após a finalização, para garantir o sucesso completo da aplicação, devemos executar dois passos extras
- Full Rebuild em todas a aplicação
- Optmize em todas a PBLS

quarta-feira, fevereiro 02, 2005

PowerBuilder – Armazenando fotos em um Banco de Dados

Cada vez está sendo mais comum desenvolvermos aplicações que utilizem fotos / imagens. Abaixo está um exemplo de como Armazenar e recuperar fotos no banco de dados.
Este exemplo foi feito utilizando Orace 8.1.7 e PowerBuilder 9.2 (Build 7554)

PASSO 1 – Crie uma tabela
Crie uma tabela com um campo próprio para armazenar este tipo de arquivo (geramente chamado como campo BLOB), que pode variar de acordo com o SGBD ( SQL Server/Sybase/ASE = Image ou Text; Oracle = Long ou Long Raw ou Blob ou CLOB)
No meu exemplo, criei a seguinte tabela no Oracle:

CREATE TABLE TESTE_FOTO
( CODIGO NUMBER(2) NOT NULL,
DESCRICAO VARCHAR2(100) NULL,
EXTENSAO VARCHAR2(4) NULL,
FOTO LONG RAW NULL,
CONSTRAINT PK_TESTE_FOTO PRIMARY KEY (CODIGO))

O campo EXTENSAO foi feito para resolver um problema existente na API do Oracle 8, quando recuperamos a foto para exibição.
É recomendado que você nunca crie o campo BLOB em uma tabela a parte, pois geralmente este campo ocupa muito espaço, tornando a tabela pesada para utilizar em consultas que recuperam múltiplos registros.
Um detalhe muito interessante é que o campo de FOTO tem que ser Nulo. O que vai ser explicado no passo 2.

PASSO 2 – Criar a DataWindow de Manutenção
Crie uma DataWindow atualizável com todos os campos da tabela, exceto o campo BLOB, pois ele será tratado a parte. Por isso o campo BLOB deve ser nulo, pois a inserção de registro na tabela e feita em dois passos:
1 – Inserção dos campos normais
2 – Atualização do valor do campo BLOB

PASSO 3 – Selecionando o arquivo a ser armazenado
Insira um Picture Control na sua Datawindow, que será utilizado para exibir a imagem e crie um código que permita selecionar a imagem, como no exemplo abaixo :

string docpath, docname
integer li_rtn

//Exibe janela para selecionar o arquivo
li_rtn = GetFileOpenName("Selecione a Imagem",docpath, docname, "JPEG",+ "JPEG (*.jpg),*.jpg," &
+ "BMP (*.BMP),*.BMP,All Files (*.*), *.*", "C:\", 18)

IF li_rtn < filename=" docpath" ls_picturename =" trim(DW_1.Object.P_1.Filename)" ll_aux =" len(ls_picturename)" ll_i =" ll_aux" ll_i =" 0"> 0 then
ls_extensao = mid(ls_picturename,ll_i + 1)
else
setNUll(ls_extensao)
end if

dw_1.setitem(1,"extensao",ls_extensao)

//Salva a DataWindow
dw_1.update()

//Transforma o arquivo em um valor Blob
WF_grava_arquivo( DW_1.Object.P_1.Filename, LL_BLOB)


lblb_imagem = LL_BLOB
ll_codigo = dw_1.getitemnumber(1,"codigo")

//Atualiza o valor blog no Banco de Dados
updateblob teste_foto
set foto = :lblb_imagem
where codigo = :ll_codigo;


//Finaliza a transacao
commit;


Código da função WF_GRAVA_ARQUIVO
wf_grava_arquivo (string as_arquivo, ref blob lblob_final);//verifica se o arquivo já existe, se existir, realiza o updade, caso contrario, realizar o insert
long ll_row, ll_codigo, ll_file, ll_tam
blob lblob_arquivo

//ll_codigo = long (sle_1.text)

//Carrega o arquivo
ll_file = FileOpen ( as_arquivo , StreamMode! , Read! , LockRead!)
if ll_file = -1 then
messagebox("Erro","Ocorreu um erro na abertura do arquivo",stopsign!)
return
end if

lBlob_final = blob('')
ll_tam = fileread(ll_file, lblob_arquivo)


do while (ll_tam > 0)
lBlob_final = lBlob_final + lblob_arquivo
ll_tam = fileread(ll_file, lblob_arquivo)
loop

fileclose(ll_file)


PASSO 5 – Neste passo iremos recuperar o arquivo do banco de dados e exibi-lo na DataWindow.
No SQL Server e Sybase, basta incluir um controle “Large binary/text Database Ole Object” e prencher as informações corretas (Na dúvida, consulte o Help do PowerBuilder).
Mas, a solução acima não funciona no Oracle, pois existem alguns problemas com este controle, onde os dados não são recuperados.
Para resolver este problema, eu tive que criar a seguinte solução
1 – Recupero o campo BLOB para uma variável BLOB
2 – Limpo os arquivos temporários existentes. Para isso, armazeno os nomes dos arquivos temporários gerados em um XML
3 – Crio o arquivo temporário a partir da variável BLOB. Por este motivo, eu armazeno a extensão do arquivo na hora de gravar, evitando conflitos de tipos de arquivos. Neste ponto, também armazeno o nome do mesmo no XML, para limpeza no futuro.
4 – Utilizando um Picture Control na DataWindow, exibo o arquivo temporário armazenado.

Abaixo está o código utilizado para fazer este procedimento :

long ll_rowcount
long ll_codigo, ll_file, ll_row
blob lblb_imagem, lBlob_final, lblob_arquivo
string ls_imagem, ls_path
datastore vld_datastore

//Configura DataStore de Gerenciamento de arquivos temporários
vld_datastore = create datastore
vld_datastore.dataobject = 'd_arquivos_temporarios'

ll_codigo = long(sle_1.text)

//Recupera os Registros
ll_rowcount = dw_1.retrieve (ll_codigo)

//Se existir registro, vai para o tratamento do Blob
if ll_rowcount > 0 then
//Seleciona o campo Blob
selectblob foto
into :lblb_imagem
from teste_foto
where codigo = :ll_codigo;

//Importa os dados do arquivo XML de controle de arquivos temporarios
vld_datastore.importfile(XML!,'C:\tmpfoto.xml')

//Apaga todos os arquivos temporarios existentes na máquina
for ll_row = vld_datastore.rowcount() to 1 step -1
filedelete(vld_datastore.getitemstring(ll_row,"filename"))
vld_datastore.deleterow(ll_row)
next

//gera um arquivo temporario, com a extensao original
ls_path = "c:\tmpfoto" + string(today(),"yyyymmdd")+string(now(),"hhmmssffff")+"."+dw_1.getitemstring(1,"extensao")

//Grava o nome do aquivo temporario no XML de controle
ll_row = vld_datastore.insertrow(0)
vld_datastore.setitem(ll_row,"filename",ls_path)
vld_datastore.saveas( "C:\tmpfoto.xml", XML!,true )


//Carrega o arquivo
ll_file = FileOpen ( ls_path , StreamMode! , write! , Lockwrite!, Replace!)
if ll_file = -1 then
messagebox("Erro","Ocorreu um erro na abertura do arquivo",stopsign!)
return
end if

//Lê o blob e grava um arquivo
lBlob_final = lblb_imagem

do while (len(lBlob_final) > 0)
lblob_arquivo = blobmid(lBlob_final,1,32000)
filewrite(ll_file,lblob_arquivo)
lBlob_final = blobmid(lBlob_final,32001)
loop

fileclose(ll_file)

//Exibe o arquivo temporario
DW_1.Object.P_1.Filename=ls_path


messagebox("Sucesso","Arquivo recuperad com sucesso!")
end if



Boa sorte!!!!

quinta-feira, janeiro 27, 2005

PowerBuilder - Verificar se uma aplicação está sendo executada

//Declare as seguintes external functions
FUNCTION ulong CreateMutexA (ulong lpMutexAttributes, boolean InitialOwner,ref string lpName) library "kernel32.dll"
FUNCTION ulong GetLastError () library "kernel32.dll"
FUNCTION ulong CloseHandle(ulong hMutex) library "kernel32.dll"


//NO seu códiog, faça o seguinte
string ls_aplicacao
uint rc1,rc2
boolean lb_inherit

lb_inherit=false
ls_aplicacao="sua_aplicação.exe"
rc1=CreateMutexA(0,lb_inherit,ls_aplicacao)
rc2=getlasterror()
if rc2=183 then // mutex existe
CloseHandle(rc1)
MessageBox("Atenção", "Aplicação já esta rodando")
else
Messagebox("Solicitação será Executada", "Aplicação será iniciada.")
end if

sexta-feira, janeiro 21, 2005

SQL Server – Problemas com Formato da Data

Em alguns casos, ocorrem erros de conversão de datas para o SQL Server, com a seguinte mensagem:

Server: Msg 242, Level 16, State 3, Line 1
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

Este erro pode ocorre com apenas um Login especifico no banco de Dados SQL Server ou com todos os logins.

Isto ocorre porque o Login do SQL Server possui um idioma que ele irá utilizar. Na maioria das instalações, o SQL Server é instalado em English e os Logins assumem o idioma default da instalação do SQL Server.

Mas, está cada vez mais comum a instalação do SQL Server em idiomas específicos (português, Francês, espanhol e ect...). Neste caso, o idioma default vai ser o da instalação do SQL Server. Em outros casos, este idioma pode ser trocado, para apenas um Login ou para todos os Logins, gerando o erro acima.

Para resolver o erro citado no inicio, você tem duas soluções.

A primeira é identificar com o formato de data/hora que você está utilizando e padronizar os seus logins com o idioma que atende aquele formato de data/hora.

A segunda solução seria converter o valor para datetime, passando o formato que você está utilizando. Considero está solução melhor, pois você fica livre de problemas gerados por alteração de configuração de Logins.

Por exemplo

select convert(datetime,'2002-01-21 12:59:12.150' , 101 )

Se você trocar o 101 por 103, você vai notar que vai dar erro, pois o formato de data 103 é o seguinte formado

select convert(datetime,'21/01/2002 12:59:12.150',103)

Que é o formato de data utilizado no Brasil.

Boa Sorte

quinta-feira, janeiro 20, 2005

DotNet – Visual Studio não reconhece PocketPC Device

Em algumas situações, quando utilizamos o Visual Studio 2003 para desenvolvimento para Mobile Devices ( Pocket PC e Smart Phone), recebemos a seguinte mensagem

Error: Cannot establish a connection. Be sure the device is physically connected to the development computer.

Este erro ocorre pois o Visual Studio não conseguiu encontra o seu Device e muitas vezes é gerado pela reinstalação ou update do Active Sync no PC.
Tentei “N” soluções para resolver o problemas, inclusive os listados nos site
http://download.microsoft.com/download/c/d/b/cdbff573-73fb-4f9f-a464-c5adc890e1ae/Readme.htm#CEDeploy

Tentei reinatalar o Visual Studio 2003 duas vezes, limpei as chaves do registry, rodei o ProxyPorts.Reg e fiz N tentativas.

Depois de uma semana tentando resolver o problema, consegui achar a solução que resolveu o meu problema.

Abaixo estão os passos que segui:

1. Remover totalmente activesync.
2. Reinstalar de novo.
3. Executar C:\Program Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\WinCE Utilities\WinCE Proxy Ports Reg\ProxyPorts.Reg
4. Verificar [HKLM\microsoft\wince services] os registros para as portas do proxy
5. Si [HKLM\microsoft\wince services] se não existe, o seu problema é outro e este roteiro não vai corrigi-lo.
6. Si [hKLM\microsoft\wince services] se existe, então executa "DelDesktopCryptKey.exe" em "C:\Program Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\WinCE Utilities\DelDesktopCryptKey"
7. Executar um Soft Reset no Pocket pc.
8. Copiar "DelCryptoKey.exe" armv4 version para o pocket pc e executá-lo no Pocket PC
9. Antes de iniciar a compilação no Visual Studio, assegure que tenha instalado o utilities v1.1 for VS.NET 2003 add-ons .
10. No Visual Studio, selecionar tools->select windowsce device cpu
11. Selecionar armv4 e pressionar configurar
12. Teste

Esta configuração funcionou perfeitamente no me caso. A minha configuração é a seguinte:
Pocket PC
Dell Axim X30
Windows Móbile 2003
Active Sync 3.7.1
PC
Windows XP Sp 2
Visual Sudio 2003

segunda-feira, janeiro 17, 2005

Ferramentas Case

Ferramentas Case, ErWin, CaseStudio, Dr. Case, Visio e Together. Qual é a melhor opção para se trabalhar com o SQL Server 2000? Tire suas dúvidas e veja qual atende melhor as suas necessidades

Comparando o SQL Server com Outros Bancos de Dados

Você está comprando um novo Sistema Gerenciador de Bancos de Dados Relacional? Quer comparar seu sistema atual com o SQL Server? Veja o que analistas independentes estão dizendo sobre o SQL Server, como ele difere do Oracle, IBM, e Sybase, e encontre recursos que o ajudarão a migrar ou integrar seu sistema de bancos de dados atual.

SQL Server 2000 - Alta Disponibilidade

Maximize a disponibilidade de suas aplicações comerciais com log shipping, backups on-line e clusters failover. Leia este artigo e conheça melhor as soluções de alta disponibilidade oferecidas pelo SQL Server 2000.O Microsoft SQL Server 2000 ajuda a maximizar a disponibilidade através de backups online, log shipping completamente integrados e clusteringfailover potencializado. Destes métodos, o backups online está disponível tanto no SQL Server 2000 Standard Edition quanto no SQL Server 2000 Enterprise Edition. Log shipping e clustering failover estão disponíveis somente na Enterprise Edition

sexta-feira, janeiro 14, 2005

PowerBuilder - Inserindo objeto via metodo post

By Celso S. Côrtes

//Inserindo objeto via metodo post
Blob lblb_args
String ls_headers
String ls_url
String ls_args
long ll_tam
integer li_ret
li_ret= GetContextService( "Internet", iinet_base )
IF li_ret = 1 THEN
ir = CREATE n_ir
ls_url = "http://sua_url/xxxx/parametros?"
ls_args = "id=nome&pwd=senha"
lblb_args = Blob( ls_args )
ll_tam = Len( lblb_args )
ls_header = "Content-Type: " + &
"application/x-www-form-urlencoded~n" + &
"Content-Length: " + String( ll_tam ) + "~n~n"
li_rc = iinet_base.PostURL( ls_url, lblb_args, &
ls_header, ir )

Banco de Dados - Funções do SQL Server X Oracle

Neste Site você tem uma lista das funções do SQL Server e quais são as funções compativeis no Oracle.

quinta-feira, janeiro 06, 2005

SQL Server 2000 - Identificando Versões

Versões do SQL Server
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

* 2000
- 2000.80.194 = RTM (Primeira Versão)
- 2000.80.384 = SP1
- 2000.80.534 = SP2
- 2000.80.760 = SP3 ou SP3a

SQLServer 2000 - Replicação

- Informacoes
1. Snapshot Agent : Replicacao Inicial, sincronismo ( Este processo é pessado e bloqueia o banco por um certo tempo)
2. Log Reader Agent : Replica as transacoes do Publisher para o Distribution
3. Distribution Agent : Replica as transacoes do Distribution para o subscriber
4. Merge Agent : processo de replicacao para os dois lados, responsavel por resolver conflitos

- Passos para configurar a Replicaçao
1. Definir o cenario : Central Publisher
2. Definir o metodo : Transaction replication
3. Criar Usuario Utilizado : o usuario deve ter acesso de Administrators, system
4. Associar o usuario com os servicos MSSQL e AGENT
5. Habilitar o servidor de Publicacao (configurar o distribution e o publisher). Chamar o wizard e lembrar de informar um diretorio que possua espaco para o distribuition(de preferencia coloque o diretorio em um disco diferente para ganho de performance)
6. Se houver triggers, marcar a opçao de NOT FOR REPLICATION para que os dados nao sejam alterados 2 vezes
7. Em todas as Constraints, marcar a opçao de NOT FOR REPLICATION para que os dados nao sejam validados 2 vezes
8. Criar as publicacoes : utilizar o wizard, selecionar transactional publication, ir no botao de DEFAULT ARTICLES e marcar triggers e DRI, selecionar as tabelas (se existir alguma tabela com coluna identity, a propriedade identity nao sera levada)
9. Verificar se os bancos no subscribers estao vazios.
10. Criar Subscribers : Definir se vai ser Pull (configurado em cada subscriber) ou Push (configurado no servidor de publicacao, mais simples), marcar para realizar o Snapshot
11. Monitorar :
12. Backup : Publisher(Published DB, msdb, master), Distributor (distributor DB,msdb,master), subscriber(subscriber db), o published e distribution db devem ser backupiados juntos
13. Resolvendo erro : Se ocorrer erro na replication, retire o subscriber, reinsira o mesmo e faca um sincronismo. Entre nas opcoes da publicacao e mande reinicializar o subscriber, depois rode o servico de snapshot, quando acabar, rode o servico do subscriber.


Sql Anywhere - Informações sobre este sgbd

Este link traz todas as informações necessárias sobre o SGBD SQL Anywhere.

quarta-feira, janeiro 05, 2005

Dicas Gerais - Aumentar a conta do Hotmail para 250 MB

Galera,
fiz o teste e funcionou. Se você quiser aumentar a sua caixa posta do Hotmail de 2 MB para 250 MB, siga os passos abaixo.

Hotmail 250mb de espaço Aumente sua conta do hotmail de 2mb para 250mb.
Explicações: Não é necessario pagar nada para aumentar o espaço da sua conta.
Como podem ver na Ajuda do hotmail, no Brasil ainda "em breve" as contas passarão ter mais espaço de armazenamento. Abaixo iremos mostrar como alterar o país configurado e assim aumentar o tamanho da conta:
Somente em contas @hotmail.com.
1. Acesse www.hotmail.com.br e entre com seu usuário e senha normalmente.
2. Clique em opções, no canto superior direito da tela:
3. Na página opções, clique em Meu Perfil:
4. Trocar campos:País/Região: Estados UnidosEstado: FloridaCEP: 33332
Você pode usar outros estados, caso o cep esteja correto.
5. Atualize, e na página seguinte irá mostrar uma mensagem: Seu Perfil foi atualizado com sucesso.
6. Acesse o link http://www.hotmail.msn.com/cgi-bin/accountclose e clique no botão encerrar minha conta, no final da página:
Obs: Você não perderá seus e-mails, contatos do MSN Messenger, etc.
7. Irá para uma página de confirmação de encerramento:

8. Acesse novamente www.hotmail.com.br e entre com o mesmo e-mail e senha... Pedirá para você ativar a conta, aceitar o termo de uso, promoções e etc..
9. Pronto sua conta já terá 25mb:

Após 30 dias sua conta aumentará para 250mb automaticamente, neste período não deixe de acessar seu e-mail.

PowerBuilder - enviar e-mail via SMTP

Qual falamos em enviar e-mail via SMTP, queremo dizer, sem utilizar software de e-mail (outlook, Netscape, Eudora e etc...)
O PowerBuilder não tem suporte a este recurso, tendo que utilizar aplicações externas para isso. Existe N aplicações que fazem o que queremos. Encontrei uma livre na Internet que funciona muito bem. O nome da aplicação é BLAT (http://www.blat.net/).
Ela funciona da seguinte forma.
* Você tem que possuir uma servidor SMTP funcionando na sua rede. O Exchange Server possui este recurso, só é necessário abilita-lo e configura-lo.
* Você pode chamar um aplicativo (BLAT.EXE) passando os parâmetros necessários ou uma função de uma dll (BLAT.DLL) que envia o e-mail para você.

PowerBuilder – Migração de versão

Nas migrações para PowerBuilder 5,6 e 7, ocorreram vários problemas e por isso, toda vez que temos uma versão nova do PowerBuilder, sempre aparece a pergunta “Vamos ter problemas na migração?”.

Já realizei todo o tipo de migração e notei que as migrações para PowerBuilder 8,9 e 10 são bem tranqüilas, bastando compilar os objetos no novo PowerBuilder. Na migração para PowerBuilder8, ainda ocorreram alguns problemas, como o desaparecimento de scripts (em alguns eventos, o código simplesmente desaparecia), mas na migração para PowerBuilder 9 e 10, não tive nenhum problema e nem parece que você está fazendo uma migração, mas apenas executando um Full Rebuild na aplicação
Ponto positivo para o PowerBuilder

PowerBuilder VERSUS Windows 9x

Até a versão 8 do PowerBuilder, um executável gerado podia ser executado em qualquer sistema operacional Windows 95 ou superior.
A partir do PowerBuilder 9, o executável não mais funcionará em Windows 95, sendo necessário o Windows 98 ou superior de acordo com a documentação da Sybase. Já ouvi relatos de pessoas que tiveram problemas com Windows 98, mas não conseguimos identificar se era limitação do PowerBuilder ou da aplicação.
A partir do PowerBuilder 10 as restrições ficam maiores ainda. O próprio PowerBuilder 10 só pode ser instalado no Windows 2000 ou XP. A aplicação compilada ( executável ) do PowerBuilder 10 funcionará apenas no Windows 2000, 2003 e XP. Assim, ficam excluídos os sistemas operacionais Windows 95, 98, Me (Millennium) e NT.Essa informação é muito importante para quem pretende migrar os seus sistemas para PowerBuilder 9 ou 10.