Blog criado para documentar e disseminar o conhecimento tecnológico adquirido por Thiago Campos Pereira e colaboradores.
sexta-feira, junho 23, 2006
PowerBuilder - Bugs no Build 8716 da versão 9
quinta-feira, junho 22, 2006
PowerBuilder - Conectando ao Oracle 10G utilizando Cliente do Oracle 8i
terça-feira, junho 06, 2006
PowerBuilder - Usando DataWindow para manipular XML
segunda-feira, junho 05, 2006
PowerBuilder - Utilizando HTTP Post
String Vls_headers
Long Vll_ret
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
PowerBuilder - Abrindo um documento
long ret
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
terça-feira, maio 16, 2006
PDA - Sites interessantes
- http://mobile.msn.com/
- http://www.palmland.com.br/Avantgo/
- http://www.google.com.br/
- https://my.avantgo.com/home/
- http://www.itau.com.br/wap.wml
- http://wap.abril.com.br/tc/info/index.php
- http://wap.abril.com.br/tc/index.php
- http://www.apontador.com.br/iapyx
- http://www.odontopalm.com.br/gsf/
- http://www.mundosemfio.com.br/
- http://www.palmland.com.br/
- http://www.palmbrasil.com.br/materias/pm.html
- http://www.palminfocenter.com/
- http://news.com.com/2300-1041_3-6053916-1.html?tag=ne.gall.pg
- http://www.palmzone.net/
- http://www.zdnet.com.au/reviews/coolgear/pdas/0,39023392,39116317-1,00.htm
- http://palmtops.about.com/cs/pdafacts/a/Palm_Pocket_PC.htm
- http://www.mobileinfo.com/Versus_Compare/PalmVsPocketPC.htm
- http://www.gantrygroup.com/Papers/TCO%20WP%20-%20WEB%20Final.pdf
- http://celular.grupolg.net/
- http://www.gsmarena.com/
- http://www.handango.com/
- http://www.pocketgear.com/
- http://www.aximsite.com/
- http://www.pdair.com/
Palm – Problemas com o Treo 650
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
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
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
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
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
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 é?
É 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
Sybase X .Net
http://www.sybase.com/detail?id=1038292
segunda-feira, fevereiro 27, 2006
PowerBuilder - Pesquisa da Novaes
O Resultado de 2005 pode ser consultado no endereço (http://www.visual-expert.com/us/info/survey_pb_2005_results.htm).
quinta-feira, fevereiro 16, 2006
PowerBuilder – GPF ao Fazer GLV / RefreshStatus
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
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 :
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 :
vlsteste = string(dw_1.object.dw_1[1].object.sistema.primary[1])
messagebox('teste2',vlsteste)