sexta-feira, junho 23, 2006

PowerBuilder - Bugs no Build 8716 da versão 9

Abaixo vai a lista de Bugs que eu encontrei na Build 8716 do PowerBuilder 9:
 
Duplicação de valores na DataWindow
    Em todas as DataWindows onde você pode inserir várias linhas (Múltiplos registros), quando você insere a primeira linha, funciona perfeito. Quando você tentar inserir a segunda linha, o PowerBuilder está mostrando o valor da primeira linha em tela, como se estivesse duplicando os valores anteriores, mas o campo continua vazio. a explicação técnica é que o valor e duplicado indevidamente em tela mas não no Buffer.

quinta-feira, junho 22, 2006

PowerBuilder - Conectando ao Oracle 10G utilizando Cliente do Oracle 8i

PowerBuilder 9.0.3 Build 8716
 
Recentemente, fizemos a migração do nossos servidores Oracle 8i para Oracle 10G. Para reduzir os impactos resolvemos fazer a migração em partes, primeiro migrando o Servidor e posteriormente migrando o Cliente nas estações.
 
Fizemos a homologação e não encontramos problemas. Após a migração, notamos que em algumas funções o tempo piorou muito. Fizemos uma analise do problemas e descobrimos que as queries utilizadas pelo PowerBuilder 9 , API do Oracle 804, para acessar o Catalogo do Oracle funciona muito bem no Oracle 8 e Oracle 9, mas possui uma performance horrível no Oracle 10.
 
Só para comparação, para listar as tabelas do Oracle 8 no DBProfile demorava 1 segundo. Após a migração para Oracle 10, começou a demorar 22 segundos.
 
Para resolver o problema, fizemos a migração do cliente para Oracle 9 (também funciona com Cliente do Oracle 10) e passamos a utilizar a API do Oracle 9 para conectar utilizando o PowerBuilder.

terça-feira, junho 06, 2006

PowerBuilder - Usando DataWindow para manipular XML

Apenas uma dica para quem quer trabalhar com manipulação de XML em uma DataWindow.
 
O primeiro passo é desenvolver o template que você deseja e associa-lo a DataWindow. A associação pode ser feita no próprio DWPainter ou dinamicamente, como no exemplo abaixo:
 
dw_1.Object.DataWindow.Export.XML.UseTemplate=<Nome do Template XML>
 
Após definir o template, pode ser extrair ou importar os dados diretamente de um arquivo ou variável string, da seguinte forma:
 
- Importação
    - dw_1.importstring(XML!, <variável contendo o XML>) 
    - dw_1.importfile(<Nome do arquivo>) 
 
- Exportação
    - dw_1.Object.DataWindow.Data.XML
    - dw_1.SaveAs(<Nome do arquivo>,XML!,false)

segunda-feira, junho 05, 2006

PowerBuilder - Utilizando HTTP Post

Recentemente tive a necessidade de utilizar o HTTP Post, chamando uma URL passando um XML e recebendo um XML de resposta.
 
No final das contas, o processo é simples, mas não achei nada "pronto" na Web de como utiliza-lo.
 
Abaixo vão os passos necessários para criação de um objeto que chama o método HTTP Post:
 
1 - Objeto com resultado Web
    - Crie um User Object do tipo Standart/InternetResult
    - Declare uma variável de instancia onde será armazenada o retorno (No nosso exemplo, criamos a variável VISRetornoWeb )
    - Na função InternetData(), atribua o parâmetro da função para a variável criada no passo acima
        VISRetornoWeb = string(data)
 
        return 1
 
2 - Criando objeto para disparar metodo HTTP Post
    - Cria um objeto do tipo Custom
    - Crie uma instancia do objeto criado na etapa 1 (No nosso caso, a instancia chama UOI_internet_resultado)
    - Crie uma função para chamar o método HTTP Post com os seguintes argumentos
        * Value String p_URL
        * Value String p_ParametroWeb (Parâmetros que serão passados para Web)
        * Reference String p_RetornoWeb (Parâmetros que serão retornados da Web)
    - Coloque o seguinte código na função
Blob Vlblb_args
String Vls_headers
Long Vll_ret
 
p_retornoWeb = ''
 
Vlblb_args = blob(p_parametroWeb)
 
vll_ret = UOI_Inet.PostURL(p_url, Vlblb_args, vls_headers,  UOI_internet_resultado)
 
if vll_ret = 1 then
 VISMSG = ""
elseif vll_ret = -1 then
 VISMSG = "Erro ao chamar o objeto de acesso a internet."
 Return -1
elseif vll_ret = -2 then
 VISMSG = "A URL informada é inválida."
 Return -1
elseif vll_ret = -4 then
 VISMSG = "Não foi possível conectar a Internet."
 Return -1
elseif vll_ret = -5 then
 VISMSG = "Não foi possível conectar a Internet utilizando protocolo seguro (HTTPS)."
 Return -1
elseif vll_ret = -5 then
 VISMSG = "Ocorreu um erro na requisão a Internet."
 Return -1
else
 VISMSG = "Ocorreu um erro não documentado no acesso a Internet. - Codigo :" + string(vll_ret)
 return -1
end if
 
p_retornoWeb = uoi_internet_resultado.visretornoweb
 
return 1

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)