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