quinta-feira, agosto 27, 2009

PowerBuilder - Is the Application a Good Fit for the Internet?

Is the Application a Good Fit for the Internet?

Not all PowerBuilder applications will move smoothly to the Internet with every approach described here. Variables such as the size and complexity of the application, the use of Windows-only features such as OLE, DDE, and third party OCXs, the number of DataWindows used in each Window, the size of the SQL result sets retrieved, the PowerBuilder framework used, and even coding practices and the general quality of the code will all determine the options open to you. Other variables that will all impact your decision include the complexity of the UI presentation style and the use of drag and drop in the application. The chart below should serve as only a general guideline and not an indication of which approach is best for your organization.


Technique

PB Windows Forms

PB Web Forms

PB Web DataWindow

CITRIX or Terminal Svcs.

Appeon

MDIInterface

Y

Y, using tabs

N/A

Y

Y

Drag and

Drop

Y

N

N

Y

Y

OLE, OCX

Y

N

N

Y (server-side)

Y

Client-Side Integration

Y

Via JavaScript

Via JavaScript

Disks and printers only

Y

Server-Side Integration

Y

Y

Y

Y

Y

Level of

Effort

Minor

Significant

Highest

Least

Minor

Fidelity

of UI

Highest

Good

Good

Excellent

Excellent

Strengths

Easy, good UI, broad capability

Best for simple UI, ground up true web dev

Scalability, good for Java and low level control

Easy to set up and deploy

Client & server integration, scalability, performance

Weaknesses

Bandwidth, footprint on client

Event postback model inherent to ASP .NET 2.0

Strong need for good 3-tier architecture, more hand coding

Scalability, cost

Technology created by a Sybase Partner.

quarta-feira, agosto 19, 2009

PowerBuilder 11 X Oracle

Abaixo o Link informando quais as versões do Oracle são suportadas pelo PowerBuilder 11

PowerBuilder - Migração para Versão 11.5 - Problemas...

Pessoal,
estou fazendo alguns estudos sobre a migração do PowerBuilder da versão 9 para a versão 11.5. Desta forma, estou levantando problemas que posso enfrentar. A principio, identifiquei o problema abaixo:
  • Performance de desenvolvimento é 1/3 da performance do PB9. Este problema foi repassado a Sybase que nos informou que devido a quantidade de recursos adicionados ao PB 10 e 11 a DataWindow ficou mais pesada e que é normal este delay, não sendo considerado um problema e sem previsão de melhoria.
A medida que novos problemas forem encontrados, irei publica-los aqui. Caso tenha alguma informação para contribuir, sinta-se a vontade para me enviar as informações.

PowerBuilder - Geração automatica de executável com o Team Foundation

Finally i have my Power Builder 11 Application Compiling from strach, What i mean is Performing a BootStrap import of all the objects into PBL file and then Compiling all the PBL files into and application (PBD). Actually i was using PowerGen Standard Edition for compiling the power builder application. But Standard edition does not allow bootstrap import. So we had to get proffesional edition in order to perform the steps. All i did was then added below code. (ofcourse along with .gen file, created from PowerGen).

<

Exec WorkingDirectory="$(SolutionRoot)" Command="start /wait Pwrgn11.exe /J="$(SolutionRoot)\TeamBuildTypes\ProjectName.gen"/PBG"/>

<

Exec WorkingDirectory="$(SolutionRoot)" Command="start /wait Pwrgn11.exe /A="$(SolutionRoot)\TeamBuildTypes\ProjectName.gen""/>

I am finally closing this thread. anybody needs any help please let me know.
THANKS.

Mais informações em http://social.msdn.microsoft.com/Forums/en-US/tfsbuild/thread/617dd2f5-3538-4bcb-9101-15a49445df23

domingo, janeiro 21, 2007

Boicote ao Skype

Meus amigos,
desde 18/01/2007 o SKype está cobrando uma tarifa de 0,09 centavos para cada ligação que você fizer no SkypeOut. Para nos defendermos desta cobrança abusiva, sugiro iniciarmos uma boicote ao SkypeOut, utilizando o programa concorrente GIZMO (http://www.gizmoproject.com/) ou outro a sua escolha.
A grande vantagem do Gizmo é que o mesmo tem caixa posta grátis e tarifas mais baratas para vários locais, inclusive Brasil e USA.

Leia mais detalhes da cobrança abusiva em http://idgnow.uol.com.br/telecom/2007/01/19/idgnoticia.2007-01-19.7152325690/IDGNoticia_view

sexta-feira, janeiro 05, 2007

PowerBuilder – Utilizando o Team Foundation Source Control ao invés do Visual SourceSafe

Hoje é comum utilizarmos um software de controle de versão. Entre as opções existentes no mercado, muitas empresas selecionam o Microsoft Visual SourceSafe (VSS). Mas, apesar das vantagens existentes no VSS, existem muito problemas que acaba colocando em risco o sucesso do mesmo.

Entre os problemas, podemos citar:
1 – Fontes corrompidos: Como a base de dados do VSS é muita arcaica, sendo composta por vários arquivos em disco e sem nenhum controle transacional, é muito comum termos um fonte corrompido devido a falhas de energia o cancelamento de aplicativos. O que gera muito trabalho para o administrador do VSS e muitas vezes paralisa as atividades da equipe de desenvolvimento;

2 – Backup da Base de Dados do VSS: Como o BD do VSS é composto por milhares de arquivos, o Windows demora muito tempo para realizar o Backup destes arquivos. Em uma base de dados de 5 GB, o Windows demora 6 horas para copiar os arquivos do VSS para uma área de Backup.

3 – Analyze: Este é o aplicativo responsável por gerenciar os problemas na base de dados do VSS. Ele é a muito lento e exige que ninguém utilize a base de dados durante a execução. Por exemplo, em uma base de dados de 5GB, o Analyze demora 24 horas para executar. Lembrando que a Microsoft recomenda que este deve ser executado semanalmente. Outro problema é que nem sempre ele resolve todos os problemas, inclusive, podendo causar novos problemas ao remover um arquivo corrompido;

4 – Lentidão: Outro problema é a lentidão para executar algumas operações, como o Share/branch, delete e pesquisa na base de dados;

5 – Customização limitada e complexa: Caso seja necessário criar consulta ou procedimento que acessem diretamente a base do VSS, o custo se torna muito alto, pois é necessário recursos altamente especializados e o tempo para esta tarefa é muito grande;

6 – Software Arcaico: Devemos lembrar que a estrutura do VSS existente hoje, no ínicio de 2007 é praticamente a mesma existente em 1996. Dez anos para informática é muito tempo!!


A partir dos problemas acima, resolvi estudar outro software de controle de versão.

Como utilizamos VisualStudio 2005 e o PowerBuilder para desenvolvimento, resolvi analisar o Team Foundation Source Control ( TFSC) que é a evolução natural para o Visual SourceSafe.

A primeira questão é se o mesmo seria compatível com o PowerBuilder 9. Realizei algumas pesquisas e descobri que a Microsoft lançou uma API que realiza a compatibilidade entre outras aplicações e o TFSC, chamada de Visual Studio team Foundation Server MSSCCI Provider ( http://www.microsoft.com/downloads/details.aspx?familyid=87E1FFBD-A484-4C3A-8776-D560AB1E6198&displaylang=en ). De acordo com as informações do site, ela é compatível com PowerBuilder 10.5. Investigando melhor, descobri no Blog do desenvolvedor da Microsoft responsável pelo produto, que eles apenas testaram com o PowerBuilder 10.5, mas não quer dizer que não é compatível com outras versões do PowerBuilder. Testei com o PowerBuilder 9.0.3 Build 8784 e funcionou perfeitamente.

Já estou em fase final de deste e essa versão trouxe muitas melhorias e piorou algumas funcionalidades. Abaixo vai uma relação das vantagens e desvantagens existentes:


* Vantagens
- Utiliza Banco de Dados SQL Server;
- Não corre risco de corromper;
- rotinas de manutenção são a mesma de banco de dados (Backup e Reindex, processos rápidos e automatizados);
- Mais recursos para Administração (Permissões, Grupos de usuário e tipos de acesso);
- Maior segurança (Integrado com a segurança do Windows, não necessitando criar usuários no próprio VSS);
- Maior Velocidade no acesso e gravação dos dados (Adicionar objetos, Refresh Status e GetLatestVersion);
- Permite fazer GetLatestVersion de um HotFixes especifico;
- Manutenção pode ser feita on-line, com os usuários utilizando;
- Permite fazer Merge de uma versão inteira ou de objetos específicos;
- Não há necessidade de Archive, pois o SQL Server gerencia bem a formato da base;
- Possibilidade de criar novos índices nas tabelas e melhorar o desempenho da base de dados do VSS;
- Possibilidade de se criar consultas direto na base de dados do VSS;
- Permite acesso via http, inclusive, é possível colocar a base de dados fora da empresa, em um DataCenter;
- Resolveu problema do simbolo de alterado quando o objeto é identico
- É possível Criar vários "Bases de dados" para projetos diferentes e com permissões diferentes.

* Desvantagens
- Problema ao registrar o primeiro objeto da PBL, onde deve-se observar o limite de no máximo 25 objetos, para que o PBG seja criado corretamente;
- Complexidade para saber quais objetos foram alterados entre um label e outro;
- Novo e pouco utilizando com o PowerBuilder, o que pode ocorrer Bugs na utilização;
- Custo (Tem que comprar o TeamFoundation, SQLServer e SharePoint)
- Ao Mover o objeto tem que desconectar, mover o objeto e alterar o PBG manualmente (PBL de origem e destino) ;
- hardware Mínimo ( 1GB de memória, 20 GB HD e Processador de 2 GHZ);

Veredicto: Aprovado!!

quinta-feira, janeiro 04, 2007

Team Foundation – Instalação Complicada

Estou fazendo testes do Team Foundation (TF) e perdi quase uma semana tentando instalar o mesmo. Como um usuário avançado de informática, a principio optei por não ler a documentação e tentar instalar o software utilizando a experiência que possuo e isso me gerou muita dor de cabeça.

A primeira dica é para ler este artigo até o final. A segunda dica é para seguir as instruções do manual de instalação, que pode ser obtido no endereço http://www.microsoft.com/downloads/details.aspx?familyid=E54BF6FF-026B-43A4-ADE4-A690388F310E&displaylang=en

Para começar, fiz a instalação em uma Máquina Virtual ou Virtual Machine (VM) utilizando o Microsoft Virtual Server.

O Primeiro problema que tive são os pré-requisitos existentes, que são:
1 – Criação dos usuários necessários para a instalação do TF;
2 – Windows 2003 SP 1;
3 – Internet Information Server (IIS);
4 – SQL Server 2000 ou superior (Optei por instalar o SQL Server 2005);
5 – Service Pack do SQL Server (Essa opção pode ser substituída por uma correção no Analyse Server que pode ser baixada da Internet);
6 – DotNet FrameWork 2.0;
7 – Correção do DotNet Framework 2.0 (A correção está dentro da CD do TF);
8 – Share Point Service (SPS) 2.0;

No inicio da Instalação do TF, ele exibe um relatório com os pré-requisitos que estão faltando. A partir deste relatório, instalei os pré-requisitos da forma que eu acho melhor e ai começaram os problemas.

Apenas lembrando para cada problema abaixo, eu formatei a VM e reinstalei tudo novamente. Escolhi este procedimento, pois um erro pode provocar outro erro e muitas vezes você perde mais tempo tento resolver um erro do que refazendo toda instalação da forma correta.

Na Instalação do SQL Server, eu instalei como Acento Insesitive, sendo que TF necessita que seja Acento Sensitive.

Na Instalação o IIS, eu instalei o Front Page Extension, sendo que a melhor opção é você não instalar essa opção.

Na Instalação do SPS 2.0, não me exibiu nenhuma opção para escolher e eu instalei normalmente. Após a instalação, o TF me exibiu uma mensagem dizendo que eu deveria instalar o SPS como Server Farm. Mas como não me foi exibida essa opção, fiquei totalmente perdido. Após entrar em vários Fóruns e tentar várias soluções sem sucesso, lembrei que não havia colocado o meu servidor no Domínio e poderia ser a causa do problema. Reinstalei o Windows 2003 e coloquei o mesmo no domínio. Na hora da instalação do SPS, apareceu a opção se Server Farm, resolvendo o problema.

Mas quando pensei que estava tudo funcionando, o relatório de pré-requisitos me retorna tudo OK e a Instalação do TF funcionou, comecei a ter um erro estranho, onde ele não consegui inicializar o Site de administração.

Neste momento e depois de perder uma semana de serviço, resolvi ler a documentação de instalação e seguir os passos. Então eu descobri que tudo o que eu tinha resolvido anteriormente e quebrado a cabeça estava na documentação. Também descobri o que estava originando este último problema. Como não segui os procedimentos que relação aos usuários necessários para instalação, utilizando os usuários locais da minha máquina, alguns serviços não foram configurados da forma correta.

Após formatar a VM e reinstalar tudo novamente, agora seguindo a documentação, tudo funcionou perfeitamente na primeira vez e consegui realizar meus testes com sucesso.

Apenas uma dica para quem vai realizar testes. O TF exige muito Hardware, principalmente memória. Abaixo vai a configuração da máquina que utilizei para realizar os testes:

- Máquina Física
* Memória: 1 GB;
* HD: 120 GB;
* Processador: Pentium IV Dual 3.2 Ghz;

- Máquina Virtual
* Memória: 600 MB ( Após instalar tudo, a VM gasta 500 MB apenas para iniciar. Em algumas situações, chegou a consumir 700MB, gerando paginação e ficando lenta);
* HD: 12 GB (Após a instalação, foram gastados 8 GB);
* processador: 90% do processador principal, o que foi suficiente;


Boa Sorte!!!

Windows – Arquivo de Help da Microsoft bloqueado (CHM)

Recentemente, baixei um arquivo de documentação da Microsoft com extensão CHM e para a minha surpresa não consegui ler o conteúdo do arquivo, que exibia a mensagem de “Página não encontrada”.

A principio, pensei que o problema era com a minha máquina ou com a rede da empresa. Mas depois de tentar ler o arquivo em 3 locais diferentes, descartei está possibilidade.


Como segunda possibilidade, pensei que a documentação da Microsoft estava com problema, então tentei acessar outros arquivos CHM e todos retornaram o mesmo erro.

Como precisava da documentação, pesquisei na Internet e encontrei um artigo no endereço http://support.microsoft.com/kb/896054/ que explica a causa do problema e como resolver.

Resumindo, a Microsoft liberou uma atualização de segurança para Windows XP que bloqueia o conteúdo deste arquivo, que é um conteúdo HTML e pode conter código perigoso para a máquina. Para liberar o conteúdo, você tem que editar uma chave do Registry, manualmente.

Ponto negativo para a Microsoft, pois já que bloquearam os arquivos CHM, deveria liberar a sua documentação em outro formato, como Word ou PDF.

Fico imaginando a quantidade de pessoas que não tiveram paciência para encontrar a solução e desistiram de utilizar uma ferramenta por falta de conhecimento

sábado, dezembro 16, 2006

PowerBuilder - Documentando o código fonte

Recentemente, fui questionado por várias pessoas sobre a necessidade de se documentar o seu código fonte.

Por isso, resolvi publicar dois sites que possuí ferramentas com este objetivo.

http://www.pbdr.com/
http://www.novalys.net/

quarta-feira, dezembro 13, 2006

PowerBuilder - Utilizando FTP

Abaixo vai um código interessante para lista arquivos e diretório no FTP utilizanod a dll do Windows WINInet.dll.

/***Declaração de Estrutura
type win32_find_dataa from structure
unsignedlong dwfileattributes
filetime ftcreationtime
filetime ftlastaccesstime
filetime ftlastwritetime
unsignedlong nfilesizehigh
unsignedlong nfilesizelow
unsignedlong dwreserved0
unsignedlong dwreserved1
character cfilename[260]
character calternatefilename[14]
end type


/*** Declaração de Funções externas
function long InternetOpenA(string lpszAgent, long dwAccessType, string lpszProxyName, string lpszProxyBypass, long dwFlags )&
library "wininet.dll"
function long InternetConnectA(long hInternet, string lpszServerName, int nServerPort, string lpszUsername, &
string lpszPassword, long dwService, long dwFlags, long dwContext) library "wininet.dll"
Function Boolean FtpSetCurrentDirectoryA (long hFtpSession, string lpszDirectory) library "wininet.dll"
Function boolean FtpCreateDirectoryA(Long hConnect, string lpszDirectory) library 'wininet.dll';
Function boolean FtpPutFileA(long hConnect, string lpszLocalFile, string lpszNewRemoteFile, long dwFlags, &
long dwContext) library "wininet.dll"
Function boolean FtpGetFileA(long hConnect, string lpszRemoteFile, string lpszNewFile, boolean fFailIfExists, &
long dwFlagsAndAttributes, long dwFlags, long dwContext) library 'wininet.dll'
Function boolean FtpRenameFileA(Long hConnect, string lpszExisting, string lpszNew) library 'wininet.dll';
Function boolean FtpDeleteFileA(Long hConnect, string lpszFileName) library 'wininet.dll';
Function long InternetCloseHandle(long hInet) library "wininet.dll"
Function long FtpFindFirstFileA (Long hFtpSession , string lpszSearchFile, ref WIN32_FIND_DATAA lpFindFileData , long dwFlags, long dwContent) library "wininet.dll"
Function boolean InternetFindNextFileA (Long hFind, ref WIN32_FIND_DATAA lpvFindData) library "wininet.dll"

/*** Variáveis de instáncia
Constant Public long INTERNET_DEFAULT_FTP_PORT = 21, &
INTERNET_SERVICE_FTP = 1, &
FTP_TRANSFER_TYPE_ASCII = 1, &
FTP_TRANSFER_TYPE_BINARY = 2

Public ProtectedWrite long uol_Hnd_open, uol_Hnd_Conexao
Public ProtectedWrite string uos_servidor, uos_dir_atual, uos_usuario, uos_aplicacao, uos_ftp_dir
Private string uos_senha

/**** Função para conectar no FTP
public function long of_conecta_ftp (string p_aplicacao, string p_servername, string p_usuario, string p_senha);
/*----------------------------------------------------------------------------------*/
/* FAZ A CONEXÃO COM O SERVIDOR PARA TRANSFERÊNCIA VIA FTP */
/* PARÂMETROS: p_aplicacao: Nome da aplicação
p_servername: 'ftp.zzzzz.com.br' ou endereço IP Ex.: '255.255.255.255'
p_usuario e p_senha*/

string vlsnulo

setnull(vlsnulo)
uos_servidor = p_servername
uos_usuario= p_usuario
uos_senha = p_senha
uos_aplicacao = p_aplicacao
uos_ftp_dir = ''

uol_hnd_open = internetopena(uos_aplicacao , 1, vlsnulo, vlsnulo, 0)
if uol_hnd_open = 0 or isnull(uol_hnd_open) then
vismsg = 'Erro ao abrir a conexão. Função API InternetOpen'
return - 1
end if

uol_hnd_conexao= internetconnecta( uol_hnd_open, uos_servidor, &
0,uos_usuario, uos_senha, 1, 0, 0)

if uol_hnd_conexao= 0 or isnull(uol_hnd_conexao) then
vismsg= 'Erro ao abrir a conexão. Função API InternetConnect'
internetclosehandle( uol_hnd_open)
return - 1
end if

return 1
end function


/**** Função para desconectar do FTP
public function long of_desconecta_ftp ();
internetclosehandle( uol_hnd_conexao)
internetclosehandle( uol_hnd_open )

uos_usuario = ''
uos_senha = ''
uos_servidor = ''
uos_aplicacao = ''
uos_dir_atual = ''
uol_hnd_conexao = 0
uol_hnd_open = 0
return 1
end function


/**** Troca o diretório do FTP
public function long of_ftp_set_dir (string p_dir);
if not FtpSetCurrentDirectoryA ( uol_hnd_conexao , p_dir ) then
vismsg = 'Não foi possível encontrar a pasta ' + p_dir + '!'
return -1
end if

//Altera a propriedade uos_ftp_dir (Pasta corrente)
long vll_pos
if p_dir = '\' then
uos_ftp_dir = ''
elseif p_dir = '..' and uos_ftp_dir <> '' then
do while pos(uos_ftp_dir, '\', vll_pos + 1) > 0
vll_pos = pos(uos_ftp_dir, '\', vll_pos + 1)
loop
if vll_pos > 0 then
uos_ftp_dir = left(uos_ftp_dir , vll_pos - 1)
else
uos_ftp_dir = ''
end if
else
uos_ftp_dir += '\' + p_dir
end if
////////////////////
return 1
end function

/**** Renomeia arquivo no FTP
public function long of_ftp_renamefile (string p_nome_ant, string p_nome_atu);
if not FtpRenameFileA(uol_hnd_conexao, p_nome_ant, p_nome_atu) then
vismsg = 'Não foi possível renomear o arquivo ' + uos_ftp_dir + '\'+ p_nome_ant + ' para ' + uos_ftp_dir + &
'\'+ p_nome_atu + '!'
return -1
end if

return 1
end function

/**** Envia arquivo para o FTP
public function long of_ftp_putfile (string p_arquivo_local, string p_arquivo_ftp);
if not ftpputfilea( uol_hnd_conexao, p_arquivo_local, p_arquivo_ftp, ftp_transfer_type_ascii, 0) then
vismsg = 'Erro ao transferir arquivo ' + p_arquivo_local + ' via FTP!'
return -1
end if

return 1
end function

/**** Baixa arquivo do FTP
public function long of_ftp_getfile (string p_remoto, string p_local);
if not FtpGetFileA(uol_hnd_conexao, p_remoto , p_local, false, 0, 1, 0) then
vismsg = 'Não foi possível fazer o download do arquivo '+ uos_ftp_dir + '\'+ p_remoto +' via FTP!'
return -1
end if

return 1
end function

/**** Deleta arquivo do FTP
public function long of_ftp_deletefile (string p_arquivo);if not FTPDeleteFileA(uol_hnd_conexao, p_arquivo) then
vismsg = 'Não foi possível excluir o arquivo ' + uos_ftp_dir + '\'+ p_arquivo + '!'
return -1
end if

return 1
end function


/**** Cria Diretório no FTP
public function long of_ftp_cria_dir (string p_dir);if not this.ftpcreatedirectorya( uol_hnd_conexao , p_dir ) then
vismsg = 'Não foi criar a pasta ' + p_dir + '!'
return -1
end if

return 1
end function


/**** Lista arquivo e diretórios do FTP
public function integer of_ftp_lista_arquivos (string p_filter, ref string p_arquivos[]);
// DESCRIÇÃO:
// * Lista os arquivos existentes no FTP
//
// ARGUMENTOS DE ENTRADA:
// * sfilter : Filtro utilizado para diretórios
// * p_arquivos : Lista de arquivos retornados
//
// RETORNO:
// * 1 : Sucesso
// * -1 : Erro
// * 0 : Registro não encontrado
//
// OBSERVAÇÃO:
// * Lista dos atributos retornados para arquivos
// Public Const FILE_ATTRIBUTE_READONLY = &H1
// Public Const FILE_ATTRIBUTE_HIDDEN = &H2
// Public Const FILE_ATTRIBUTE_SYSTEM = &H4
// Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
// Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
// Public Const FILE_ATTRIBUTE_NORMAL = &H80
// Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
// Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
// Public Const FILE_ATTRIBUTE_OFFLINE = &H1000
//
// CRIADO POR :
// 12/12/2006 - Thiago Campos Pereira
// ALTERADO POR :
//
//========================================================================

long VLLhandleFind, VLLRet, VLLItem
string vlsAux
WIN32_FIND_DATAA VLstrData

//Procura primeiro arquivo no FTP
VLLhandleFind = FtpFindFirstFileA(uol_hnd_conexao, p_Filter, VLstrData, 0, 0)

//Se não encontrar arquivos, sai da função
If VLLhandleFind = 0 then return 1

//Se encontrou arquivo, realizar loop preenchendo vetor com diretórios
do
//Verificar se é arquivo e se não é diretorno
if mod(VLstrData.dwfileattributes , 128) = 0 then
//Se for diretório, armazena nome do diretório
vlsAux = ''
for VLLItem = 1 to upperbound(VLstrData.cfilename)
//No momento que encontrar o caracter 0, quer dizer que é o final do nome do diretório
if asc(VLstrData.cfilename[VLLItem]) = 0 then
p_arquivos[upperbound(p_arquivos) + 1] = vlsAux
exit
else
vlsAux = vlsAux + VLstrData.cfilename[VLLItem]
end if
next
end if

//Procura próximo diretório
if not InternetFindNextFileA(VLLhandleFind, VLstrData) then
VLLhandleFind = 0
end if
loop while VLLhandleFind > 0

return 1
end function