quinta-feira, dezembro 30, 2004

PowerBuilder - Trabalhando com o Visual Source Safe

Anexando um sistema ao Source Safe – PowerBuilder 8
a) SS – Criar projeto no SS (Source Safe)
b) SS – Criar estrutura de diretórios do projeto no SS
c) SS – Dar permissão de acesso aos integrantes da equipe. Sugere-se:
i. Para toda a equipe
i. $\powerBuilder – R (ler e copiar arquivos)
ii. $\powerBuilder\Dese\ - R, C, A (acesso full)
iii. $\powerbuilder\prod\ - R (ler e copiar arquivos)
ii. Para os coordenadores:
i. $\powerbuilder\ - R (ler e copiar arquivos)
ii. $\powerBuilder\Dese\ - R, C, A, D (acesso full e destruição de objetos)
iii. $\powerbuilder\prod\ - R, C, A, D (acesso full e destruição de objetos)
d) Instalar SS e configurar PB. No library Painter, ir para as propriedades do WorkSpace e na pasta Source Control, configurar o Controle de Versão da seguinte forma:
i. Source Control System : Selecionar Microsoft Visual SourceSafe;
ii. UserId : Informar o seu usuário de rede (Caso não possua acesso ao SourceSafe, solicitar permissões para o Suporte ao Desenvolvimento);
iii. Project : Selecionar o nível inicial do projeto no Source Safe
iv. Local Root Projeto : Aqui deve ser informado o diretório de trabalho local em cada máquina. Recomendamos que seja colocado um padrão entre as equipes (Por exemplo, C:\att\Fontes) e nesse diretório seja gravado o arquivo do WorkSpace. Abaixo desde diretório deve estar todos os fontes que serão colocados no SourceSafe;
v. Require Comments on ChekIn : Essa opção obriga ao desenvolvedor sempre informar um comentário quando for feito o ChekIn, mantendo-se a documentação de alterações atualizada. No padrão da att, foi definida que essa opção é obrigatória e deve estar marcada;
vi. Delete PowerBuilder Generated Object File : Informa ao PowerBuilder se você quer manter uma cópia local dos arquivos que são utilizados pelo SourceSafe (*.SR*). Se você marcar essa opção, pode notar que um perda de performance, pois o PowerBuilder tem que gerar e excluir estes arquivos a cada solicitação ao SourceSafe.
vii. Perform Diff On Status Update : Verifica e exibe quais objetos estão diferentes do Servidor, permitindo você saber se existe algum objeto que você está trabalhando e que foi alterado no Servidor. É aconselhável manter está opção selecionada. Essa opção pode gerar uma perda de performance.
viii. Status Refresh Rate : Tempo utilizado pelo PowerBuilder para verificar se os objetos no SourceSafe estão diferentes dos objetos locais. Quanto menor o tempo, mais acessos são feitos ao SourceSafe, por isso recomendamos deixar o valor default de 5 minutos.
e) Registrar objetos
i. Clique no Target com o botão direito e seleciona a opção Add to Source Control;
ii. Selecione a opção Select Multiple Files contained in this target e clique em OK;
iii. Na janela Add to SourceControl, desmarque os arquivos da Dr.Object e da Dr.Lock e clique em OK;
iv. Em alguns casos, foi observado que alguns objetos não foram inseridos no SourceSafe, se isso acontecer, insira os objetos restantes manualmente, selecionando-os, clicando com o botão direito e selecionando a opção Add to Source Control.
f) Objetos Utilizados em Várias aplicações
i. É aconselhável que se faça crie um novo projeto no SourceSafe para os objetos compartilhados
ii. Faça o registro destes objetos quando você for registrar a primeira aplicação que utiliza estes objetos
g) Instalando os Fontes em uma nova máquina
i. Copie os fontes de uma máquina existente, montando a estrutura igual a existente no SourceSafe
ii. Configure o WorkSpace para utilizar o VSS
iii. Execute um GetLastedVersion em todas as Target, de forma a atualizar os seus fontes locais com a versão do servidor;
Liberando versão/release/hotfix para produção
a) No Source Safe, estando com o projeto selecionado, acionar a opção label. Informar como label a palavra FIM + número da versão/release ou hotfix que está sendo liberado.
b) Através do Get, pegar a versão para compilar.
c) Sempre que uma versão/release ou hotfix for liberada é necessário avaliar as necessidades de propagação de código. O código deve ser propagado para todas as versões de numeração superior a que está sendo liberada.
d) Estando no projeto da versão que está sendo liberada, pedir um view history do projeto.
e) Anotar os objetos que sofreram modificação ou imprimir.
f) Em cada versão subseqüente a que está sendo liberada, marcar cada arquivo a ser mergeado (propagada as alterações) e acionar a opção merge branch files.

Gerando uma nova versão/release
a) Clicar na pasta base (bcco), onde será criada a nova versão.
b) SS / Share. Escolher versão original a ser copiada. Marcar checkbox Branch after share. Indicar nome da versão. Marcar checkbox recursive. Escolher close.
c) No Explorer: (i) criar diretório da nova versão (ii) copiar conteúdo e subdiretórios.
d) No PowerBuilder: (i) abrir aplicação da nova versão (ii) Configurar link (iii) mudar project name através da seleção do diretório; evitar informar o caminho.

quarta-feira, dezembro 29, 2004

PowerBuilder - Atualização de executável sem precisar do usuário sair

Olá a todos,
estava participando de um NewsGroup e apareceu a velha questão de como manter o executável na rede e não ter problema na hora de atualizar o mesmo. Existe uma solução, abaixo estou enviado a descrição:

Primeiro, em vez dos usuários executarem diretamente a aplicação, eles uma "pseudo" aplicação, que tem o mesmo nome do EXE da aplicação principal.
Essa pseudo-aplicação (tb escrita em PB) simplesmente lê o conteúdo de um arquivo texto no diretório corrente, e executa com run() o programa presente no conteúdo desse arquivo.
A aplicação real fica num subasta. O conteúdo desse arquivo texto seria por exemplo:
20030320\app.exe
Se eu precisar atualizar a aplicação, basta duplicar essa pasta com outro nome (ex 20030320_1), atualizar as PBDs necessárias e alterar o arquivo texto para:
20030320_1\app.exe
Os próximos usuários que entrarem no sistema já vão utilizar a nova versão.
Comentários e sugestões são bem vindos.

PowerBuilder - Sempre devo gerar executável ou posso distribuir apenas PBD´s

O PowerBuilder foi desenvolvido para que o desenvolvedor possa distribuir apenas PBD´s, como os aplicativos Microsoft permitem distribuir apenas DLL´s. Mas, o que vemos é que para trabalharmos dessa forma, devemos ter um ambiente de desenvolvimento muito organizado. Em uma conversa na Internet, chegamos a conclusão que apenas 10% das empresas que trabalhavam com PowerBuilder conseguiam distribuir apenas PBD´s com poucos erros.
Levantando informações sobre essas empresas, descobrimos que eles conseguem pelos seguintes fatores:
* Possuíam um grande controle dos fontes, sabendo todos as PBL´s que foram alteradas desde a última versão;
* Existe uma pessoa responsável apenas por gerar executável e envia-los para o cliente;
* Possuíam uma biblioteca que não sofria nenhuma Manutenção;
* Possuíam um ambiente de geração de executável ( Uma máquina que é apenas utilizada para a geração de executável. O desenvolvedor gera o executável na primeira vez e nas outras vezes ele apenas substitui as PBL´s alteradas e gera as PBD´s apenas dessas PBL´s)
* Nas raras vezes que é alterada alguma coisa na biblioteca, são apagados todos os executáveis e PBD´s da máquina, forçando todas as aplicações a gerar um novo executável completo.

O que é melhor gerar, PBD ou DLL?

É melhor gerar PBD, pois a DLL foi criada para manter compatibilidade com os aplicativos Windows e para ser utilizada na criação e distribuição de componentes. O Código PBD no PowerBuilder é muito mais rápido que a DLL.

PowerBuilder - Como eu devo organizar meus arquivos dentro de uma PBL´s?

Fique a vontade para organizar os arquivos dentro das PBL´s pois não existe uma opção ótima. Apenas são destacadas duas opções favoráveis com relação a organizar as PBL´s por funcionalidade. Se você organiza por funcionalidade, pode ganhar na hora de dar manutenção dos fontes ( se pretende substituir apenas PBD´s) e pode ganhar em performance, pois na hora que o sistema é executado, ele vai carregando para a memória as PBD´s de acordo com a funcionalidade que o usuário vai selecionando, evitando carregar todos os arquivos de uma única vez.

PowerBuilder Qual é o tamanho máximo aconselhável das PBL´s?

A partir do PB 7, não existe um tamanho aconselhável, o grande problema é o trafego que pode ser gerado na rede e a configuração das máquinas e com PBD´s menores você pode obter uma melhor performance na hora de carregar o sistema, se as máquinas forem de baixa configuração ou se a rede for muito ruim. Mas, em um ambiente de máquinas e rede ( ou executável local) com boa performance, você não verá diferença nenhuma em PBD´s grandes ou pequenas.

DotNet - Restaurando o ASP.NET no IIS

Em alguma situações, o IIS não reconhece que o ASP.NET encontra-se instalado, isso acontece por que o iis perdeu o "binding".
Para resolver este problema, execute o seguinte comando abaixo::
1- abra uma janela do prompt de comandos

2- Execute o comando:
Se o seu framework for 1.0 execute:
pushd %windir%\microsoft.net\framework\v1.0.3705
Se o seu framework for 1.1 execute:
pushd %windir%\microsoft.net\framework\v1.1.4322

3- A seguir execute:
Se o seu framework for 1.0: aspnet_regiis -ir
Se o seu framework for 1.1: aspnet_regiis -r

4- Dê boot na máquina

Instalando o SQL Server 2005 Beta 2

Fiz a instalação do SQL Server 2005 Beta 2. Na instalação, utilizei o Software Virtual Server com uma VM configurada com 192 MB e Windows XP SP2. Nós pré-requisitos, a quantidade de memória mínima é 256 MB. Apesar de conseguir instalar, realmente, 192 MB não foram suficientes, tendo que aumentar a memória para 256 MB.
Toda a instalação foi feita com sucesso e nós primeiros testes que fiz, não gostei da Interface de gerenciamento do SQL Server, pois ficou mais complexa e, aparentemente, com menos recursos. Essa opinião não é só a minha, mas de outros DBAs que já testaram a ferramenta.
Como próximo passo, irei fazer o curso que a Microsoft liberou para os MCTs de forma a avaliar melhor a ferramenta e coloquei outras informações neste Blog.

Novo tratamento de exceção no PowerBuilder 8

O PowerBuilder 8 possibilita ao desenvolvedor tratar exceções para evitar erros de sistema.
O Tratamento de exceção possui os seguintes comandos
Try - Inicio do bloco da exceção
Throw - Dispara uma exceção
Catch - Tratamento da exceção. As exceções mais comuns são as seguintes:
* throwable - Tratamento mais genérico, englobando todos os erros * Exception - Exceções criadas pelo usuário e herdadas do Throwable
* RuntimeError - erros de Runtime do PowerBuilder e herdado do Throwable * NullObjectError - Referencia nula para objetos e herdado do RuntimeError * DivideByZeroError - Divisão por zero e herdado do RuntimeError * DWRuntimeError - Erros em comandos da DataWindow e herdado do RuntimeError * OLERuntimeError - Erros em comandos de Objetos OLE e herdado do RuntimeError * CORBASystemException - Erros em comando de objetos CORBA (muito utilizado no servidor de Internet da Sybase) e herdado do RuntimeError
Finally - Evento sempre executado quando ocorre a saída do bloco de exceção
End Try - Finaliza o Bloco de Exceção

Abaixo existe um exemplo de como utilizar o tratamento de erro. Qualquer dúvida, me encontro a disposição.

string ls_Description,ls_server,ls_DBMS,ls_AutoCommit, ls_db,ls_DBParm, ls_LogPass, ls_LogIdstring ls_erro,ls_par[5]string parm[5]long ll_pos_ant, ll_pos, i
exception lex_errolex_erro = create exception
Try

is_conexao = as_conecta
ll_pos = pos(as_conecta,';') i=0 ll_pos_ant = 1 do while ll_pos > 0 i++ parm[i] = mid(as_conecta,1,ll_pos - 1) ls_par[i] = mid(parm[i],pos(parm[i], '=') + 1,len(parm[i]) - pos(parm[i], '=')) ll_pos_ant = ll_pos as_conecta = mid(as_conecta,ll_pos + 1) ll_pos = pos(as_conecta,';') loop

parm[5] = as_conecta ls_par[5] = mid(parm[5],pos(parm[5], '=') + 1,len(parm[5]) - pos(parm[5], '='))

ls_Description = 'attdsn' + is_sistema ls_DBMS = 'OLE DB' ls_AutoCommit = 'False' ls_server = ls_par[2] uf_debug("Ancestral - uf_inicializa_conexao - 30","ls_server "+ls_server)

is_servidor = ls_server ls_db = ls_par[3]
ls_erro = uf_registry(ls_Description,ls_server,ls_LogId,ls_db) if ls_erro <> '' then throw lex_erro end if
ls_erro = uf_conectabd(ls_Description, ls_db, ls_LogId, "ConnectString='DSN=attdsn'")
if ls_erro <> '' then throw lex_erro end if

catch (runtimeerror lrt_trata_erro_runtime) uf_setabort() return uf_trataerro( 99000, ls_erro)catch (exception lex_tratar_erro) uf_setabort() return uf_trataerro( 99000, ls_erro)catch (throwable lth_trata_erro_generico) uf_setabort() ls_erro = lth_trata_erro_generico.getmessage() return uf_trataerro( 99000, ls_erro)finally destroy lex_erroend try

return ''

Alterações no Sybase 12. ASE 12, para Evitar DeadLock

A configuração de Lock é por tabela. Com sp_configure, você pode aliterar o tipo de Lock default para todas as tabelas, ou seja, as novas tabelas serão criadas com o novo lock configurado, mais as existentes não são alteradas. Sintax: sp_configure "lock scheme", 0,{allpages datapages datarows} Exemplo: sp_configure "lock scheme", 0,datarows Para alterar o tipo do lock das tabelas existentes, você tem que utilizar o comando alter table, como no exemplo abaixo: alter table titles lock datarows Antes de fazer está alteração, devem ser tomados os seguintes cuidados.
Before you change from allpages locking to data-only locking or vice versa, the following steps are recommended:
Specifying the locking scheme for a table
If the table is partitioned, and update statistics has not been run since major data modifications to the table, run update statistics on the table that you plan to alter. alter table...lock performs better with accurate statistics for partitioned tables.
Changing the locking scheme does not affect the distribution of data on partitions; rows in partition 1 are copied to partition 1 in the copy of the table.
Perform a database dump.
Set any space management properties that should be applied to the copy of the table or its rebuilt indexes.
Determine if there is enough space.
If any of the tables in the database are partitioned and require a parallel sort:
Use sp_dboption to set the database option select into/bulkcopy/pllsortto true and run checkpoint in the database.
Set your configuration for optimum parallel sort performance.
After alter table completes
Run dbcc checktable on the table and dbcc checkalloc on the database to insure database consistency.
Perform a database dump.Note After you have changed the locking scheme from allpages locking to data-only locking or vice versa, you cannot use the dump transaction to back up the transaction log. You must first perform a full database dump.
Quando uma certa quantidade de registros são bloqueados, o SGBD promove o lock para um lock de tabela. Este parâmetro pode ser configurado através do comando sp_setrowlockpromote e pode ser configurado para o Servidor e/ou Banco de Dados e/ou tabela. Abaixo está um exemplo desse comando: sp_setrowlockpromote "server", null, 300, 500, 50 Mais informações podem ser obtidas no documento em anexo, nas páginas: 36 : Sugestão para evitar Locks 48 : Promoção de Lock´s 63 : Informações importantes antes e depois de mudar o tipo do lock 86 : Evitando DeadLocks


Para resolvermos o problema da FRG, teríamos que altera o tipo de lock defaul das tabelas, para que as novas tabelas já sejam criadas corretamente e alterar as tabelas existentes. Este processo deve ser executado com cuidado e deve consumir algum tempo, por isso é recomendado seguir as observações acima e executa-lo fora do horário de trabalho.

Appeon

O que é o Appeon?
É uma ferramenta da Sybase que migra as aplicações PowerBuilder para WEB.
Vantagens?
Não é necessário Treinamento: A interface é a mesma das aplicações PowerBuilder existentes;
Fácil Conversão: Existem poucas limitações na conversão e estima-se que você consiga conversar 95% da sua aplicação em uma semana;
Baixo custo de Distribuição: Não é necessário instalar em várias máquinas, pois a aplicação fica no servidor;
Thin Client ( Sem Apllet, nem RunTime): O cliente necessita apenas no Browser para utilizar ao sistema;
Custo mais baixo que utilizar Terminal Server: Caso você tenha que disponibilizar os sistemas para locais remotos e esteja pensando em utilizar o Terminal Server e possuir 50 usuários, os custos para se montar um servidor Terminal Server serão bem mais caros que os do Appeon;
Performance?
Boa performance para Intranet e performance regular para Internet;
Na primeira vez que entra no site e pesado, na segunda é bem mais leve, pois as classes JavaScripr já estão no Cache da máquina;
Requerimentos
A aplicação deve estar no mínimo em PowerBuilder 8;
Você pode utilizar qualquer servidor WEB, como o próprio IIS, Mas você tem que possuir o EAServer;
É necessário ter o Appeon Server em cada cliente, que já vem com EAServer incluído;
Ambiente de Desenvolvimento: Appeosn Developer, PowerBuilder e Servidor WEB;
Migração para WEb: Appeon Server, EAServer;
Exemplos
Sites de Demonstração : www.orps.state.ny.us/rps/sumdoc.htm
Site da Sybase: www.sybase.com
Características?
Serão gerados arquivos HTML, XML e JavaScript
Utilizar Java Script : Todo Código é convertido para JavaScript no cliente
Impressão baseada em PDF
Toda DW é convertida para XML
Os objetos NVO podem continuar em PowerScript (Vão rodar no Servidor Appeon Server) ou serem convertidos para JavaScript (Vão rodar no Cliente)
O código JavaScript na Página é Criptografado
Trabalha com qualquer biblioteca de classe
Restrições
Não aceita Objeto Ole e Richtext: Estes objetos utilizar APIs do Windows e não tem como garantirmos que o site não será acessado por clientes não Windows (LInux e etc...);
Limite de 50 MB de PBL´s para a conversão: O tamanho total das PBL´s deve ser de 50 MB;
Preço
O valor mais baixo do Appeon Server é $ 22.000,00 (Vinte e dois mil dólares): Este valor é promocional e inclui uma licença para um servidor Appeon.

PowerBuilder e Oracle

1. Objetivo
O Objetivo deste documento é servir como guia de referência para os desenvolvedores que irão desenvolver / adequar as aplicações para trabalhar com o SGBD Oracle.
Neste documento estão informações importantes que devem ser levadas em consideração tanto no ambiente de desenvolvimento, quanto no ambiente de produção.
As informações neste documento podem ser alteradas à medida que são descobertos novos detalhes sobre a utilização do PowerBuilder com Oracle. Caso você possua alguma informação ou correção que deseja inserir neste documento, favor enviar um e-mail para tpereira@attps.com.br para que possamos manter este documento atualizado e confiável.
A versão mais atualizada deste documento pode ser encontrada no PublicFolder, na pasta \All Public Folders - Nova Estrutura\01. Corporacao\1.3 Áreas Meio\1.3.1 Engenharia de Produtos e Processos\PowerBuilder.
2. Instalando o Cliente Oracle
Devemos instalar o cliente Oracle compatível com a versão do servidor Oracle, ou seja, se o servidor for Oracle 7.0.3, devemos instalar o cliente para o Oracle 7.0.3, se o servidor Oracle for 8.1.7, devemos instalar o servidor Oracle 8.1.7, e assim por diante.
Em caso onde possuímos na rede dois ou mais servidores Oracle em versões diferentes, devemos optar em instalar o cliente Oracle referente à versão mais recente do mesmo, ou seja, se na nossa rede tivermos um servidor Oracle 7.0.3 e outro 8.1.7, devemos instalar o cliente Oracle 8.1.7, pois o mesmo é compatível com as versões anteriores do Oracle.
Caso você não utilize a versão compatível do cliente Oracle, você irá conseguir conectar normalmente ao Banco de Dados, mas poderá ter problemas com a utilização de alguns recursos do Oracle e até mesmo problemas de performance. A Oracle possui uma política agressiva de versões e a cada release que é liberado são constadas alterações críticas na forma de trabalho, podendo surgir novos problemas e obrigando a modificação da forma de trabalho.
Não é recomendado que sejam instalados duas versões do cliente Oracle em uma mesma máquina, sugerimos a desinstalação completa de uma versão do cliente antes de se instalar a nova versão do cliente. Algumas versões, possuir BUG´s nos softwares de desinstalação do Oracle, sendo necessário realizar a desinstalação manualmente. Mas, só faça a instalação manual se a instalação automática não funcionar.
Para realizar a desinstalação manual do cliente Oracle, siga os seguintes passos:
· Apague a pasta de instalação do Oracle (geralmente \Oracle);
· Apague os atalhos no menu iniciar\programas;
· Apague a chave do registry: HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE;
· Apague a chave do registry: HKEY_CURRENT_USER\Software\Oracle;
· Reinicie a máquina;

Após a desinstalação da versão anterior do Oracle, instale a nova versão deixando todas as opções padrões e selecione a opção de programador ou desenvolvedor, dependendo da versão do cliente.

3. Configurando o Cliente Oracle
Existem algumas configurações que devem ser feitas no cliente para que o Oracle identifique o servidor na rede.
Para realizar essas configurações, siga os seguintes passos (Esses passos podem variar de acordo com a versão do cliente Oracle instalado):
· No menu Iniciar / Programas / Oracle xxxx , entre no aplicativo Net Configuration Assistant (Dependendo da versão do Oracle instalado, esse aplicativo pode estar com o nome um pouco diferente e/ou em uma sub-pasta dentro da pasta de atalho Oracle);
· Configuração nos Métodos de Nomeação:
i. Selecione Configuração dos Métodos de Nomeação e clique em próximo;
ii. Selecione Local, Oracle Names e Nome do Host e clique próximo;
iii. Clique próximo e clique próximo novamente;
· Voltando a tela inicial novamente;
· Configuração do nome de serviço de rede:
i. Selecione configuração do nome de serviço de rede e clique em próximo;;
ii. Selecione adicionar e clique em próximo;
iii. Se o seu servidor for Oracle 8i ou superior, selecione a opção Oracle 8i ou um serviço de banco de dados mais recente, ao contrário, selecione Banco de Dados ou serviço de Oracle 8 release 8.0 (Em alguns servidores que passaram por um processo de migração ou tiveram a instalação personalizada, essas opções podem não funcionar corretamente, por isso, sugiro tentar configuração uma opção, se não funcionar, tente a outra opção);
iv. Informe as outras telas com as informações fornecidas pelo DBA e no final clique na opção de teste para realizar um teste de conexão ao banco de dados. Se o teste não funcionar, existe alguma configuração errada, tente refazer o processo e se não conseguir, procure um suporte técnico;
v. Finalize a configuração e se deseja adicionar mais algum servidor, repita os passos II a IV;

Existe uma outra forma de se realizar essas configurações que é copiando os arquivos de configurações a partir de uma máquina que está funcionando. Para fazer isso, procure os arquivo *.ora, que geralmente encontram-se no diretório \\network\ADMIN , e copie os arquivos para o direrório do Oracle na sua máquina (\\network\ADMIN ).
4. Testando o Cliente Oracle
Para testar o Oracle, abra o SQLPlus e efetue uma conexão ao Oracle. Caso a conexão seja realizada com sucesso, o Oracle está configurado corretamente.
Se você não conseguir conectar ao servidor Oracle, verifique se o usuário e senha estão corretos (Você pode fazer este teste a partir de uma máquina que está funcionando ou pedir o DBA para testá-los para você).
Caso o usuário esteja correto e você continua sem conseguir conectar ao Oracle, existe alguma configuração errada na sua máquina. Execute o Net Configuration Assistant e verifique as configurações do seu servidor, não se esquecendo de testar no final.
5. Conectando o PowerBuilder no Oracle
Para realizar a conexão do PowerBuilder ao Oracle é necessário que se verifique primeiramente se a versão do servidor Oracle é suportada pela versão do PowerBuilder, por exemplo, o PowerBuilder 6.5 não suporta conectar ao Oracle 9.x, sendo necessária a migração para PowerBuilder 8 ou superior. Neste caso, você pode até mesmo conseguir conectar ao Oracle 9.x utilizando o cliente do Oracle 8, mas não é um procedimento recomendado pela Sybase e você deverá assumir a responsabilidade dos erros que podem acontecer.
Depois de localizada a API para se conectar ao Oracle, clique com o botão direito sobre a mesma e selecione New Profile. Na tela que abrirá, configure as seguintes opções (Essas opções podem variar dependendo da versão do Oracle e estão baseados na configuração do Oracle 8) :
· Profile Name (Obrigatório) :
i. Descrição : Nome utilizado para você identificar o Servidor/Banco de Dados no ambiente de desenvolvimento;
ii. Valor a ser informado : Informe um nome que permita identificar o servidor Oracle
· Server (Obrigatório) :
i. Descrição : Nome do servidor Oracle
ii. Valor a ser Informado : O nome que você configurou no passo 3. Se você tiver utilizando Oracle 7, deve colocar um @ antes do nome, por exemplo, @server1 – Identificador do Servidor Oracle para a máquina;
iii. Configuração no objeto transaction : ServerName
· Login Id (Obrigatório) :
i. Descrição : Usuário no servidor Oracle;
ii. Valor a ser informado : O usuário que lhe foi passado para conectar ao servidor Oracle. Caso não possua, favor consultar o seu DBA.
iii. Configuração no objeto transaction : LogID
· Password (Obrigatório) :
i. Descrição : Senha do Usuário no servidor Oracle;
ii. Valor a ser informado : A senha que lhe foi passada para conectar ao servidor Oracle. Caso não possua, favor consultar o seu DBA.;
iii. Configuração no objeto transaction : LogPass
· CommitOnDisconnect (Obrigatório) :
i. Descrição : Essa opção informa se o Oracle deve realizar Commit (True) ou Rollback (False) quando ocorrer desconexão e existir transação em aberta, o que pode ser perigoso, pois se estiver TRUE e ocorrer uma falha de luz no meio da transação, ele fará Commit e a integridade do banco de dados ficará errada;
ii. Valor a ser informado : False (desmarcado)
iii. Configuração no objeto transaction : DBParm = "CommitOnDisconnect='No'/’Yes’”
· PowerBuilder Catalog Table Owner (Obrigatório) :
i. Descrição : Usuário que será utilizado para criar as tabelas de sistema do PowerBuilder;
ii. Valor a ser informado : O usuário que lhe foi passado para conectar ao servidor Oracle;
iii. Configuração no objeto transaction : DBParm = “PBCatalogOwner='????'”
· Disable Bind (Obrigatório) :
i. Descrição : informa ao powerbuilder se ele deve enviar os parâmetros implícitos ou camuflados. Quando os valores vão camuflados através de variáveis, o Oracle armazena o comando em memória, monta o plano de acesso e apenas substitui as variáveis. Nas próximas vezes que enviar o comando, o Oracle identifica o comando em memória e apenas substitui as variáveis, ganhando-se performance;
ii. Valor a ser informado : Em produção, deve-se deixar este parâmetro como 0 (performance) e em desenvolvimento deve-se deixar este parâmetro como 1 (identificação dos valores das variáveis);
iii. Configuração no objeto transaction : DBParm = “DisableBind=0/1”
· Static Bind (Obrigatório) :
i. Descrição : Em datawindow/datastore, verificar se os tipos e tamanhos dos campos no banco de dados são os mesmos gravados nos objetos;
ii. Valor a ser informado : 1 pois o comando já é validado ao salvar a DataWindow e não ficar validando produz uma melhor performance;
iii. Configuração no objeto transaction : DBParm = “StaticBind=1/0”
· Enclose Table e Columns name in Quotes (Obrigatório) :
i. Descrição: informa se é necessário ou não incluir os nomes das tabelas e colunas entre aspas;
ii. Valor a ser informado : False (desmarcado)
iii. Configuração no objeto transaction : DBParm = “DelimitIdentifier='No'/’Yes’”
· DecimalSeparator (Opcional) :
i. Descrição : informa como serão transmitidos os valores numéricos do banco de Dados. Dependendo da instalação do servidor, pode utilizar “.” ou “,”;
ii. Configuração no objeto transaction : DBParm = “DecimalSeparator=','/’.’”
· Retrieve Numbers In Internal Format (Opcional)
i. Descrição : dependendo da instalação do Oracle, o PowerBuilder pode não reconhecer os números com casas decimais, sendo necessário configurar essa opção
ii. Configuração no objeto transaction : DBParm = “NumbersInternal=1/0”
6. Cuidados nos comando SQL´s
Os comandos DML´s (Select, Insert, Update e Delete) possuem algumas particularidades com relação ao Oracle. Quase sempre, a solução para estas particularidades e sempre trabalhar com os comandos SQL´s utilizando DataWindow/DataStore e em modo gráfico, pois assim o PowerBuilder gera a sintaxe para o comando de acordo com o SGBD selecionado e tomando cuidado com as particularidades dos mesmos.
Mas, existem comandos que são específicos dos SGBD´s, como Getdate(), Sysdate, Convert(), DateAdd e etc... . Estes comandos devem ser evitados ao máximo e caso não possam ser evitados, será necessário criar um comando para cada SGBD, o que pode ser perigoso, pois o desenvolvedor pode dar manutenção em apenas um comando, esquecendo do outro e causando futuros problemas.
Abaixo está uma lista de algumas particularidades nos comandos DML´s no Oracle e como resolve-lós:
· Outer Join
i. Descrição : O formato do Outer Join do Oracle ( += / =+ ) é diferente da maioria dos SGBDs encontrados nó mercado ( *= / =* / Left Outer Join / Right Outer Join );
ii. Solução : colocar o comando dentro de uma DataWindow e deixa-lá em modo gráfico;
· Formato de Data:
i. Descrição : O Oracle trabalha com o Formado ‘yyyy-mon-dd’ no formato de data (2003-oct-15 ) utilizado em querys, sendo que pode diferenciar se o oracle foi instalado em idioma (2003-oct-15 é diferente de 2003-out-15)
ii. Solução :
1. Em SQL Embedded, podemos utilizar variáveis ao invés de montar a data como string ou utilizar a função To_date(‘data’,’Formato’);
2. Em DataWindow, pode-se utilizar argumentos ou utilizar a função To_date(‘data’,’Formato’);
· Join´s em comando UPDATE e DELETE
i. Descrição : O Oracle não permite utilizar Join´s em comandos UPDATE e DELETE;
ii. Solução : Reescrever o comando alterando os Join´s por Subqueries;
· Funções especificas do Banco de Dados
i. Descrição : Existem comandos específicos do SGBD
ii. Solução : Duplicar o código ou tentar desenvolver uma função com o mesmo nome e que monte o resultado experado.
7. Conectando a Aplicação no Oracle
Para realizar a conexão do PowerBuilder ao Oracle é necessário que se verifique primeiramente se a versão do servidor Oracle é suportada pela versão do PowerBuilder, por exemplo, o PowerBuilder 6.5 não suporta conectar ao Oracle 9.x, sendo necessária a migração para PowerBuilder 8 ou superior. Neste caso, você pode até mesmo conseguir conectar ao Oracle 9.x utilizando o cliente do Oracle 8, mas não é um procedimento recomendado pela Sybase e você deverá assumir a responsabilidade dos erros que podem acontecer.
Para conectar uma aplicação ao Oracle, as seguintes configurações devem ser feitas:
· DBMS (Obrigatório) :
i. Descrição : Qual SGBD será conectado
ii. Valor a ser Informado : Deve ser informado qual a versão do servidor Oracle que iremos conectar;
iii. Configuração no objeto transaction :
1. Oracle 7: O73 ORACLE 7.3
2. Oracle 8: O84 Oracle8/8i (8.x.4+)
3. Oracle 9 : O90 Oracle9i (9.0.1)
· Server (Obrigatório) :
i. Descrição : Nome do servidor Oracle
ii. Valor a ser Informado : O nome que você configurou no passo 3. Se você tiver utilizando Oracle 7, deve colocar um @ antes do nome, por exemplo, @server1 – Identificador do Servidor Oracle para a máquina;
iii. Configuração no objeto transaction : ServerName
· Login Id (Obrigatório) :
i. Descrição : Usuário no servidor Oracle;
ii. Valor a ser informado : O usuário que lhe foi passado para conectar ao servidor Oracle. Caso não possua, favor consultar o seu DBA.
iii. Configuração no objeto transaction : LogID
· Password (Obrigatório) :
i. Descrição : Senha do Usuário no servidor Oracle;
ii. Valor a ser informado : A senha que lhe foi passada para conectar ao servidor Oracle. Caso não possua, favor consultar o seu DBA.;
iii. Configuração no objeto transaction : LogPass
· CommitOnDisconnect (Obrigatório) :
i. Descrição : Essa opção informa se o Oracle deve realizar Commit (True) ou Rollback (False) quando ocorrer desconexão e existir transação em aberta, o que pode ser perigoso, pois se estiver TRUE e ocorrer uma falha de luz no meio da transação, ele fará Commit e a integridade do banco de dados ficará errada;
ii. Valor a ser informado : False (desmarcado)
iii. Configuração no objeto transaction : DBParm = "CommitOnDisconnect='No'/’Yes’”
· Disable Bind (Obrigatório) :
i. Descrição : informa ao powerbuilder se ele deve enviar os parâmetros implícitos ou camuflados. Quando os valores vão camuflados através de variáveis, o Oracle armazena o comando em memória, monta o plano de acesso e apenas substitui as variáveis. Nas próximas vezes que enviar o comando, o Oracle identifica o comando em memória e apenas substitui as variáveis, ganhando-se performance;
ii. Valor a ser informado : Em produção, deve-se deixar este parâmetro como 0 (performance) e em desenvolvimento deve-se deixar este parâmetro como 1 (identificação dos valores das variáveis);
iii. Configuração no objeto transaction : DBParm = “DisableBind=0/1”
· Static Bind (Obrigatório) :
i. Descrição : Em datawindow/datastore, verificar se os tipos e tamanhos dos campos no banco de dados são os mesmos gravados nos objetos;
ii. Valor a ser informado : 1 pois o comando já é validado ao salvar a DataWindow e não ficar validando produz uma melhor performance;
iii. Configuração no objeto transaction : DBParm = “StaticBind=1/0”
· Enclose Table e Columns name in Quotes (Obrigatório) :
i. Descrição: informa se é necessário ou não incluir os nomes das tabelas e colunas entre aspas;
ii. Valor a ser informado : False (desmarcado)
iii. Configuração no objeto transaction : DBParm = “DelimitIdentifier='No'/’Yes’”
· DecimalSeparator (Opcional) :
i. Descrição : informa como serão transmitidos os valores numéricos do banco de Dados. Dependendo da instalação do servidor, pode utilizar “.” ou “,”;
ii. Configuração no objeto transaction : DBParm = “DecimalSeparator=','/’.’”
· Retrieve Numbers In Internal Format (Opcional)
i. Descrição : dependendo da instalação do Oracle, o PowerBuilder pode não reconhecer os números com casas decimais, sendo necessário configurar essa opção
ii. Configuração no objeto transaction : DBParm = “NumbersInternal=1/0”
8. Distribuindo Aplicações que conectam ao Oracle
Para implantarmos um sistema PowerBuilder no cliente, devemos seguir os seguintes passos:
· Instalar o cliente Oracle : O cliente Oracle deve ser estalado conforme tópico 2 deste documento;
· Configurar o cliente Oracle : O cliente Oracle deve ser configurado conforme tópico 3 deste documento;
· Testar o cliente Oracle : O cliente Oracle deve ser testado conforme tópico 4 deste documento;
· Instalação do RunTime do PowerBuilder : O RunTime do PowerBuilder é um conjunto de dll´s que devem estar disponíveis para as aplicações PowerBuilder. Ele pode ser instalado localmente ou na Rede, sendo que a performance da instalação na máquina local é muito melhor do que na rede. É recomendo a utilização das últimas dll´s aprovadas pelo suporte técnico da att (informações sobre essas dll´s encontram-se no Public Folders da attps, no caminho \\All Public Folders - Nova Estrutura\01. Corporacao\1.3 Áreas Meio\1.3.1 Engenharia de Produtos e Processos\PowerBuilder\PowerBuilder e Banco de Dados.doc). O RunTime do PowerBuilder consiste das Seguintes dll´s:
i. PBVM80.DLL;
ii. PBDWE80.DLL;
iii. PBRTC80.DLL;
iv. PBTRA80.DLL;
v. LIBJCC.DLL;
vi. DLL para conexão ao Oracle : Essa dll depende da versão do cliente Oracle instalado e pode ser : PBO8480.DLL (Oracle 8) ou PBO7380.DLL (Oracle 7) ou PBO9080.DLL (Oracle 9);
· Instalação da Aplicação : A instalação da aplicação pode ser feita localmente ou na rede, sendo que a performance da instalação na máquina local é muito melhor do que na rede;
· Testar a aplicação;
9. Problemas e soluções
Abaixo estão listados alguns problemas e as soluções adotadas para erros relacionados com conexões a servidores Oracle:
· Erro ao desinstalar o cliente Oracle : Em algumas versões, o disinstalador do Oracle não funciona, sendo necessário realizá-la manualmente. Para isso, siga os passos listados no Tópico 2
· Não é possível conectar ao servidor Oracle : Após a instalação do cliente, não foi possível conectar ao servidor Oracle. Para resolver este problema, siga os seguintes passos:
i. PING o servidor Oracle para verificar se o servidor encontra-se na rede;
ii. Verifique se as informações para conexão com o servidor (ServiceName, Usuário e Password) estão corretas;
iii. Tente conectar utilizando a opção de Oracle 8, se não funcionar, tente com a opção de Orace 7 (Ver tópico 3);
iv. Verifique se existe outra máquina que conecta no servidor Oracle e tente configurá-la igualmente (Para realizar este procedimento, copie os arquivos *.ORA que se encontram no diretório \network\ADMIN )
v. Verifique se existe outro cliente Oracle instalado na máquina, caso existam, desinstale todos os clientes e instale o cliente referente a versão do Oracle mais recente da sua rede
vi. Se mesmo assim não funcionar, contate o suporte técnico da attps pelo e-mail tpereira@attps.com.br ;
· Erro no comando Insert: O Oracle exige a palavra INTO no comando insert (INSERT INTO ...), enquanto outros SGBD´s, como SQL Server e Sybase, aceitam o into, mas não obrigam a utilização.
· Erro nos comando UPDATE e DELETE: O oracle não aceita a utilização da clausura FROM no update e delete, sendo necessário alterar os comando para utilizar Subqueries ao invés de Join´s. Mas, este procedimento deve ser feito com cuidado, pois pode interferir na performance de outros SGBD´s, como SQL Server e Sybase
· Os relatórios exibem os valores decimais (101.15), como sendo valores inteiros (10115): Dependendo da instalação do servidor, este problema pode ocorrer e para resolvê-lo, devemos passar uma configuração na conexão com o Oracle. Para isso, altere os parâmetros de conexão ( DBParm) e informe para o banco NumbersInternal=1;
· Qual o formato de data que devo passar para o Oracle: Devemos utilizar o formado DD-MON-YYYY, mas podemos ter problemas com este formado por exemplo, para passarmos a data 21/10/2003 para um Oracle instalado em português, devemos passar 21-OUT-2003, já o para o Oracle em inglês, devemos passar 21-OCT-2003, e não tem como sabermos se o Oracle está em Português ou Inglês. Por isso, recomendamos sempre passar datas utilizando variáveis datetime do PowerBuilder, assim o próprio PowerBuilder cuida do formado da data. Mas, se mesmo assim você precisar montar a data, recomendamos utilizar a Função To_date (Essa função só existe no Oracle) e montar a data da seguinte forma : To_date(“21/10/2003”,”DD/MM/YYYY”);
· Problemas com campos decimais: Dependendo da versão do Oracle e idioma configurado no servidor, podemos ter problemas com a configuração do mesmo. Para resolver este problema, verifique qual o idioma utilizado no servidor e configure o cliente com o mesmo idioma. Para realizar está configuração, siga os seguintes passos:
i. Verifique o idioma configurado no servidor ou verifique o idioma em uma máquina que possui o Oracle funcionando. Para realizar essa configuração vá a seguinte chave do registry e verifique a configuração NLS_Lang em HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0;
ii. Na máquina com problema, altera a configuração NLS_Lang, localizada em HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0, para a linguagem compatível com o servidor (Em geral, essa configuração pod ser BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252 ou AMERICAN_AMERICA.WE8ISO8859P1)
· Problema no pacote do Oracle (ORA-12637: Packet receive failed ) : Modifique a propriedade de autenticação. Edite o arquivo sqlnet.ora e altera o seguinte código: SQLNET.AUTHENTICATION_SERVICES= (none)
· Não faz o Rollback : Em algumas situações, onde a aplicação é parada no meio de uma transação (falha de Luz, Debug e etc...) a aplicação executa o commit dos dados, quando deveria executar o Rollback. Existe uma configuração no DBParm do Oracle (CommitOnDisconnect) que controla essa opção e o default é realizar o Commit. Por isso, é muito importante sempre passarmos a configuração CommitOnDisconnect=’No’ no SGBD Oracle.

10. Sobre este documento
Este documento foi desenvolvido com o objetivo de agrupar informações sobre a integração com o PowerBuilder e o SGBD Oracle. As informações aqui contidas, foram retiradas de documentos técnicos e experiência de diversos profissionais.

PowerBuilder - Oracle 9

Após vários testes realizados na att e no Banco BNP (Primeiro cliente da att em Oracle 9). Chegamos as seguintes conclusões sobre o PowerBuilder e Oracle 9:
Para conectar uma aplicação no Oracle 9, deve ser utilizado o Cliente do Oracle 9 e a API do Oracle 9 ( DBMS=O90 ORACLE9I (9.0.1) ). Fizemos testes com a API do Oracle 8 ( DBMS=O84 Oracle8/8i (8.x.4+) ) e verificamos uma perda de performance por volta de 30% na média.
Entrei em contato com a equipe da Sybase (USA) e me explicaram o problema da geração do comando to_timestamp ( Ver e-mail em anexo). Resumindo, eles estão utilizando o to_timestamp de acordo com uma nova definição da Oracle de tratamento de campos data. No final deste e-mail, encontra-se o artigo da Sybase explicando melhor esta definição. Para resolver este problema, é necessário passar um parâmetro no DBParm (Timestamp='No').
Abaixo, estou enviando um modelo de como deve ser configurado os parâmetros de conexão para Oracle 9
// Profile attbh253_oracle9SQLCA.DBMS = "O90 ORACLE9I (9.0.1)"SQLCA.LogPass = "MeuPassord"SQLCA.ServerName = "attbh253"SQLCA.LogId = "MeuUsuario"SQLCA.AutoCommit = FalseSQLCA.DBParm = "CommitOnDisconnect='No',DelimitIdentifier='No',PBCatalogOwner='MeuUsuario'.TimeStamp='No'"
OBS.:
1) Os parâmetros CommitOnDisconnect,DelimitIdentifier, TimeStamp são obrigatórios e devem ser colocados em todos os cliente Oracle 9;
2) O parâmetro DisableBind pode ser utilizado em desenvolvimento ou produção, para realizar o Trace do PowerBuilder. Mas, nunca deve ser deixado em produção, pois causa uma grande perda de performance e segurança
3) Pode existir outras parametros de DbParm utilizados em alguns clientes, dependendo da configuração do servidor do mesmo.

Dica de Performance : Concatenação de String

Caso você esteja trabalhando com concatenação de string, é comum encontrarmos o seguinte código:

A = “String incial”
A = A + “Segundo String”
A = A + “Terceiro String”
A = A + “Quarto String

Quando se trabalha com esta forma de se concatenar string, perde-se muito em performance, pois cada vez que é feita a concatenação é criada uma nova área de memória, copiado o valor para está área de memória e destruindo a área de memória antiga. Em um processo onde se passa por este código muitas vezes, há um ganho significativo de performance.
Para otimizar o código, recomenda-se alterar o código para que fique da seguinte forma:

A = “String incial” + “Segundo String” + “Terceiro String” + “Quarto String .....


Está dica vale para qualquer ferramenta de Desenvolvimento (.NET, PowerBuilder, Delphi, C/C++ e etc...)

Em um teste feito na att, conseguimos melhorar o processamento de uma rotina que demorava 3 minutos para 10 segundos, apenas realizando a alteração acima.

PowerBuilder - Conectando com Oracle 9

1 – Objetivo
Este documento tem como objetivo orientar as equipes nós procedimentos necessários para os sistemas utilizarem o SGBD Oracle 9.x.
2 – Configurações do Cliente Oracle
Para se conectar com o Oracle 9 recomenda-se a utilização do cliente do Oracle da mesma versão do servidor (Cliente do Oracle 9, com o mesmo release do servidor).
A conexão utilizando Clientes do Oracle 8 não é recomendada, apesar de funcionar, pois testes indicaram uma perda de performance de 30% nós acessos a banco de dados, além da impossibilidade de se utilizar os recursos.
Ao instalar o cliente Oracle 9, deve-se tomar cuidado com versões anteriores deste SGBD. O recomendado é que sejam desinstaladas todas as versões anteriores de Cliente Oracle nas máquinas (Em algumas versões, a opção de desinstalação do Oracle não funciona, sendo necessário remover os arquivos e chaves do Registry manualmente). Após a desinstalação completa, deve-se instalar o novo cliente Oracle, evitando conflitos entre versões. Lembramos que as versões mais recentes são compatíveis com versões anteriores, permitindo o Cliente do Oracle 9 conectar em um Servidor com Oracle 8 ou Oracle 7.
Outro ponto interessante de se observar e a chave do registry que define com o idioma (Language) que será utilizado pelo Cliente. Está chave e definida automaticamente pelo cliente Oracle no momento da instalação do mesmo, onde o instalador observa a configuração da máquina (Regional Settings, Versão do Sistema Operacional e etc...) e configura o Cliente. Está “auto-configuração” nem sempre funciona, podendo causar conflitos entre o servidor e o cliente (Tratamento de pontos decimais, Formato de Data e etc...).
Para ter certeza que o idioma do cliente está correto, deve-se verificar a chave do Registry NLS_LANG (Geralmente localizada em HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0) e verificar se a mesma está compatível com a configuração no servidor. No Brasil, os valores mais encontrados nesta chave são BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252 (Formato Padrão para o Brasil) ou AMERICAN_AMERICA.WE8ISO8859P1 (Formato Padrão para o EUA).

3 – Configurações no PowerBuilder
Para se conectar o PowerBuilder no Oracle 9, devemos levar em consideração os seguintes pontos:
API : Devemos utilizar a API do Oracle 9 para a conexão (DBMS=O90 ORACLE9I (9.0.1)) e para utilizarmos está API, é necessário que o Cliente do Oracle 9 esteja instalado na máquina. A conexão utilizando a API de Oracle 8 funciona (utilizando o Cliente 8 ou 9), mas causa a perda de performance relativa a 30%.
DBPARM : Ao se conectar utilizando o Cliente do Oracle 9, é obrigatória a configuração dos seguintes parâmetros em desenvolvimento, Homologação e produção, e deve ser configurado nos arquivos INI e na Dr.Lock:
Timestamp (TimeStamp='No') : Este parâmetro é novo e configura o PowerBuilder para tratar os campos DateTime como valores DateTime, e não com valores TimesTamp (Está é a nova definição da Oracle para campos DateTime e, por isso, a forma de trabalho Default da API do Oracle 9);
CommitOnDisconnect (CommitOnDisconnect='No') : Por default, quando ocorre uma desconexão com o Banco de Dados, é executado o Commit nos dados, o que é errado e pode causar erros nos dados. Está configuração força o Banco de Dados realizar um RollBack no momento que ocorre uma desconexão com o mesmo (Falha de luz, Parada no Debug, CTRL + ALT + DEL, etc...)
DelimitIdentifier (DelimitIdentifier='No') : Este parâmetro deve ser configurado para evitar a utilização de “ (Aspas Duplas) no nome das tabelas nas queries. Em sistemas que utilizam vários SGBDs, como o caso dos sistemas da attps, é necessário selecionar esta opção para se evitar conflitos com outros SGBDs.
PBCatalogOwner (PBCatalogOwner=’sis_att_sistemas’) : Está configuração indica em qual Catalog (Usuário do banco de dados Oracle) estão as tabelas do sistema do PowerBuilder. É aconselhável configurar este parâmetro com o mesmo nome do usuário que é utilizado para conectar ao Banco de Dados
DisableBind (DisableBind=0) : Está configuração habilita o recurso de BIND do oracle, o que aumenta a segurança no trafego de informações e o ganho de performance nas queries. O grande problema deste parâmetro é que não permite visualizar as informações (parâmetros) que o PowerBuilder está enviando para o Banco de Dados, dificultando a execução dos Traces. Devemos tomar muito cuidado quando desabilitarmos o BIND (DisableBind=1), principalmente no ambiente de produção, sempre lembrando de Habilitá-lo (DisableBind=0) novamente no final dos testes

Abaixo encontra-se um exemplo de parâmetros de conexão para Oracle 9:
// Profile attbh253_oracle9
SQLCA.DBMS = "O90 ORACLE9I (9.0.1)"
SQLCA.LogPass = <*******>
SQLCA.ServerName = "attbh253"
SQLCA.LogId = "sis_att"
SQLCA.AutoCommit = False
SQLCA.DBParm = "CommitOnDisconnect='No',DelimitIdentifier='No',PBCatalogOwner='sis_att', DisableBind=0"

4 – DLLs necessárias ao PowerBuilder
Para que o PowerBuilder trabalhar com o Oracle 9, são necessárias as seguintes DLLs, com as respectivas versões:
· pbdwe80.dll (Versão 8.0.3.9977)
· pbrtc80.dll (Versão 8.0.3.9977 )
· pbvm80.dll (Versão 8.0.3.9977 )
· LIBJCC.DLL (25/06/2003 03:02:00)
· PBO9080.DLL (Versão 8.0.3.9977)


Como criar uma datawindow baseada em stored procedure ORACLE

1) Primeiramente, deverá ser criado um package contendo a declaração de um tipo REF CURSOR.

Ex:

-- Pacote com o tipo C_EMPRESAS
Create OR Replace Package EMPRESAS
IS

-- Tipo cursor para retornar as empresas
TYPE C_EMPRESAS IS REF CURSOR;

END EMPRESAS;

2) Criar a procedure incluindo no final do cabeçalho um parâmetro de saída que seja do tipo declarado no package. Construir a procedure normalmente, porém o último comando deverá ser um “OPEN cursor FOR select”, onde o cursor é o parâmetro de saída declarado no cabeçalho e o select são os dados a serem retornados.

Ex:

-- Procedure que retorna as empresas de determinado Estado
create or replace procedure retorna_empresas_unf
(
as_emp_unf in varchar2,
OUTREC IN OUT EMPRESAS.C_EMPRESAS
)
as

begin

-- Abre o cursor de saída, selecionando as empresas do estado passado como parâmetro.

OPEN OUTREC FOR
select * from tb_emp
where emp_unf = as_emp_unf;

end;

3) No PowerBuilder, criar a datawindow utilizando a stored procedure criada.


Oracle (PL SQL) – Cursor dinâmico no Oracle

Abaixo está o código de como criar um cursor dinâmico no Oracle:

DECLARE
source_cursor integer;
fNumber_Buffer number(10);
fnumber_buffer2 NUMBER(10);
fnumber_buffer3 VARCHAR2(100);
ssql VARCHAR2(2000);
wrc INTEGER;
BEGIN
ssql := 'SELECT cod_banco, cod_agbco FROM amdsepdbs0100.agencia';
source_cursor := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.parse(source_cursor, ssql, DBMS_SQL.v7);
dbms_sql.define_column(source_cursor,1,fNumber_Buffer);
dbms_sql.define_column(source_cursor,2,fnumber_buffer2);
wrc := DBMS_SQL. execute(source_cursor);
LOOP
IF DBMS_SQL.fetch_rows(source_cursor) > 0
THEN
dbms_sql.column_value(source_cursor,1,fNumber_Buffer);
DBMS_SQL.column_value(source_cursor, 2, fnumber_buffer2);
insert into AMDSEPDBS0100.AGENCIA_TMP
values (fNumber_Buffer, fNumber_Buffer2);
ELSE
EXIT;
END IF;
END LOOP;
commit;
END;

Quem é Thiago Campos Pereira?


Meu nome é Thiago Campos Pereira, nascido em Belo Horizonte (MG – Brasil) e apaixonado por informática.
Sou Consultor de Tecnologia e Professor Microsoft, certificado em MCP (Microsoft Certified Professional), MCDBA ( Microsoft Certified DataBase Administrator), MCAD .NEt (Microsoft Certified Application Developer), MCSD .Net (Microsoft Certified Solution Developer) e MCT (Microsoft Certified Trainner).
Sou especialista em PowerBuilder, Visual Studio, Sql Server e Oracle, sendo que atualmente vivo um grande relacionamento com a ferramenta VisualStudio .Net, principalmente no desenvolvimento de aplicações para PocketPC.
Sou casado com Ava Mitkiewicz Campos e no momento estamos ansiosos pelo nascimento do Ian, que está previsto para 28/04/2005.
Minha vida profissional começou na attps informática (http://www.attps.com.br/) , uma empresa que me ajudou muito no desenvolvimento profissional e pela qual prezo muito. Eu comecei na att em 1996 e já são quase 9 anos que eu estou trabalhando na empresa.
Na att eu fiz grandes amigos e conhece pessoas sensacionais, como Leonardo Carnaval, Andréia Queiroz, André Eugenio, Eduardo Cláudio, Alberto Bockzar, Marcus Tarquínio, Rui Robson, Sergio Junqueira, entre outros. Pessoas com grande valor profissional, que me apoiaram e no meu crescimento profissional.
No período entre 2001 e 2002 eu estive trabalhando na CFLCL ( Cia de Força e Luz de Leolpodina e Cataguases), umas empresa do grupo Cataguazes e que fica localizada em Cataguases, interior de Minas Gerais. A CFLCL me surpreendeu muito pela sua estrutura, organização e profissionalismo e nela fiz grandes amigos, entre eles Maurício Novaes, Delio Couto e Ricardo Souza.
No momento, estou de mudanças profissionais. Estou saindo da attps e voltando para a CFLCL. Está mudança ocorreu principalmente por questões financeiras, sendo que a questão de Segurança, qualidade de vida e stress também pesaram muito na minha decisão.

VMWhare X VirtualPC X VirtualServer

Fiz uma avaliação das três ferramentas, e todas as três são excelentes ferramentas de para emular VirtualMachine.
A configuração recomendada para você utilizar uma Virtual Machine varia dependendo de qual Sistema Operacional e softwares que serão configurados, mas se você possuir uma máquina com 768 de memória, 1.3 Mhz de processador e 5 GB de espaço livre em disco, você consegue criar uma VM para a maioria das situações existentes.
O VMWhare possui recursos muito avançados para criar ambientes de testes (Clusters, Failover, LoadBalance, etc...) e é muito fácil de utilizar. Em minha opinião, ele falha no gerenciamento de memória e na alocação de processador.
Das três ferramentas, o VirtualPC é o mais simples, como uma interface de gerenciamento muito simples e com poucos recursos. Ele ainda permite que quando a máquina Guest ( Máquina instalada dentro da Virtual Machine) perder o foco, o processador abaixa a prioridade deste processo, permitindo que o usuário continue trabalhando normalmente. Muito bom para testar ambientes Clientes. Em algumas máquinas, o VirtualPC não conseguiu localizar a placa de rede, sendo necessário configurá-la manualmente.
O VirtualServer possui todos os recursos que o VMWhare e um excelente gerenciamento de processador e memória, mas peca na Interface gráfica, que é WEB, demorada e pouco amigável. A vantagem de ser WEB é que você pode gerenciá-la remotamente, através de um Browser.

Boa Sorte.

PowerBuilder - Armazenando/recuperando arquivos em um Banco de Dados

Este artigo tem como objetivo armazenar e recuperar qualquer tipo de arquivo em um banco de dados utilizando a ferramenta de desenvolvimento PowerBuilder.

//******************Armazenando arquivos***********************//
//verifica se o arquivo já existe, se existir, realiza o updade, caso contrario, realizar o insertlong ll_row, ll_codigo, ll_file, ll_tamblob lblob_arquivo, lBlob_final
ll_codigo = long (sle_1.text)
//Carrega o arquivoll_file = FileOpen ( sle_2.text , StreamMode! , Read! , LockRead!)if ll_file = -1 then messagebox("Erro","Ocorreu um erro na abertura do arquivo",stopsign!) returnend 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)
select count(*)into :ll_rowfrom tb_zipwhere codigo = :ll_codigo ;
if sqlca.sqlcode <> 0 then messagebox("Erro no count",sqlca.sqlerrtext,stopsign!) returnend if
if ll_row = 0 then insert into tb_zip(codigo,arquivo) values (:ll_codigo, ''); if sqlca.sqlcode <> 0 then messagebox("Erro no Insert",sqlca.sqlerrtext,stopsign!) return end ifend if
updateblob tb_zipset arquivo = :lBlob_finalwhere codigo = :ll_codigo ;
if sqlca.sqlcode <> 0 then messagebox("Erro no update",sqlca.sqlerrtext,stopsign!) returnend if
messagebox("Sucesso","Arquivo gravado com sucesso!")

//**********************Recuperando Arquivo **********************//
//verifica se o arquivo já existe, se existir, realiza o updade, caso contrario, realizar o insertlong ll_row, ll_codigo, ll_file, ll_tamblob lblob_arquivo, lBlob_finalstring ls_path, ls_file
ll_codigo = long (sle_1.text)
//Verifica se o arquivo existeselect count(*)into :ll_rowfrom tb_zipwhere codigo = :ll_codigo ;
if sqlca.sqlcode <> 0 or ll_row = 0 then messagebox("Erro ao localizar arquivo","Arquivo inexistente",stopsign!) returnend if

if GetFileSaveName("Inform o nome do arquivo ZIP",ls_path, ls_file,"ZIP","Arquivo ZIP (*.zip),*.zip") = -1 then messagebox("Erro","Erro ao Selecionar Arquivo",exclamation!) returnend if
//Busca o arquivo no bancoselectblob arquivointo :lBlob_finalfrom tb_zipwhere codigo = :ll_codigo ;
if sqlca.sqlcode <> 0 or ll_row = 0 then messagebox("Erro ao localizar arquivo","Arquivo inexistente",stopsign!) returnend if
//Carrega o arquivoll_file = FileOpen ( ls_path , StreamMode! , write! , Lockwrite!, Replace!)if ll_file = -1 then messagebox("Erro","Ocorreu um erro na abertura do arquivo",stopsign!) returnend if
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)

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

Sejam Bem Vindos!!

Este blog tem como objetivo compartilhar informações técnicas com a comunidade de Informática. Aqui serão abordados informações sobre Visual Studio, SQL Server, Oracle, PowerBuilder, Visual SourceSave, PowerDesigner e outras ferramentas direcionadas ao desenvolvimento de sistemas.