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çã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"> <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