terça-feira, março 15, 2005

Oracle – Trabalhando com campos auto-incremental

O campo auto-incremental é o campo um campo numérico onde o valor é gerado automaticamente a partir de algumas informações.
No Oracle, este campo é conhecido como SEQUENCE.
Para trabalhar com este campo no Oracle, devemos seguir os seguintes passos:

1) Criar a tabela com um campo numérico, que será utilizado como auto incremental
create table ATUALIZACAO_LOG
(
SEQ_LOG NUMBER not null,
COD_EMPRESA NUMBER(5) not null,
COD_TELA NUMBER(38) not null,
CHAVE VARCHAR2(300) not null,
INICIO DATE not null,
FIM DATE null ,
TIP_LOG CHAR(1) not null
constraint CKC_TIP_LOG_LOG check (TIP_LOG in ('I','A','E','P')),
SIGLA_USUARIO VARCHAR2(20) not null,
HISTORICO VARCHAR2(300) not null,
constraint PK_ATUALIZACAO_LOG primary key (SEQ_LOG)
)
/
2) Definir um objeto do tipo SEQUENCE, com as suas configurações
CREATE SEQUENCE SEQ_ATUALIZACAO_LOG
START WITH 1
INCREMENT BY 1
NOMINVALUE
NOMAXVALUE
NOCYCLE
CACHE 20
NOORDER
/
Onde:
START WITH : Posição inicial
INCREMENT BY : Valor a ser incrementado.
3) Gerar o próximo valor

select SEQ_ATUALIZACAO_TELA.nextval
into Proximo_valor
from dual

4) Incluir na tabela

insert into ATUALIZACAO_LOG values(Proximo_valor, cod_empresa, cod_tela, upper(:as_chave), dt_now, dt_now, tip_log, upper(sigla_usuario), upper(historico) )

quinta-feira, fevereiro 03, 2005

PowerBuilder - Problemas na Migração da Versão 7 para a 9

1) Mudança no retorno do comando Retrieve
No PB 7, quando você executava Retrieve em uma DataWindow e o DataObject está inválido ( a DataWindow foi apagada ou alterada o nome), o PowerBuilder retornava 0 ( não encontrou linhas). Já no PowerBuilder 9, o comando retorna -1, que é o correto já que a DataWindow não existe.
A recomendação é que caso ocorra um caso desse, verifique se a DataWindow realmente não existe. Caso não exista, comente o código colocando usuário, data e motivo pelo qual comentou o código. Após isso, teste bem o sistema

2) Mudança no tratamento do comando ScrollToRow
No PB7, quando você executava o ScrollToRow, ele não disparava eventos como RowFocusChanged e ItemFocusChanged. No PB9, estes eventos são disparados quando você executa o comando, podendo mudar o funcionamento da sua janela, caso você tenha código nestes eventos.

3) Problemas com o comando SetTrans
O comando SetTrans não é mais aceito no PowerBuilder 9, causando cancelamento do programa.
Para resolver este problema, substitua o comando SetTrans para SetTransObject.

PowerBuilder - Roteiro de Migração da Versão 7 para a 9

* Copie a aplicação localmente na sua máquina ( isto melhorará a performance da Migração, diminuindo o tempo necessário para executar o processo)
* Crie o Workspace
* Vá na janela de New / Existing Application
* Selecione a aplicação que você deseja migrar
* Monte a Library List necessária
* Confirme o nome do Target que será criado e clique em Finish
* Aparecerá uma mensagem informando que vocÊ deverá migrar os fontes. Nesta tela, desmarque a opção de exibir mensagem de informação e obsoleto e clique em OK para iniciar a migração
* Aguarde a finalização e verifique se ocorreu algum erro na migração ( é comum aparecer várias mensagens, mas a única que não deve ser ignorada é a de erro. Quando ocorrer uma mensagem de erro, devemos analisar e corrigir o problema)
* Após a finalização, para garantir o sucesso completo da aplicação, devemos executar dois passos extras
- Full Rebuild em todas a aplicação
- Optmize em todas a PBLS

quarta-feira, fevereiro 02, 2005

PowerBuilder – Armazenando fotos em um Banco de Dados

Cada vez está sendo mais comum desenvolvermos aplicações que utilizem fotos / imagens. Abaixo está um exemplo de como Armazenar e recuperar fotos no banco de dados.
Este exemplo foi feito utilizando Orace 8.1.7 e PowerBuilder 9.2 (Build 7554)

PASSO 1 – Crie uma tabela
Crie uma tabela com um campo próprio para armazenar este tipo de arquivo (geramente chamado como campo BLOB), que pode variar de acordo com o SGBD ( SQL Server/Sybase/ASE = Image ou Text; Oracle = Long ou Long Raw ou Blob ou CLOB)
No meu exemplo, criei a seguinte tabela no Oracle:

CREATE TABLE TESTE_FOTO
( CODIGO NUMBER(2) NOT NULL,
DESCRICAO VARCHAR2(100) NULL,
EXTENSAO VARCHAR2(4) NULL,
FOTO LONG RAW NULL,
CONSTRAINT PK_TESTE_FOTO PRIMARY KEY (CODIGO))

O campo EXTENSAO foi feito para resolver um problema existente na API do Oracle 8, quando recuperamos a foto para exibição.
É recomendado que você nunca crie o campo BLOB em uma tabela a parte, pois geralmente este campo ocupa muito espaço, tornando a tabela pesada para utilizar em consultas que recuperam múltiplos registros.
Um detalhe muito interessante é que o campo de FOTO tem que ser Nulo. O que vai ser explicado no passo 2.

PASSO 2 – Criar a DataWindow de Manutenção
Crie uma DataWindow atualizável com todos os campos da tabela, exceto o campo BLOB, pois ele será tratado a parte. Por isso o campo BLOB deve ser nulo, pois a inserção de registro na tabela e feita em dois passos:
1 – Inserção dos campos normais
2 – Atualização do valor do campo BLOB

PASSO 3 – Selecionando o arquivo a ser armazenado
Insira um Picture Control na sua Datawindow, que será utilizado para exibir a imagem e crie um código que permita selecionar a imagem, como no exemplo abaixo :

string docpath, docname
integer li_rtn

//Exibe janela para selecionar o arquivo
li_rtn = GetFileOpenName("Selecione a Imagem",docpath, docname, "JPEG",+ "JPEG (*.jpg),*.jpg," &
+ "BMP (*.BMP),*.BMP,All Files (*.*), *.*", "C:\", 18)

IF li_rtn < filename=" docpath" ls_picturename =" trim(DW_1.Object.P_1.Filename)" ll_aux =" len(ls_picturename)" ll_i =" ll_aux" ll_i =" 0"> 0 then
ls_extensao = mid(ls_picturename,ll_i + 1)
else
setNUll(ls_extensao)
end if

dw_1.setitem(1,"extensao",ls_extensao)

//Salva a DataWindow
dw_1.update()

//Transforma o arquivo em um valor Blob
WF_grava_arquivo( DW_1.Object.P_1.Filename, LL_BLOB)


lblb_imagem = LL_BLOB
ll_codigo = dw_1.getitemnumber(1,"codigo")

//Atualiza o valor blog no Banco de Dados
updateblob teste_foto
set foto = :lblb_imagem
where codigo = :ll_codigo;


//Finaliza a transacao
commit;


Código da função WF_GRAVA_ARQUIVO
wf_grava_arquivo (string as_arquivo, ref blob lblob_final);//verifica se o arquivo já existe, se existir, realiza o updade, caso contrario, realizar o insert
long ll_row, ll_codigo, ll_file, ll_tam
blob lblob_arquivo

//ll_codigo = long (sle_1.text)

//Carrega o arquivo
ll_file = FileOpen ( as_arquivo , StreamMode! , Read! , LockRead!)
if ll_file = -1 then
messagebox("Erro","Ocorreu um erro na abertura do arquivo",stopsign!)
return
end 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)


PASSO 5 – Neste passo iremos recuperar o arquivo do banco de dados e exibi-lo na DataWindow.
No SQL Server e Sybase, basta incluir um controle “Large binary/text Database Ole Object” e prencher as informações corretas (Na dúvida, consulte o Help do PowerBuilder).
Mas, a solução acima não funciona no Oracle, pois existem alguns problemas com este controle, onde os dados não são recuperados.
Para resolver este problema, eu tive que criar a seguinte solução
1 – Recupero o campo BLOB para uma variável BLOB
2 – Limpo os arquivos temporários existentes. Para isso, armazeno os nomes dos arquivos temporários gerados em um XML
3 – Crio o arquivo temporário a partir da variável BLOB. Por este motivo, eu armazeno a extensão do arquivo na hora de gravar, evitando conflitos de tipos de arquivos. Neste ponto, também armazeno o nome do mesmo no XML, para limpeza no futuro.
4 – Utilizando um Picture Control na DataWindow, exibo o arquivo temporário armazenado.

Abaixo está o código utilizado para fazer este procedimento :

long ll_rowcount
long ll_codigo, ll_file, ll_row
blob lblb_imagem, lBlob_final, lblob_arquivo
string ls_imagem, ls_path
datastore vld_datastore

//Configura DataStore de Gerenciamento de arquivos temporários
vld_datastore = create datastore
vld_datastore.dataobject = 'd_arquivos_temporarios'

ll_codigo = long(sle_1.text)

//Recupera os Registros
ll_rowcount = dw_1.retrieve (ll_codigo)

//Se existir registro, vai para o tratamento do Blob
if ll_rowcount > 0 then
//Seleciona o campo Blob
selectblob foto
into :lblb_imagem
from teste_foto
where codigo = :ll_codigo;

//Importa os dados do arquivo XML de controle de arquivos temporarios
vld_datastore.importfile(XML!,'C:\tmpfoto.xml')

//Apaga todos os arquivos temporarios existentes na máquina
for ll_row = vld_datastore.rowcount() to 1 step -1
filedelete(vld_datastore.getitemstring(ll_row,"filename"))
vld_datastore.deleterow(ll_row)
next

//gera um arquivo temporario, com a extensao original
ls_path = "c:\tmpfoto" + string(today(),"yyyymmdd")+string(now(),"hhmmssffff")+"."+dw_1.getitemstring(1,"extensao")

//Grava o nome do aquivo temporario no XML de controle
ll_row = vld_datastore.insertrow(0)
vld_datastore.setitem(ll_row,"filename",ls_path)
vld_datastore.saveas( "C:\tmpfoto.xml", XML!,true )


//Carrega o arquivo
ll_file = FileOpen ( ls_path , StreamMode! , write! , Lockwrite!, Replace!)
if ll_file = -1 then
messagebox("Erro","Ocorreu um erro na abertura do arquivo",stopsign!)
return
end if

//Lê o blob e grava um arquivo
lBlob_final = lblb_imagem

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)

//Exibe o arquivo temporario
DW_1.Object.P_1.Filename=ls_path


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



Boa sorte!!!!

quinta-feira, janeiro 27, 2005

PowerBuilder - Verificar se uma aplicação está sendo executada

//Declare as seguintes external functions
FUNCTION ulong CreateMutexA (ulong lpMutexAttributes, boolean InitialOwner,ref string lpName) library "kernel32.dll"
FUNCTION ulong GetLastError () library "kernel32.dll"
FUNCTION ulong CloseHandle(ulong hMutex) library "kernel32.dll"


//NO seu códiog, faça o seguinte
string ls_aplicacao
uint rc1,rc2
boolean lb_inherit

lb_inherit=false
ls_aplicacao="sua_aplicação.exe"
rc1=CreateMutexA(0,lb_inherit,ls_aplicacao)
rc2=getlasterror()
if rc2=183 then // mutex existe
CloseHandle(rc1)
MessageBox("Atenção", "Aplicação já esta rodando")
else
Messagebox("Solicitação será Executada", "Aplicação será iniciada.")
end if

sexta-feira, janeiro 21, 2005

SQL Server – Problemas com Formato da Data

Em alguns casos, ocorrem erros de conversão de datas para o SQL Server, com a seguinte mensagem:

Server: Msg 242, Level 16, State 3, Line 1
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.

Este erro pode ocorre com apenas um Login especifico no banco de Dados SQL Server ou com todos os logins.

Isto ocorre porque o Login do SQL Server possui um idioma que ele irá utilizar. Na maioria das instalações, o SQL Server é instalado em English e os Logins assumem o idioma default da instalação do SQL Server.

Mas, está cada vez mais comum a instalação do SQL Server em idiomas específicos (português, Francês, espanhol e ect...). Neste caso, o idioma default vai ser o da instalação do SQL Server. Em outros casos, este idioma pode ser trocado, para apenas um Login ou para todos os Logins, gerando o erro acima.

Para resolver o erro citado no inicio, você tem duas soluções.

A primeira é identificar com o formato de data/hora que você está utilizando e padronizar os seus logins com o idioma que atende aquele formato de data/hora.

A segunda solução seria converter o valor para datetime, passando o formato que você está utilizando. Considero está solução melhor, pois você fica livre de problemas gerados por alteração de configuração de Logins.

Por exemplo

select convert(datetime,'2002-01-21 12:59:12.150' , 101 )

Se você trocar o 101 por 103, você vai notar que vai dar erro, pois o formato de data 103 é o seguinte formado

select convert(datetime,'21/01/2002 12:59:12.150',103)

Que é o formato de data utilizado no Brasil.

Boa Sorte

quinta-feira, janeiro 20, 2005

DotNet – Visual Studio não reconhece PocketPC Device

Em algumas situações, quando utilizamos o Visual Studio 2003 para desenvolvimento para Mobile Devices ( Pocket PC e Smart Phone), recebemos a seguinte mensagem

Error: Cannot establish a connection. Be sure the device is physically connected to the development computer.

Este erro ocorre pois o Visual Studio não conseguiu encontra o seu Device e muitas vezes é gerado pela reinstalação ou update do Active Sync no PC.
Tentei “N” soluções para resolver o problemas, inclusive os listados nos site
http://download.microsoft.com/download/c/d/b/cdbff573-73fb-4f9f-a464-c5adc890e1ae/Readme.htm#CEDeploy

Tentei reinatalar o Visual Studio 2003 duas vezes, limpei as chaves do registry, rodei o ProxyPorts.Reg e fiz N tentativas.

Depois de uma semana tentando resolver o problema, consegui achar a solução que resolveu o meu problema.

Abaixo estão os passos que segui:

1. Remover totalmente activesync.
2. Reinstalar de novo.
3. Executar C:\Program Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\WinCE Utilities\WinCE Proxy Ports Reg\ProxyPorts.Reg
4. Verificar [HKLM\microsoft\wince services] os registros para as portas do proxy
5. Si [HKLM\microsoft\wince services] se não existe, o seu problema é outro e este roteiro não vai corrigi-lo.
6. Si [hKLM\microsoft\wince services] se existe, então executa "DelDesktopCryptKey.exe" em "C:\Program Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\WinCE Utilities\DelDesktopCryptKey"
7. Executar um Soft Reset no Pocket pc.
8. Copiar "DelCryptoKey.exe" armv4 version para o pocket pc e executá-lo no Pocket PC
9. Antes de iniciar a compilação no Visual Studio, assegure que tenha instalado o utilities v1.1 for VS.NET 2003 add-ons .
10. No Visual Studio, selecionar tools->select windowsce device cpu
11. Selecionar armv4 e pressionar configurar
12. Teste

Esta configuração funcionou perfeitamente no me caso. A minha configuração é a seguinte:
Pocket PC
Dell Axim X30
Windows Móbile 2003
Active Sync 3.7.1
PC
Windows XP Sp 2
Visual Sudio 2003

segunda-feira, janeiro 17, 2005

Ferramentas Case

Ferramentas Case, ErWin, CaseStudio, Dr. Case, Visio e Together. Qual é a melhor opção para se trabalhar com o SQL Server 2000? Tire suas dúvidas e veja qual atende melhor as suas necessidades

Comparando o SQL Server com Outros Bancos de Dados

Você está comprando um novo Sistema Gerenciador de Bancos de Dados Relacional? Quer comparar seu sistema atual com o SQL Server? Veja o que analistas independentes estão dizendo sobre o SQL Server, como ele difere do Oracle, IBM, e Sybase, e encontre recursos que o ajudarão a migrar ou integrar seu sistema de bancos de dados atual.

SQL Server 2000 - Alta Disponibilidade

Maximize a disponibilidade de suas aplicações comerciais com log shipping, backups on-line e clusters failover. Leia este artigo e conheça melhor as soluções de alta disponibilidade oferecidas pelo SQL Server 2000.O Microsoft SQL Server 2000 ajuda a maximizar a disponibilidade através de backups online, log shipping completamente integrados e clusteringfailover potencializado. Destes métodos, o backups online está disponível tanto no SQL Server 2000 Standard Edition quanto no SQL Server 2000 Enterprise Edition. Log shipping e clustering failover estão disponíveis somente na Enterprise Edition

sexta-feira, janeiro 14, 2005

PowerBuilder - Inserindo objeto via metodo post

By Celso S. Côrtes

//Inserindo objeto via metodo post
Blob lblb_args
String ls_headers
String ls_url
String ls_args
long ll_tam
integer li_ret
li_ret= GetContextService( "Internet", iinet_base )
IF li_ret = 1 THEN
ir = CREATE n_ir
ls_url = "http://sua_url/xxxx/parametros?"
ls_args = "id=nome&pwd=senha"
lblb_args = Blob( ls_args )
ll_tam = Len( lblb_args )
ls_header = "Content-Type: " + &
"application/x-www-form-urlencoded~n" + &
"Content-Length: " + String( ll_tam ) + "~n~n"
li_rc = iinet_base.PostURL( ls_url, lblb_args, &
ls_header, ir )

Banco de Dados - Funções do SQL Server X Oracle

Neste Site você tem uma lista das funções do SQL Server e quais são as funções compativeis no Oracle.

quinta-feira, janeiro 06, 2005

SQL Server 2000 - Identificando Versões

Versões do SQL Server
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

* 2000
- 2000.80.194 = RTM (Primeira Versão)
- 2000.80.384 = SP1
- 2000.80.534 = SP2
- 2000.80.760 = SP3 ou SP3a

SQLServer 2000 - Replicação

- Informacoes
1. Snapshot Agent : Replicacao Inicial, sincronismo ( Este processo é pessado e bloqueia o banco por um certo tempo)
2. Log Reader Agent : Replica as transacoes do Publisher para o Distribution
3. Distribution Agent : Replica as transacoes do Distribution para o subscriber
4. Merge Agent : processo de replicacao para os dois lados, responsavel por resolver conflitos

- Passos para configurar a Replicaçao
1. Definir o cenario : Central Publisher
2. Definir o metodo : Transaction replication
3. Criar Usuario Utilizado : o usuario deve ter acesso de Administrators, system
4. Associar o usuario com os servicos MSSQL e AGENT
5. Habilitar o servidor de Publicacao (configurar o distribution e o publisher). Chamar o wizard e lembrar de informar um diretorio que possua espaco para o distribuition(de preferencia coloque o diretorio em um disco diferente para ganho de performance)
6. Se houver triggers, marcar a opçao de NOT FOR REPLICATION para que os dados nao sejam alterados 2 vezes
7. Em todas as Constraints, marcar a opçao de NOT FOR REPLICATION para que os dados nao sejam validados 2 vezes
8. Criar as publicacoes : utilizar o wizard, selecionar transactional publication, ir no botao de DEFAULT ARTICLES e marcar triggers e DRI, selecionar as tabelas (se existir alguma tabela com coluna identity, a propriedade identity nao sera levada)
9. Verificar se os bancos no subscribers estao vazios.
10. Criar Subscribers : Definir se vai ser Pull (configurado em cada subscriber) ou Push (configurado no servidor de publicacao, mais simples), marcar para realizar o Snapshot
11. Monitorar :
12. Backup : Publisher(Published DB, msdb, master), Distributor (distributor DB,msdb,master), subscriber(subscriber db), o published e distribution db devem ser backupiados juntos
13. Resolvendo erro : Se ocorrer erro na replication, retire o subscriber, reinsira o mesmo e faca um sincronismo. Entre nas opcoes da publicacao e mande reinicializar o subscriber, depois rode o servico de snapshot, quando acabar, rode o servico do subscriber.


Sql Anywhere - Informações sobre este sgbd

Este link traz todas as informações necessárias sobre o SGBD SQL Anywhere.

quarta-feira, janeiro 05, 2005

Dicas Gerais - Aumentar a conta do Hotmail para 250 MB

Galera,
fiz o teste e funcionou. Se você quiser aumentar a sua caixa posta do Hotmail de 2 MB para 250 MB, siga os passos abaixo.

Hotmail 250mb de espaço Aumente sua conta do hotmail de 2mb para 250mb.
Explicações: Não é necessario pagar nada para aumentar o espaço da sua conta.
Como podem ver na Ajuda do hotmail, no Brasil ainda "em breve" as contas passarão ter mais espaço de armazenamento. Abaixo iremos mostrar como alterar o país configurado e assim aumentar o tamanho da conta:
Somente em contas @hotmail.com.
1. Acesse www.hotmail.com.br e entre com seu usuário e senha normalmente.
2. Clique em opções, no canto superior direito da tela:
3. Na página opções, clique em Meu Perfil:
4. Trocar campos:País/Região: Estados UnidosEstado: FloridaCEP: 33332
Você pode usar outros estados, caso o cep esteja correto.
5. Atualize, e na página seguinte irá mostrar uma mensagem: Seu Perfil foi atualizado com sucesso.
6. Acesse o link http://www.hotmail.msn.com/cgi-bin/accountclose e clique no botão encerrar minha conta, no final da página:
Obs: Você não perderá seus e-mails, contatos do MSN Messenger, etc.
7. Irá para uma página de confirmação de encerramento:

8. Acesse novamente www.hotmail.com.br e entre com o mesmo e-mail e senha... Pedirá para você ativar a conta, aceitar o termo de uso, promoções e etc..
9. Pronto sua conta já terá 25mb:

Após 30 dias sua conta aumentará para 250mb automaticamente, neste período não deixe de acessar seu e-mail.

PowerBuilder - enviar e-mail via SMTP

Qual falamos em enviar e-mail via SMTP, queremo dizer, sem utilizar software de e-mail (outlook, Netscape, Eudora e etc...)
O PowerBuilder não tem suporte a este recurso, tendo que utilizar aplicações externas para isso. Existe N aplicações que fazem o que queremos. Encontrei uma livre na Internet que funciona muito bem. O nome da aplicação é BLAT (http://www.blat.net/).
Ela funciona da seguinte forma.
* Você tem que possuir uma servidor SMTP funcionando na sua rede. O Exchange Server possui este recurso, só é necessário abilita-lo e configura-lo.
* Você pode chamar um aplicativo (BLAT.EXE) passando os parâmetros necessários ou uma função de uma dll (BLAT.DLL) que envia o e-mail para você.

PowerBuilder – Migração de versão

Nas migrações para PowerBuilder 5,6 e 7, ocorreram vários problemas e por isso, toda vez que temos uma versão nova do PowerBuilder, sempre aparece a pergunta “Vamos ter problemas na migração?”.

Já realizei todo o tipo de migração e notei que as migrações para PowerBuilder 8,9 e 10 são bem tranqüilas, bastando compilar os objetos no novo PowerBuilder. Na migração para PowerBuilder8, ainda ocorreram alguns problemas, como o desaparecimento de scripts (em alguns eventos, o código simplesmente desaparecia), mas na migração para PowerBuilder 9 e 10, não tive nenhum problema e nem parece que você está fazendo uma migração, mas apenas executando um Full Rebuild na aplicação
Ponto positivo para o PowerBuilder

PowerBuilder VERSUS Windows 9x

Até a versão 8 do PowerBuilder, um executável gerado podia ser executado em qualquer sistema operacional Windows 95 ou superior.
A partir do PowerBuilder 9, o executável não mais funcionará em Windows 95, sendo necessário o Windows 98 ou superior de acordo com a documentação da Sybase. Já ouvi relatos de pessoas que tiveram problemas com Windows 98, mas não conseguimos identificar se era limitação do PowerBuilder ou da aplicação.
A partir do PowerBuilder 10 as restrições ficam maiores ainda. O próprio PowerBuilder 10 só pode ser instalado no Windows 2000 ou XP. A aplicação compilada ( executável ) do PowerBuilder 10 funcionará apenas no Windows 2000, 2003 e XP. Assim, ficam excluídos os sistemas operacionais Windows 95, 98, Me (Millennium) e NT.Essa informação é muito importante para quem pretende migrar os seus sistemas para PowerBuilder 9 ou 10.