segunda-feira, junho 05, 2006

PowerBuilder - Abrindo um documento

Em algumas situações, o comando RUN não consegui abrir o documento que desejamos ou abre o documento utilizando uma aplicação diferente da configurada como "padrão" para aquele tipo de documento.
 
Para resolver este problema, pode-se utilizar o comando abaixo:
 
String VLSArquivo
long ret
 
ret = run('rundll32 SHELL32.DLL,ShellExec_RunDLL ' + '"'+VLSArquivo+'"')
if ret = -1 then
    vismsg = 'Não foi possível executar '+VLSArquivo+'!'
    return 0
end if
return 1

quarta-feira, maio 17, 2006

PowerBuilder - Bloqueando o Teclado

Recentemente precisei bloquear o entrada de dados via teclado de uma aplicação e encontrei a seguinte função:
 
Function long blockinput(BOOLEAN fBlockIt) LIBRARY "user32.dll"
 
onde True bloqueia o teclado e False libera o teclado.

terça-feira, maio 16, 2006

PDA - Sites interessantes

Abaixo estão relacionando alguns sites interessantes para serem acessados nos PDAs:
Abaixo estão relacionados Sites que fornecem informações sobre PDAs e celulares:

Palm – Problemas com o Treo 650

Estamos avaliando a utilização de alguns aparelhos Treo na empresa. Em todos os aparelhos que testamos, a primeira impressão que fica é que o som do telefone é muito ruim.

Este problema ocorre porque existe um Bug no Treo. Para resolvê-lo, você tem que fazer a atualização da ROM do aparelho, que pode ser baixada direto no site da PALM USA (http://www.palm.com/us/support/downloads/treo650updater/).

Após o update, a qualidade do som melhorou muito, mas ainda perde para muitos telefones celulares disponíveis. A solução adotada por vários usuários é a utilização de fones de ouvido bluetooth.

PowerBuilder – Problemas ao retornar valores por output no Oracle

PowerBuilder : 9.0.3 Build 8004
Oracle : 8.1.7.4
Forma de conexão : API O84 Oracle8/8i (8.x.4+)

Recentemente estava tendo erro ao retornar valores VARCHAR2 como OutPut de uma procedure. A definição da minha procedure era :

create or replace PROCEDURE SP_GERA_XML_POS
(p_numcdc cconta.numcdc_cad%type,
p_CodAgente varchar2,
p_CodEmpresa Number,
p_retorno_xml out varchar2) As ...........


No PowerBuilder, criei um UserObject do tipo Transaction e criei uma External Function apontando para o procedure, da seguinte forma:

subroutine SP_GERA_XML_POS(double P_NUMCDC,string P_CODAGENTE,long P_CODEMPRESA,ref string P_RETORNO_XML) RPCFUNC ALIAS FOR "SP_GERA_XML_POS"

Chamei a procedure utilizando seguinte código :

sqlca.sp_gera_xml_pos( 444, 'zzz', 10, xmlretorno)

if sqlca.sqlcode <> 0 then
xmlretorno = sqlca.sqlerrtext
end if

messagebox('teste',xmlretorno)

Este código me retornava a mensagem :
ORA-06502: PL/SQL: numeric or value error: character string buffer too small

Para resolver o problema, descobri que tenho que inicializar a variável que será utilizada para receber o retorno. Como o Oracle possui um limite de 4000 caracteres, alterei o meu código para ficar da seguinte forma:

xmlretorno = space(4000)

sqlca.sp_gera_xml_pos( 444, 'zzz', 10, xmlretorno)

if sqlca.sqlcode <> 0 then
xmlretorno = sqlca.sqlerrtext
end if

messagebox('teste',xmlretorno)

Desta forma, o problema foi solucionado.

quinta-feira, maio 04, 2006

VisualStudio 2005 – Problemas com o Help

Recentemente instalei o VisualStudio 2005 completo com o MSDN completo. Quando tentei abril o MSDN Library for VisualStudio 2005 obtive o seguinte erro:

Microsoft Document Explorer cannot be shown because the specified help collection 'ms-help://MS.MSDNQTR.v80.en' is invalid

Analisei vários sites e fóruns e descobria a origem e como resolver o problema:

Origem
A minha instalação foi feito a partir de uma imagem de DVD (Arquivo .BIN). Para abrir o arquivo .BIN, utilizei o WINRAR e extrai os arquivos para o meu drive local.
Instalei o VisualStudio e nenhum erro foi informado.
De acordo com artigos que li, o problema está na utilização do WINRAR para extrair arquivo do .BIN. Por algum motivo, o WINRAR modifica alguns arquivos, corrompendo-os e causando o erro acima.

Solução.
Instalei a última versão do Software DAEMON TOOLS, que cria um drive virtual para o arquivo BIN, simulando um drive de DVD.
Apenas pedi para corrigir a instalação do MSDN e o mesmo passou a funcionar.

terça-feira, maio 02, 2006

Oracle – Dica de Performance

Recentemente fiz um trabalho em conjunto com um excelente DBA Oracle para analisarmos alguns pontos de baixa performance.

Um dos pontos que mais causou problemas foi o tratamento dado ao desenvolvedores para os parâmetros opcionais.

Por exemplo, vamos dizer que em uma consulta você tem três parâmetros e todos eles são opcionais. Abaixo estou listando as soluções adotadas e o que podemos concluir das mesmas:

1) Passar Nulo no parâmetro não informado
Where ( Campo1 = :Parametro1 or :Parametro1 is null)
And ( Campo2 = :Parametro2 or :Parametro2 is null)
And ( Campo3 = :Parametro3 or :Parametro3 is null)


Nesta solução, se o parâmetro for informado ele é passado para a query, ao contrário passa-se nulo.
Essa é a pior solução que pode ser adotada. O otimizador do Oracle identifica o OR e verifica que a mesma coluna não é utilizada nas duas comparações e por isso não utiliza índice, degradando em muito o tempo de resposta da query.

2) Passar o valor por limite
Where ( Campo1 Between :Parametro1_ini and :Parametro1_fim)
And (Campo2 Between :Parametro2_ini and :Parametro2_fim)
And (Campo3 Between :Parametro3_ini and :Parametro3_fim)


Nesta solução, se o parâmetro for informado, o valor é passado para o parâmetro inicial e final, por exemplo Campo1 between 45 and 45. Ao contrário, é passado um valor de forma a não filtrar os dados, por exemplo Campo1 between 0 and 9999.
Essa solução, apensar de funcionar, deve ser evitada, pois em algumas situações o Oracle armazena o plano de execução para utilizá-lo futuramente, com a intenção de melhorar a performance da query, evitando a analise necessária para identificar o melhor plano. Como os valores passados por limite podem vária, este tipo de query pode prejudicar o trabalho do otimizador.
Além disso, se você passa apenas um parâmetro, você está gerando trabalho extra para o Oracle, que tem que avaliar se os dois outros parâmetros devem ou não ser utilizados pelo filtro.

3) Montar a Query Dinamicamente
Essa é a melhor solução, onde alteramos a query em tempo de execução passando apenas os valores necessários. Dessa forma, o otimizador pode trabalhar com uma query mais simples e montar o plano de execução com mais precisão.

Devo lembrar que em algumas situações, como a utilização de Composites complexas, essa solução não poderá ser adotada. Neste caso, recomendo utilizar a solução B.

Oracle - Query com Recursividade

De vez enquanto recebo um e-mail de como desenvolver uma query com recursividade (Peças de um automóvel, etapas de um projeto, hierarquia de funcionários, etc...). O Oracle possui um comando interessante que recupera o dado recursivamente, independente da quantidade de níveis.

O nome deste comando é CONNECT BY PRIOR

Abaixo estou enviando o trecho do e-mail que um amigo meu enviou sobre este comando:

Pessoal, hoje eu aprendi um recurso interessante do oracle utilizado para trazer um result set com recursividade.
Talvez seja útil para vocês.


SELECT lpad(' ', 2*level) ID ID, NOME, REC_ID FROM RECURSIVIDADE start with id = 3 CONNECT BY PRIOR ID = REC_ID

Escrito por : Wellington Fernandes do Carmo

domingo, abril 30, 2006

CodeWarrior - Memory is getting low

Estou tentnado utilizar o Constructor do CodeWarrior em uma máquina com 1GB de memória RAM e a ferramenta me retorna o erro abaixo.

"Memory is getting low. Try closing some windows, or give Constructor a largermemory partition."

Procurei em vários sites e não obtive sucesso na solução do problema.

No site da Metrowerks, proprietária od CodeWarrior, achei o seguinte artigo:

Each time I run Constructor on my system, I receive an error window that reads,
"Memory is getting low. Try closing some windows, or give Constructor a larger
memory partition."
This error message is a bug within Constructor. It reports a low memory error on any
system that contains 512 MB or more of RAM. Usually, the error is triggered if you have a
multiple of 512 MB on your system, so 1024 MB would cause the error, but 768 MB may
not.
Therefore, the solution would be to try increasing or decreasing the amount of RAM the
system is currently using. However, various users have had this problem go away by
changing the amount of virtual memory the system uses in the System settings, so this is
another option to try. Palm is aware of this problem and should be working on a fix for
future releases of Constructor. Since Constructor is maintained and distributed by Palm as
part of the Palm OS SDK, any bug fixes or feature requests for Constructor can be
implemented only by Palm.

Após N dias e muita pesquisa tentando resolver este problema, consegui a solução que é instalar o Constructor for Palm OS 1.9. Então começou outra luta, onde encontrar a atualização!!!

Foram gastos mais N dias para achar essa atualização, que se encontra no SDK R3 para PALM OS 5. Aproveitei e já baixeis a versão 1.9.1, que é a mais recente.

Mas, o melhor de tudo, que após este trabalho todo, o problema agora está resolvido.

Fico muito feliz em poder publicar este problema aqui e puder ajudar outras pessoas. Afinal, foram um mês e meio de pesquisa para resolver este problema.

segunda-feira, abril 24, 2006

PowerBuilder 11 - Versão de Avaliação

Recentemente a Sybase divulgou uma amostra do que será o PowerBuilder 11. A grande novidade dessa versão é a geração de WebForms utilizando DotNet.

Apesar dessa versão possuir muito bugs, vale apena entrar no Link e dar uma olhada.

Além do DotNet, houve mudanças no visual da ferramenta e inclusão de recursos para desenvolvimento Mobile.

Diversos - Problemas com Monitor 15' LCD da Proview

Recentemente adquiri um monitor de 15’ LCD da Proview. Para a minha surpresa, após o primeiro boot, a tela do monitor ficou preta e apresentou a mensagem de No Signal.

Após vários testes, identifiquei que se eu reiniciasse o computador com o cabo do monitor ligado, o mesmo apresentava o problema. Mas se eu desligasse o cabo do monitor, aguardasse o tempo suficiente para aparecer a tela de Login e ligasse o cabo novamente, funcionava 100%.

Fiz o teste com o monitor em outro computador e o mesmo funcionou 100%. Então, comecei a desconfiar da minha placa de vídeo. Como ela funcionava com outros monitores, percebi que poderia ser alguma incompatibilidade.

Possuo uma placa de vídeo NVIDIA GeForce4 MX 4000. Essa placa possui um recurso de desabilitar a aceleração gráfica. Utilizei este recurso, e o monitor funcionou 100%.

Explicando o problema. No momento que o Windows e inicializado, a minha placa de vídeo tenta identificar qual a melhor configuração do monitor. Por algum problema, ela configura a taxa de atualização para um valor muito alto e o monitor perde o sinal.

Entrei em contato com a Proview e após vários dias e muitos e-mails/telefonemas. Eles me passaram a seguinte resposta:

Boa tarde
Thiago para resolvermos este problema , voce tem que levar sua cpu e o monitor ao um posto autorizado proview, pois teremos que atualizar a bios do monitor para este tipo de placa.


Fico pensando em um usuário leigo, que não tem experiência e que acha que fez um excelente negocio comprando uma placa top de linha e um monitor bacana e que descobre que tem uma dor de cabeça ao invés de alegria.

Como a assistência técnica mais próxima de mim fica a 300 KM (RJ). Vou ficar um bom tempo sem solução para o meu monitor. A minha sorte é que raramente faço um boot no meu computador.

terça-feira, março 14, 2006

CodeWarrior – O que é?

CodeWarrior é uma ferramenta utilizada para desenvolvimento de aplicativos para PalmOs (Sistema operacional utilizados em handhelds Palm).

É uma excelente ferramenta, se não for a melhor. O próprio sistema PalmOS é desenvolvido utilizando essa ferramenta, por isso ela permite acessar todos os recursos do sistema operacional

O desenvolvimento é feito utilizando linguagens como o C, C++ e Java.

A algumas semanas atrás, foram requisitados o desenvolvimento de alguns módulos do nosso ERP que funcionassem em Palms e fiquei responsável por estes aplicativos, iniciando o meu relacionamento com o desenvolvimento para Palm.

A partir de vários estudos, elegemos o CodeWarrior como ferramenta de desenvolvimento.

A partir deste momento, estarei incluindo no meu blog algumas dicas sobre o CodeWarrior, bem como publicar informações interessantes sobre a ferramenta.

quarta-feira, março 01, 2006

quinta-feira, fevereiro 16, 2006

PowerBuilder – GPF ao Fazer GLV / RefreshStatus

Recentemente tive um problema onde a aplicação de um dos desenvolvedores fechava quando se fazia GetLatestVersion (GLV) ou RefreshStatus em um PBL no PowerBuilder 9.

Após várias tentativas e erro, descobri que o desenvolvedor tinha editado o PBG manualmente e cometido um erro. O nome do objeto estava da seguinte forma:
"dw_cad_impressora.srd.srw" "sigsa_cad.pbl";

Este erro causava o cancelamento da aplicação sem nenhuma informação para o desenvolvedor.

Para resolvê-lo, apenas corrigi o nome do objeto no PBG.

terça-feira, janeiro 31, 2006

PowerBuilder – Recuperando valor de uma coluna em um Report

Um Report é uma DataWindow que é inserida dentro de outra DataWindow.

Existem duas formas de trabalhar com Report, utilizando uma DataWindow comum e acrescentar um objeto Report, denominada de DataWindow Nested. A segunda opção é criar uma DataWindow Composite e adicionar os Reports.

No Primeiro caso, a DataWindow principal possui dados e para cada registro existente, ele executára as Reports.

No Segundo caso, a DataWindow principal não possui dados, recuperando os reports apenas uma vez.

A dúvida que existe entre muitos desenvolvedores é como devemos proceder para buscar valores (GetItem) em uma coluna que está dentro de um Report.

Abaixo está a solução para os dois casos:

1) Report em DataWindow Composite
Este é o caso mais simples e possui duas soluções.

A primeira solução é realizar um GetChild do Report e fazer um comando GetItem ou Object tradicional, por exemplo:

datawindowchild vldwc_aux
dw_1.getchild('dw_1',vldwc_aux)
messagebox('teste',vldwc_aux.getitemstring( 1, 'sistema'))
messagebox('teste',vldwc_aux.getitemstring( 2, 'sistema'))


A segunda solução é baseado na estrutura de objetos do PowerBuilder, ou seja, você pode utilizar o OBJECT para buscar o valor, como no exemplo abaixo:
string vlsteste
//Syntax : .object.[].object..[]
vlsteste = string(dw_1.object.dw_1[1].object.sistema.primary[1])
messagebox('teste2',vlsteste)


Existem alguns variações do comando acima, que também funcionam no PowerBuilder.

2) Report em DataWindow Nested
Neste caso, a única solução é usar o OBJECT para busca o valor, como no exemplo abaixo:

//Syntax : .object.[].object..[]
vlsteste = string(dw_1.object.dw_1[1].object.sistema.primary[1])
messagebox('teste2',vlsteste)

sexta-feira, janeiro 27, 2006

PowerBuilder - Retirando o X do menu das janelas

Achei interessante este artigo do site do Celso Cortes de como remover o X (Opção de fechar a janela). É interessante para algumas situação, principalmente para janelas Response.

http://www.celso.cortes.nom.br/seleciona/c_2.php?opc=7&it=2&gr=3&item=61&tit=Anulando%20o%20%22X%22%20na%20Window&cc=34

PowerBuilder – Salvando uma DataWindow como PDF

Obs: Solução existente para PowerBuilder 9 ou superior

Recentemente tive a necessidade de implementar um processo batch para gerar arquivos PDF e enviá-los por e-mail.

A funcionalidade de envio de arquivos por e-mail já tinha sido implementada através do blat ( http://thiagocpereira.blogspot.com/2005/01/powerbuilder-enviar-e-mail-via-smtp.html )

O grande problema era como gerar arquivo PDF. Procurei na Internet e vi vários artigos de como gerar o PDF, mas nenhum deles satisfez por completo as necessidades da minha aplicação.

Depois de muito trabalho de pesquisa e juntando informações de N sites, consegui definir uma forma de trabalho que funciona 100%.

Abaixo vai as informações sobre a solução e como consegui chegar até ela.

1) Problema
a) Processo Batch de geração de arquivos PDF em lote e envio por e-mail, sem nenhuma interação do usuário.
b) Permitir salvar os relatórios existentes em todos os sistemas em PDF, envolvendo uma média de 7000 estações de trabalho, incluindo sistemas operacionais Windows 98, 2000 e XP.

2) Pesquisa
Pesquisei vários SITES, NewsGroup e lista de discursão. Após um filtro nas opções existentes, resolvi estudar as seguintes ferramentas:
* PDF995
* PDF Reditector
* SaveAs PDF da DataWindow

PDF995
A primeira opção e a que me pareceu mais simples foi a utilização do PDF995 (www.pdf995.com). Como ele é FreeWare, não teria problema com licenças.
Os problemas surgiram na automação do processo e Deploy do Software. Teria que instalar o software em todas as máquinas o que não agrada muito a nossa equipe, devido a quantidade de estações e a localização das mesmas.
A geração automática do arquivo não teria problema, pois descobri que apenas teria que alterar uma chave no arquivo INI do PDF995.
Mas, o problema que a principio tornou inviável a solução foi a propaganda que é exibida no momento que você salva os arquivo como PDF. Para retirar essas propagandas você tem que comprar uma licença de uso. Baixei uma licença utilizando o e-mule é funcionou perfeitamente. O problema é que a empresa não permite nenhum tipo de pirataria. A solução de comprar a licença se tornou inviável. A licença para cada máquina custa 10$. Fazendo as contas, teríamos que gastar R$161.000,00 para licenciarmos todas as nossas estações o que tornou a relação custo / beneficio um empecilho para a implementação da funcionalidade.

PDF Redirector
A segunda opção seria a utilização do PDF Redirector. Como ele não exibe nenhuma propaganda e é FreeWare, não teríamos os problemas o PDF995.
Mas, continuamos tendo o empecilho de ter que instalar o Software em todas máquinas.
Além desse problema, a automatização do processo de geração de PDF é um pouco complexa, aumentando o tempo necessário para a implementação e gerando novos pontos de risco.

SaveAs PDF da DataWindow
Como é um recurso nativo do PowerBuilder, seria a solução melhor a ser adotado.
O problema inicial encontrado foi a falta de informações sobre o processo.
Também tivemos problema na versão do GNU GhostScript (FreeWare), adotando a versão 7.05 como a melhor que se adequar as nossas necessidades.
Após levantar informações de vários sites, conseguimos fazer a solução funcionar em uma máquina com todos os softwares instalados (PowerBuilder e GNU GhostScript).
Então esbarramos em outro problema, como fazer o Deploy dos softwares na rede. Após algumas pesquisas, descobri que seria necessário apenas adicionar duas novas chaves no registry, o que pode ser automatizado utilizando o Script de Login dos usuários.

Assim, resolvemos o problema utilizando a solução existente no próprio PowerBuilder 9 ou superior.

3) Solução
Todos os nossos sistemas e DLLs do PowerBuilder encontra-se na rede, por isso, a solução abaixo foi feita baseado nesse ambiente
Abaixo estão os passos necessários para a implementação da solução
a. Coloque os sistemas e DLLs do PowerBuilder na rede. No nosso exemplo vamos adotar que estes arquivos se encontram no Drive X:
b. Copie a pasta C:\......\Sybase\Shared\PowerBuilder\Drivers para o drive X: . Na verdade o diretório Drivers tem que estar na mesma pasta da dll PBDWEXX.DLL.
c. Baixe a versão 7.05 do GNU GhostScript (http://prdownloads.sourceforge.net/ghostscript/gs705w32.exe?download) e instale em um máquina usando o diretório padrão.
d. No Drive X:, crie uma pasta chamada GS e copie as pastas BIN, LIB e FONTS da pasta c:\GS\ para a pasta na rede.
e. Cria as seguintes chaves no Registry das máquinas (Essa etapa pode ser automatizada utilizando o Login Script)
[HKEY_LOCAL_MACHINE\Software\GNU GhostScript]

[HKEY_LOCAL_MACHINE\Software\GNU GhostScript\7.05]

"GS_DLL"="X:\gs\bin\gsdll32.dll"
"GS_LIB"="X:\gs\lib;X:\gs\fonts"

f. Para Salvar a DataWindow, você tem que observar se as seguintes propriedades estão configuradas
//Se o GhostScript tiver instalado, configura a DataWidnow para utiliza-lo
dw_dados.Object.DataWindow.Export.PDF.Distill.CustomPostScript='No'
dw_dados.Object.DataWindow.Export.PDF.Method = Distill!
dw_dados.Object.DataWindow.Export.PDF.XSLFOP.Print='No'

O próximo passo é salvar a DataWindow como PDF

//Salva a DataWindow como PDF
dw_dados.saveas(p_path,PDF!,True)


4) Conclusão
O objetivo deste artigo é esclarecer o procedimento de Salvar como PDF e compartilhá-lo com outros desenvolvedores.

Quem tiver dúvida ou sugestões, pode incluir um comentário para que possamos enriquecer o conteúdo deste artigo.



Boa sorte!

segunda-feira, janeiro 23, 2006

Microsoft Outlook - Como configurar o Outlook XP para abrir arquivos EXE em anexo

Essa informação é muito importante, principalmente se você recebe anexos dos seus clientes e precisa abri-los de qualquer forma.
Só tomem cuidado com vírus ou outros BAD PROGRAMS.

quarta-feira, janeiro 18, 2006

PowerBuider – Problema ao Formatar Valor em gráfico

No PowerBuilder 9, existe um Bug ao formatar o campo de Valor quando utilizamos uma DataWindow Gráfica.

Quando você informa o formata de exibição do campo, ele exibe o formato correto no Preview, mas após fechar e reabrir a DW, o formata é perdido.

O problema ocorre porque o PowerBuilder grava a informação de formata em um local errado, o que pode ser visto quando você visualiza o source da DW.

Para resolver o problema no source da DW (Edit Source), altera a propriedade values.dispattr.format="".