Pergunte aqui

Histórico de revisões [voltar]

clique para ocultar/mostrar a revisão 1
Versão inicial

O que você pretende é vincular duas caixas de listagem de maneira que elas se comportaram “em cascata”. O valor escolhido na primeira deverá “filtrar” o conteúdo da lista da segunda.

Através do LibreOffice Base é possível fazê-lo mesmo sem recorrer a macros, mas o procedimento não é tão simples, exigindo uma série de procedimentos.

Vou tentar descrever abaixo estes procedimentos de forma mais resumida possível. Também, ao final, deixarei o arquivo que foi desenvolvido para esta resposta, em cima das informações que você passou.


Tabela
Para lidar com as caixas de listagem em cascata, sem correr o risco de perder as informações armazenadas no banco de dados, é preciso criar uma tabela especial. Ela terá a função de registrar o estado e a cidade escolhidos no formulário. A tabela “Tab-Filtro”, em questão, foi criada com o seguinte:

Campo Tipo/Observação Id Integer/Chave Primária. IDE Idêntico ao campo IDE presente na tabela “Estado Teste” IDC Idêntico ao campo IDC presente na tabela “Cid BR”

A tabela “Tab-Filtro” receberá apenas um único registro (Id=0), que será lido e modificado continuamente pelas caixas de listagem do formulário.

Formulário
Para permitir o vínculo entre as duas caixas de listagem, cada uma delas deve estar em um formulário diferente, em outras palavras, o Formulário Principal deve conter um subformulário. A caixa de listagem “Estado” ficará no MainForm enquanto a “Cidade” estará no SubForm1. Certifique-se que tanto o MainForm quanto o SubForm1 tenham a fonte de dados (Conteúdo) apontando para tabela “Tab-Filtro”. No SubForm1, o campo vinculado mestre e o campo vinculado escravo deverão ser configurados como: “IDE”. Além disso, é preciso inserir um botão de pressão no SubForm1 com a propriedade “Ação” definida para “Atualizar formulário”. Ele atualizará o conteúdo da caixa de listagem “Cidade” em função do estado selecionado na caixa de listagem “Estado”.

Caixa de Listagem “Estado” (MainForm)
A SQL para construir seu conteúdo será:
SELECT "Estado", "IDE" FROM "Estado Teste"

Caixa de Listagem “Cidade” (SubForm1)
A SQL para construir seu conteúdo será:
SELECT "Cidade", "IDC" FROM "Cid BR1" WHERE "IDE" = ( SELECT "Tab-Filtro"."IDE" FROM "Tab-Filtro" WHERE "Tab-Filtro"."Id" = 0 )

A subconsulta ( SELECT "Tab-Filtro"."IDE" FROM "Tab-Filtro" WHERE "Tab-Filtro"."Id" = 0 ) é que garantirá que a caixa de listagem “Cidade” exibirá apenas as cidades atribuídas ao estado escolhido na caixa de listagem “Estado”.

Tutoriais (em inglês)
. Exemplo/Tutorial Filtrar/Procurar em Subformulários com listbox
. Cascata de Listbox com macros


Banco de Dados de Exemplo:
AskLibO_CxdList-Cascata.odb

O que você pretende é vincular duas caixas de listagem de maneira que elas se comportaram “em cascata”. O valor escolhido na primeira deverá “filtrar” o conteúdo da lista da segunda.

Através do LibreOffice Base é possível fazê-lo mesmo sem recorrer a macros, mas o procedimento não é tão simples, exigindo uma série de procedimentos.

Vou tentar descrever abaixo estes procedimentos de forma mais resumida possível. Também, ao final, deixarei o arquivo que foi desenvolvido para esta resposta, em cima das informações que você passou.


Tabela
Descrição da imagem

Para lidar com as caixas de listagem em cascata, sem correr o risco de perder as informações armazenadas no banco de dados, é preciso criar uma tabela especial. Ela terá a função de registrar o estado e a cidade escolhidos no formulário. A tabela “Tab-Filtro”, em questão, foi criada com o seguinte:

Campo Tipo/Observação Id Integer/Chave Primária. IDE Idêntico ao campo IDE presente na tabela “Estado Teste” IDC Idêntico ao campo IDC presente na tabela “Cid BR”

A tabela “Tab-Filtro” receberá apenas um único registro (Id=0), que será lido e modificado continuamente pelas caixas de listagem do formulário.

Formulário
Descrição da imagem

Para permitir o vínculo entre as duas caixas de listagem, cada uma delas deve estar em um formulário diferente, em outras palavras, o Formulário Principal deve conter um subformulário. A caixa de listagem “Estado” ficará no MainForm enquanto a “Cidade” estará no SubForm1. SubForm1.

Certifique-se que tanto o MainForm quanto o SubForm1 tenham a fonte de dados (Conteúdo) apontando para tabela “Tab-Filtro”. No SubForm1, o campo vinculado mestre e o campo vinculado escravo deverão ser configurados como: “IDE”. “IDE”.

Além disso, é preciso inserir um botão de pressão no SubForm1 com a propriedade “Ação” definida para “Atualizar formulário”. Ele atualizará o conteúdo da caixa de listagem “Cidade” em função do estado selecionado na caixa de listagem “Estado”.

Caixa de Listagem “Estado” (MainForm)
A SQL para construir seu conteúdo será:
SELECT "Estado", "IDE" FROM "Estado Teste"

Caixa de Listagem “Cidade” (SubForm1)
A SQL para construir seu conteúdo será:
SELECT "Cidade", "IDC" FROM "Cid BR1" WHERE "IDE" = ( SELECT "Tab-Filtro"."IDE" FROM "Tab-Filtro" WHERE "Tab-Filtro"."Id" = 0 )

A subconsulta ( SELECT "Tab-Filtro"."IDE" FROM "Tab-Filtro" WHERE "Tab-Filtro"."Id" = 0 ) é que garantirá que a caixa de listagem “Cidade” exibirá apenas as cidades atribuídas ao estado escolhido na caixa de listagem “Estado”.

Tutoriais (em inglês)
. Exemplo/Tutorial Filtrar/Procurar em Subformulários com listbox
. Cascata de Listbox com macros


Banco de Dados de Exemplo:
AskLibO_CxdList-Cascata.odb