Académique Documents
Professionnel Documents
Culture Documents
Manual Básico
exibir: condição;
direito autoral
Este documento é protegido por Copyright © 2013 por seus colaboradores, conforme listado abaixo. Você
pode distribuí-lo e / ou modificá-lo sob os termos da Licença Pública Geral GNU (
http://www.gnu.org/licenses/gpl.html ), versão 3 ou posterior, ou da Licença de Atribuição Creative
Commons ( http : //creativecommons.org/licenses/by/3.0/ ), versão 3.0 ou posterior.
Todas as marcas registradas deste guia pertencem a seus legítimos proprietários.
Colaboradores
Jochen Schiffers Robert Großkopf Jost Lange
Avelã Russman Martin Fox Andrew Pitonyak
Dan Lewis Jean Hollis Weber
Agradecimentos
Este livro é baseado em um documento alemão original, que foi traduzido por Hazel Russman e Martin Fox.
Comentários
Por favor, envie quaisquer comentários ou sugestões sobre este documento para:
documentation@global.libreoffice.org
Conteúdo
direito autoral
Colaboradores
Comentários
Agradecimentos
Data de publicação e versão do software
Prefácio
Para quem é este livro?
O que há neste livro?
Onde obter mais ajuda
Sistema de ajuda
Suporte on-line gratuito
Suporte pago e treinamento
O que você vê pode ser diferente
Ilustrações
Ícones
Usando o LibreOffice em um Mac
Quais são todas essas coisas chamadas?
Quem escreveu este livro?
Perguntas frequentes
Capítulo 1 Introdução à Base
Introdução
Base - um contêiner para o conteúdo do banco de dados
Entrada de dados usando formulários
Entrada de dados diretamente em uma tabela
Consultas - obtendo informações sobre dados em tabelas
Relatórios - apresentação de dados
Capítulo 2 Criando um banco de dados
Notas gerais sobre a criação de uma base de dados
Novo banco de dados usando o mecanismo interno do HSQL
Acessando bancos de dados externos
Bancos de dados MySQL
bancos de dados dBase
Planilhas
Livro de endereços do Thunderbird
Capítulo 3 Tabelas
Informações gerais sobre tabelas
Relacionamentos entre tabelas
Relacionamentos para tabelas em bancos de dados
Tabelas e relacionamentos para o banco de dados de exemplo
Criando Tabelas
Criação usando a interface gráfica do usuário
Entrada direta de comandos SQL
Ligando Tabelas
Inserindo dados em tabelas
Entrada usando a GUI Base
Entrada direta usando SQL
Problemas com esses métodos de entrada de dados
Capítulo 4 Formulários
Formulários facilitam a entrada de dados
Criando formulários
Uma forma simples
Barras de ferramentas para design de formulário
Propriedades do formulário
Propriedades dos controles
Um formulário simples concluído
Principais formas e subformulários
Uma visão - muitas formas
Capítulo 5 Consultas
Informações gerais sobre consultas
Inserindo consultas
Criando consultas usando o diálogo Design da Consulta
Aprimoramento de consulta usando o modo SQL
Usando um alias em uma consulta
Consultas para a criação de campos da caixa de listagem
Consultas como base para informações adicionais em formulários
Possibilidades de entrada de dados em consultas
Uso de parâmetros em consultas
Subqueries
Subconsultas Correlacionadas
Consultas como tabelas de origem para consultas
Resumindo dados com consultas
Acesso mais rápido a consultas usando visualizações de tabela
Capítulo 6 Relatórios
Criando relatórios usando o Report Builder
A interface do usuário do Report Builder
Propriedades gerais dos campos
Propriedades de dados dos campos
Funções no Report Builder
Inserir fórmulas
Funções definidas pelo usuário
Entrada de fórmula para um campo
Impressão condicional
Formatação condicional
Capítulo 7 Vinculando aos Bancos de Dados
Notas gerais sobre ligação de banco de dados
Registro de bancos de dados
Navegador da fonte de dados
Dados para texto
Dados para campos
Mala direta
Fonte de dados do documento atual
Explorer on / off
Criando documentos de mala direta
Impressão de etiquetas
Criação direta de mala direta e documentos de etiqueta
Mala direta usando o mouse
Criando cartas formulário selecionando campos
Formulários externos
Uso do banco de dados no Calc
Inserindo dados no Calc
Exportando dados do Calc para um banco de dados
Convertendo dados de um banco de dados para outro
Capítulo 8 Tarefas do banco de dados
Comentários gerais sobre tarefas de banco de dados
Filtragem de dados
Procurando por dados
Partes de codigo
Obtendo a idade atual de alguém
Obtendo um saldo em execução por categorias
Numeração de linhas
Obtendo uma quebra de linha através de uma consulta
Agrupando e resumindo
Capítulo 9 Macros
Comentários gerais sobre macros
Melhorando a usabilidade
Atualização automática de formulários
Registros de Filtragem
Pesquisando registros de dados
Comboboxes como listboxes com uma opção de entrada
Navegação de um formulário para outro
Removendo elementos de distração de formulários
Tarefas de banco de dados expandidas usando macros
Fazendo uma conexão com um banco de dados
Protegendo seu banco de dados
Compactação de banco de dados
Diminuindo o índice da tabela para campos de autovalor
Diálogos
Capítulo 10 Manutenção do banco de dados
Comentários gerais sobre manutenção de bancos de dados
Compactando um banco de dados
Repor autovalores
Consultando as propriedades do banco de dados
Tabelas de teste para entradas desnecessárias
Testando entradas usando a definição de relacionamento
Edição de entradas usando formulários e subformulários
Consultas para encontrar entradas órfãs
Velocidade de pesquisa de banco de dados
Efeito de consultas
Efeito de listboxes e comboboxes
Apêndice
Códigos de barra
Tipos de dados para o editor de tabelas
Inteiros
Números de ponto flutuante
Texto
Tempo
De outros
Funções integradas e procedimentos armazenados
Numérico
Texto
Data hora
Conexão de banco de dados
Sistema
Tabelas de informação para HSQLDB
Reparo de banco de dados para arquivos * .odb
Conectando um banco de dados a um HSQLDB externo
Alterando a conexão do banco de dados para o HSQLDB externo
Alterando a conexão do banco de dados para acesso multiusuário
Valores de incremento automático com HSQLDB externo
Prefácio
Sistema de ajuda
O LibreOffice vem com um extenso sistema de ajuda. Esta é sua primeira linha de suporte ao uso do
LibreOffice . Para exibir o sistema de Ajuda completo, pressione F1 ou selecione Ajuda do LibreOffice no
menu Ajuda. Além disso, você pode escolher se quer ativar Tips, estendida T ips, eo Agente de Ajuda
(utilizando Ferramentas > Opções > LibreOffice > Geral ).
Se as Dicas estiverem ativadas, coloque o ponteiro do mouse sobre qualquer um dos ícones para ver uma
pequena caixa (“tooltip”) com uma breve explicação da função do ícone. Para uma explicação mais
detalhada, selecione Ajuda > O que é isto? e segure o ponteiro sobre o ícone.
Ilustrações
O LibreOffice é executado nos sistemas operacionais Windows, Linux e Mac OS X, cada um dos quais
possui várias versões e pode ser personalizado pelos usuários (fontes, cores, temas, gerenciadores de
janela). As ilustrações neste guia foram tiradas de uma variedade de computadores e sistemas
operacionais. Portanto, algumas ilustrações não se parecerão exatamente com o que você vê na tela do
seu computador.
Além disso, algumas das caixas de diálogo podem ser diferentes devido às configurações selecionadas no
LibreOffice. Você pode usar diálogos do sistema do seu computador (padrão) ou diálogos fornecidos pelo
LibreOffice. Para mudar para o uso das caixas de diálogo do LibreOffice:
1)Nos sistemas operacionais Linux e Windows, vá para Ferramentas> Opções> LibreOffice> Geral na
barra de menu principal para abrir a caixa de diálogo das opções gerais.
2)Em um sistema operacional Mac, vá para LibreOffice> Preferências> Geral na barra de menu principal
para abrir a caixa de diálogo para opções gerais.
3)Selecione Usar caixas de diálogo do LibreOffice nas caixas de diálogo Abrir / Salvar e, apenas nos
sistemas operacionais Linux e Mac OS X, Imprimir caixas de diálogo para exibir as caixas de diálogo do
LibreOffice na tela do seu computador.
4)Clique em OK para salvar suas configurações e fechar a caixa de diálogo.
Ícones
Os ícones usados para ilustrar algumas das muitas ferramentas disponíveis no LibreOffice podem diferir
dos usados neste guia. Os ícones neste guia foram retirados de uma instalação do LibreOffice que foi
configurada para exibir o conjunto de ícones do Galaxy.
Se desejar, você pode alterar seu pacote de software do LibreOffice para exibir os ícones do Galaxy da
seguinte maneira:
1)Nos sistemas operacionais Linux e Windows, vá para Ferramentas> Opções> LibreOffice> Exibir na
barra de menus principal para abrir a caixa de diálogo das opções de exibição.
2)Em um sistema operacional Mac, acesse LibreOffice> Preferências> Exibir na barra de menu principal
para abrir a caixa de diálogo das opções de visualização.
3)Em Interface do usuário> Tamanho e estilo do ícone, selecione Galaxy nas opções disponíveis na lista
dro- p- down.
4)Clique em OK para salvar suas configurações e fechar a caixa de diálogo.
Perguntas frequentes
Como o LibreOffice é licenciado?
O LibreOffice é distribuído sob a Licença Pública Geral Menor (LGPL) aprovada pela Open Source
Initiative (OSI). A licença LGPL está disponível no site do LibreOffice:
http://www.libreoffice.org/download/license/
Posso distribuir o LibreOffice para alguém?
Sim.
Quantos computadores posso instalar?
Quantos você quiser.
Posso vendê-lo?
Sim.
Posso usar o LibreOffice no meu negócio?
Sim.
O LibreOffice está disponível no meu idioma?
O LibreOffice foi traduzido (localizado) para mais de 40 idiomas, então sua linguagem provavelmente é
suportada . Além disso, t aqui são mais de 70 s Pelling , hifenização e dicionário de sinónimos
dicionários disponíveis para idiomas e dialetos que não têm uma interface de programa localizado. Os
dicionários estão disponíveis no site do LibreOffice em: www.libreoffice.org .
Como você pode fazer isso de graça?
O LibreOffice é desenvolvido e mantido por voluntários e tem o apoio de várias organizações .
Eu estou escrevendo um aplicativo de software . Posso usar o código de programação do
LibreOffice no meu programa?
Você pode, dentro dos parâmetros definidos na LGPL. Leia a licença:
http://www.libreoffice.org/download/license/
Por que eu preciso do Java para executar o LibreOffice? Está escrito em Java?
O LibreOffice não está escrito em Java; está escrito na linguagem C ++ . Java é uma das várias
linguagens que podem ser usadas para estender o software. O Java JDK / JRE é necessário apenas
para alguns recursos; O mais notável é o mecanismo de banco de dados relacional HSQLDB.
Como posso contribuir com o LibreOffice?
Você pode ajudar com o desenvolvimento e suporte ao usuário do LibreOffice de várias maneiras, e
você não precisa ser um programador. Para começar, confira esta página:
http://www.documentfoundation.org/contribution/
Posso distribuir o PDF deste livro ou imprimir e vender cópias?
Sim, desde que você atenda aos requisitos de uma das licenças na declaração de direitos autorais no
início deste livro. Você não precisa solicitar permissão especial. Além disso, solicitamos que você
compartilhe com o projeto alguns dos lucros que você faz com a venda de livros, considerando todo o
trabalho que temos para produzi-los.
Capítulo 1
Introdução à Base
Introdução
Na operação diária do escritório, as planilhas são usadas regularmente para agregar conjuntos de dados e
realizar algum tipo de análise neles. Como os dados em uma planilha são dispostos em uma visualização
de tabela, claramente visíveis e capazes de serem editados ou adicionados, muitos usuários perguntam
por que devem usar um banco de dados em vez de uma planilha. Este manual explica s as diferenças
entre os dois, começando com uma pequena seção sobre o que pode ser feito com um banco de dados.
Este capítulo apresenta dois exemplos de banco de dados e todo o Manual é construído com base neles.
Um banco de dados é chamado Media_without_macros.odb ea outra, ampliada com a inclusão
de macros, é nam ed Media_with_macros.odb .
O ambiente Base contém quatro áreas de trabalho: T Ables, Q ueries, F Orms e R ELATÓRIOS.
Dependendo da área de trabalho selecionado, várias tarefas- creat ing novo conteúdo ou chamar ing -se
elementos existentes -podem ser realizado.
Base começa com a visão F orm, porque os formulários são os elementos mais comumente usados
quando se trabalha com bancos de dados.
A consulta mostrada acima lista todas as mídias que estão atualmente sem empréstimo. Calcula para cada
item quanto tempo tem sido emprestado e o saldo do período do empréstimo.
•.Todas as mídias para as quais o campo Return_Date está vazio são listadas. Como uma visão geral
adicional, o nome do meio é incluído na consulta junto com o Media_ID.
•.A referência ao Reader é estabelecida com a chave primária da tabela do Reader .
•.O valor do campo LoanDays é calculado como a diferença entre o Loan_Date e a data atual.
•.O número de LoanDays é subtraído do Tempo do Empréstimo para fornecer o número restante de dias no
período do empréstimo. O tempo do empréstimo pode variar com diferentes tipos de mídia.
•.Na tabela Configurações, um valor de '1' para Extensão corresponde a uma extensão do período de
empréstimo de 7 dias. Nos dados definidos acima, a linha com Media_ID '2' mostra uma extensão de 7
dias.
Relatórios - p resentação de dados
Antes que um relatório real na forma de um aviso de recall possa ser impresso, as informações de recall
devem ser inseridas no formulário Recall. A tabela no formulário mostra todas as pessoas que
emprestaram itens com um tempo de empréstimo remanescente negativo.
Para cada item de mídia a ser rechamado, a data de rechamada e o número do aviso de rechamada são
inseridos. A data de rechamada é padronizada para a data atual. O número de rechamada é um número
inteiro incrementado em 1 com cada aviso de rechamada sucessivo para um determinado emprestador /
mídia.
Esse formulário, no exemplo atual do banco de dados sem macros, requer entrada do usuário para criar
avisos de recall. Na versão macro, a data é inserida automaticamente e o aviso de recall é impresso.
O aviso de recordação é gerado por meio de uma consulta dos dados de entrada anteriores . O usuário do
banco de dados só precisa escolher o relatório de Rechamada e uma carta de rechamada pode ser
impressa e enviada para todas as pessoas que tenham uma entrada de rechamada feita no formulário da
página anterior.
Nesse relatório, pode haver várias entradas (itens vencidos) para uma pessoa específica. Se a tabela que
contém os itens para essa pessoa exceder o espaço em uma página, ela será estendida para cobrir uma
página seguinte.
Tal relatório é mais abrangente do que uma carta de mala direta produzida com o Writer. Ele reúne
automaticamente os conjuntos de dados para impressão e organiza o texto acompanhante necessário.
Capítulo 2 Criando um banco de
dados
Como criar um novo banco de dados
Notas gerais sobre a criação de uma base de dados
Os fundamentos da criação de um banco de dados no LibreOffice são descritos no Capítulo 8 do Guia de
Introdução , Introdução à Base.
O componente de banco de dados do LibreOffice, chamado Base, fornece uma interface gráfica para
trabalhar com bancos de dados. Além disso, o LibreOffice contém uma versão do mecanismo de banco de
dados HSQL. Este banco de dados HSQLDB só pode ser usado por um único usuário. O conjunto de
dados inteiro é armazenado em um arquivo ODB que não possui mecanismo de bloqueio de arquivo
quando aberto por um usuário.
A conexão com o MySQL pode ser via ODBC ou JDBC, a menos que um conector MySQL nativo tenha
sido instalado. Neste caso, uma conexão direta com o MySQL é possível.
Neste exemplo, selecione o conector Java JDBC.
O banco de dados na rede deve ser protegido com um nome de usuário e senha. Novamente, um teste de
conexão pode ser realizado.
Se uma conexão direta foi selecionada, este teste gerará mensagens de erro.
Nota Sem testes, o Base irá, no final do Assistente, abrir a janela do banco de dados
e conectar-se ao MySQL.
O teste de conexão inicia o processo de autenticação usando o nome do usuário inserido anteriormente.
Depois que a senha correta é entrada, um diálogo anuncia o resultado do teste. Se o MySQL não está
rodando neste momento, uma mensagem de erro é mostrada.
A etapa final é registrar o banco de dados. O banco de dados pode, se necessário, ser registrado
posteriormente para permitir seu uso com o Writer ou o Calc.
O Assistente finaliza o processo de conexão com o armazenamento do banco de dados ODB. O banco de
dados ODB contém todas as informações de conexão necessárias para permitir que as tabelas no banco
de dados sejam acessadas sempre que o banco de dados for aberto.
Nesta fase, escolha um nome para o arquivo de banco de dados ODB e salve-o. A próxima imagem é uma
visão da interface Base.
As tabelas no banco de dados estão contidas na árvore sob o nome do banco de dados.
A visão da árvore de tabelas pode ser fechada clicando no nome do banco de dados. Para uma única
conexão de banco de dados, isso não faz muito sentido, mas fornece uma indicação visível da conexão
direta.
Em vez de apenas a entrada do banco de dados na Etapa 3 do Assistente (consulte a barra de status
inferior), o LibreOffice abre todos os bancos de dados disponíveis no MySQL para o usuário “robby”.
As consultas devem incluir na sintaxe do MySQL não apenas o nome da tabela, mas também o banco de
dados que contém, por exemplo, o seguinte código :
… De "myphplib". "ASB" AS "ASB", "myphplib". "Kategorien" AS "Kategorien"
Também é possível, em cada caso, especificar um alias, criado a partir dos nomes de bancos de dados e
tabelas. Mais detalhes são fornecidos no capítulo sobre consultas.
Tabelas podem ser criadas e deletadas em um banco de dados. Campos com valores automáticos podem
ser criados ao configurar a estrutura das tabelas. No MySQL, o valor inicial de tais campos é padronizado
como 1.
A conexão é feita para uma pasta específica. Todos os arquivos DBF nesta pasta serão incluídos e
mostrados no banco de dados ODB e podem ser vinculados usando consultas.
Tabelas no dBase não têm chave primária. Eles podem, em princípio, ser descritos como correspondentes
às planilhas no Calc.
Tabelas podem ser criadas e, em seguida, serão copiadas como novos arquivos na pasta selecionada
anteriormente.
O número de tipos de campo diferentes para uma nova tabela do dBase é claramente menor do que
quando o formato HSQLDB interno é usado. Na figura a seguir ainda existem alguns tipos de campos com
o mesmo nome de tipo.
O formato dBase é especialmente adequado para a troca e edição extensiva de dados. Além disso, os
cálculos da planilha podem acessar diretamente as tabelas do dBase. Pode ser melhor manipular os dados
no Base porque o Calc requer a entrada do tipo de codificação de caracteres, enquanto o Base
simplesmente usa a codificação apropriada fornecida pelo sistema operacional. Arquivos antigos do dBase
podem exibir pequenos erros de decodificação nos quais caracteres especiais foram usados.
Planilhas
As planilhas do Calc ou do Excel também podem ser usadas como a origem da tabela para bancos de
dados. Se, no entanto, uma planilha do Calc for usada, nenhuma edição dos dados da tabela será possível.
Se o documento do Calc ainda estiver aberto, ele será protegido contra gravação.
As únicas perguntas a serem respondidas são a localização do arquivo de planilha e se ele está ou não
protegido por senha. Base abre a planilha e inclui todas as planilhas no documento. A primeira linha é usada
para os nomes dos campos e os nomes das planilhas se tornam os nomes das tabelas.
Relacionamentos entre planilhas não podem ser configurados no Base, já que o Calc não é adequado para
uso como banco de dados relacional.
Todas as tabelas são mostradas. Como no Calc, as tabelas não são editáveis. Base usa os dados da
tabela apenas para consultas e aplicativos de mala direta.
Capítulo 3
Tabelas
Informações gerais sobre tabelas
Bancos de dados armazenam dados em tabelas. A principal diferença das tabelas em uma planilha simples
é que os campos nos quais os dados são gravados devem ser definidos claramente de antemão. Por
exemplo, um banco de dados não permite que um campo de texto contenha números para uso em
cálculos. Esses números são exibidos, mas apenas como seqüências de caracteres, cujo valor numérico
real é zero. Da mesma forma, as imagens não podem ser incluídas em todos os tipos de campos.
Detalhes sobre quais tipos de dados estão disponíveis podem ser obtidos na janela Design de Tabelas na
Base. Eles são mostrados no Apêndice deste manual.
Bancos de dados simples são baseados em apenas uma tabela. Todos os elementos de dados são
inseridos independentemente, o que pode levar à entrada múltipla dos mesmos dados. Um catálogo de
endereços simples para uso privado pode ser criado dessa maneira. No entanto, o catálogo de endereços
de uma escola ou de uma associação esportiva pode conter tanta repetição de códigos postais e locais que
esses campos são melhor colocados em uma ou até duas tabelas separadas.
Armazenar dados em tabelas separadas ajuda:
•Reduzir a entrada repetida do mesmo conteúdo
•Evitar erros de ortografia devido a entrada repetida
•Melhorar a filtragem de dados nas tabelas exibidas
Ao criar uma tabela, você deve sempre considerar se várias repetições, especialmente de texto ou
imagens (que consomem muito armazenamento), podem ocorrer na tabela. Nesse caso, você precisa
exportá-los para outra tabela. Como fazer isso, em princípio, é descrito no Capítulo 8, Introdução ao Base,
no manual Introdução ao LibreOffice .
Relações um-para-muitos
O banco de dados media_without_macros lista os títulos da mídia em uma tabela. Como os títulos podem
ter várias legendas ou, às vezes, nenhuma, as legendas são armazenadas em uma tabela separada.
Esse relacionamento é conhecido como um-para-muitos (1: n). Muitas legendas podem ser atribuídas a um
meio, por exemplo, os vários títulos de faixa para um CD de música. A chave primária da tabela Media é
armazenada como uma chave estrangeira na tabela Subtitle . A maioria dos relacionamentos entre tabelas
em um banco de dados são relacionamentos um-para-muitos.
Figura 3: Exemplo 1: n relacionamento; relação n: m
Muitos-para-muitos relacionamentos
Um banco de dados para uma biblioteca pode conter uma tabela para nomes de autores e uma tabela para
a mídia. A conexão entre um autor e, por exemplo, livros que o autor escreveu, é óbvia. A biblioteca pode
conter mais de um livro por um autor. Também pode conter livros com vários autores. Esse relacionamento
é conhecido como muitos-para-muitos (n: m). Essas relações exigem uma tabela que atua como
intermediária entre as duas tabelas em questão. Isso é representado na Figura 3 pela tabela
rel_Media_Author .
Assim, na prática, a relação n: m é resolvida tratando-a como duas relações 1: n. Na tabela intermediária, o
Media_ID pode ocorrer mais de uma vez, assim como o Author_ID . Mas ao usá-los como um par, não há
duplicação: não há dois pares idênticos. Portanto, esse par atende aos requisitos da chave primária da
tabela intermediária.
Relações um-para-um
Nesta tabela, todos os campos inseridos diretamente assumem que não estão sendo usados também para
outras mídias com o mesmo conteúdo. A duplicação deve, portanto, ser evitada.
Por esse motivo, os campos planejados na tabela incluem o título, o ISBN, uma imagem da capa e o ano
de publicação. A lista de campos pode ser estendida, se necessário. Assim, por exemplo, os bibliotecários
podem querer incluir campos para o tamanho (número de páginas), o título da série e assim por diante.
A tabela de legendas contém o conteúdo detalhado dos CDs. Como um CD pode conter várias partes de
música, um registro das peças individuais na tabela principal exigiria muitos campos adicionais (Legenda 1,
Legenda 2, etc.) ou o mesmo item teria que ser inserido várias vezes. A tabela de legendas, portanto, está
em um relacionamento n: 1 com a tabela Mídia .
Os campos da tabela de legendas são (além do próprio subtítulo) o número de sequência da legenda e a
duração da faixa. O campo Comprimento deve primeiro ser definido como um campo de hora. Desta
forma, a duração total do CD pode ser calculada e exibida em um resumo, se necessário.
Os autores têm uma relação com a mídia. Um item pode ter vários autores e um autor pode ter criado
vários itens. Esse relacionamento é controlado pela tabela rel_Media_Author . A chave primária dessa
tabela de vinculação é a chave estrangeira, formada pelas tabelas Autor e Mídia . A tabela
rel_Media_Author inclui uma classificação adicional (Author_Sort) dos autores, por exemplo, pela
sequência na qual eles são nomeados no livro. Além disso, um rótulo suplementar, como Produtor,
Fotógrafo e assim por diante, é adicionado ao autor quando necessário.
Categoria, Mediastyle, Town e Publisher têm um relacionamento de 1: n.
Para a categoria, uma pequena biblioteca pode usar algo como Arte ou Biologia. Para bibliotecas maiores,
sistemas gerais para bibliotecas estão disponíveis. Esses sistemas fornecem abreviações e descrições
completas. Portanto, ambos os campos aparecem em Categoria.
O Mediastyle está vinculado ao período de empréstimo do Loantime. Por exemplo, os DVDs de vídeo
podem, em princípio, ter um período de empréstimo de 7 dias, mas os livros podem ser emprestados por
21 dias. Se o período de empréstimo estiver vinculado a qualquer outro critério, haverá mudanças
correspondentes em sua metodologia.
A cidade t capaz não só serve para armazenar dados de localização dos meios de comunicação, mas
também para armazenar os locais utilizados nos endereços de usuários.
Como os editores também recorrem com frequência, uma tabela separada é fornecida para eles.
A tabela Media possui no total quatro chaves estrangeiras e uma chave primária, que é usada como uma
chave estrangeira em duas tabelas, conforme mostrado na Figura 5 .
Tabela de empréstimo
A tabela central é Empréstimo (veja a Figura 6 ). É o link entre as tabelas Mídia e Leitor. No caso de você
precisar descobrir retrospectivamente quem retirou um livro (por exemplo, se alguém notar durante o
processo de empréstimo que o livro está danificado, ou se você deseja fazer uma lista das mídias mais
populares), o Loan_Date no O registro de empréstimo não é simplesmente excluído durante o processo de
devolução. Em vez disso, um Return_Date é registrado.
Da mesma forma, os Lembretes são integrados ao procedimento de empréstimo. Cada lembrete é inserido
separadamente na tabela Recall para que o número total de lembretes possa ser determinado.
Assim como um período de extensão em semanas, há um campo extra no registro de empréstimo que
permite que a mídia seja emprestada usando um scanner de código de barras ( Media_ID_BC ). Os
códigos de barras contêm, além do Media_ID individual, um dígito de verificação que o scanner pode usar
para determinar se o valor digitalizado está correto. Este campo de código de barras está em c luded aqui
apenas para fins de teste. Seria melhor se a chave primária da mesa de mídia pudesse ser inserida
diretamente no formulário de código de barras ou se uma macro fosse usada para remover o dígito de
verificação do número do código de barras digitado antes do armazenamento.
Finalmente, precisamos conectar o Reader ao empréstimo. Na tabela real do leitor, apenas o nome, um
bloqueio opcional e uma chave estrangeira vinculada à tabela de Gênero são incluídos no plano.
Figura 6: Empréstimo
Criando Tabelas
A maioria dos usuários do LibreOffice geralmente usa a interface gráfica do usuário (GUI) exclusivamente
para criar tabelas. A entrada direta de comandos SQL torna-se necessária quando, por exemplo, um
campo deve ser subsequentemente inserido em uma determinada posição, ou um valor padrão deve ser
definido após a tabela ter sido salva.
Tabela de terminologia: A figura abaixo mostra a divisão padrão de tabelas em colunas e linhas.
Registros de dados são armazenados em uma única linha da tabela. Colunas individuais são amplamente
definidas pelo campo, pelo tipo e pelas regras que determinam se o campo pode estar vazio. De acordo
com o tipo, o tamanho do campo em caracteres também pode ser determinado. Além disso, um valor
padrão pode ser especificado para ser usado quando nada foi inserido no campo.
Na GUI base, os termos de uma coluna são descritos de forma um pouco diferente, conforme mostrado
abaixo.
O campo torna - se Nome do campo , o tipo torna - se Tipo de campo . Nome do campo e tipo de campo
são inseridos na área superior da janela Design da tabela. Na área inferior, você tem a oportunidade de
definir, nas propriedades do campo, as outras propriedades da coluna, na medida em que elas podem ser
definidas usando a GUI. Limitações incluem a configuração do valor padrão de um campo de data para a
data real de entrada. Isso é possível apenas usando o comando SQL apropriado (consulte “ Entrada direta
de comandos SQL ” na página 43 ).
Valores padrão: O termo "Valor padrão" na GUI não significa o que o usuário do
banco de dados geralmente entende como um valor padrão. A GUI exibe um
certo valor visivelmente, que é salvo com os dados.
Nota O valor padrão em um banco de dados é armazenado na definição da tabela.
Em seguida, ele é gravado no campo sempre que estiver vazio em um novo
registro de dados. Os valores padrão do SQL não aparecem ao editar as
propriedades da tabela.
Criando um índice
Às vezes, é útil indexar outros campos ou uma combinação de outros campos além da chave primária. Um
índice acelera a pesquisa e também pode ser usado para impedir entradas duplicadas.
Cada índice tem uma ordem de classificação definida. Se uma tabela for exibida sem ordenação, a ordem
de classificação será de acordo com o conteúdo dos campos especificados no índice.
Abra a tabela para edição clicando com o botão direito do mouse e usando o menu de contexto. Então você
pode acessar a criação de índice com Ferramentas> Design de índice .
Figura 9: Criando
um novo índice
Na caixa de diálogo Índices (Figura 9 ), clique em Novo Índice para criar um índice além da chave
primária.
O novo índice recebe automaticamente o nome index1 . O campo Index especifica qual campo ou campos
devem ser usados para este índice. Ao mesmo tempo, você pode escolher a ordem de classificação.
Figura 10: O
índice é definido
como único.
Em princípio, um índice também pode ser criado a partir de campos de tabela que não contêm valores
exclusivos. No entanto, na Figura 10 , o detalhe do índice exclusivo foi verificado, para que o campo
LastName junto com o campo FirstName possa ter apenas entradas que ainda não ocorrem nessa
combinação. Assim, por exemplo, Robert Müller e Robert Maier são possíveis, e também Robert Müller e
Eva Müller.
Se um índice for criado apenas para um campo, a exclusividade será aplicada a esse campo. Esse índice
geralmente é a chave primária. Neste campo, cada valor pode ocorrer apenas uma vez. Além disso, no
caso de chaves primárias, o campo não pode ser NULL em nenhuma circunstância.
Uma circunstância excepcional para um índice exclusivo é quando não há entrada em um campo (o campo
é NULL). Como o NULL pode ter qualquer valor arbitrário, um índice usando dois campos sempre pode ter
a mesma entrada repetidamente em um dos campos, desde que não haja entrada no outro.
NULL é usado em bancos de dados para designar uma célula vazia, uma que
não contém nada. Nenhum cálculo é possível usando um campo NULL. Isso
Nota
contrasta com as planilhas, nas quais os campos vazios contêm
automaticamente o valor 0 (zero).
Exemplo: Em um banco de dados de mídia, o número da mídia e a data do empréstimo são inseridos
quando o item é emprestado. Quando o item é retornado, uma data de retorno é inserida. Em teoria, um
índice usando os campos Media_ID e ReturnDate poderia impedir facilmente que o mesmo item fosse
emprestado repetidamente sem que a data de retorno fosse anotada. Infelizmente isso não funcionará
porque a data de retorno inicialmente não tem valor. O índice impedirá que um item seja marcado como
retornado duas vezes com a mesma data, mas não fará mais nada.
Você pode então inserir comandos na área superior da janela (mostrada na Figura 11 ). A área inferior
mostra o resultado ou, se apropriado, o motivo pelo qual o comando falhou.
Consultas não podem ser criadas aqui. Para estes, a janela Design de consulta oferece uma possibilidade
extra de editar a consulta no modo SQL.
Figura 11: Diálogo para entrada direta de
comandos SQL
Um resumo dos comandos possíveis para o mecanismo HSQLDB integrado pode ser encontrado em
http://www.hsqldb.org/doc/1.8/guide/ch09.html . O conteúdo é descrito nas seções a seguir. Alguns
comandos só fazem sentido ao lidar com um banco de dados HSQLDB externo (especificar usuário, etc.).
Quando necessário, eles são tratados na seção “Trabalhando com o HSQLDB externo” no Apêndice deste
manual.
Criação de tabelas
Um comando simples para criar uma tabela utilizável é:
CREATE TABLE "Teste" ("ID" INT PRIMARY KEY, "Texto" VARCHAR (50));
CREATE TABLE "Test" : Cria uma tabela com o nome "Test".
() : com os nomes de campos, tipos de campos e opções especificados.
"ID" INT PRIMARY KEY, "Texto" VARCHAR (50) : Nome do campo "ID" com o tipo numérico
inteiro como chave primária, nome do campo "Texto" com o tamanho do texto variável tamanho do texto e o
tamanho do texto limitado a 50 caracteres .
CRIAR [MEMORY | CACHED | [GLOBAL] TEMPORÁRIO | TEMP | TEXTO] TABELA "Nome
da tabela" (<Definição de campo> [, ...] [, <Definição de restrição> ...])
[ON COMMIT {DELETE | PRESERVE} ROWS];
[MEMORY | CACHED | [GLOBAL] TEMPORÁRIO | TEMP | TEXTO]:
A configuração padrão é MEMORY : HSQLDB cria todas as tabelas na memória principal. Essa
configuração também se aplica às tabelas gravadas no banco de dados interno pelo LibreOffice Base.
Outra possibilidade seria escrever as tabelas no disco rígido e usar a memória apenas para armazenar
em buffer o acesso ao disco rígido ( CACHED ). Tabelas no formato TEXT (como CSV) não
são graváveis em bancos de dados internos que são configurados puramente em MEMORY ,
enquanto o Base não pode acessar TEMPORARY ou TEMPtabelas. Os comandos SQL são
executados neste caso, mas as tabelas não são exibidas (e portanto não podem ser excluídas) usando
a GUI, e os dados inseridos via SQL também não são visíveis para o módulo de consulta da GUI, a
menos que a exclusão automática do conteúdo após o commit final ser evitado. Qualquer pedido neste
caso mostra uma tabela sem qualquer conteúdo.
Tabelas construídas diretamente com o SQL não são exibidas imediatamente. Você deve usar View>
Refresh Tables ou simplesmente fechar o banco de dados e reabri-lo.
<Definição de campo>:
"Nome do campo" Tipo de dados [(Número de caracteres [, Casas decimais])]
[{DEFAULT "Valor padrão" | GERADO PELO PADRÃO COMO IDENTIDADE (INICIAR COM
<n> [, INCREMENTO POR <m>])}] | [[NOT] NULL] [IDENTIDADE] [CHAVE PRIMÁRIA]
Permite que os valores padrão sejam incluídos na definição do campo.
Para campos de texto, você pode inserir texto entre aspas simples ou NULO . A única função SQL
permitida é CURRENT_USER . Isso só faz sentido se o HSQLDB estiver sendo usado como um
banco de dados externo do servidor com vários usuários.
Para campos de data e hora, uma data, um horário ou uma combinação dos dois pode ser inserida
entre aspas simples ou NULL . Você deve garantir que a data siga as convenções americanas (aaaa-
mm-dd), que a hora tenha o formato hh: mm: ss e que um valor combinado de data / hora tenha o
formato aaaa-mm-dd hh: mm: ss .
Funções SQL permitidas:
para a data atual CURRENT_DATE, TODAY, CURDATE ()
para a hora atual CURRENT_TIME, NOW, CURTIME ()
para o registro de data e hora de dados atuais CURRENT_TIMESTAMP, NOW .
Para campos booleanos (sim / não), as expressões FALSE, TRUE, NULL podem ser inseridas.
Estes devem ser inseridos sem aspas simples.
Para campos numéricos, qualquer número válido no intervalo ou NULL é possível. Aqui também, se
você digitar NULL , não use aspas. Ao digitar decimais, certifique-se de que o ponto decimal seja um
ponto (ponto) e não uma vírgula.
Para campos binários (imagens, etc.), qualquer cadeia hexadecimal válida entre aspas simples ou
NULL é possível. Uma string de exemplo hexadecimal é: '0004ff', que representa 3 bytes, primeiro
0, depois 4 e finalmente 255 (0xff). Como os campos binários na prática precisam ser inseridos apenas
para imagens, você precisa conhecer o código binário da imagem que deve servir como padrão.
NOT NULL: o valor do campo não pode ser NULL . Esta condição só pode ser dada na definição do
campo.
<Definição de restrição>:
[CONSTRAINT "Nome"]
UNIQUE ("Field_name 1" [, "Field_name 2" ...]) |
PRIMARY KEY ("Field_name 1" [, "Field_name 2" ...]) |
CHAVE ESTRANGEIRA ("Field_name 1" [, "Field_name 2" ...])
REFERÊNCIAS "other_table_name" ("Field_name_1" [, "Field_name 2" ...])
[ON {DELETE | ATUALIZAR}
{CASCADE | SET DEFAULT | SET NULL}] |
CHECK (<Search_condition>)
As restrições definem condições que devem ser atendidas quando os dados são inseridos. Restrições
podem receber um nome.
UNIQUE ("Field_name"): o valor do campo deve ser exclusivo dentro desse campo
PRIMARY KEY ("Field_name"): o valor do campo deve ser exclusivo e não pode ser NULL
(chave primária)
FOREIGN KEY ("Field_name") REFERENCES <"other_table_name" >
("Field_name"): Os campos especificados desta tabela estão vinculados aos campos de outra
tabela. O valor do campo deve ser testado para integridade referencial como chaves estrangeiras; ou
seja, deve haver uma chave primária correspondente na outra tabela, se um valor for inserido aqui.
[ON {DELETE | ATUALIZAÇÃO} {CASCADE | SET DEFAULT | SET NULL}]:No caso de
uma chave estrangeira, isso especifica o que deve acontecer se, por exemplo, o registro externo for
excluído. Não faz sentido, em uma tabela de empréstimo para uma biblioteca, ter um número de
usuário para o qual o usuário não exista mais. O registro correspondente deve ser modificado para que
o relacionamento entre as tabelas permaneça válido. Normalmente, o registro é simplesmente excluído.
Isso acontece se você selecionar ON DELETE CASCADE .
CHECK (<Search_condition>): Formulado como uma condição WHERE , mas apenas para
o registro atual.
Você precisa de restrições quando o relacionamento entre tabelas ou o índice de determinados campos
deve ser definido.
[ON COMMIT {DELETE | PRESERVE} ROWS]:
O conteúdo de tabelas do tipo TEMPORARY ou TEMP é apagado por padrão quando você
terminar de trabalhar com um registro específico ( ON COMMIT DELETE ROWS ). Isso permite criar
registros temporários, que contêm informações para outras ações a serem executadas ao mesmo
tempo.
Se você quiser que uma tabela desse tipo contenha dados disponíveis para uma sessão inteira (de abrir
um banco de dados para fechá-lo), escolha ON COMMIT PRESERVE ROWS .
Modificação tabela
Às vezes você pode querer inserir um campo adicional em uma determinada posição na tabela. Suponha
que você tenha uma tabela chamada Endereços com ID de campos , Nome , Rua e assim por diante.
Você percebe que talvez seja sensato distinguir os primeiros nomes e sobrenomes.
ALTER TABLE "Addresses" ADICIONAR "First Name" VARCHAR (25) ANTES de
"Nome";
ALTER TABLE "Addresses" : Altere a tabela com o nome "Addresses".
ADD "First Name" VARCHAR (25) : insira o campo "FirstName" com um comprimento de 25
caracteres.
ANTES de "Nome" : antes do campo "Nome".
A possibilidade de especificar a posição dos campos adicionais após a criação da tabela não está
disponível na GUI.
ALTER TABLE "Table_name" ADD [COLUMN] <definição_de_campo> [BEFORE
"already_existing_field_name"];
A designação adicional COLUMN não é necessária nos casos em que não há opções alternativas
disponíveis.
ALTER TABLE "Table_name" DROP [COLUMN] "Field_name";
O campo "Nome do campo" é apagado da tabela Table_name . No entanto, isso não ocorre se o campo
estiver envolvido em uma exibição ou como uma chave estrangeira em outra tabela.
ALTER TABLE "Table_name" ALTER COLUMN "Field_name" RENAME PARA
"New_field_name"
Altera o nome de um campo.
ALTER TABLE "Table_name" ALTER COLUMN "Field_name" SET DEFAULT <valor
padrão>};
Define um valor padrão específico para o campo. NULL remove um valor padrão existente.
ALTER TABLE "Table_name" ALTER COLUMN "Field_name" SET [NOT] NULL
Define ou remove uma condição NOT NULL para um campo.
ALTER TABLE "Table_name" ALTER COLUMN <Definição de campo>;
A definição do campo corresponde à da criação da Tabela com as seguintes restrições:
•O campo já deve ser um campo de chave primária para aceitar a propriedade IDENTIDADE .
IDENTITY significa que o campo possui a propriedade AutoValue. Isso é possível apenas para os
campos INTEGER ou BIGINT . Para estas descrições de tipo de campo, consulte o Apêndice deste
manual.
•Se o campo já tiver a propriedade IDENTITY, mas ela não for repetida na definição do campo, a
propriedade IDENTITY existente será removida.
•O valor padrão será aquele especificado na nova definição de campo. Se a definição do valor padrão for
deixada em branco, qualquer padrão já definido será removido.
•A propriedade NOT NULL continua na nova definição, se não definido de outra forma. Isso está em
contraste com o valor padrão.
•Em alguns casos, dependendo do tipo de modificação, a tabela deve estar vazia para que a alteração
ocorra. Em todos os casos, a mudança terá efeito somente se for possível, em princípio (por exemplo,
uma mudança de NOT NULL para NULL ) e os valores existentes podem ser traduzidos (por
exemplo, uma mudança de TINYINT para INTEGER ).
ALTER TABLE "Table_name" ALTER COLUMN "Field_name" RESTART WITH
<New_field_value>
Este comando é usado exclusivamente para um campo IDENTITY . Ele determina o próximo valor
para um campo com o conjunto de funções Autovalue. Pode ser usado, por exemplo, quando um banco de
dados é inicialmente usado com dados de teste e, subsequentemente, fornecido com dados reais. Isso
requer que o conteúdo das tabelas seja excluído e um novo valor, como "1", seja definido para o campo.
ALTER TABLE "Table_name"
ADICIONAR [CONSTRAINT "Condition_name"] CHECK (<Search_condition>);
Isso adiciona uma condição de pesquisa introduzida pela palavra CHECK . Tal condição não será
aplicada retrospectivamente aos registros existentes, mas será aplicada a todas as alterações
subsequentes e registros recém-inseridos. Se um nome de restrição não for definido, um será atribuído
automaticamente.
Exemplo:
ALTER TABLE "Empréstimo" ADD CHECK (IFNULL ("Devolução_Data",
"Empréstimo_Data")> = "Empréstimo_Data")
A tabela Empréstimo precisa ser protegida contra erros de entrada. Por exemplo, você deve evitar
que uma data de retorno seja anterior à data do empréstimo. Agora, se esse erro ocorrer durante o
processo de retorno, você receberá uma mensagem de erro Verificar violação de
restrição…
ALTER TABLE "Table_name"
ADD [CONSTRAINT "Constraint_name"] UNIQUE ("Field_name1", "Field_name2"
...);
Aqui é adicionada uma condição que força os campos nomeados a terem valores diferentes em cada
registro. Se vários campos são nomeados, essa condição se aplica à combinação em vez dos campos
individuais. NULL não conta aqui. Um campo pode, portanto, ter o mesmo valor repetidamente sem
causar problemas, se o outro campo em cada um dos registros for NULL .
Este comando não funcionará se já houver uma condição UNIQUE para a mesma combinação de
campos.
ALTER TABLE "Table_name"
ADD [CONSTRAINT "Constraint_name"] PRIMARY KEY ("Field_name1",
"Field_name2" ...);
Adiciona uma chave primária, opcionalmente com uma restrição, a uma tabela. A sintaxe da restrição é a
mesma de quando uma tabela é criada.
ALTER TABLE "Table_name"
ADD [CONSTRAINT "Constraint_name"] CHAVE ESTRANGEIRA ("Field_name1",
"Field_name2" ...)
REFERÊNCIAS "Table_name_of_another_table" ("Field_name1_other_table",
"Field_name2_other_table" ...)
[ON {DELETE | ATUALIZAÇÃO} {CASCADE | SET DEFAULT | SET NULL}];
Isso adiciona uma chave estrangeira ( FOREIGN KEY ) à tabela. A sintaxe é a mesma de quando uma
tabela é criada.
A operação terminará com uma mensagem de erro, se algum valor na tabela não tiver um valor
correspondente na tabela que contém essa chave primária.
Exemplo: as tabelas Nome e Endereço devem ser vinculadas. A tabela Nome contém um campo com o
nome Address_ID . O valor disso deve estar vinculado ao ID do campo na tabela Address . Se o valor "1"
for encontrado em Address_ID, mas não no campo ID da tabela Address , o link não funcionará. Ele não
funcionará se os dois campos forem de tipos diferentes.
ALTER TABLE "Table_name" DROP CONSTRAINT "Constraint_name";
Este comando remove a restrição nomeada ( UNIQUE , CHECK , FOREIGN KEY ) de uma
tabela.
ALTER TABLE "Table_name" RENAME TO "new_table_name";
Finalmente, este comando altera apenas o nome de uma tabela.
Excluindo tabelas
DROP TABLE " Nome da tabela " [IF EXISTS] [RESTRICT | CASCATA];
Exclui a tabela "Nome da tabela".
IF EXISTS impede que um erro ocorra se esta tabela não existir.
RESTRICT é o arranjo padrão e não precisa ser explicitamente escolhido; isso significa que a exclusão
não ocorre se a tabela estiver vinculada a outra tabela pelo uso de uma chave estrangeira ou se houver
uma exibição ativa dessa tabela. As consultas não são afetadas, pois não são armazenadas no HSQLDB.
Se, em vez disso, você escolher CASCADE , todos os links para a tabela "Table_name" serão excluídos.
Nas tabelas vinculadas, todas as chaves estrangeiras são definidas como NULL. Todas as visualizações
referentes à tabela nomeada também são completamente excluídas.
Ligando Tabelas
Em princípio, você pode ter um banco de dados sem links entre tabelas. O usuário deve então assegurar,
durante a entrada de dados, que os relacionamentos entre as tabelas permanecem corretos. Isso
geralmente ocorre através do uso de formulários de entrada adequados que gerenciam isso.
A exclusão de registros em tabelas vinculadas não é uma tarefa simples. Suponha que você deseje excluir
uma determinada rua da tabela Street na Figura 7 , onde esse campo está vinculado à tabela Address
como uma chave estrangeira nessa tabela. As referências na tabela de endereços desapareceriam. O
banco de dados não permite isso, uma vez que o relacionamento tenha sido criado. Para excluir a Street , a
pré-condição deve ser preenchida, não sendo mais referenciada na tabela Address .
Links básicos são feitos usando Ferramentas> Relacionamentos . Isso cria uma linha de conexão da
chave primária em uma tabela para a chave estrangeira definida na outra.
Você pode receber a seguinte mensagem de erro ao criar um link:
Esta mensagem mostra algum texto em inglês e o comando SQL interno que causou o erro.
Os tipos de colunas não correspondem na instrução - como o comando SQL também é exibido, a
referência é claramente para as colunas Address.str_ID e Street.ID . Para fins de teste, um desses
campos foi definido como Integer e o outro como Tiny Integer. Portanto, nenhum link pode ser criado, pois o
campo não pode ter o mesmo valor que o outro.
Nesse caso, os tipos de coluna correspondem. A instrução SQL é a mesma do primeiro exemplo. Mas,
novamente, há um erro:
Violação de restrição de integridade - nenhum pai 1, tabela: Endereço ... - A integridade do
relacionamento não é garantida. No campo da tabela Endereço, Address.str_ID , há um número 1, que não
está presente no Street.ID . A tabela pai aqui é Street , já que sua chave primária é aquela que deve existir.
Esse erro é muito comum, quando duas tabelas devem ser vinculadas e alguns campos na tabela com a
chave estrangeira prospectiva já contêm dados. Se o campo de chave estrangeira contiver uma entrada
que não esteja presente na tabela pai (a tabela que contém a chave primária), esta é uma entrada inválida.
Se a vinculação for realizada com êxito e, posteriormente, houver uma tentativa de inserir um registro
inválido semelhante na tabela, você receberá a seguinte mensagem de erro:
Novamente, isso é uma violação de integridade. Base de se recusa a aceitar o valor 1 para o campo str_ID
após o link foi feita porque a rua tabela não contém tal v alor no campo ID.
Figura 12: Links podem ser editados com um clique com o botão direito
As propriedades de um link podem ser editadas para que a exclusão de um registro da tabela Street seja
definida simultaneamente como NULL para as entradas correspondentes na tabela Ad dress .
As propriedades mostradas na Figura 12 sempre se relacionam a uma ação vinculada à alteração em um
registro da tabela que contém a chave primária correspondente. No nosso caso, esta é a mesa de rua . Se
a chave primária de um registro nesta tabela for alterada (Atualização) , as ações a seguir poderão
ocorrer.
Nenhuma ação
Alterar a chave primária Street.ID não é permitido nesse caso, pois isso quebraria o relacionamento
entre as tabelas.
Atualizar cascata
Se a chave primária Street.ID for alterada, a chave estrangeira será alterada automaticamente para seu
novo valor. Isso garante que a ligação não seja danificada. Por exemplo, se um valor for alterado de 3
para 4, todos os registros da tabela Endereço que contiverem a chave estrangeira Address.Street_ID
com o valor 3, serão alterados para 4.
Definir nulo
Todos os registros que contêm essa chave primária específica agora não terão nenhuma entrada no
campo de chave estrangeira Address.Street_ID; o campo será NULL.
Conjunto padrão
Se a chave primária Street_ID for alterada, o valor de Address.Street_ID originalmente vinculado a ela
será definido como o valor padrão definido anteriormente. Para este propósito, precisamos de uma
definição inequívoca de um valor padrão. A GUI do LibreOffice Base até a versão 3.5 não parece
fornecer isso. Se o padrão for definido usando a instrução SQL:
ALTER TABLE "Endereço" ALTER COLUMN "Street_ID" SET DEFAULT 1;
a definição de link garante que o campo retornará a esse valor no caso de uma atualização. Portanto,
se a chave primária da tabela Street for alterada, a chave estrangeira correspondente na tabela Address
será definida como 1. Isso é útil quando um registro é necessário para ter um campo de rua, em outras
palavras, esse campo não pode ser NULL. Mas tenha cuidado! Se um não estiver em uso, você terá
criado um link para um não-existir e valor nt. Nesse caso, o HSQLDB parece ter sido projetado sem o
devido pensamento. Portanto, é possível destruir a integridade do relacionamento.
Para evitar mensagens de erro do banco de dados, tanto quanto possível, uma
Gorjeta vez que elas nem sempre são compreensíveis para o usuário, a opção
Nenhuma ação deve ser definitivamente evitada.
Colunas individuais na exibição de dados de tabela podem ser ocultas. Por exemplo, se o campo da chave
primária não precisar estar visível, isso pode ser especificado na tabela na visualização de entrada de
dados clicando com o botão direito do mouse no cabeçalho da coluna. Essa configuração é armazenada
com a GUI. A coluna continua a existir na tabela e sempre pode ser novamente visível.
A entrada na tabela geralmente ocorre da esquerda para a direita usando o teclado com as teclas Tab ou
Enter . Você também pode usar o mouse.
Quando você alcança o último campo de um registro, o cursor automaticamente salta para o próximo
registro. A entrada anterior está comprometida com o armazenamento. O armazenamento adicional
usando Arquivo> Salvar não é necessário e, na verdade, não é possível. Os dados já estão no banco de
dados.
Se nenhum dado for inserido em um campo que tenha sido definido anteriormente durante o design da
tabela como obrigatório ( NOT NULL ), a mensagem de erro apropriada será exibida:
Tentativa de inserir nulo em uma coluna não anulável…
A coluna correspondente, a tabela e o comando SQL (conforme traduzido pela GUI) também são exibidos.
É fácil alterar um registro: localize o campo, insira um valor diferente e saia da linha novamente.
Para excluir um registro, selecione a linha clicando em seu cabeçalho (a área cinza à esquerda), clique
com o botão direito do mouse e escolha Excluir linhas .
As funções Classificar, Pesquisar e Filtrar são muito úteis para recuperar registros específicos.
Tabelas de classificação
Figura 16: Classificação Rápida
A opção de ordenação rápida esconde atrás do A → Z e Z → A B uttons. Um campo é selecionado, um
clique no botão e os dados são classificados por essa coluna. A figura mostra uma classificação
decrescente pelo campo Título .
A classificação rápida classifica apenas por uma coluna. Para classificar por várias colunas
simultaneamente, uma função de classificação adicional é fornecida.
O nome do campo da coluna e a ordem de classificação atual são selecionados. Se uma classificação
rápida anterior tiver sido executada, a primeira linha já conterá o nome do campo e a ordem de
classificação correspondentes.
Figura 17:
Classificando
por mais de
uma coluna
Procurando tabelas
As funções para procurar registros são extensas e talvez não sejam a primeira escolha para localizar um
registro específico para usuários acostumados a mecanismos de pesquisa.
A função de pesquisa de similaridade é útil quando você precisa excluir erros de ortografia. Quanto mais
altos os valores que você definir, mais registros serão exibidos na lista final.
Este módulo de pesquisa é mais adequado para pessoas que sabem, de uso regular, exatamente como
alcançar um determinado resultado. A maioria dos usuários tem mais chances de obter registros usando
um filtro.
O Capítulo 4 deste manual descreve o uso de formulários para pesquisa e como o uso de SQL e macros
pode realizar uma pesquisa de palavras-chave.
Tabelas de filtragem
Você pode filtrar uma tabela rapidamente usando o AutoFiltro . Coloque o cursor em um campo e um
clique no ícone faz com que o filtro assuma o conteúdo desse campo. Apenas os registros são mostrados
para os quais o campo escolhido possui o mesmo conteúdo. A figura abaixo mostra a filtragem de acordo
com uma entrada na coluna Pub_Year .
O filtro está ativo, conforme mostrado pelo ícone de filtro com uma marca de seleção verde. O símbolo do
filtro é mostrado pressionado. Se o botão for clicado novamente, o filtro continuará existindo, mas todos os
registros serão exibidos agora. Então, se você quiser, você sempre pode retornar ao estado filtrado.
Clicar no ícone Remover filtro / ordenar na extrema direita faz com que todos os filtros e classificações
existentes sejam removidos. Os filtros ficam inativos e não podem mais ser recuperados com seus valores
antigos.
Você ainda pode inserir registros normalmente em uma tabela filtrada ou
Gorjeta restrita por uma pesquisa. Eles permanecem visíveis na exibição de tabela até
que a tabela seja atualizada pressionando o botão Atualizar .
O ícone Filtro Padrão abre uma caixa de diálogo na qual você pode filtrar usando vários critérios
simultâneos, semelhante a fazer uma classificação. Se o AutoFiltro estiver em uso, a primeira linha do Filtro
Padrão já mostrará esse critério de filtro existente.
Figura 20:
Filtragem
de Dados
Múltiplos
usando o
Filtro
Padrão
O filtro padrão fornece muitas das funções de filtragem de dados SQL. Os seguintes comandos SQL estão
disponíveis.
Condição da Descrição
GUI
= Igualdade exata; corresponde a like , mas sem nenhum placeholder
adicional
<> Desigual
< Menos que
<= Menor ou igual
> Melhor que
>= Maior que ou igual
gostar Para texto, escrito entre aspas ( '' ); "_" para um caractere
variável, "%" para um número arbitrário de caracteres variáveis
Antes que um critério de filtro possa ser combinado com outro, a seguinte linha deve ter pelo menos um
nome de campo selecionado. Na Figura 20 , a palavra - nenhum - é mostrada em vez de um nome de
campo, portanto a combinação não está ativa. Os operadores de combinação disponíveis são AND e
OR .
O nome do campo pode ser um novo nome de campo ou um nome previamente selecionado.
Mesmo para grandes coletas de dados, o número de registros recuperados pode ser reduzido a um
conjunto gerenciável com filtragem habilidosa usando essas três condições possíveis.
No caso de formulários de filtragem também, existem algumas outras possibilidades (descritas no capítulo
seguinte) que não são fornecidas pela GUI.
A tabela Empréstimo consiste em chaves estrangeiras para o item que está sendo emprestado ( Media_ID
) e o leitor correspondente ( Reader_ID ), bem como uma data de empréstimo ( Loan_Date ). Na tabela,
portanto, precisamos inserir no momento do empréstimo dois valores numéricos (número da mídia e
número do leitor) e uma data. A chave primária é inserida automaticamente no campo ID . Se o leitor
realmente corresponde ao número não é aparente a menos que uma segunda tabela para os leitores esteja
aberta ao mesmo tempo. Se o item foi emprestado com o número correto também não é aparente. Aqui, o
empréstimo deve basear-se no rótulo do item ou em outra mesa aberta.
Tudo isso é muito mais fácil de realizar usando formulários. Aqui, os usuários e a mídia podem ser
consultados usando controles de caixa de listagem. Nos formulários, os nomes de usuário e item são
visíveis e seus identificadores numéricos são ocultos. Além disso, um formulário pode ser criado de modo
que um usuário possa ser selecionado primeiro, depois uma data de empréstimo e cada conjunto de mídia
seja atribuído a essa data por número. Em outros lugares, esses números podem ser visíveis com as
descrições de mídia correspondentes exatamente.
A entrada direta em tabelas é útil apenas para bancos de dados com tabelas simples. Assim que você tiver
relações entre tabelas, uma forma especialmente projetada é melhor. Nos formulários, esses
relacionamentos podem ser melhor manipulados usando subformulários ou campos de lista.
Capítulo 4
Formulários
Formulários facilitam a entrada de dados
Os formulários são usados whe n entrada direta em uma tabela é inconveniente, para pegar erros de
entrada de dados imediatamente, ou quando são muitas mesas fazer a gestão directa de dados
impossíveis.
Creati ng de f ORMs
A maneira mais simples de criar um formulário é usar o Assistente de Formulário. O uso do Assistente
para criar um formulário é descrito no Capítulo 8, Introdução ao Base, no guia Introdução ao LibreOffice . Th
no capítulo também explica como você pode modificar ainda mais a forma depois de usar o Assistente.
Este manual descreve a criação de um formulário sem usar o Assistente. I t também descreve as
propriedades dos vários tipos de controlos em uma forma.
Um simples f orm
Começamos usando a tarefa Create F orm no Design View na área Forms da janela principal do Base.
Isso chama o Editor de Formulários e a janela Formulário Mostrado no Modo Design é exibida ( Figura 21 ).
A barra de ferramentas de controles de formulário está encaixada no lado esquerdo. A barra de ferramentas
Design Form (Figura 22 ) está encaixada na parte inferior. Se essas barras de ferramentas não aparecerem
automaticamente, use Exibir > Barras de ferramentas para exibi- las. Sem essas barras de ferramentas,
não é possível criar um formulário.
A área em branco mostra uma grade de pontos. Esta grade ajuda você a posicionar os controles com
precisão, especialmente em relação um ao outro. Os símbolos na extremidade direita da barra de
ferramentas Design de formulário mostram que a grade está visível e ativa.
Figura 21: Formulário s
hown no modo Design
No Navegador de Formulários (Figura 23 ), clique com o botão direito em Formulários para abrir um menu
de contexto. Escolha Ne w> Form para criar um novo formulário. O o ther c SCOLHA s no menu de
contexto ( aberto no modo de estrutura e Focagem Automatic Control ) correspondem a b uttons na Fig
ure 22 ; Vamos discuti-los mais tarde.
O formulário carrega o nome padrão Form . Você pode alterar o nome dele imediatamente ou mais tarde.
Não tenho significado a menos que você precise acessar alguma parte do formulário usando macros. A
única coisa que você precisa garantir é que dois elementos com o mesmo nome não ocorram no mesmo
nível na árvore de pastas.
O menu de contexto do formulário (mostrado abaixo) fornece o caminho para criar propriedades de
formulário.
Agora você pode criar o formulário clicando com o botão direito e usando o menu de contexto para o
controle (Figura26 ).
Selecione t ele Formar opção de menu (em destaque na ilustração) para definir as propriedades para o
formulário que acabou de criar. O formulário tem o nome padrão Form.
P ropriedades de formulário
Quando as propriedades do formulário são chamadas usando o menu de contexto no Navegador de
formulários ou no menu de contexto de um controle de formulário, uma janela Propriedades do formulário é
exibida. Tem três guias: Geral , Dados e Eventos.
Guia Geral
Aqui você pode alterar o nome do formulário. Além disso, existem possibilidades de design que não têm
significado dentro da Base. Eles mostram apenas as possibilidades mais gerais de design usando um
editor de formulários; quando você criar um formulário da Web, precisará usá-los.
URL : destino para os dados.
Quadro : Seção do site de destino a ser abordada, quando necessário.
Codificação de envio : além da codificação de caracteres normal para transmissão para o URL, você
pode especificar aqui codificação de texto e codificação de várias partes (por exemplo, para
transferência de dados ).
Tipo de submissão : GET (visível através do URL anexado ao nome do arquivo; você pode ver isso
muitas vezes na web, se você usar um motor de busca) ou POST (não visível; adequado para grandes
volumes de dados).
Guia Dados
Para criar formulários internos no Base, essa é a guia mais importante. Aqui você pode definir as
seguintes propriedades iniciais para o formulário:
Tipo de conteúdo : C entre os comandos Tabela , Consulta e SQL . Enquanto Tabela sempre pode ser
usado para entrada de dados em uma forma, isso nem sempre é o caso de consulta (para mais
informações, consulte o Capítulo 5, QUER s , neste livro) ou a entrada directa de um comando SQL.
Aqui estamos lidando com uma consulta que não é visível no contêiner de consulta do Base, mas tem,
em princípio, a mesma estrutura.
Conteúdo : De acordo com a escolha da Tabela ou Consulta acima, todas as tabelas e consultas
disponíveis são listadas. Se um comando SQL for criado, você poderá chamar o Editor de Consultas
usando o botão com os três pontos à direita do campo Conteúdo.
Analy z comando e SQL : Se a um nálise de comandos SQL não deve ser permitido (porque, por
exemplo, você está usando o código que a GUI não pode mostrar corretamente), você deve escolher
Não aqui. No entanto, isso impedirá a forma de acessar os dados subjacentes usando um filtro ou uma
classificação.
Filtro : aqui você pode definir um filtro. Para obter ajuda, clique no botão à direita do campo. Veja
também C apítulo 3, Tabelas, neste livro .
Ordenar : aqui você pode configurar uma classificação para seus dados. Para obter ajuda, clique no
botão à direita do campo. Veja também C apítulo 3, Tabelas.
Permitir adições : a entrada de novos dados deve ser permitida? Por padrão, isso é definido como Sim .
Permitir modificações : a edição dos dados deve ser permitida? Por padrão, também sim .
Permitir exclusões : a exclusão de dados também é permitida por padrão.
Adicionar apenas dados : se você escolher essa opção, um formulário vazio será sempre exibido. Não
haverá acesso a dados existentes, que não podem ser editados nem visualizados.
Barra de navegação : A aparência da barra de navegação na parte inferior da tela pode ser ativada ou
desativada. Também existe a possibilidade, quando você tem um subformulário, sempre mostrar a
Barra de Navegação para o formulário principal, para que a ativação desta barra de ferramentas afete
apenas o formulário principal. Essa configuração para a barra de navegação não é relevante para a
barra de ferramentas de navegação interna que pode ser adicionada como um controle de formulário,
se necessário.
Ciclo : A opção D efault para bancos de dados de base é que, após a entrada no último campo em um
formulário, a tecla T ab leva você ao primeiro campo do próximo registro - ou seja, um novo registro
será criado. Para bancos de dados, isso tem o mesmo efeito que Todos os registros . Por outro lado, se
você escolher Registro ativo , o cursor se moverá somente dentro do registro; quando chegar ao último
campo, ele retornará ao primeiro campo nesse registro. Página atual refere-se particularmente a
formulários HTML. O cursor salta do final de um formulário para o próximo formulário nessa página
mais abaixo.
Guia Eventos
Eventos podem acionar macros. Um clique no botão à direita (…) permite que as macros sejam
vinculadas ao evento.
Redefinir : o formulário é esvaziado de todas as novas entradas que ainda não foram salvas.
Antes de enviar : Antes dos dados do formulário serem enviados. Isso só é significativo para
formulários da Web.
Ao carregar : somente ao abrir o formulário. Não ao carregar um novo registro no formulário.
Recarregamento : ocorre quando o conteúdo do formulário é atualizado, por exemplo, usando um botão
na barra de navegação.
Descarga : T sua opção parece não funcionar. Seria esperado que se referisse ao fechamento do
formulário.
Gravar ação : Isso inclui, por exemplo, armazenamento usando um botão. Nos testes, essa ação
regularmente se duplica; as macros são executadas duas vezes em sucessão.
Mudança de registro : a abertura de um formulário conta como uma mudança de registro. Sempre que
um registro muda para outro dentro do formulário, essa ação também ocorre duas vezes. As macros
são, portanto, executadas duas vezes em sucessão.
Parâmetros de preenchimento: essa macro será executada se uma consulta de parâmetro precisar ser
chamada em um subformulário, mas, por algum motivo, o parâmetro não é transmitido corretamente do
formulário principal. Se este evento não for detectado, uma consulta de parâmetro seguirá o
carregamento do formulário.
Erro: Este evento não pôde ser reconstruído.
Propriedades de c ONTROLOS
Depois que um formulário é criado, ele pode ser preenchido com controles visíveis. Alguns controles
permitem que o conteúdo do banco de dados seja exibido ou que os dados sejam inseridos no banco de
dados. Outros controles são usados exclusivamente para navegação, pesquisa e execução de comandos
(interação). Alguns controles servem para retrabalho gráfico adicional do formulário.
Entrada de dados e exibição de dados
Ao controle Usar
Campo de texto Entrada de texto
Campo numérico Inserindo números
Campo de data Inserindo datas
Campo de tempo Entrando vezes
Campo de moeda Entrada numérica pré-formatada para moeda
Campo formatado Exibição e entrada com formatação adicional, por exemplo, usando
unidades de medida
Caixa de listagem Escolhendo entre várias possibilidades diferentes, também para
transferir para o banco de dados de valores diferentes daqueles
exibidos
Caixa combo Semelhante a um campo de lista, mas com apenas o valor exibido
transferido ou você pode inserir novos valores manualmente
Caixa de seleção Sim / Não Campo
Botão Opções Botão r adio; um llows que você escolha a partir de um pequeno
número de possibilidades
Controle de imagem Exibição de imagens de um banco de dados e entrada de imagens
em um banco de dados por meio de uma seleção de caminho
Campo padrão Entrada em uma máscara predefinida; limita as possibilidades de
entrada a combinações de caracteres específicas
Controle de mesa Módulo de entrada universal, que pode exibir uma tabela inteira.
Integrado neste controle estão muitos dos controles acima
desenhar
Ao controle Usar
Campo de etiqueta Indo para o formulário, descrição de outros controles
Caixa de grupo Um quadro ao redor, por exemplo, um conjunto de botões de opção
Interação
Ao controle Usar
Botão Botão com etiqueta
Botão de imagem Como um botão, mas com um gráfico adicional exibido nele
Barra de navegação Barra de ferramentas muito semelhante à da extremidade inferior da
tela
Seletor de arquivos Para selecionar arquivos, por exemplo, para fazer upload em um
formulário HTML - não mais descrito
Caixa de rotação Só pode ser usado com uma macro - não descrita posteriormente
Barra de rolagem Só pode ser usado com uma macro - não descrita posteriormente
Normalmente Y es ; campos
invisíveis podem ser usados
como armazenamento
intermediário, por exemplo, na
criação de campos de
combinação com macros. Ver
C apítulo 9, macros.
Largura do campo
Altura do campo
Um símbolo de rotação é
incorporado no lado direito do
campo.
Guia Dados
Campo de dados : aqui você cria a ligação com a tabela na qual o formulário é baseado.
A string vazia é NULL : se uma string vazia deve ser tratada como (NULL) ou o conteúdo simplesmente
excluído.
Entrada obrigatória : essa condição deve corresponder à da tabela. A GUI solicitará a entrada se o
usuário não tiver inserido um valor.
Filtrar proposta : quando os dados devem ser filtrados, o conteúdo desse campo é armazenado
temporariamente como uma sugestão. Cuidado - com grandes conteúdos, essa opção pode usar muito
armazenamento.
Guia Eventos
Alterado : este evento ocorre quando um controle é modificado e depois perde o foco.
Texto modificado : refere-se ao conteúdo, que pode, de fato, ser texto, numérico ou o que for. Ocorre
depois que cada caractere adicional é inserido.
Ao receber foco : O cursor entra no campo. Sob nenhuma circunstância a macro deve criar um diálogo
de mensagem na tela; clicando em tal diálogo faz com que o campo de formulário perca o foco e, em
seguida, recupere-o, acionando a macro novamente. Um loop é criado e só pode ser quebrado usando
o teclado.
Ao perder o foco : o cursor sai do campo. Isso pode levar ao mesmo tipo de interação quando o
tratamento do evento faz com que ele ocorra novamente.
Tecla : Refere-se ao teclado. Por exemplo, uma tecla é pressionada quando você percorre o formulário
usando a tecla Tab. Isso faz com que um campo receba o foco. Então a chave é liberada.
Mouse : autoexplicativo; Estes eventos só acontecem se o mouse estiver ou já estiver dentro do
campo ("outside" corresponde ao javascript onMouseOut).
Redefinir : o formulário é esvaziado de todos os dados. Isso acontece, por exemplo, ao iniciar um novo
registro. Quando um formulário é carregado pela primeira vez, os dois eventos Antes de redefinir e
Após a redefinição ocorrem em sucessão, antes que o formulário esteja disponível para entrada.
Atualização : Se o evento estiver vinculado a um controle de formulário, a atualização ocorre quando o
foco é perdido e pula para outro controle de formulário, depois de alterar o conteúdo do campo.
Alterações no formulário são aceitas e exibidas. Quando um formulário é fechado, os dois eventos
Antes da atualização e Após a atualização ocorrem em sucessão.
Campo de texto
Assim como as propriedades definidas na página 70 , os campos de texto podem ter as seguintes
propriedades adicionais:
Guia Geral
Guia Dados
N ada de significância.
Guia Eventos
N ada de significância.
Numérico f ield
Além das propriedades já descritas, existem as seguintes propriedades:
Guia Geral
Valor máximo.
Guia Dados
Não há verificação se um campo pode ser NULL. Se não houver entrada, o campo será NULL e não 0.
Nenhuma proposta de filtro é oferecida.
Guia Eventos
O evento "Changed" está ausente. As alterações devem ser tratadas usando o evento "Texto
modificado" (o texto da palavra não deve ser usado literalmente aqui).
Campo de data
Além das propriedades descritas na página 70 , deve-se observar o seguinte.
Guia Geral
Valor máximo.
Guia Dados
Não há verificação se um campo pode ser NULL. Se não houver entrada, o campo será NULL e não 0.
Nenhuma proposta de filtro é oferecida.
Guia Eventos
O evento "Changed" está ausente. As alterações devem ser tratadas usando o evento "Texto
modificado" (o texto da palavra não deve ser usado literalmente aqui).
Campo de tempo
Além das propriedades listadas na página 70 , os seguintes recursos estão disponíveis.
Guia Geral
Guia Dados
Não há verificação se um campo pode ser NULL. Se não houver entrada, o campo será NULL e não 0.
Nenhuma proposta de filtro é oferecida.
Guia Eventos
O evento "Changed" está ausente. As alterações devem ser tratadas usando o evento "Texto
modificado" (o texto da palavra não deve ser usado literalmente aqui).
Campo de moeda
Além das propriedades já listadas na página 70 , os seguintes recursos estão disponíveis:
Guia Geral
Min. valor, máx. valor, Incremento, Valor padrão, Casas decimais e Milhares de separadores.
correspondem às propriedades gerais listadas na página 75 . Além destes, existe apenas:
O símbolo é exibido, mas não
armazenado na tabela
subjacente ao formulário.
Guia Dados
Não há verificação se um campo pode ser NULL. Se não houver entrada, o campo será NULL e não 0.
Nenhuma proposta de filtro é oferecida.
Guia Eventos
O evento "Changed" está ausente. As alterações devem ser tratadas usando o evento "Texto
modificado" (o texto da palavra não deve ser usado literalmente aqui).
Formatado f ield
Além das propriedades listadas na página 70 , os seguintes recursos são oferecidos:
Guia Geral
Os valores mínimo e máximo e o valor padrão dependem da formatação. Atrás do botão de
Formatação i é um campo flexível t h a torna mais moeda e campos numéricos desnecessário. Ao
contrário de um campo de moeda simples, um campo de padrão pode mostrar somas negativas em
vermelho.
O botão à direita com os três
pontos fornece uma opção de
formatos numéricos, como
você costuma fazer no Calc.
Entre os formatos numéricos podem ser vistos, ao lado de Data, Hora, Moeda ou formato numérico
normal, possibilidades de usar campos com uma unidade de medida como kg (veja a Figura 27 ). Veja
também a Ajuda geral sobre códigos de formato numérico.
Guia Dados
Nada de especial para reportar.
Guia Eventos
O evento "Changed" está ausente. As alterações devem ser tratadas usando o evento "Texto
modificado" (o texto da palavra não deve ser usado literalmente aqui).
Lista b boi
Quando uma caixa de listagem é criada, o assistente L ist B ox aparece por padrão. Esta aparência
automático pode ser comutado o f f se necessário, utilizando o Assistentes S / N O FF ( mostrado na Fig
ure 24 ).
bruxo
O formulário já está definido. Está vinculado a uma tabela chamada Empréstimos . Uma caixa de
listagem mostra ao usuário dados diferentes do que é realmente transmitido para a tabela . Esses
dados geralmente vêm de outra tabela no banco de dados e não da tabela à qual o formulário está
vinculado.
A tabela Empréstimos i s suppos ed para mostrar quais Reader tem Borro casar w mídia hich. No
entanto, esta tabela não armazena o nome do leitor, mas a chave primária correspondente da tabela do
Reader . É, portanto, a tabela Leitor t chapéu fo rm s a base para a caixa de listagem.
O campo Sobrenome da tabela do Leitor deve ser visível na caixa de listagem. Isso serve como o
campo de exibição .
O campo Reader_ID o ccurs na tabela Empréstimo que serve de base ao formulário. Esta tabela é
descrita aqui como a tabela Value . O ID da chave primária da tabela do Reader deve estar vinculado a
este campo. A tabela do Reader é descriçada aqui como a tabela List .
A caixa de listagem agora foi criada completa com dados e configuração padrão e está totalmente
funcional.
Além das propriedades listadas na página 70 , os seguintes recursos estão disponíveis.
Guia Geral
As entradas da lista já foram
definidas usando o Assistente.
Aqui você pode adicionar mais
entradas que não são de
nenhuma tabela no banco de
dados. Listar entradas aqui
significa as entradas visíveis,
não aquelas que o formulário
transmitirá para a tabela.
Guia Dados
Além das propriedades de dados usuais, Campo de dados e Entrada necessária , existem propriedades
significativas que afetam a ligação entre os dados exibidos e os dados a serem inseridos na tabela
subjacente ao formulário.
Tipo de conteúdo da lista : Valuelist | Tabela | Consulta | SQL | SQL [nativo] | Campos de mesa
Lista o conteúdo valueList : Se a lista ENTR s foram criados unde r geral , os valores correspondentes
a serem armazenados são inseridos aqui. O conteúdo da lista é carregado com itens individuais
separados por Shift - Enter . O campo Listar conteúdo mostra-os como " Valor1 "
; " Valor2 " ; " Valor3 " ... A propriedade Campo
Vinculado está inativa .
Listar o conteúdo Tabela : Aqui, uma das tabelas do banco de dados pode ser selecionada. No entanto,
isso raramente é possível, pois exige que o conteúdo da tabela seja estruturado de forma que o primeiro
campo da tabela contenha os valores a serem exibidos no campo de lista e um dos seguintes campos
contenha a chave primária que a tabela subjacente usa como uma chave estrangeira. A posição deste
campo dentro da tabela é especificada em Campo Limite , onde a numeração começa com 0 para o
primeiro campo da tabela do banco de dados . Mas este 0 é reservado para o valor exibido, no
exemplo acima o sobrenome , enquanto o 1 se refere ao campo ID .
Listar conteúdo Consulta : Aqui, uma consulta é criada primeiro e armazenada separadamente. A
criação dessas consultas é descrita no Capítulo 5, Consultas. Usando a consulta, é possível mover o
campo ID da primeira posição na tabela subjacente para a segunda posição, aqui representada pelo
campo acoplado 1.
Listar o conteúdo SQL : O Assistente de Caixa de Lista preenche este campo. A consulta construída
pelo Assistente se parece com isso:
A consulta é a mais simples possível. O campo
de sobrenome o ccurs na posição 0, o campo
de ID na posição 1. Ambos são lidos da tabela
do Reader. Como o campo acoplado é o Campo
1, essa fórmula SQL funciona. Aqui deve ser adicionado ORDER BY "LastName" ASC . Então
você não precisa percorrer a lista para encontrar alguém. A n um problema dicional pode ser, que
LastName poderia ser o mesmo para mais de um leitor. Portanto, FirstName deve ser adicionado na
exibição da caixa de listagem. W galinha existem leitor s com o mesmo sobrenome e o mesmo
NomePróprio , a chave principal ID também deve ser mostrado. Vejo C apítulo 5, Consultas, para obter
informações sobre como isso funciona.
Listar conteúdo SQL [Nativo] : A fórmula SQL é inserida diretamente, não usando o Assistente. Base
não avalia a consulta. Isso é adequado quando a consulta contém funções que talvez não sejam
compreendidas pela GUI Base. Nesse caso, a consulta não está marcada para erros. Mais
informações sobre o modo SQL direta pode ser encontrado em C apítulo 5, Consultas.
Listar os campos de tabela de conteúdo : Aqui os nomes de campo de uma tabela são listados, não seu
conteúdo. Para a tabela do Reader , o conteúdo da lista seria " ID", "Nome próprio", "Apelido",
"Bloqueio", "Gender_ID".
Guia Eventos
Além dos eventos padrão, os seguintes eventos estão disponíveis:
Executar ação : Se um valor for escolhido pelo teclado ou pelo mouse , a caixa de listagem executará
essa ação .
Status do item alterado : pode ser a alteração do conteúdo exibido de uma caixa de listagem por meio
do uso do botão suspenso. Também pode ser um clique no botão suspenso do campo.
Erro : infelizmente, este evento não pode ser reconstruído para caixas de listagem.
Caixa combo
Assim que uma caixa de combinação é criada, um Assistente aparece por padrão, assim como com uma
caixa de listagem. Este comportamento automático pode ser desactivada, se necessário, utilizando o
Assistentes S N / S ff botão ( ver Fig ure 24 ).
Caixas de combinação gravam o texto selecionado diretamente na tabela subjacente ao formulário.
Portanto, o exemplo a seguir mostra a tabela vinculada ao formulário e a selecionada para o controle como
a tabela do Reader.
bruxo
Novamente o formulário é predefinido, desta vez com a tabela do Reader. Como os dados a serem exibidos
na caixa de combinação também devem ser armazenados nesta tabela, a fonte selecionada para os dados da
lista é da mesma forma a tabela do Reader.
Na tabela do Reader, o campo FirstName ocorre. Isso deve ser exibido na caixa de combinação.
Em um banco de dados, parece haver pouco sentido em não armazenar o valor de uma caixa de
combinação dentro de um campo. Queremos ler os nomes fornecidos da tabela do Reader e também
disponibilizá-los para novos leitores, para que não seja necessário criar novos registros para um
determinado nome que já exista no banco de dados. A caixa de combinação mostra o primeiro nome e a
entrada de texto não é necessária.
Se um novo valor precisar ser inserido, isso pode ser feito facilmente em uma caixa de combinação, pois a
caixa mostra exatamente o que está entrando na tabela subjacente do formulário.
Além das propriedades mostradas na página 70 e descritas para caixas de listagem, os recursos a seguir
estão disponíveis.
Guia Geral
Durante a entrada de novos
valores, uma lista de valores
correspondentes (se houver) é
exibida para uma possível
seleção.
Guia Dados
Caixa de seleção
A caixa de seleção aparece imediatamente como uma combinação de um campo de caixa de seleção e
um rótulo para a caixa.
Além das propriedades descritas na página 70 , os seguintes recursos estão disponíveis.
Guia geral
Guia Dados
A caixa de seleção pode receber um valor de referência. No entanto, apenas os valores de 1 (para On)
ou 0 (para Off) podem ser transferidos para o campo de dados subjacente (as caixas de verificação
atuam como campos para a escolha de Yes e No ) .
Guia Eventos
Os campos "Alterado", "Texto modificado". "Antes de atualizar" e "Após a atualização" estão todos
ausentes.
Os campos adicionais para uma caixa de seleção são "Executar ação" (consulte Caixa de listagem) e
"Status do item alterado" (corresponde a "Alterado").
Botão de opção
O botão de opção é semelhante à da caixa de verificação descrita acima, com excepção das suas g
propriedades eral e a sua forma externa (redondo).
Quando vários botões de opção no formulário estão vinculados ao mesmo campo da tabela, somente uma
das opções pode ser selecionada.
Guia Geral
O botão de opção é projetado
para ser usado em grupos.
Uma das várias opções pode
ser selecionada. É por isso que
um nome de grupo aparece
aqui, sob o qual as opções
podem ser endereçadas.
Guia Dados
Veja abaixo da caixa de seleção. Aqui, no entanto, os valores de referência inseridos são realmente
transferidos para o campo de dados.
Guia Eventos
Veja abaixo da caixa de seleção.
Imagem c ontrole
Um controle de imagem lida com a entrada e exibição de material gráfico no banco de dados. O campo de
dados subjacente deve ser um campo binário.
A entrada em um controle de imagem ocorre por um clique duplo com o mouse para abrir uma caixa de
diálogo de seleção de arquivos ou por um clique com o botão direito do mouse para escolher se um gráfico
existente deve ser excluído ou substituído.
Um controle gráfico por padrão não possui uma parada Tab.
Além das propriedades descritas na página 70 , as seguintes características são beneficie um ble.
Guia geral
Guia Dados
Nada mais a relatar.
Guia Eventos
Os eventos "Alterado", "Texto modificado", "Antes de atualizar" e "Após a atualização" estão faltando.
Padrão f ield
Uma máscara de entrada é usada para controlar a entrada no campo. Os caracteres são pré-especificados
para posições específicas, determinando as propriedades dos caracteres inseridos. Os caracteres
predefinidos são armazenados junto com os inseridos.
Além das propriedades descritas na página 70 , os seguintes recursos estão disponíveis.
Guia Geral
Isso determina quais
caracteres podem ser
inseridos.
Controle de mesa
Este é o controle mais abrangente. Ele fornece uma tabela, que pode ser fornecida com controles para
colunas individuais. Isso não apenas permite que os dados reais sejam visualizados durante a entrada,
mas também os dados inseridos anteriormente, sem a necessidade de usar a barra de navegação para
percorrer os registros.
Nem todos os campos possíveis em um formulário podem ser selecionados para um campo de controle de
tabela. Botões de pressão, botões de imagem e botões de opção não estão disponíveis.
O Table Control Wizard monta em uma janela os campos que aparecerão depois na tabela.
No controle, a tabela Empréstimos está disponível para edição. Além do campo ID (chave primária) e do
campo Media_ID_BC (entrada de mídia usando um scanner de código de barras), todos os campos devem
ser usados no controle.
O controle de tabela criado anteriormente deve agora ser desenvolvido, para permitir a entrada na tabela
básica . Para campos como Reader_ID ou Media_ID , seria mais útil poder escolher o leitor ou a mídia
diretamente, em vez de um número que representa o leitor ou a mídia. Para esse propósito, controles como
caixas de listagem podem ser colocados dentro do controle de tabela. Isso é declarado mais tarde. A
formatação do campo Extensão com duas casas decimais certamente não foi planejada.
Figura 28: Saída do Assistente
de Controle de Tabela
Campo de etiqueta
Além das propriedades descritas na página 70 , os seguintes recursos estão disponíveis.
Guia Geral
Por padrão, um rótulo não é
empacotado. Se for muito longo
para o campo, ele será
truncado. Cuidado: quebra de
linha não reconhece espaços,
portanto, se o campo for muito
pequeno, pode ocorrer uma
quebra em uma palavra.
Guia Dados
Nenhum.
Guia Eventos
O campo de etiqueta reage apenas aos eventos que estão conectados com o mouse, uma chave ou o
foco.
Caixa de grupo
Uma caixa de grupo agrupa graficamente vários controles e fornece a eles um rótulo coletivo.
Se uma caixa de grupo for criada com os Assistentes ativos, o Assistente parte da suposição de que vários
botões de opção ocorrerão juntos nesse quadro.
Este formulário é baseado na tabela do Reader. Estamos lidando com a escolha do gênero. As entradas
são os rótulos dos botões de opção.
Aqui a opção padrão é "feminino". Se não houver nenhum campo padrão, a entrada padrão na tabela
subjacente será NULL.
O Assistente dá aos botões de opção valores separados por padrão, aqui 1 para fem a le e 2 para m ale.
Esses valores correspondem aos exemplos de campos de chave primária na tabela Gênero.
O valor selecionado ao clicar em um botão de opção é transferido para o campo Gender_ID dos leitores da
tabela abaixo do formulário . Desta forma, a tabela Readers é fornecida com a chave estrangeira
correspondente da tabela Gender usando o botão de opção.
O grupo de botões de opção recebe uma caixa de grupo (quadro) com o rótulo Gênero.
Se a fêmea for selecionada na forma ativa , o macho é desmarcado. Essa é uma característica dos botões
de opção vinculados ao mesmo campo na tabela subjacente. No exemplo mostrado acima, os botões de
opção substituem uma caixa de listagem de dois elementos.
Além das propriedades descritas na página 70 , os seguintes recursos estão disponíveis.
Guia Geral
O rótulo pode ser alterado de seu valor padrão. No momento, as propriedades do quadro (espessura da
linha, cor da linha) não podem ser alteradas, mas você pode alterar a formatação da fonte.
Guia Dados
Nenhum, pois esse controle serve apenas para agrupamento visual de campos.
Eventos rab
A caixa de grupo reage a eventos envolvendo o mouse, uma chave ou o foco.
Empurre b utton
Além das propriedades descritas na página 70 , os seguintes recursos estão disponíveis.
Guia geral
Etiqueta no botão.
Guia Dados
Nenhum. Um botão só executa ações.
Guia Eventos
"Aprovar ação", "Executar ação" e "Status do item alterado".
Imagem b utton
Além das propriedades já descritas na página 70 , os seguintes recursos estão disponíveis.
Guia Geral
Semelhante a um botão normal. No entanto, este botão não tem texto e o botão em si não é visível.
Você vê apenas uma moldura ao redor do gráfico.
Por padrão, um botão de imagem não tem parada de tabulação.
Atenção: no momento da escrita, quase nenhuma ação funciona com este botão. É praticamente só
utilizável com macros.
Guia Dados
Nenhum; esse controle realiza apenas ações.
Guia Eventos
"Aprovar ação" e todos os eventos que envolvam o mouse, uma chave ou o foco.
Barra de navegação
Figura 29:
Navegação b
ar control
A barra de pesquisa padrão F orm N é inserida em formulários na borda inferior da tela. A inserção desta
barra de ferramentas pode causar um breve deslocamento para a direita do formulário à medida que ele se
acumula na tela. Isso pode ser uma distração nos casos em que a barra de navegação é desativada
novamente para algumas partes do formulário visível, por exemplo, quando há subformulários ou mais de
um formulário no formato visível .
Por outro lado, um controle de barra de navegação que faz parte do formulário, separado dos itens
correspondentes, deixa claro por quais itens você navega com a barra de ferramentas. O formulário para
Loan s , por exemplo, precisa procurar primeiro através dos leitores e, em seguida, mostrar a mídia
carregado para o leitor. A barra de navegação de controle está posicionado perto do leitor, de modo que o
aviso do usuário s de que a barra de navegação é utilizado para o leitor e não para os meios emprestados
para o leitor.
A barra de aviação padrão F orm N disponibiliza os botões mostrados na figura30 . O controle da barra de
navegação mostra o mesmo botão s excepto th ose para Encontrar ficha, Filtros formulário com base em
dados e s onte como Tabela.
Figura 30: Botões de
navegação
Além das propriedades listadas na página 70 , os recursos a seguir estão disponíveis para o controle da
barra de navegação .
Guia Geral
O tamanho do ícone é
ajustável. Além disso, você
pode escolher quais grupos
são exibidos. Estas são
mostradas na Fig ure 29 a
partir da esquerda para a
direita usando uma linha
vertical como um separador
de grupo: Posicionamento,
navegação, sob uma ficha, e
grupos de comandos para
filtragem e classificação.
Guia Dados
Nenhum, já que este controle apenas realiza ações.
Guia Eventos
Todos os eventos que envolvem o mouse, uma chave ou o foco.
Independente desse controle de formulário, a barra de navegação inserível naturalmente continua
existindo com os mesmos itens da figura acima.
Essa barra de navegação inserível fornece adicionalmente a pesquisa de registro geral , o filtro com base
em formulário e a exibição da fonte de dados subjacente do formulário na exibição de tabela acima do
formulário.
Se você estiver trabalhando não apenas com um formulário, mas com subformulários e formulários
auxiliares, deve ter cuidado para que essa barra de navegação inserível não desapareça quando você
alternar os formulários. Isso cria um efeito perturbador na tela.
Seleção múltipla
Se você usar o ícone Select (Fig ure 24 ) para selecionar uma região grande ou vários elementos de um
formulário, as seguintes modificações podem ser realizadas (ver Fig ure 31 ).
Figura 31: gerais p ROPRIEDADES de f orm f fields em um m últiplo s eleição
Você não deve alterar o nome. Isso faria com que todos os elementos selecionados de repente a um c
quire o mesmo nome. Isso tornaria difícil encontrar elementos individuais usando o navegador F orm N , e o
gerenciamento do formulário usando controles nomeados em macros impossíveis.
A seleção múltipla é mais útil para alterar a fonte, a altura ou a cor de fundo dos controles. Observe que
alterar a cor do plano de fundo também afeta os rótulos.
Se você quiser alterar apenas os rótulos, mantenha pressionada a C ontrole chave e clique esses controles
direta ou no N avigator, ou botão direito do mouse em um campo para chamar as propriedades de controle.
Agora, a escolha de propriedades que você pode alterar é maior, pois você está lidando apenas com
campos semelhantes. Você pode alterar qualquer coisa aqui que esteja disponível em um campo de rótulo.
As possibilidades de seleção múltipla dependem, portanto, da escolha de campos. Você pode alterar
simultaneamente controles do mesmo tipo que possuem todas as propriedades existentes para uma única
instância.
O exemplo de um formulário simples para empréstimos de biblioteca é mostrado aqui usando várias
variantes. A maneira rápida para nos enviar um e o Assistente de formulário é descrito no Capítulo 8,
Introdução ao Base, na Introdução ao LibreOffice guia. H ere que descrevem a criação em D esign V iew.
O título do formulário foi criado usando um campo de rótulo. A fonte foi alterada. O campo de rótulo é
ancorado a um parágrafo no canto superior esquerdo do documento. Usando o menu de contexto do
campo de etiqueta, foi criado um formulário vinculado à tabela Empréstimos (consulte “ Propriedades do
formulário ” na página 66 ). A página também recebeu um fundo uniformemente colorido.
D ouble - clique nos campos t o insira -os na forma como um grupo com etiquetas (infelizmente todos no
mesmo local). O grupo precisa ser separado para que o formulário se pareça com a ilustração a seguir.
Para uma melhor visualização, todas as barras de ferramentas desnecessárias foram removidas da janela,
que também foi compactada para que nem todos os elementos da barra de distribuição N sejam visíveis.
Todos os campos foram selecionados, exceto Media_ID_BC , que é projetado para ser usado somente
com um scanner de código de barras.
Figura 32: simples f
orm feita usando um
campo dd
Para cada campo da tabela, um controle de formulário apropriado foi selecionado automaticamente. Os
números estão em campos numéricos e são declarados como números inteiros sem casas decimais. Os
campos de data são representados corretamente como controles de data. Todos os campos receberam a
mesma largura. Se um controle gráfico tivesse sido incluído, seria dado um campo quadrado.
Figura 35: Substituindo o ne k ind de c ontrolo por um utro utilizando o Formulário Navigator
Esta substituição é realizado para os MEDIA_ID e Reader_ID controles.
A consulta SQL para o campo de lista agora pode ser criada por meio da interface gráfica do usuário,
clicando no botão à direita. Isso é executado automaticamente quando uma caixa de listagem é criada
diretamente, mas não quando é formada pela conversão de outro tipo de controle. Para o comando SQL,
consulte C apítulo 5, Consultas.
Como as caixas de listagem devem ser feitas suspensas, os seguintes defeitos podem ser corrigidos ao
mesmo tempo:
•Os rótulos das caixas de listagem devem ser Mídia em vez de Media_ID e Reader em vez de Reader _ ID
.
?O controlo de ID deve ser declarado como só de leitura.
•Quaisquer campos que não sejam absolutamente necessários para a emissão de empréstimos para uma
nova mídia não precisam de uma parada de tabulação. Sem isso, o formulário pode ser percorrido muito
mais rápido. Se necessário, a parada de tabulação também pode ser ajustada usando a seqüência de
ativação (consulte a página 70 ). Somente oscampos Mídia , Leitor e Data do Empréstimo devem estar
acessíveis em todos os casos, usando atecla T ab .
•Se o formulário for destinado à execução de empréstimos, é desnecessário e também confuso para a
mídia devolvida ser exibida. Mídia com data de retorno deve ser filtrada. Além disso, a ordem de exibição
pode ser classificada por R eader, de modo que a mídia emprestada à mesma pessoa seja exibida
sucessivamente. Consulte a observação em “ Propriedades do formulário ” na página 66 . No entanto, há
um problema aqui em que os leitores podem ser classificados somente por ID, não por ordem alfabética,
bec um u s e a tabela subjacente do formulário contém apenas o ID.
Adicionando s ingle f fields
A adição de campos únicos é um pouco mais complicada. Os campos devem ser selecionados,
arrastados para a superfície do formulário e o campo apropriado da tabela subjacente especificada. Além
disso, o tipo de campo deve ser escolhido corretamente; Por exemplo, os campos numéricos têm duas
casas decimais por padrão.
Somente ao criar caixas de listagem o Assistente entram em jogo, tornando mais fácil para um novato para
executar os passos para a criação correta Fields u p a um ponto. Além desse ponto, o assistente deixa de
atender aos requisitos bec um u s e :
•As entradas não são classificadas automaticamente.
• Acombinação de vários campos no conteúdo da caixa de listagem não é possível.
Aqui, novamente, precisamos fazer melhorias retrospectivas, para que o código SQL necessário possa ser
criado rapidamente usando o editor de consultas integrado.
Ao adicionar controles únicos, o campo e seu rótulo devem ser explicitamente associados (consulte “
Configurações padrão para muitos controles ” na página 70 ). Na prática, poderia ser melhor se você fizer n
ó campos de t associados com as etiquetas. Então você não deve escolher Editar Grupo antes chang ing
as propriedades de um campo.
Controle de mesa
O uso do Assistente de Tabelas para criar um controle de tabela já foi descrito na página 87 . No entanto,
existem alguns defeitos que precisam ser melhorados:
•Os MEDIA_ID e Reader_ID campos deve tornar-se caixas de listagem.
• Oscampos numéricos devem ser removidos de suas casas decimais, uma vez que o Assistente sempre
especifica duas casas decimais para números.
Alterar campos dentro do controle de tabela não é possível usando o mesmo método descrito para outros
controles. No N avigator, a descrição dos campos termina com o controle de tabela. O navegador N não
sabe nada sobre os controles que estão dentro do controle de tabela, referindo-se aos campos na tabela
subjacente. Isso se aplica igualmente mais tarde, quando são feitas tentativas de acessar os campos
usando macros. Eles não podem ser acessados pelo nome.
Os controles dentro do controle de tabela são chamados de colunas. Usando o menu de contexto, agora é
possível substituir um tipo de campo por outro. No entanto, toda a gama de tipos não está disponível. Não
há botões, caixas de opção ou controles gráficos.
As propriedades dos campos estão ocultas no menu de contexto por trás do conceito de colunas. Aqui, por
exemplo, o campo numérico Extensão pode ser alterado para que nenhuma casa decimal seja mostrada.
Além disso, o valor mínimo padrão de –1.000.000,00 dificilmente faz sentido para uma extensão de
empréstimo. O número deve permanecer sempre pequeno e positivo.
Assim que as propriedades de uma coluna forem chamadas, você poderá selecionar outra coluna sem
fechar a caixa de diálogo de propriedades. Desta forma, você pode trabalhar em todos os campos, um
após o outro, sem ter que economizar no meio.
E salvando todo o formulário e, finalmente, o próprio banco de dados.
As propriedades dos campos incorporados em um controle de tabela não são tão abrangentes quanto as
externas. A fonte, por exemplo, pode ser definida apenas para o controle de tabela inteiro. Além disso, você
não tem a opção de ignorar colunas individuais removendo suas paradas de tabulação.
Se isso for feito no modo de design de formulário, ele será permanente. Uma alteração temporária na
ordem pode ser executada durante a entrada de dados usando o mesmo método.
Se apenas determinado campo s deve ser visível durante o uso, você pode usar vários controles diferentes
de mesa na forma, como o T ab é capturado por padrão por cada controle de tabela.
A forma mostrada na Figura 36 é para o empréstimo de mídia. Apenas os campos imediatamente
necessários são mostrados no controle da tabela superior. O inferior mostra todos os campos, de modo
que é aparente qual pessoa e meio o retorno é para.
Figura 36: A f orm com vários
controlos de mesa
Esta figura mostra uma falha estética t h às necessidades de atenção urgente. No controle da tabela
superior, o mesmo meio às vezes ocorre mais de uma vez. Isso acontece porque a tabela também mostra
as mídias que foram retornadas anteriormente. Portanto, os dados precisam ser filtrados para mostrar
apenas os empréstimos. Registros com data de retorno não devem aparecer.
Essa filtragem é possível por uma consulta ou usando diretamente as propriedades do formulário. Se isso
for feito usando as propriedades do formulário, o filtro pode ser temporariamente desligado durante a
entrada. Filtragem utilizando uma consulta é descrito em C apítulo 5, consultas. Aqui nós descrevemos
como fazer isso usando propriedades de formulário.
A filtragem é realizada usando o botão com os três pontos, que abre a caixa de diálogo mostrada abaixo.
Você também pode inserir o filtro diretamente no campo de texto Filtro , se souber a codificação SQL.
Usando a GUI , você pode agora selecionar o campo chamado Return_Date . Ele mostrará apenas os
registros para os quais o campo está vazio, onde “empty” significa a designação SQL NULL.
A forma limpa (mostrada na Figura37 ) agora parece bastante mais simples.
É claro que ainda há espaço para melhorias, mas em comparação com a forma anterior, a versão tem
uma vantagem nítida em que todas as mídias são visíveis de relance.
O processamento de dados usando controles de tabela é semelhante ao uso de uma tabela real. Um direito
- clique no cabeçalho de registro de um registro existente faz com que seja excluído, e uma entrada pode
ser cancelada ou salvo no caso de novos registros.
Quando você deixa uma linha, o registro é salvo automaticamente.
Estruturas de tabelas típicas que podem ser usadas como subformulários são tabelas com um
relacionamento um-para-muitos (consulte o Capítulo 3, Tabelas). O formulário principal mostra uma tabela
com registros para os quais muitos registros dependentes no subformulário podem ser vinculados e
exibidos.
Primeiro, vamos utilizar a relação da tabela Leitor t oa mesa de empréstimo (ver Capítulo 3, Tabelas). A
tabela Leitor formará a base para o formulário principal e a tabela Empréstimo será reproduzida no sub-
formulário.
Aqui, o formulário principal está vinculado à tabela do Reader . Para acelerar a pesquisa de leitores, a tabela
é organizada em ordem alfabética. Faremos sem uma barra de navegação, pois o conteúdo do
subformulário ficará entre o formulário principal e a barra de navegação. Em vez disso, usaremos o
controle de formulário integrado ( Figura 29 ).
R ight clique sobre o formulário principal na F orm N avigator t o usar o menu de contexto para criar um
novo formulário. Mais uma vez este formulário tem o nome padrão do formulário, mas agora é um elemento
na subpasta do formulário principal.
As propriedades do subformulário agora devem ser configuradas para fornecer a fonte de dados correta, a
fim de reproduzir os dados para o leitor correto.
A tabela Empréstimos é escolhida para o subformulário. Para o filtro, especificamos que o campo Data de
retorno deve estar vazio (" Return_Date" IS NULL ). Isso impede que qualquer mídia que já tenha
sido retornada apareça. Os registros devem ser classificados por data de empréstimo. A classificação
crescente mostra o meio emprestado pelo período mais longo no topo.
Os campos mestre de link e escravo de link são usados para criar uma vinculação ao formulário principal,
no qual o subformulário se encontra. O botão com três pontos mostra mais uma vez que uma caixa de
diálogo útil está disponível para criá-los.
O link escolhido entre a tabela para o subformulário e a tabela para o formulário principal agora é
especificado em termos de campos das tabelas.
Para criar um controle de tabela para o formulário principal, agora temos de seleccionar o formulário
principal na F orm N avigator. Em seguida, se o Assistente para controle de tabela estiver ativado, ele
mostrará os campos disponíveis no formulário principal. Nós lidamos com o subformulário de maneira
semelhante.
Uma vez que os controles da tabela tenham sido configurados, precisamos realizar as modificações já
discutidas ao criar a forma mais simples:
•Substituindo o campo numérico Media_ID no subformulário por uma caixa de listagem.
•Renomeando o campo Media_ID Media .
•Modificando os campos numéricos para um formato sem casas decimais.
•Limitar os valores mínimo e máximo.
•Renomeando outros campos, para economizar espaço ou adicionar caracteres não-ASCII que não devem
ser usados em nomes de campos em tabelas de banco de dados.
As funções de classificação e filtro são complementadas para o formulário principal, adicionando uma barra
de navegação. Os outros campos da barra de navegação não são necessários, pois estão disponíveis
principalmente a partir do controle de tabela (exibição de registro, navegação de registro) ou então pela
movimentação através do controle de tabela (armazenamento de dados).
A forma final pode se parecer com a figura abaixo.
Figura 38: Forma que consiste em uma
forma principal (acima) e um subformulário
(abaixo).
Se um leitor for selecionado no formulário principal, o subformulário mostrará a mídia emprestada a esse
leitor. Quando um item n é retornado, ele continua aparecendo no formulário até que o próprio formulário
seja atualizado. Isso ocorre automaticamente quando outro registro é carregado no formulário principal. Se
o leitor original for selecionado novamente, a mídia retornada não será mais exibida.
Essa atualização atrasada é realmente desejável nesse caso, já que permite inspecionar a mídia que está
no momento no balcão da biblioteca e ver de imediato se elas foram registradas.
Essa estrutura de formulário é significativamente mais fácil de usar do que a anterior com apenas um único
formulário. No entanto, ainda há detalhes que podem ser melhorados:
• Asdatas de mídia e empréstimo podem ser alteradas quando a mídia for emprestada por mais tempo.
Alterar a data da mídia pode tornar impossível rastrear qual item ainda está disponível na biblioteca e
que está em empréstimo. Alterar a data do empréstimo pode levar a erros. Avisos de recall poderia n o t
ser verificada.
•Se um registro de leitor não for selecionado clicando no cabeçalho do registro à esquerda, somente a
pequena seta verde no cabeçalho mostrará qual registro está ativo no momento. É bem possível que o
registro ativo seja rolado para fora da janela de controle da tabela.
•Em vez do texto “ Mídia Emprestada do Leitor escolhido ”, seria melhor ter o nome do leitor.
•É possível emprestar o mesmo meio duas vezes sem que tenha sido devolvido.
•I t é possível excluir o registro para um item de n por empréstimo com bastante facilidade.
• Osdados podem ser alterados ou excluídos no formulário principal. Isso pode ser útil para pequenas
bibliotecas com pouco tráfego público. No entanto, quando as coisas ficam agitadas no balcão de
empréstimos, a edição dos dados do usuário não deve ocorrer ao mesmo tempo que a emissão de
empréstimos. Seria melhor se novos usuários pudessem ser registrados, mas os dados de usuário
existentes não fossem alterados. Para bibliotecas, isso se aplica igualmente a exclusões ou alterações
completas de nomes.
Primeiro, vamos melhorar a seleção de leitores. Isso deve nos proteger das mudanças nos registros de
empréstimos. Uma solução simples seria não permitir qualquer modificação, exceto a entrada de novos
registros. Isso ainda requer uma função de busca quando um leitor deseja emprestar um item n . Seria
melhor usar uma caixa de listagem para localizar o leitor e executar o problema e retornar as operações em
controles de tabela separados.
Para o formulário principal, precisamos de uma tabela na qual a caixa de listagem possa escrever um valor
vinculado a essa tabela. A tabela requer um campo inteiro e uma chave primária. Ele sempre conterá
apenas um registro, portanto, o ID do campo de chave primária pode ser declarado com segurança como
Tiny Integer. A tabela a seguir denominada Filtro deve, portanto, ser criada.
Nome da tabela: filtro
Nome do campo Tipo de campo
identidade Número inteiro pequeno,
chave primária
Inteiro Inteiro
A tabela recebe uma chave primária com o valor 0. Esse registro será repetidamente lido e reescrito pelo
formulário principal.
O formulário principal é baseado na tabela Filtro . Ele apenas lerá o valor da tabela que está associada à
chave primária ( ID ) de 0. Nenhum dado será adicionado; o registro atual será reescrito repetidamente.
Como somente edições de um único registro são permitidas, uma barra de navegação seria supérflua.
Este formulário principal está ligado ao subformulário de tal forma que o valor do campo Integer na tabela
Filter é o mesmo que o valor do campo Reader_ID na tabela Loan Table. As propriedades do subformulário
são inalteradas da versão mostrada acima.
Antes de criarmos uma caixa de listagem no formulário principal, devemos desativar os assistentes. O
Assistente de lista só permite criar uma caixa que mostra o conteúdo de um único campo; que seria
impossível ter o sobrenome um nome dado nd e um número adicional na área de exibição de uma caixa de
lista. Como na forma mais simples, entramos agora no conteúdo da caixa de listagem Sobrenome, Nome -
ID Nr . A caixa de listagem transmite o ID para a tabela subjacente.
Ao lado da caixa de listagem, um botão é criado. Este botão é na verdade parte do subformulário. Ele
assume duas funções: salvar o registro no formulário principal e atualizar a tabela no subformulário. É bom
o suficiente para confiar a atualização para o botão no subformulário. O processo de salvamento do
formulário principal modificado é então executado automaticamente.
O botão pode simplesmente ser rotulado como OK . A ação atribuída a ele nas propriedades gerais do
botão é Atualizar Formulário .
Figura 39:
Formulário principal
como filtro para um
subformulário
O formulário principal consiste apenas no título e na caixa de listagem; o subformulário contém outro título,
o controle de tabela da versão anterior e o botão.
O formulário agora funciona melhor nisso:
•Nenhum leitor pode agora ser editado, alterado ou excluído, e
• Osleitores podem ser encontrados mais rapidamente digitando no controle do que usando um filtro.
Para um maior grau de funcionalidade (retornos sem alteração de dados anteriores), um segundo
subformulário deve ser criado, vinculado à mesma tabela Empréstimos. Para assegurar a funcionalidade
da caixa de lista na Fig ure 39 , ambas as subformas deve ser colocado um nível mais baixo, como
subformas de um subformulário. Os dados são atualizados hierarquicamente desde o formulário principal
até os subformulários. O botão no formulário descrito anteriormente deve agora ser colocado no primeiro
subformulário e não nos dois subformulários que vêm sob ele.
Aqui o F orm N avigator é utilizado para mostrar os diferentes níveis. No formulário principal, temos o
campo de texto para o título do formulário e a caixa de listagem para encontrar o leitor. A caixa de listagem
aparece na parte inferior do formulário, como é declarado após o subformulário. Infelizmente esta
sequência de exibição não pode ser alterada. O subformulário tem apenas um botão, para atualizar seu
conteúdo e ao mesmo tempo salvar o formulário principal. Um nível abaixo são os dois subformulários
adicionais. Estes recebem nomes diferentes quando criados, para que não haja confusão em qualquer nível
da árvore.
O formulário principal e o subformulário usam a mesma tabela. No subformulário, nenhum dado é inserido.
É por este motivo que todos os campos deste formulário estão definidos como Não. O formulário principal e
o subformulário estão ligados através do campo, cujo valor deve ser transmitido para os sub-
subformulários: o campo Integer na tabela Filter .
No primeiro sub-subformulário, nenhum dado existente é exibido; é usado apenas para criar novos dados.
Para isso, o filtro sugerido é adequado. Apenas registros correspondentes ao Reader_ID e com um campo
de data de empréstimo vazio (" Loan_Date" IS NULL ) serão exibidos. Na prática, isso significa um controle
de tabela vazio. Como o controle de tabela não é atualizado continuamente, a mídia recém-emprestada
permanecerá dentro dela até que o botão de atualização OK seja usado para selecionar um novo nome ou
para transferir os dados para o segundo sub-subformulário.
O segundo subformulário requer mais configurações. Este formulário também contém dados da tabela
"Empréstimos" . Aqui os dados são filtrados para uma data de retorno vazia. (" Return_Date" IS NULL ). Os
dados são classificados como no formulário anterior, para que a mídia emprestada por mais tempo seja
imediatamente visível.
Os seguintes pontos também são importantes. Registros antigos podem ser alterados, mas nenhum novo
registro pode ser adicionado. A exclusão também é impossível. Este é o primeiro passo necessário para
evitar que os registros de empréstimos sejam simplesmente excluídos mais tarde. Mas ainda seria
possível mudar o meio e a data do empréstimo. Portanto, as propriedades das colunas exigirão ajuste.
Eventualmente, o meio e a data do empréstimo devem ser exibidos, mas protegidos da modificação.
O controle de tabela é simplesmente duplicado após a criação do formulário. Isso é feito selecionando-o,
copiando, desmarcando e colando-o da área de transferência. A cópia estará na mesma posição do original
e, portanto, precisará ser arrastada. Depois disso, os dois controles de tabela podem ser editados
separadamente. O controle de tabela para o retorno de mídia pode ser praticamente o mesmo. Somente o
acesso de gravação para as colunas de data Media e L oan precisa ser alterado.
Enquanto para a data Lo , é necessário apenas escolher Read only , isto não é suficiente para list box.
Essa configuração não impede que a caixa de listagem seja usada para fazer alterações. No entanto, se
Ativado estiver definido como Não , não será possível fazer uma escolha. Uma caixa de listagem contida
no controle de tabela é exibida como um campo de texto somente leitura.
No controle de tabela acima, todos os campos que não têm nada a ver com o empréstimo são removidos.
Apenas o meio como um campo de seleção e a data do empréstimo, Loan_Date, permanecem.
Se, finalmente, a consulta da caixa de listagem no controle de tabela superior estiver selecionada, apenas
as mídias serão exibidas e poderão, na verdade, ser emprestadas. Mais sobre este é em Capítulo 5, Quer
ies .
O formulário de empréstimo de mídia já é significativamente mais útil. Quando um leitor chega ao balcão de
empréstimo, o nome dele ou dela é pesquisado. A mídia a ser emprestada pode ser selecionada usando a
caixa de listagem e a data do empréstimo inserida. A tecla T ab leva você ao próximo registro.
Uma melhoria final também é desejável: no momento, a data do empréstimo deve ser selecionada a cada
vez. Imagine um dia na biblioteca com talvez 200 transações de empréstimo, talvez apenas uma pessoa,
que deve emprestar cerca de 10 mídias a cada vez. Isso exigiria a mesma entrada para o campo de data e
outra vez. Deve haver uma maneira de simplificar isso.
Nosso formulário principal está vinculado à tabela de filtros . O formulário principal funciona apenas com o
registro que tem como chave primária o " ID" 0 . Mas campos adicionais podem ser construídos na tabela
Filter . No momento não há campo que possa armazenar uma data, mas podemos criar facilmente um
novo campo com o nome do campo Data e o tipo de campo D ate. Na tabela Filter nós agora
armazenamos não apenas o Reader_ID ("Filter". "Integer"), mas também o Loan_Date ("Filter". "Date").
No formulário principal, um campo de data adicional é exibido, junto com um rótulo referente ao seu
conteúdo. O valor do campo de data é armazenado na tabela Filtro e transferido pelas vinculações de
subformulário para sub-subformulário.
A ligação entre as duas formas agora se refere a dois campos. O campo Integer é ligado ao campo
Reader_ID do sub-subformulário. O campo Data está vinculado ao campo Loan_Date . Isso garante que o
Loan_Date seja transferido automaticamente da tabela Filtro para a tabela Empréstimos quando o
empréstimo for feito.
Figura 41: A dó da l oan
é inserida apenas uma
vez. Quando o Reader c
trava, deve ser
reinserido.
O campo de data agora é removido do controle de tabela, de modo que o último contenha apenas um
campo de pesquisa. Este seria o requisito ideal para acelerar ainda mais o trabalho da biblioteca. Pois, de
fato, cada mídia terá um número de acesso impresso, então por que isso tem que ser pesquisado? Você
pode simplesmente digitar o número diretamente. Ou, melhor ainda, poderia ser digitalizado com um leitor
de código de barras. Então, a mídia pode ser emprestada tão rapidamente quanto o mutuário pode guardá-
la em sua bolsa.
Isso é ilustrado no banco de dados de exemplo. O exemplo acima deve ser suficiente para entender o
design do formulário inicial, mas, como o banco de dados de exemplo, Media_without_Macros.odb,
desenvolve o formulário ainda mais, os refinamentos extras são brevemente apresentados abaixo.
O formulário Empréstimo mostra as seguintes propriedades:
• Osleitores são exibidos em um controle de tabela. Aqui você também pode inserir novos leitores.
•Usando um filtro, vinculado à tabela Filter, os nomes podem ser filtrados usando sua letra inicial. Então, se
você digitar A, somente as pessoas cujo sobrenome começa com A serão exibidas. Essa filtragem é
independente de maiúsculas e minúsculas.
•O subtítulo mostra novamente o nome da pessoa a quem o empréstimo deve ser feito. Se um bloqueio foi
colocado neste mutuário, isso também é exibido.
•A data do empréstimo é definida para a data atual. Isso é feito na tabela de filtros usando SQL, de modo
que, quando nenhuma data é inserida, o valor padrão a ser armazenado é a data atual.
•Mídia utilizável é selecionada usando uma caixa de listagem. Quando o botão Atualizar é pressionado, o
empréstimo é transferido para o controle de tabela abaixo.
•O controle de tabela no meio serve apenas para exibir a data real do empréstimo para a mídia. Aqui
também é possível corrigir um erro retrospectivamente excluindo a linha.
•No controle de tabela inferior, como no exemplo acima, a alteração de mídia e datas de empréstimo não é
possível. Também não é possível excluir registros.
•Além da entrada da data de devolução ou, se for o caso, uma extensão do empréstimo, essa tabela
também exibe o número de dias para os quais o meio pode ser emprestado e quantos dias restam do
período de empréstimo atual.
•Se esse tempo restante se tornar negativo, o meio deve ser devolvido imediatamente. O problema é
bloqueado. Torna-se possível novamente apenas quando o meio é devolvido. Após o retorno, o botão
Atualizar só precisa ser pressionado uma vez.
Essa forma, feita usando consultas, é significativamente mais complexa em sua estrutura do que a versão
mostrada anteriormente. Você pode aprender mais sobre o essencial disso no Capítulo 5, Consultas.
Usando caixas de listagem, o formulário principal com base na tabela de mídia pode receber valores das
tabelas Categoria, Cidade ou Editor. S ubforms são o uso d para ligar o rel_Media_Author e mesas de
legenda com o formulário principal e através dele com o quadro de mídia.
O subformulário para o r mesa el_Media_Author novamente consiste de duas caixas de listagem para que
as chaves estrangeiras de seus autores e Author_Add_ID (adições pode ser, por exemplo editor, fotógrafo,
e assim por diante ) não tem que ser inseridos diretamente como números.
Para o formulário de entrada de mídia, as caixas de listagem geralmente precisam ser preenchidas
gradualmente durante o processo de entrada. Para este propósito, outros formulários são construídos ao
lado do formulário principal. Eles existem independentemente da forma principal.
No lado esquerdo é o formulário principal, com vista à busca e entrada de novas mídias. No lado direito do
formulário há uma caixa de grupo com o rótulo Edit list content contents , fornecendo uma área separada
destinada a preencher as caixas de listagem no formulário principal. Se o banco de dados não existir por
muito tempo, muitas vezes será necessário fazer entradas nesses campos. No entanto, as mais entradas
que estão disponíveis para as caixas de lista do formulário principal, menos frequentemente o acesso aos
comandos da tabela na caixa de grupo ser necessário.
Os controles de tabela a seguir são todos subordinados como formulários secundários individuais ao
formulário principal, o formulário de entrada.
Aqui, em cada caso, os dados completos de uma tabela são inseridos. Nos estágios iniciais, muitas vezes
é necessário recorrer a essas formas colaterais, uma vez que muitos autores ainda não estão
armazenados na tabela correspondente.
Quando um novo registro é armazenado em um dos controles de tabela, é necessário encontrar a caixa de
listagem correspondente no formulário principal e usar o controle Update (consulte N avigation bar) para ler
os novos valores.
O F orm N avigator mostra uma correspondentemente grande lista de formas.
Os f ORMs foram nomeados individualmente para facilitar o seu reconhecimento. Apenas o formulário
principal ainda tem o nome do MainForm dado a ele pelo Assistente. Ao todo, existem oito formas
paralelas. O formulário Filter hospeda uma função de pesquisa enquanto o formulário MainForm é a
interface de entrada principal. Todas as outras formas estão relacionadas a um ou outro dos controles de
tabela mostrados acima.
Sem os controles de tabela, o formulário principal parece um pouco mais simples.
O campo para o termo de pesquisa está no formulário Filtro , os dois controles de tabela (para o autor e o
subtítulo) estão no subformulário do formulário principal Entrada de Mídia.
No F orm N avigator, este formulário parece muito mais complexo, pois todos os controles e rótulos
aparecem lá. Na forma anterior, a maioria dos campos eram realmente colunas dentro dos controlos de
mesa e eram, portanto, invisível para o F orm N avigator.
Infelizmente, a sequência dentro do F orm N avigator não pode ser facilmente alterado. Assim, por
exemplo, parece mais sensato colocar os subformulários Subtítulo e Autor como ramificações do
MainForm logo no início. Mas no âmbito da F orm N avigator, controlos e subformas individuais são
simplesmente mostrada na ordem na qual eles foram criados.
O Assistente de Formulário fornece os controles com abreviações específicas que aparecem ao lado dos
ícones e indicam que tipo de controle é esse. Os rótulos começam com 'lbl', campos de texto com 'txt' e
assim por diante. Rótulos completos fornecem apenas informações secundárias para entrada de dados.
Eles também podem ser colocados diretamente acima quadros de texto e, em seguida, não aparecem na F
orm N avigator.
A sequência dos elementos no navegador não tem nada a ver com a sequência de guias. Isso é
determinado pela ordem de ativação .
A seqüência de ativação permite que todos os elementos que transmitem dados para a tabela subjacente
do formulário ou possam realizar ações, sejam colocados em ordem. Isso corresponde à configuração da
seqüência de ativação nas propriedades de controle listadas na página 70 .
Observe que na sequência de ativação, alguns controles aparecem para os quais a parada de tabulação
está realmente desativada. Eles estão incluídos na lista, mas na verdade não são acessados pelo teclado
ao trabalhar com o formulário.
Os campos podem ser classificados automaticamente na ordem em que aparecem no plano de fundo do
formulário. Quanto mais alto estiver um campo, mais cedo ele vem na sequência quando você usa a
Classificação automática. Para campos na mesma altura, o campo mais à esquerda é o primeiro. Essa
classificação funciona sem erros somente quando os elementos foram posicionados exatamente usando a
grade quando o formulário foi criado. Caso contrário, você precisará ajustá-los. Basta selecionar um
controle e usar Mover para cima ou Mover para baixo para movê- lo para cima ou para baixo na sequência.
Se houver um subformulário, o Automatic Sort salta diretamente para o subformulário depois de concluir o
formulário principal. No caso de um controle de tabela, isso faz com que o cursor durante a entrada do
teclado fique preso dentro deste subformulário; você só pode liberá-lo usando o mouse ou pressionando
Ctrl + Tab .
A classificação automática funciona apenas uma vez para um controle de tabela. Um subformulário
subseqüente com um controle de tabela não será incluído. Formas paralelas também não são levadas em
consideração. Uma classificação automática não pode ser feita retrospectivamente para um subformulário
com um controle de tabela. O subformulário deve ser completamente removido (temporariamente movido
para outra forma).
O substrato de dados para o formulário de entrada de mídia é, nesse caso, não uma tabela, mas uma
consulta. Isso é necessário, pois o formulário deve ser usado não apenas para inserir registros, mas
também para pesquisar. O formulário também contém um campo de texto que mostra, após salvar, se o
número ISBN inserido estava correto. Isso também só é possível usando uma consulta abrangente. Para
entender o contexto disso, é necessário discutir os fundamentos das consultas, abordadas no Capítulo 5.
Capítulo 5 Consultas
Inserindo consultas
As consultas podem ser inseridas na GUI e diretamente como código SQL. Em ambos os casos, uma
janela é aberta, onde você pode criar uma consulta e também corrigi-la, se necessário.
Nas tabelas disponíveis, selecione a tabela Empréstimo. Essa janela permite que várias tabelas (e também
visualizações e consultas) sejam combinadas. Para selecionar uma tabela, clique em seu nome e, em
seguida, clique no botão Adicionar . Ou clique duas vezes no nome da tabela. Qualquer método add s da
mesa para a área gráfica do Q uery de diálogo projeto .
Quando todas as tabelas necessárias foram selecionados, clique no C perder botão . Tabelas e consultas
adicionais podem ser adicionadas posteriormente, se necessário. No entanto, nenhuma consulta pode ser
criada sem pelo menos uma tabela, portanto, uma seleção deve ser feita no início.
Figura 42: As áreas do Q uery D esign diálogo
Figura 42 s comos as divisões básicas do diálogo Design de consulta : a área gráfica exibe as tabelas que
estão a ser vinculado à consulta. Suas relações entre si em relação à consulta também podem ser
mostradas. A área da tabela é para a seleção de campos para exibição ou para definir condições
relacionadas a esses campos.
C lamber no campo na primeira coluna na área da tabela para revelar uma seta para baixo. Clique nesta
seta para abrir a lista suspensa de disponível campo s . O formato é Table_name.Field_name - é
por isso que todos os nomes de campo aqui começam com a palavra Empréstimo .
Uma regra básica é que nenhuma nova entrada é possível se a chave primária
Gorjeta na tabela consultada não estiver incluída na consulta.
Os Loan_Date e RETURN_DATE campos são dadas aliases. Isso não faz com que eles sejam
renomeados, mas apenas para aparecer sob esses nomes para o usuário da consulta.
A exibição de tabela acima mostra como os aliases substituem os nomes de campo reais.
O campo Return_Date recebe não apenas um alias, mas também um critério de pesquisa, o que fará com
que apenas os registros sejam exibidos para os quais o campo Return_Date está vazio. (Insira IS EMPTY
na linha Criterion do campo Return_Date.) Esse critério de exclusão fará com que apenas os registros
sejam exibidos relacionados a mídias que ainda não foram retornadas do empréstimo.
Para aprender melhor a linguagem SQL, vale a pena alternar de tempos em tempos entre o Modo Design e
o Modo SQL .
Aqui a fórmula SQL criada por nossas escolhas anteriores é revelada. Para facilitar a leitura, algumas
quebras de linha foram incluídas. Infelizmente, o editor não armazena essas quebras de linha, portanto,
quando a consulta for acessada novamente, ela aparecerá como uma quebra de linha contínua única na
borda da janela.
SELECT inicia os critérios de seleção. AS especifica os aliases de campo a serem usados. FROM mostra
a tabela que deve ser usada como a origem da consulta. WHERE fornece as condições para a consulta, ou
seja, o campo Return_date deve estar vazio ( IS NULL ). ORDER BY define os critérios de classificação,
ou seja, ordem crescente (ASC - ascendente) para os dois campos Reader_ID e Data do Empréstimo.
Esta especificação de classificação ilustra como o alias do campo Loan_Date pode ser usado dentro da
própria consulta.
Ao trabalhar no Modo Design View, use IS EMPTY para exigir que um campo
fique vazio. Ao trabalhar no modo SQL, use IS NULL, que é o que o SQL
Gorjeta (Structured Query Language) requer.
Quando você quiser classificar por ordem decrescente usando SQL , use
DESC em vez de ASC .
Até agora, os campos Media_ID e Reader_ID são visíveis apenas como campos numéricos. Os nomes
dos leitores não são claros. Para mostrá-los em uma consulta, a tabela do Reader deve ser incluída. Para
este propósito, retornamos ao modo Design. Em seguida, uma nova tabela pode ser adicionada à
visualização Design.
Aqui, outras tabelas ou consultas podem ser posteriormente adicionadas e tornadas visíveis na interface
gráfica do usuário. Se os links entre as tabelas foram declarados no momento de sua criação (consulte o
Capítulo 3, Tabelas), essas tabelas serão mostradas com os links diretos correspondentes.
Se um link estiver ausente, ele pode ser criado neste momento arrastando o mouse de " Empréstimo".
"Reader_ID" para " Reader". "ID" .
Agora os campos da tabela do Reader podem ser inseridos na área tabular. Os campos são inicialmente
adicionados ao final da consulta.
A posição dos campos pode ser corrigida na área tabular do editor usando o mouse. Por exemplo, o campo
First_name foi arrastado para a posição diretamente antes do campo Loan_date.
Agora os nomes são visíveis. O Reader_ID se tornou supérfluo. Também classificar por sobrenome e
nome_do_nome faz mais sentido que classificação por Reader_ID.
Esta consulta não é mais adequada para uso como uma consulta que permite novas entradas na tabela
resultante, uma vez que não possui a chave primária para a tabela do Reader adicionada. Somente se essa
chave primária estiver incorporada, a consulta se tornará editável novamente. Na verdade, ele se torna
completamente editável para que os nomes dos leitores também possam ser alterados. Por esse motivo,
tornar os resultados da consulta editáveis é um recurso que deve ser usado com extrema cautela, se
necessário, sob o controle de um formulário.
Ter uma consulta que você pode editar pode criar problemas. Edição de dados
na consulta também edita os dados na tabela subjacente e os registros
Cuidado contidos na tabela. Os dados podem não ter o mesmo significado. Por
exemplo, altere o nome do leitor e também alterou os livros que o leitor
emprestou e devolveu.
Se você tiver que editar dados, faça isso em um formulário para poder ver os
efeitos da edição de dados.
Mesmo quando uma consulta pode ser editada, ela não é tão fácil de usar como um formulário com caixas
de listagem, que mostram os nomes dos leitores, mas contêm o Reader_ID da tabela. Caixas de listagem
não podem ser adicionadas a uma consulta; eles só são utilizáveis em formas.
Se voltarmos agora para o SQL View, vemos que todos os campos agora são mostrados entre aspas
duplas: "Table _name". "Field_name" . Isso é necessário para que o banco de dados saiba de
qual tabela os campos selecionados anteriormente vêm. Afinal, campos em tabelas diferentes podem
facilmente ter os mesmos nomes de campos. Na estrutura da tabela acima é particularmente verdadeiro
para o ID de f iel d.
Nota A consulta a seguir funciona sem colocar nomes de tabelas na frente dos
nomes de campos:
SELECIONE "ID", "Número", "Preço" DE "Estoque",
"Despacho" ONDE "Despacho". "StockID" = "Stock". "ID"
Aqui o ID é retirado da tabela que vem primeiro na definição FROM. A definição
da tabela na WHERE Formula também é supérflua, porque o stockID só ocorre
uma vez (na tabela Dispatch) e o ID foi claramente retirado da tabela Stock (da
posição da tabela na consulta).
Se um campo na consulta tiver um alias, ele poderá ser consultado - por exemplo, na classificação - por
esse alias sem que um nome de tabela seja fornecido. A classificação é realizada na interface gráfica do
usuário de acordo com a sequência de campos na visualização tabular. Se, em vez disso, você quiser
classificar primeiro por "Data do Empréstimo" e depois por " Empréstimo". "Reader_ID" , isso pode ser feito
se:
•A sequência de campos na área da tabela da interface gráfica do usuário é alterada (arraste e solte " Data
do empréstimo " à esquerda de " Empréstimo". "Reader_ID" ou
•A n campo adicional é adicionado, definido para ser invisível, apenas para ordenar (no entanto, o editor irá
registrar isso só temporariamente se nenhum alias foi definido por ele) [adicionar outro " data Loan " campo
pouco antes do " Empréstimo " . " Reader_ID " ou adicione outro " Empréstimo " . Campo " Reader_ID "
logo após " Data do empréstimo " ] , ou
•O texto para o comando ORDER BY no editor de SQL é alterado correspondentemente (ORDER BY "
Loan date " , " Loan " . "Reader_ID" ).
Especificar a ordem de classificação pode não estar completamente livre de erros , dependendo da versão
do LibreOffice . A partir da versão 3.5.3, a triagem da visão SQL está registrado corretamente e exibidos na
interface gráfica do usuário, incluindo os campos que são usados na consulta, mas são não visível na
saída da consulta. (Esses campos não têm uma verificação na linha visível ) .
Uma consulta pode exigir um campo que não faz parte da saída da consulta.
Gorjeta No gráfico da próxima seção , Return_Date é um exemplo. Esta consulta está
procurando por registros que não contêm uma data de retorno. Esse campo
fornece um critério para a consulta, mas nenhum dado visível útil.
Para o ID da tabela Empréstimo , a função Contagem é selecionada. Em princípio, não faz diferença qual
campo de uma tabela é escolhido para isso. A única condição é: O campo não deve estar vazio em
nenhum dos registros . Por esse motivo, o campo da chave primária, que nunca está vazio, é a opção mais
adequada. Todos os campos com um conteúdo diferente de NULL são contados.
Para o R eader_ID , que dá acesso às informações do leitor, a função Agrupar é escolhida. Dessa maneira,
os registros com o mesmo Reader_ID são agrupados. O resultado mostra o número de registros para cada
Reader_ID .
Como critério de pesquisa, o Return_ D comeu está definido para “ESTÁ VAZIO ”, como no exemplo
anterior. (Abaixo, o SQL para isso é WHERE "Return_Date" IS NULL .)
O resultado da consulta mostra que o Reader_ID ' 0' tem um total de 3 mídias emprestadas. Se o conde
função tinha sido atribuído ao Return_ D comeu em vez do ID, cada Reader_ID teria '0' media por
empréstimo, já que RETURN_DATE é pré-definido como NULL.
A fórmula correspondente no código SQL é mostrada acima.
Ao todo, a interface gráfica do usuário fornece as seguintes funções, que correspondem às funções no
HSQLDB subjacente.
Para obter uma explicação das funções, consulte “ Aprimoramento de consulta usando o modo SQL ” na
página 134 .
Se um campo em uma consulta estiver associado a uma função, todos os demais campos mencionados
na consulta também deverão estar associados a funções, se forem exibidos. Se isso não for garantido,
você receberá a seguinte mensagem de erro:
Uma tradução um pouco livre seria: A expressão a seguir não contém função agregada ou agrupamento.
Para corrigir o erro, remova a marca de verificação na linha Visível do campo Return_Date. Sua condição
de pesquisa (Critério) é aplicada quando a consulta é executada, mas não é visível na saída da consulta.
Usando a GUI, cálculos básicos e funções adicionais podem ser usados.
Suponha que uma biblioteca não emita avisos de recall quando um item é devido para devolução, mas
emite avisos atrasados nos casos em que o período de empréstimo expirou e o item não foi retornado.
Esta é uma prática comum em bibliotecas escolares e públicas que emitem empréstimos apenas por
períodos curtos e fixos. Neste caso, a emissão de um aviso atrasado significa automaticamente que uma
multa deve ser paga. Como calculamos essas multas?
Na consulta mostrada acima, as tabelas Empréstimo e Recuperação são consultadas em conjunto. A partir
da contagem das entradas de dados na tabela Recalls, o número total de avisos de rechamada é
determinado. A multa para mídia vencida é definida na consulta como 2,00 €. Em vez de um nome de
campo, a designação de campo é dada como Count (Recalls.Date) * 2 . A interface gráfica do
usuário adiciona as aspas e converte o termo “ count ” no comando SQL apropriado.
Apenas para pessoas que usam uma vírgula para seu separador decimal:
Se desejar inserir números com casas decimais usando a interface gráfica
Cuidado com o usuário, você deve garantir que um ponto decimal em vez de uma
vírgula seja usado para separar as casas decimais na instrução SQL final.
Vírgulas são usadas como separadores de campo, portanto , novos campos
de consulta são criados para a parte decimal.
Uma entrada n com uma vírgula na visualização SQL sempre leva a um outro
campo contendo o valor numérico da parte decimal.
A consulta agora gera para cada meio ainda em empréstimo as multas que foram provisionadas, com base
nos avisos de recall emitidos e no campo de multiplicação adicional. A estrutura de consulta a seguir
também será útil para calcular as multas devidas por usuários individuais.
O " Empréstimo", "ID" e " Empréstimo". Os campos "Media_ID" foram removidos. Eles foram usados na
consulta anterior para criar agrupando um registro separado para cada mídia. Agora vamos agrupar apenas
pelo leitor. O resultado da consulta é assim:
Em vez de listar a mídia para Reader_ID = 0 separadamente, todos os campos " Recalls". "Date" foram
contados e o total de 8.00 € entrou como a multa devida.
As condições de junção devem ser abertas para edição para exibir todos os registros desejados. Referimo-
nos aqui para não se unir entre tabelas no design de relacionamento, mas para unir as consultas .
Por padrão, os relacionamentos são definidos como Intern Internins . A janela fornece informações sobre o
modo como esse tipo de junção funciona na prática.
As duas tabelas previamente selecionadas são listadas como Tabelas I envolvidas. Eles não são
selecionáveis aqui. Os campos relevantes das duas tabelas são lidos a partir das definições da tabela. Se
não houver relacionamento especificado na definição da tabela, será possível criar um neste ponto para a
consulta. No entanto, se você planejou seu banco de dados de maneira ordenada usando o HSQLDB, não
será necessário alterar esses campos.
A configuração mais importante é a opção Join . Aqui os relacionamentos podem ser escolhidos de tal
forma que todos os registros da tabela de legendas são selecionados, mas apenas os registros da mídia
que possuem uma legenda inserida na tabela de legendas.
Ou você pode escolher o oposto: que, em qualquer caso, todos os registros da tabela Mídia são exibidos,
independentemente de terem uma legenda.
A opção Natural especifica que os campos vinculados nas tabelas são tratados como iguais. Você também
pode evitar ter que usar essa configuração definindo seus relacionamentos corretamente no início do
planejamento do seu banco de dados.
Para o tipo Right join , a descrição mostra que todos os registros da tabela Media serão exibidos (Subtitle
RIGHT JOIN Media) . Como não há um subtítulo que não tenha um título na mídia, mas certamente há
títulos na mídia que não possuem um subtítulo, essa é a escolha certa.
Depois de confirmar a associação correta, os resultados da consulta são como desejávamos. Título e
subtítulo são exibidos juntos em uma consulta. Naturalmente, os títulos aparecem mais de uma vez, como
no relacionamento anterior. No entanto, desde que os hits não sejam contados, essa consulta poderá ser
usada como base para uma função de pesquisa. Ver os fragmentos de código neste capítulo, no Capítulo 9
( macros ), e em C apítulo 8 ( D atabase t pergunta ) .
Gorjeta O tipo de campo booleano é Sim / Não [BOOLEAN]. No entanto, esse campo
contém apenas 0 ou 1. Nas condições de pesquisa de consulta, use TRUE , 1
, FALSE ou 0 . Para a condição Yes , você pode usar TRUE ou 1 . Para a
condição No , use FALSE ou 0 . Se você tentar usar um “Sim” ou “Não” em
vez , você recebe uma mensagem de erro. Então você terá que corrigir seu
erro.
Exemplo:
SELECT "Class", EVERY ("Swimmer") FROM "Tabela1" GROUP BY "Classe";
Classe contém os nomes da classe de natação. Nadador é um campo booleano que descreve se um
aluno pode nadar ou não (1 ou 0). Alunos contém os nomes dos alunos. A Tabela 1 contém estes
campos: sua chave primária, Classe, Nadador e Alunos. Apenas classe e nadador são necessários
para essa consulta.
Como a consulta é agrupada pelas entradas do campo Class, EVERY retornará um valor para o
campo, Swimmer, para cada classe. Quando cada pessoa em uma aula de natação pode nadar, CADA
retorna TRUE. Caso contrário, EVERY retornará FALSE porque pelo menos um aluno da turma não
poderá nadar. Como a saída para o campo Nadador é uma caixa de seleção, Uma marca de seleção
indica VERDADEIRO e nenhuma marca de seleção indica FALSO.
VAR_POP | VAR_SAMP | STDDEV_POP | STDDEV_SAMP são funções estatísticas e afetam
apenas campos inteiros e decimais.
Todas estas funções retornam 0, se os valores dentro do grupo forem todos iguais.
As funções estatísticas não permitem que a limitação DISTINCT seja usada. Basicamente, eles
calculam todos os valores cobertos pela consulta, enquanto DISTINCT exclui registros com os
mesmos valores da exibição.
[AS] "display_name": Os campos podem receber uma designação diferente (alias) dentro da
consulta.
"Table_name". * | * [, ...]
Cada campo a ser exibido é fornecido com seus nomes de campos, separados por vírgulas. Se
campos de várias tabelas forem inseridos na consulta, uma combinação do nome do campo com o
nome da tabela será necessária: "Table_name". "Field_name" .
Em vez de uma detalhada lista de todos os campos de uma tabela , i t é o conteúdo total pode ser
exibido. Para isso você usa o símbolo "*". Em seguida, é desnecessário usar o nome da tabela, se os
resultados se aplicarem apenas à tabela. No entanto, se a consulta incluir todos os campos de uma
tabela e pelo menos um campo de uma segunda tabela, use:
"Table_name 1". *, "Table_name 2". "Field_name".
[INTO [CACHED | TEMP | TEXTO] "new_table"]
O resultado desta consulta deve ser escrito diretamente em uma nova tabela que é nomeada aqui. As
propriedades do campo para a nova tabela são definidas a partir das definições de campo contidas na
consulta.
Escrever em uma nova tabela não funciona no Modo SQL, já que isso lida apenas com resultados
exibidos. Em vez disso, você deve usar Ferramentas > SQL . A tabela resultante inicialmente não é
editável, uma vez que carece de um p chave rimary.
FROM <Table_list>
"Table_name 1" [{CROSS | INNER | ESQUERDA EXTERNA | DIREITA EXTERIOR} JOIN
"Table_name 2" ON Expression] [, ...]
As tabelas que devem ser pesquisadas em conjunto geralmente estão em uma lista separada por
vírgulas. O relacionamento das tabelas entre si é então definido adicionalmente pela palavra-chave
WHERE .
Se as tabelas estão ligadas através de um JOIN em vez de uma vírgula, o relacionamento delas é
definido pelo termo que começa com ON, o que ocorre diretamente após a segunda tabela.
Um simples JOIN tem o efeito de que apenas os registros são exibidos para os quais as condições
em ambas as tabelas se aplicam.
Exemplo:
SELECT "Tabela1". "Nome", "Tabela2". "Classe" FROM "Tabela1", "Tabela2" WHERE "Tabela1".
"ClassID" = "Tabela2". "ID"
é equivalente a:
SELECT "Tabela1". "Nome", "Tabela2". "Classe" FROM "Tabela1" JOIN "Tabela2"
ON "Tabela1". "ClassID" = "Tabela2". "ID"
Aqui os nomes e as classes correspondentes são exibidos. Se um nome não tiver uma classe listada
para ele, esse nome não será incluído na exibição. Se uma classe não tiver nomes, ela também não
será exibida. A adição do INNER não altera isso.
SELECT "Table1". "Name", "Table2". "Classe" FROM "Tabela1" LEFT JOIN
"Tabela2" ON "Tabela1". "ClassID" = "Tabela2". "ID"
Se ESQUERDA for adicionada, todos os "Nomes" de "Tabela1" serão exibidos mesmo que não
tenham "Classe". Se, ao contrário, RIGHT for adicionado, todas as Classes serão exibidas, mesmo
que não tenham nomes. A adição de OUTER não precisa ser mostrada aqui. (Right Outer Join é a
mesma coisa que Right Join; Left Outer Join é a mesma coisa que Left Join.)
SELECT "Tabela1". "Jogador1", "Tabela2". "Jogador2" FROM "Tabela1" AS
"Tabela1" CROSS JOIN "Tabela2" AS "Tabela1" WHERE "Tabela1". "Jogador1" <>
"Tabela2". "Jogador2"
Um CROSS JOIN requer que a tabela seja fornecida com um alias, mas a adição do termo ON
nem sempre é necessária. Todos os registros da primeira tabela são pareados com todos os registros
da segunda tabela. Assim, a consulta acima gera todos os pares possíveis de registros da primeira
tabela com os da segunda tabela, exceto para emparelhamentos entre registros para o mesmo jogador.
No caso de um CROSS JOIN , a condição não deve incluir um link entre as tabelas
especificadas no termo ON . Em vez disso, ONDE as condições podem ser inseridas. Se as
condições são formuladas exatamente como no caso de um simples JOIN, você obtém o mesmo
resultado:
SELECT "Tabela1". "Nome", "Tabela2". "Classe" FROM "Tabela1" JOIN "Tabela2"
ON "Tabela1". "ClassID" = "Tabela2". "ID"
dá o mesmo resultado que
SELECT "Tabela1". "Nome", "Tabela2". "Classe" FROM "Tabela1" AS "Tabela1"
CROSS JOIN "Tabela2" AS "Tabela2" WHERE "Tabela1". "ClassID" = "Tabela2".
"ID"
[WHERE Expressão SQL]
A introdução padrão para condições de solicitar uma filtragem mais precisa dos dados. Aqui também os
relacionamentos entre tabelas são geralmente definidos se eles não estiverem vinculados ao JOIN.
[GROUP BY SQL-Expression [,…]]
Use isso quando quiser dividir os dados da consulta em grupos antes de aplicar as funções a cada um
dos grupos separadamente. A divisão é baseada nos valores do campo ou campos contidos no termo
GROUP BY.
Exemplo:
SELECT "Nome", SUM ("Entrada" - "Saída") AS "Saldo" DE "Tabela1" GROUP BY
"Nome";
Registros com o mesmo nome são somados. No resultado da consulta, a soma de Entrada -
Saída é dada para cada pessoa. Este campo deve ser chamado de saldo . Cada linha do
resultado da consulta contém um valor da tabela "Nome" e o saldo calculado para esse valor
específico.
Subqueries
As subconsultas construídas em campos sempre podem retornar apenas um registro. O campo também
pode retornar apenas um valor.
SELECIONAR "ID", "Renda", "Despesas", (SELECIONAR SOMA ("Renda") - SOMA
("Despesas") DE "Verificação de Saída") COMO "Saldo" DE "Verificação";
Esta consulta permite a entrada de dados (chave primária incluída). A subconsulta produz precisamente
um valor, ou seja, o saldo total. Isso permite que o saldo no caixa seja lido após cada entrada. Isso ainda
não é comparável com o formulário de verificação de supermercado descrito em “ Consultas como base
para informações adicionais em formulários ”. Naturalmente, faltam os cálculos individuais de Total *
Unit_price, mas também a presença do número do recibo. Apenas a soma total é dada. Pelo menos, o
número do recibo pode ser incluído usando um parâmetro de consulta:
SELECT "ID", "Renda", "Despesas", (SELECT SUM ( "Lucro") - SUM (
"Despesas") de "Checkout" ONDE "Receipt_ID" =: Receipt_ N umber) como
"equilíbrio" de "Checkout" ONDE "Receipt_ID" =: Receipt_ N úmero;
Em uma consulta com parâmetros, o parâmetro deve ser o mesmo em ambas as instruções de consulta,
se é para ser reconhe z ed como um parâmetro.
Para subformulários, esses parâmetros podem ser incluídos. O subformulário recebe, em vez de um nome
de campo, o nome do parâmetro correspondente. Esse link só pode ser inserido nas propriedades do
subformulário e não quando o Assistente for usado.
Subconsultas Correlacionadas
Usando uma consulta ainda mais refinada, uma consulta editável permite que uma pessoa carregue o
saldo em execução para o caixa de depósito:
SELECT "ID", "Renda", "Despesas", (SELECT SUM ("Renda") - SUM ("Despesas")
DE "Checkout" ONDE "ID" <= "a". "ID") AS "Saldo" FROM "Checkout" COMO "a"
ORDER BY "ID" ASC
A tabela de check-out é a mesma que a tabela "a". "a", no entanto, produz apenas a relação com os valores
atuais neste registro. Dessa forma, o valor atual do ID da consulta externa pode ser avaliado na
subconsulta. Assim, dependendo do ID, o saldo anterior no tempo correspondente é determinado, se você
partir do fato de que o ID, que é um autovalor, é incrementado sozinho.
Se você, em seguida, abrir a consulta para edição na vista de SQL e tentar mudar de lá para o projeto V
iew, você recebe a mensagem de erro:
O Modo Design View não pode encontrar o campo contido na consulta interna " Loan_ID" , que controla o
relacionamento entre as consultas interna e externa.
Quando a consulta é executada no modo SQL , o conteúdo correspondente da subconsulta é reproduzido
sem erros. Portanto, você não não tem que usar o modo SQL direto neste caso.
A consulta externa usou os resultados da consulta interna para produzir os resultados finais. Estes são
uma lista dos valores "Loan_ID" que devem ser bloqueados e por quê. Se você quiser limitar ainda mais os
resultados finais, use as funções de classificação e filtro da interface gráfica do usuário.
Nota A ligação normal das tabelas, depois de todas as tabelas terem sido contadas,
segue a palavra-chave WHERE.
Se houver um LEFT JOIN ou um RIGHT JOIN , a atribuição é
definida diretamente após os dois nomes de tabela usando ON . Portanto, a
seqüência é sempre
Tabela1 LEFT JOIN Table2 ON Table1.Field1 =
Table2.Field1 LEFT JOIN Table3. Table2. Field1 =
Table3.Field1 ...
Dois títulos da tabela Mídia ainda não possuem uma entrada de autor ou uma legenda. Ao mesmo tempo,
um título tem um total de três autores. Se a tabela de autor estiver vinculada sem um LEFT JOIN, as
duas mídias sem um autor não serão exibidas. Mas como um meio tem três autores em vez de um, o
número total de registros exibidos ainda será 15.
Só usando LEFT JOIN irá a consulta ser instruídos a usar a mídia t capaz de determinar quais
registros para mostrar. Agora os registros sem Subtitl e ou Author aparecem novamente, dando um total de
17 registros.
O uso de Joins apropriados geralmente aumenta a quantidade de dados exibidos. Mas esse conjunto de
dados ampliado pode ser facilmente verificado, pois os autores e legendas são exibidos além dos títulos.
No banco de dados de exemplo, todas as tabelas dependentes de mídia podem ser acessadas.
As visualizações são uma solução para muitas consultas, se você quiser obter algum resultado. Se por
exemplo, um Subselect é para ser usado no resultado s de uma consulta, criar uma exibição que lhe dá
esses resultados. Em seguida, use a subseleção na visualização. Exemplos correspondentes são para ser
encontrados em C apítulo 8, Tarefas de banco de dados.
Criar uma vista a partir de uma consulta é bastante fácil e direto.
1)Clique no objeto Table na seção Database.
2)Clique em Criar Vista .
3)Feche o diálogo Adicionar Tabela.
4)Clique no ícone Design View On / OFF. (Este é o modo SQL para uma vista.)
5)Obtendo o SQL para o View:
a)Edite a consulta no SQL View.
b)Use Control + A para realçar o SQL da consulta.
c)Use Control + C para copiar o SQL.
6)No Modo SQL da Vista use Control + V para colar o SQL.
7)Feche, salve e nomeie a exibição.
Capítulo 6
Relatórios
Criando relatórios usando o Report Builder
Os relatórios são usados para apresentar dados de uma forma que os torna facilmente entendidos por
pessoas sem conhecimento do banco de dados. Relatórios podem:
•P ressentem dados em tabelas fáceis de ler
•C gráficos reate para a exibição de dados
•M ake possível usar os dados para impressão de etiquetas
•P cartas de formulário roduce tais como facturas, avisos de recall, ou notificações para as pessoas se
juntam ou abandonam uma associação
Para criar um relatório, é necessário um trabalho preparatório cuidadoso no banco de dados subjacente. Ao
contrário de um formulário, um relatório não pode incluir sub-relatórios e, portanto, incorporar fontes de
dados adicionais. Nenhum relatório pode apresentar elementos de dados diferentes daqueles que estão
disponíveis na fonte de dados subjacente, como um formulário pode fazer usando caixas de listagem.
Os relatórios são preparados melhor usando consultas. Desta forma, todas as variáveis podem ser
determinadas. Em particular, se a classificação dentro do relatório for necessária, sempre use uma
consulta que faça provisão para classificação. Isso significa que as consultas no modo SQL direto devem
ser evitadas sob essas condições. Se você precisar usar uma consulta desse tipo em seu banco de
dados, poderá executar a classificação criando primeiro uma exibição da consulta. Essa visão sempre
pode ser classificada e filtrada usando a interface gráfica do usuário (GUI) da Base.
Ao usar o Report Builder, você deve salvar seu trabalho com frequência
durante a edição. Além de salvar no próprio Report Builder após cada etapa
Cuidado significativa, você também deve salvar o banco de dados inteiro.
Dependendo da versão do LibreOffice que você está usando, o Report Builder
pode falhar durante a edição.
A funcionalidade dos relatórios concluídos não é afetada, mesmo que tenham
sido criados em outra versão, na qual o problema não ocorre.
Dois formatos de saída para relatórios estão disponíveis para seleção: Documento de texto ODF (um
documento do Writer) ou Planilha do ODF (um documento do Calc). Se você quiser apenas uma
visualização tabular dos seus dados, o documento do Calc definitivamente deve ser escolhido para o seu
relatório. É significativamente mais rápido criar e também é mais fácil de formatar posteriormente, pois há
menos opções a serem consideradas e as colunas podem ser facilmente arrastadas para a largura
desejada posteriormente .
Por padrão, o Construtor de Relatórios procura por sua fonte de dados na primeira tabela do banco de
dados. Isso garante que pelo menos um teste das funções seja possível. Uma fonte de dados deve ser
escolhida antes que o relatório possa ser fornecido com campos.
O Report Builder fornece muitos botões adicionais, portanto, a tabela na próxima página mostra os botões
com suas descrições. Os botões para alinhar elementos não são descritos mais detalhadamente neste
capítulo. Eles são úteis para o ajuste rápido de campos em uma única área do Report Builder, mas, em
princípio, tudo pode ser feito pela edição direta das propriedades do campo.
Botões para edição de conteúdo Botões para alinhar elementos
Assim como nos formulários, é útil usar o navegador apropriado. Por exemplo, um clique imprudente no
início do Criador de relatórios pode dificultar a localização das propriedades dos dados do relatório. Esses
dados só podem ser acessados pelo navegador de relatórios. L eft clique sobre Relatório e as propriedades
do relatório são uma vez mais acessível.
Inicialmente, o navegador mostra, além das seções visíveis do documento (cabeçalho da página, grupos,
detalhes e rodapé da página), a possibilidade de incluir funções. Os grupos podem ser usados, por
exemplo, para atribuir todas as mídias que estão sendo chamadas à pessoa que as emprestou, para evitar
vários avisos de recall. As áreas de detalhes mostram os registros pertencentes a um grupo. Funções são
usadas para cálculos como somas.
Para obter resultados úteis no exemplo acima, o conteúdo da visualização deve ser reproduzido com
agrupamento adequado. Cada leitor deve estar vinculado aos avisos de recall de todas as mídias
emprestadas e atrasadas.
Ver > Ordenação e Agrupamento ou o botão correspondente inicia a função de agrupamento.
O rodapé Reader_Name fecha a carta com uma fórmula de saudação e uma área para a assinatura. O
rodapé é tão definido que uma quebra de página adicional ocorrerá após essa área. Além disso, ao
contrário da configuração padrão, é especificado que essa área deve ser mantida em conjunto em todos os
casos. Afinal, seria muito estranho se muitos avisos de recall tivessem a assinatura em uma página
separada.
Manter juntos refere-se aqui à quebra de página. Se você quiser que o conteúdo de um registro seja
mantido em conjunto independentemente da quebra, isso só é possível no momento, se o registro não for
lido como Detalhes, mas for usado como base para um agrupamento. Você pode escolher Manter juntos =
Sim , mas não funciona; a área Detalhes fica separada. Você tem que colocar o conteúdo dos detalhes em
um grupo separado para mantê-lo juntos.
Uma função interna é usada para calcular as multas totais.
Abaixo está o que um aviso de recall real seria semelhante. A área de detalhes contém 5 mídias que o leitor
retirou por empréstimo. O rodapé do grupo contém a multa total devida.
Os relatórios para registros únicos também podem se estender por mais de
uma página. O tamanho do relatório é bem separado do tamanho da página.
No entanto, o alongamento da área de detalhes em mais de uma página pode
levar a quebras falhas. Aqui, o Report Builder ainda tem problemas em calcular
o espaçamento corretamente. Se ambas as áreas de agrupamento e
Nota elementos gráficos forem incluídos, isso pode resultar em tamanhos
imprevisíveis para determinadas áreas.
Até agora, os elementos individuais podem ser movidos para posições fora do
tamanho de uma única página apenas com as teclas do mouse e do cursor. As
propriedades dos elementos sempre fornecem a mesma distância máxima do
canto superior de qualquer área que esteja na primeira página.
Um controle gráfico pode conter gráficos de dentro e de fora do banco de dados. Infelizmente, não é
possível no momento armazenar um gráfico, como um logotipo, permanentemente na Base. Por isso, é
essencial que o gráfico está disponível no caminho de procura, mesmo quando você é apresentado com a
escolha de incorporar, em vez de imagens ligando e o primeiro campo Configurar uma s l de tinta pode ser
definido (literalmente fechado) a uma funcionalidade planejada correspondente. Esta é uma das várias
funções que estão previstas para Base e estão na GUI mas ha ve n o t realmente foi implementado ainda-
para que os botões e caixas de seleção não têm nenhum efeito .
Como alternativa, é claro, um gráfico pode ser armazenado no próprio banco de dados e, assim, fica
disponível internamente. Mas, nesse caso, ele deve estar acessível por meio de um dos campos da
consulta subjacente ao relatório.
Para pegar um gráfico externo, use o botão de seleção ao lado do campo Gráfico para carregá-lo. Para
carregar o campo do banco de dados de agendamento, especifique o campo na guia Dados .
A configuração de alinhamento vertical parece não ter nenhum efeito durante o estágio de projeto. Quando
você chama o relatório, no entanto, o gráfico aparece na posição correta.
Ao dimensionar, você pode selecionar Não , Manter proporção ou Autom. Tamanho . Isso corresponde às
configurações de um formulário:
•Não : a imagem não está ajustada ao controle. Se for muito grande, uma versão recortada será mostrada.
A imagem original não é afetada por isso.
•Manter a proporção : a imagem é ajustada ao controle, mas não distorcida.
•Tamanho automático : a imagem é ajustada ao controle e, em alguns casos, pode ser distorcida.
Incorporando gráficos no relatório
Você pode inserir c cervos i nto um relatório por usando o controle correspondente ou com Inserir >
controles de relatório > Gráfico . Um gráfico é a única maneira de reproduzir dados que não são
encontrados na fonte de dados especificada para o relatório. Um gráfico pode, portanto, ser visto como um
tipo de sub-relatório, mas também como um componente autônomo do relatório.
Você deve desenhar o lugar para o gráfico usando o mouse. Nas propriedades gerais, além dos campos
familiares, você pode choos um e um tipo de gráfico (ver os tipos correspondentes no Calc). Além disso,
você pode definir um número máximo de registros para a visualização, o que dará uma impressão de como
o gráfico finalmente será exibido.
Os gráficos podem ser formatados da mesma maneira que no Calc (clique duas vezes no gráfico). Para
mais informações, consulte a descrição no Guia do LibreOffice Calc .
O gráfico está vinculado na seção Dados com os campos de dados necessários. Aqui, em um exemplo de
lista de Top 10 de mídia , o gráfico mostra a frequência com que determinadas mídias são emprestadas. O
Editor de Consultas é usado para criar um comando SQL adequado, como você faria para uma caixa de
listagem em um formulário. A primeira coluna na consulta será usada para fornecer os rótulos para as
barras verticais no gráfico, enquanto a segunda coluna gerará o número total de transações de empréstimo,
mostrado na altura das barras.
No exemplo acima, o gráfico mostra muito pouco no início, uma vez que apenas empréstimos de teste
limitados foram executados antes do comando SQL ser emitido.
O gráfico na próxima página , do banco de dados de associação de uma sociedade (em alemão:
Mitgliederstatistik), foi preparado a partir de uma consulta que precisa ser inserida no modo SQL direto, pois
a interface gráfica do usuário não a entende. Por esse motivo, Não (Alemão: Nein) foi escolhido para o
comando Analisar SQL , uma opção que exclui qualquer filtragem e classificação com as ferramentas
internas do Report Builder. Portanto, esses campos estão esmaecidos. Nas propriedades de dados do
gráfico, Consulta (Alemão: Abfrage) foi inserida.
Os campos são vinculados da mesma maneira que para um formulário principal com um subformulário. No
relatório em si, as distribuições de idade dos membros masculinos e femininos são listadas em forma de
tabela. Eles estão agrupados por gênero. Cada grupo recebe seu próprio gráfico. Assim que o gráfico
contém apenas dados para o gênero correto, o Gender fi eld (alemão: Geschlecht) no relatório i s ligados ao
Sexo no gráfico .
Figura 50: Campos vinculados para um gráfico, o mesmo que em formulários. Este exemplo é n o t
traduzido, porque o relatório é nt parte do exemplo de base de dados.
Finalmente, a função detalhada definida pelo usuário está disponível. Pode acontecer de o próprio Report
Builder escolher essa variante, se um cálculo tiver sido solicitado, mas, por algum motivo, não puder
interpretar corretamente a fonte de dados.
Entrando f ormulas
O Report Builder é baseado no Pentaho Report Builder. Uma pequena parte de sua documentação é em h
ttp: //wiki.pentaho.com/display/Reporting/9.+Report+Designer+Formula+Expressions .
Uma outra fonte são as Especificações para o Padrão OpenFormula:
http://www.oasis-open.org/committees/download.php/16826/openformula-spec-20060221.html
Princípios básicos:
Ao lado do campo de data há um botão com três pontos sempre que uma fórmula pode ser inserida. Este
botão inicia o Assistente de funções.
No entanto, existem muito menos funções do que no Calc. Muitas funções têm equivalentes do Calc. O
Assistente calcula o resultado da função diretamente.
O Assistente de Funções nem sempre funciona perfeitamente. Por exemplo, as entradas de texto não são
ocupadas por aspas duplas. No entanto, somente entradas com aspas duplas são processadas ao iniciar a
função.
As seguintes funções estão disponíveis:
Função Descrição
Funções de data e hora
ENCONTRO Produz uma data válida a partir de valores numéricos para o
ano, o mês e o dia.
DATEDIF Retorna o total de anos, meses ou dias entre dois valores de
(DAY | MONTH | YEAR) data.
DATEVALUE Converte uma entrada de data americana em formato de texto
(cotado) em um valor de data. A variante americana que é
produzida pode ser reformatada.
DIA Retorna o dia do mês para uma determinada data.
DAY ([campo de data])
DIAS Retorna o número de dias entre duas datas.
HORA Retorna as horas de um determinado horário no formato de 24
horas.
HOUR ([DateTimeField]) calcula as horas no campo.
MINUTO Retorna os minutos de uma data no formato numérico interno
MINUTE ([Timefield]) calcula a parte dos minutos da hora.
MÊS Retorna o mês para uma data inserida como um número.
MÊS ([Campo de data])
AGORA Retorna a data e hora atuais.
SEGUNDO Retorna os segundos de uma data no formato numérico
interno.
SECOND (NOW ()) mostra a parte dos segundos da hora em
que o comando é executado.
TEMPO Mostra a hora atual.
VALOR DO TEMPO Converte uma entrada de texto por um tempo em um valor de
tempo para cálculos.
HOJE Mostra a data atual.
WEEKDAY Retorna o dia da semana como um número. O dia 1 é o
domingo.
ANO Retorna a parte do ano de uma entrada de data.
Funções lógicas
E Rendimentos TRUE quando todos os seus argumentos são
verdadeiros.
FALSO Define o valor lógico como FALSE.
E SE Se uma condição for TRUE, esse valor, senão outro valor.
IFNA (desde LO 3.5)
NÃO Reverte o valor lógico de um argumento.
OU Rendimentos TRUE quando uma de suas condições é TRUE.
VERDADE Define o valor lógico como TRUE.
XOR Rende TRUE quando apenas um dos valores vinculados é
VERDADEIRO.
Funções de arredondamento
INT Arredonda para o inteiro anterior.
Mathemati cal f un c ção s
ABS Retorna o valor absoluto (não negativo) de um número.
ACOS Calcula o arccosine de um número. - argumentos entre -1 e 1.
(desde LO 3.5)
ACOSH Calcula a áreacosina (cosseno hiperbólico inverso) -
argumento> = 1.
(desde LO 3.5)
COMO EM Calcula o arco seno de um argumento numérico entre -1 e 1.
(desde o LO 3.5)
UM BRONZEADO Calcula o arco tangente de um número.
(desde LO 3.5)
ATAN2 Calcula o arco tangente de uma coordenada xe uma
coordenada y.
(desde LO 3.5)
MÉDIA Dá a média dos valores inseridos. (ocorre duas vezes no LO
3.3.4 Formula Wizard)
AVERAGEA Dá a média dos valores inseridos. O texto é tratado como
zero.
(desde LO 3.5)
COS O argumento é o ângulo em radianos cujo cosseno deve ser
calculado.
(desde LO 3.5)
ATÉ Arredonda um número positivo para cima ou um número
negativo para o próximo número inteiro ímpar.
EXP Calcula a função exponencial (Base 'e').
(desde LO 3.5)
LN Calcula o logaritmo natural de um número.
(desde LO 3.5)
LOG10 Calcula o logaritmo de um número (Base '10').
(desde LO 3.5)
MAX Retorna o máximo de uma série de números.
MAXA Retorna o valor máximo em uma linha. Qualquer texto é
definido como zero.
MIN Retorna o menor de uma série de valores.
MINA Retorna o valor mínimo em uma linha. Qualquer texto é
definido como zero.
MOD Retorna o restante para uma divisão quando você insere o
dividendo e o divisor.
ÍMPAR Arredonda um número positivo para cima ou um número
negativo para baixo até o próximo número inteiro ímpar.
PI Dá o valor do número ' π'.
(desde LO 3.5)
PODER Eleva a base ao poder do expoente.
(Desde LO 3.5)
PECADO Calcula o seno de um número.
(desde LO 3.5)
SQRT Calcula a raiz quadrada de um número.
(desde LO 3.5)
SOMA Soma uma lista de valores numéricos
SUMA Soma uma lista de valores numéricos. Texto um nd campos
Sim / Não são permitidos. Infelizmente esta função (ainda)
termina com uma mensagem de erro.
(desde LO 3.5)
VAR Calcula a variação, começando de uma amostra.
(desde LO 3.5)
No R elatório N avigator a função é exibido sob Reader_Name grupo. Clicando com o botão direito do
mouse nessa função, você pode definir funções adicionais por nome.
As propriedades da função SummeGebuehrLeser_Name são mostradas acima. A fórmula adiciona o
campo Charge ao valor já armazenado na própria função. O valor inicial é o valor do campo Charge na
primeira travessia do grupo. Esse valor é armazenado na função sob o nome da função e é reutilizado na
fórmula, até que o loop seja finalizado e o rodapé do grupo seja gravado.
A travessia profunda parece não ter função por enquanto, a menos que os gráficos sejam tratados aqui
como sub-relatórios.
Se Pré-avaliação estiver ativada para a função, o resultado também pode ser colocado no cabeçalho do
grupo . Caso contrário, o cabeçalho do grupo contém apenas o valor correspondente do primeiro campo do
grupo.
As funções definidas pelo usuário também podem referenciar outras funções definidas pelo usuário. Nesse
caso, você deve garantir que as funções usadas já tenham sido criadas. Pré-cálculo em funções que se
referem a outras funções devem ser excluídas.
[SumMarksClass] / ([ClassNumber] +1)
refere-se ao grupo de classes . O conteúdo do campo Marcas é somado e a soma de todos os registros é
retornada. A soma das marcas é dividida pela soma dos registros. Para obter o número correto, 1 deve ser
adicionado conforme mostrado com [ClassNumber] . Isso produzirá as marcas médias.
Condicional p rint
Condicional f ormatting
A formatação condicional pode ser usada, por exemplo, para formatar um calendário, de modo que os finais
de semana sejam exibidos de forma diferente. Escolha Formato > C formatação onditional e digite:
WEEKDAY ([Data]) = 1
e a formatação correspondente para os domingos.
Se você usar 'Expression is' na formatação condicional, poderá inserir uma fórmula. Como é habitual no
Calc, várias condições podem ser formuladas e avaliadas sequencialmente. No exemplo acima, primeiro
domingo é testado, e depois sábado. Finalmente, pode haver uma consulta sobre o conteúdo do campo.
Por exemplo, o conteúdo "Férias" levaria a um formato diferente.
As origens de dados registradas são mostradas no lado esquerdo do navegador da fonte de dados. A fonte
de dados da Bibliografia está incluída no LibreOffice por padrão. As outras fontes de dados são listadas por
seus nomes registrados.
Um clique no sinal de expansão na frente do nome do banco de dados abre o banco de dados e mostra
uma subpasta para consultas e outra para tabelas. Outras subpastas do banco de dados não são
disponibilizadas aqui. Formulários e relatórios internos só podem ser acessados abrindo o próprio banco de
dados.
Somente quando você clica no T ables pasta é o banco de dados realmente ac c Essed. Para bancos de
dados protegidos por uma senha, a senha deve ser inserida neste ponto.
À direita da árvore de nomes, você pode ver a tabela que você selecionou. Pode ser editado como na
Base. No entanto, a entrada direta em tabelas deve ser realizada com cautela em bancos de dados
relacionais muito complexos, pois as tabelas são vinculadas a chaves estrangeiras. Por exemplo, o banco
de dados mostrado abaixo tem tabelas separadas para nomes de ruas, códigos postais e cidades.
Para uma visão adequada dos dados (mas sem a capacidade de editar), as consultas ou visualizações são
mais adequadas.
Dos ícones na barra de ferramentas, muitos estarão familiarizados com a entrada de dados em tabelas. Os
principais novos são os da última seção: Dados para texto, Dados para campos, Mala direta, Fonte de
dados do documento atual, Ativar / desativar o Explorer .
Se você escolher agora Dados para texto, um assistente aparecerá para realizar a formatação necessária.
Figura 53: Dados e ntry como t capaz
Existem várias possibilidades para inserir dados como texto: como uma tabela, como campos únicos ou
como texto comum.
A figura acima mostra a opção Inserir dados como tabela . No caso de campos numéricos e de data, o
formato do banco de dados pode ser alterado para um formato escolhido. Caso contrário, a formatação
será executada automaticamente quando os campos da tabela forem selecionados. A seqüência de
campos é ajustada usando as teclas de seta.
Assim que as colunas da tabela forem selecionadas, o botão Propriedades da tabela será ativado. Isso
permite que você defina as propriedades usuais da tabela para o Writer (largura da tabela, largura da coluna
e assim por diante) .
A caixa de seleção determina se um cabeçalho de tabela é obrigatório. Se não estiver marcado, nenhuma
linha separada será reservada para os títulos.
A linha escolhida para os títulos da tabela pode ser retirada dos nomes das colunas, ou o registro pode ser
escrito com espaço deixado para os títulos a serem editados posteriormente.
O botão Auto F ormat fornece várias visualizações de tabela pré-formatadas. Além do formato padrão
sugerido , todos os formatos podem ser renomeados.
Para adicionar uma formatação automática, uma tabela nesse formato deve ser criada primeiro. Isso é
então selecionado e pode ser adicionado à lista usando o botão Adicionar .
Finalmente, a tabela é criada com as colunas selecionadas.
Figura 57: Duplo - clique em um campo inserido para mostrar as propriedades dos campos de mala direta
É mais simples criar um tal campo selecionando o cabeçalho da coluna da tabela no navegador da fonte de
dados e arrastando-o para o documento com o mouse. Você pode criar uma carta de formulário
diretamente dessa maneira.
Mala direta
Th e mala direta botão lança o M ail M Assistente erge. Como a carta de formulário no exemplo acima
monta seus dados de diferentes tabelas, primeiro é necessário iniciar o banco de dados. No banco de
dados, você cria uma nova consulta para disponibilizar os dados necessários.
O banco de dados é lançado através de um direito - clique no próprio banco de dados ou em uma de suas
tabelas ou consultas, que refresca imediatamente a exibição no navegador da fonte de dados. Depois
disso, o Assistente de mala direta pode ser chamado usando o botão correspondente.
Explorador o / off
Alternando th e Explorador On / Off mostras botão ou oculta a árvore de diretórios à esquerda da exibição
de tabela. Isso permite mais espaço, se necessário, para uma exibição dos dados. Para acessar outra
tabela, você precisará alternar o Explorer novamente.
O documento inicial para a carta de formulário é o documento a que a base de dados campos de re
ligado .
O documento mesclado é o que contém os dados para as várias pessoas que receberão as cartas-
modelo. No documento mesclado, não há ligação com a fonte de dados. É semelhante à saída de Inserir
Dados como Texto .
O Assistente do M ail M erge pode produzir cartas ou e-mails usando registros do banco de dados.
A entrada do bloco de endereço permite a configuração mais extensa. A lista de endereços sugerida vem
da consulta ou tabela atualmente selecionada no banco de dados atualmente selecionado.
O passo 2 determina a aparência geral do bloco de endereços. Esse bloco de endereço pode ser
personalizado usando o botão Mais . Veja a figura a seguir.
A etapa 3 serve para vincular os campos nomeados no bloco de endereço aos campos corretos no banco
de dados. O Assistente inicialmente reconhe z es apenas os campos de banco de dados que têm
exatamente os mesmos nomes do Assistente usa.
Na etapa 4, os endereços são exibidos. Você pode escolher quais endereços obter do banco de dados
usando as teclas de seta. Nos endereços exibidos, dois elementos exigem edição adicional:
•Não há saudação.
•Além do primeiro nome, todos os outros campos são <ainda não alocados> , porque os nomes de campo
no banco de dados são diferentes dos nomes que o Assistente usa inicialmente.
Para corrigir esses erros, o bloco de endereços da Etapa 2 deve ser tornado editável.
Você pode ver no fundo que, quando escolhe editar, você é apresentado a uma lista ampliada de blocos de
endereços. Aqui você pode selecionar o bloco de endereços mais adequado para começar e depois editá-
lo.
O bloco de endereços não pode ser editado diretamente. Em vez disso, a organização dos campos é
executada usando os botões de seta visíveis à direita para mover os campos para dentro ou para fora do
bloco de endereço.
Para a saudação, o campo Saudação é inserido . Todos os outros campos, exceto FirstName, devem ser
inseridos de forma apropriada.
Aqui, os elementos de endereço são associados aos elementos correspondentes da consulta do banco de
dados transferidos com êxito pelo Assistente de mala direta. Novamente, o primeiro registro na consulta é
usado para a visualização.
As configurações do banco de dados são essencialmente finalizadas na Etapa 4. Aqui, é apenas uma
questão de escolher de qual campo o gênero do destinatário deve ser retirado. Este campo já foi nomeado,
de modo que somente o conteúdo do campo para um destinatário feminino ainda precisa ser especificado.
Três saudações diferentes devem ser produzidas. Todos os registros com um 'w' começam com Dear
Ms… , todos aqueles com 'm' com Dear Mr… Se não houver gênero, Dear Sir / Madam está selecionado.
Normalmente, o documento é inicialmente um esboço que pode ser editado no Writer. Isso pode ser feito no
Passo 6.
Até agora todos os documentos foram idênticos, exceto pelo conteúdo diferente dos campos lidos no banco
de dados. Isso pode ser alterado no Passo 7.
Impressão de etiquetas
Arquivos > Novo > Etiquetas inicia o Assistente de impressão de etiquetas. Ele abre um diálogo, que
inclui todas as questões de formatação e conteúdo para rótulos, antes que os rótulos sejam produzidos. As
configurações nesta caixa de diálogo são salvas nas configurações pessoais do usuário.
As configurações básicas do conteúdo estão na guia Labels . Se para o texto Label você marcar a caixa
Endereço, todas as etiquetas terão o mesmo conteúdo, retirado das configurações do LibreOffice para o
usuário do programa.
Como exemplo, usaremos novamente o banco de dados Endereços . Embora o próximo campo de
seleção seja intitulado Tabelas , Tabelas e Consultas estão listadas aqui, assim como no navegador da
fonte de dados.
Os botões de seta são usados para inserir campos de banco de dados individuais no editor. O nome do
campo do banco de dados Sobrenome é definido aqui como <Addresses.MailMergeQuery.1.Surname> . A
sequência é, portanto, <database.Table.1.database field> .
Você pode trabalhar com o teclado no editor. Assim, por exemplo, é possível inserir uma quebra de linha no
início, para que as etiquetas não sejam impressas diretamente na borda superior, mas o conteúdo pode ser
impresso de forma completa e claramente visível.
O formato pode ser selecionado na guia Etiquetas . Aqui, muitas marcas de rótulos são incorporadas para
que a maioria das outras configurações na guia Formato não seja necessária.
Nas versões 3.4.x a 3.5.2, devido a uma alteração nas configurações básicas
no assistente de etiqueta, ocorreram erros de exibição quando as etiquetas
tinham a mesma largura que a largura da página. Sob essas condições, o
Nota
último rótulo simplesmente desliza por uma linha.
Na versão 3.5.3, as configurações da página foram adicionadas na guia
Formato .
A guia Formato permite que você defina o tamanho da etiqueta com precisão. As configurações só são
significativos quando o m ake e typ e das etiquetas não é conhecido. Vale ressaltar que, para imprimir
rótulos de 7,00 cm de largura, você precisa de uma largura de página um pouco maior que 3 * 7,00 cm =
21,00 cm. Somente então três etiquetas serão impressas em uma linha na página.
Na guia Opções, você pode especificar se apenas um único rótulo ou uma página inteira de rótulos serão
produzidos. A página será então preenchida com dados de registros sucessivos do banco de dados,
começando com o primeiro registro. Se houver mais registros que caberão na página, a próxima página
será preenchida automaticamente com o próximo conjunto de registros.
O Synchroni z e conteúdo caixa de seleção liga todos os rótulos em conjunto para que as alterações
subsequentes no layout de qualquer rótulo será aplicado a todos os outros. Para transferir o conteúdo
editado, basta usar o inc l botão UDED rotulado Synchroni z e , que aparece durante a produção de
etiquetas, se tiver seleccionado esta opção .
Finalmente, o botão Novo documento é usado para criar um documento contendo os campos
selecionados.
Quando você inicia o processo de impressão, a seguinte pergunta aparece:
A origem dos dados para a impressão de etiquetas não é encontrada automaticamente; somente o banco
de dados é pré-selecionado. A consulta real deve ser especificada pelo usuário, porque neste caso não
estamos lidando com uma tabela.
Quando a consulta é selecionada e os registros correspondentes escolhidos (nesse caso, All ), a
impressão pode começar. É aconselhável, especialmente para os primeiros testes, escolher Saída para
um Arquivo , o que salvará as etiquetas como um documento. A opção de salvar em vários documentos
não é apropriada para impressão de etiquetas, mas sim para cartas para diferentes destinatários, que
podem ser trabalhadas posteriormente.
Selecione o cabeçalho da tabela com o botão esquerdo do mouse. Mantenha o botão pressionado e arraste
o cursor pelo documento de texto. O cursor muda sua forma para um símbolo de inserção. O campo
MailMerge é inserido no documento de texto, mostrado aqui na descrição completa, que fica visível usando
os nomes View > Field .
Criando cartas formulário selecionando campos
Os campos de mala direta podem ser inseridos usando Inserir > Campos > Outro > Banco de Dados .
Aqui todas as tabelas e consultas no banco de dados selecionado estão disponíveis. Usando o botão '
Inserir ', os vários campos podem ser inseridos um após o outro diretamente no texto na posição atual do
cursor.
Se você quiser criar uma saudação, o que é comum em cartas, você pode usar um parágrafo oculto ou um
texto oculto: Inserir > Campos > Outro > Funções > Parágrafo oculto . Para ambas as variantes, tome
cuidado para que a condição que você formular não seja cumprida, pois você deseja que o parágrafo fique
visível.
Para a fórmula Caro Sra. <Apelido>, para aparecer apenas quando a pessoa é do sexo feminino, uma
condição suficiente é:
[Addresses.Mailmergequery.Gender]! = "F"
Agora, o único problema remanescente é que pode não haver sobrenome. Nestas circunstâncias, " Dear
Sir / Madam " deve aparecer, então esta é a condição que você deve inserir. A condição geral é:
[Addresses.MailMergeQuery.Gender]! = "W" OU NÃO
[Addresses.MailMergeQuery.Surname]
Isso exclui a possibilidade de este parágrafo aparecer quando a pessoa não é do sexo feminino ou não há
um sobrenome inserido.
Da mesma forma, você pode criar entradas para o gênero masculino e para entradas faltantes para os dois
tipos restantes de saudação.
Naturalmente, você pode criar uma saudação no campo de endereço exatamente da mesma maneira,
sempre que o gênero for especificado.
Mais informações são fornecidas na Ajuda do LibreOffice em Texto oculto e Texto condicional .
É claro que ainda seria mais simples se alguém que entende bancos de dados colocar toda a saudação
diretamente na consulta. Isso pode ser feito usando uma subconsulta correlacionada (consulte o capítulo
sobre Consultas neste Manual).
Particularmente interessante para rótulos é o tipo de campo Próximo registro. Se esse tipo de campo for
escolhido no final de um rótulo, o próximo rótulo será preenchido com os dados do registro a seguir. Os
rótulos típicos para impressão de etiquetas sequencial são semelhantes à figura a seguir quando você usa
Visualizar > Nomes de campos para tornar visíveis as designações de campos correspondentes:
Externas f ORMs
Se as propriedades de formulário simples disponíveis no LibreOffice forem usadas em outros módulos do
programa, como o Writer e o Calc, você só precisará exibir a barra de ferramentas de design de formulário,
usando Exibir > Barras de ferramentas > Design de formulário e abra o navegador Formulário. Você
pode criar um formulário ou, conforme descrito no capítulo F ormas, criar um campo de formulário. A guia
Dados da caixa de diálogo Propriedades do formulário parece um pouco diferente da que você vê quando
os formulários são criados diretamente em um arquivo de banco de dados ODB :
Figura 59: Formulário com uma fonte de dados externa
O cursor muda sua aparência, mostrando que algo pode ser inserido.
O Copiar Tabela d ialog aparece. No caso acima, uma nova tabela é criada. O nome da tabela é "Nomes".
Definição e Da ta devem ser transferidos. A primeira linha contém os cabeçalhos da coluna.
Neste ponto, você pode criar um novo campo adicional para uma chave primária. O nome desse campo de
banco de dados não deve ser um que já exista como um cabeçalho de coluna na planilha Calc. Caso
contrário, você receberá a mensagem de erro:
Os campos a seguir já estão definidos como chave primária: ID
Infelizmente esta mensagem não descreve o problema corretamente.
Se você quiser que um campo existente seja usado como chave, não marque a caixa Criar chave primária
. I n tais casos, a chave primária é definida usando o terceiro diálogo no assistente.
Filtragem de dados
A filtragem de dados usando a GUI é descrita no capítulo sobre entrada de dados em tabelas. Aqui,
descrevemos uma solução para um problema que muitos usuários levantaram: como usar listboxes para
pesquisar o conteúdo de campos em tabelas, que depois aparecem filtrados na seção de formulário
subjacente e podem ser editados.
A base para essa filtragem é uma consulta editável (consulte o capítulo sobre consultas) e uma tabela
adicional, na qual os dados a serem filtrados são armazenados. A consulta mostra a partir de sua tabela
subjacente apenas os registros que correspondem aos valores do filtro. Se nenhum valor de filtro for
fornecido, a consulta mostrará todos os registros.
O exemplo a seguir inicia em uma tabela de Exemplo de Mídia que inclui, entre outros, os
seguintes campos: ID (chave primária), Título , Categoria . Os tipos de campo são
INTEGER , VARCHAR e VARCHAR, respectivamente.
Primeiro, precisamos de uma tabela de exemplo de filtro . Esta tabela contém uma
chave primária e dois campos de filtro (claro que você pode ter mais se quiser): "ID" (chave primária),
Filter_1 , Filter_2 . Como os campos da tabela Media Example , que devem
ser filtrados, são do tipo VA RCHAR , os campos Filter_1 e Filter_2 também são
desse tipo. O ID pode ser o menor tipo numérico, T INYINT, porque a tabela
Filtro nunca conterá mais de um registro.
Você também pode filtrar campos que ocorrem na tabela de exemplo de mídia apenas como chaves
estrangeiras. Nesse caso, você deve fornecer aos campos correspondentes na tabela de Exemplo de
Filtro o tipo apropriado para as chaves estrangeiras, geralmente INTEGER .
A consulta a seguir é certamente editável:
SELECT * FROM " Exemplo de Mídia "
Todos os registros da tabela de exemplo de mídia são exibidos, incluindo a chave primária.
SELECT * FROM " Exemplo de Mídia " WHERE "Título" = IFNULL ((SELECT
"Filter_1" FROM " Exemplo de Filtro "), "Título")
Se o campo Filter_1 não for NULL , esses registros serão exibidos para os quais o título é
o mesmo que Filter_1 . Se o campo Filter_1 for NULL , o valor do campo Title
será usado. Como Título é o mesmo que "Título" , todos os registros são exibidos. Essa
suposição não é válida, no entanto, se o campo Título de qualquer registro estiver vazio (contém
NULL) . Isso significa que esses registros nunca serão exibidos sem entrada de título. Portanto,
precisamos melhorar a consulta:
SELECT *, IFNULL ("Title", '') AS "T" DE " Exemplo de Mídia " WHERE "T" =
IFNULL ((SELECT "Filter_1" FROM " Exemplo de Filtro "), "T")
Essa variante levará ao objetivo desejado. Em vez de filtragem Título diretamente, um campo é
filtrada que carrega o alias T . Este campo não tem conteúdo, mas não é NULL . Nas condições
apenas o campo T é considerado. Todos os registros são exibidos, mesmo se o título for
NULL .
Infelizmente você não pode fazer isso usando a GUI. Este comando está disponível apenas diretamente
com o SQL. Para torná-lo editável na GUI, é necessária uma modificação adicional:
SELECT " Exemplo de Mídia ". *, IFNULL (" Exemplo de Mídia ". "Título", '')
AS "T" DE " Exemplo de Mídia " WHERE "T" = IFNULL ((SELECT "Filter_1" FROM
" Exemplo de Filtro "), "T")
Se o relacionamento da tabela com os campos estiver configurado agora, a consulta se tornará editável na
GUI.
Como teste, você pode colocar um título em "Filtro". "Filtro_1" . Como "Filtro",
"ID" defina o valor '0 ' . O registro é salvo e a filtragem pode ser compreendida. Se
"Filtro". "Filtro_1" for esvaziado, a GUI trata isso como NULL . Um novo teste produz uma
exibição de todas as mídias. Em qualquer caso, antes que um formulário seja criado e testado, apenas um
registro com uma chave primária deve ser inserido na tabela Filtro . Deve ser apenas um registro,
pois as subconsultas mostradas acima só podem transmitir um valor.
A consulta agora pode ser ampliada para filtrar dois campos:
SELECT " Exemplo de Mídia ". *, IFNULL (" Exemplo de Mídia ". "Título", '')
AS "T", IFNULL (" Exemplo de Mídia ". "Categoria", '') AS "K" FROM "
Exemplo de Mídia " WHERE "T" = IFNULL ((SELECT "Filtro_1" FROM " Exemplo de
Filtro "), "T") E "K" = IFNULL ((SELECT "Filter_2" DE " Exemplo de Filtro
"), "K")
Isso conclui a criação da consulta editável. Agora, para a consulta básica das duas caixas de listagem:
SELECT DISTINCT "Title", "Title" FROM " Exemplo de Mídia " ORDER BY "Title"
ASC
A caixa de listagem deve mostrar o título e, em seguida, também transmitir esse título para
o campo Filter_1 na tabela de filtro que sustenta o formulário. Além disso, nenhum valor
duplicado deve ser mostrado ( condição 'D ISTINCT' ). E a coisa toda deve ser
classificada na ordem correta.
Uma consulta correspondente é criada para o campo Categoria , que é gravar seus dados no campo
Filter_2 na tabela Filter .
Se um desses campos contiver uma chave estrangeira, a consulta será adaptada para que a chave
estrangeira seja passada para a tabela de Filtros subjacente .
O formulário consiste em duas partes. Formulário 1 é o formulário baseado na tabela de filtros . O
formulário 2 é o formulário baseado na consulta. O formulário 1 não tem barra de navegação e o ciclo está
definido como Registro atual . Além disso, a propriedade Permitir adições é definida como Não . O
primeiro e único registro para este formulário já existe.
Formulário 1 contém um ins duas caixas de listagem com rótulos apropriados. Listbox 1 retorna valores
para Filter_1 e está vinculado à consulta do campo Title . O Listbox 2 retorna valores para
Filter_2 e está relacionado à consulta do campo Category .
Forma 2 contém um campo de controlo de quadro, em que todos os campos da consulta podem ser
listados, excepto para os campos t und K . O formulário ainda funcionaria se esses campos
estivessem presentes; eles são omitidos para evitar uma duplicação confusa do conteúdo do campo. Além
disso, o formulário 2 contém um botão, vinculado à função Atualizar formulário . Uma barra de navegação
adicional pode ser incorporada para evitar que a tela pisque toda vez que o formulário for alterado, devido à
barra de navegação estar presente em um formulário e não no outro.
Quando o formulário estiver concluído, a fase de teste será iniciada. Quando uma caixa de listagem é
alterada, o botão no formulário 2 é usado para armazenar esse valor e atualizar o Formulário 2. Isso agora
está relacionado ao valor que a caixa de listagem fornece. A filtragem pode ser feita retrospectivamente,
escolhendo um campo vazio na caixa de listagem.
Partes de codigo
Esses trechos de código vêm de consultas para listas de discussão. Surgem problemas particulares que
talvez possam ser úteis como soluções para seus próprios experimentos de banco de dados.
Numeração de linhas
Os campos de incremento automático estão bem. No entanto, eles não informam definitivamente quantos
registros estão presentes no banco de dados ou estão realmente disponíveis para serem consultados.
Frequentemente, os registros são excluídos e muitos usuários tentam em vão determinar quais números
não estão mais presentes para que o número em execução seja compatível.
SELECT "ID", (SELECT COUNT ("ID") FROM "Tabela" WHERE "ID" <= "a". "ID") AS
"Nr." FROM "Table" COMO "a"
O campo ID é lido e o segundo campo é determinado por uma subconsulta correlacionada, que procura
determinar quantos valores de campo na ID são menores ou iguais ao valor do campo atual. A partir disso,
um número de linha em execução é criado.
Cada registro ao qual você deseja aplicar essa consulta contém campos. Para aplicar essa consulta aos
registros, primeiro você deve adicionar esses campos à consulta. Você pode colocá-los na ordem que
desejar na cláusula SELECT . Se você tiver os registros em um formulário, precisará modificar o
formulário para que os dados do formulário sejam provenientes dessa consulta.
Por exemplo, o registro contém campo1, campo2 e campo3. A consulta completa seria:
SELECT "ID", " field1", "campo2", "campo3", (SELECT COUNT ("ID") FROM
"Tabela" WHERE "ID" <= "a". "ID") AS "Nr." FROM "Table" COMO "a"
Uma numeração para um agrupamento correspondente também é possível:
SELECT "ID", "Cálculo", (SELECT COUNT ("ID") FROM "Tabela" WHERE "ID" <=
"a". "ID" E "Cálculo" = "a". "Cálculo") AS "Nr " FROM "Tabela" COMO "a"
ORDER BY "ID" ASC, "Nr." ASC
Aqui, uma tabela contém números calculados diferentes. ("Cálculo"). Para cada número calculado,
"Nr." é expresso separadamente em ordem crescente após a classificação no campo ID. Isso
produz uma numeração de 1 para cima.
Se a ordem de classificação real na consulta for concordar com os números de linha, um tipo apropriado de
classificação deverá ser mapeado. Para isso, o campo de classificação deve ter um valor único em todos
os registros. Caso contrário, dois números de lugar terão o mesmo valor. Isso pode realmente ser útil se,
por exemplo, a ordem de lugar em uma competição for descrita, pois resultados idênticos levarão a uma
posição conjunta. Para que a ordem do lugar seja expressa de tal maneira que, no caso de posições
conjuntas, o próximo valor seja omitido, a consulta precisa ser construída de maneira um pouco diferente:
SELECT "ID", (SELECT COUNT ("ID") + 1 de "Tabela" WHERE "Tempo" <"a".
"Tempo") AS "Place" FROM "Tabela" AS "a"
Todas as entradas são avaliadas para as quais o campo "Hora" tem um valor menor. Isso abrange todos os
atletas que alcançaram o posto vencedor antes do atleta atual. Para este valor é adicionado o número 1.
Isso determina o local do atleta atual. Se a hora é idêntica à de outro atleta, eles são colocados juntos. Isso
possibilita fazer pedidos como 1º Lugar, 2º Lugar, 2º Lugar, 4º Lugar.
Seria mais problemático, se os números de linha fossem necessários, bem como uma ordem de lugar.
Isso pode ser útil se vários registros precisassem ser combinados em uma linha.
SELECIONE "ID", (SELECT COUNT ("ID") + 1 FROM "Tabela" WHERE "Hora" <"a". "Hora") AS
"Place",
CASO QUANDO
(SELECT COUNT ("ID") + 1 FROM "Tabela" WHERE "Tempo" = "a". "Tempo") = 1
THEN (SELECT COUNT ("ID") + 1 FROM "Tabela" WHERE "Hora" <"a". "Hora")
ELSE (SELECT (SELECT COUNT ("ID") + 1 FROM "Tabela" WHERE "Tempo" <"a". "Tempo") +
COUNT ("ID") FROM "Tabela" WHERE "Tempo" = "a". "Hora" "ID" <"a". "ID"
FIM
AS "LineNumber" FROM "Tabela" COMO "a"
A segunda coluna ainda dá a ordem do lugar. A terceira coluna verifica primeiro se apenas uma pessoa
cruzou a linha com este tempo. Nesse caso, a ordem do local é convertida diretamente em um número de
linha. Caso contrário, um valor adicional é adicionado à ordem do local. Para o mesmo tempo (
"Tempo" = "a". "Tempo" ) pelo menos 1 é adicionado, se houver mais uma pessoa com o ID da
chave primária, cuja chave primária é menor que a chave primária no registro atual ( " ID "<" a
"." ID " ). Essa consulta, portanto, produz valores idênticos para a ordem de lugar, desde que não
exista uma segunda pessoa com o mesmo tempo. Se uma segunda pessoa com o mesmo tempo existir, o
ID determina qual pessoa tem o menor número de linha.
Aliás, essa classificação por número de linha pode servir para qualquer finalidade que os usuários do banco
de dados desejarem. Por exemplo, se uma série de registros for classificada por nome, os registros com o
mesmo nome não serão classificados aleatoriamente, mas de acordo com sua chave primária, que é
obviamente exclusiva. Desta forma também, numeração pode levar a uma classificação de registros.
A numeração de linhas também é um bom prelúdio para a combinação de registros individuais em um
único registro. Se uma consulta de numeração de linhas for criada como visualização, uma consulta
adicional poderá ser aplicada sem criar nenhum problema. Como um exemplo simples aqui, mais uma vez
é a primeira consulta de numeração com um campo extra:
SELECT "ID", "Nome", (SELECT COUNT ("ID") FROM "Tabela" WHERE "ID" <= "a".
"ID") AS "Nr." FROM "Table" COMO "a"
Esta consulta é transformada na exibição " View1" . A consulta pode ser usada, por exemplo, para colocar
os três primeiros nomes juntos em uma linha:
SELECT "Name" AS "Name_1", (SELECT "Nome" FROM "View1" WHERE "Nr." = 2)
COMO "Name_2", (SELECT "Nome" FROM "View1" WHERE "Nr." = 3) AS " Name_3
"FROM" View1 "WHERE" Nr. " = 1
Desta forma, vários registros podem ser convertidos em campos adjacentes. Essa numeração
simplesmente é executada do primeiro ao último registro.
Se todos esses indivíduos tiverem o mesmo sobrenome, isso pode ser feito da seguinte maneira:
SELECT "ID", "Nome", "Sobrenome", (SELECT COUNT ( "ID") FROM "Tabela" ONDE
"ID" <= "a". "ID" e "Sobrenome" = "a". "Sobrenome" ) AS "Nr." FROM "Table"
COMO "a"
Agora que a vista foi criada, a família pode ser montada.
SELECT "Sobrenome", "Nome" AS "nome_1", (selecione "Nome" de "View1" ONDE
"Nr." = 2 e "Sobrenome" = "a". "Sobrenome") como "NAME_2", (SELECT " Nome"
de "View1" ONDE "Nr."= 3 e "Sobrenome"= "a". "Sobrenome") como "NAME_3"
FROM "View1" AS "a" ONDE "Nr." = 1
Dessa forma, em um catálogo de endereços, todos os membros de uma família ("Sobrenome") podem ser
coletados juntos para que cada endereço seja considerado apenas uma vez ao enviar uma carta, mas
todos que receberem a carta serão listados.
Precisamos ter cuidado aqui, pois não queremos uma função infinitamente loop. A consulta no exemplo
acima limita os registros paralelos que devem ser convertidos em campos para 3. Esse limite foi escolhido
deliberadamente. Nenhum outro nome aparecerá, mesmo que o valor de "Nr". é maior que 3.
Em alguns casos, tal limite é claramente compreensível. Por exemplo, se estamos criando um calendário,
as linhas podem representar as semanas do ano e as colunas os dias da semana. Como no calendário
original, apenas a data determina o conteúdo do campo, a numeração de linhas é usada para numerar os
dias de cada semana continuamente e, em seguida, as semanas do ano se tornam os registros. Isso exige
que a tabela contenha um campo de data com datas contínuas e um campo para os eventos. Além disso, a
data mais antiga sempre criará um "Nr." = 1. Portanto, se você quiser que o calendário comece na
segunda-feira, a data mais próxima deve ser na segunda-feira. A coluna 1 é então segunda-feira, coluna 2
terça-feira e assim por diante. A subconsulta termina em "Nr". = 7. Desta forma, todos os sete dias da
semana podem ser mostrados lado a lado e uma vista de calendário correspondente criada.
Esse procedimento pode, dentro dos limites, ser expresso no HSQLDB. O exemplo a seguir refere-se a
uma tabela chamada Name com os campos ID, Firstname e Surname . A consulta a seguir é executada
pela primeira vez na tabela e salva como uma exibição chamada View_Group.
SELECT "Sobrenome", "Nome", (SELECT COUNT ("ID") FROM "Nome" WHERE "ID" <=
"a". "ID" AND "Sobrenome" = "a". "Sobrenome") AS "GroupNr "FROM" Name "AS"
a "
Você pode ler no capítulo Consultas como essa consulta acessa o conteúdo do campo na mesma linha de
consulta. Produz uma sequência numerada ascendente, agrupada por sobrenome . Essa numeração é
necessária para a consulta a seguir, de modo que, no exemplo, um máximo de 5 primeiros nomes seja
listado.
SELECIONAR "Sobrenome",
(SELECT "Nome" FROM "View_Group" WHERE "Apelido" = "a". "Apelido" E
"GroupNr" = 1) ||
IFNULL ((SELECT ',' || "Nome" FROM "View_Group" WHERE "Apelido" = "a".
"Sobrenome" AND "GroupNr" = 2), '') ||
IFNULL ((SELECT ',' || "Nome" FROM "View_Group" WHERE "Apelido" = "a".
"Sobrenome" AND "GroupNr" = 3), '') ||
IFNULL ((SELECT ',' || "Nome" FROM "View_Group" WHERE "Apelido" = "a".
"Sobrenome" AND "GroupNr" = 4), '') ||
IFNULL ((SELECT ',' || "Nome" FROM "View_Group" WHERE "Apelido" = "a".
"Sobrenome" AND "GroupNr" = 5), '')
COMO "Firstnames"
FROM "View_Group" COMO "a"
Usando subconsultas, os primeiros nomes dos membros do grupo são pesquisados um após o outro e
combinados. A partir da segunda subconsulta, você deve garantir que os valores 'NULL' não
definam a combinação inteira como 'NULL' . É por isso que um resultado de '' em vez de
'NULL' é mostrado.
Capítulo 9 Macros
O botão Novo na caixa de diálogo LibreOffice Basic Ma c ros abre a caixa de diálogo Novo Módulo , que
solicita o nome do módulo (a pasta na qual a macro será arquivada). O nome pode ser alterado mais tarde,
se desejado.
Assim que isso é fornecido, o editor de macro é exibido. A área de entrada já contém o início e o fim de
uma sub - rotina :
REM ***** BASIC *****
Sub Main
End Sub
Se as macros forem utilizáveis, as etapas a seguir são necessárias:
•Sob Ferramentas > Opções > Segurança > Segurança Macro o nível de segurança deve ser reduzida
para Médio. Se necessário, você também pode usar a guia Fontes confiáveis para definir o caminho para
seus próprios arquivos de macro para evitar consultas posteriores sobre a ativação de macros.
•O arquivo de banco de dados deve ser fechado e reaberto após a criação do primeiro módulo de macro.
Alguns princípios básicos para o uso do código básico no LibreOffice:
• Aslinhas não possuem números de linha e devem terminar com um retorno difícil.
•Funções, expressões reservadas e elementos semelhantes não diferenciam maiúsculas de minúsculas.
Então, "String" é o mesmo que "STRING" ou "string" ou qualquer outra combinação de letras maiúsculas e
minúsculas. Caso deve ser usado apenas para melhorar a legibilidade. Os nomes para constantes e
enumerações, no entanto, diferenciam maiúsculas e minúsculas na primeira vez que são vistos pelo
compilador de macros, portanto, é melhor sempre gravar os que usam o caso apropriado.
•Existe uma diferença básica entre sub-rotinas (começando com SUB) e funções (começando com
FUNCTION). Sub-rotinas são segmentos de programa sem valores de retorno. Funções retornam um
valor.
Para mais detalhes veja o Capítulo 13, Introdução ao Macros, no Getting Started guia.
As macros nas versões PDF e ODT deste capítulo são coloridas de acordo
com as regras do editor de macros do LibreOffice:
Designação de macro Comentário de macro Operador de macro
Expressão reservada de macro Número de macro Sequência de
Nota caracteres de macro
Melhorando a usabilidade
Para esta primeira categoria de uso macro, mostramos várias possibilidades para melhorar a usabilidade
dos formulários Base.
Registros de Filtragem
O próprio filtro pode funcionar perfeitamente na forma descrita em C apítulo 8, D atabase t pergunta . A
variante mostrada abaixo substitui o S botão ave e lê os listboxes novamente, de modo que um filtro
escolhido a partir de uma caixa de listagem pode restringir as opções disponíveis na outra caixa de
listagem.
Filtro SUB
DIM oDOC COMO OBJETO
DIM oDrawpage COMO OBJETO
DIM oForm1 COMO OBJETO
DIM oForm2 COMO OBJETO
DIM oFieldList1 COMO OBJETO
DIM oFieldList2 COMO OBJETO
oDoc = thisComponent
oDrawpage = oDoc.drawpage
Primeiro, as variáveis são definidas e definidas para acessar o conjunto de formulários. Este conjunto
compreende os dois formulários "Filter" e "Display". As caixas de listagem estão no formulário "Filtro" e
possuem os nomes "List_1" e "List_2".
oForm1 = oDrawpage.forms.getByName ( "Filtro" )
oForm2 = oDrawpage.forms.getByName ( "Display" )
oFieldList1 = oForm1.getByName ( "List_1" )
oFieldList2 = oForm1.getByName ( "List_2" )
Primeiro, o conteúdo das listboxes é transferido para o formulário subjacente usando commit () . A
transferência é necessário, porque de outro modo a mudança de uma caixa de listagem não será reconhe z
ed quando poupança. A Commit () em struction só precisa de ser aplicada à caixa de
listagem que acaba de ser acessado. Depois disso, o registro é salvo usando updateRow () . Em
princípio, nossa tabela de filtros contém apenas um registro, que é escrito uma vez no início. Este registro é
então sobrescrito continuamente usando um comando de atualização.
oFieldList1.commit ()
oFieldList2.commit ()
oForm1.updateRow ()
As caixas de listagem servem para influenciar umas as outras. Por exemplo, se uma caixa de listagem for
usada para restringir a mídia exibida aos CDs, a outra caixa de listagem não deverá incluir todos os
gravadores de livros em sua lista de autores. Uma seleção na segunda caixa de listagem resultaria em um
filtro vazio. É por isso que os listboxes devem ser lidos novamente. Estritamente falando, o comando
refresh () só precisa ser executado na caixa de listagem que não foi acessada.
Depois disso, o form2, que deve exibir o conteúdo filtrado, é lido novamente.
oFieldList1.refresh ()
oFieldList2.refresh ()
oForm2.reload ()
END SUB
Caixas de listagem que devem ser influenciadas usando esse método podem ser fornecidas com conteúdo
usando várias consultas.
A variante mais simples é fazer com que a caixa de listagem leve seu conteúdo dos resultados do filtro. Em
seguida, um único filtro determina qual conteúdo de dados será filtrado posteriormente.
SELECIONE "Field_1" || '-' || "Contagem" AS "Display", "Field_1"
FROM (SELECT COUNT ("ID") como "Contagem", "Field_1" de
"Table_Filter_result" GROUP BY "Field_1")
ORDER BY "Field_1"
O conteúdo do campo e o número de ocorrências são exibidos. Para obter o número de ocorrências, uma
subconsulta é usada. Isso é necessário, caso contrário, apenas o número de ocorrências, sem mais
informações do campo, será mostrado na caixa de listagem.
A macro cria listboxes rapidamente por essa ação; eles são preenchidos com apenas um valor. Se uma
caixa de listagem não for NULL, ela será levada em conta pela filtragem. Após a ativação da segunda caixa
de listagem, somente os campos vazios e um valor exibido estarão disponíveis para ambas as caixas de
listagem. Isso pode parecer prático para uma pesquisa limitada. Mas, e se um catálogo da biblioteca
mostrar claramente a classificação de um item, mas não mostrar exclusivamente se é um livro, um CD ou
um DVD? Se a classificação for escolhida primeiro e a segunda caixa de listagem for definida como "CD",
ela deverá ser redefinida como NULL para realizar uma pesquisa subsequente que inclua livros. Seria mais
prático se a segunda caixa de listagem mostrasse diretamente os vários tipos de mídia disponíveis, com
as contagens de ocorrências correspondentes.
Para atingir este objetivo, é construída a seguinte consulta, que não é mais alimentada diretamente dos
resultados do filtro. O número de ocorrências deve ser obtido de maneira diferente.
SELECIONAR
IFNULL ("Field_1" || '-' || "Count", 'empty -' || "Contagem") AS "Display",
"Field_1"
A PARTIR DE
(SELECT COUNT ("ID") COMO "Contagem", "Campo_1" DA "Tabela" WHERE "ID" IN
(SELECT "Tabela". "ID" FROM "Filtro", "Tabela" WHERE "Tabela". "Campo_2" =
IFNULL ("Filtro". "Filtro_2", "Tabela". "Campo_2"))
GROUP BY "Field_1")
ORDER BY "Field_1"
Essa consulta muito complexa pode ser dividida. Na prática, é comum usar uma VIEW para a
subconsulta. A caixa de listagem recebe seu conteúdo a partir de uma consulta relativa ao thi s VIEW.
A consulta em detalhes: A consulta apresenta duas colunas. A primeira coluna contém a visualização vista
por uma pessoa que tenha o formulário aberto. Essa visualização mostra o conteúdo do campo e,
separados por um hífen, os hits desse conteúdo de campo. A segunda coluna transfere seu conteúdo para
a tabela subjacente do formulário. Aqui temos apenas o conteúdo do campo. As caixas de listagem, assim,
extraem seu conteúdo da consulta, que é apresentada como o resultado do filtro no formulário. Apenas
esses campos estão disponíveis para filtragem adicional.
A tabela da qual essa informação é desenhada é, na verdade, uma consulta. Nessa consulta, os campos
da chave primária são contados ( SELECT COUNT ("ID") AS "Count" ). Isso é então agrupado
pelo termo de pesquisa no campo ( GROUP BY "Field_1" ). Esta consulta apresenta o termo no
próprio campo como a segunda coluna. Essa consulta, por sua vez, é baseada em uma outra subconsulta:
SELECT "Table". "ID" FROM "Filtro", "Tabela" WHERE "Tabela". "Campo_2" =
IFNULL ("Filtro". "Filtro_2", "Tabela". "Campo_2")
Essa subconsulta lida com o outro campo a ser filtrado. Em princípio, esse outro campo também deve
corresponder à chave primária. Se houver outros filtros, essa consulta poderá ser estendida:
SELECT "Table". "ID" FROM "Filtro", "Tabela" ONDE
"Tabela". "Campo_2" = IFNULL ("Filtro". "Filtro_2", "Tabela". "Campo_2")
E
"Tabela". "Campo_3" = IFNULL ("Filtro". "Filtro_3", "Tabela". "Campo_3")
Isso permite que quaisquer campos adicionais que sejam filtrados controlem o que finalmente aparece na
caixa de listagem do primeiro campo, "Field_1".
Finalmente, toda a consulta é classificada pelo campo subjacente.
O que a consulta final subjacente ao formulário exibido, na verdade, parece, pode ser visto no Capítulo 8, o
Database T pergunta.
A macro a seguir pode controlar por meio de uma caixa de listagem quais caixas de listagem devem ser
salvas e quais devem ser lidas novamente.
A sub-rotina a seguir supõe que a propriedade “Informações adicionais” para cada caixa de listagem
contém uma lista separada por vírgulas de todos os nomes de caixas de listagem sem espaços. O
primeiro nome na lista deve ser o nome dessa caixa de listagem.
SUB Filter_more_info ( oEvent AS OBJECT )
DIM oDOC COMO OBJETO
DIM oDrawpage COMO OBJETO
DIM oForm1 COMO OBJETO
DIM oForm2 COMO OBJETO
DIM oFieldList1 COMO OBJETO
DIM oFieldList2 COMO OBJETO
DIM sTag AS String
sTag = oEvent.Source.Model.Tag
Uma matriz (uma coleção de dados acessíveis por meio de um número de índice) é estabelecida e
preenchida com os nomes dos campos das caixas de listagem. O primeiro nome na lista é o nome da
caixa de listagem vinculada ao evento.
aList () = Dividir ( sTag , "," )
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm1 = oDrawpage.forms.getByName ( "Filtro" )
oForm2 = oDrawpage.forms.getByName ( "Display" )
A matriz é executada do limite inferior ( ' Lbound () ' ) até o limite superior ( '
Ubound () ' ) em um único loop. Todos os valores que foram separados por vírgulas nas
informações adicionais são agora transferidos sucessivamente.
PARA i = LBound ( aList ()) PARA UBound ( aList ())
SE i = 0 ENTÃO
A caixa de listagem que acionou a macro deve ser salva. É encontrado na variável aList (0) .
Primeiro, as informações da caixa de listagem são transportadas para a tabela subjacente e, em seguida, o
registro é salvo.
oForm1.getByName ( aList ( i )) .commit ()
oForm1.updateRow ()
OUTRO
As outras caixas de listagem devem ser atualizadas , pois agora elas contêm valores diferentes,
dependendo da primeira caixa de listagem.
oForm1.getByName ( aList ( i )) .refresh ()
FIM SE
PRÓXIMO
oForm2.reload ()
END SUB
As consultas para essa macro mais utilizável são naturalmente as mesmas que as apresentadas na seção
anterior.
O índice da matriz, na qual os nomes dos campos são gravados, é inicialmente definido como 0. Em
seguida, a consulta começa a ser lida. Como o tamanho do array é desconhecido, ele deve ser ajustado
continuamente. É por isso que o loop começa com ' ReDim Preserve arContent (inI)
' para definir o tamanho da matriz e, ao mesmo tempo, preservar seu conteúdo existente. Em
seguida, os campos são lidos e o índice da matriz é incrementado em 1. Em seguida, a matriz é
dimensionada novamente e um valor adicional pode ser armazenado.
InI = 0
IF NOT ISNULL ( oQuery_Result ) ENTÃO
QUANDO oQuery_result.next
ReDim Preservar arContent ( INI )
arContent ( INI ) = oQuery_Result.getString ( 1 )
inI = inI + 1
WEND
FIM SE
stSql = "DROP TABLE" "Searchtmp" "SE EXISTE"
oSQL_Statement.executeUpdate ( stSql )
Agora, a consulta é reunida em um loop e subsequentemente aplicada à tabela definida no início. Todas as
combinações de maiúsculas e minúsculas são permitidas, pois o conteúdo do campo na consulta é
convertido em minúsculas.
A consulta é construída de forma que os resultados acabem na tabela Searchtmp. Supõe-se que a chave
primária é o primeiro campo na tabela ( arContent (0) ).
stSql = "SELECT" "" + arContent ( 0 ) + "" "INTO" "Searchtmp" "FROM" "" +
stTable + "" "WHERE"
A primeira caixa de combinação, na qual a rua é inserida, é chamada comStr , o campo de chave
estrangeira oculto na tabela subjacente ao formulário é chamado numStrID . Neste primeiro combobox
o campo Rua é exibido. A tabela, que conterá as entradas da caixa de combinação, também é
chamada St reet .
A cidade e o código postal são inseridos na segunda caixa de combinação. Isso é chamado
comPlcTown . O campo de chave estrangeira oculto é chamado numPlcTownID . Esta segunda
caixa de combinação contém o código postal e a cidade , separados por um espaço (
"" ). A primeira tabela tem o nome Postcode , a segunda tabela o nome Town . Na primeira
tabela, a chave estrangeira para a segunda tabela é chamada Town_ID . O campo da segunda tabela
é o segundo elemento da caixa de combinação, que é a posição 2 .
Diálogos
Os erros de entrada nos campos geralmente só são percebidos posteriormente. Geralmente, é necessário
modificar entradas idênticas em vários registros ao mesmo tempo. É desajeitado ter que fazer isso na
visualização de tabela normal, especialmente quando vários registros devem ser editados, já que cada
registro requer que uma entrada individual seja feita.
Formulários podem usar macros para fazer esse tipo de coisa, mas para fazer isso em várias tabelas,
você precisaria de formulários construídos de forma idêntica. Diálogos podem fazer o trabalho. Um diálogo
pode ser fornecido no início com os dados necessários para tabelas apropriadas e pode ser chamado por
várias formas diferentes.
As caixas de diálogo são salvas junto com os módulos para macros. Sua criação é semelhante à de uma
forma. Campos de controle muito semelhantes estão disponíveis. Apenas o controle de tabela de
formulários está ausente como uma possibilidade especial de entrada.
A aparência dos controles de diálogo é determinada pelas configurações da interface gráfica do usuário.
A caixa de diálogo mostrada acima serve no banco de dados de exemplo para editar tabelas que não são
usadas diretamente como a base de um formulário. Assim, por exemplo, o tipo de mídia é acessível
apenas por meio de uma caixa de listagem (na versão de macro, ela se torna uma caixa de combinação).
Na versão macro, o conteúdo do campo pode ser expandida por ne w conteúdo, mas uma alteração do
conteúdo existente não é possível. Na versão sem macros, as alterações são realizadas usando um
controle de tabela separado.
Embora as alterações neste caso sejam fáceis de executar sem macros, é muito difícil alterar o tipo de
mídia de várias mídias de uma só vez. Suponha que os seguintes tipos estão disponíveis: "Book,
obrigado", "Book, capa dura", "Paperback" um nd "Ringfile". Agora, depois que o banco de dados está em
uso há muito tempo, os contemporâneos mais ativos previram tipos de mídia adicionais semelhantes para
trabalhos impressos. A tarefa de diferenciá-los tornou-se excessiva. Queremos, portanto, reduzi-los, de
preferência a um único termo. Sem macros, os registros dotabela de mídia teria que ser encontrada
(usando um filtro) e alterada individualmente. Se você conhece SQL, pode fazê-lo muito melhor usando um
comando SQL. Você pode alterar todos os registros na tabela Mídia com uma única entrada. Um segundo
comando SQL remove os tipos de mídia agora excedentes que não têm mais nenhum link para a tabela
Mídia. Precisamente este método é aplicado usando Substituir deste diálogo W caixa om - apenas o
comando SQL é primeiro adaptado à mídia T mesa ipo usando uma macro que também pode editar outras
tabelas.
Muitas vezes, as entradas aparecem em uma tabela que, em retrospectiva, pode ser alterada na forma e,
portanto, não são mais necessárias. Não faz mal simplesmente excluir tais entradas órfãs, mas elas são
muito difíceis de encontrar usando a interface gráfica do usuário. Aqui, novamente, um comando SQL
adequado é útil, juntamente com uma instrução de exclusão. Este comando para tabelas afetadas é
incluído na caixa de diálogo em Excluir todas as entradas supérfluas .
Se a caixa de diálogo for usada para realizar várias alterações, isso é indicado pela caixa de seleção Editar
vários registros . Então a caixa de diálogo não terminará simplesmente quando o botão OK for clicado.
O código de macro para este diálogo pode ser visto integralmente no banco de dados de exemplo. Apenas
trechos são explicados abaixo.
SUB Table_purge ( oEvent AS OBJECT )
A macro deve ser lançada entrando na seção Informações adicionais para os botões relevantes:
0: Form, 1: Subformulário, 2: SubSubform, 3: Combobox ou controle de tabela, 4:
Campo de chave estrangeira em um formulário, vazio para um controle de tabela, 5:
Nome da tabela da tabela auxiliar, 6: Table field1 of table auxiliar, 7: Tabela
campo2 da tabela auxiliar ou 8: Nome da tabela da tabela auxiliar para a tabela
campo2
As entradas nesta área são listadas no início da macro como comentários. Os números ligados a eles são
transferidos e a entrada relevante é lida de uma matriz. A macro pode editar listboxes, que possuem duas
entradas, separadas por ">" . Essas duas entradas também podem vir de diferentes tabelas e serem
reunidas usando uma consulta, como por exemplo na tabela Código postal, que possui apenas o campo de
chave estrangeira Town_ID para a cidade, exigindo que a tabela Town exiba os nomes das cidades.
DIM aForeignTable ( 0 , 0 a 1 )
DIM aForeignTable2 ( 0 , 0 a 1 )
Entre as variáveis definidas no início, estão duas matrizes. Enquanto matrizes normais pode ser criado
pelo Split () de comando durante a execução do sub-rotina , as matrizes bidimensionais m u r ser
definidos previamente. Arrays bidimensionais são necessários para armazenar vários registros de uma
consulta quando a própria consulta se refere a mais de um campo. Os dois arrays declarados acima
devem ser capazes de interpretar consultas que se referem a dois campos de tabela. Portanto, eles são
definidos para dois conteúdos diferentes usando 0 a 1 para a segunda dimensão.
stTag = oEvent.Source.Model.Tag
aTable () = Dividir ( stTag , "," )
PARA i = LBound ( aTabela ()) PARA UBound ( aTabela ())
tabela (i) = trim ( tabela ( i ))
PRÓXIMO
As variáveis fornecidas são lidas. A sequência é aquela configurada no comentário acima. Há um máximo
de nove entradas, e você precisa declarar se um eigh th entrada para o field2 mesa e uma de nove entrada
th f o r uma segunda tabela existe.
Se os valores devem ser removidos de uma tabela, é necessário primeiro verificar se eles não existem
como chaves estrangeiras em alguma outra tabela. Em estruturas de tabela simples, uma determinada
tabela terá apenas uma conexão de chave estrangeira para outra tabela. No entanto, no banco de dados de
exemplo fornecido, há uma tabela Town que é usada para o local de publicação da mídia e a cidade para os
endereços. Assim, a chave primária da tabela Town é inserida duas vezes em tabelas diferentes. Estas
tabelas e nomes de chave estrangeira pode, naturalmente, também ser inserido usando Adicional I
nformação campo. Seria melhor se pudessem ser fornecidos universalmente para todos os casos. Isso
pode ser feito usando a seguinte consulta.
stSql = "SELECT" "FKTABLE_NAME" "," "FKCOLUMN_NAME" "FROM"
"INFORMATION_SCHEMA" "." "SYSTEM_CROSSREFERENCE" "ONDE" "PKTABLE_NAME" "= '" +
aTable (5) + "'"
No banco de dados, a área INFORMATION_SCHEMA contém todas as informações sobre as tabelas do
banco de dados, incluindo informações sobre chaves estrangeiras. As tabelas que contêm esta informação
podem ser acessadas usando "INFORMATION_SCHEMA". "SYSTEM_CROSSREFERENCE".
KTABLE_NAME "fornece a tabela que fornece sua chave primária para a conexão. FKTABLE_NAME
fornece a tabela que usa essa chave primária como uma chave estrangeira. Por fim, FKCOLUMN_NAME
informa o nome do campo da chave estrangeira.
A tabela que fornece sua chave primária para uso como uma chave estrangeira está na matriz criada
anteriormente na posição 6. A contagem começa com 0, o valor é lido da matriz usando aTable (5)
.
inCount = 0
stForeignIDTab1Tab2 = "ID"
stForeignIDTab2Tab1 = "ID"
stAuxiltable = aTabela (5)
Antes da leitura dos arrays começar, alguns valores padrão devem ser definidos. Estes são o índice para o
array no qual os valores da tabela auxiliar serão gravados, a chave primária padrão se não precisarmos da
chave estrangeira para uma segunda tabela e a tabela auxiliar padrão, vinculada à tabela principal, para o
código postal e cidade, a tabela de código postal.
Quando dois campos são vinculados para exibição em uma caixa de listagem, eles podem, conforme
descrito acima, vir de duas tabelas diferentes. Para a exibição de CEP e cidade, a consulta é:
SELECIONAR "Código postal". "Código postal" || '>' || "Town". "Town" FROM "CEP", "Town" ONDE
"Postcode". "Town_ID" = "Cidade". "ID"
A tabela do primeiro campo (CEP) está vinculada à segunda tabela por uma chave estrangeira. Somente
as informações dessas duas tabelas e os campos Código postal e Cidade são passados para a macro.
Todas as chaves primárias são, por padrão, chamadas de ID no banco de dados de exemplo. Portanto, a
chave estrangeira de Town in Postcode deve ser determinada usando a macro.
Da mesma forma, a macro deve acessar cada tabela com a qual o conteúdo da caixa de listagem é
conectado por uma chave estrangeira.
oQuery_result = oSQL_Statement.executeQuery ( stSql )
IF NOT ISNULL ( oQuery_result ) ENTÃO
QUANDO oQuery_result. Próximo
ReDim Preserve aForeignTable ( inCount , 0 a 1 )
A matriz deve ser recém dimensionada a cada vez. Para preservar o conteúdo existente, o backup é feito
usando (Preservar).
aForeignTables ( inCount , 0 ) = oQuery_result.getString ( 1
)
Lendo o primeiro campo com o nome da tabela que contém a chave estrangeira. O resultado para a tabela
Código Postal i s tabela de endereços.
aForeignTables ( inCount , 1 ) = oQuery_result.getString ( 2
)
Lendo o segundo campo com o nome do campo de chave estrangeira. O resultado da tabela Postcode é o
campo Postcode _ ID na tabela Address.
Nos casos em que uma chamada para a sub - rotina inclui o nome de uma segunda tabela, o loop a seguir
é executado. Somente quando o nome da segunda tabela ocorre como a tabela de chave estrangeira para
a primeira tabela é a entrada padrão alterada. Em nosso caso, isso não ocorre, pois a tabela Town não
possui chave estrangeira na tabela Postcode. A entrada padrão para a tabela auxiliar, portanto, permanece
como CEP; finalmente, a combinação de código postal e cidade é uma base para a tabela Endereço, que
contém uma chave estrangeira da tabela Código postal.
SE UBound ( aTable ()) = 8 ENTÃO
SE (a ) Tabela ( 8 ) = aForeignTable ( inCount , 0 )
ENTÃO
stForeignIDTab2Tab1 = aForeignTable (
inCount , 1 )
stAuxiltable = aTabela ( 8 )
FIM SE
FIM SE
inCount = inCount + 1
Como valores adicionais podem precisar ser lidos, o índice é incrementado para redimensionar as
matrizes. Então o loop termina.
WEND
FIM SE
Se, quando a sub - rotina for chamada, existir um segundo nome de tabela, a mesma consulta será iniciada
para esta tabela:
SE UBound ( aTable ()) = 8 ENTÃO
Ele é executado de forma idêntica, exceto que o loop testa se talvez o primeiro nome da tabela ocorre
como um nome de tabela de chave estrangeira. Esse é o caso aqui: a tabela Código Postal c ontains o f
Cidade chave oreign _ ID da tabela Town. Esta chave estrangeira é agora atribuída à variável
stForeignIDTab1Tab2, para que a relação entre as tabelas possa ser definida.
SE aTabela ( 5 ) = aForeignTable2 ( inCount , 0 )
THEN
stForeignIDTab1Tab2 = aForeignTable2 (
inCount , 1 )
END IF
Depois de algumas configurações adicionais para garantir um retorno ao formulário correto depois de
executar o diálogo (determinando o número da linha do formulário, para que possamos retornar ao número
da linha após uma nova leitura), o loop começa, o que recria o diálogo quando a primeira ação é concluída,
mas é necessário que o diálogo seja mantido aberto para outras ações. A configuração para repetição
ocorre usando a caixa de seleção correspondente
FAZ
Antes de o diálogo ser iniciado, o conteúdo das caixas de listagem é determinado primeiro. Deve-se tomar
cuidado se as caixas de listagem representam dois campos de tabela e talvez estejam relacionadas a duas
tabelas diferentes.
SE UBound ( tabela ()) = 6 ENTÃO
A caixa de listagem está relacionada a apenas uma tabela e um campo, conforme a matriz de argumentos
termina em Tablefield1 da tabela auxiliar.
stSql = "SELECT """ + aTabela ( 6 ) + "" "de """ + aTabela (
5 ) + "" "PEDIDO PELO """ + aTabela ( 6 ) + "" ""
ELSEIF UBound ( Tabela ()) = 7 ENTÃO
A caixa de listagem está relacionada a dois campos de tabela, mas apenas a uma tabela, conforme a
matriz de argumentos termina em Tablefield2 da tabela auxiliar.
stSql = "SELECT """ + aTabela ( 6 ) + "" "||' > '|| "" " +
aTable ( 7 ) + " "" FROM "" " + aTable ( 5 ) + " "" ORDER BY "" " + aTable ( 6 ) + "
"" "
OUTRO
A caixa de listagem é baseada em dois campos de tabela de duas tabelas. Esta consulta corresponde ao
exemplo com o código postal e a cidade.
stSql = "SELECT" "" + aTable ( 5 ) + "" "." "" + aTable ( 6
) + "" "|| ' > '|| "" " + aTabela ( 8 ) + """. "" " + ATabela ( 7 ) + """ de "" " +
aTabela ( 5 ) + """, """ + aTabela ( 8 ) + "" "ONDE" """" "=" "" + aTable ( 5 ) + ""
"." "" + stForeignIDTab1Tab2 + "" "ORDER BY" "" + aTable ( 6 ) + "" ""
FIM SE
Aqui temos a primeira avaliação para determinar as chaves estrangeiras. As variáveis
stForeignIDTab2Tab1 e stForeignIDTab1Tab2 começam com o valor ID. Para stForeignIDTab1Tab2, a
avaliação da consulta anterior produz um valor diferente, ou seja, o valor de To wn _ ID. Desta forma, a
construção da consulta anterior produz exatamente o conteúdo já formulado para código postal e cidade -
apenas aprimorado pela classificação.
Agora precisamos entrar em contato com as caixas de listagem para fornecer o conteúdo retornado pelas
consultas. Essas caixas de listagem ainda não existem, pois o diálogo em si ainda não foi criado. Essa
caixa de diálogo é criada primeiro na memória, usando as linhas a seguir, antes de ser realmente
desenhada na tela.
DialogLibraries.LoadLibrary ( "Standard" )
oDlg = CreateUnoDialog ( DialogLibraries.Standard.Dialog_Table_purge
)
Em seguida vêm as configurações para os campos da caixa de diálogo. Aqui, por exemplo, é a caixa de
listagem que deve ser fornecida com os resultados da consulta acima:
oCtlList1 = oDlg.GetControl ( "ListBox1" )
oCtlList1.addItems ( aContent (), 0 )
O acesso aos campos da caixa de diálogo é realizado usando GetControl com o nome apropriado.
Nas caixas de diálogo, não é possível que dois campos usem o mesmo nome, pois isso criaria problemas
ao avaliar a caixa de diálogo.
A caixa de listagem é fornecida com o conteúdo da consulta, que foi armazenado no array aContent (). A
caixa de listagem contém apenas o conteúdo a ser exibido como um campo, portanto, somente a posição 0
é preenchida.
Depois que todos os campos com o conteúdo desejado tiverem sido preenchidos, o diálogo será iniciado.
Selecione o caso oDlg.Execute ()
Caso 1 'Caso 1 significa que o botão "OK" foi clicado
Caso 0 'Se fosse o botão "Cancelar"
inRepetition = 0
Selecionar final
LOOP WHILE inRepetition = 1
A caixa de diálogo é executada repetidamente desde que o valor de "inRepetition" seja 1. Isso é definido
pela caixa de seleção correspondente.
Aqui, em resumo, é o conteúdo depois que o botão "OK" é clicado:
Caso 1
stInhalt1 = oCtlList1.getSelectedItem () 'Ler valor de Listbox1 ...
REM ... e determine o valor de ID correspondente.
O valor de ID da primeira caixa de listagem é armazenado na variável "inLB1".
stText = oCtlText.Text 'Leia o valor do campo.
Se o campo de texto não estiver vazio, a entrada no campo de texto será tratada. Nem a caixa de listagem
para um valor de substituição nem a caixa de seleção para excluir todos os registros órfãos são
consideradas. Isso fica claro pelo fato de que a entrada de texto define esses outros campos como
inativos.
SE stText <> "" ENTÃO
Se o campo de texto não estiver vazio, o novo valor será gravado no lugar do antigo, usando o campo de
ID lido anteriormente na tabela. Existe a possibilidade de duas entradas, como também é o caso na caixa
de listagem. O separador é > . Para duas entradas em tabelas diferentes, dois comandos UPDATE devem
ser iniciados, que são criados aqui simultaneamente e encaminhados, separados por um ponto-e-vírgula.
ELSEIF oCtlList2.getSelectedItem () <> "" ENTÃO
Se o campo de texto estiver vazio e a caixa de listagem 2 contiver um valor, o valor da caixa de listagem 1
deverá ser substituído pelo valor da caixa de listagem 2. Isso significa que todos os registros nas tabelas
para os quais os registros nas caixas de listagem são chaves estrangeiras devem ser verificados e, se
necessário, escrito com uma chave estrangeira alterada.
stInhalt2 = oCtlList2.getSelectedItem ()
Valor de leitura REM da caixa de listagem.
REM Determine o ID do valor da caixa de listagem.
O valor de ID da segunda caixa de listagem é armazenado na variável inLB2. Aqui também, as coisas se
desenvolvem diferentemente dependendo se um ou dois campos estão contidos na caixa de listagem, e
também se uma ou duas tabelas são a base do conteúdo da caixa de listagem.
O processo de substituição depende de qual tabela é definida como a tabela que fornece a chave
estrangeira para a tabela principal. Para o exemplo obove, esta é a tabela Postcode, já que o Postcode_ID
é a chave estrangeira que é encaminhada através do Listbox 1 e do Listbox 2.
IF ESTAMULÁVEL = ATADO ( 5 ) ENTÃO
PARA i = LBound ( aForeignTables ()) PARA UBound ( aForeignTables
())
Substituir o antigo valor de ID pelo novo valor de ID torna-se problemático em relacionamentos n: m, já que
nesses casos, o mesmo valor pode ser atribuído duas vezes. Isso pode ser o que você deseja, mas deve
ser evitado quando a chave estrangeira faz parte da chave primária. Portanto, na tabela rel _ Media _
Author, um meio não pode ter o mesmo autor duas vezes, porque a chave primária é construída a partir de
Media _ ID e Author _ ID. Na consulta, são pesquisados todos os campos-chave que, coletivamente, têm a
propriedade UNIQUE ou foram definidos como chaves estrangeiras com a propriedade UNIQUE usando
um índice.
Então, se a chave estrangeira tem a propriedade única e i s já representava lá com o futuro desejado inLB2,
essa chave não pode ser substituído.
stSql = "SELECT" "COLUMN_NAME" "FROM" "INFORMATION_SCHEMA" "." "SYSTEM_INDEXINFO"
"WHERE" "TABLE_NAME" "= '" + aForeignTables ( i , 0 ) + "' AND" "NON_UNIQUE" "=
Falso AND" "INDEX_NAME" "= (SELECT" "INDEX_NAME" "FROM" "INFORMATION_SCHEMA" "."
"SYSTEM_INDEXINFO" "WHERE" "TABLE_NAME" "= '" + aForeignTables ( i , 0 ) + "' AND"
"COLUMN_NAME" "= '"+ aForeignTables ( i , 1 ) + "')"
' "NON_UNIQUE" = False ' fornece os nomes das colunas que são UNIQUE. No entanto,
nem todos os nomes de colunas são necessários, mas apenas aqueles que formam um índice com o
campo de chave estrangeira. Isso é tratado pelo Subselect com os mesmos nomes de tabela (que contêm
a chave estrangeira) e os nomes dos campos de chave estrangeira.
Se agora a chave estrangeira estiver presente no conjunto, o valor da chave só poderá ser substituído se
outros campos forem usados para definir o índice correspondente como UNIQUE. Você deve tomar
cuidado ao realizar substituições que a exclusividade da combinação de índice não seja comprometida.
IF aForeignTables ( i , 1 ) = stFieldname ENTÃO
inUnique = 1
OUTRO
ReDim Preserve aColumns ( inCount )
aColumns ( inCount ) = oQuery_result.getString ( 1 )
inCount = inCount + 1
END IF
Todos os nomes de coluna, além dos nomes de coluna conhecidos para campos de chave estrangeira
como Índice com a propriedade UNIQUE, são armazenados na matriz. Como o nome da coluna do campo
de chave estrangeira também pertence ao grupo, ele pode ser usado para determinar se a exclusividade
deve ser verificada durante a modificação de dados.
SE inUnique = 1 ENTÃO
stSql = "UPDATE" "" + aForeignTables ( i , 0 ) + "" "AS" "a" "SET" "" +
aForeignTables ( i , 1 ) + "" "= '" + inLB2 + "' WHERE" " " + aForeignTables ( i , 1
) + " "" '' ' + inLB1 + ' 'E (SELECT COUNT (*) FROM "" " + aForeignTables ( i ,0 ) +
"" "ONDE" "" + aForeignTables (i,1 ) + "" "= '" + inLB2 + "')"
IF inCount > 0 ENTÃO
stFieldgroup = Join ( aColumns (), "" "|| ||" "" )
Se houver vários campos, além do campo de chave estrangeira, que juntos formam um índice 'UNIQUE',
eles são combinados aqui para um agrupamento de SQL. Caso contrário, apenas "aColumns (0)" aparece
como "stFieldgroup".
stFieldname = ""
PARA tinta = LBound ( aColumns ()) PARA LimiteSup ( aColumns ())
stFieldname = stFieldname + "E """ + aColumns ( tinta ) + ""
"= "" a "". """ + aColumns ( tinta ) + """"
As partes SQL são combinadas para uma subconsulta correlacionada.
PRÓXIMO
stSql = Esquerda ( stSql , Len ( stSql ) - 1 )
A consulta anterior termina com um colchete. Agora, mais conteúdo deve ser adicionado à subconsulta,
portanto, esse fechamento deve ser removido novamente. Depois disso, a consulta é expandida com as
condições adicionais.
stSql = stSql + stFeldbezeichnung + "GROUP BY (" "" + stFeldgruppe + "" ")) <1"
FIM SE
Se a chave estrangeira não tiver conexão com a chave primária ou com um índice UNIQUE, não importa
se o conteúdo é duplicado.
OUTRO
stSql = "UPDATE" "" + aForeignTables ( i , 0 ) + "" "SET" "" +
aForeignTables ( i , 1 ) + "" "= '" + inLB2 + "' ONDE" "" + aForeignTables ( i , 1 )
+ "" "= '" + inLB1 + "'"
FIM SE
oSQL_Statement.executeQuery ( stSql )
PRÓXIMO
A atualização é realizada enquanto existirem conexões diferentes com outras tabelas; isto é, desde que a
tabela atual seja a origem de uma chave estrangeira em outra tabela. Esse é o caso duas vezes para a
tabela Town: na tabela Mídia e na tabela Código postal.
Posteriormente, o valor antigo pode ser excluído da caixa de listagem 1, já que não tem mais nenhuma
conexão com outras tabelas.
stSql = "DELETE FROM" "" + aTable ( 5 ) + "" "WHERE" "ID" "= '" + inLB1 + "'"
oSQL_Statement.executeQuery ( stSql )
Em alguns casos, o mesmo método agora deve ser executado para uma segunda tabela que forneceu
dados para as caixas de listagem. Em nosso exemplo, a primeira tabela é a tabela Código postal e a
segunda é a tabela Cidade.
Se o campo de texto estiver vazio e a caixa de listagem 2 também não contiver nada, verificaremos se a
caixa de seleção relevante indica que todas as entradas excedentes devem ser excluídas. Isso significa as
entradas que não estão vinculadas a outras tabelas por uma chave estrangeira.
ELSEIF oCtlCheck1 . Estado = 1 ENTÃO
stCondition = ""
IF ESTAMULÁVEL = ATADO ( 5 ) ENTÃO
PARA i = LBound ( aForeignTables ()) PARA UBound ( aForeignTables
())
stCondition = stCondition + "" "ID" "NOT IN (SELECT" "" +
aForeignTables ( i , 1 ) + "" "FROM" "" + aForeignTables ( i , 0 ) + "" ") E"
PRÓXIMO
OUTRO
PARA i = LBound ( aForeignTables2 ()) PARA UBound ( aForeignTables2
())
stCondition = stCondition + "" "ID" "NOT IN (SELECT" "" +
aForeignTables2 ( i , 1 ) + "" "FROM" "" + aForeignTables2 ( i , 0 ) + "" ") AND"
PRÓXIMO
END IF
A última e devem ser removidos, pois caso contrário a instrução de exclusão acabaria w om E.
stCondition = Esquerda ( stCondition , Len ( stCondition ) - 4 ) '
stSql = "DELETE FROM" "" + stAuxilTable + "" "WHERE" + stCondition + ""
oSQL_Statement.executeQuery ( stSql )
Como a tabela já foi purgada uma vez, o índice da tabela pode ser verificado e, opcionalmente, corrigido
para baixo. Veja a sub - rotina descrita em uma das seções anteriores .
Table_index_down ( stAuxilTable )
Posteriormente, se necessário, a caixa de listagem no formulário do qual a caixa de diálogo Table_purge foi
chamada pode ser atualizada. Em alguns casos, todo o formulário precisa ser relido. Para esse propósito, o
registro atual é determinado no início da sub - rotina para que, após a atualização do formulário, o registro
atual possa ser restabelecido.
oDlg.endExecute () 'Finalizar diálogo ...
oDlg.Dispose () '... e remova do armazenamento
END SUB
As caixas de diálogo são finalizadas com o comando endExecute () e completamente removidas da
memória com Dispose ().
Repor autovalores
Um banco de dados é criado, todas as funções possíveis testadas com exemplos e correções feitas até
que tudo funcione. A essa altura, em média, muitos valores de chave primária terão aumentado para mais
de 100. Má sorte se a chave primária tiver sido configurada para incremento automático, como é comum!
Se as tabelas forem esvaziadas em preparação para uso normal ou antes de entregar o banco de dados
para outra pessoa, a chave primária continuará a incrementar a partir de sua posição atual em vez de se
redefinir para zero.
O seguinte comando SQL, novamente inserido usando Ferramentas > SQL , permite redefinir o valor
inicial:
ALTER TABLE "Table_name" ALTER COLUMN "ID" RESTART WITH 'Novo valor'
Isso pressupõe que o campo da chave primária tenha o nome "ID" e tenha sido definido como um campo
de autovalor. O novo valor deve ser aquele que você deseja criar automaticamente para o próximo novo
registro. Portanto, por exemplo, se os registros atuais forem até 4, o novo valor deverá ser 5.
Aqui as tabelas Endereço e Rua são consideradas. Todas as ações especificadas se aplicam à tabela
Address , que contém a chave estrangeira Street _ ID. As opções de atualização referem-se a uma
atualização do campo ID na tabela Street. Se a chave numérica no campo " Rua ". " ID " for alterada,
"Nenhuma ação" significa que o banco de dados resiste a essa alteração se uma " Rua ". " ID " com esse
número de chave ocorre como uma chave estrangeira na tabela Endereço .
" Atualização em cascata " significa que o número da chave é simplesmente transferido. Se a rua 'Burgring'
na tabela Street tiver o ID '3' e também estiver representada em " Endereço ". " Street _ ID " , o ID pode ser
alterado com segurança , por exemplo, para '67' - o " Endereço " correspondente "" Rua _ ID " valores
serão automaticamente ser alterado para '67'.
Se Set null for escolhido, a alteração do ID torna "Address". "Street_ID" um campo vazio.
As opções de exclusão são tratadas de forma semelhante.
Para ambas as opções, a GUI atualmente não permite a possibilidade Definir o padrão , já que as
configurações padrão da GUI são diferentes daquelas do banco de dados. Veja C apítulo 3, T ables.
A definição de relacionamentos ajuda a manter os relacionamentos limpos, mas não remove registros
desnecessários que fornecem sua chave primária como uma chave estrangeira no relacionamento. Pode
haver qualquer número de ruas sem endereços correspondentes.
No formulário, há um filtro interno cuja ativação pode informar quais categorias não são necessárias na
tabela Mídia. No caso descrito, quase todos os exemplos de autores estão em uso. Apenas o registro Erich
Kästner pode ser excluído sem quaisquer consequências para qualquer outro registro na mídia .
O filtro é dura bacalhau ed neste caso. É encontrado nas propriedades do formulário. Esse filtro é ativado
automaticamente quando o formulário é iniciado. Pode ser desligado e ligado. Se for excluído, pode ser
acessado novamente por um recarregamento completo do formulário. Isso significa mais do que apenas
atualizar os dados; todo o documento do formulário deve ser fechado e reaberto.
Efeito de consultas
São apenas essas consultas, usadas na seção anterior para filtrar dados, que se mostram insatisfatórias
em relação à velocidade máxima de pesquisa de um banco de dados. O problema é que, em grandes
bancos de dados, a subconsulta recupera uma quantidade correspondentemente grande de dados com os
quais cada registro exibível individual deve ser comparado. Somente comparações com o relacionamento
IN tornam possível comparar um único valor com um conjunto de valores. A pergunta
… ONDE "ID" NÃO ESTÁ (SELECIONE "Author_ID" DE "rel_Media_Author")
pode conter um grande número de possíveis chaves estrangeiras da tabela rel_Media_Author, que deve
primeiro ser comparada com as chaves primárias na tabela Autores de cada registro nessa tabela. Essa
consulta, portanto, não é adequada para uso diário, mas pode ser necessária para manutenção do banco
de dados . Para o uso diário, as funções de pesquisa precisam ser construídas de forma diferente, para
que a pesquisa de dados não seja excessivamente longa e não danifique o trabalho diário com o banco de
dados.
Códigos de barra
Para poder usar a função de impressão de código de barras, a fonte ean13.ttf deve estar instalada.
Esta fonte está disponível gratuitamente.
Códigos de barras EAN13 podem ser criados usando ean13.ttf da seguinte forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Número Maiúsculas, A = 0 B = 1 etc. * Minúsculas, a = 0 b = 1 etc. +
Inteiros
Tipo Opção HSQLDB Alcance Espaço de
armazenamento
8
Inteiro TINYINT TINYINT 1 byte
2 = 256 | - 128
minúsculo
a + 127
16
Pequeno SMALLINT SMALLINT 2 bytes
2 = 65536 | -
Integer
32768 bis +
32767
32
Inteiro INTEGER INTEGER | INT 4 bytes
2 =
4294967296 | -
2147483648 bis
+ 2147483647
64
BigInt BIGINT BIGINT 8 bytes
2
Texto
Tipo Opção HSQLDB Alcance Espaço de
armazenamento
Tempo
Tipo Opção HSQLDB Alcance Espaço de
armazenamento
De outros
Tipo Opção HSQLDB Alcance Espaço de
armazenamento
DE DE OUTROS OUTRAS |
OUTROS OBJETO
Numérico
Como estamos lidando aqui com números de ponto flutuante, certifique -se de cuidar das
configurações dos campos nas consultas. Principalmente a exibição de casas decimais é
restrita, de modo que, em alguns casos, pode haver resultados inesperados. Por exemplo, a
coluna 1 pode mostrar 0.00, mas na verdade contém 0,001 e a coluna 2, 1000. Se a coluna 3
estiver definida para mostrar a Coluna 1 * Coluna 2, ela realmente mostrará 1.
TETO (d) Retorna o menor número inteiro que não é menor que d.
EXP (d) d
Retorna e (e: (2.718 ...)).
PISO (d) Retorna o maior número inteiro que não é maior que d.
POTÊNCIA (a, b) b 3
a , POWER (2,3) = 8, desde 2 =8
Texto
'str1' || 'str2' || 'str3' ou 'str1' Concatena str1 + str2 + str3, alternativa mais simples ao
+ 'str2' + 'str3' CONCAT.
INSERIR (s, iniciar, len, s2) Retorna uma string de texto, com parte do texto substituído.
Começando com o início, um comprimento len é recortado
dos textos e substituído pelo texto s2.
INSERT (Bundesbahn, 3, 4, mmel) converte Bundesbahn em
Bummelbahn, onde o comprimento do texto inserido pode ser
maior que o do texto excluído sem causar nenhum problema.
Então INSERT (Bundesbahn, 3, 5, s und B) produz 'Bus und
Bahn'.
Data hora
DATEDIFF (string, Diferença de data entre duas datas - compara valores de data
datetime1, datetime2) / hora.
A entrada em string determina as unidades nas quais a
diferença é retornada: ms = milissegundo, ss = segundo, mi =
minuto, hh = hora, dd = dia, mm = mês, yy = ano.
Tanto as formas longas quanto as curtas podem ser usadas
para string.
Sistema
IFNULL (exp, valor) Se exp for NULL, o valor será retornado, caso contrário, exp.
Como alternativa, uma extensão COALESCE () pode ser
usada. Exp e valor devem ter o mesmo tipo de dados.
CASEWHEN (exp, v1, v2) Se exp for true, v1 será retornado, caso contrário, v2.
Alternativamente CASE WHEN pode ser usado. CASE
WHEN funciona melhor com a GUI.
NULLIF (v1, v2) Se v1 é igual a v2, NULL é retornado, caso contrário, v1.
CASO QUANDO expr1 Se expr1 for true, v1 será retornado [opcionalmente, outras
ENTÃO v1 [QUANDO condições podem ser definidas]. Caso contrário, a v4 é
expr2 THEN v2] [ELSE v4] retornada ou NULL se não houver nenhuma condição ELSE.
END
EXTRACTO ({ANO | MÊS | Pode substituir muitas das funções de data e hora. Retorna o
DIA | HORA | MINUTO | ano, o mês, o dia, etc. a partir de um valor de data ou data /
SEGUNDO} DE < d at e ou hora.
hora >)
4.O arquivo de banco de dados deve ser descompactado. As informações mais importantes, na medida
em que os dados estão em causa, estão na subpasta de banco de dados no arquivo de dados
e roteiro .
5.Pode ser necessário examinar o arquivo de script e testá-lo em busca de contradições. Esta etapa
pode, no entanto, ser deixada para o estágio de teste. O arquivo de script contém, acima de tudo, a
descrição da estrutura da tabela.
6.Crie um novo arquivo de banco de dados vazio e abra esse arquivo com o programa de arquivamento.
7.Substitua os arquivos de dados e script no novo arquivo de banco de dados pelos arquivos
descompactados no step 4 .
8.Feche o programa de arquivamento. Se fosse necessário renomear o arquivo para * .zip antes de abri-lo
no programa de arquivamento (isso depende do seu sistema operacional), agora renomeie-o novamente
para * .odb.
9.Abra o arquivo de banco de dados em L ibre O ffice . Y OU deve ser capaz de acessar suas tabelas
novamente.
10.Até que ponto suas consultas, formulários e relatórios podem ser recuperados de maneira semelhante
devem ser objeto de testes adicionais.
Veja também: http://forum.openoffice.org/en/forum/viewtopic.php?f=83&t=17125
Se, conforme descrito nas páginas a seguir, você estiver usando o HSQLDB externo, pode haver um
problema adicional com o arquivo * .odb conectado a algumas versões do L ibreOffice . Se HSQLDB
externo for usado, a maneira mais segura é através do hsqldb.jar-archive, que é fornecido com o L
ibreOffice . Se um arquivo diferente for usado, isso pode levar a que o banco de dados interno fique
repentinamente inacessível. Isso ocorre porque o ibreOffice 3.x tem dificuldade em distinguir entre
HSQLDB interno e externo e produz avisos de incompatibilidade entre as versões.
Se bancos de dados internos não puderem mais ser abertos, você deverá utilizar como banco de dados
externo o arquivo hsqldb.jar fornecido . Além disso, você deve extrair do arquivo * .odb a pasta do
banco de dados . O arquivo de propriedades, nesse caso, possui uma entrada que leva ao erro
acima no L ibre O ffice :
versão = 1.8.1 na linha 11
Esta linha deve ser alterada para:
versão = 1.8.0
Posteriormente, a pasta do banco de dados é colocada de volta no pacote * .odb e o banco de dados pode
mais uma vez ser aberto no L ibre O ffice .
Se o driver do banco de dados não estiver no caminho do Java-Runtime, ele deve ser inserido como um
caminho de classe em Ferramentas > Opções > Java .
A conexão com o banco de dados externo usa o JDBC. O arquivo de banco de dados deve ser
armazenado em um diretório específico. Este diretório pode ser escolhido livremente. No exemplo a seguir,
ele está na pasta inicial. O restante do caminho do diretório e o nome do banco de dados não são
fornecidos aqui.
É importante, se os dados no banco de dados forem gravados usando a GUI, que, ao lado do nome do
banco de dados, as palavras " ; default_schema = true" sejam escritas.
Assim:
jdbc: hsqldb: arquivo: / home / PathToDatabase / Databasename;
default_schema = true
Na pasta você encontrará os arquivos:
Databasename.backup
Databasename.data
Databasename.properties
Databasename.script
Databasename.log
O próximo passo é dar ao usuário padrão, se nada na configuração HSQLDB for alterado:
server.silent true
server.trace false
server.port 9001
server.no_system_exit true
O banco de dados 0 é endereçado com o nome firstdb , embora os arquivos individuais no diretório
de dados comecem com db0 . Eu adicionei meu próprio banco de dados como Banco de Dados
1 . Aqui, o nome e o arquivo do banco de dados começam de forma idêntica.
Os dois bancos de dados são abordados da seguinte maneira:
jdbc: hsqldb: hsql: // localhost / firstdb; default_schema = verdadeiro
nome de usuário sa
senha
jdbc: hsqldb: hsql: // localhost / union; default_schema = verdadeiro
nome de usuário sa
senha
O sufixo ; default_schema = true para o URL, que é necessário para acesso de gravação
usando a interface gráfica com o usuário do L ibreOffice , é incluído permanentemente.
Se você realmente precisa trabalhar no servidor, convém considerar se o banco de dados precisa ser
protegido por senha por motivos de segurança.
Agora você pode se conectar ao servidor usando o L ibreOffice.
Com esses dados de acesso, o servidor pode ser carregado em seu próprio computador. Em uma rede
com outros computadores, você deve fornecer o nome do host ou o endereço IP ao servidor, que neste
caso está sendo executado em meu computador.
Exemplo: Meu computador tem o IP 192.168.0.20 e é conhecido na rede pelo nome lin_serv . Agora,
suponha que haja outro computador a ser inserido para conexão com o banco de dados:
jdbc: hsqldb: hsql: //192.168.0.20/union; default_schema = true
ou :
jdbc: hsqldb: hsql: // lin_serv / união; default_schema = true
O banco de dados agora está conectado e podemos escrever nele. Rapidamente, no entanto, um problema
adicional aparece. Os valores anteriormente gerados automaticamente não são mais incrementados de
repente. Para isso, precisamos de uma configuração adicional.