definio de cliente servidor

Transcrição

definio de cliente servidor
1
Introdução
O OpenBASE permite desenvolver aplicativos a partir de diversas plataformas e ambientes de programação
que suportem chamadas a Subrotinas em DLLs e objetos COM, poe exemplo:
•
•
•
•
•
•
•
•
•
•
•
Visual Basic (VB)
Vsual Basic for Applications (VBA)
Delphi
PowerBuilder
Windows Scripting Host (WSH)
Active Server Pages (ASP)
PHP: Hypertext Preprocessor (PHP)
JAVA
TCL/TK
Perl
Python
As ferramentas RAD (Rapid Application Development) possuem, geralmente, as seguintes características:
♦
♦
♦
♦
♦
♦
♦
São linguagens de quarta geração (4GLs)
Utilizam modernas interfaces gráficas (GUIs)
Estão integradas com arquiteturas OOP (Object-Oriented Programming)
Implementam funções de acesso a Bancos de Dados
Suportam, em plataformas Windows, acesso a Bancos de Dados utilizando ODBC, padrão Microsoft
para Open DataBase Connectivity
Invocam funções exportadas a partir de DLLs (Dynamic Link Libraries)
Usam objetos padrão COM (Common Object Model), da Microsoft
As principais ferramentas RAD, no mercado, são as seguintes:
♦
♦
♦
Visual Basic da Microsoft
Delphi da Borland Inprise Corporation
PowerBuilder da PowerSoft
Neste manual apresentamos exemplos utilizando as linguagens Basic (VB), Pascal (Delphi) e C/C++. Os
ambientes de desenvolvimento VB (linguagem Basic) e Delphi (linguagem Pascal) permitem invocar as
funções nativas OpenBASE, escritas em linguagem C/C++.
Todas essas funções estão agrupadas em duas bibliotecas de ligação dinâmica (DLLs), conforme tabela a
seguir:
ROTWIN32.DLL
CLIWIN32.DLL
Biblioteca principal com as rotinas básicas de acesso ao Banco de Dados
OpenBASE.
Similar a biblioteca ROTWIN32.DLL, porém as rotinas são voltadas para
aplicações cliente dentro de uma arquitetura CLIENTE/ SERVIDOR em redes
TCP-IP.
O módulo CLIWIN32.DLL inclui as funções para arquitetura cliente/servidor e permite desenvolver
aplicativos cliente cujos servidores podem residir em qualquer outra plataforma, local ou remota, conforme
veremos nos exemplos apresentados.
Neste manual apresentaremos a sintaxe e os exemplos de programas desenvolvidos em ambientes VB e
Delphi. Porém, esses programas podem ser escritos em qualquer linguagem que permita acessar as funções
das DLLs ROTWIN32.DLL ou CLIWIN32.DLL , passando corretamente os parâmetros necessários.
Ferramentas RAD do OpenBASE – Página 1
2
Utilização das bibliotecas dinâmicas
As rotinas contidas nas bibliotecas dinâmicas ROTWIN32.DLL e CLIWIN32.DLL permitem acessar
Bancos de Dados OpenBASE, recebendo os parâmetros necessários e enviando de volta ao programa os
resultados e os códigos de retorno, conforme explicaremos a seguir.
2.1
Declarações das funções
Antes de utilizar as funções contidas nas bibliotecas dinâmicas ROTWIN32.DLL e CLIWIN32.DLL, é
necessário fazer a declaração dessas funções dentro do programa desenvolvido pelo usuário.
Os apêndices A e B apresentam, respectivamente, os arquivos tsgbd.bas e tsgbd.pas contendo a
declaração de todas as funções incluídas nas bibliotecas dinâmicas ROTWIN32.DLL e CLIWIN32.DLL, a
serem utilizadas em sistemas desenvolvidos em Visual Basic e Delphi.
Veja a seguir a sintaxe utilizada na declaração de funções em linguagens C, Basic e Pascal.
Linguagem C:
_declspec(dllexport)int_stdcall nome>(<par1>,...,<parn>)
Linguagem Basic
Declare Function <nome> Lib rotwin32.dll”(<par1>,..,<parn>) as long
Linguagem Pascal:
function<nome>(<par1>;...;<parn>):interger;stdcall;external ‘rotwin32.dll’;
2.2
Passagem de parâmetros
...
...
...
2.2.1 Parâmetros Numéricos
32bits
16 bits
C
int, long
Short
Basic
Long
Integer
Pascal
Interger, longint
Smallint
2.2.2 Parâmetros Cadeia
Linguagem C:
<func>(...,char cad,...) char cad[nnn];
strcpy(cad,”EXEMPLO”);
<func>(...,cad,...);
Linguagem Basic:
<func>(...,byval cad as string,...)
dim cad as string * nnn
cad=“EXEMPLO”
<func>(...,cad,...)
Linguagem Pascal:
<func>(...;cad:PChar;...) cad:array[0..nnn] of Char;
cad:= ‘EXEMPLO’;
<func>(...,@cad,...);
2.2.3 Parâmetros Registros
Linguagem C:
<func>(...,char *<nome>,...) struct<nome>{
char<item>[nnn];
Ferramentas RAD do OpenBASE – Página 2
};
struct<nome>reg;
strcpy(reg<item>,”DADO”;
<func>(...,reg,...);
Linguagem Basic:
<func>(...,<nome> as Any,...)
Type<nome>
<item> as string * nnn
end Type
Dim reg as <nome>
reg<item>=“DADO”
<func>(...,reg,...)
Linguagem Pascal:
<func>(...;<nome>:Pointer;...)
<nome>=Packed Record
<item>:array[0..nnn] of Char;
End;
reg:<nome>;
reg.item:=“DADO”;
2.2.4 Parâmetros Listas de Nomes
Linguagem C:
<func>(...,struct Itens *lis,...)struct Itens{
char item [12][xx];
};
struct Itens lis;
strcpy(lis.item[0],”NOME”);
strcpy(lis.item[1],”IDADE);
strcpy(lis.item[2],””);
<func>(...,lis,...);
Linguagem Basic:
<func>(...,lis as any,...)
Type Itens
item0 as string * 12
item1 as string * 12
...
itemxx as string * 12
End Type
Dim lis as Itens
lis.item0=“Nome”
lis.item1=“IDADE”
lis.item2=“”
Linguagem Pascal:
<func>(...,lis:Pointer,...);
lis=packed record
item array[0..12,0..xx]of Charr
end;
2.2.5 Lista de itens
Algumas rotinas de leitura, inclusão e alteração de registros possuem as palavras Registro ou Todo como
opção, no nome da própria rotina. Estas duas palavras no nome da rotina, ao ser executada, não obriga a
mesma a ter que passar a Lista dos Itens que se deseja ler ou gravar.
Porém, se a rotina for executada sem essas opções, por exemplo, LeProximoSequencial ou
IncluiRegistro, a lista deverá ser passada como parâmetro.
Se for especificada uma dessas opções (ou seja, Registro ou Todo), por exemplo,
LeProximoRegistroSequencial ou IncluiTodoRegistro, fica subentendido que se deseja tratar todo o
registro, exatamente como foi definido pelo esquema.
A seguir é mostrada a maneira correta de se preparar a lista dos itens, caso se prefira utilizar a rotina com a
lista, ou seja, swem especificar as opções Registro ou Todo, conforme cada caso.
Sintaxe:
Ferramentas RAD do OpenBASE – Página 3
<var.Lista> = “%%<item1>,<item2>,…,<itemN>”
Exemplo Visual Basic:
Declare Lista as String
Lista = “%%IDADE,NOMEP”
Exemplo Delphi
Var
Lista: Array[1..20] of Char;
Begin
Lista = “%%IDADE,NOMEP”;
End;
3
Funções disponíveis nas bibliotecas dinâmicas
As funções (ou rotinas) incluídas nas bibliotecas dinâmicas ROTWIN32.DLL e CLIWIN32.DLL permitem
efetuar o acesso e controle de Bancos de Dados OpenBase.
Podemos agrupar todas as funções disponíveis em categorias, conforme a seguir:
Categoria das funções
Leitura Sequencial
Leitura por Cadeia
Leitura por Prefixo
Leitura por Chave Primária
Leitura por Endereço
Inclusão, Exclusão e Alteração de Registro
Conexão e Controle de Bancos
Manipulação de Memos
Nome das funções
ReiniciaCadeia
LeProximo[Registro]Sequencial
Le[Registro]AnteriorSequencial
EscolheChave
ObtemRegistrosNoArquivo
IniciaCadeia
LeProximo[Registro]Cadeia
Le[Registro]AnteriorCadeia
PosicionaNoRegistroPorChave
ObtemRegistrosNaCadeia
IniciaPorPrefixo
LeProximo[Registro]PorPrefixo
Le[Registro]AnteriorPorPrefixo
Le[Registro]PorChavePrimaria
Le[Registro]PorEndereco
PosicionaNoRegistro
ObtemEnderecoAtual
ExcluiRegistro
ExcluiRegistroCascata
ExcluiRegistroPoeNulo
Inclui[Todo]Registro
Inclui[Todo]RegistroNaCadeia
Altera[Todo]Registro
Altera[Todo]RegistroCascata
Altera[Todo]RegistroPoeNulo
AbreBancoDeDados
FechaBancoDeDados
JuntaBancoDeDados
IniciaServidor
FinalizaServidor
PegaGravaItemMemo
LePoeItemMemo
ExcluiItemMemo
ObtemPercursoItemMemo
ObtemTamanhoMemo
Ferramentas RAD do OpenBASE – Página 4
Categoria das funções
Itens especiais
Rotinas Genéricas
Rotinas para Obter Informações
Nome das funções
PoeItem
PegaItem
Bloqueia
Desbloqueia
SalvaTabelaExecucao
RestauraTabelaExecucao
IniciaTransacao
FinalizaTransacao
DesfazTransacao
LigaOpcao
DesligaOpcao
EsvaziaArquivo
Crypt
ObtemItensDoArquivo
ObtemInfoSobreItem
ObtemQtdChaves
ObtemChaves
ObtemNumeroDoItem
ObtemInfoSobreArquivo
ObtemQtdLigacoes
ObtemLigacoes
ObtemNumeroDoArquivo
ObtemQtdDeJuncoes
ObtemJuncoes
ObtemQtdVirtuais
ObtemVirtuais
ObtemTipoDaChave
ObtemQtdItensBasicos
ObtemItensBasicos
ObtemQtdRedefinicoes
ObtemRedefinicoes
ObtemNiveis
ObtemInfoSobreBanco
ObtemInfoSobreCadeia
ObtemDiretorio
ObtemCliente
ObtemMensagem
A seguir relacionamos todas as funções (ou rotinas) contidas nas bibliotecas dinâmicas ROTWIN32.DLL e
CLIWIN32.DLL, especificando para cada função:
• Objetivo
• Utilização
• Sintaxe
• Parâmetros
• Exemplos
3.1
AbreBancoDeDados
Objetivo e utilização:
Esta rotina serve para abrir um Banco de Dados OpenBASE.
Sintaxe:
AbreBancoDeDados(char * banco, char * nível, long segurança, int modo)
Parâmetros:
Ferramentas RAD do OpenBASE – Página 5
Banco
Nome do arquivo dicionário do Banco de Dados, deve incluir o percurso quando
diferente do percurso default.
Nível
Palavra de nível.
Segurança
Código de segurança.
Modo
Modo de abertura.
Exemplo em Delphi:
var
pbanco,
pnivel : PChar;
begin
pbanco := stralloc(50);
pbanco := StrNew('/usr1/clientes/dahruj/teste');
pnivel := stralloc(20);
pnivel := StrNew('a');
ret := AbreBancoDeDados(pBanco,pNivel,1,2);
StrDispose(pNivel);
StrDispose(pbanco);
end;
Exemplo em VB:
3.2
LigaOpcao
Objetivo e utilização:
O default de LigaOpcao é Opcao desligada.
Sintaxe:
LigaOpcao(char *opc)
Parâmetros:
Exemplo em Delphi:
var
opt: Array[0..100] of Char;
begin
opt := 'century';
ret := LigaOpcao(@opt);
end;
Exemplo em VB:
3.3
DesligaOpcao
Objetivo e utilização:
Deve ser utilizada após o uso das rotinas que requerem a rotina LigaOpcao.
Sintaxe:
DesligaOpcao(char *opc)
Parâmetros:
Exemplos:
Ferramentas RAD do OpenBASE – Página 6
Nas funções LigaOpção/DesligaOpção para se ligar/desligar a opção de abrir todos os arquivos de um
banco foi incluida a opção “open”, por exemplo:
ret=DesligaOpção(“open”)
Para se ligar/desligar a opção de século foi incluida a opção “century”, por exemplo:
ret=LigaOpção(“century”)
3.4
FechaBancoDeDados
Objetivo e utilização:
Fecha um Banco de Dados previamente aberto.
Sintaxe:
FechaBancoDeDados( )
Parâmetros:
Exemplo em Delphi:
var
ret: integer;
begin
ret := FechaBancoDeDados;
end;
Exemplo em VB:
3.5
LeProximoSequencial
Objetivo e utilização:
Esta rotina Possibilita a leitura seqüencial dos ítens de um arquivo ou dos ítens de outro arquivo
relacionado ao arquivo selecionado, através de chaves primária e estrangeira.
Lê o próximo registro em um Arquivo do Banco de Dados. Os ítens a serem lidos, podem ser especificados
com uma string iniciada com %% e seguida dos nomes dos ítens separados por vírgulas.
Rotina utilizada, quando a linguaguem de programação for Visual Basic, onde se passa a lista de
itens(vetor). Não é passado o endereço do vetor,e sim o endereço da estrutura que define o vetor.
Indica a opção array para o uso das rotinas: LeProximoSequencial, LeAnteriorSequencial,
LePorEndereco, LeProximaCadeia, LeAnteriorCadeia, LeProximoPorPrefixo,
LeAnteriorPorPrefixo, LePorChavePrimaria, IncluiRegistro, AlteraRegistro e
IncluiRegistroNaCadeia.
No Visual Basic a lista de itens (2o parâmetro) tem que ser um vetor do tipo Itens e pode conter itens de
arquivos ligados ao lido(join automático). A área de leitura(3o parâmetro) deve ser uma estrutura(Type) não
devendo ser uma string por causa da declaração do parametro ser do tipo Any.
Sintaxe:
LeProximoSequencial(char * arquivo, struct Itens * itens, char* área)
Ret=LeProximoSequencial ( “Arquivo”, “%% item1, itemn”, buffer).
Parâmetros:
Arquivo
Itens
Área
Nome do arquivo do Banco de Dados que será lido.
Lista de nomes de itens, do arquivo ou de outros arquivos entidades ligados, que serão lidos.
Esta lista deve ser um vetor de estruturas Itens contíguas terminando por uma vazia(em
branco). struct Itens { char item[13] };
Área para onde será lido os itens listados no parâmetro anterior, deve ter no mínimo o
tamanho igual a soma dos tamanhos dos itens.
Exemplos:
nome: arq1 E
codigo(1)
texto
U01
U20
Ferramentas RAD do OpenBASE – Página 7
nome: arq2 R
codigo2 (arq1)U01
LeProximoSequencial (“arq2”, “%% codigo2, texto”, buffer).
Exemplos:
Dim vi(2) as Itens
Dim al as regpes
Dim ret as long
vi(0).NomIte=“NOMEP”
vi(1).NomIte=“IDADE”
ret=LeProximoSequencial(“PESSOA”,vi,al)
onde:
Type Itens
NomIte as string * 13
End type
Type regpes
NOMEP as string * 10
IDADE as string * 2
End type
3.6
LeAnteriorSequencial
Objetivo e utilização:
Lê o registro anterior em um Arquivo do Banco de Dados, recebe parâmetros idênticos aos da rotina
anterior.
Sintaxe:
LeAnteriorSequencial(char * arquivo, struct Itens * itens, char * área)
Parâmetros:
Exemplos:
3.7
ReiniciaSequencial
Objetivo e utilização:
Retorna o ponteiro de leitura seqüencial para inicio/fim do Arquivo. Uma chamada a seguir da rotina
LeProximoSequencial devolverá o primeiro registro no arquivo, já uma chamada a
LeAnteriorSequencial retornará o último registro. Recebe um único parâmetro correspondente ao nome
do arquivo a ser reinicializado.
Sintaxe:
ReiniciaSequencial(char * arquivo)
Parâmetros:
Exemplo em Delphi:
var
ret: integer;
Arquivo: Array[0..4] of Char;
begin
Arquivo : = ‘arq1’;
ret := ReiniciaSequencial(@Arquivo);
end;
Ferramentas RAD do OpenBASE – Página 8
Exemplo em VB:
3.8
IniciaCadeia
Objetivo e utilização:
Seleciona uma cadeia, ou seja um conjunto de registros em um Arquivo que um dado item Chave tenha o
mesmo Valor. Torna os registros selecionados disponíveis para a leitura por LeProximoCadeia e
LeAnteriorCadeia, os parâmetros são:
Sintaxe:
IniciaCadeia(char * arquivo, char * chave, char * valor)
Parâmetros:
Arquivo
Chave
Valor
Nome do arquivo do Banco de Dados aberto.
Nome do item chave do arquivo.
Valor do item chave a selecionar, deve ser uma cadeia de caracteres ASCII do mesmo
tamanho e conteúdo compatível com o item chave.
Exemplo em Delphi:
var
Arquivo,
chave,
valor : Array[0..30] of Char;
begin
Arquivo := ‘arq1’;
chave := 'chave';
valor := '55';
ret := IniciaCadeia(@Arquivo,@chave,@valor);
end;
Exemplo em VB:
3.9
LeProximoCadeia
Objetivo e utilização:
Lê o próximo registro selecionado por IniciaCadeia do primeiro ao último. Os registros serão lidos na
ordem em que foram incluídos, os parâmetros são compatíveis com os do mesmos nome descritos acima.
Sintaxe:
LeProximoCadeia(char * arquivo, struct Itens * itens, char * área)
Parâmetros:
Exemplo em Delphi:
begin
Arquivo := ‘arq1’;
ret := LeProximoRegistroCadeia(@Arquivo,@reg);
if ret = -1 then
begin
{Fim de Arquivo - EOF}
end
else if ret = 0 then
begin
{Achou registro para esta pesquisa}
end
Ferramentas RAD do OpenBASE – Página 9
else
begin
{Aqui ret é maior que 0 – Deu erro}
ret := ObtemMensagem(@msg);
ShowMessage(msg);
end;
end;
Exemplo em VB:
3.10 LeAnteriorCadeia
Objetivo e utilização:
Lê o registro anterior selecionado por IniciaCadeia do último ao primeiro. Os registros serão lidos na ordem
inversa em que foram incluídos, os parâmetros são compatíveis com os do mesmos nome descritos acima.
Sintaxe:
LeAnteriorCadeia (char * arquivo, struct Itens * itens, char * área)
Parâmetros:
Exemplo em Delphi:
begin
Arquivo := ‘arq1’;
ret := LeRegistroAnteriorCadeia(@Arquivo,@reg);
if ret = -1 then
begin
{Início de Arquivo - EOF}
end
else if ret = 0 then
begin
{Achou registro para esta pesquisa}
end
else
begin
{Aqui ret é maior que 0 – Deu erro}
ret := ObtemMensagem(@msg);
ShowMessage(msg);
end;
end;
Exemplo em VB:
3.11 PosicionaNoRegistro
Objetivo e utilização:
Numa leitura seqüencial posiciona o ponteiro de leitura de Arquivo no registro cujo endereço físico é
passado no parâmetros Endereço.
Sintaxe:
PosicionaNoRegistro(char * arquivo, long endereço)
Parâmetros:
Ferramentas RAD do OpenBASE – Página 10
Exemplos:
3.12 LePorEndereco
Objetivo e utilização:
Lê um registro do Arquivo do Banco de Dados por seu Endereço físico, os parâmetros Arquivo, Itens e
Área são idênticos aos descritos acima, Endereço representa o endereço físico do registro a ser lido.
Sintaxe:
LePorEndereco(char * arquivo, struct Itens * itens, char * área, long endereço)
Parâmetros:
Exemplos:
3.13 IniciaPorPrefixo
Objetivo e utilização:
Seleciona uma cadeia por prefixo, ou seja um conjunto de registros em um Arquivo que um dado item
Chave do tipo cadeia se inicie pelo mesmo Valor, torna os registros selecionados disponíveis para a leitura
com as duas rotinas descritas a seguir. Os parâmetros são similares aos do IniciaCadeia, sendo que o
parâmetro Valor deve ter um tamanho menor ou igual ao do item Chave.
Sintaxe:
IniciaPorPrefixo(char * arquivo, char * chave, char * valor)
Parâmetros:
Exemplo em Delphi:
var
Arquivo,
chave,
valor : Array[0..30] of Char;
begin
Arquivo := ‘arq1’;
chave := 'chave';
valor := '55';
ret := IniciaCadeia(@Arquivo,@chave,@valor);
end;
Exemplo em VB:
3.14 LeProximoPorPrefixo
Objetivo e utilização:
Lê o próximo registro selecionado por IniciaPorPrefixo a partir do primeiro até o último em ordem
alfabética da Chave selecionada. Os parâmetros são compatíveis com os do mesmos nome descritos acima.
Sintaxe:
LeProximoPorPrefixo(char *arquivo, struct Itens *itens, char *área)
Parâmetros:
Exemplo em Delphi:
begin
Arquivo := ‘arq1’;
ret := LeProximoRegistroPorPrefixo(@Arquivo,@reg);
if ret = -1 then
Ferramentas RAD do OpenBASE – Página 11
begin
{Fim de Arquivo - EOF}
end
else if ret = 0 then
begin
{Achou registro para esta pesquisa}
end
else
begin
{Aqui ret é maior que 0 – Deu erro}
ret := ObtemMensagem(@msg);
ShowMessage(msg);
end;
end;
Exemplo em VB:
3.15 LeAnteriorPorPrefixo
Objetivo e utilização:
Lê o registro anterior selecionado por IniciaPorPrefixo a partir do último até o primeiro em ordem
alfabética invertida da Chave selecionada. Os parâmetros são compatíveis com os do mesmos nome
descritos acima.
Sintaxe:
LeAnteriorPorPrefixo(char * arquivo, struct Itens *itens, char *área)
Parâmetros:
Exemplo em Delphi:
begin
Arquivo := ‘arq1’;
ret := LeRegistroAnteriorPorPrefixo(@Arquivo,@reg);
if ret = -1 then
begin
{Início de Arquivo - EOF}
end
else if ret = 0 then
begin
{Achou registro para esta pesquisa}
end
else
begin
{Aqui ret é maior que 0 – Deu erro}
ret := ObtemMensagem(@msg);
ShowMessage(msg);
end;
end;
Exemplo em VB:
Ferramentas RAD do OpenBASE – Página 12
3.16 LePorChavePrimaria
Objetivo e utilização:
Lê um registro de um Arquivo entidade, cuja chave primária seja igual ao parâmetros Valor.
Sintaxe:
LePorChavePrimaria(char * arquivo, char * valor, struct Itens *itens, char * área)
Parâmetros:
Exemplos:
3.17 EscolheChave
Objetivo e utilização:
Seleciona um item chave de arquivo para ordenação da leitura sequencial. Por default, é assumido o
primeiro item chave do arquivo referenciado.
Sintaxe:
EscolheChave(char * arquivo, char * chave)
Parâmetros:
Exemplo em Delphi:
var
Arquivo,
Chave: Array[0..5] of Char;
begin
Arquivo := 'arq1';
Chave := 'Texto';
ret := EscolheChave(@Arquivo,@Chave);
end;
Exemplo em VB:
3.18 ExcluiRegistro
Objetivo e utilização:
Exclui no arquivo o último registro lido.
Sintaxe:
ExcluiRegistro(char * arquivo)
Parâmetros:
Exemplo em Delphi:
var
Arquivo: Array[0..5] of Char;
begin
Arquivo := 'arq1';
ret := ExcluiRegistro(@Arquivo);
end;
Exemplo em VB:
Ferramentas RAD do OpenBASE – Página 13
3.19 ExcluiRegistroCascata
Objetivo e utilização:
Indica exclusão do registro e seus subordinados com a opção cascata.
Sintaxe:
ExcluiRegistroCascata(char *arq)
Parâmetros:
Exemplos:
3.20 ExcluiRegistroPoeNulo
Objetivo e utilização:
Sintaxe:
ExcluiRegistroPoeNulo(char *arq)
Parâmetros:
Exemplos:
3.21 IncluiRegistro
Objetivo e utilização:
Inclui no Arquivo um registro com os itens listados em Itens assumindo os valores passados em Área.
Sintaxe:
IncluiRegistro(char * arquivo, struct Itens * itens, char * área)
Parâmetros:
Exemplo em Delphi:
Exemplo em VB:
3.22 AlteraRegistro
Objetivo e utilização:
Altera no último registro lido em arquivo, os itens listados em Itens pelos valores passados em Área.
Sintaxe:
AlteraRegistro(char * arquivo, struct Itens * itens, char * área)
Parâmetros:
Exemplo em Delphi:
Exemplo em VB:
Ferramentas RAD do OpenBASE – Página 14
3.23 AlteraRegistroCascata
Objetivo e utilização:
Altera um item do registro, com a opção de modificação em cascata, ou seja, altera todos os itens
suboordinados a este.
Sintaxe:
AlteraRegistroCascata(char *arq, struct itens *ite, char *buf)
Parâmetros:
Exemplo em Delphi:
Exemplo em VB:
3.24 AlteraTodoRegistroCascata
Objetivo e utilização:
Altera todo registro de um arquivo, com a opção de modificação em cascata, ou seja, altera todos os
registros suboordinados a este.
Sintaxe:
AlteraTodoRegistroCascata(char *arq, char *buf)
Parâmetros:
Exemplos:
3.25 AlteraRegistroPoeNulo
Objetivo e utilização:
Permite a alteração de um item do registro, atribuindo nulo aos itens suboordinados a este.
Sintaxe:
AlteraRegistroPoeNulo(char *arq,struct itens *ite,char *buf)
Parâmetros:
Exemplo em Delphi:
Exemplo em VB:
3.26 AlteraTodoRegistroPoeNulo
Objetivo e utilização:
Permite a alteração de todo registro de um arquivo, atribuindo nulo nos registros subordinados a este.
Sintaxe:
AlteraTodoRegistroPoeNulo(char *arq,struct itens *ite,char *buf)
Parâmetros:
Exemplo em Delphi:
Ferramentas RAD do OpenBASE – Página 15
Exemplo em VB:
3.27 IniciaTransacao ou Bloqueia
Objetivo e utilização:
Inicia uma transação. Todas as alterações feitas no Banco de Dados após esta rotina e antes da rotina
FinalizaTransação constituirão uma transação lógica e serão desfeitas em conjunto se for usado a rotina
DesfazTransacao ou o utilitário BDRECU.
Sintaxe:
IniciaTransacao() ou Bloqueia(void)
Parâmetros:
Exemplos:
3.28 FinalizaTransacao ou Desbloqueia
Objetivo e utilização:
Finaliza a transação iniciada por IniciaTransacao, após esta rotina as alterações anteriormente feitas no
Banco de Dados não serão desfeitas.
Sintaxe:
FinalizaTransacao() ou Desbloqueia(void)
Parâmetros:
Exemplos:
3.29 DesfazTransacao
Objetivo e utilização:
IniciaTransacao, desde que não tenha sido executada uma rotina FinalizaTransacao após a última
IniciaTransacao.
Sintaxe:
DesfazTransacao()
Parâmetros:
Exemplos:
3.30 SalvaTabelaExecucao
Objetivo e utilização:
Salva a tabela de execução do Arquivo, na Área de memória passada. A tabela de execução é formada por
um conjunto de ponteiros para leitura e gravação no Arquivo ocupando 50 bytes de memória.
Sintaxe:
SalvaTabelaExecucao(char * arquivo, char area[50])
Parâmetros:
Exemplos:
3.31 RestauraTabelaExecucao
Objetivo e utilização:
Ferramentas RAD do OpenBASE – Página 16
Restaura a tabela de execução anteriormente salva em Área pela o rotina SalvaTabelaExecucao.
Sintaxe:
RestauraTabelaExecucao(char * arquivo, char area[50])
Parâmetros:
Exemplos:
3.32 ObtemMensagem
Objetivo e utilização:
Coloca em Mensagem a última mensagem de erro ocorrida no acesso ao Banco de Dados. Mensagem deve
apontar para uma área de no mínimo 100 bytes. Retorna sempre zero.
Sintaxe:
ObtemMensagem(char * mensagem)
Parâmetros:
Exemplo em Delphi:
var
msg: Array[0..100] of Char;
begin
...
if ret <> 0 then
begin
ret := ObtemMensagem(@msg);
ShowMessage(msg);
end;
end;
Exemplo em VB:
3.33 ObtemEnderecoAtual
Objetivo e utilização:
Retorna o endereço físico do último registro lido no Arquivo ou zero se nenhum registro foi lido, pode ser
usado para se testar fim de arquivo (EOF) após uma leitura.
Sintaxe:
ObtemEnderecoAtual(char * arquivo)
Parâmetros:
Exemplos:
3.34 ObtemRegistrosNoArquivo
Objetivo e utilização:
Retorna o numero de registros no Arquivo.
Sintaxe:
ObtemRegistrosNoArquivo(char * arquivo)
Parâmetros:
Exemplos:
Ferramentas RAD do OpenBASE – Página 17
3.35 ObtemRegistrosNaCadeia
Objetivo e utilização:
Retorna o numero de registros na cadeia, isto é o número de registros selecionados pela última execução da
rotina IniciaCadeia no Arquivo.
Sintaxe:
ObtemRegistrosNaCadeia(char * arquivo)
Parâmetros:
Exemplos:
3.36 ObtemRegistrosComPrefixo
Objetivo e utilização:
Retorna o número de registros selecionados pela rotina IniciaPorPrefixo.
Sintaxe:
IniciaPorPrefixo (Arquivo, Item, CadeiaCaracter)
ObtemRegistrosComPrefixo (Arquivo)
Parâmetros:
Arquivo
Item
CadeiaCaracter
Arquivo do Banco de Dados aberto
Campo do arquivo em cima do qual será feita a pesquisa
Texto que será pesquisado
Exemplos:
IniciaPorPrefixo ("pessoa", "nome", "Ana")
ObtemRegistrosComPrefixo ("pessoa")
3.37 PoeItem
Objetivo e utilização:
Converte o conteúdo da variável de memória entra para o endereço sai no buffer do registro, esta posição
deve ser correspondente ao item do Banco de Dados itemp.
Sintaxe:
PoeItem (char * itemp, char * sai, char * entra)
Parâmetros:
Exemplos:
3.38 PegaItem
Objetivo e utilização:
Converte o conteúdo do endereço Entra no buffer do registro para variável de memória Sai, esta posição no
buffer de leitura deve ser correspondente ao item do Banco de Dados itemp.
Sintaxe:
PegaItem (char * itemp, char * entra, char * sai)
Parâmetros:
Exemplos:
3.39 PoeItemBuffer
Objetivo e utilização:
Ferramentas RAD do OpenBASE – Página 18
Converte o conteúdo da variável de memória Entra para o endereço do buffer do registro sai , na posição
indicada por pos.
Sintaxe:
PoeItemBuffer (char * itemp, char * sai, int pos, char * entra)
Parâmetros:
Exemplos:
3.40 PegaItemBuffer
Objetivo e utilização:
Converte o conteúdo do endereço entra do buffer do registro sai, na posição indicada por pos, para
variável de memória sai, esta posição no buffer de leitura deve ser correspondente ao item do Banco de
Dados itemp.
Sintaxe:
PegaItemBuffer (char * itemp, char * entra, int pos, char * sai)
Parâmetros:
Exemplos:
3.41 LeProximoRegistroSequencial
Objetivo e utilização:
Similar a LeProximoSequencial porém não necessita de que seja passada a lista de itens, ou seja, todos os
itens são retornados.
Sintaxe:
LeProximoRegistroSequencial(char * arquivo, char * área)
Parâmetros:
Exemplos:
3.42 LeRegistroAnteriorSequencial
Objetivo e utilização:
Similar a LeAnteriorSequencial porém não necessita de que seja passada a lista de itens, ou seja, todos os
itens são retornados.
Sintaxe:
LeRegistroAnteriorSequencial(char * arquivo, char * área)
Parâmetros:
Exemplos:
3.43 LeProximoRegistroCadeia
Objetivo e utilização:
Similar a LeProximoCadeia porém não necessita de que seja passada a lista de itens, ou seja, todos os
itens são retornados.
Sintaxe:
LeProximoRegistroCadeia(char * arquivo, char * área)
Parâmetros:
Exemplos:
Ferramentas RAD do OpenBASE – Página 19
3.44 LeRegistroAnteriorCadeia
Objetivo e utilização:
Similar a LeAnteriorCadeia porém não necessita de que seja passada a lista de itens, ou seja, todos os
itens são retornados.
Sintaxe:
LeRegistroAnteriorCadeia(char * arquivo, char * área);
Parâmetros:
Exemplos:
3.45 LeRegistroPorEndereco
Objetivo e utilização:
Similar a LePorEndereco porém não necessita de que seja passada a lista de itens, ou seja, todos os itens
são retornados.
Sintaxe:
LeRegistroPorEndereco(char * arquivo, char * área, long endereço);
Parâmetros:
Exemplos:
3.46 LeProximoRegistroPorPrefixo
Objetivo e utilização:
Similar a LeProximoPorPrefixo porém não necessita de que seja passada a lista de itens, ou seja, todos os
itens são retornados.
Sintaxe:
LeProximoRegistroPorPrefixo(char * arquivo, char * área);
Parâmetros:
Exemplos:
3.47 LeRegistroAnteriorPorPrefixo
Objetivo e utilização:
Similar a LeAnteriorPorPrefixo porém não necessita de que seja passada a lista de itens, ou seja, todos os
itens são retornados.
Sintaxe:
LeRegistroAnteriorPorPrefixo(char * arquivo, char * área);
Parâmetros:
Exemplos:
3.48 LeRegistroPorChavePrimaria
Objetivo e utilização:
Similar a LePorChavePrimaria porém não necessita de que seja passada a lista de itens, ou seja, todos os
itens são retornados.
Sintaxe:
LeRegistroPorChavePrimaria(char * arquivo, char * valor, char * área);
Parâmetros:
Ferramentas RAD do OpenBASE – Página 20
Exemplos:
3.49 IncluiTodoRegistro
Objetivo e utilização:
Similar a IncluiRegistro porém não necessita de que seja passada a lista de itens, ou seja, todos os itens
devem ser passados.
Sintaxe:
IncluiTodoRegistro(char * arquivo, char * área);
Parâmetros:
Exemplos:
3.50 AlteraTodoRegistro
Objetivo e utilização:
Similar a AlteraRegistro porém não necessita de que seja passada a lista de itens, ou seja, todos os itens
devem ser passados.
Sintaxe:
AlteraTodoRegistro(char * arquivo, char * área);
Parâmetros:
Exemplos:
3.51 JuntaBancoDeDados
Objetivo e utilização:
Reúne o Banco de Dados passados pelos parâmetros, ao banco aberto anteriormante, incorporando o seu
dicioário ao dicionário do banco já aberto e inserindo os arquivos entidade como tabelas do banco já
existente, e os arquivos relacionamentos como consultas(visões). Tais arquivos não poderão ser
atualizados, apenas consultados.
Permite com isto, abrir mais de um Banco de Dados, para uma mesma aplicação.
Sintaxe:
JuntaBancoDeDados(char*,char*,long,int);
Parâmetros:
Exemplos:
3.52 EsvaziaArquivo
Objetivo e utilização:
Indica o arquivo a ser esvaziado.
Sintaxe:
EsvaziaArquivo(char *arq)
Parâmetros:
Exemplos:
3.53 ObtemItensDoArquivo
Objetivo e utilização:
Obtem a lista de itens que compõem um arquivo, dado o número do arquivo.
Sintaxe:
ObtemItensDoArquivo(int NoArq,struct Info11 *items)
Ferramentas RAD do OpenBASE – Página 21
Parâmetros:
Exemplos:
struct info11{
short QtdIte; //Quantidde de itens no registro.
short NumIte; //Lista dos Itens na ordem do registro.
};
3.54 ObtemInfoSobreItem
Objetivo e utilização:
Obtem Informacão detalhada sobre o item, dado o seu número.
Sintaxe:
ObtemInfoSobreItem(int No Item,struct Info12*items)
Parâmetros:
Exemplos:
struct Info12{
// num seq do arq mestre se o item for chave senão retorna zero.
short NuArCh;
short NivLei; // nível de leitura;
short NivGra; // nível de gravação
short NumArq; // o número sequencial do arquivo ao qual este item pertence
shortTamIte; // tamanho do item
// posição deste item no dicionário - deslocamento em bytes no registro
short PosIte;
short QtdDec; // quantidade de casas decimais deste item
char NomIte[13]; // nome do item
char TipIte[1]; // tipo deste item
};
3.55 ObtemQtdChaves
Objetivo e utilização:
Obtem a quantidade de itens chaves no arquivo de dados, dado o seu número.
Sintaxe:
ObtemQtdChaves(int NoArq,struct Info13a*itens);
Parâmetros:
Exemplos:
struct Info13a{
short QtItCh;// Quantidade de itens chave no arquivo
};
3.56 ObtemChaves
Objetivo e utilização:
Sintaxe:
ObtemChaves(int NoArq,struct Info13b*itens);
Parâmetros:
Exemplos:
Struct Info13b {
Ferramentas RAD do OpenBASE – Página 22
// Obtem a relação dos itens chave no arquivo de dados
short NuArqM; // Lista dos arquivos mestres correspondentes aos itens, se existirem itens que sejam chaves
estrangeiras no arquivo.
short NuLigM;// Lista das ligações de itens que são chave estrangeira no arquivo.
short NuChaD; //Lista dos números dos itens chaves no arquivo.
};
3.57 ObtemNumeroDoItem
Objetivo e utilização:
Obtem o número sequencial do item, dado o seu número.
Sintaxe:
ObtemNumeroDoItem(char*NomeItem,struct Info14 *itens);
Parâmetros:
Exemplos:
struct Info14{
short NumIte; //Número do item
};
3.58 ObtemInfoSobreArquivo
Objetivo e utilização:
Obtem informação detalhada sobre o arquivo de dados.
Sintaxe:
ObtemInfoSobreArquivo(int NoArq ,struct Info15 *itens);
Parâmetros:
Exemplos:
struct Info15 {
short TamCab; // Tamanho do cabeçalho do arquivo
short TamDad; // Tamanho dos dados no arquivo
// Número do arquivo no esquema, se o tipo do arquivo for T(Tabela) ou C(Consulta).
short NumEsq;
short TamVir; // Tamanho dos dados virtuais
short TamTot; // Tamanho total do registro
char NomArq[13]; // Nome do arquivo.
char DirArq[41]; // Diretório do arquivo.
char TipArq[1]; // Tipo do arquivo.
};
3.59 ObtemQtdLigacoes
Objetivo e utilização:
Obtem a quantidade de links em um arquivo de dados..
Sintaxe:
ObtemQtdLigacoes(int NoArq ,struct Info16a *itens);
Parâmetros:
Exemplos:
struct Info16a{
short QtArqD; // Quantidade de ligações no arquivo.
short NuItCh; // Número do item chave primária no arquivo mestre.
};
Ferramentas RAD do OpenBASE – Página 23
3.60 ObtemLigacoes
Objetivo e utilização:
Dado o número do arquivo entidade(mestre), retorna informações sobre os arquivos subordinados a ele.
Sintaxe:
ObtemLigacoes(int NoArq ,struct Info 16b *itens);.
Parâmetros:
Exemplos:
struct Info16b{
short NuArqD; // Lista dos arquivos detalhe
short NuLigD; // Lista dos ligações correspondentes
short NuIteD; // Lista dos itens chaves correspondentes
};
3.61 ObtemNumeroDoArquivo
Objetivo e utilização:
Obtem o número sequencial do arquivo de dados. (Entrada para info15).
Sintaxe:
ObtemNumeroDoArquivo(char *NomeArq,struct Info17 *itens);
Parâmetros:
Exemplos:
struct Info17{
short NumArq; // Número do arquivo.
};
3.62 ObtemQtdJuncoes
Objetivo e utilização:
Obtem quantidade de arquivos que o arquivo fornecido está subordinado.
Sintaxe:
ObtemQtdJuncoes(int NoArq, struct Info 18a *itens);
Parâmetros:
Exemplos:
struct Info18a{
short QtdArq; // Quantidade de arquivos com joins possíveis.
};
3.63 ObtemJuncoes
Objetivo e utilização:
Obtem o número ligação em um arquivo.
Sintaxe:
ObtemJuncoes(int NoArq,struct Info 18b *itens);
Parâmetros:
Exemplos:
struct Info18b{
short NumArq; //Lista dos Arquivos.
short ArqOri; // Lista dos Arquivos de Origem.
Ferramentas RAD do OpenBASE – Página 24
short ChvOri; // Lista dos itens chaves nos arquivos de origem.
};
3.64 ObtemQtdVirtuais
Objetivo e utilização:
Obtem a quantidade de campos virtuais que compõem um item virtual.
Sintaxe:
ObtemQtdVirtuais(int NoItem,struct Info19a *itens);
Parâmetros:
Exemplos:
struct Info19a{
short QtdIte; // Quantidade de campos virtuais se o item corrente é um item virtual.
};
3.65 ObtemVirtuais
Objetivo e utilização:
Obtem a informação detalhada sobre campo virtual em um item virtual.
Sintaxe:
ObtemVirtuais(int NoItem,struct Info19b *itens);
Parâmetros:
Exemplos:
struct Info19b{
short NumIte; // Lista de Ïtens correspondentes ao campo virtual.
};
3.66 ObtemTipoDaChave
Objetivo e utilização:
Obtem informações sobre o item chave no arquivo.
Sintaxe:
ObtemTipoDaChave(int NoItem, struct Info20 *itens);
Parâmetros:
Exemplos:
struct Info20{
short TipCha; // O atributo deste item chave.
// A relação entre atributo e o valor retornado é:
// unique=1, null=2, delete restrict=4, delete in cascade=8, delete set null=16,
modify restrict=32,
modify in cascade=64
modify set null=128
// Número do índice,ou seja, a posição correspondente deste item chave ...
// ... em relação a todos itens chave no arquivo.
short NumInd;
};
3.67 ObtemQtdItensBasicos
Objetivo e utilização:
Obtem a quantidade de itens básicos no arquivo.
Ferramentas RAD do OpenBASE – Página 25
Sintaxe:
ObtemQtdItensBasicos(int NoArq,struct Info21a *itens);
Parâmetros:
Exemplos:
struct Info21a{
short QtdIte; // Quantidade de itens básicos no arquivo.
};
3.68 ObtemItensBasicos
Objetivo e utilização:
Obtém a lista de itens básicos no arquivo.
Sintaxe:
ObtemItensBasicos(int NoArq,struct Info21b *);
Parâmetros:
Exemplos:
struct Info21b{
short NumIte; // Lista dos itens básicos no arquivo.
};
3.69 ObtemQtdRedefinicoes
Objetivo e utilização:
Obtem a quantidade de itens que compõem o item redefinido.
Sintaxe:
ObtemQtdRedefinicoes(int NoItem struct Info22a *itens);
Parâmetros:
Exemplos:
struct Info22a{
// Quantidade de itens que formam o item redefinido.
// Caso o item não seja redefinido, retorna zero.
short QtdIte;
};
3.70 ObtemRedefinicoes
Objetivo e utilização:
Obtem a relação de itens que compõem o item redefinido.
Sintaxe:
ObtemRedefinicoes(int NoItem,struct Info22b *itens);
Parâmetros:
Exemplos:
struct Info22b{
short NumIte; // Lista de itens que formam o item redefinido.
};
3.71 ObtemNiveis
Objetivo e utilização:
Obtém o nível que o usuário acessa o Banco de Dados.
Ferramentas RAD do OpenBASE – Página 26
Sintaxe:
ObtemNiveis(struct Info23 *);
Parâmetros:
Exemplos:
struct Info23{
short NivAbr; // Nível na abertura do banco.
char Niveis[14] [7]; // Palavra de Nível.
};
3.72 ObtemInfoSobreBanco
Objetivo e utilização:
Obtém informações sobre o Banco de Dados.
Sintaxe:
ObtemInfoSobreBanco(struct Info30 *);
Parâmetros:
Exemplos:
struct Info30{
short QtdArq; // Quantidade de arquivos no Banco de Dados.
short Modo; // Modo em que o banco esta aberto no momento
short ArqRec; // Flag de arq recuperação: existe (flag=1) ou não(flag=0)
short QtdIte; // Quantidade de itens no Banco de Dados.
short SubEsq; // Banco é subesquema: sim (flag=0) ou não(flag=1)
short BlqArq; // Flag que indica o tipo de bloqueio existente:
0: bloqueio de banco
1: bloqueio de arquivo
2: bloqueio de chave
3: bloqueio de página
4: bloqueio de registro
long RecMax; // Área máxima de leitura do banco aberto no momento.
};
3.73 ObtemInfoSobreCadeia
Objetivo e utilização:
Obtém informações sobre a cadeia corrente. Retorna os dados presentes na tabela de execução.
Sintaxe:
ObtemInfoSobreCadeia(int NoArq,struct Info31 *itens);
Parâmetros:
Exemplos:
struct Info31{
long QtdCad; // Quantidade de registros na cadeia.
long RegAnt; // Posição do registro anterior na cadeia.
long RegAtu; // Posição do registro atual na cadeia.
long RegSeg; // Posição do registro seguinte na cadeia.
long UltAce; // Último Registro Acessado.
short IteChs; // Número do item chave em uso.
short NumLis; // Número da ligação sequencial.
};
Ferramentas RAD do OpenBASE – Página 27
3.74 PosicionaNoRegistroPorChave
Objetivo e utilização:
Determina que a leitura no arquivo indicado pelo parâmetro arq seja iniciada a partir do registro com valor
da chave igual ao parâmetro valor.
Sintaxe:
PosicionaNoRegistroPorChave(char *arq,char *valor);
Parâmetros:
Exemplos:
3.75 IncluiTodoRegistroNaCadeia
Objetivo e utilização:
Permite a inclusão de um registro no arquivo indicado pelo parâmetro arq, antes do registro corrente.
Sintaxe:
IncluiTodoRegistroNaCadeia(char *arq,char*area);
Parâmetros:
Exemplos:
3.76 IncluiRegistroNaCadeia
Objetivo e utilização:
Permite a inclusão de item(ns) indicado pelo parâmetro itens, no arquivo indicado pelo parâmetro arq, antes
do registro corrente.
Sintaxe:
IncluiRegistroNaCadeia(char * arquivo, struct Itens * itens, char * área);
Parâmetros:
Exemplos:
3.77 ObtemCliente
Objetivo e utilização:
Informa o nome do cliente em relação ao qual a cópia do Banco de Dados OpenBASE foi gerada.
Sintaxe:
ObtemCliente(char *);
Parâmetros:
Exemplos:
3.78 ObtemPercursoArquivoMemo
Objetivo e utilização:
Indica o diretório no qual esta definido o item memo, do arquivo selecionado.
Sintaxe:
ObtemPercursoArquivoMemo(char*arq,char*item,char*nome);
Parâmetros:
Exemplos:
Ferramentas RAD do OpenBASE – Página 28
3.79 ExcluiItemMemo
Objetivo e utilização:
Deleta um item memo especificado de um determinado arquivo.
Sintaxe:
ExcluiItemMemo (char *arq, char *item)
Parâmetros:
Exemplos:
Exemplo em VB:
Sub cmd_delete_Click ()
Dim buffer As String * 8
ReDim items(2) As itens
‘posiciona no registro
items(0).item = “dept_name”
items(1).item = “”
result = LePorChavePrimaria(“dept”, Mid(list_depart.List(list_depart.ListIndex), 1,
6), items(0), buffer)
frm_edit.MousePointer = 11
‘Exclui arquivo de descrição do departamento no banco
result = ExcluiItemMemo(“dept”, “dept_desc”)
‘Exclui arquivo musica do departamento no banco
result = ExcluiItemMemo(“dept”, “dept_music”)
‘Exclui registro do departmento no banco
result = ExcluiRegistro(“dept”)
‘reset listbox
list_depart.Clear
Call reset_list
frm_edit.MousePointer = 0
End Sub
3.80 FinalizaServidor
Objetivo e utilização:
Encerra uma conexão com o Servidor.
Sintaxe:
FinalizaServidor( )
Parâmetros:
Exemplos:
Exemplo em VB:
Sub IDM_EXIT_Click ()
result = CloseDB()
result = FinalizaServidor()
If result <> 0 Then
mens = “FinalizaServidor “ + hostname + “ erro!”
MsgBox (mens)
Else
mens = “FinalizaServidor “ + hostname + “ OK!”
MsgBox (mens)
End If
Ferramentas RAD do OpenBASE – Página 29
Unload frm_main
End Sub
3.81 ObtemDiretorio
Objetivo e utilização:
Retorna para o parâmetro de saída o diretório do dicionário de dados.
Sintaxe:
ObtemDiretorio (char *outdir)
Parâmetros:
Exemplos:
Exemplo em VB:
Sub Command3D1_Click ()
Dim aaa As String * 80
Dim result As Integer
result = ObtemDiretorio(aaa)
ppp.Caption = Trim(aaa)
End Sub
3.82 PegaItemMemo
Objetivo e utilização:
Carrega um item memo para um buffer (area). Deve-se informar: o arquivo que contém o item memo, o
item memo(item) e o tamanho do item memo(tam).
Sintaxe:
PegaItemMemo (char * arq, char *item, char *area, long tam)
Parâmetros:
Exemplos:
Exemplo em VB:
....
result = PegaItemMemo(“dept”, “memo_item”, buffer, size)
....
3.83 PoeItemMemo
Objetivo e utilização:
Grava item memo a partir de um buffer. Deve-se informar o arquivo que contem o item memo (arq), o item
memo (item), e o tamanho do item memo (tam).
Sintaxe:
PoeItemMemo(char *arq, char *item, char *area, long tam)
Parâmetros:
Exemplos:
Exemplo em VB:
....
result = PoeItemMemo(“dept”, “memo_item”, buffer, size)
....
Ferramentas RAD do OpenBASE – Página 30
3.84 PegaGravaItemMemo
Objetivo e utilização:
Grava em um arquivo local (parametro saída) um item memo (parametro item) de um determinado arquivo
(parametro arq).
Sintaxe:
PegaGravaItemMemo (char *arq, char *item, char*saida)
Parâmetros:
Exemplos:
Sub list_depart_DblClick ()
If Len(Dir(“c:\dlls\temp.txt”)) <> 0 Then
Kill “c:\dlls\temp.txt”
End If
If Len(Dir(“c:\dlls\temp.bmp”)) <> 0 Then
Kill “c:\dlls\temp.bmp”
End If
Dim buffer As String * 6
Dim howmany As Long
ReDim items(2) As itens
‘posiciona no registro
items(0).item = “dept_code”
items(1).item = “”
aa = ObtemRegistrosNoArquivo(“dept”)
result = ReiniciaSequencial(“dept”)
For i = 1 To aa
result = LeProximoSequencial(“dept”, items(0), buffer)
If Mid(buffer, 1, 6) = Mid(list_depart.List(list_depart.ListIndex), 1, 6) Then
Exit For
End If
Next i
frm_edit.MousePointer = 11
‘Lê arquivo de descrição do departamemto e grava num arquivo local
result = ObtemTamanhoMemo(“dept”, “dept_desc”, howmany)
result = PegaGravaItemMemo(“dept”, “dept_desc”, c:\dlls\temp.txt”)
If FileLen(“c:\dlls\temp.txt”) <> 0 Then
edit_desp.Text = Space(0)
Dim tempchar As String * 1000
Open “c:\dlls\temp.txt” For Binary Access Read As #1
Do While Not EOF(1)
Get #1, , tempchar
edit_desp.Text = edit_desp.Text + tempchar
Loop
Close #1
Else
edit_desp.Text = Space(0)
End If
song1.Caption = “tamanho da descrição do departamento:” + Str(howmany)
***Este bloco do programa é usado para a função PegaGravaItemMemo***********
result = ObtemTamanhoMemo(“dept”, “dept_music”, howmany)
result = PegaGravaItemMemo(“dept”, “dept_music”, “c:\dlls\temp.BMP”)
If FileLen(“c:\dlls\temp.bmp”) <> 0 Then
frm_edit.Image_music.Picture = LoadPicture(“c:\dlls\temp.bmp”)
Else
Ferramentas RAD do OpenBASE – Página 31
frm_edit.Image_music.Picture = LoadPicture()
End If
song2.Caption = “tamanho da musica do departamento:” + Str(howmany)
frm_edit.MousePointer = 0
End Sub
3.85 ObtemTamanhoMemo
Objetivo e utilização:
Retorna o tamanho de um determinado item memo especificado (parametro item ) de um determinado
arquivo especificado (arq) e finalmente “tam” é o parametro retornado.
Sintaxe:
ObtemTamanhoMemo (char *arq, char *item, long tam)
Parâmetros:
Exemplos:
Exemplo em VB:
....
result = ObtemTamanhoMemo(“dept”, “dept_music”, size)
....
3.86 LePoeItemMemo
Objetivo e utilização:
Essa função lê um arquivo local (entra) e grava para um especificado item memo (item) de um
determinado arquivo (arq).
Sintaxe:
LePoeItemMemo (char *arq, char *item, char *entra)
Parâmetros:
Exemplos:
Exemplo em VB:
Sub cmd_ok_Click ()
Dim buffer As String * 14
Dim temp_buffer As String * 6
Dim result As Integer
ReDim items(3) As Itens
‘Entra nome do departamento no banco
‘Pega o número máximo de dept_code
Filename = “dept”
cc = ObtemRegistrosNoArquivo(Trim(Filename))
result = ReiniciaSequencial(“dept”)
For i = 1 To cc
items(0).item = “dept_code”
items(1).item = “”
result = LeProximoSequencial(“dept”, items(0), temp_buffer)
Next i
aa = Mid(temp_buffer, 1, 6)
maincode = Format(Val(aa) + 1, “000000”)
buffer = maincode + edit_department_name.Text
‘Inclui registro
Ferramentas RAD do OpenBASE – Página 32
items(0).item = “dept_code”
items(1).item = “dept_name”
items(2).item = “”
result = InclueRegistro(Trim(Filename), items(0), buffer)
‘Posiciona no novo registro
items(0).item = “dept_code”
items(1).item = “”
result = LePorChavePrimaria(“dept”, maincode, items(0), temp_buffer)
‘Entre descrição do departamento no banco
buffer1 = edit_department_description.Text
If Len(Trim(buffer1)) <> 0 Then
Open “c:\dlls\temp.txt” For Output As #1
Print #1, buffer1
Close #1
result = ReadPutItemMemo(“dept”, “dept_desc”, “c:\dlls\temp.txt”)
End If
‘Entra musica do departamento no banco
If Len(Trim(putfilename)) <> 0 Then
result = ReadPutItemMemo(“dept”, “dept_music”, putfilename)
End If
‘fecha formulário corrente
Unload frm_add
End Sub
3.87 PoeMemo
Objetivo e utilização:
Essa função grava no banco um item memo (item) de um arquivo (arq). Entretando a informação é
carregada para um buffer (area) de um tamanho especificado (tam).
Existe também um flag (flg) que pode receber dois valores : 0 or 1. O valor 0 tem que ser usado na primeira
vez que a função é chamada (objetivo de append) e o valor 1 é usado para as outras chamadas (segunda,
terceira e assim por diante).
A função é chamada mais que uma vez somente se o item a ser gravado for maior que o tamanho
especificado para o buffer.
Sintaxe:
PoeMemo (char *arq, char *item, char *area, long tam, char flg)
Parâmetros:
Exemplos:
Exemplo em VB:
Sub cmd_ok_Click ()
Dim buffer As String * 14
Dim temp_buffer As String * 6
Dim result As Integer
ReDim items(3) As Itens
‘Entra nome de departamento para o banco no servidor
‘Pega o número máximo de dept_code
Filename = “dept”
cc = ObtemRegistrosNoArquivo(Trim(Filename))
result = ReiniciaSequencial(“dept”)
For i = 1 To cc
items(0).item = “dept_code”
items(1).item = “”
Ferramentas RAD do OpenBASE – Página 33
result = LeProximoSequencial(“dept”, items(0), temp_buffer)
Next i
aa = Mid(temp_buffer, 1, 6)
maincode = Format(Val(aa) + 1, “000000”)
buffer = maincode + edit_department_name.Text
‘Inclui registro
items(0).item = “dept_code”
items(1).item = “dept_name”
items(2).item = “”
result = InclueRegistro(Trim(Filename), items(0), buffer)
‘posiciona para o nove registro
items(0).item = “dept_code”
items(1).item = “”
result = LePorChavePrimaria(“dept”, maincode, items(0),temp_buffer)
‘Entra descrição do departamento para banco no servidor
‘———————————————————————
‘Inclui dado memo no banco com a função PoeMemo
If Len(Trim(edit_department_description.Text)) <> 0 Then
Dim buffer1 As String
buffer1 = edit_department_description.Text
If Len(Trim(buffer1)) <> 0 Then
Open “c:\dlls\temp.txt” For Output As #1
Print #1, buffer1
Close #1
End If
‘Inclui descrição do departamento no banco
Dim input_buffer1 As String * 180
Open “c:\dlls\temp.txt” For Binary Access Read As #1
aa = 0
Do While Not EOF(1)
Get #1, , input_buffer1
If aa = 0 Then
result = PoeMemo(“dept”, “dept_desc”, input_buffer1, Len(input_buffer1), 0)
aa = aa + 1
Else
result = PoeMemo(“dept”, “dept_desc”, input_buffer1, Len(input_buffer1), 1)
End If
Loop
Close #1
End If
‘Inclui imagem associada ao departamento no banco
If Len(Trim(putfilename)) <> 0 Then
Dim input_buffer2 As String * 180
Open putfilename For Binary Access Read As #1
aa = 0
Do While Not EOF(1)
Get #1, , input_buffer2
If aa = 0 Then
result = PoeMemo(“dept”, “dept_music”, input_buffer2, Len(input_buffer2), 0)
aa = aa + 1
Else
result = PoeMemo(“dept”, “dept_music”, input_buffer2, Len(input_buffer2), 1)
End If
Loop
Ferramentas RAD do OpenBASE – Página 34
Close #1
End If
‘Fecha formulário corrente
Unload frm_add1
End Sub
3.88 PegaMemo
Objetivo e utilização:
Esta função lê um item memo de um Banco de Dados para um buffer.
Sintaxe:
PegaMemo (char *arq, char *item, char *area, long tam, long *lid, long ofe)
Parâmetros:
Deve-se informar:
♦
♦
♦
♦
arquivo do Banco de Dados (arq)
item memo (item)
tamanho lido (tam)
offset (ofe)
O parâmetro offset (ofe) representa a posição inicial para iniciar a leitura de um item memo (item). O item
será lido passo a passo de acordo com um loop e a cada passo o offset deve ser incrementado do tamanho
lido (lid). Finalmente a função retorna o parâmetro do buffer (area) e seu tamanho (tam).
Exemplos:
Exemplo em VB:
Sub list_depart_DblClick ( )
If Len(Dir(“c:\dlls\temp.txt”)) <> 0 Then
Kill “c:\dlls\temp.txt”
End If
If Len(Dir(“c:\dlls\temp.bmp”)) <> 0 Then
Kill “c:\dlls\temp.bmp”
End If
Dim buffer As String * 6
ReDim items(2) As itens
‘localiza no registro
items(0).item = “dept_code”
items(1).item = “”
aa = ObtemRegistrosNoArquivo(“dept”)
result = ReiniciaSequencial(“dept”)
For i = 1 To aa
result = LeProximoSequencial(“dept”, items(0), buffer)
If Mid(buffer, 1, 6) = Mid(list_depart.List (list_depart.ListIndex), 1, 6) Then
Exit For
End If
Next i
frm_edit1.MousePointer = 11
‘le descricao do departamento de um arquivo do Banco de Dados
Dim input_buffer1 As String * 1024
Dim read_size As Long
read_size = 0
offset = 0
Open “c:\dlls\temp.txt” For Binary Access Write As #1
Do While 1
Ferramentas RAD do OpenBASE – Página 35
result = PegaMemo(“dept”, “dept_desc”, input_buffer1, Len(input_buffer1), read_size, offset)
If read_size <> 0 Then
Put #1, , input_buffer1
Else
Exit Do
End If
offset = offset + read_size
Loop
Close #1
Dim tempchar As String * 1000
edit_desp.Text = Space(0)
Open “c:\dlls\temp.txt” For Binary Access Read As #1
Do While Not EOF(1)
Get #1, , tempchar
edit_desp.Text = edit_desp.Text + tempchar
Loop
Close #1
‘lê musica do departamento de um arquivo do banco
read_size = 0
offset = 0
Open “c:\dlls\temp.bmp” For Binary Access Write As #1
Do While 1
result = PegaMemo(“dept”, “dept_music”, global_buffer, Len(global_buffer), read_size, offset)
If read_size <> 0 Then
Put #1, , global_buffer
Else
Exit Do
End If
offset = offset + read_size
Loop
Close #1
If FileLen(“c:\dlls\temp.bmp”) <> 0 Then
image_music.Picture = LoadPicture(“c:\dlls\temp.bmp”)
Else
image_music.Picture = LoadPicture()
End If
frm_edit1.MousePointer = 0
End Sub
3.89 Crypt
Objetivo e utilização:
Esta rotina tem como finalidadade criptografar um texto. Recebe a string a ser criptografada e um
parâmetro que indica a forma de criptografia, e retorna a string criptografada.
Sintaxe:
Crypt(char * ent,char * sal,char * sai)
Parâmetros:
Exemplos:
3.90 IniciaServidor
Objetivo e utilização:
Ferramentas RAD do OpenBASE – Página 36
Cria uma ligação com o nó da rede definido por Endereço, após esta rotina um banco pode ser aberto
remotamente neste Endereço desde que aí se encontre em execução o utilitário BDSERV (servidor) do
OpenBASE. Esta rotina fecha uma ligação que tenha sido criada anteriormente.
Sintaxe:
IniciaServidor(char * endereco)
Parâmetros:
Exemplos:
3.91 Alarme Servidor
Objetivo e utilização:
Evitar que um processo filho bdserv, permaneça ativo indefinidamente, caso a aplicação cliente seja
finalizada de forma anormal, sem finalizar o bdserv (FinalizaServidor).
Determina o tempo em segundo, que o bdserv inicializado por uma aplicação cliente, deva permanecer
ativo, sem que haja comunicação da aplicação cliente.
Sintaxe:
AlarmeServidor (<tempo>)
Parâmetros:
tempo – tempo em segundos, que o bdserv filho, inicializado pela aplicação cliente, permanecerá ativo,
sem que haja, comunicação da aplicação cliente.
Exemplos:
Alarme Servidor (3600)
Indica que após 3.600 segundos sem comunicação o bdserv sairá do ar.
Alarme Servidor (-1)
Não determina nenhum tempo (tempo infinito), para que o bdserv saia do ar, caso a aplicação
cliente não se comunique com o servidor (bdserv).
4
4.1
Componentes Delphi do OpenBase
Componente Topenbase
Objetivo e utilização:
Serve para acessar Bases de Dados OpenBase, a partir do componente TOPENBASE, em um programa
Delphi.
Permite que um programa em Delphi acesse uma Base de Dados OpenBase, informando o nome do
dicionário de dados da tabela e dos campos da tabela que deseja acessar, permitindo, também, o
relacionamento entre tabelas (chaves primárias e estrangeiras).
Como instalar o Topenbase no Delphi 3:
1. Copie num diretório as DCU’s OpenBase.dcu e CliWin32.dcu;
2. Vá no Menu Component;
3. Vá no Sub-menu Install Component...;
4. Na caixa Unit file name pressione o botão Browse...;
5. Na caixa de diálogo que irá surgir defina que apareça somente os arquivos do tipo *.dcu;
6. Vá para o diretório onde vc copiou os dois DCU’s;
7. Escolha primeiro a CliWin32.dcu;
8. Certifique-se que na caixa Package file name esteja definida a package dclstd30.dpk (Delphi Startd
Components) que por default se encontra no diretório LIB do Delphi;
9. Clique em OK e o Delphi irá instala-lo no package;
10. Feche a janela que dá a listagem dos componentes instalados no package confirmando o seu
salvamento.
11. Repita os passos 7, 8, 9 e 10, porém, para a outra DCU: OpenBase.dcu;
12. Irá surgir a mensagem que o componente foi instalado, prossiga pressionando o botão Ok.
Ferramentas RAD do OpenBASE – Página 37
4.2
Propriedades do Topenbase:
Ferramentas RAD do OpenBASE – Página 38
Active :
Quando True abre a tabela definida em TableName. Em tempo de projeto é
também possível visualizar os dados da tabela;
FollowMater:
Quando True ativa o relacionamento entre as tabelas. OBS: Se desejar usar o
relacionamento, torne-a True somente após a tabela estiver Aberta;
KeyName :
É o nome do campo chave da tabela;
MasterField :
Informa qual o nome do campo chave da tabela master, ou seja, a tabela a que
se deseja relacionar;
MasterSource:
É o nome da tabela master, ou seja, a tabela a que se deseja relacionar;
Name:
É o nome do Componente;
Path:
É o path da base de dados OpenBase;
Server:
É o IP do Servidor (Win95 ou UNIX) do dicionário de dados;
SlaveField:
É o nome do campo da tabela em questão que se relaciona com a tabela
master;
É o nome da tabela do banco de dados que o componente se ligará;
Propriedade do tipo integer para uso geral.
TableName:
Tag:
5
5.1
Utilização de objetos OpenBase COM
O Component Object Model (COM)
O problema que o COM resolve é que não há uma maneira padrão de módulos Windows se comunicarem
uns com os outros.
Os “padrões” anteriores não são bons o bastante, pois:
• a API do Windows tem uma interface de mais de 350 funções
• VBX’s não funcionam em 32 bits.
• Com DDE há um sistema complicado de aplicações, tópicos e itens
• A maneira de chamar uma DLL é totalmente específica de uma aplicação
O COM fornece um protocolo de comunicação unificado, expansível e orientado a objeto para Windows
que suporta o seguinte:
• uma maneira padrão, independente de linguagem, para um cliente EXE Win32 carregar e
chamar uma DLL win32
• uma maneira geral para um EXE controlar outro EXE no mesmo computador (a substituição
do DDE)
• uma substituição para um controle VBX, chamada um controle ActiveX
• uma maneira poderosa para programas de aplicação interagirem com o sistema operacional.
• uma expansão para acomodar novos protocolos como a interface para bancos de dados OLE
DB
• uma versao distribuida (DCOM) que permite a um EXE se comunicar com outro EXE em um
computador diferente
O COM é um protocolo que conecta um modulo de software com outro e então sai de cena. Após a
conexão ser feita, os dois módulos podem se comunicar através de um mecanismo chamado interface.
Interfaces não precisam de entry points ligados estática ou dinâmicamente, sómente uma poucas funções
COM gerais que iniciam o processo de comunicação.
5.2
Registrando um componente
As classes e interfaces são identificadas por GUID’s (globally unique identifiers) de 128 bits que são
armazenadas no Registry.
Ferramentas RAD do OpenBASE – Página 39
CString strDllPath = "C:\\obcom\\debug\\obcom.dll";
// onde está a DLL
HINSTANCE h = LoadLibrary(strDllPath);
FARPROC pFunc = ::GetProcAddress((HMODULE) h, "DllRegisterServer");
(*pFunc)();
// call the function to register the server
AfxMessageBox("Server registered OK");
Na DLL:
STDAPI DllRegisterServer(void){
AFX_MANAGE_STATE(AfxGetStaticModuleState());
COleObjectFactory::UpdateRegistryAll();
return S_OK;
}
// {61B325AF-0C3B-11D2-80EC-0040333C6E0D}
static const IID IID_IOBcom =
{ 0x61b325af, 0xc3b, 0x11d2, { 0x80, 0xec, 0x0, 0x40, 0x33, 0x3c, 0x6e, 0xd } };
// {77E73490-FC71-11D1-80EC-0040333C6E0D}
IMPLEMENT_OLECREATE(COBcom, "Openbase.OBcom.1", 0x77e73490, 0xfc71, 0x11d1, 0x80, 0xec,
0x0, 0x40, 0x33, 0x3c, 0x6e, 0xd)
5.3
Como um Cliente COM chama um Componente In-Process
Cliente:
CLSID clsid;
IClassFactory *pClf;
IUnknown *pUnk;
CoInitialize(NULL);
CLSIDFromProgID(“Openbase.OBcom.1”,&clsid);
COM:
Usa o Registry para procurar a class ID de “Openbase.OBcom.1”.
Cliente:
CoGetClassObject(clsid, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory,
(void **) &pClf);
COM:
COM usa a class ID para procurar pelo componente em memória
if (DLL componente não está carregada){
COM pega o nome da DLL do Registry
COM carrega a DLL componente na memória
}
componente DLL:
if (componente carregado agora){
Objetos globais da factory são construidos
InitInstance da DLL é chamada
}
COM:
COM chama a DllGetClassObject exportada globalmente pela DLL com a CLSID que foi
passada para CoGetClassObject
componente DLL:
DllGetClassObject retorna IClassFactory *
COM
COM retorna IClassFactory * para o cliente:
Cliente:
pClf->CreateInstance(NULL, IID_IUnknown, (void **)&PUnk);
componente DLL:
Ferramentas RAD do OpenBASE – Página 40
•
•
•
5.4
chama a função CreateInstance da class factory
constrói um objeto da class “Openbase.OBcom.1”
retorna o pointer para a interface
Automation
Automation fornece além das interfaces padrões IUnknown e IClassFactory a interface IDispatch.
Um relacionamento master-slave claramente definido está sempre presente num diálogo de comunicação
usando Automation. O mestre é o cliente Automation e o escravo e’o componente Automation (server). O
cliente inicia a interação construindo um objeto do componente e depois chama as funções da interface do
componente. Estas funções podem ser propriedades ou métodos.
Uma propriedade é um valor que pode ser atribuido e recuperado. Propriedade não têm parâmetros, mas
algumas propriedades são indexadas.
Um método pode ter zero ou mais parâmetros e pode atribuir ou recuperar dados do objeto.
A função IDispatch::Invoke é usada para objetos COM que podem ser construídos e usados em C++ ou
VBA (Visual Basic for Aplications). IDispatch é o coração de Automation. É totalmente suportada pelo
COM marshaling (conversão de parâmetros de e para data streams), como são IUnknown e IClassFactory.
A interface ITypeInfo cuida da type library do componente. A type library é uma tabela, localizável pelo
Registry, que permite um cliente consultar o componente solicitando os nomes simbólicos de objetos,
métodos e propriedades. Um cliente pode, por exemplo, conter um browser que permite o usuário explorar
as possibilidades do componente.
5.5
Métodos e propriedades do objeto OpenBASE
Um Banco de Dados OpenBASE pode ser acessado como um objeto COM por ambientes de programação
Windows, tais como Visual Basic (VB), Visual Basic for Applications (VBA) e Delphi. Também podem
ser utilizados scripts, tais como Perl, Python, Tcl … etc … além da linguagem JAVA.
Os exemplos apresentados neste manual foram feitos em Visual Basic, Delphi, PHP, ASP, Perl e Python.
As funções (propriedades e métodos) COM do OpenBASE se encontram no módulo OBCOM.DLL, a ser
registrado pelo comando regsvr32 obcom.dll, ou através de outras ferramentas. A type library
correspondente chama-se OBCOM.TLB e é opcional.
O módulo OBCOM.DLL (ou ODBCOM.DLL), cujos métodos apontam para as funções contidas na DLL
ROTWIN32.DLL (ou CLIWIN32.DLL) do OpenBASE, deve residir no diretório System do Windows ou
num diretório corretamente especificado no percurso (path).
Veja a seguir, em Visual Basic, como instanciar, ativar e desativar um objeto COM do OpenBASE:
Dim a as object
Private Sub Form_Load()
Set a = CreateObject("OpenBase.OBcom.1")
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set a = Nothing
End Sub
A seguir relacionamos todos os métodos definidos no componente OBCOM assim como suas
propriedades.
5.5.1 OAbreBancoDeDados
Objetivo e utilização:
Serve para abrir um Banco de Dados OpenBASE.
Sintaxe:
Long OAbreBancoDeDados(bstr banco, bstr nivel, long segurança, long modo)
Propriedades:
As propriedades deste métoto representam :
Nome do arquivo dicionário do Banco de Dados. Deve incluir o percurso quando
Banco
diferente do percurso default.
Ferramentas RAD do OpenBASE – Página 41
Nível
Palavra de nível de autorização para acesso.
Segurança
Código (ou senha) de segurança.
Modo
Modo de abertura do Banco.
Exemplos:
Dim ret as long
ret = a.OAbreBancoDeDados(“EXEMPLO”,””,1,2)
5.5.2 OFechaBancoDeDados
Objetivo e utilização:
Fecha um Banco de Dados previamente aberto.
Sintaxe:
long OFechaBancoDeDados(long nada)
Propriedades:
Exemplos:
Dim ret as long
ret = a.OFechaBancoDeDados(0)
5.5.3 OPegaItem
Objetivo e utilização:
Retorna o valor do item indicado do arquivo indicado que deve ser lido para area intermediária antes de ser
chamada esta função utilizando OLeProximoRegistroSequencial, OleRegistroAnteriorSequencial,
OLeProximoRegistroSubcadeia, OLeRegistroPorEndereco, OLeProximoRegistroCadeia,
OLeRegistroAnteriorCadeia, OLeProximoRegistroPorPrefixo, OLeRegistroAnteriorPorPrefixo,
OleRegistroPorChavePrimaria.
Sintaxe:
string OPegaItem(bstr arquivo, bstr item)
Propriedades:
Exemplos:
Dim v as String
v = a.OPegaItem(“PESSOA”,”IDADE”)
5.5.4 OPoeItem
Objetivo e utilização:
Quarda o valor do item indicado do arquivo indicado em area intermediária a ser gravada utilizando a
função OIncluiTodoRegistro, OAlteraTodoRegistroCascata,OAlteraTodoRegistroPoeNulo,
OAlteraTodoRegistro.
Sintaxe:
long OPoeItem(bstr arquivo, bstr item, bstr valor)
Propriedades:
Exemplos:
Dim ret as long
ret = a.OPoeItem(“PESSOA”,”IDADE”,”10”)
5.5.5 OPegaRegistro
Objetivo e utilização:
Retorna o registro do arquivo indicado que deve ser lido para area intermediária antes de ser chamada esta
função utilizando OLeProximoRegistroSequencial, OleRegistroAnteriorSequencial,
OLeProximoRegistroSubcadeia, OLeRegistroPorEndereco, OLeProximoRegistroCadeia,
Ferramentas RAD do OpenBASE – Página 42
OLeRegistroAnteriorCadeia, OLeProximoRegistroPorPrefixo, OLeRegistroAnteriorPorPrefixo,
OleRegistroPorChavePrimaria.
O arquivo só pode ter itens dos tipos U, N e S.
Sintaxe:
string OPegaRegistro(bstr arquivo)
Propriedades:
Exemplos:
Dim v as String
v = a.OPegaRegistro(“PESSOA”)
5.5.6 OPoeRegistro
Objetivo e utilização:
Quarda o registro do arquivo indicado em area intermediária a ser gravada utilizando a função
OIncluiTodoRegistro, OAlteraTodoRegistroCascata,OAlteraTodoRegistroPoeNulo,
OAlteraTodoRegistro.
O arquivo só pode ter itens dos tipos U, N e S.
Sintaxe:
long OPoeRegistro(bstr arquivo, bstr registro)
Propriedades:
Exemplos:
Dim ret as long
ret = a.OPoeRegistro(“PESSOA”,”Antonio 10”)
5.5.7 OLeProximoRegistroSequencial
Objetivo e utilização:
Lê o próximo registro em um Arquivo do Banco de Dados para area intermediária.
Sintaxe:
long OLeProximoRegistroSequencial(bstr arquivo)
Propriedades:
A rotina recebe o parâmetro:
Arquivo
Nome do arquivo do Banco de Dados que será lido.
Exemplos:
5.5.8 OLeRegistroAnteriorSequencial
Objetivo e utilização:
Lê o registro anterior em um Arquivo do Banco de Dados para area intermediária.
Sintaxe:
long OLeRegistroAnteriorSequencial(bstr arquivo)
Propriedades:
A rotina recebe parâmetro idêntico ao da rotina anterior.
:
Arquivo
Nome do arquivo do Banco de Dados que será lido.
Exemplos:
5.5.9 OReiniciaSequencial
Objetivo e utilização:
Retorna o ponteiro de leitura seqüencial para inicio(fim) do Arquivo. Uma chamada a seguir a rotina
OLeProximoSequencial devolverá o primeiro registro no arquivo, já uma chamada a
OLeAnteriorSequencial retornará o último registro. Recebe um único parâmetro correspondente ao nome
do arquivo a ser reinicializado.
Sintaxe:
long OReiniciaSequencial(bstr arquivo)
Ferramentas RAD do OpenBASE – Página 43
Propriedades:
Exemplos:
5.5.10 OLeRegistroPorEndereco
Objetivo e utilização:
Lê um registro de um Arquivo entidade para area intermediária, cuja endereço seja igual ao parâmetro
endereço.
Sintaxe:
long OLeRegistroPorEndereco(bstr arquivo, long endereco)
Propriedades:
Exemplos:
5.5.11 OPosicionaNoRegistroPorChave
Objetivo e utilização:
Determina que a leitura no arquivo indicado pelo parâmetro arq seja iniciada a partir do registro com valor
da chave igual ao parâmetro valor.
Sintaxe:
long OPosicionaNoRegistroPorChave(bstr arq,bstr valor)
Propriedades:
Exemplos:
5.5.12 OPosicionaNoRegistro
Objetivo e utilização:
Numa leitura seqüencial posiciona o ponteiro de leitura de Arquivo no registro cujo endereço físico é
passado no parâmetros Endereço.
Sintaxe:
long OPosicionaNoRegistro(bstr arquivo, long endereço)
Propriedades:
Exemplos:
5.5.13 OIniciaCadeia
Objetivo e utilização:
Seleciona uma cadeia, ou seja um conjunto de registros em um Arquivo que um dado item Chave tenha o
mesmo Valor. Torna os registros selecionados disponíveis para a leitura por LeProximoCadeia e
LeAnteriorCadeia.
Sintaxe:
long OIniciaCadeia(bstr arquivo, bstr chave, bstr valor)
Propriedades:
Exemplos:
Os parâmetros são recebidos pela rotina são:
Arquivo
Chave
Valor
Nome do arquivo do Banco de Dados aberto.
Nome do item chave do arquivo.
Valor do item chave a selecionar, deve ser uma cadeia de caracteres ASCII do mesmo
tamanho e conteúdo compatível com o item chave.
5.5.14 OObtemMensagem
Objetivo e utilização:
Coloca em Mensagem a última mensagem de erro ocorrida no acesso ao Banco de Dados. Mensagem deve
apontar para uma área de no mínimo 100 bytes. Retorna tambem uma string com a mensagem.
Ferramentas RAD do OpenBASE – Página 44
Sintaxe:
string OObtemMensagem(bstr mensagem)
Propriedades:
Exemplos:
5.5.15 OLeProximoRegistroSubcadeia
Objetivo e utilização:
Lê o próximo registro sequencialmente que contenha subcad no valor no item. Os registros serão lidos para
área intermediária na ordem em que foram incluídos, os parâmetros são compatíveis com os do mesmos
nome descritos acima.
Sintaxe:
long OLeProximoRegistroSubcadeia(bstr arquivo, bstr item, bstr subcad)
Propriedades:
Exemplos:
5.5.16 OIncluiTodoRegistro
Objetivo e utilização:
Inclui no Arquivo o registro guardado em area intermediária utlizando a rotina OPoeItem ou
OPoeRegistro.
Sintaxe:
long OIncluiTodoRegistro(bstr arquivo)
Propriedades:
Exemplos:
5.5.17 OPegArq
Objetivo e utilização:
Retorna o numero do arquivo indicado
Sintaxe:
int OPegArq(bstr arquivo)
Propriedades:
Exemplos:
Exemplo:
Dim arq as int
arq = OPegArq(“PESSOA”)
5.5.18 OLeProximoRegistroCadeia
Objetivo e utilização:
Lê o próximo registro selecionado por IniciaCadeia do primeiro ao último. Os registros serão lidos para
área intermediária na ordem em que foram incluídos, os parâmetros são compatíveis com os do mesmos
nome descritos acima.
Sintaxe:
long OLeProximoRegistroCadeia(bstr arquivo)
Propriedades:
Exemplos:
5.5.19 OLeRegistroAnteriorCadeia
Objetivo e utilização:
Lê o registro anterior selecionado por IniciaCadeia do último ao primeiro. Os registros serão lidos para area
intermediária na ordem inversa em que foram incluídos, os parâmetros são compatíveis com os do mesmos
nome descritos acima.
Sintaxe:
Ferramentas RAD do OpenBASE – Página 45
long OLeRegistroAnteriorCadeia (bstr arquivo)
Propriedades:
Exemplos:
5.5.20 OJuntaBancoDeDados
Objetivo e utilização:
Reúne o Banco de Dados passados pelos parâmetros, ao banco aberto anteriormante, incorporando o seu
dicioário ao dicionário do banco já aberto e inserindo os arquivos entidade como tabelas do banco já
existente, e os arquivos relacionamentos como consultas(visões). Tais arquivos não poderão ser
atualizados, apenas consultados.
Permite com isto, abrir mais de um Banco de Dados, para uma mesma aplicação.
Sintaxe:
long OJuntaBancoDeDados(bstr banco, bstr nivel, long segur, long modo)
Propriedades:
Exemplos:
5.5.21 OIniciaPorPrefixo
Objetivo e utilização:
Seleciona uma cadeia por prefixo, ou seja um conjunto de registros em um Arquivo que um dado item
Chave do tipo cadeia se inicie pelo mesmo Valor, torna os registros selecionados disponíveis para a leitura
com as duas rotinas descritas a seguir. Os parâmetros são similares aos do IniciaCadeia, sendo que o
parâmetro Valor deve ter um tamanho menor ou igual ao do item Chave.
Sintaxe:
long OIniciaPorPrefixo(bstr arquivo, bstr chave, bstr valor)
Propriedades:
Exemplos:
5.5.22 OLeProximoRegistroPorPrefixo
Objetivo e utilização:
Lê o próximo registro selecionado por IniciaPorPrefixo a partir do primeiro até o último em ordem
alfabética da Chave selecionada para area intermediária. O parâmetro é compatível com o do mesmo nome
descrito acima.
Sintaxe:
long OLeProximoRegistroPorPrefixo(bstr arquivo)
Propriedades:
Exemplos:
5.5.23 OLeRegistroAnteriorPorPrefixo
Objetivo e utilização:
Lê o registro anterior selecionado por IniciaPorPrefixo a partir do último até o primeiro em ordem
alfabética invertida da Chave selecionada para area intermediária. O parâmetro é compatível com o do
mesmo nome descrito acima.
Sintaxe:
long OLeRegistroAnteriorPorPrefixo(bstr arquivo)
Propriedades:
Exemplos:
5.5.24 OLeRegistroPorChavePrimaria
Objetivo e utilização:
Ferramentas RAD do OpenBASE – Página 46
Lê um registro de um arquivo entidade para area intermediária, cuja chave primária seja igual ao parâmetro
valor.
Sintaxe:
long OLeRegistroPorChavePrimaria(bstr arquivo, bstr valor)
Propriedades:
Exemplos:
5.5.25 OEscolheChave
Objetivo e utilização:
Seleciona um item chave de arquivo para ordenação da leitura sequencial.Por default, é assumido o
primeiro item chave do arquivo.
Sintaxe:
long OEscolheChave(bstr arquivo, bstr chave)
Propriedades:
Exemplos:
5.5.26 OExcluiRegistro
Objetivo e utilização:
Exclui no arquivo o último registro lido.
Sintaxe:
long OExcluiRegistro(bstr arquivo)
Propriedades:
Exemplos:
5.5.27 OExcluiRegistroCascata
Objetivo e utilização:
Indica exclusão do registro e seus subordinados com a opção cascata.
Sintaxe:
long OExcluiRegistroCascata(bstr arq)
Propriedades:
Exemplos:
5.5.28 OExcluiRegistroPoeNulo
Objetivo e utilização:
Indica exclusão do registro e seus subordinados com a opção poenulo.
Sintaxe:
long OExcluiRegistroPoeNulo(bstr arq)
Propriedades:
Exemplos:
5.5.29 OIncluiTodoRegistroNaCadeia
Objetivo e utilização:
Permite a inclusão de um registro no arquivo indicado pelo parâmetro arq, antes do registro corrente.
Sintaxe:
long OIncluiTodoRegistroNaCadeia(bstr arq)
Propriedades:
Exemplos:
5.5.30 OAlteraTodoRegistroCascata
Objetivo e utilização:
Ferramentas RAD do OpenBASE – Página 47
Altera um registro, com a opção de modificação em cascata, a partir do registro guardado em area
intermediária utlizando a rotina OPoeItem ou OPoeRegistro.
Sintaxe:
long OAlteraTodoRegistroCascata(bstr arq)
Propriedades:
Exemplos:
5.5.31 OAlteraTodoRegistroPoeNulo
Objetivo e utilização:
Permite a alteração de um registro, atribuindo nulo nos itens suboordinados a este.
Sintaxe:
long OAlteraTodoRegistroPoeNulo(bstr arq)
Propriedades:
Exemplos:
5.5.32 OAlteraTodoRegistro
Objetivo e utilização:
Altera o último registro lido em arquivo a partir do registro guardado em area intermediária utlizando a
rotina OPoeItem ou OPoeRegistro.
Sintaxe:
long OAlteraTodoRegistro(bstr arquivo)
Propriedades:
Exemplos:
5.5.33 ODesfazTransacao
Objetivo e utilização:
Desfaz as alterações feitas no Banco de Dados desde a última OIniciaTransacao.
Sintaxe:
long ODesfazTransacao(long nada)
Propriedades:
Exemplos:
5.5.34 OBloqueia ou OIniciaTransacao
Objetivo e utilização:
Inicia uma transação. Todas as alterações feitas no Banco de Dados após esta rotina e antes da rotina
FinalizaTransação constituirão uma transação lógica e serão desfeitas em conjunto se for usado a rotina
ODesfazTransacao ou o utilitário BDRECU.
Sintaxe:
long OBloqueia(long nada)
long OIniciaTransacao(long nada)
Propriedades:
Exemplos:
5.5.35 ODesbloqueia ou OFinalizaTransacao
Objetivo e utilização:
Finaliza a transação iniciada por OIniciaTransacao, após esta rotina as alterações anteriormente feitas no
Banco de Dados não serão desfeitas.
Sintaxe:
long ODesbloqueia(long nada)
long OFinalizaTransacao(long nada)
Propriedades:
Ferramentas RAD do OpenBASE – Página 48
Exemplos:
5.5.36 OEsvaziaArquivo
Objetivo e utilização:
Indica o arquivo a ser esvaziado.
Sintaxe:
long OEsvaziaArquivo(bstr arq)
Propriedades:
Exemplos:
5.5.37 OLigaOpcao
Objetivo e utilização:
Rotina utilizada para especificar opções, tais como:
• open: abrir os arquivos na abertura do banco
• century : ano com 4 dígitos
Nas funções LigaOpção/Desliga Opção para se ligar/desligar a opção de abrir todos os arquivos de um
banco foi incluida a opção “open”. Para se ligar/desligar a opção de século foi incluida a opção “century”.
Sintaxe:
long OLigaOpcao(bstr opc)
Propriedades:
Exemplos:
Exemplo:
ret=OLigaOpcao(“century”)
5.5.38 ODesligaOpcao
Objetivo e utilização:
Deve ser utilizada após o uso das rotinas que requerem a rotina LigaOpcao.
Para se ligar/desligar a opção de século foi incluida a opção “century”.
Sintaxe:
long ODesligaOpcao(bstr opc)
Propriedades:
Exemplos:
ret=ODesligaOpcao(“open”)
5.5.39 OIniciaServidor
Objetivo e utilização:
Cria uma ligação com o nó da rede definido por nome_host. Após esta rotina um banco pode ser aberto
remotamente no host nome_host desde que aí se encontre em execução o utilitário BDSERV (servidor) do
OpenBASE. Esta rotina fecha uma ligação que tenha sido criada anteriormente.
Sintaxe:
long OIniciaServidor(bstr nome_host)
Propriedades:
Exemplos:
result = com.OIniciaServidor(“localhost”)
5.5.40 OFinalizaServidor
Objetivo e utilização:
Esta rotina fecha uma conexão anteriormente efetuada via OIniciaServidor.
Sintaxe:
long OIniciaServidor()
Ferramentas RAD do OpenBASE – Página 49
Propriedades:
Exemplos:
Exemplo em VB:
Sub IDM_EXIT_Click ()
result = a.OCloseDB()
result = a.OFinalizaServidor()
If result <> 0 Then
mens = “FinalizaServidor “ + hostname + “ erro!”
MsgBox (mens)
Else
mens = “FinalizaServidor “ + hostname + “ OK!”
MsgBox (mens)
End If
Unload frm_main
End Sub
5.5.41 OObtemEnderecoAtual
Objetivo e utilização:
Retorna o endereço físico do último registro lido no Arquivo ou zero se nenhum registro foi lido, pode ser
usado para se testar fim de arquivo (EOF) após uma leitura.
Sintaxe:
long OObtemEnderecoAtual(bstr arquivo)
Propriedades:
Exemplos:
5.5.42 OObtemRegistrosNaCadeia
Objetivo e utilização:
Retorna o numero de registros na cadeia, isto é o número de registros selecionados pela última execução da
rotina OIniciaCadeia no Arquivo.
Sintaxe:
long OObtemRegistrosNaCadeia(bstr arquivo)
Propriedades:
Exemplos:
5.5.43 OObtemRegistrosNoArquivo
Objetivo e utilização:
Retorna o numero de registros no Arquivo.
Sintaxe:
long OObtemRegistrosNoArquivo(bstr arquivo)
Propriedades:
Exemplos:
5.5.44 OObtemDiretorio
Objetivo e utilização:
Retorna para o parâmetro de saída o diretório do dicionário de dados.
Sintaxe:
long OObtemDiretorio (bstr saidir)
Propriedades:
Exemplos:
Exemplo em VB:
Sub Command3D1_Click ()
Ferramentas RAD do OpenBASE – Página 50
Dim aaa As String * 80
Dim result As Integer
result = a.OObtemDiretorio(aaa)
ppp.Caption = Trim(aaa)
End Sub
Objetivo e utilização:
Informa o nome do cliente em relação ao qual a cópia do Banco de Dados OpenBASE foi gerada.
Sintaxe:
long OObtemCliente(bstr cliente)
Propriedades:
Exemplos:
5.5.45 OObtemQtdChaves
Objetivo e utilização:
Obtém a quantidade de itens chaves no arquivo de dados, dado o seu número.
Sintaxe:
long OObtemQtdChaves(integer NoArq)
Propriedades:
Exemplos:
5.5.46 OObtemNumeroDoItem
Objetivo e utilização:
Obtém o número sequencial do item, dado o seu nome.
Sintaxe:
long OObtemNumeroDoItem(bstr NomeItem)
Propriedades:
Exemplos:
5.5.47 OObtemQtdLigacoes
Objetivo e utilização:
Obtem a quantidade de ligações em um arquivo de dados..
Sintaxe:
long OObtemQtdLigacoes(int NoArq)
Propriedades:
Exemplos:
5.5.48 OObtemNumeroDoArquivo
Objetivo e utilização:
Obtem o número sequencial do arquivo de dados
Sintaxe:
long OObtemNumeroDoArquivo(bstr NomeArq)
Propriedades:
Exemplos:
5.5.49 OObtemQtdJuncoes
Objetivo e utilização:
Obtem quantidade de arquivos que o arquivo fornecido está subordinado.
Sintaxe:
long OObtemQtdJuncoes(int NoArq)
Ferramentas RAD do OpenBASE – Página 51
Propriedades:
Exemplos:
5.5.50 OObtemQtdVirtuais
Objetivo e utilização:
Obtem a quantidade de campos virtuais que compõem um item virtual.
Sintaxe:
long OObtemQtdVirtuais(int NoItem)
Propriedades:
Exemplos:
5.5.51 OObtemQtdItensBasicos
Objetivo e utilização:
Obtem a quantidade de itens básicos no arquivo.
Sintaxe:
long OObtemQtdItensBasicos(int NoArq)
Propriedades:
Exemplos:
5.5.52 OObtemQtdRedefinicoes
Objetivo e utilização:
Obtem a quantidade de itens que compõem o item redefinido.
Sintaxe:
long OObtemQtdRedefinicoes(int NoItem)
Propriedades:
Exemplos:
5.5.53 OPegaGravaItemMemo
Objetivo e utilização:
Grava em um arquivo local (parametro arqsaída) um item memo (parametro item) de um determinado
arquivo (parametro arq).
Sintaxe:
long OPegaGravaItemMemo (bstr arq, bstr item, bstr arqsaida)
Propriedades:
Exemplos:
Sub list_depart_DblClick ()
If Len(Dir(“c:\dlls\temp.txt”)) <> 0 Then
Kill “c:\dlls\temp.txt”
End If
If Len(Dir(“c:\dlls\temp.bmp”)) <> 0 Then
Kill “c:\dlls\temp.bmp”
End If
Dim buffer As String * 6
Dim howmany As Long
‘posiciona no registro
aa = a.OObtemRegistrosNoArquivo(“dept”)
result = a.OReiniciaSequencial(“dept”)
For i = 1 To aa
result = a.OLeProximoSequencial(“dept”)
buffer=a.OPegaRegistro(“dept”)
If Mid(buffer, 1, 6) = Mid(list_depart.List(list_depart.ListIndex), 1, 6) Then
Ferramentas RAD do OpenBASE – Página 52
Exit For
End If
Next i
frm_edit.MousePointer = 11
‘Lê arquivo de descrição do departamemto e grava num arquivo local
result = a.OObtemTamanhoMemo(“dept”, “dept_desc”, howmany)
result = a.OPegaGravaItemMemo(“dept”, “dept_desc”,”c:\dlls\temp.txt”)
If FileLen(“c:\dlls\temp.txt”) <> 0 Then
edit_desp.Text = Space(0)
Dim tempchar As String * 1000
Open “c:\dlls\temp.txt” For Binary Access Read As #1
Do While Not EOF(1)
Get #1, , tempchar
edit_desp.Text = edit_desp.Text + tempchar
Loop
Close #1
Else
edit_desp.Text = Space(0)
End If
song1.Caption = “tamanho da descrição do departamento:” + Str(howmany)
***Este bloco do programa é usado para a função PegaGravaItemMemo***********
result = a.OObtemTamanhoMemo(“dept”, “dept_music”, howmany)
result = a.OPegaGravaItemMemo(“dept”, “dept_music”, “c:\dlls\temp.BMP”)
If FileLen(“c:\dlls\temp.bmp”) <> 0 Then
frm_edit.Image_music.Picture = LoadPicture(“c:\dlls\temp.bmp”)
Else
frm_edit.Image_music.Picture = LoadPicture()
End If
song2.Caption = “tamanho da musica do departamento:” + Str(howmany)
frm_edit.MousePointer = 0
End Sub
5.5.54 OLePoeItemMemo
Objetivo e utilização:
Essa função lê um arquivo local (entra) e grava para um especificado item memo (item) de um
determinado arquivo (arq).
Sintaxe:
long OLePoeItemMemo (bstr arq, bstr item, bstr entra)
Propriedades:
Exemplos:
Exemplo em VB:
Sub cmd_ok_Click ()
Dim buffer As String * 14
Dim temp_buffer As String * 6
Dim result As Integer
‘Entra nome do departamento no banco
‘Pega o número máximo de dept_code
Filename = “dept”
cc = a.OObtemRegistrosNoArquivo(Trim(Filename))
result = a.OReiniciaSequencial(“dept”)
For i = 1 To cc
result = a.OLeProximoRegistroSequencial(“dept”)
temp_buffer = a.OPegaRegistro(“dept”)
Ferramentas RAD do OpenBASE – Página 53
Next i
aa = Mid(temp_buffer, 1, 6)
maincode = Format(Val(aa) + 1, “000000”)
buffer = maincode + edit_department_name.Text
‘Inclui registro
result=a.OPoeRegistro(“dept”,buffer)
result = a.OIncluiTodoRegistro(Trim(Filename))
‘Posiciona no novo registro
result = a.OLePorChavePrimaria(“dept”, maincode)
‘Entre descrição do departamento no banco
buffer1 = edit_department_description.Text
If Len(Trim(buffer1)) <> 0 Then
Open “c:\dlls\temp.txt” For Output As #1
Print #1, buffer1
Close #1
result = a.OReadPutItemMemo(“dept”, “dept_desc”, “c:\dlls\temp.txt”)
End If
‘Entra musica do departamento no banco
If Len(Trim(putfilename)) <> 0 Then
result = a.OReadPutItemMemo(“dept”, “dept_music”, putfilename)
End If
‘fecha formulário corrente
Unload frm_add
End Sub
5.5.55 OExcluiItemMemo
Objetivo e utilização:
Deleta um item memo especificado de um determinado arquivo.
Sintaxe:
long OExcluiItemMemo (bstr arq, bstr item)
Propriedades:
Exemplos:
Exemplo em VB:
Sub cmd_delete_Click ()
Dim buffer As String * 8
‘posiciona no registro
result = a.OLePorChavePrimaria(“dept”, Mid(list_depart.List(list_depart.ListIndex), 1, 6))
frm_edit.MousePointer = 11
‘Exclui arquivo de descrição do departamento no banco
result = a.OExcluiItemMemo(“dept”, “dept_desc”)
‘Exclui arquivo musica do departamento no banco
result = a.OExcluiItemMemo(“dept”, “dept_music”)
‘Exclui registro do departmento no banco
result = a.OExcluiRegistro(“dept”)
‘reset listbox
list_depart.Clear
Call reset_list
frm_edit.MousePointer = 0
End Sub
5.5.56 OObtemPercursoArquivoMemo
Objetivo e utilização:
Indica o diretório no qual esta definido o item memo, do arquivo selecionado.
Ferramentas RAD do OpenBASE – Página 54
Sintaxe:
string OObtemPercursoArquivoMemo(bstr arq,bstr item)
Propriedades:
Exemplos:
5.5.57 OObtemTamanhoMemo
Objetivo e utilização:
Retorna o tamanho de um determinado item memo especificado (parametro item ) de um determinado
arquivo especificado (arq).
Sintaxe:
long OObtemTamanhoMemo (bstr arq, bstr item)
Propriedades:
Exemplos:
Exemplo em VB:
result = a.OObtemTamanhoMemo(“dept”, “dept_music”)
6
Utilização do OPenBASE como objeto COM
Um Banco de Dados OpenBASE pode ser acessado como um objeto COM por linguagens de programação
dos ambientes Windows, tais como Visual Basic e Delphi e também por linguagens Script, tais como VBA,
JavaScript, Jscript, Perl, ASP (Active Server Pages) , PHP (PHP: Hypertext Preprocessor) e Python.
Apresentamos, a seguir, vários exemplos, utilizando, respectivamente, Visual Basic, Delphi, PHP, ASP,
Perl e Python.
6.1
Exemplo Visual Basic utilizando OBCOM
Veja o exemplo a seguir, codificado em VBA, acessando uma Base de Dados OpenBASE remota.
O esquema do banco usado neste exemplo é o seguinte:
Banco EXEMPLO 1
nome: PESSOA E
NOMEP(0) U20
IDADE
N3
A subrotina que contém o Script VBA, utilizando os métodos do objeto COM OBcom (OBCOM.DLL), é a
seguinte:
Sub LeBanco()
Dim com As Object
Dim ret As Long
Dim cnt As Long
Dim valo As String
Set com=CreateObject(“OpenBase.Obcom.1”)
ret=com.IniciaServidor(“ts8”)
ret=com.OAbreBancoDeDados(“EXEMPLO”,”com”,1,2)
cnt=com.OobtemRegistrosNoArquivo(“PESSOA”)
ret=com.OReiniciaSequencial(“PESSOA”)
Worksheets(“Plan1”).[d4:e10].Clear
For i = 1 to cnt
ret=com.OleProximoRegistroSequencial(“PESSOA”)
With ActiveSheet
Cells(I+3,4).Value = com.OpegaItem(“PESSOA”,”NOMEP”)
Cells(I+3,5).Value = com.OpegaItem(“PESSOA”,”IDADE”)
EndWith
Ferramentas RAD do OpenBASE – Página 55
Next I
ret = com.OfechaBancoDeDados(0)
ret = com.OfinalizaServidor(0)
Set com = Nothing
End Sub
6.2
Exemplo Delphi utilizando OBCOM
Veja o exemplo a seguir, codificado em Delphi, acessando uma Base de Dados OpenBASE remota.
O esquema do banco usado neste exemplo é o seguinte:
Banco EXEMPLO 1
nome: PESSOA E
NOMEP(0) U20
IDADE
N3
A subrotina Delphi, utilizando os métodos do objeto COM OBcom (OBCOM.DLL), é a seguinte:
…
…
…
6.3
Exemplo PHP utilizando OBCOM
Veja o exemplo a seguir, acessando uma Base de Dados OpenBASE Local.
O esquema do banco usado neste exemplo é o seguinte:
Banco EXEMPLO 1
nome: PESSOA E
NOMEP(0) U20
IDADE
N3
O Script PHP é o seguinte:
<?
$gw_ida="***" ;
$Banco = "C:\\usr\\tsgbd\\tsdic\\EXEMPLO" ;
$nivel = "a" ;
$seguranca = 1 ;
$modo = "2" ;
$Arquivo="PESSOA" ;
//print "Content_Length ==> " . $CONTENT_LENGTH . "\r\n" ;
if (isset($in_nome))
//if ($CONTENT_LENGTH > 0)
{
$com = new COM("OpenBase.OBcom.1") or die("Unable to instanciate Object");
$result=$com->OAbreBancoDeDados($Banco,$nivel,$seguranca,$modo);
// print "Abre ==> " . $result . "\r\n" ;
$result=$com->OObtemRegistrosNoArquivo($Arquivo);
// print "Registros ==> " . $result . "\r\n" ;
$com->OLeRegistroPorChavePrimaria($Arquivo,$in_nome);
$in_nome=$com->OPegaItem($Arquivo,"NOMEP");
$gw_ida=$com->OPegaItem($Arquivo,"IDADE");
$result=$com->OFechaBancoDeDados(0);
}
?>
<HTML>
<BODY>
<h2>Demonstração OpenBASE COM - PHP</h2>
Ferramentas RAD do OpenBASE – Página 56
<Form method="post" action="<? echo $SCRIPT_NAME; ?>">
Informe o Nome:
<input type="text" size=20 name="in_nome" value="<?= $in_nome ?>">
<input type="submit" name="in_cont" value="Continua">
<b><br><br>Resultados:<br>
<ul>
<li>Nome ==> <?= $in_nome?><br>
<li>Idade ==> <?= $gw_ida?><br>
<li>Botão ==> <?= $in_cont?></b>
<eul>
</form>
</body>
</html>
6.4
Exemplo ASP utilizando OBCOM
Veja o exemplo a seguir, acessando uma Base de Dados OpenBASE Local. O esquema do banco usado
neste exemplo é o seguinte:
Banco EXEMPLO 1
nome: PESSOA E
NOMEP(0) U20
IDADE
N3
O Script ASP é o seguinte:
<%@ Language=VBScript %>
<%
Option Explicit
Response.Expires = 0
Dim com
Dim Banco, Arquivo, nivel, seguranca, modo
Dim ret, Mensagem
Dim gw_nome, gw_cont, gw_ida
gw_nome="??????????"
gw_ida="***"
Banco = "C:\usr\tsgbd\tsdic\EXEMPLO"
nivel = "a"
seguranca = 1
modo = "2"
Arquivo="PESSOA"
If Request.ServerVariables("CONTENT_LENGTH") <> 0 Then
gw_nome = Trim(Request.Form("in_nome"))
gw_cont = Trim(Request.Form("in_cont"))
Set com=CreateObject("OpenBase.OBcom.1")
ret=com.OAbreBancoDeDados(Banco, nivel, seguranca, modo)
ret=com.OLeRegistroPorChavePrimaria(Arquivo, gw_nome)
gw_nome=com.OPegaItem(Arquivo,"NOMEP")
gw_ida=com.OPegaItem(Arquivo,"IDADE")
ret=com.OFechaBancoDeDados(0)
Set com=Nothing
End If
%>
<HTML>
Ferramentas RAD do OpenBASE – Página 57
<BODY>
<h2>Demonstração OPUSWeb - ASP</h2>
<Form method="post" action="<%= Request.ServerVariables("SCRIPT_NAME") %>">
Informe o Nome:
<input type="text" size=20 name="in_nome" value="<%= gw_nome %>">
<input type="submit" name="in_cont" value="Continua">
<br>
<b>Nome:<%= gw_nome%>
<br>
Idade:<%= gw_ida%>
<br>
Botão:<%= gw_cont%></b>
</form>
</body>
</html>
6.5
Exemplo PERL utilizando OBCOM
Veja o exemplo a seguir, acessando uma Base de Dados OpenBASE Local.
O esquema do banco usado neste exemplo é o seguinte:
Banco EXEMPLO 1
nome: PESSOA E
NOMEP(0) U20
IDADE
N3
O Script Perl é o seguinte:
#!c:\perl\bin\perl
use Win32::OLE ;
use Win32::OLE ;
print "Content-type: text/html\n\n" ;
if ( $ENV{'CONTENT_LENGTH'} gt "0" ) {
$Banco = "C:\\usr\\tsgbd\\tsdic\\EXEMPLO" ;
$nivel = "a" ;
$seguranca = 1 ;
$modo = "2" ;
$Arquivo="PESSOA" ;
$result = 0 ;
$in_nome = "" ;
$result = $com = Win32::OLE->new('OpenBase.OBcom.1');
$result = $com->OAbreBancoDeDados($Banco,$nivel,$seguranca,$modo);
$result = $com->OObtemRegistrosNoArquivo($Arquivo);
&ReadParse;
$in_nome = $in{'in_nome'} ;
$result = $com->OLeRegistroPorChavePrimaria($Arquivo,$in_nome);
$in_nome = $com->OPegaItem($Arquivo,"NOMEP");
$gw_ida = $com->OPegaItem($Arquivo,"IDADE");
$result = $com->OFechaBancoDeDados(0);
}
$in_nome =~ s/[ ]*$//g; # remove trailing blanks
print<<"_TERMINA_"
<html><body>\n
<h2>Demonstra&ccedil;&atilde;o OpenBASE COM - Perl</h2>\n
Ferramentas RAD do OpenBASE – Página 58
<Form method='post' action='$ENV{'SCRIPT_NAME'}'>\n
Informe o Nome: \n
<input type='text' size=20 name='in_nome' value="$in_nome">
&nbsp;&nbsp;&nbsp;
<input type='submit' name='in_cont' value='Continua'>
<br><br>
_TERMINA_
;
if ( $ENV{'CONTENT_LENGTH'} gt "0" ) {
print<<"_TERMINA_"
<br><b>Resultados: <br>
<ul>
<li>Nome ==> $in_nome <br>
<li>Idade ==> $gw_ida <br>
<eul>
_TERMINA_
;
}
print<<"_TERMINA_"
</form></body></html>
_TERMINA_
;
sub ReadParse {
local (*in) = @_ if @_;
local ($i, $key, $val);
### replaced his MethGet function
if ( $ENV{'REQUEST_METHOD'} eq "GET" ) {
$in = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
} else {
# Added for command line debugging
# Supply name/value form data as a command line argument
# Format: name1=value1\&name2=value2\&...
# (need to escape & for shell)
# Find the first argument that's not a switch (-)
$in = ( grep( !/^-/, @ARGV )) [0];
$in =~ s/\\&/&/g;
}
@in = split(/&/,$in);
foreach $i (0 .. $#in) {
# Convert plus's to spaces
$in[$i] =~ s/\+/ /g;
# Split into key and value.
($key, $val) = split(/=/,$in[$i],2); # splits on the first =.
# Convert %XX from hex numbers to alphanumeric
$key =~ s/%(..)/pack("c",hex($1))/ge;
$val =~ s/%(..)/pack("c",hex($1))/ge;
# Associate key and value. \0 is the multiple separator
$in{$key} .= "\0" if (defined($in{$key}));
$in{$key} .= $val;
}
return length($in);
}
Ferramentas RAD do OpenBASE – Página 59
6.6
Exemplo PYTHON utilizando OBCOM
Veja o exemplo a seguir, acessando uma Base de Dados OpenBASE Local.
O esquema do banco usado neste exemplo é o seguinte:
Banco EXEMPLO 1
nome: PESSOA E
NOMEP(0) U20
IDADE
N3
O Script Python é o seguinte:
#!c:\util\python\python.exe
Banco = "C:\\usr\\tsgbd\\tsdic\\Exemplo"
nivel = "a"
seguranca = 1
modo = "2"
Arquivo="PESSOA"
gw_nome=" Digite aqui o nome ... "
gw_idade="***"
import win32com.client
def DisplayHTML(gw_nome,gw_idade):
import os
env=os.environ
script=str(env.get('SCRIPT_NAME'))
print "Content-Type: text/html\r\n\r\n"
print "<HTML><BODY>"
print "<h2>Demonstração OpenBASE - COM - Python</h2>"
print '<Form method="post" action="'+script+'">'
print '<INPUT TYPE=HIDDEN NAME="in_key" VALUE="process">'
print "Informe o Nome: "
print '<input type="text" size=20 name="in_nome" value="'+gw_nome+'">'
print '<input type="submit" name="in_cont" value="Continua">'
print "<br><br><br><b>Resultados: <br>"
print "<ul>"
print "<li>Nome ==> " + gw_nome + "<br>"
print "<li>Idade ==> " + gw_idade
print "<eul>"
print "</b></form></body></html>"
def ProcessForm(form):
# extract the information from the form in easily digestible format
try:
gw_nome = form["in_nome"].value
o = win32com.client.Dispatch("OpenBase.OBcom.1")
r = o.OAbreBancoDeDados(Banco, nivel, seguranca, modo)
r = o.OObtemRegistrosNoArquivo(Arquivo)
r = o.OLeRegistroPorChavePrimaria(Arquivo, gw_nome)
gw_idade = o.OPegaItem(Arquivo,"IDADE")
r = o.OFechaBancoDeDados(0)
except:
# name is required, so output an error if
# not given and exit script
#Display("You need to at least supply a name. Please go back.")
raise SystemExit
Ferramentas RAD do OpenBASE – Página 60
DisplayHTML(gw_nome,gw_idade)
###
### Begin actual script
###
### evaluate CGI request
import cgi
form = cgi.FieldStorage()
### "key" is a hidden form element with an
### action command such as "process"
try:
key = form["in_key"].value
except:
key = None
if key == "process":
ProcessForm(form)
else:
DisplayHTML(gw_nome,gw_idade)
6.7
Observações importantes
•
Os exemplos acima foram testados nos seguintes servidores WEB:
•
Apache
•
Microsoft PWS
•
Xitami
•
OmniHttpd
•
Sambar
• Deve ser instado e configurado o PHP, o Python e o Perl, conforme as necessidades, assim como um
servidor WEB, conforme as preferências
• As DLLs OBCOM.DLL OBCOM.TLB e OBDCOM.DLL são distribuídas com o OpenBASE
(OPUSWIN). O módulo OBCOM.DLL utiliza as funções contidas na ROTWIN32.DLL e o
OBDCOM.DLL (OBCOM distribuído) utiliza as funções contidas na CLIWIN32.DLL
• Os componentes OBCOM (ou OBDCOM) devem ser "registrados" no Windows, através do seguinte
comando: regsvr32 obcom.dll (ou regsvr32 obdcom.dll)
• O processo de registrar componentes no Windows freqüentemente apresenta problemas, pois é
necessário que as cadeias de dependências entre DLLs e outros objetos estejam completamente
corretas. Utilize o programa depends.exe, que pode ser baixado (free) da Internet
• Se o Banco de Dados OpenBASE for local, será utilizada a DLL OBCOM.DLL, que deve estar no
diretório WINDOWS (ou WINDOWS/SYSTEM), assim como as DLLs ROTWIN32.DLL,
MFC42D.DLL, MFCO32D.DLL, MSVCRTD.DLL, OLEAUT32.DLL e KERNEL32.DLL.
• Se o Banco de Dados OpenBASE estiver num outro host diferente do host local (ou seja, onde está o
servidor Web e as páginas ASP ou PHP) será utilizada a DLL OBDCOM.DLL, que deve estar no
diretório WINDOWS ou (WINDOWS/SYSTEM), assim como as DLLs CLIWIN32.DLL,
MFC42D.DLL, MFCO32D.DLL, MSVCRTD.DLL, OLEAUT32.DLL e KERNEL32.DLL.
Querendo acessar Bases de Dados em outros ambientes Windows é so trocar OBCOM por OBDCOM
(OBCOM distribuído) não esquecendo de incluir, no início e fim dos procedimentos de acesso ao Banco de
Dados OpenBASE os comandos para se conectar ao servidor OpenBASE, por exemplo:
Para scripts PHP:
$result=$com->OIniciaServidor(<nome-host>)
$result=$com->OFinalizaServidor(0)
Para scripts ASP:
ret=com.OIniciaServidor(<nome_host>)
ret=com.OFinalizaServidor(0)
Ferramentas RAD do OpenBASE – Página 61
7
Apêndices
A funções do OpenBASE incluidas nas bibliotecas dinâmicas ROTWIN32.DLL e CLIWIN32.DLL
devem ser declaradas nos programas que as utilizam. Para facilitar a programação, a Tecnocoop distribui
módulos fonte com todas as funções a serem declaradas nos programas desenvolvidps nos ambientes
Visual BASIC e DELPHI.
As declarações das rotinas, descritas nos apêndices A e B, estão contidadas nos arquivos tsgbd.bas (veja
apêndice A) e tsgbd.pas (veja apêndice B), que são distribuídos pela Tecnocoop Sistemas junto com as
DLLs ROTWIN32.DLL e CLIWIN32.DLL.
7.1
Apêndice A: tsgbd.bas
As declarações das rotinas para ambientes Visual Basic estão contidas no arquivo tsgbd.bas, distribuído
junto com as DLLs ROTWIN32.DLL e CLIWIN32.DLL.
A seguir listamos o arquivo tsgbd.bas, contendo a declaração de todas as funções incluídas nas
bibliotecas dinâmicas ROTWIN32.DLL e CLIWIN32.DLL, a serem utilizadas em sistemas desenvolvidos
em Visual Basic.
Attribute VB_Name = “Module2”
Option Explicit
Type Itens
NomIte As String * 13
End Type
Declare Function LigaOpcao Lib “cliwin32.dll” (ByVal opcao As String) As Long
Declare Function DesligaOpcao Lib “cliwin32.dll” (ByVal opcao As String) As Long
‘Convert
Declare Function PoeItem Lib “cliwin32.dll” (ByVal lparq$, ByVal Xsai$, ByVal xent$) As Long
Declare Function PoeItemBuffer Lib “cliwin32.dll” (ByVal lparq$, ByVal Xsai$, posi As Long, ByVal xent$)
As Long
‘Convert
Declare Function PegaItem Lib “cliwin32.dll” (ByVal lparq$, ByVal xent$, ByVal Xsai$) As Long
Declare Function PegaItemBuffer Lib “cliwin32.dll” (ByVal lparq$, ByVal xent$, posi As Long, ByVal
Xsai$) As Long
‘Memo
Declare Function PegaItemMemo Lib “cliwin32.dll” (ByVal lparq$, ByVal lpItem$, ByVal area$, Valor As
Long) As Long
Declare Function PoeItemMemo Lib “cliwin32.dll” (ByVal lparq$, ByVal lpItem$, ByVal area$, Valor As
Long) As Long
Declare Function LePoeItemMemo Lib “cliwin32.dll” (ByVal lparq$, ByVal lpItem$, ByVal sai$) As Long
Declare Function PegaGravaItemMemo Lib “cliwin32.dll” (ByVal lparq$, ByVal lpItem$, ByVal sai$) As
Long
‘ bdbmem
Declare Function PegaMemo Lib “cliwin32.dll” (ByVal lparq$, ByVal lpItem$, ByVal sai$, ByVal tam As
Long, lid As Long, ByVal ofe As Long) As Long
‘ bdamem
Declare Function PoeMemo Lib “cliwin32.dll” (ByVal lparq$, ByVal lpItem$, ByVal sai$, ByVal tam As
Long, ByVal flg$) As Long
‘ bdkmem
Declare Function ObtemTamanhoMemo Lib “cliwin32.dll” (ByVal lparq$, ByVal lpItem$, tam As Long) As
Long
‘ bdimem
Ferramentas RAD do OpenBASE – Página 62
Declare Function ObtemPercursoArquivoMemo Lib “cliwin32.dll” (ByVal lparq$, ByVal lpItem$, ByVal
nome$) As Long
‘ bdabre:
Declare Function AbreBancoDeDados Lib “cliwin32.dll” (ByVal lpBanco$, ByVal lpNivel$, ByVal
dwSeguranca As Long, ByVal wModo As Long) As Long
‘ bdjudi:
Declare Function JuntaBancoDeDados Lib “cliwin32.dll” (ByVal lpBanco$, ByVal lpNivel$, ByVal
dwSeguranca As Long, ByVal wModo As Long) As Long
‘ bdfech:
Declare Function FechaBancoDeDados Lib “cliwin32.dll” () As Long
‘ bdpegs:
Declare Function LeProximoSequencial Lib “cliwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens,
pBufferItens As Any) As Long
Declare Function LeProximoRegistroSequencial Lib “cliwin32.dll” (ByVal lpArquivo$, lpBufferItens As
Any) As Long
‘ bdpegi:
Declare Function LeAnteriorSequencial Lib “cliwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens,
lpBufferItens As Any) As Long
Declare Function LeRegistroAnteriorSequencial Lib “cliwin32.dll” (ByVal lpArquivo$, lpBufferItens As
Any) As Long
‘ bdpegd:
Declare Function PosicionaNoRegistro Lib “cliwin32.dll” (ByVal lpArquivo$, ByVal dwEndereco As Long)
As Long
‘ bdposi
Declare Function PosicionaNoRegistroPorChave Lib “cliwin32.dll” (ByVal lpArquivo$, ByVal Valor$) As
Long
‘ bdpegd:
Declare Function LeRegistroPorEndereco Lib “cliwin32.dll” (ByVal lpArquivo$, lpBufferItens As Any,
ByVal dwEndereco As Long) As Long
Declare Function LePorEndereco Lib “cliwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens,
lpBufferItens As Any, ByVal dwEndereco As Long) As Long
‘ bdpegd (0):
Declare Function ReiniciaSequencial Lib “cliwin32.dll” (ByVal lpArquivo$) As Long
‘ bdpegc:
Declare Function LeProximoCadeia Lib “cliwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens,
lpBufferItens As Any) As Long
Declare Function LeProximoRegistroCadeia Lib “cliwin32.dll” (ByVal lpArquivo$, lpBufferItens As Any)
As Long
‘ bdpegt:
Declare Function LeAnteriorCadeia Lib “cliwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens,
lpBufferItens As Any) As Long
Declare Function LeRegistroAnteriorCadeia Lib “cliwin32.dll” (ByVal lpArquivo$, lpBufferItens As Any)
As Long
‘ bdachc:
Declare Function IniciaCadeia Lib “cliwin32.dll” (ByVal lpArquivo$, ByVal lpChave$, ByVal lpValor$) As
Long
‘ bdpegp:
Declare Function LeProximoPorPrefixo Lib “cliwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens,
lpBufferItens As Any) As Long
Declare Function LeProximoRegistroPorPrefixo Lib “cliwin32.dll” (ByVal lpArquivo$, lpBufferItens As
Any) As Long
‘ bdpegv:
Declare Function LeAnteriorPorPrefixo Lib “cliwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens,
lpBufferItens As Any) As Long
Ferramentas RAD do OpenBASE – Página 63
Declare Function LeRegistroAnteriorPorPrefixo Lib “cliwin32.dll” (ByVal lpArquivo$, lpBufferItens As
Any) As Long
‘ bdachp:
Declare Function IniciaPorPrefixo Lib “cliwin32.dll” (ByVal lpArquivo$, ByVal lpChave$, ByVal lpValor$)
As Long
‘ bdpegm:
Declare Function LePorChavePrimaria Lib “cliwin32.dll” (ByVal lpArquivo$, ByVal lpValor$,
lpListaItens() As Itens, lpBufferItens As Any) As Long
Declare Function LeRegistroPorChavePrimaria Lib “cliwin32.dll” (ByVal lpArquivo$, ByVal lpValor$,
lpBufferItens As Any) As Long
‘ bdesch:
Declare Function EscolheChave Lib “cliwin32.dll” (ByVal lpArquivo$, ByVal lpChave$) As Long
‘ bdbloq:
Declare Function Bloqueia Lib “cliwin32.dll” () As Long
Declare Function IniciaTransacao Lib “cliwin32.dll” () As Long
‘ bddesb:
Declare Function DesBloqueia Lib “cliwin32.dll” () As Long
Declare Function FinalizaTransacao Lib “cliwin32.dll” () As Long
‘ bddesf:
Declare Function DesfazTransacao Lib “cliwin32.dll” () As Long
‘ bdexcl:
Declare Function ExcluiRegistro Lib “cliwin32.dll” (ByVal lpArquivo$) As Long
Declare Function ExcluiRegistroCascata Lib “cliwin32.dll” (ByVal lpArquivo$) As Long
Declare Function ExcluiRegistroPoeNulo Lib “cliwin32.dll” (ByVal lpArquivo$) As Long
‘ bdincl:
Declare Function IncluiRegistro Lib “cliwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens, lpBufferItens
As Any) As Long
Declare Function IncluiTodoRegistro Lib “cliwin32.dll” (ByVal lpArquivo$, lpBufferItens As Any) As Long
‘ bdtroc:
Declare Function AlteraRegistro Lib “cliwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens,
lpBufferItens As Any) As Long
Declare Function AlteraTodoRegistro Lib “cliwin32.dll” (ByVal lpArquivo$, lpBufferItens As Any) As Long
‘ bdinca:
Declare Function AlteraRegistroCascata Lib “rotwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens,
lpBufferItens As Any) As Long
Declare Function AlteraTodoRegistroCascata Lib “rotwin32.dll” (ByVal lpArquivo$, lpBufferItens As Any)
As Long
Declare Function AlteraRegistroPoeNulo Lib “rotwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens,
lpBufferItens As Any) As Long
Declare Function AlteraTodoRegistroPoeNulo Lib “rotwin32.dll” (ByVal lpArquivo$, lpBufferItens As Any)
As Long
Declare Function IncluiTodoRegistroNaCadeia Lib “cliwin32.dll” (ByVal lpArquivo$, lpBufferItens As
Any) As Long
Declare Function IncluiRegistroNaCadeia Lib “cliwin32.dll” (ByVal lpArquivo$, lpListaItens() As Itens,
lpBufferItens As Any) As Long
‘ bddmem
Declare Function ExcluiItemMemo Lib “cliwin32.dll” (ByVal lpArquivo$, ByVal lpItem$) As Long
‘ bderro:
Declare Function ObtemMensagem Lib “cliwin32.dll” (ByVal lpMensagem$) As Long
‘ bdpval
Declare Function ObtemRegistrosNoArquivo Lib “cliwin32.dll” (ByVal lpArquivo$) As Long
‘ bdin31
Declare Function ObtemRegistrosNaCadeia Lib “cliwin32.dll” (ByVal lpArquivo$) As Long
‘ bdin31
Ferramentas RAD do OpenBASE – Página 64
Declare Function ObtemEnderecoAtual Lib “cliwin32.dll” (ByVal lpArquivo$) As Long
‘ inicli:
Declare Function IniciaServidor Lib “cliwin32.dll” (ByVal lpEndereco$) As Long
‘ tercli:
Declare Function FinalizaServidor Lib “cliwin32.dll” () As Long
‘ bdesva
Declare Function EsvaziaArquivo Lib “cliwin32.dll” (ByVal lpArquivo$) As Long
‘bdcntrl
Declare Function ObtemCliente Lib “cliwin32.dll” (ByVal lpCliente$) As Long
Declare Function ObtemDiretorio Lib “cliwin32.dll” (ByVal lpDiret$) As Long
‘ bdsalv
Declare Function SalvaTabelaExecucao Lib “cliwin32.dll” ByVal lpArquivo$, ByVal lpArea$) As Long
‘ bdrest
Declare Function RestauraTabelaExecucao Lib “cliwin32.dll” (ByVal lpArquivo$, ByVal lpArea$) As Long
Type Info11
QtdIte As Integer
NumIte As Integer
End Type
Declare Function ObtemItensDoArquivo Lib “cliwin32.dll” (ByVal arq As Integer, inf As Info11) As Long
Type Info12
NuArCh As Integer
NivLei As Integer
NivGra As Integer
NumArq As Integer
TamIte As Integer
PosIte As Integer
QtdDec As Integer
NomIte As String * 13
TipIte As String * 1
End Type
Declare Function ObtemInfoSobreItem Lib “cliwin32.dll” (ByVal ite As Integer, inf As Info12) As Long
Type Info13a
QtItCh As Integer
End Type
Declare Function ObtemQtdChaves Lib “cliwin32.dll” (ByVal ite As Integer, inf As Info13a) As Long
Type Info13b
NuArqM As Integer
NuLigM As Integer
NuChaD As Integer
End Type
Declare Function ObtemChaves Lib “cliwin32.dll” (ByVal ite As Integer, inf() As Info13b) As Long
Type Info14
NumIte As Integer
End Type
Declare Function ObtemNumeroDoItem Lib “cliwin32.dll” (ByVal ite As String, inf As Info14) As Long
Type Info15
TamCab As Integer
TamDad As Integer
NumEsq As Integer
TamVir As Integer
TamTot As Integer
NomArq As String * 13
DirArq As String * 41
TipArq As String * 1
Ferramentas RAD do OpenBASE – Página 65
End Type
Declare Function ObtemInfoSobreArquivo Lib “cliwin32.dll” (ByVal arq As Integer, inf As Info15) As Long
Type Info16a
QtArqD As Integer
NuItCh As Integer
End Type
Declare Function ObtemQtdLigacoes Lib “cliwin32.dll” (ByVal arq As Integer, inf As Info16a) As Long
Type Info16b
NuArqD As Integer
NuLigD As Integer
NuIteD As Integer
End Type
Declare Function ObtemLigacoes Lib “cliwin32.dll” (ByVal arq As Integer, inf() As Info16b) As Long
Type Info17
NumArq As Integer
End Type
Declare Function ObtemNumeroDoArquivo Lib “cliwin32.dll” (ByVal arq As String, inf As Info17) As Long
Type Info18a
QtdArq As Integer
End Type
Declare Function ObtemQtdJuncoes Lib “cliwin32.dll” (ByVal arq As Integer, inf As Info18a) As Long
Type Info18b
NumArq As Integer
ArqOri As Integer
ChvOri As Integer
End Type
Declare Function ObtemJuncoes Lib “cliwin32.dll” (ByVal arq As Integer, inf() As Info18b) As Long
Type Info19a
QtdIte As Integer
End Type
Declare Function ObtemQtdVirtuais Lib “cliwin32.dll” (ByVal arq As Integer, inf As Info19a) As Long
Type Info19b
NumIte As Integer
End Type
Declare Function ObtemVirtuais Lib “cliwin32.dll” (ByVal ite As Integer, inf() As Info19b) As Long
Type Info20
TipCha As Integer
NumInd As Integer
End Type
Declare Function ObtemTipoDaChave Lib “cliwin32.dll” (ByVal ite As Integer, inf As Info20) As Long
Type Info21a
QtdIte As Integer
End Type
Declare Function ObtemQtdItensBasicos Lib “cliwin32.dll” (ByVal arq As Integer, inf As Info21a) As Long
Type Info21b
NumIte As Integer
End Type
Declare Function ObtemItensBasicos Lib “cliwin32.dll” (ByVal ite As Integer, inf() As Info21b) As Long
Type Info22a
QtdIte As Integer
End Type
Declare Function ObtemQtdRedefinicoes Lib “cliwin32.dll” (ByVal arq As Integer, inf As Info22a) As Long
Type Info22b
Ferramentas RAD do OpenBASE – Página 66
NumIte As Integer
End Type
Declare Function ObtemRedefinicoes Lib “cliwin32.dll” (ByVal ite As Integer, inf() As Info22b) As Long
Type Info23
NivAbr As Integer
Niveis(15) As String * 7
End Type
Declare Function ObtemNiveis Lib “cliwin32.dll” (inf As Info23) As Long
Type Info30
QtdArq As Integer
Modo As Integer
ArqRec As Integer
QtdIte As Integer
SubEsq As Integer
BlqArq As Integer
RecMax As Long
End Type
Declare Function ObtemInfoSobreBanco Lib “cliwin32.dll” (inf As Info30) As Long
Type Info31
QtdCad As Long
RegAnt As Long
RegAtu As Long
RegSeg As Long
UltAce As Long
IteChs As Integer
NumLis As Integer
End Type
Declare Function ObtemInfoSobreCadeia Lib “cliwin32.dll” (inf As Info31) As Long
‘ crypt
Declare Function crypt Lib “cliwin32.dll” (ByVal ent$, ByVal sal$, ByVal sai$) As Long
7.2
Apêndice B: tsgbd.pas
As declarações das rotinas para ambientes Dephi estão contidas no arquivo tsgbd.pas, distribuído junto
com as DLLs ROTWIN32.DLL e CLIWIN32.DLL.
A seguir listamos o arquivo tsgbd.pas, contendo a declaração de todas as funções incluídas nas
bibliotecas dinâmicas ROTWIN32.DLL e CLIWIN32.DLL, a serem utilizadas em sistemas desenvolvidos
em Delphi.
unit tsgbd;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls;
{Funcoes OpenBASE}
function AbreBancoDeDados(Nome:Pointer;Nivel:
Pointer; Seguranca:integer;Modo:integer):integer;
stdcall; external ‘RotWin32.dll’;
function FechaBancoDeDados:integer; stdcall;
external ‘RotWin32.dll’;
function JuntaBancoDeDados(Nome:Pointer;Nivel: Pointer; Seguranca:integer;Modo:integer):
integer; stdcall;external RotWin32.dll’;
function IniciaServidor(Endereco:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
Ferramentas RAD do OpenBASE – Página 67
function FinalizaServidor:integer;stdcall;
external ‘RotWin32.dll’;
function ObtemCliente(Cliente:Pointer):
integer; stdcall;external ‘RotWin32.dll’;
function ObtemMensagem(Mensagem:Pointer):
integer; stdcall;external ‘RotWin32.dll’;
function ObtemDiretorio(Dir:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function EsvaziaArquivo(Arquivo:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ReiniciaSequencial(Arquivo:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LeProximoRegistroSequencial
(Arquivo:Pointer;Buffer:Pointer):
integer; stdcall;external ‘RotWin32.dll’;
function LeProximoSequencial(Arquivo:Pointer;LstItens:
Pointer; Buffer:Pointer):integer; stdcall;external ‘RotWin32.dll’;
function LeRegistroAnteriorSequencial
(Arquivo:Pointer;Buffer:Pointer):
integer;stdcall;external ‘RotWin32.dll’;
function LeAnteriorSequencial
(Arquivo:Pointer;LstItens:Pointer;Buffer:Pointer):i
integer; stdcall;external ‘RotWin32.dll’;
function IniciaCadeia
(Arquivo:Pointer;Chave:Pointer;Valor:Pointer):
integer; stdcall;external ‘RotWin32.dll’;
function LeProximoRegistroCadeia
(Arquivo:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LeProximoCadeia
(Arquivo:Pointer;LstItens:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LeRegistroAnteriorCadeia
(Arquivo:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LeAnteriorCadeia
(Arquivo:Pointer;LstItens:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function IniciaPorPrefixo
(Arquivo:Pointer;Chave:Pointer;Valor:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LeProximoRegistroPorPrefixo
(Arquivo:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LeProximoPorPrefixo
(Arquivo:Pointer;LstItens:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LeRegistroAnteriorPorPrefixo
(Arquivo:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LeAnteriorPorPrefixo
(Arquivo:Pointer;LstItens:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LeRegistroPorChavePrimaria
Ferramentas RAD do OpenBASE – Página 68
(Arquivo:Pointer;Valor:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LePorChavePrimaria
(Arquivo:Pointer;Valor:Pointer;LstItens:Pointer;Buffer:Pointer):
integer; stdcall;external ‘RotWin32.dll’;
function ObtemEnderecoAtual(Arquivo:Pointer):longint;
stdcall;external ‘RotWin32.dll’;
function PosicionaNoRegistro
(Arquivo:Pointer;Endereco:longint):integer;
stdcall;external ‘RotWin32.dll’;
function PosicionaNoRegistroPorChave
(Arquivo:Pointer;valorchave:pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LeRegistroPorEndereco
(Arquivo:Pointer;Buffer:Pointer;Endereco:longint):integer;
stdcall;external ‘RotWin32.dll’;
function LePorEndereco
(Arquivo:Pointer;LstItens:Pointer;Buffer:Pointer;Endereco:longint):
integer;stdcall;external ‘RotWin32.dll’;
function ExcluiRegistro(Arquivo:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ExcluiRegistroCascata(Arquivo:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ExcluiRegistroPoeNulo(Arquivo:Pointer):
integer; stdcall;external ‘RotWin32.dll’;
function IncluiTodoRegistro
(Arquivo:Pointer;Buffer:Pointer): integer;
stdcall;external ‘RotWin32.dll’;
function IncluiRegistro
(Arquivo:Pointer;LstItens:Pointer;Buffer:Pointer):
integer; stdcall;external ‘RotWin32.dll’;
function IncluiTodoRegistroNaCadeia
(Arquivo:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function IncluiRegistroNaCadeia
(Arquivo:Pointer;LstItens:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function AlteraTodoRegistro
(Arquivo:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function AlteraTodoRegistroCascata
(Arquivo:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function AlteraTodoRegistroPoeNulo
(Arquivo:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function AlteraRegistro
(Arquivo:Pointer;LstItens:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function AlteraRegistroCascata
(Arquivo:Pointer;LstItens:Pointer;Buffer:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function AlteraRegistroPoeNulo
(Arquivo:Pointer;LstItens:Pointer;Buffer:Pointer):integer;
Ferramentas RAD do OpenBASE – Página 69
stdcall;external ‘RotWin32.dll’;
function ObtemRegistrosNoArquivo(Arquivo:Pointer):
integer; stdcall;external ‘RotWin32.dll’;
function ObtemRegistrosNaCadeia(Arquivo:Pointer):
integer; stdcall;external ‘RotWin32.dll’;
function EscolheChave(Arquivo:Pointer;Chave:Pointer):
integer; stdcall;external ‘RotWin32.dll’;
function PegaMemo (Arquivo:Pointer;Item:Pointer;Saida:
Pointer;Tamanho: integer;Lid:integer; Ofe:integer):integer;
stdcall;external ‘RotWin32.dll’;
function PoeMemo (Arquivo:Pointer;Item:Pointer;Saida:
Pointer;Tamanho:integer;Flg:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function PegaItemMemo(Arquivo:Pointer;Item:Pointer;
Saida:Pointer;Valor:integer):integer;stdcall;external ‘RotWin32.dll’;
function PoeItemMemo(Arquivo:Pointer;Item:Pointer;
Entrada: Pointer;Valor:integer):integer;stdcall;external ‘RotWin32.dll’;
function PegaGravaItemMemo(Arquivo:Pointer;Item:
Pointer;Saida:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function LePoeItemMemo(Arquivo:Pointer;Item:
Pointer;Entrada:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ExcluiItemMemo
(Arquivo:Pointer;Item:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemTamanhoMemo
(Arquivo:Pointer;Item:Pointer;Tamanho:integer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemPercursoArquivoMemo
(Arquivo:Pointer;Item:Pointer;Nome:integer):integer;
stdcall;external ‘RotWin32.dll’;
function PoeItem(Item:Pointer;Entrada:Pointer;
Valor:Pointer):integer;stdcall;external ‘RotWin32.dll’;
function PoeItemBuffer
(Item:Pointer;Entrada:Pointer;Pos:integer;Valor:Pointer):
integer;stdcall;external ‘RotWin32.dll’;
function PegaItem(Item:Pointer;Entrada:Pointer;Valor:
Pointer):integer;stdcall;external ‘RotWin32.dll’;
function PegaItemBuffer
(Item:Pointer;Entrada:Pointer;Pos:integer;Valor:Pointer):
integer;stdcall;external ‘RotWin32.dll’;
function Bloqueia:integer;stdcall;external ‘RotWin32.dll’;
function IniciaTransacao:integer;stdcall;external ‘RotWin32.dll’;
function Desbloqueia:integer; stdcall;external ‘RotWin32.dll’;
function FinalizaTransacao:integer;stdcall;external ‘RotWin32.dll’;
function DesfazTransacao:integer;
stdcall;external ‘RotWin32.dll’;
function SalvaTabelaExecucao
(Arquivo:Pointer;Area:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function RestauraTabelaExecucao
(Arquivo:Pointer;Area:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
Ferramentas RAD do OpenBASE – Página 70
function ObtemItensDoArquivo
(Arquivo:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemInfoSobreItem
(Item:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemQtdChaves
(Item:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemChaves
(Item:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemNumeroDoItem
(Item:Pointer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemInfoSobreArquivo
(Arquivo:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemQtdLigacoes
(Arquivo:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemLigacoes
(Arquivo:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemNumeroDoArquivo
(Arquivo:Pointer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemQtdJuncoes
(Arquivo:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemJuncoes
(Arquivo:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemQtdVirtuais
(Arquivo:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemVirtuais
(Item:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemTipoDaChave
(Item:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemQtdItensBasicos
(Arquivo:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemItensBasicos
(Item:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemQtdRedefinicoes
(Arquivo:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemRedefinicoes
(Item:integer;Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
Ferramentas RAD do OpenBASE – Página 71
function ObtemNiveis(Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemInfoSobreBanco(Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function ObtemInfoSobreCadeia(Inf:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
function crypt(Ent:Pointer;Sal:Pointer;Sai:Pointer):integer;
stdcall;external ‘RotWin32.dll’;
type
{Estruturas usadas pelas Funcoes OpenBASE}
itens = Packed Record
item: array[0..13] of Char;
end;
info11 = Packed Record
QtdIte: integer;
NumIte: integer;
end;
info12 = Packed Record
NuArCh: integer;
NivLei: integer;
NivGra: integer;
NumArq: integer;
TamIte: integer;
PosIte: integer;
QtdDec: integer;
NomIte: integer;
TipIte: integer;
end;
info13a = Packed Record
QtItCh: integer;
end;
info13b = Packed Record
NuArqM: integer;
NuLigM: integer;
NuChaD: integer;
end;
info14 = Packed Record
NumIte: integer;
end;
info15 = Packed Record
TamCab: integer;
TamDad: integer;
Numesq: integer;
TamVir: integer;
TamTot: integer;
NomArq: array[0..13] of Char;
DirArq: array[0..41] of Char;
TipArq: array[0..1] of Char;
Ferramentas RAD do OpenBASE – Página 72
end;
info16a = Packed Record
QtArqD: integer;
NuItCh: integer;
end;
info16b = Packed Record
NuArqD: integer;
NuLigD: integer;
NuIteD: integer;
end;
info17 = Packed Record
NumArq: integer;
end;
info18a = Packed Record
QtdArq: integer;
end;
info18b = Packed Record
NumArq: integer;
ArqOri: integer;
ChvOri: integer;
end;
info19a = Packed Record
QtdIte: integer;
end;
info19b = Packed Record
NumIte: integer;
end;
info20 = Packed Record
TipCha: integer;
end;
info21a = Packed Record
QtdIte: integer;
end;
info21b = Packed Record
NumIte: integer;
end;
info22a = Packed Record
qtdIte: integer;
end;
info22b = Packed Record
NumIte: integer;
end;
info23 = Packed Record
Ferramentas RAD do OpenBASE – Página 73
NivAbr: integer;
Niveis: array[0..15,0..7] of Char;
end;
info30 = Packed Record
QtdArq: integer;
Modo : integer;
ArqRec: integer;
QtdIte: integer;
SubEsq: integer;
BlqArq: integer;
RecMax: integer;
end;
info31 = Packed Record
QtdCad: integer;
RegAnt: integer;
RegAtu: integer;
RegSeg: integer;
UltAce: integer;
IteChs: integer;
NumLis: integer;
end;
TDataModule2 = class(TDataModule)
end;
var
DataModule2: TDataModule2;
implementation
{$R *.DFM}
end.
7.3
Apêndice C: Construindo DLLs
7.3.1 Opção $dll
Objetivo e utilização:
A opção SDLL serve para construir uma DLL dentro de um programa OpusWin.
Sintaxe:
$dll = < dll1 >
Argumentos:
< dll1 >
Representa o nome de uma dll.
Exemplos:
Os exemplos a seguir mostram a utilização desta opção de controle com a OpusWin e o Visual Basic.
Exemplo em OPUS:
$dll = test
proc p1
parameters var1, . . . ,varn
var1=“Segunda”
varn = “Fim”
return
Exemplo em Visual Basic:
a) declarações gerais
Ferramentas RAD do OpenBASE – Página 74
Option Explicit
Private Declare Function p1 Lib “test.dll”(ByVal a As
String, ByVal t As Integer) As Integer
Dim < cad1> As String * < tam1 >
Dim < cadn > As String * < tamn >
b) chamada
p1(< cad1 > , < tam1 >, . . . , < cadn > , < tamn >)
7.3.2 A DLL Defcom32.dll
Permite a execução do comando define em ambientes VB, Delphi ou OpusWin. Esta DLL somente tem
uma função, chamada defcom, que recebe como parâmetro uma string na forma:
“define –d<arqerr><esquema>”
7.3.2.1
Exemplo em VB:
Declare function defcom lib “defcom32.dll”(byval a as string) as integer
Ret = defcom (“define –desq.err esq.e”).
7.3.2.2
Exemplo em Opus
Rundll (“defcom32.dll”,”defcom”, “define –dp.err p.f”)
7.3.3 A DLL Opucom32.dll
Permite a execução do comando Opus em ambientes VB, Delphi ou OpusWin. Esta DLL somente tem uma
função, chamada opucom, que recebe como parâmetro uma string na forma:
“opus –a<arqerr><fonte>”
7.3.3.1
Exemplo em VB
Declare function opucom lib “opucom32.dll” (byval a as string) as integer
Ret = opucom (“opus –dp.err p.f”)
7.3.3.2
Exemplo em Opus
Rundll (“opucom32.dll”, “opucom”,”opus –dp.err p.f”)
Ferramentas RAD do OpenBASE – Página 75