@nielson.santos, eu entendo a sua necessidade, mas acho que na prática é mais fácil do que você imagina.
O comando ALTER TABLE que coloquei, era só um exemplo de como a coluna poderia ser criada. Este comando seria executado apenas uma vez para criar a coluna na tabela. O ideal é fazer isso fora do LATROMI inclusive.
Vou tentar criar um exemplo mais próximo da sua situação.
Tabelas
Vamos trabalhar com as tabelas as seguir.
Veiculos
Cadastro de Veículos
|
Coluna |
Comentário |
 |
VeiculoId |
|
|
Placa |
|
Contratos
Cadastro de Contratos
|
Coluna |
Comentário |
 |
ContratoId |
|
|
Data |
|
|
Status |
0 = OK, 1 = Temp |
ContratoVeiculos
Veículos do Contrato
|
Coluna |
Comentário |
 |
ContratoId |
FK com Contratos |
 |
VeiculoId |
FK com Veiculos |
Objetos do Latromi
Vamos considerar que temos os seguintes objetos:
-
Formulário “Contrato” (Alteração e Inclusão de Contrato)
Este Formulário vai estar esperando o parâmetro “ContratoId”. Quando este parâmetro for informado, vamos considerar que é umas alteração. Senão, será uma inclusão.
-
Formulário “Contrato - Veículo” (Inclusão de Veículo no Contrato)
Este Formulário vai estar esperando o parâmetro “ContratoId”.
-
Consulta “Veículos do Contrato” (Lista os veículo de um determinado Contrato)
Esta Consulta vai estar esperando o parâmetro “ContratoId”.
- Botão “Incluir” chamando o Formulário “Contrato - Veículo”, e repassando o parâmetro ContratoId.
- Link “Excluir” chamando Comando SQL para remover o veículo do Contrato.
-
Consulta “Listagem de Contratos” (Lista todos os Contratos)
- Botão “Incluir” chamando o Formulário “Contrato”, sem passar parâmetro.
- Link “Alterar” chamando o Formulário “Contrato”, passando o Id do Contrato da linha selecionada.
Implementação
Vou tentar explicar a implementação na ordem cronológica das operações.
Ela consiste basicamente em criar o registro da tabela principal assim que a janela for aberta. Desta forma, todos registro filhos podem ser incluídos mantendo a integridade das Foreign Keys.
Listagem de Contratos
A operação inicia quando o usuário acessa a Consulta Listagem de Contratos.
Essa Consulta vai listar apenas os registros da tabela “Contratos” que possuem Status = 0
, ou seja, registro confirmados / completos.
Exemplo:
SELECT * FROM Contratos
WHERE Status = 0
Ou se preferir, você pode listar todos os Contratos, e usar uma Formatação Condicional para diferenciar os registros Completos (OK) dos Incompletos (Temp)
Inclusão de Contrato
Quando o usuário estiver na Consulta Listagem de Contratos, ele poderá incluir um novo Contrato clicando no botão “Incluir”, acessando assim o Formulário Contrato.
Neste Formulário, teremos além dos campos do Contrato, um campo do tipo “Consulta”, apontando para a Consulta Veículos do Contrato.
No evento Load do Formulário, nós podemos identificar se estamos trabalhando em uma operação de inclusão ou alteração analisando o parâmetro “ContratoId”. Se ele não foi informado, é uma inclusão, senão é uma alteração.
Usando o IF abaixo podemos identificar se é uma inclusão:
If PARAM.ContratoId = NULL Then
Dentro deste IF, vamos criar um registro “temporário” para o Contrato, e armazenar o Id em uma variável chamada “ContratoId”.
Se o valor da coluna “Contratos.ContratoId” for gerado automaticamente pelo banco (Auto Increment, Serial, Identity e etc), podemos fazer a inclusão usando uma Record dessa maneira:
INSERT INTO Contratos (Status) VALUES (1)
RETURNING ContratoId
Depois da inclusão, use o campo “ContratoId” da Record criada para alimentar a variável.
Se o parâmetro “ContratoId” foi informado, vamos apenas repassá-lo para a variável. Dessa forma, a partir deste ponto, podemos sempre usar a variável com o Id do Contrato ao invés do parâmetro.
O procedimento ficaria mais ou menos assim:
If PARAM.ContratoId = NULL Then
// Inclui registro tempórário usando Record
var rContratoTemp = CreateRecord("INSERT INTO Contratos .....")
// Preenche a variável com o valor de rContratoTemp.ContratoId
Populate( VAR.ContratoId )
Else
// Preenche a variável com o valor do Parâmetro ContratoId
Populate( VAR.ContratoId )
Agora que o usuário já passou pelo evento “Load”, e está com a página de inclusão de Contrato aberta, ele vai clicar no botão “Incluir” da Consulta Contrato - Veículo para inserir um veículo no contrato.
Essa consulta, dentro do Formulário, vai estar recebendo como parâmetro a variável “ContratoId”.
Contrato - Veículo
Nesta página, teremos um campo onde o usuário vai selecionar um veículo (previamente cadastrado), para então vinculá-lo ao Contrato.
Essa parte, é bem simples. Basta inserir o veículo selecionado na tabela “ContratoVeiculo” ao clicar no botão de Confirmação.
Exemplo:
INSERT INTO ContratoVeiculos ( ContratoId, VeiculoId )
VALUES ( PARAM.ContratoId, INPUT.VeiculoId )
Como o registro da tabela “Contratos” já existe, não teremos nenhum erro de vioalação de Foreign Key ao adicionar o registro.
De volta à Inclusão de Contrato
Agora que um ou mais veículos já foram vinculados ao nosso registro “Temporário”, falta apenas completar as informações do Contrato e trocar o Status para OK quando o usuário clicar no botão Salvar.
Por exemplo:
UPDATE Contratos
SET Data = '{?INPUT Data}', Status = 0
WHERE ContratoId = {?VAR ContratoId}
Mas e se o usuário clicar no botão Fechar? 
Neste caso, para reduzir a quantidade de registros “Temporários” deixados na tabela “Contratos”, podemos executar um comando SQL DELETE
para excluir o registro não confirmado no evento Closing do Formulário:
DELETE FROM Contratos
WHERE ContratoId = {?VAR ContratoId}
AND status = 1
Considerações Finais
Esta é apenas uma maneira simples e funcional de fazer a inclusão de registros vinculados. Mas tudo depende da criatividade de quem estiver desenvolvendo, talvez existam outras abordagens mais interessantes do que esta (se alguém souber de outra, posta aí
).
Quanto ao Status
do registro, tratei apenas no registro principal (Contratos), mas se for necessário, pode ser replicados para os registros filhos.